let libspath = "hiker://files/data/"+(MY_RULE._title || MY_RULE.title)+"/"; //依赖文件路径 let rulepath = "hiker://files/rules/Src/Juying2/"; //规则文件路径 let cachepath = "hiker://files/_cache/Juying2/"; //缓存文件路径 let jkfilespath = rulepath + "jiekou/"; //接口数据文件路径 let jkfile = rulepath + "jiekou.json"; let jxfile = rulepath + "jiexi.json"; let ypfile = rulepath + "yundisk.json"; let tvfile = rulepath + "live.txt"; let cfgfile = rulepath + "config.json"; let sortfile = rulepath + "jksort.json"; let codepath = config.依赖.replace(/[^/]*$/,''); let gzip = $.require(codepath + "plugins/gzip.js"); let Juconfig= {}; let Jucfg=fetch(cfgfile); if(Jucfg != ""){ eval("Juconfig=" + Jucfg+ ";"); } let timeout = 15000; let homeSource = Juconfig['homeSource'] || {}; let sourceType = homeSource.type; let sourceName = homeSource.name; let sourceGroup = homeSource.group || homeSource.type; let sourceUrl = homeSource.url; function getFile(lx) { let file = lx=='jk'?jkfile:lx=='jx'?jxfile:lx=='yp'?ypfile:''; return file; } //获取所有接口或解析 function getDatas(lx, isyx) { let datalist = []; if(getItem('sourceMode','1')=='1'){ let sourcefile = getFile(lx); let sourcedata = fetch(sourcefile); if(sourcedata != ""){ try{ eval("datalist=" + sourcedata+ ";"); }catch(e){ datalist = []; } } }else if(getItem('sourceMode','1')=='2'){ if(Juconfig['dySource']){ let boxSource = getBoxSource(Juconfig['dySource'], 2, {jk:lx=="jk"?1:0,jx:lx=="jx"?1:0}); if(boxSource.message){ toast(boxSource.message); }else{ datalist = lx=="jk"?boxSource.jklist:boxSource.jxlist; } } } if (lx=="jx") { datalist.sort((a, b) => { let aa = a.sort||0; let bb = b.sort||0; return aa - bb; }) }else if (getItem("sourceListSort") == "接口名称") { datalist = sortByPinyin(datalist); }else if (getItem("sourceListSort") == "使用频率") { let sort = {}; if(fetch(sortfile)){ eval("sort = " + fetch(sortfile)); } datalist.forEach(it=>{ it.sort = sort[it.url] || 0; }) datalist.sort((a, b) => { return b.sort - a.sort }) }else{ datalist.reverse(); } // 禁用的放到最后 let withoutStop = datalist.filter(item => !item.stop); if(isyx){ return withoutStop; } let withStop = datalist.filter(item => item.stop); // 合并数组 let result = withoutStop.concat(withStop); return result; } //临时处理将相关文件转换位置,以后可以删除 if(fileExist(libspath+"libs_jk")){ log("接口数据目录存在旧目录,执行转移"); let datalist = []; let sourcedata = fetch(jkfile); if(sourcedata){ eval("datalist=" + sourcedata + ";"); } datalist.forEach(it=>{ if(it.url.startsWith(libspath)){ let newfile = jkfilespath + it.url.substr(it.url.lastIndexOf('/')+1); writeFile(newfile, fetch(it.url)); it.url = newfile; } }) writeFile(jkfile, JSON.stringify(datalist)); let FileUtil = new com.example.hikerview.utils.FileUtil; FileUtil.deleteDirs(getPath(libspath+"libs_jk/").replace("file://", "")); } // 较验box配置文件 function checkBoxUrl(input) { let html; try{ if(input.startsWith('/')){input = "file://" + input} if(input.startsWith('http')){ let tmpFile = cachepath + md5(input) + ".json"; if(!fileExist(tmpFile)){ showLoading('检测在线文件有效性'); html = getContnet(input); //log(html); if(html){ writeFile(tmpFile, html); } }else{ html = fetch(tmpFile); } }else if(input.startsWith('file')){ html = fetch(input); }else{ html = ""; } if(html.includes('LuUPraez**')){ html = base64Decode(html.split('LuUPraez**')[1]); } eval('let data = ' + html) if(data.urls){ hideLoading(); return {urls: data.urls}; } } catch (e) { hideLoading(); log("box配置文件检测失败>" + e.message + " 错误行#" + e.lineNumber); return { message: "失败:链接文件无效或内容有错" }; } hideLoading(); return {html: html} } // 从box配置文件获取 function getBoxSource(input, mode, imports){ //input配置文件地址,mode模式1为导入,2为订阅,3为较验 let html,data; let checkUrl = checkBoxUrl(input); if(checkUrl.message){ return checkUrl; }else if(checkUrl.urls){ return { message: "失败:此为多仓配置文件" }; }else if(checkUrl.html){ html = checkUrl.html; eval('data = ' + html); }else{ return { message: "异常:为啥会没有获取到html" }; } if(mode==3){//订阅较验完成 Juconfig['dySource'] = input; writeFile(cfgfile, JSON.stringify(Juconfig)); let dyJkTmpFile = cachepath + md5(input) + ".json"; writeFile(dyJkTmpFile, html); back(); return { message: "已订阅,站源改为订阅模式下生效" }; } let result = {}; if(mode==1){ showLoading('正在多线程获取数据中'); } let jiekous = data.sites||[]; if(imports.jk && jiekous.length>0){ let urls= []; //多线程处理 let 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"}; if(obj.categories){ arr["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(extfile.startsWith('./')){ let urlpath = input.substr(0, input.lastIndexOf('/')+1); extfile = extfile.replace("../", urlpath).replace(/\.\//g, urlpath); } } 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(/^csp_XYQHiker/.test(obj.api)){ arr = { "name": obj.name, "type": "XYQ", "ext": extfile}; }else if(/drpy2/.test(obj.api) && obj.type==3 && !obj.ext.includes('drpy.js')){ arr = { "name": obj.name.includes('|')?obj.name.split('|')[1].trim():obj.name, "type": "hipy_t3", "ext": extfile}; if(arr.name.includes('[搜]')){ arr['onlysearch'] = 1; } } if(arr){ let urlfile; let filepath = cachepath + arr.type; if($.type(extfile)=='object'){ urlfile = filepath + '_' + arr.name + '.json'; writeFile(urlfile, JSON.stringify(extfile)); }else if(/^file/.test(extfile)){ if(mode==1){ urlfile = filepath + '_' + (extfile.includes('?')?obj.key:"")+extfile.split('?')[0].substr(extfile.split('?')[0].lastIndexOf('/')+1); writeFile(urlfile, fetch(extfile.split("?")[0])); }else{ urlfile = extfile.split('?')[0]; } }else if(/^http/.test(extfile)){ urlfile = filepath + '_' + (extfile.includes('?')?obj.key:"")+extfile.split('?')[0].substr(extfile.split('?')[0].lastIndexOf('/')+1); if(mode==1){ try{ let content = getContnet(extfile); if (!content) { urlfile = ''; }else{ if(arr.type=="XYQ" && !/分类片单标题/.test(content)){ arr['onlysearch'] = 1; } if(arr.type=="XBPQ"){ if(!/数组/.test(content)){ urlfile = ''; }else if(!/搜索url/.test(content)){ obj.searchable = 0; } } if(urlfile){ writeFile(urlfile, content); } } }catch(e){ log(obj.name + 'ext文件缓存失败>' + e.message); } } } if(urlfile){ arr['url'] = urlfile; } } } if(arr && arr.url){ arr['searchable'] = obj.searchable; return {data: arr}; } return {}; } let jiekoutask = jiekous.map((list)=>{ return { func: task, param: list, id: list.key } }); be(jiekoutask, { func: function(obj, id, error, taskResult) { if(taskResult.data){ urls.push(taskResult.data); } }, param: { } }); result.jklist = urls; } let jiexis = data.parses||[]; if(imports.jx && jiexis.length>0){ let urls = jiexis.filter(it=>{ return /^http/.test(it.url); }) result.jxlist = urls; } hideLoading(); return result; } // 获取接口tags function getJkTags(datas){ datas = datas || getDatas('jk', 1); let tags = []; datas.forEach(it=>{ let str = it.name; let regex = /\[(.*?)\]/; let match = str.match(regex); if (match && match[1].trim()) { let tag = '[' + match[1].trim() + ']'; if(tags.indexOf(tag)==-1){ tags.push(tag); } } }) return tags; } //乱序方法 function shuffleArray(array) { array.sort(() => Math.random() - 0.5); return array; } //获取在线文件内容 function getContnet(url) { if(url.startsWith('file')){ return fetch(url); }else if(!url.startsWith('http')){ return ''; } if(url.startsWith('https://raw.githubusercontent.com')){ let proxys = $.require('ghproxy').getproxy(); shuffleArray(proxys); for(let i=0;i') && !content.startsWith('') && !/502 Bad Gateway/.test(content)) { return content; } } } let headers = { 'User-Agent': MOBILE_UA }; if(!url.endsWith('.json') && !url.endsWith('.js') && !url.endsWith('.txt') && !url.endsWith('.m3u') && !url.endsWith('.m3u8')){ headers['User-Agent'] = 'okhttp/4.12.0'; } return fetch(url, {headers: headers, timeout:20000}); } //获取分组接口列表 function getGroupLists(datas, k) { k = k=="全部"?"":k; datas = datas.filter(it=>{ let group = it.group||it.type; return !k || (k==group); }) return datas; } //获取搜索接口列表 function getSearchLists(group) { //group为true则取指定分组接口,为false时先取优选,没有则取前50 let datalist = getDatas('jk', 1).filter(it=>{ return it.searchable!=0; }); if (getItem("sourceListSort") != "使用频率") { let sort = {}; if(fetch(sortfile)){ eval("sort = " + fetch(sortfile)); } datalist.forEach(it=>{ it.sort = sort[it.url] || 0; }) datalist.sort((a, b) => { return b.sort - a.sort }) } if(group){ return datalist.filter(it=>{ return group==(it.group||it.type); }); }else{ let filter = getItem('主页搜索接口范围', ''); if(filter){ datalist = datalist.filter(it=>{ return filter.includes('[') ? it.name.includes(filter) : filter==(it.group||it.type); }) } return datalist; } } //获取接口分组名arry function getJiekouGroups(datas) { let groupNams = []; datas.forEach(it => { let group = it.group||it.type; if (groupNams.indexOf(group)==-1){ groupNams.push(group); } }) return groupNams; } //删除统一入口 function deleteData(lx, data){ let sourcefile = getFile(lx); let sourcedata = fetch(sourcefile); eval("let datalist=" + sourcedata + ";"); let dellist= []; if(!data){ dellist = Object.assign(dellist, datalist); }else if($.type(data)=='object'){ dellist.push(data); }else if($.type(data)=='array'){ dellist = data; } dellist.forEach(it => { if(lx=='jk' && it.url.includes(jkfilespath)){ deleteFile(it.url); } let index = datalist.indexOf(datalist.filter(d => it.url==d.url )[0]); datalist.splice(index, 1); }) writeFile(sourcefile, JSON.stringify(datalist)); if(lx=='jk'){ clearMyVar('SrcJu_searchMark'); } clearMyVar('SrcJu_duoselect'); } // 接口/解析处理公共方法 function dataHandle(lx, data, input) { let sourcefile = getFile(lx); let sourcedata = fetch(sourcefile); eval("let datalist=" + sourcedata + ";"); let waitlist= []; if($.type(data)=='object'){ waitlist.push(data); }else if($.type(data)=='array'){ waitlist = data; } waitlist.forEach(it => { let index = datalist.findIndex(item => item.url === it.url); if(lx=="jx" && input=="重置排序"){ datalist[index].sort = 0; }else if(input == "禁用"){ datalist[index].stop = 1; }else if(input == "启用"){ delete datalist[index].stop; }else if(lx=="jk" && input == "置顶"){ const [target] = datalist.splice(index, 1); datalist.push(target); } }) writeFile(sourcefile, JSON.stringify(datalist)); if(lx='jk'){ clearMyVar('SrcJu_searchMark'); } clearMyVar('SrcJu_duoselect'); return input + ':已处理' + waitlist.length + '个'; } // 设置接口顺序 function setJkSort(data, k) { let waitlist= []; if($.type(data)=='string'){ waitlist.push(data); }else if($.type(data)=='array'){ waitlist = data; } let sort = {}; if(fetch(sortfile)){ eval("sort = " + fetch(sortfile)); } waitlist.forEach(it=>{ sort[it] = sort[it] || 0; if(k){ sort[it] = sort[it] + 1; }else{ sort[it] = sort[it] - 1; } }) writeFile(sortfile, JSON.stringify(sort)); } // 清理接口排序 function clearJkSort() { let datalist = getDatas("jk"); let sort = {}; if(fetch(sortfile)){ eval("sort = " + fetch(sortfile)); } Object.keys(sort).forEach(it=>{ if(!datalist.some(item => item.url==it)){ delete sort[it]; } }) writeFile(sortfile, JSON.stringify(sort)); } // 读取目录路径下文件输入数组 function readDir(path) { let names = []; let file = new java.io.File(path.replace("file://", "")); if (!(file.exists() && file.isDirectory())) return names; for (let it of file.listFiles()) { names.push(String(it.getName())); } return names; } // 清理接口残留过期文件 function clearJkFiles() { /* let datalist = getDatas("jk"); readDir(jkfilespath) Object.keys(sort).forEach(it=>{ if(!datalist.some(item => item.url==it)){ delete sort[it]; } }) writeFile(sortfile, JSON.stringify(sort)); */ } // 获取接口对应的显示标题 function getDataTitle(data) { if($.type(data.type)=="string"){ return data.name + ' ““””('+data.type+')' + (data.group&&data.group!=data.type?' [' + data.group + ']':'') + ''; }else{ return (data.sort||0) + '-'+data.name + '-' + data.url; } } //接口管理多选方法 function duoselect(datas){ let datalist = []; if($.type(datas)=="array"){ datalist = datalist.concat(datas); }else if($.type(datas)=="object"){ datalist.push(datas); } let duoselect = storage0.getMyVar('SrcJu_duoselect') || []; datalist.forEach(data=>{ if(!duoselect.some(item => data.url==item.url)){ duoselect.push(data); updateItem(data.url, {title: colorTitle(getDataTitle(data),'#3CB371')}); }else{ for(var i = 0; i < duoselect.length; i++) { if(data.url == duoselect[i].url) { duoselect.splice(i, 1); break; } } updateItem(data.url, {title:data.stop?colorTitle(getDataTitle(data),'#f20c00'):getDataTitle(data)}); } }) storage0.putMyVar('SrcJu_duoselect',duoselect); } // 点播主页选择源接口 function selectSource() { const hikerPop = $.require("http://hiker.nokia.press/hikerule/rulelist.json?id=6966"); let sourceAllList = getDatas("jk", 1).filter(x=> !x.onlysearch); let sourceListGroup = Juconfig["sourceListGroup"] || sourceGroup || "全部"; let sourceList = getGroupLists(sourceAllList, sourceListGroup); let tmpList = sourceList; hikerPop.setUseStartActivity(false); function getnames(list) { let index = 0; let names = list.map((v,i) => { let vname = v.name; if(v.url == sourceUrl && v.name==sourceName){ index = i; vname = `‘‘’’`+v.name+``; } return vname; }); return {names:names,index:index}; } let index_names = getnames(sourceList); let index = index_names.index; let names = index_names.names; let spen = 3; let inputBox; let pop = hikerPop.selectBottomRes({ options: names, columns: spen, title: "当前:" + (sourceName||"") + " 合计:" + sourceAllList.length, noAutoDismiss: true, toPosition: index, extraInputBox: (inputBox = new hikerPop.ResExtraInputBox({ hint: "源关键字筛选,右边切换分组", title: sourceListGroup, onChange(s, manage) { putMyVar("sourceListFilter", s); tmpList = sourceList.filter(x => x.name.toLowerCase().includes(s.toLowerCase())); let flist = getnames(tmpList).names; manage.list.length = 0; flist.forEach(x => { manage.list.push(x); }); manage.change(); }, defaultValue: getMyVar("sourceListFilter", ""), click(s, manage) { let groupnames = getJiekouGroups(sourceAllList); let tags = getJkTags(sourceAllList); let selects = ['全部'].concat(groupnames).concat(tags); //inputBox.setHint("提示"); hikerPop.selectCenter({ options: selects, columns: 3, title: "切换源分组/TAG快速筛选", //position: groupnames.indexOf(sourceName), click(s) { if(s.startsWith('[')){ inputBox.setDefaultValue(s); }else{ inputBox.setTitle(s); inputBox.setDefaultValue(""); Juconfig["sourceListGroup"] = s; writeFile(cfgfile, JSON.stringify(Juconfig)); sourceList = getGroupLists(sourceAllList, s); tmpList = sourceList; names = getnames(tmpList).names; manage.list.length = 0; names.forEach(x => { manage.list.push(x); }); manage.change(); } } }); }, titleVisible: true })), longClick(s, i, manage) { }, click(s, i, manage) { pop.dismiss(); let input = s.replace(/[’‘]|<[^>]*>/g, ""); if(tmpList[i].name==input){ Juconfig["homeSource"] = tmpList[i]; writeFile(cfgfile, JSON.stringify(Juconfig)); clearMyVar('SrcJu_dianbo$分类'); clearMyVar('SrcJu_dianbo$fold'); clearMyVar('SrcJu_dianbo$classCache'); clearMyVar('SrcJu_dianbo$flCache'); clearMyVar('点播动态加载loading'); clearMyVar('点播一级jkdata'); let key = tmpList[i].url; setJkSort(key, 1); refreshPage(true); return 'toast://' + '主页源已设置为:' + input; }else{ return 'toast://源列表索引异常' } }, menuClick(manage) { hikerPop.selectCenter({ options: ["改变样式", "列表倒序", getItem("sourceListSort", "更新时间")], columns: 2, title: "请选择", click(s, i) { if (i === 0) { spen = spen == 3 ? 2 : 3; manage.changeColumns(spen); manage.scrollToPosition(index, false); } else if (i === 1) { manage.list.reverse(); manage.change(); manage.scrollToPosition(index, true); } else if (i === 2) { showSelectOptions({ "title": "选择排序方式", "options" : ["更新时间","接口名称","使用频率"], "col": 1, "js": `setItem('sourceListSort', input);'toast://排序方式在下次生效:' + input` }) } } }); } }); return 'hiker://empty'; } // 按拼音排序 function sortByPinyin(arr) { var arrNew = arr.sort((a, b) => a.name.localeCompare(b.name)); for (var m in arrNew) { var mm = /^[\u4e00-\u9fa5]/.test(arrNew[m].name) ? m : '-1'; if (mm > -1) { break; } } for (var n = arrNew.length - 1; n >= 0; n--) { var nn = /^[\u4e00-\u9fa5]/.test(arrNew[n].name) ? n : '-1'; if (nn > -1) { break; } } if (mm > -1) { var arrTmp = arrNew.splice(m, parseInt(n - m) + 1); arrNew = arrNew.concat(arrTmp); } return arrNew } // app类接口类型自动 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 colorTitle(title, Color) { return '““””' + title + ''; } // 选中状态标识 function getide(is) { if(is==1){ return '‘‘’’'; }else{ return '‘‘’’'; } } // 取前三历史记录 function getHistory(i){ let h = []; let ruleTitle = MY_RULE._title || MY_RULE.title; i = i ? i*3 : 0; let items = JSON.parse(fetch('hiker://history')).filter(v=> v.type!="网页浏览" && JSON.parse(v.params).title==ruleTitle); if(i+3 > items.length){ i = 0; clearMyVar('SrcJu_homeHistory'); } items.slice(i, i+3).forEach(item=>{ try{ let extra = JSON.parse(JSON.parse(item.params).params) || {}; extra["cls"] = "historylist"; h.push({ title: item.title, url: item.ruleBaseUrl + '@rule=' + JSON.parse(item.params).find_rule, pic_url: item.picUrl, desc: item.lastClick?"足迹:"+item.lastClick.split('@@')[0]:"足迹:无", col_type: "movie_3", extra: extra }); }catch(e){ log('加载观看记录异常>'+e.message + " 错误行#" + e.lineNumber); } }) return h; } // 获取图标地址 function getIcon(icon, nochange) { if(!icon.includes('.svg')){ return codepath + 'img/' + icon; } let color = getItem('主题颜色',''); return codepath + 'img/' + icon + ((!color||nochange)?'':'?s='+color+'@js=' + $.toString((color) => { let javaImport = new JavaImporter(); javaImport.importPackage(Packages.com.example.hikerview.utils); with(javaImport) { let bytes = FileUtil.toBytes(input); let str = new java.lang.String(bytes, "UTF-8") + ""; str = str.replace(/#feb833|#6dc9ff|#2ec99d|#587bff|#ff7772|#a88efa|#FD9173/gi, color); bytes = new java.lang.String(str).getBytes(); return FileUtil.toInputStream(bytes); } },color)) } // 重定义打印日志 if (getItem('规则日志打印','0') != "1") { log = function () { return; }; } // 下载必要的依赖文件 function downloadFiles() { let 代码仓 = getItem("依赖","").replace(/[^/]*$/,''); if(代码仓){ try{ requireDownload(代码仓 + "img/聚影.png", 'hiker://files/cache/src/聚影.png'); }catch(e){} } } // 分源资源码 function shareResource() { addListener("onClose", $.toString(() => { clearMyVar('Juconfig'); })); let d = []; d.push({ title: '🌐 聚影分享', col_type: "rich_text" }); let resources = Juconfig['shareResource'] || []; storage0.putMyVar('Juconfig', Juconfig); d.push({ title: '申请分享资源码,当前共有'+resources.length+'个', desc: '感谢TyrantGenesis大佬提供的云6剪贴板', url: resources.length>=3?"分享资源码不能超过3个":$().lazyRule((cfgfile) => { try{ let pastecreate = JSON.parse(request('https://pasteme.tyrantg.com/api/create', { body: 'content=juying&password=juying', method: 'POST' })); if(pastecreate.result_code=="SUCCESS"){ let data = pastecreate.data; return $("", "申请成功,输入名称保存").input((path,token,cfgfile)=>{ input = input.trim(); if(input){ let Juconfig = storage0.getMyVar('Juconfig'); let resources = Juconfig['shareResource'] || []; resources.push({ name: input, path: path, token: token }) Juconfig['shareResource'] = resources; writeFile(cfgfile, JSON.stringify(Juconfig)); refreshPage(false); return 'toast://申请成功'; }else{ return "toast://不能为空"; } }, data.path, data.auth_code, cfgfile) }else{ return 'toast://申请失败:'+pastecreate.message; } } catch (e) { log('申请失败:'+e.message); return 'toast://申请失败,请重新再试'; } }, cfgfile), col_type: "text_center_1" }); resources.forEach(it=>{ d.push({ title: it.name + "-" + it.path, desc: "最后上传同步时间:" + (it.time||""), url: $(["复制","删除","改名","上传"], 2, "选择操作功能项").select((it,cfgfile)=>{ let Juconfig = storage0.getMyVar('Juconfig'); let codeid = aesEncode('Juying2', it.path); if(input=="复制"){ copy('资源码¥'+codeid+'¥聚影'); return "hiker://empty"; }else if(input=="删除"){ return $("确定要删除云端分享:"+it.name+"\n删除后无法找回").confirm((Juconfig,it,cfgfile)=>{ try{ let pastecreate = JSON.parse(request('https://pasteme.tyrantg.com/api/update', { body: 'content=juying&path='+it.path+'@juying'+'&auth_code='+it.token, method: 'POST' })); if(pastecreate.result_code=="SUCCESS"){ let resources = Juconfig['shareResource'] || []; const index = resources.findIndex(item => item.path === it.path); if (index !== -1) { resources.splice(index, 1); } Juconfig['shareResource'] = resources; writeFile(cfgfile, JSON.stringify(Juconfig)); }else{ return 'toast://'+pastecreate.message; } refreshPage(false); return 'toast://删除成功'; } catch (e) { log('删除失败:'+e.message); return 'toast://删除失败,请重新再试'; } }, Juconfig, cfgfile) }else if(input=="改名"){ return $(it.name, "输入新名称").input((Juconfig,path,cfgfile)=>{ input = input.trim(); if(input){ let resources = Juconfig['shareResource'] || []; const index = resources.findIndex(item => item.path === path); if (index !== -1) { resources[index].name = input; } Juconfig['shareResource'] = resources; writeFile(cfgfile, JSON.stringify(Juconfig)); refreshPage(false); } return "hiker://empty"; },Juconfig,it.path,cfgfile) }else if(input=="上传"){ const hikerPop = $.require("http://hiker.nokia.press/hikerule/rulelist.json?id=6966"); let fruit = ["接口", "解析", "云盘", "直播"]; let checkedName = []; hikerPop.multiChoice({ title: "选择要上传分享同步的项", options: fruit, checkedIndexs: [0], onChoice(i, isChecked) { //log(i + ":" + isChecked); }, rightTitle: "确认上传", rightClick(options, checked) { if(options.filter((v, i) => checked[i]).length==0){ return "toast://没有选择上传项"; } let text = {}; options.forEach((option,i)=>{ if(checked[i]){ let filepath; if(option=="接口"){ filepath = globalMap0.getVar('Jy_gmParams').jkfile; }else if(option=="解析"){ filepath = globalMap0.getVar('Jy_gmParams').jxfile; }else if(option=="云盘"){ filepath = globalMap0.getVar('Jy_gmParams').ypfile; }else if(option=="直播"){ filepath = globalMap0.getVar('Jy_gmParams').rulepath + "liveconfig.json"; } let datafile = fetch(filepath); let datalist = []; if(datafile){ if(option=="直播"){ eval("let tvconfig=" + datafile+ ";"); text[option] = tvconfig; }else{ eval("datalist=" + datafile+ ";"); text[option] = datalist; } } } }) let textcontent = globalMap0.getVar('Jy_gmParams').zip(JSON.stringify(text)); try{ let pasteupdate = JSON.parse(request('https://pasteme.tyrantg.com/api/update', { body: 'content='+textcontent+'&path='+it.path+'@juying'+'&auth_code='+it.token, method: 'POST' })); if(pasteupdate.result_code=="SUCCESS"){ let resources = Juconfig['shareResource'] || []; const index = resources.findIndex(item => item.path === it.path); if (index !== -1) { resources[index].time = $.dateFormat(new Date(), "yyyy-MM-dd HH:mm:ss"); } Juconfig['shareResource'] = resources; writeFile(cfgfile, JSON.stringify(Juconfig)); refreshPage(false); return "toast://分享同步云端数据成功"; }else{ return 'toast://分享同步失败,'+pasteupdate.message; } } catch (e) { log('分享失败:'+e.message); return 'toast://分享同步失败,请重新再试'; } }, centerTitle: "取消" }); return "hiker://empty"; } }, it, cfgfile), col_type: "text_1" }); }) d.push({ col_type: "line" }); setResult(d); } /* 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('Juying2', 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('Juying2', codeid)); if(codeid&&!/^error/.test(text)){ let pastedata = JSON.parse(base64Decode(text)); require(config.依赖.replace(/[^/]*$/,'') + 'SrcJySet.js'); let jknum = 0; let jxnum = 0; let ypnum = 0; let jkdatalist = pastedata.jiekou||[]; if(jkdatalist.length>0){ jknum = jiekousave(jkdatalist, codedytype||1); } let jxdatalist = pastedata.jiexi||[]; if(jxdatalist.length>0){ jxnum = jiexisave(jxdatalist, codedytype||1); } if(pastedata.live){ let livefilepath = globalMap0.getVar('Jy_gmParams').datapath + "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" }); */ // 全局对象变量gmParams let gmParams = { libspath: libspath, rulepath: rulepath, codepath: codepath, jkfilespath: jkfilespath, jkfile: jkfile, jxfile: jxfile, cfgfile: cfgfile, getIcon: getIcon, getContnet: getContnet, zip: gzip.zip, unzip: gzip.unzip } if(!globalMap0.getVar('Jy_gmParams')){ log("写入全局对象变量gmParams"); globalMap0.putVar('Jy_gmParams', gmParams); log("当前依赖库>" + config.依赖); }