////本代码仅用于个人学习,请勿用于其他作用,下载后请24小时内删除,代码虽然是公开学习的,但请尊重作者,应留下说明 require(config.依赖.match(/http(s)?:\/\/.*\//)[0] + 'SrcJyPublic.js');//加载公共文件 function SRCSet() { addListener("onClose", $.toString(() => { clearMyVar('guanli'); clearMyVar('SrcJu_批量选择模式'); clearMyVar('SrcJu_duoselect'); clearMyVar('groupmenu'); })); setPageTitle("♥管理"+getMyVar('SrcJuying-Version', '')); if(getMyVar('guanli','')==""){putMyVar('guanli','jk');} let guanliType = getMyVar('guanli', 'jk'); var d = []; d.push({ title: guanliType=="jk"?colorTitle('接口管理', '#f13b66a'):'接口管理', url: `#noLoading#@lazyRule=.js:putMyVar('guanli','jk');refreshPage(false);'toast://已切换到接口管理';`, img: "https://hikerfans.com/tubiao/movie/98.svg", col_type: "icon_small_3", extra: { newWindow: true, windowId: MY_RULE.title + "云盘", longClick: [{ title: "☁️云盘接口", js: $.toString(() => { return $('hiker://empty#noRecordHistory##noHistory#').rule(() => { require(config.依赖.match(/http(s)?:\/\/.*\//)[0] + 'SrcJySet.js'); yundiskjiekou(); }) }) }] } }); d.push({ title: guanliType=="jk"?'解析管理':colorTitle('解析管理', '#f13b66a'), url: `#noLoading#@lazyRule=.js:putMyVar('guanli','jx');refreshPage(false);'toast://已切换到解析管理';`, img: "https://hikerfans.com/tubiao/movie/105.svg", col_type: "icon_small_3" }); d.push({ title: '扩展中心', url: $('hiker://empty#noRecordHistory##noHistory#').rule(() => { require(config.依赖.match(/http(s)?:\/\/.*\//)[0] + 'SrcJySet.js'); extension(); }), img: "https://hikerfans.com/tubiao/ke/156.png", col_type: "icon_small_3" }); d.push({ col_type: "line_blank" }); d.push({ title: '增加', url: guanliType=="jk"?$('#noLoading#').lazyRule(() => { return 'toast://不支持手工增加接口' }):$('hiker://empty#noRecordHistory##noHistory#').rule(() => { require(config.依赖.match(/http(s)?:\/\/.*\//)[0] + 'SrcJySet.js'); jiexi('add'); }), img: "https://hikerfans.com/tubiao/more/25.png", col_type: "icon_small_4" }); d.push({ title: '操作', url: $(["批量选择","清空所有"],2,"选择操作功能项").select(()=>{ clearMyVar('groupmenu'); if(input=="批量选择"){ let sm; if(getMyVar('SrcJu_批量选择模式')){ clearMyVar('SrcJu_批量选择模式'); sm = "退出批量选择模式"; }else{ putMyVar('SrcJu_批量选择模式','1'); sm = "进入批量选择模式"; } refreshPage(false); return "toast://"+sm; }else if(input=="清空所有"){ if(getMyVar('guanli', 'jk')=="jk"){ var sm = "接口"; }else{ var sm = "解析"; } return $("确定要删除本地所有的"+sm+"吗?").confirm(()=>{ require(config.依赖.match(/http(s)?:\/\/.*\//)[0] + 'SrcJyPublic.js'); deleteData(getMyVar('guanli', 'jk')); refreshPage(false); return 'toast://已全部清空'; }) } }), img: "https://hikerfans.com/tubiao/more/290.png", col_type: "icon_small_4" }); d.push({ title: '导入', url: $("","聚影2口令").input(()=>{ if(input==""){ return 'toast://不能为空'; } if(input.indexOf('@import=js:')>-1){ input = input.split('@import=js:')[0].replace('云口令:','').trim(); } require(config.依赖.match(/http(s)?:\/\/.*\//)[0] + 'SrcJySet.js'); return JYimport(input); }), img: "https://hikerfans.com/tubiao/more/43.png", col_type: "icon_small_4" }); let pastes = getPastes(); pastes.push('云口令文件'); let datalist = getDatas(guanliType); let jkdatalist; if(getMyVar("SrcJu_seacrhJiekou")){ jkdatalist = datalist.filter(it=>{ return it.name.indexOf(getMyVar("SrcJu_seacrhJiekou"))>-1; }) }else{ let group = guanliType=='jk'?getMyVar("SrcJu_jiekouGroup",""):""; jkdatalist = getGroupLists(datalist, group); } let yxdatalist = jkdatalist.filter(it=>{ return !it.stop; }); d.push({ title: '分享', url: yxdatalist.length==0?'toast://有效数据为空,无法分享':$(pastes,2).select((lx)=>{ require(config.依赖.match(/http(s)?:\/\/.*\//)[0] + 'SrcJySet.js'); return JYshare(lx, input); }, guanliType), img: "https://hikerfans.com/tubiao/more/3.png", col_type: "icon_small_4" }); d.push({ col_type: "line" }); d.push({ title: "🔍", url: $.toString(() => { putMyVar("SrcJu_seacrhJiekou",input); refreshPage(false); }), desc: "搜你想要的...", col_type: "input", extra: { defaultValue: getMyVar('SrcJu_seacrhJiekou',''), titleVisible: true } }); if(guanliType=='jk' && datalist.length){ let groupNames = getJiekouGroups(datalist); groupNames.unshift("全部"); groupNames.forEach(it =>{ let obj = { title: getMyVar("SrcJu_jiekouGroup","全部")==it?`““””`+it+``:it, url: $('#noLoading#').lazyRule((it) => { if(getMyVar("SrcJu_jiekouGroup")!=it){ putMyVar("SrcJu_jiekouGroup",it); refreshPage(false); } return "hiker://empty"; },it), col_type: 'scroll_button' } if(it == "全部"){ obj.extra = { longClick: [{ title: "列表排序:" + getItem("sourceListSort", "update"), js: $.toString(() => { return $(["更新时间","接口名称"], 1).select(() => { if(input=='接口名称'){ setItem("sourceListSort","name"); }else{ clearItem("sourceListSort"); } refreshPage(false); }) }) }] } } d.push(obj); }) } if(getMyVar('SrcJu_批量选择模式')){ d.push({ col_type: "blank_block" }); d.push({ title: "反向选择", url: $('#noLoading#').lazyRule((jkdatalist) => { jkdatalist = JSON.parse(base64Decode(jkdatalist)); require(config.依赖.match(/http(s)?:\/\/.*\//)[0] + 'SrcJyPublic.js'); duoselect(jkdatalist); return "toast://已反选"; },base64Encode(JSON.stringify(jkdatalist))), col_type: 'scroll_button' }) d.push({ title: "删除所选", url: $('#noLoading#').lazyRule(() => { let duoselect = storage0.getMyVar('SrcJu_duoselect') || []; if(duoselect.length==0){ return "toast://未选择"; } return $("确定要删除选择的"+duoselect.length+"个接口?").confirm((duoselect)=>{ require(config.依赖.match(/http(s)?:\/\/.*\//)[0] + 'SrcJyPublic.js'); deleteData(getMyVar('guanli', 'jk'), duoselect); refreshPage(false); return 'toast://已删除选择'; }, duoselect) }), col_type: 'scroll_button' }) if(guanliType=='jk'){ d.push({ title: "禁用所选", url: $('#noLoading#').lazyRule(() => { let duoselect = storage0.getMyVar('SrcJu_duoselect') || []; if(duoselect.length==0){ return "toast://未选择"; } return $("确定要禁用选择的"+duoselect.length+"个接口?").confirm((duoselect)=>{ require(config.依赖.match(/http(s)?:\/\/.*\//)[0] + 'SrcJyPublic.js'); dataEnable(getMyVar('guanli', 'jk'), duoselect, '禁用'); refreshPage(false); return 'toast://已禁用选择'; },duoselect) }), col_type: 'scroll_button' }) d.push({ title: "调整分组", url: $('#noLoading#').lazyRule(()=>{ let duoselect = storage0.getMyVar('SrcJu_duoselect') || []; if(duoselect.length>0){ return $("","选定的"+duoselect.length+"个接口新分组名").input((duoselect)=>{ require(config.依赖.match(/http(s)?:\/\/.*\//)[0] + 'SrcJyPublic.js'); var filepath = getFile(getMyVar('guanli', 'jk')); var datafile = fetch(filepath); eval("var datalist=" + datafile+ ";"); datalist.forEach(data=>{ if(duoselect.some(item => data.url==item.url)){ if(input){ data.group = input; }else{ delete data.group; } } }) writeFile(filepath, JSON.stringify(datalist)); clearMyVar('SrcJu_duoselect'); refreshPage(false); return "toast://已批量调整接口分组"; }, duoselect) }else{ return "toast://请选择"; } }), col_type: "scroll_button" }); } } jkdatalist.forEach(it => { let selectmenu; if(guanliType=="jk"){ var dataurl = it.url; var dataname = it.name; var dataua = it.ua; var datatype = it.type; var datagroup = it.group; var datatitle = dataname + ' ('+datatype+')' + (datagroup&&datagroup!=datatype?' [' + datagroup + ']':""); var datadesc = dataurl; var dataarr = {name:dataname, url:dataurl, ua:dataua, type:datatype}; if(datagroup){dataarr['group'] = datagroup} selectmenu = ["分享", "删除", it.stop?"启用":"禁用"]; }else{ var dataurl = it.parse; var dataname = it.name; var datastopfrom = it.stopfrom||[]; var datapriorfrom = it.priorfrom||""; var datasort = it.sort||0; var datatitle = datasort+'-'+dataname+'-'+dataurl; var datadesc = "优先强制:" + datapriorfrom + "" + "\n排除片源:" + datastopfrom + ""; var dataarr = {name:dataname, url:dataurl, stopfrom:datastopfrom+"", priorfrom:datapriorfrom+""}; if(it.header){dataarr['header'] = it.header} if(it.web){dataarr['web'] = it.web} selectmenu = ["分享","编辑", "删除"]; } if(it.retain){dataarr['retain'] = 1} d.push({ title: it.stop?'‘‘’’'+colorTitle(datatitle,'#f20c00'):datatitle, url: getMyVar('SrcJu_批量选择模式')?$('#noLoading#').lazyRule((data) => { data = JSON.parse(base64Decode(data)); require(config.依赖.match(/http(s)?:\/\/.*\//)[0] + 'SrcJyPublic.js'); duoselect(data); return "hiker://empty"; },base64Encode(JSON.stringify(it))):$(selectmenu, 2).select((data,paste) => { data = JSON.parse(base64Decode(data)); if (input == "分享") { showLoading('分享上传中,请稍后...'); let oneshare = [] oneshare.push(data); let pasteurl = sharePaste(aesEncode('SrcJuying2', JSON.stringify(oneshare)), paste||""); hideLoading(); if (/^http|^云/.test(pasteurl) && pasteurl.includes('/')) { pasteurl = pasteurl.replace('云6oooole', 'https://pasteme.tyrantg.com').replace('云5oooole', 'https://cmd.im').replace('云7oooole', 'https://note.ms').replace('云9oooole', 'https://txtpbbd.cn').replace('云10oooole', 'https://hassdtebin.com'); log('剪贴板地址>'+pasteurl); let code = '聚影2接口¥' + aesEncode('SrcJuying2', pasteurl) + '¥' + data.name; copy('云口令:'+code+`@import=js:$.require("hiker://page/import?rule=`+MY_RULE.title+`");`); return "toast://(单个)分享口令已生成"; } else { return "toast://分享失败,剪粘板或网络异常>"+pasteurl; } } else if (input == "删除") { return $("确定删除:"+data.name).confirm((data)=>{ require(config.依赖.match(/http(s)?:\/\/.*\//)[0] + 'SrcJyPublic.js'); deleteData(getMyVar('guanli', 'jk'), data); refreshPage(false); return 'toast://已删除:'+data.name; }, data) } else if (input == "禁用" || input == "启用" ) { require(config.依赖.match(/http(s)?:\/\/.*\//)[0] + 'SrcJyPublic.js'); let sm = dataEnable(getMyVar('guanli', 'jk'), data, input); refreshPage(false); return 'toast://' + sm; } }, base64Encode(JSON.stringify(it)), Juconfig['sharePaste']), desc: datadesc, col_type: "text_1", extra: { id: dataurl } }); }) d.push({ title: "‘‘’’当前接口数:" + jkdatalist.length + ",总有效数:"+yxdatalist.length+"", url: 'hiker://empty', col_type: 'text_center_1' }); setResult(d); } function getapitype(apiurl) { if(apiurl){ if(apiurl.includes('.vod')){ return "v1"; }else if(apiurl.includes('/app/')){ return "app"; }else if(apiurl.includes('app.php')){ return "v2"; }else if(/iptv|Chengcheng/.test(apiurl)){ return "iptv"; }else if(apiurl.includes('provide/vod/')){ return "cms"; }else{ return ""; } }else{ return ""; } } //接口保存 function jiekousave(urls) { if(urls.length==0){return 0;} let num = 0; try{ let filepath = jkfile; let datalist = []; var datafile = fetch(filepath); if(datafile != ""){ eval("datalist=" + datafile+ ";"); } let olddatanum = datalist.length; for (var i in urls) { let urlname = urls[i].name;//.replace(/(?:[\u2700-\u27bf]|(?:\ud83c[\udde6-\uddff]){2}|[\ud800-\udbff][\udc00-\udfff]|[\u0023-\u0039]\ufe0f?\u20e3|\u3299|\u3297|\u303d|\u3030|\u24c2|\ud83c[\udd70-\udd71]|\ud83c[\udd7e-\udd7f]|\ud83c\udd8e|\ud83c[\udd91-\udd9a]|\ud83c[\udde6-\uddff]|\ud83c[\ude01-\ude02]|\ud83c\ude1a|\ud83c\ude2f|\ud83c[\ude32-\ude3a]|\ud83c[\ude50-\ude51]|\u203c|\u2049|[\u25aa-\u25ab]|\u25b6|\u25c0|[\u25fb-\u25fe]|\u00a9|\u00ae|\u2122|\u2139|\ud83c\udc04|[\u2600-\u26FF]|\u2b05|\u2b06|\u2b07|\u2b1b|\u2b1c|\u2b50|\u2b55|\u231a|\u231b|\u2328|\u23cf|[\u23e9-\u23f3]|[\u23f8-\u23fa]|\ud83c\udccf|\u2934|\u2935|[\u2190-\u21ff])|\(XPF\)|\(萝卜\)|\(神马\)|\(切\)|\(聚\)|\(优\)|\(神马\)|\(XB\)|\(SP\)|\(XP\)|[\x00-\x1F\x7F]/g,''); let urlurl = urls[i].url; let urlua = urls[i].ua; let urltype = urls[i].type||getapitype(urlurl); let urlgroup = urls[i].group||(olddatanum>0?"新导入":""); let urlext = urls[i].ext||""; function checkitem(item) { return item.url==urlurl; } if(!datalist.some(checkitem)&&urlname&&urltype){ let arr = { "name": urlname, "url": urlurl, "type": urltype }; if(urlgroup){arr['group'] = urlgroup} if(urlua){arr['ua'] = urlua} if(urlext){arr['ext'] = urlext} if(urls[i].categories){arr['categories'] = urls[i].categories} if(urls.length == 1){ datalist.unshift(arr); }else{ datalist.push(arr); } num = num + 1; } } if(num>0){writeFile(filepath, JSON.stringify(datalist));} } catch (e) { log('导入失败:'+e.message); return -1; } return num; } //解析保存 function jiexisave(urls,update,codedytype) { if(urls.length==0){return 0;} try{ var filepath = jxfile ; var datafile = fetch(filepath); if(datafile != ""){ eval("var datalist=" + datafile+ ";"); }else{ var datalist = []; } if(codedytype==1){ for(let i=0;i0){writeFile(filepath, JSON.stringify(datalist));} } catch (e) { log('导入失败:'+e.message); return -1; } return num; } function jiexi(lx,data) { addListener("onClose", $.toString(() => { clearMyVar('parsename'); clearMyVar('parseurl'); clearMyVar('parseurls'); clearMyVar('addtype'); clearMyVar('stopfrom'); clearMyVar('priorfrom'); clearMyVar('parseheader'); clearMyVar('parseisweb'); clearMyVar('isretain'); clearMyVar('isload'); })); var d = []; if(lx!="update"){ setPageTitle("♥解析管理-新增"); d.push({ title: '添加方式:点击切换', col_type:'text_1', url: $('#noLoading#').lazyRule(()=>{ if(getMyVar('addtype', '1')=="1"){ putMyVar('addtype', '2'); }else{ putMyVar('addtype', '1'); } refreshPage(false); return'toast://已切换'; }) }); }else{ if(getMyVar('isload', '0')=="0"){ setPageTitle("♥解析管理-变更"); putMyVar('isretain', data.retain?data.retain:""); putMyVar('isload', '1'); } } if(getMyVar('addtype', '1')=="1"){ d.push({ title:'parseurl', col_type: 'input', desc: "解析名称", extra: { titleVisible: false, defaultValue: getMyVar('parsename', lx=="update"?data.name:""), onChange: 'putMyVar("parsename",input)' } }); d.push({ title:'parseurl', col_type: 'input', desc: "链接地址", extra: { highlight: true, type: "textarea", titleVisible: false, defaultValue: getMyVar('parseurl', lx=="update"?data.url:""), onChange: 'putMyVar("parseurl",input)' } }); function selectfrom(lx,oldfrom){ addListener("onClose", $.toString(() => { clearMyVar('selectfrom'); })); var d = []; d.push({ title: lx=="prior"?'优先片源标识不为空时,优先级在上次优先之后':'排除对应片源后,解析将不再调用', col_type: "rich_text" }); d.push({ col_type: "line" }); d.push({ title:lx=="prior"?'优先片源':'排除片源', col_type: 'input', desc: getMyVar('selectfrom',oldfrom), extra: { titleVisible: false, defaultValue: getMyVar('selectfrom', oldfrom), onChange: 'putMyVar("selectfrom",input)' } }); d.push({ title: '选择对应的片源标识>', col_type: "rich_text" }); d.push({ col_type: "line_blank" }); var recordfile = "hiker://files/rules/Src/Juying2/parse.json"; var recordparse=fetch(recordfile); if(recordparse!=""){ eval("var recordlist=" + recordparse+ ";"); }else{ var recordlist={}; } var froms = recordlist.from || ['youku','mgtv','iqiyi','qq']; for(var i in froms){ d.push({ title:getMyVar('selectfrom',oldfrom).indexOf(froms[i])>-1?'‘‘’’'+froms[i]:froms[i], col_type:'text_4', url: $('#noLoading#').lazyRule((from)=>{ let selectfrom = getMyVar('selectfrom')?getMyVar('selectfrom','').replace(/,|,/g,",").split(','):[]; if(selectfrom.indexOf(from)==-1){ selectfrom.push(from); var sm = '选择片源>'+from; }else{ function removeByValue(arr, val) { for(var i = 0; i < arr.length; i++) { if(arr[i] == val) { arr.splice(i, 1); break; } } } removeByValue(selectfrom,from); var sm = '删除片源>'+from; } putMyVar('selectfrom',selectfrom.join(',')); refreshPage(false); return 'toast://'+sm; }, froms[i]) }) } d.push({ col_type: "line_blank" }); d.push({ title:'选择好了,点此返回', col_type:'text_center_1', url: $('#noLoading#').lazyRule((lx)=>{ let selectfrom = getMyVar('selectfrom',''); if(lx=="prior"){ putMyVar('priorfrom',selectfrom); let stopfrom = getMyVar('stopfrom')?getMyVar('stopfrom','').replace(/,|,/g,",").split(','):[]; let newstopfrom = []; stopfrom.forEach(it=>{ if(selectfrom.indexOf(it)==-1){ newstopfrom.push(it); } }) putMyVar('stopfrom',newstopfrom.join(",")); }else{ putMyVar('stopfrom',selectfrom); let priorfrom = getMyVar('priorfrom')?getMyVar('priorfrom','').replace(/,|,/g,",").split(','):[]; let newpriorfrom = []; priorfrom.forEach(it=>{ if(selectfrom.indexOf(it)==-1){ newpriorfrom.push(it); } }) putMyVar('priorfrom',newpriorfrom.join(",")); } back(true); return "hiker://empty"; },lx) }); setHomeResult(d); } let priorfrom = getMyVar('priorfrom', data&&data.priorfrom?data.priorfrom:""); putMyVar('priorfrom',priorfrom); d.push({ title:'优先片源:' + priorfrom, col_type: 'text_1', url:$('hiker://empty#noRecordHistory##noHistory#').rule((selectfrom,lx,oldfrom) => { selectfrom(lx,oldfrom); },selectfrom,'prior',priorfrom) }); let stopfrom = getMyVar('stopfrom', lx=="update"?data.stopfrom:""); putMyVar('stopfrom',stopfrom); d.push({ title:'排除片源:' + stopfrom, col_type: 'text_1', url: $('hiker://empty#noRecordHistory##noHistory#').rule((selectfrom,lx,oldfrom) => { selectfrom(lx,oldfrom); },selectfrom,'stop',stopfrom) }); let parseheader = getMyVar('parseheader', lx=="update"&&data.header?JSON.stringify(data.header):""); d.push({ title:'header信息:' + parseheader, col_type: 'text_1', url:$().lazyRule((parseheader)=>{ function sethead(parse){ if(!/^http/.test(parse)){ return ""; }else{ let head = {"User-Agent": "okhttp/4.1.0"}; let referer = parse.match(/http(s)?:\/\/(.*?)\//)[0]||""; if(referer){ head["referer"] = referer; } return head; } } return $(parseheader?parseheader:sethead(getMyVar('parseurl', '')),"提示防盗的解析可能就是需要header,比如Referer、UA").input(()=>{ if((getMyVar("parseurl")&&/{|}/.test(input))||input==""){ putMyVar("parseheader",input); refreshPage(false); return "hiker://empty"; }else{ return "toast://链接地址不能为空,或输入信息不正常" } }) }, parseheader) }); if(lx=="update"&&getMyVar('parseisweb',data&&data.web==1?"1":"0")=="1"){ putMyVar('parseisweb','1'); } d.push({ title:'是否明确为web普通解析:' + (getMyVar('parseisweb')=="1"?"是":"否"), col_type: 'text_1', url:$().lazyRule(()=>{ if(/^http/.test(getMyVar('parseurl',''))&&!/id=|key=/.test(getMyVar('parseurl',''))){ if(getMyVar('parseisweb')=="1"){ putMyVar('parseisweb','0'); }else{ putMyVar('parseisweb','1'); } refreshPage(false); return "hiker://empty"; }else{ return "toast://以http开头的普通解析才能标记" } }) }); d.push({ title: getMyVar('isretain', '')!="1"?'强制保留:否':'强制保留:是', desc: getMyVar('isretain', '')!="1"?'资源码订阅更新时会被覆盖':'资源码订阅更新时保留此接口', col_type:'text_1', url:$('#noLoading#').lazyRule(()=>{ if(getMyVar('isretain', '')!="1"){ putMyVar('isretain', '1'); }else{ clearMyVar('isretain'); } refreshPage(false); return 'toast://已切换'; }) }); }else{ d.push({ title:'批量添加', col_type: 'input', desc: "一行一个解析\n格式:解析名称#链接地址\n分隔符#可以用,号代替\n\n\n断插解析导入\n明码格式:★xxx★xxx\n云分享链接也支持的", extra: { titleVisible: false, type: "textarea", height: 10, onChange: 'putMyVar("parseurls",input)' } }); } d.push({ title:'测试', col_type:'text_3', url: $().lazyRule((data)=>{ var dataurl = getMyVar('parseurl'); var dataname = getMyVar('parsename')||'测试'; var datahead = getMyVar('parseheader',data&&data.header?JSON.stringify(data.header):""); if(!dataurl||!/^http|^functio/.test(dataurl.trim())){ return "toast://获取解析地址失败,无法测试"; } addItemAfter('jxline',{ title: '选择测试片源', col_type: "rich_text", extra:{ id: 'jxfrom', cls: 'jxtest' } }) addItemAfter('jxfrom',{ col_type: "line", extra:{ id: 'jxline2', cls: 'jxtest' } }) var filepath = 'hiker://files/rules/Src/Juying2/testurls.json'; var datafile = fetch(filepath); if(datafile != ""){ eval("var urls=" + datafile+ ";"); }else{ var urls = { "1905": "https://vip.1905.com/m/play/1566444.shtml", "爱奇艺": "https://m.iqiyi.com/v_sa04mvdzk8.html", "优酷": "https://v.youku.com/v_show/id_XNDc0MDE1NTk1Mg==.html", "腾讯": "https://v.qq.com/x/cover/mzc00200frpbpgb/r0042i6x2xp.html", "芒果": "https://www.mgtv.com/b/349253/10424300.html", "哔哩哔哩": "https://m.bilibili.com/bangumi/play/ep471494", "搜狐": "https://m.tv.sohu.com/v/MjAyMjAxMDkvbjYwMTE1MjExMy5zaHRtbA==.html", "西瓜": "https://www.ixigua.com/6532733952283640333?logTag=fbbfc792d3498d67c0fd", "PPTV": "https://v.pptv.com/show/zVn3dJXt1xV49l4.html", "咪咕": "https://m.miguvideo.com/mgs/msite/prd/detail.html?cid=676935232&mgdbid=&channelId=CAAAB000902015500000000", "乐视": "http://www.le.com/ptv/vplay/26958608.html" } writeFile(filepath, JSON.stringify(urls)); } let parsearr = {name:dataname,parse:dataurl}; try{ if(datahead){parsearr['header']= JSON.parse(datahead)} }catch(e){} if(getMyVar('parseisweb')=="1"){parsearr['web']= 1} urls['自定义'] = ""; for(var key in urls){ addItemBefore('jxline2', { title: key, url: key!="自定义"?$('#noRecordHistory##noHistory#').lazyRule((vipUrl,parseStr)=>{ require(config.依赖.match(/http(s)?:\/\/.*\//)[0] + 'SrcParseS.js'); return SrcParseS.聚影(vipUrl, parseStr); },urls[key],parsearr):$("","输入自定义播放地址").input((parseStr) => { if(input==""){ return "toast://未输入自定义地址,无法测试"; }else{ return $().lazyRule((vipUrl,parseStr)=>{ require(config.依赖.match(/http(s)?:\/\/.*\//)[0] + 'SrcParseS.js'); return SrcParseS.聚影(vipUrl, parseStr); }, input, parseStr) } }, parsearr), col_type: "text_3", extra:{ cls: 'jxtest', jsLoadingInject: true, blockRules: ['.m4a','.mp3','.gif','.jpeg','.png','.ico','hm.baidu.com','/ads/*.js'] } }) } addItemBefore('jxline2', { title: '编辑测试', url: $('#noRecordHistory##noHistory#').lazyRule(()=>{ return "editFile://hiker://files/rules/Src/Juying2/testurls.json"; }), col_type: "text_3", extra:{ cls: 'jxtest' } }) updateItem('jxtest', { url: "hiker://empty" }) return "hiker://empty"; }, data), extra:{ id: 'jxtest' } }); if(lx=="update"){ d.push({ title:'删除', col_type:'text_3', url: $("确定删除解析:"+getMyVar('parsename',data.name)).confirm((dataurl)=>{ var filepath = "hiker://files/rules/Src/Juying2/myjiexi.json"; var datafile = fetch(filepath); eval("var datalist=" + datafile+ ";"); for(var i=0;i{ clearMyVar('parsename'); clearMyVar('parseurl'); clearMyVar('parseurls'); refreshPage(false); return "toast://已清空"; }) }); } d.push({ title:'保存', col_type:'text_3', url: $().lazyRule((lx,data)=>{ if(getMyVar('addtype', '1')=="1"&&!/^http|^functio/.test(getMyVar('parseurl',''))){return "toast://解析地址不正确"} require(config.依赖.match(/http(s)?:\/\/.*\//)[0] + 'SrcJySet.js'); let urls= []; let parseurl = getMyVar('parseurl'); let parsename = getMyVar('parsename'); let parseurls = getMyVar('parseurls'); let parsestopfrom = getMyVar('stopfrom',data&&data.stopfrom?data.stopfrom:""); let pasrepriorfrom = getMyVar('priorfrom',data&&data.priorfrom?data.priorfrom:""); let parseheader = getMyVar('parseheader',data&&data.header?JSON.stringify(data.header):""); if(getMyVar('addtype', '1')=="1"&&parseurl&&parsename){ let isupdate = 0; let stopfrom = parsestopfrom.replace(',',',').split(','); stopfrom = stopfrom.filter(n => n); let priorfrom = pasrepriorfrom.replace(',',',').split(','); priorfrom = priorfrom.filter(n => n); let arr = { "name": parsename.trim(), "parse": parseurl.trim(), "stopfrom": stopfrom, "priorfrom": priorfrom, "sort": 0}; try{ if(parseheader){arr['header']= JSON.parse(parseheader)} }catch(e){ } try{ if(getMyVar('parseisweb')=="1"){arr['web']= 1} }catch(e){} let isretain = getMyVar('isretain')=="1"?1:0; if(isretain){arr['retain'] = 1;} if(lx=="update"){ isupdate = 1; arr['oldurl'] = data.url; } urls.push(arr); let num = jiexisave(urls,isupdate); if(num==1){ back(true); return "toast://已保存"; }else if(num==0){ return "toast://已存在"; }else{ return "toast://保存出错"; } }else if(getMyVar('addtype', '1')=="2"&&parseurls){ if(parseurls.indexOf('★')>-1){ try{ if(/^https:\/\/netcut\.cn/.test(parseurls)&&parseurls.indexOf('★MyParseS合集★')>-1){ let parsesurl = parsePaste(parseurls); eval(base64Decode(parsesurl.replace('MyParseS合集★@base64://',''))); for (let i=0;i0){ let num = jiexisave(urls); if(num>=0){ back(true); return "toast://成功保存解析:"+num; }else{ return "toast://保存出错"; } } }else{ return "toast://无法保存,检查项目填写完整性"; } },lx,data) }); d.push({ col_type: "line", extra:{id:'jxline'} }) setHomeResult(d); } //扩展中心 function extension(){ addListener("onClose", $.toString(() => { clearMyVar('importjiekou'); clearMyVar('importjiexi'); clearMyVar('importlive'); clearMyVar('importtype'); clearMyVar('importinput'); clearMyVar('uploads'); clearMyVar('uploadjiekou'); clearMyVar('uploadjiexi'); clearMyVar('uploadlive'); clearMyVar('uploadyundisk'); refreshPage(false); })); let d = []; function getide(is) { if(is==1){ return '‘‘’’'; }else{ return '‘‘’’'; } } /* d.push({ col_type: "line_blank" }); */ d.push({ title: '🌐 聚影分享', col_type: "rich_text" }); let num = ''; for (var i = 0; i < 10; i++) { num += Math.floor(Math.random() * 10); } let note_name = 'Juying'+num; let sharecode = Juconfig['sharecode'] || {}; sharecode['note_name'] = sharecode['note_name'] || note_name; let noteinfo = {}; if(sharecode['note_id']){ try{ noteinfo = JSON.parse(request('https://netcut.txtbin.cn/api/note2/info/?note_id='+sharecode['note_id'], { headers: { 'Referer': 'https://netcut.cn/' } })); }catch(e){} } d.push({ title: noteinfo.status==1&&sharecode['note_id']?'复制聚影资源码口令':'申请聚影资源码',//sharetime desc: noteinfo.status==1&&sharecode['time']?noteinfo.data.created_time+' 有效期三年\n'+(sharecode['time']?sharecode['time']+" 上次同步时间":"暂未分享同步"):'点击申请三年长期资源码', url: sharecode['note_id']?$().lazyRule((codeid)=>{ let code = '聚影资源码¥'+codeid; copy(code); return "hiker://empty"; },aesEncode('Juying', sharecode['note_id'])):$().lazyRule((Juconfig,cfgfile,note_name) => { try{ let pastecreate = JSON.parse(request('https://netcut.txtbin.cn/api/note2/save/', { headers: { 'Referer': 'https://netcut.cn/' }, body: 'note_name='+note_name+'¬e_id=¬e_content=¬e_token=¬e_pwd=&expire_time=94608000', method: 'POST' })); if(pastecreate.status==1){ let pastedata = pastecreate.data || {}; pastedata['note_name'] = note_name; Juconfig['sharecode'] = pastedata; writeFile(cfgfile, JSON.stringify(Juconfig)); refreshPage(false); return 'toast://申领成功'; }else{ return 'toast://申领失败:'+pastecreate.error; } } catch (e) { log('申请失败:'+e.message); return 'toast://申请失败,请重新再试'; } }, Juconfig, cfgfile, sharecode['note_name']), col_type: "text_center_1" }); d.push({ title: '✅ 分享同步', url: noteinfo.status==1&&sharecode['note_id']?$('#noLoading#').lazyRule(()=>{ putMyVar('uploads','1'); putMyVar('uploadjiekou','1'); putMyVar('uploadjiexi','0'); putMyVar('uploadlive','0'); putMyVar('uploadyundisk','0'); refreshPage(false); return 'toast://选择上传同步云端的项'; }):'toast://请先申请聚影资源码', col_type: "text_2" }); d.push({ title: '❎ 删除云端', url: sharecode['note_id']?$("确定要删除吗,删除后无法找回?").confirm((Juconfig,cfgfile)=>{ try{ let sharecode = Juconfig['sharecode'] || {}; var pastedelete = JSON.parse(request('https://netcut.txtbin.cn/api/note2/deleteNote/', { headers: { 'Referer': 'https://netcut.cn/' }, body: 'note_id='+sharecode.note_id+'¬e_toke='+sharecode.note_toke+'¬e_name='+sharecode.note_name, method: 'POST' })); var status = pastedelete.status delete Juconfig['sharecode']; writeFile(cfgfile, JSON.stringify(Juconfig)); refreshPage(false); if(status==1){ return "toast://聚影资源码云端已删除"; }else{ return 'toast://无需删除,云端已不存在'; } } catch (e) { log('删除失败:'+e.message); return 'toast://删除资源失败,云端异常'; } }, Juconfig, cfgfile):'toast://请先申请聚影资源码', col_type: "text_2" }); if(getMyVar('uploads','0')=="1"){ d.push({ title: '选择分享同步云端的项目', col_type: "rich_text", extra:{textSize:12} }); d.push({ title:(getMyVar('uploadjiekou','0')=="1"?getide(1):getide(0))+'接口', col_type:'text_4', url:$('#noLoading#').lazyRule(() => { if(getMyVar('uploadjiekou')=="1"){ putMyVar('uploadjiekou','0'); }else{ putMyVar('uploadjiekou','1'); } refreshPage(false); return "hiker://empty"; }) }); d.push({ title:(getMyVar('uploadjiexi','0')=="1"?getide(1):getide(0))+'解析', col_type:'text_4', url:$('#noLoading#').lazyRule(() => { if(getMyVar('uploadjiexi')=="1"){ putMyVar('uploadjiexi','0'); var sm = "hiker://empty"; }else{ putMyVar('uploadjiexi','1'); var sm = "toast://友情提醒:公开分享的解析容易失效"; } refreshPage(false); return sm; }) }); d.push({ title:(getMyVar('uploadlive','0')=="1"?getide(1):getide(0))+'直播', col_type:'text_4', url:$('#noLoading#').lazyRule(() => { if(getMyVar('uploadlive')=="1"){ putMyVar('uploadlive','0'); }else{ putMyVar('uploadlive','1'); } refreshPage(false); return "hiker://empty"; }) }); d.push({ title:(getMyVar('uploadyundisk','0')=="1"?getide(1):getide(0))+'云盘', col_type:'text_4', url:$('#noLoading#').lazyRule(() => { if(getMyVar('uploadyundisk')=="1"){ putMyVar('uploadyundisk','0'); }else{ putMyVar('uploadyundisk','1'); } refreshPage(false); return "hiker://empty"; }) }); d.push({ title: '🔙 取消上传', url: $('#noLoading#').lazyRule(() => { clearMyVar('uploads'); clearMyVar('uploadjiekou'); clearMyVar('uploadjiexi'); clearMyVar('uploadlive'); clearMyVar('uploadyundisk'); refreshPage(false); return "hiker://empty"; }), col_type: "text_2" }); d.push({ title: '🔝 确定上传', url: $().lazyRule((Juconfig,cfgfile) => { var text = {}; if(getMyVar('uploadjiekou','0')=="1"){ var filepath = "hiker://files/rules/Src/Juying2/jiekou.json"; var datafile = fetch(filepath); if(datafile==""){ var datalist = []; }else{ eval("var datalist=" + datafile+ ";"); } text['jiekou'] = datalist; } if(getMyVar('uploadjiexi','0')=="1"){ var filepath = "hiker://files/rules/Src/Juying2/jiexi.json"; var datafile = fetch(filepath); if(datafile==""){ var datalist = []; }else{ eval("var datalist=" + datafile+ ";"); } text['jiexi'] = datalist; } if(getMyVar('uploadlive','0')=="1"){ var filepath = "hiker://files/rules/Src/Juying2/liveconfig.json"; var datafile = fetch(filepath); if(datafile==""){ var liveconfig={}; }else{ eval("var liveconfig=" + datafile+ ";"); } text['live'] = liveconfig; } if(getMyVar('uploadyundisk','0')=="1"){ var filepath = "hiker://files/rules/Src/Juying2/yundisk.json"; var datafile = fetch(filepath); if(datafile==""){ var datalist=[]; }else{ eval("var datalist=" + datafile+ ";"); } text['yundisk'] = datalist; } let textcontent = base64Encode(JSON.stringify(text)); if(textcontent.length>=200000){ log('分享失败:字符数超过最大限制,请精简接口,重点减少xpath和biubiu类型'); return 'toast://分享同步失败,超过最大限制,请精简接口'; } try{ let sharecode = Juconfig['sharecode'] || {}; var pasteupdate = JSON.parse(request('https://netcut.txtbin.cn/api/note2/save/', { headers: { 'Referer': 'https://netcut.cn/' }, body: 'note_name='+sharecode.note_name+'¬e_id='+sharecode.note_id+'¬e_content='+textcontent+'¬e_token='+sharecode.note_token+'¬e_pwd=&expire_time=94608000', method: 'POST' })); var status = pasteupdate.status clearMyVar('uploads'); clearMyVar('uploadjiekou'); clearMyVar('uploadjiexi'); clearMyVar('uploadlive'); clearMyVar('uploadyundisk'); refreshPage(false); if(status==1){ let pastedata = pasteupdate.data || {}; pastedata['note_name'] = sharecode.note_name; Juconfig['sharecode'] = pastedata; writeFile(cfgfile, JSON.stringify(Juconfig)); refreshPage(false); return "toast://分享同步云端数据成功"; }else{ return 'toast://分享同步失败,资源码应该不存在'; } } catch (e) { log('分享失败:'+e.message); return 'toast://分享同步失败,请重新再试'; } }, Juconfig, cfgfile), col_type: "text_2" }); } /* d.push({ col_type: "line_blank" }); */ d.push({ col_type: "line" }); d.push({ title: '⚡ 订阅管理', col_type: "rich_text" }); d.push({ title: Juconfig['codedyid']?'已订阅聚影资源码':'订阅聚影资源码', desc: Juconfig['codedyid']?'点击订阅、复制、切换资源码'+(Juconfig['codedyname']?'\n当前订阅的资源码为:'+Juconfig['codedyname']:""):'订阅后将与分享者云端数据保持同步', url: $(["订阅","复制","切换"],3).select((Juconfig,cfgfile)=>{ if(input=="订阅"){ return $("","输入聚影资源码口令\n订阅会自动和云端同步,覆盖本地非保留接口").input((Juconfig,cfgfile) => { if(input.split('¥')[0]!="聚影资源码"){ return 'toast://口令有误'; } showLoading('正在较验有效性') let codeid = input.split('¥')[1]; let text = parsePaste('https://netcut.cn/p/'+aesDecode('Juying', codeid)); hideLoading(); if(codeid&&!/^error/.test(text)){ return $("","当前资源码有效,起个名保存吧").input((Juconfig,cfgfile,codeid) => { let dydatalist = Juconfig.dingyue||[]; if(dydatalist.some(item => item.name ==input)){ return 'toast://名称重复,无法保存'; }else if(input!=""){ if(!dydatalist.some(item => item.url ==codeid)){ Juconfig['codedyid'] = codeid; Juconfig['codedyname'] = input; dydatalist.push({name:input, url:codeid}) Juconfig['dingyue'] = dydatalist; writeFile(cfgfile, JSON.stringify(Juconfig)); refreshPage(false); return 'toast://已保存,订阅成功'; }else{ return 'toast://已存在,订阅未成功'; } }else{ return 'toast://名称为空,无法保存'; } }, Juconfig, cfgfile, codeid); }else{ return "toast://口令错误或资源码已失效"; } }, Juconfig, cfgfile) }else if(input=="复制"){ let codeid = Juconfig['codedyid']; return codeid?$().lazyRule((codeid)=>{ let code = '聚影资源码¥'+codeid; copy(code); return "hiker://empty"; },codeid):'toast://请先订阅' }else if(input=="切换"){ let codeid = Juconfig['codedyid']; let dydatalist = Juconfig.dingyue||[]; let list = dydatalist.map((list)=>{ if(list.url !=codeid){ return list.name; } }) list = list.filter(n => n); if(list.length>0){ return $(list,3,"选择需切换的订阅源").select((dydatalist,Juconfig,cfgfile)=>{ var url = ""; for (var i in dydatalist) { if(dydatalist[i].name==input){ url = dydatalist[i].url; break; } } if(url){ Juconfig['codedyid'] = url; Juconfig['codedyname'] = input; writeFile(cfgfile, JSON.stringify(Juconfig)); refreshPage(false); return 'toast://订阅已切换为:'+input+',更新资源立即生效'; }else{ return 'toast://本地订阅记录文件异常,是不是干了坏事?'; } },dydatalist,Juconfig,cfgfile) }else{ return 'toast://未找到可切换的历史订阅'; } } },Juconfig,cfgfile), col_type: "text_center_1" }); d.push({ title: '✅ 更新资源', url: Juconfig['codedyid']?$("确定要从云端更新数据?\n"+(Juconfig['codedytype']=="2"?"当前为增量订阅模式,只增不删":"当前为全量订阅模式,覆盖本地")).confirm((codedyid,codedytype)=>{ try{ showLoading('请稍候...') let codeid = codedyid; let text = parsePaste('https://netcut.cn/p/'+aesDecode('Juying', codeid)); if(codeid&&!/^error/.test(text)){ let pastedata = JSON.parse(base64Decode(text)); require(config.依赖.match(/http(s)?:\/\/.*\//)[0] + 'SrcJySet.js'); let jknum = 0; let jxnum = 0; let ypnum = 0; let jkdatalist = pastedata.jiekou||[]; if(jkdatalist.length>0){ jknum = jiekousave(jkdatalist, 0, codedytype||1); } let jxdatalist = pastedata.jiexi||[]; if(jxdatalist.length>0){ jxnum = jiexisave(jxdatalist, 0, codedytype||1); } if(pastedata.live){ let livefilepath = "hiker://files/rules/Src/Juying2/liveconfig.json"; let liveconfig = pastedata.live; writeFile(livefilepath, JSON.stringify(liveconfig)); var sm = ",直播订阅已同步" } let ypdatalist = pastedata.yundisk||[]; if(ypdatalist.length>0){ ypnum = yundisksave(ypdatalist); } hideLoading(); return "toast://同步完成,接口:"+jknum+",解析:"+jxnum+(sm?sm:"")+",云盘:"+ypnum; }else{ hideLoading(); return "toast://口令错误或资源码已失效"; } } catch (e) { hideLoading(); log('更新失败:'+e.message); return "toast://无法识别的口令"; } }, Juconfig['codedyid'], Juconfig['codedytype']):'toast://请先订阅聚影资源码', col_type: "text_2", extra: { longClick: [{ title: "订阅类型改为:"+(Juconfig['codedytype']=="2"?"全量":"增量"), js: $.toString((Juconfig,cfgfile) => { if(Juconfig['codedytype']=="2"){ Juconfig['codedytype'] = "1"; var sm = "切换为全量订阅,除强制保留的接口/接口,均会被清空"; }else{ Juconfig['codedytype'] = "2"; var sm = "切换为增量订阅,接口/接口只会累加,不会删除"; } writeFile(cfgfile, JSON.stringify(Juconfig)); refreshPage(false); return "toast://"+sm; },Juconfig,cfgfile) }] } }); d.push({ title: '❎ 删除订阅', url: Juconfig['codedyid']?$(["仅删订阅源,保留历史","册除订阅及历史,不再切换"],1).select((Juconfig,cfgfile)=>{ if(input=="仅删订阅源,保留历史"){ return $().lazyRule((Juconfig,cfgfile) => { delete Juconfig['codedyid']; delete Juconfig['codedyname']; writeFile(cfgfile, JSON.stringify(Juconfig)); refreshPage(false); return 'toast://已删除订阅源,历史记录可用于切换'; }, Juconfig, cfgfile) }else if(input=="册除订阅及历史,不再切换"){ return $().lazyRule((Juconfig,cfgfile) => { let codeid = Juconfig['codedyid']; delete Juconfig['codedyid']; delete Juconfig['codedyname']; let dydatalist = Juconfig.dingyue||[]; for (var i in dydatalist) { if(dydatalist[i].url==codeid){ dydatalist.splice(i,1); break; } } Juconfig['dingyue'] = dydatalist; writeFile(cfgfile, JSON.stringify(Juconfig)); refreshPage(false); return 'toast://已删除订阅源和历史记录'; }, Juconfig, cfgfile) } }, Juconfig, cfgfile):'toast://请先订阅聚影资源码', col_type: "text_2" }); /* d.push({ col_type: "line_blank" }); */ d.push({ col_type: "line" }); d.push({ title: '⚙ 个性设置', col_type: "rich_text" }); d.push({ title: getItem('JYdatasource', 'sougou')=="sougou"?'主页数据调用:搜狗':'主页数据调用:360', url: $('#noLoading#').lazyRule(() => { if(getItem('JYdatasource', 'sougou')=="sougou"){ setItem('JYdatasource', '360'); var sm = "聚影主页数据源切换为360"; }else{ setItem('JYdatasource', 'sougou'); var sm = "聚影主页数据源切换为sougou"; } clearMyVar('SrcJuying$listTab'); clearMyVar('SrcJuying$类型'); clearMyVar('SrcJuying$地区'); clearMyVar('SrcJuying$年代'); clearMyVar('SrcJuying$资源'); clearMyVar('SrcJuying$明星'); clearMyVar('SrcJuying$排序'); refreshPage(false); return 'toast://' + sm + ',返回主页后刷新生效'; }), col_type: "text_center_1" }); d.push({ title: Juconfig['erjimode']!=2?'当前二级模式:常规':'当前二级模式:搜索', desc: Juconfig['erjimode']!=2?'一级选片点击先用进二级,再扩展更多片源':'一级选片点击调用接口搜索扩展更多片源', url: $('#noLoading#').lazyRule((Juconfig,cfgfile) => { if(Juconfig['erjimode'] == 2){ Juconfig['erjimode'] = 1; var sm = "从一级先进二级常规模式"; }else{ Juconfig['erjimode'] = 2; var sm = "从一级直接调接口到搜索模式"; } writeFile(cfgfile, JSON.stringify(Juconfig)); refreshPage(false); return 'toast://切换为:' + sm + ',返回主页后刷新生效'; }, Juconfig, cfgfile), col_type: "text_center_1" }); d.push({ title: '搜索分组', url: $(Juconfig['xunmigroup']?Juconfig['xunmigroup']:"全部","设置搜索时默认分组").input((Juconfig,cfgfile) => { Juconfig['xunmigroup'] = input; writeFile(cfgfile, JSON.stringify(Juconfig)); refreshPage(false); return 'toast://默认搜索分组'+(input?'已设置为:'+input:'已清空'); }, Juconfig, cfgfile), col_type: "text_3" }); d.push({ title: '搜索线程', url: $(Juconfig['xunminum']?Juconfig['xunminum']:"10","每次搜索成功停止线程数").input((Juconfig,cfgfile) => { if(!parseInt(input)||parseInt(input)<1||parseInt(input)>100){return 'toast://输入有误,请输入1-100数字'}else{ Juconfig['xunminum'] = parseInt(input); writeFile(cfgfile, JSON.stringify(Juconfig)); refreshPage(false); return 'toast://每次搜索成功线程数已设置为:'+input; } }, Juconfig, cfgfile), col_type: "text_3" }); d.push({ title: '搜索时长', url: $(Juconfig['xunmitimeout']?Juconfig['xunmitimeout']:"5","设置接口搜索超时时长(秒)").input((Juconfig,cfgfile) => { if(!parseInt(input)||parseInt(input)<1||parseInt(input)>10){return 'toast://输入有误,请输入1-10数字'}else{ Juconfig['xunmitimeout'] = parseInt(input); writeFile(cfgfile, JSON.stringify(Juconfig)); refreshPage(false); return 'toast://接口搜索超时时长已设置为:'+input+'秒'; } }, Juconfig, cfgfile), col_type: "text_3" }); d.push({ title: '失败次数', url: $(Juconfig['failnum']?Juconfig['failnum']:"10","搜索无法访问的接口达到多少失败次数,转移到失败待处理分组").input((Juconfig,cfgfile) => { if(!parseInt(input)||parseInt(input)<1||parseInt(input)>100){return 'toast://输入有误,请输入1-100数字'}else{ Juconfig['failnum'] = parseInt(input); writeFile(cfgfile, JSON.stringify(Juconfig)); refreshPage(false); return 'toast://搜索接口无法访问'+input+'次,自动转移到失败待处理分组'; } }, Juconfig, cfgfile), col_type: "text_3" }); d.push({ title: '解析保留', url: $(Juconfig['appjiexinum']?Juconfig['appjiexinum']:"50","控制app自带有效解析保留数量").input((Juconfig,cfgfile) => { if(!parseInt(input)||parseInt(input)<1||parseInt(input)>100){return 'toast://输入有误,请输入1-100数字'}else{ Juconfig['appjiexinum'] = parseInt(input); writeFile(cfgfile, JSON.stringify(Juconfig)); refreshPage(false); return 'toast://app自带有效解析保留数量已设置为:'+input; } }, Juconfig, cfgfile), col_type: "text_3" }); d.push({ col_type: "line" }); d.push({ title: Juconfig['sousuoms']==1?'搜索数据来源:'+(getItem('JYdatasource', 'sougou')=="sougou"?'搜狗':'360'):'搜索数据来源:接口', desc: Juconfig['sousuoms']==1?'视界原生搜索按钮改为调用搜狗搜索影片':'视界原生搜索按钮改为调用接口聚搜影片', url: $('#noLoading#').lazyRule((Juconfig,cfgfile) => { if(Juconfig['sousuoms'] == 1){ Juconfig['sousuoms'] = 2; var sm = "视界原生搜索按钮搜索数据来源:聚搜接口"; }else{ Juconfig['sousuoms'] = 1; var sm = "视界原生搜索按钮搜索数据来源:搜狗数据"; } writeFile(cfgfile, JSON.stringify(Juconfig)); refreshPage(false); return 'toast://' + sm + ',返回主页后刷新生效'; }, Juconfig, cfgfile), col_type: "text_center_1" }); /* d.push({ col_type: "line_blank" }); */ d.push({ col_type: "line" }); d.push({ title: '🎁 其他资源', col_type: "rich_text" }); d.push({ title: '选择需要的功能类型', col_type: "rich_text", extra:{textSize:12} }); d.push({ title: (getMyVar('importtype','0')=="1"?"👉":"")+"TVBox导入", col_type: 'scroll_button', url: $('#noLoading#').lazyRule(() => { putMyVar('importtype','1'); refreshPage(false); return "hiker://empty"; }) }); if(getMyVar('importtype','0')!="0"){ if(getMyVar('importtype','0')!="2"){ d.push({ title: '选择需要的导入项目', col_type: "rich_text", extra:{textSize:12} }); d.push({ title:(getMyVar('importjiekou','0')=="1"?getide(1):getide(0))+'影视接口', col_type:'text_3', url:$('#noLoading#').lazyRule(() => { if(getMyVar('importjiekou')=="1"){ putMyVar('importjiekou','0'); }else{ putMyVar('importjiekou','1'); } refreshPage(false); return "hiker://empty"; }) }); d.push({ title:(getMyVar('importjiexi','0')=="1"?getide(1):getide(0))+'解析接口', col_type:'text_3', url:$('#noLoading#').lazyRule(() => { if(getMyVar('importjiexi')=="1"){ putMyVar('importjiexi','0'); }else{ putMyVar('importjiexi','1'); } refreshPage(false); return "hiker://empty"; }) }); d.push({ title:(getMyVar('importlive','0')=="1"?getide(1):getide(0))+'直播接口', col_type:'text_3', url:$('#noLoading#').lazyRule(() => { if(getMyVar('importlive')=="1"){ putMyVar('importlive','0'); }else{ putMyVar('importlive','1'); } refreshPage(false); return "hiker://empty"; }) }); } d.push({ title:'本地', col_type: 'input', desc: '请输入链接地址', extra: { titleVisible: false, defaultValue: getMyVar('importinput', ''), onChange: 'putMyVar("importinput",input)' } }); d.push({ title: '🆖 历史记录', url: $('hiker://empty#noRecordHistory##noHistory#').rule(() => { addListener("onClose", $.toString(() => { refreshPage(false); })); setPageTitle("🆖资源导入-历史记录"); let cfgfile = "hiker://files/rules/Src/Juying2/config.json"; let Juyingcfg=fetch(cfgfile); if(Juyingcfg != ""){ eval("var Juconfig=" + Juyingcfg+ ";"); }else{ var Juconfig= {}; } var d = []; let importrecord = Juconfig['importrecord']||[]; let lists = importrecord.filter(item => { return item.type==getMyVar('importtype','0'); }) if(lists.length>0){ d.push({ title: '点击下方的历史条目,进行操作👇', col_type: "rich_text" }); d.push({ col_type: "line" }); lists.reverse(); for(let i=0;i{ if(input=="选择"){ putMyVar('importinput', url); back(true); }else if(input=="删除"){ let importrecord = Juconfig['importrecord']||[]; for(let i=0;i { if(getMyVar('importinput', '')==""&&getMyVar('importtype','0')!="2"){ return 'toast://请先输入链接地址' } let input = getMyVar('importinput', ''); if(input){ let importrecord = Juconfig['importrecord']||[]; if(!importrecord.some(item => item.url==input && item.type==getMyVar('importtype','0'))){ importrecord.push({type:getMyVar('importtype','0'),url:input}); Juconfig['importrecord'] = importrecord; writeFile(cfgfile, JSON.stringify(Juconfig)); } } require(config.依赖.match(/http(s)?:\/\/.*\//)[0] + 'SrcJySet.js'); return Resourceimport(input,getMyVar('importtype','0')); }, Juconfig, cfgfile), col_type: "text_2" }); } /* d.push({ col_type: "line_blank" }); */ d.push({ col_type: "line" }); d.push({ title: '💝 关于聚影', desc: '这是一个空壳小程序,仅用于个人学习研究!', col_type: 'text_1', url: 'toast://哥就是帅', extra:{ lineVisible:false, longClick: [{ title: "📑更新日志", js: $.toString(() => { return $('hiker://empty#noRecordHistory##noHistory#').rule(() => { setPageTitle("💝 关于聚影"); var d = []; try{ eval(fetchCache(config.依赖.match(/http(s)?:\/\/.*\//)[0] + 'SrcTmplVersion.js', 1, { timeout:2000 })) var SrcJuyingdesc = newVersion.SrcJuyingdesc; }catch(e){ } if(SrcJuyingdesc){ d.push({ title: '📑 更新日志', col_type: "rich_text" }); d.push({ col_type: "line" }); var updatedesc = []; for(let key in SrcJuyingdesc){ updatedesc.push('版本V'+key+(parseFloat(key) > parseFloat(getMyVar('SrcJuying-Version','').replace('-V',''))?"(内测)":"")+':'+SrcJuyingdesc[key]); } d.push({ title: updatedesc.reverse().slice(0,3).join('
'), col_type: "rich_text" }); } setHomeResult(d); }) }) }] } }); d.push({ title: '
', col_type: 'rich_text' }); setHomeResult(d); } //资源导入 function Resourceimport(input,importtype){ if(importtype=="1"){//tvbox导入 try{ showLoading('检测文件有效性'); if(/\/storage\/emulated\//.test(input)){input = "file://" + input} var html = request(input,{timeout:2000}); var reg = /("([^\\\"]*(\\.)?)*")|('([^\\\']*(\\.)?)*')|(\/{2,}.*?(\r|\n|$))|(\/\*(\n|.)*?\*\/)/g; html = html.replace(/api\"\:csp/g,'api":"csp').replace(reg, function(word) { return /^\/{2,}/.test(word) || /^\/\*/.test(word) ? "" : word; }).replace(/^.*#.*$/gm,"").replace(/\,\,/g,',');//.replace(/=\\n\"/g,'="')|[\t\r\n].replace(/\s+/g, "").replace(/<\/?.+?>/g,"").replace(/[\r\n]/g, "") //log(html); eval('var data = ' + html) //var data = JSON.parse(html); var jiekou = data.sites||[]; var jiexi = data.parses||[]; } catch (e) { hideLoading(); log('TVBox文件检测失败>'+e.message); return "toast://TVBox导入失败:链接文件无效或内容有错"; } hideLoading(); var jknum = -1; var jxnum = -1; var livenum = -1; var livesm = ""; if((getMyVar('importjiekou','')=="1")&&jiekou.length>0){ showLoading('正在多线程抓取数据中'); var urls= []; //多线程处理 var task = function(obj) { let arr; if(/^csp_AppYs/.test(obj.api)){ arr = { "name": obj.name, "url": obj.ext, "type": getapitype(obj.ext)}; }else if((obj.type==1||obj.type==0)&&obj.api.indexOf('cms.nokia.press')==-1){ arr = { "name": obj.name, "url": obj.api, "type": "cms", "categories": obj.categories}; }else{ let extfile = obj.ext; if($.type(extfile)=='string'){ if(/^clan:/.test(extfile)){ extfile = extfile.replace("clan://TVBox/", input.match(/file.*\//)[0]); }else if(/^./.test(extfile)){ extfile = input.match(/http(s)?:\/\/.*\//)[0]+extfile.replace("./",""); } } if(/^csp_XBiubiu/.test(obj.api)){ arr = { "name": obj.name, "type": "biubiu", "ext": extfile}; }else if(/^csp_XPath/.test(obj.api)){ arr = { "name": obj.name, "type": "xpath", "ext": extfile}; }else if(obj.api=="csp_XBPQ"){ arr = { "name": obj.name, "type": "XBPQ", "ext": extfile}; }else if(/drpy2/.test(obj.api)){ arr = { "name": obj.name, "type": "drpy", "ext": extfile}; }else if(/^csp_XYQHiker/.test(obj.api)){ arr = { "name": obj.name, "type": "XYQ", "ext": extfile}; } if(arr){ let urlfile; if($.type(extfile)=='object'){ urlfile = arr.type + '_' + arr.name; writeFile(urlfile, content); }else if(/^file/.test(extfile)){ urlfile = 'hiker://files/' + extfile.split('/files/Documents/')[1]; }else if(/^http/.test(extfile)){ try{ let content = fetch(extfile, {timeout:2000}); if (content == '') { urlfile = ''; }else{ urlfile = 'hiker://files/cache/src/Juying2/libs/' + arr.type + '_' + extfile.substr(extfile.lastIndexOf('/') + 1); writeFile(urlfile, content); } }catch(e){ log(obj.name + 'ext文件缓存失败>' + e.message); } } if(urlfile){ arr['url'] = urlfile; } } } if(arr && arr.url){ arr['searchable'] = obj.searchable; arr['filterable'] = obj.filterable; urls.push(arr); } return 1; } let jiekous = jiekou.map((list)=>{ return { func: task, param: list, id: list.key } }); be(jiekous, { func: function(obj, id, error, taskResult) { }, param: { } }); try{ jknum = jiekousave(urls); }catch(e){ jknum =-1; log('TVBox导入接口保存有异常>'+e.message); } hideLoading(); } if((getMyVar('importjiexi','')=="1")&&jiexi.length>0){ try{ let urls = []; for (let i=0;i'+e.message); } } if(getMyVar('importlive','')=="1"){ try{ let urls = []; let lives = data.lives; for (let i=0;i0){ for (let j=0;j0){ livenum = 0; let livecfgfile = "hiker://files/rules/Src/Juying2/liveconfig.json"; let livecfg = fetch(livecfgfile); if(livecfg != ""){ eval("var liveconfig = " + livecfg); }else{ var liveconfig = {}; } let livedata = liveconfig['data']||[]; for(let i=0;i item.url==urls[i])){ let YChtml = request(urls[i],{timeout:5000}).replace(/TV-/g,'TV'); if(YChtml.indexOf('#genre#')>-1){ let id = livedata.length + 1; livedata.push({name:'JY订阅'+id,url:urls[i]}); livenum++; }else{ livesm = "链接无效或非通用tv格式文件"; } }else{ livesm = "已存在"; } } if(livenum>0){ liveconfig['data'] = livedata; writeFile(livecfgfile, JSON.stringify(liveconfig)); } } } catch (e) { log('TVBox导入live保存失败>'+e.message); } } let sm = (jknum>-1?' 接口保存'+jknum:'')+(jxnum>-1?' 解析保存'+jxnum:'')+(livenum>-1?livenum==0?' 直播订阅'+livesm:' 直播保存'+livenum:''); if(jknum>0||jxnum>0){back();} if(jknum==-1&&jxnum==-1&&livenum>-1){ clearMyVar('importinput'); refreshPage(false); } return 'toast://TVBox导入:'+(sm?sm:'导入异常,详情查看日志'); } } //资源分享 function JYshare(lx,input) { if(lx=="jk"){ var filepath = jkfile; var sm = "聚影接口"; }else if(lx=="jx"){ var filepath = jxfile; var sm = "聚影解析"; } var datafile = fetch(filepath); eval("var datalist=" + datafile+ ";"); var sm2 = "聚影分享口令已生成"; let duoselect = storage0.getMyVar('SrcJu_duoselect') || []; if(duoselect.length>0){ var lists = datalist.filter(item => { if(item.url){ return duoselect.indexOf(item.url)>-1; }else{ return duoselect.indexOf(item.parse)>-1; } }) if(lists.length>0){ var datalist = lists; sm2 = "(选定)聚影分享口令已生成"; } } if(input=='云口令文件'){ let sharetxt = base64Encode(JSON.stringify(datalist)); let code = sm + '¥' + aesEncode('Juying', sharetxt) + '¥云口令文件'; let sharefile = 'hiker://files/_cache/Juying_'+datalist.length+'_'+$.dateFormat(new Date(),"HHmmss")+'.hiker'; writeFile(sharefile, '云口令:'+code+`@import=js:$.require("hiker://page/cloudimport?rule=聚影√");`); if(fileExist(sharefile)){ return 'share://'+sharefile; }else{ return 'toast://云口令文件生成失败'; } }else{ showLoading('分享生成中,请稍后...'); let pasteurl = sharePaste(base64Encode(JSON.stringify(datalist)), input); hideLoading(); if(/^http|^云/.test(pasteurl) && pasteurl.includes('/')){ pasteurl = pasteurl.replace('云6oooole', 'https://pasteme.tyrantg.com').replace('云2oooole', 'https://netcut.cn').replace('云5oooole', 'https://cmd.im').replace('云7oooole', 'https://note.ms').replace('云9oooole', 'https://txtpbbd.cn').replace('云10oooole', 'https://hassdtebin.com'); let code = sm+'¥'+aesEncode('Juying', pasteurl)+'¥共' + datalist.length + '条('+input+')'; copy('云口令:'+code+`@import=js:$.require("hiker://page/cloudimport?rule=聚影√");`); return "toast://"+sm2; }else{ return "toast://分享失败,剪粘板或网络异常>"+pasteurl; } } } //资源导入 function JYimport(input) { let cloudimport; if(/^云口令:/.test(input)){ input = input.replace('云口令:','').trim(); cloudimport = 1; } let pasteurl; let inputname; let codelx = "share"; try{ pasteurl = aesDecode('Juying', input.split('¥')[1]); inputname = input.split('¥')[0]; if(inputname=="聚影资源码"){ codelx = "dingyue"; pasteurl = 'https://netcut.cn/p/' + pasteurl; if(getMyVar('guanli')=="jk"){ inputname = "聚影接口"; }else if(getMyVar('guanli')=="jx"){ inputname = "聚影解析"; } } }catch(e){ return "toast://聚影√:口令有误>"+e.message; } try{ if (inputname == "聚影云盘") { let content = parsePaste(pasteurl); let datalist2 = JSON.parse(base64Decode(content)); let num = yundisksave(datalist2); return "toast://合计" + datalist2.length + "个,导入" + num + "个"; } if(inputname=="聚影接口"){ var sm = "聚影√:接口"; }else if(inputname=="聚影解析"){ var sm = "聚影√:解析"; }else{ return "toast://聚影√:无法识别的口令"; } let text; if(/http/.test(pasteurl)){ showLoading('获取数据中,请稍后...'); text = parsePaste(pasteurl); hideLoading(); }else{ text = pasteurl; } if(pasteurl&&!/^error/.test(text)){ let pastedata = JSON.parse(base64Decode(text)); let urlnum = 0; if(inputname=="聚影接口"){ if(codelx=="share"){ var pastedatalist = pastedata; }else if(codelx=="dingyue"){ var pastedatalist = pastedata.jiekou; } urlnum = jiekousave(pastedatalist); }else if(inputname=="聚影解析"){ if(codelx=="share"){ var pastedatalist = pastedata; }else if(codelx=="dingyue"){ var pastedatalist = pastedata.jiexi; } urlnum = jiexisave(pastedatalist); } if(urlnum>0&&cloudimport!=1){ refreshPage(false); } return "toast://"+sm+"合计:"+pastedatalist.length+",保存:"+urlnum; }else{ return "toast://聚影√:口令错误或已失效"; } } catch (e) { return "toast://聚影√:无法识别的口令>"+e.message; } }