Sync all projects

This commit is contained in:
github-actions[bot]
2026-06-29 03:41:14 +00:00
parent 529cd7c625
commit 8b025e0766
11717 changed files with 6370622 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
import{_}from"assets://js/lib/cat.js";import{findBestLCS}from"./lib/similarity.js";const http=async function(url,options={}){"POST"==options.method&&options.data&&(options.body=JSON.stringify(options.data),options.headers=Object.assign({"content-type":"application/json"},options.headers));const res=await req(url,options);return res.json=()=>res.content?JSON.parse(res.content):null,res.text=()=>res.content,res},__drives=(["get","post"].forEach(method=>{http[method]=function(url,options={}){return http(url,Object.assign(options,{method:method.toUpperCase()}))}}),{}),__subtitle_cache={};async function get_drives_path(tid){var index=tid.indexOf("/",1),name=tid.substring(1,index),tid=tid.substring(index);return{drives:await get_drives(name),path:tid}}async function get_drives(name){var{settings,api,server}=__drives[name];return null==settings.v3&&(settings.v3=!1,server=(await http.get(server+"/api/public/settings")).json().data,_.isArray(server)?(settings.title=server.find(x=>"title"==x.key)?.value,settings.v3=!1,settings.version=server.find(x=>"version"==x.key)?.value,settings.enableSearch="true"==server.find(x=>"enable search"==x.key)?.value):(settings.title=server.title,settings.v3=!0,settings.version=server.version,settings.enableSearch=!1),api.path=settings.v3?"/api/fs/list":"/api/public/path",api.file=settings.v3?"/api/fs/get":"/api/public/path",api.search=(settings.v3,"/api/public/search"),api.other=settings.v3?"/api/fs/other":null),__drives[name]}let siteKey="",siteType=0;function init(cfg){siteKey=cfg.skey,siteType=cfg.stype,cfg.ext.forEach(item=>__drives[item.name]={name:item.name,server:item.server.endsWith("/")?item.server.substring(0,item.server.length-1):item.server,startPage:item.startPage||"/",showAll:!0===item.showAll,params:item.params||{},_path_param:item.params?_.sortBy(Object.keys(item.params),function(x){return-x.length}):[],settings:{},api:{},getParams(path){var key=this._path_param.find(x=>path.startsWith(x));return Object.assign({},this.params[key],{path:path})},async getPath(path){path=(await http.post(this.server+this.api.path,{data:this.getParams(path)})).json();return this.settings.v3?path.data.content:path.data.files},async getFile(path){path=(await http.post(this.server+this.api.file,{data:this.getParams(path)})).json(),path=this.settings.v3?path.data:path.data.files[0];return this.settings.v3||(path.raw_url=path.url),path},async getOther(method,path){path=this.getParams(path),path.method=method,method=(await http.post(this.server+this.api.other,{data:path})).json();return method},isFolder(data){return 1==data.type},isVideo(data){return this.settings.v3?2==data.type:3==data.type},isSubtitle(data){return 1!=data.type&&[".srt",".ass",".scc",".stl",".ttml"].some(x=>data.name.endsWith(x))},getType(data){var isVideo=this.isVideo(data);return this.isFolder(data)?0:isVideo?10:1},getPic(data){return(this.settings.v3?data.thumb:data.thumbnail)||(this.isFolder(data)?"http://img1.3png.com/281e284a670865a71d91515866552b5f172b.png":"")},getSize(data){let sz=data.size||0;if(sz<=0)return"";let filesize="";return filesize=1099511627776<sz?(sz/=1099511627776,"TB"):1073741824<sz?(sz/=1073741824,"GB"):1048576<sz?(sz/=1048576,"MB"):(sz/=1024,"KB"),sz.toFixed(2)+filesize},getRemark(data){return""}})}async function dir(dir,pg){for(const k in __subtitle_cache)delete __subtitle_cache[k];if(pg=pg||1,"/"===dir||""===dir)return result=_.map(__drives,function(d){return{name:d.name,path:"/"+d.name+d.startPage,type:0,thumb:""}}),JSON.stringify({parent:"",page:pg,pagecount:pg,list:result});let{drives,path}=await get_drives_path(dir);const id=dir.endsWith("/")?dir:dir+"/";var result=await drives.getPath(path);let subtList=[],videos=[],allList=[];return result.forEach(item=>{drives.isSubtitle(item)&&subtList.push(item.name);var isVideo=drives.isVideo(item);(drives.showAll||drives.isFolder(item)||isVideo)&&(isVideo={name:item.name.replaceAll("$","_").replaceAll("#","_"),path:id+item.name+(drives.isFolder(item)?"/":""),thumb:drives.getPic(item),type:drives.getType(item),size:drives.getSize(item),remark:drives.getRemark(item)},drives.isVideo(item)&&videos.push(isVideo),allList.push(isVideo))}),0<subtList.length&&videos.forEach(item=>{var sbust=findBestLCS(item.name,subtList);sbust.bestMatch&&(__subtitle_cache[item.path]=[id+sbust.bestMatch.target])}),JSON.stringify({parent:id,page:pg,pagecount:pg,list:allList})}async function file(file){var{drives,path}=await get_drives_path(file),item=await drives.getFile(path),subs=[];if(__subtitle_cache[file])for(const sub of __subtitle_cache[file])try{var subP=await get_drives_path(sub),subItem=await drives.getFile(subP.path);subs.push(subItem.raw_url)}catch(error){}if("AliyundriveShare2Open"===item.provider&&drives.api.other){var urls=["原画",item.raw_url];try{for(const live of(await drives.getOther("video_preview",path)).data.video_preview_play_info.live_transcoding_task_list)"finished"===live.status&&(urls.push(live.template_id),urls.push(live.url))}catch(error){}file={name:item.name,url:urls,size:drives.getSize(item),remark:drives.getRemark(item),header:{},extra:{subt:subs}};return JSON.stringify(file)}if("123Pan"===item.provider){let url=item.raw_url;try{url=(await http.get(url)).json().data.redirect_url}catch(error){}const result={name:item.name,url:url,size:drives.getSize(item),remark:drives.getRemark(item),header:{},extra:{subt:subs}};return JSON.stringify(result)}{const result={name:item.name,url:item.raw_url,size:drives.getSize(item),remark:drives.getRemark(item),header:{},extra:{subt:subs}};return JSON.stringify(result)}}function search(wd){return JSON.stringify({list:[]})}function __jsEvalReturn(){return{init:init,dir:dir,file:file,search:search}}export{__jsEvalReturn};
+1
View File
@@ -0,0 +1 @@
import{Crypto,load,_,jinja2}from"assets://js/lib/cat.js";let key="duboku",url="https://www.duboku.tv",siteKey="",siteType=0;const UA="Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1";async function request(reqUrl,agentSp){return(await req(reqUrl,{method:"get",headers:{"User-Agent":agentSp||UA,Referer:url}})).content}async function init(cfg){siteKey=cfg.skey,siteType=cfg.stype}async function home(filter){var html=await request(url),html=load(html)("ul.nav-list > li > a[href*=vodtype]"),html=_.map(html,cls=>{let typeId=cls.attribs.href;return{type_id:typeId=typeId.substring(typeId.lastIndexOf("/")+1).replace(".html",""),type_name:cls.children[0].data}});return JSON.stringify({class:html,filters:{2:[{key:"cateId",name:"类型",value:[{n:"全部",v:"2"},{n:"陆剧",v:"13"},{n:"日韩剧",v:"15"},{n:"短剧",v:"21"},{n:"台泰剧",v:"14"},{n:"港剧",v:"20"}]},{key:"class",name:"剧情",value:[{n:"全部",v:""},{n:"悬疑",v:"悬疑"},{n:"武侠",v:"武侠"},{n:"科幻",v:"科幻"},{n:"都市",v:"都市"},{n:"爱情",v:"爱情"},{n:"古装",v:"古装"},{n:"战争",v:"战争"},{n:"青春",v:"青春"},{n:"偶像",v:"偶像"},{n:"喜剧",v:"喜剧"},{n:"家庭",v:"家庭"},{n:"犯罪",v:"犯罪"},{n:"奇幻",v:"奇幻"},{n:"剧情",v:"剧情"},{n:"乡村",v:"乡村"},{n:"年代",v:"年代"},{n:"警匪",v:"警匪"},{n:"谍战",v:"谍战"},{n:"冒险",v:"冒险"},{n:"罪案",v:"罪案"},{n:"宫廷",v:"宫廷"},{n:"BL",v:"BL"}]},{key:"area",name:"地区",value:[{n:"全部",v:""},{n:"内地",v:"内地"},{n:"韩国",v:"韩国"},{n:"香港",v:"香港"},{n:"台湾",v:"台湾"},{n:"美国",v:"美国"},{n:"英国",v:"英国"},{n:"巴西",v:"巴西"},{n:"泰国",v:"泰国"},{n:"法国",v:"法国"},{n:"日本",v:"日本"},{n:"荷兰",v:"荷兰"}]},{key:"year",name:"年份",value:[{n:"全部",v:""},{n:"2023",v:"2023"},{n:"2022",v:"2022"},{n:"2021",v:"2021"},{n:"2020",v:"2020"},{n:"2019",v:"2019"},{n:"2018",v:"2018"},{n:"2017",v:"2017"}]},{key:"lang",name:"语言",value:[{n:"全部",v:""},{n:"国语",v:"国语"},{n:"英语",v:"英语"},{n:"粤语",v:"粤语"},{n:"韩语",v:"韩语"},{n:"泰语",v:"泰语"},{n:"法语",v:"法语"},{n:"日语",v:"日语"}]},{key:"letter",name:"字母",value:[{n:"全部",v:""},{n:"A",v:"A"},{n:"B",v:"B"},{n:"C",v:"C"},{n:"D",v:"D"},{n:"E",v:"E"},{n:"F",v:"F"},{n:"G",v:"G"},{n:"H",v:"H"},{n:"I",v:"I"},{n:"J",v:"J"},{n:"K",v:"K"},{n:"L",v:"L"},{n:"M",v:"M"},{n:"N",v:"N"},{n:"O",v:"O"},{n:"P",v:"P"},{n:"Q",v:"Q"},{n:"R",v:"R"},{n:"S",v:"S"},{n:"T",v:"T"},{n:"U",v:"U"},{n:"V",v:"V"},{n:"W",v:"W"},{n:"X",v:"X"},{n:"Y",v:"Y"},{n:"Z",v:"Z"}]},{key:"by",name:"排序",value:[{n:"时间",v:"time"},{n:"人气",v:"hits"},{n:"评分",v:"score"}]}],3:[{key:"class",name:"剧情",value:[{n:"全部",v:""},{n:"真人秀",v:"真人秀"},{n:"选秀",v:"选秀"},{n:"竞演",v:"竞演"},{n:"情感",v:"情感"},{n:"访谈",v:"访谈"},{n:"播报",v:"播报"},{n:"旅游",v:"旅游"},{n:"音乐",v:"音乐"},{n:"美食",v:"美食"},{n:"纪实",v:"纪实"},{n:"曲艺",v:"曲艺"},{n:"生活",v:"生活"},{n:"游戏互动",v:"游戏互动"}]},{key:"area",name:"地区",value:[{n:"全部",v:""},{n:"内地",v:"内地"},{n:"香港",v:"香港"},{n:"台湾",v:"台湾"},{n:"韩国",v:"韩国"},{n:"美国",v:"美国"}]},{key:"year",name:"年份",value:[{n:"全部",v:""},{n:"2023",v:"2023"},{n:"2022",v:"2022"},{n:"2021",v:"2021"},{n:"2020",v:"2020"},{n:"2019",v:"2019"}]},{key:"lang",name:"语言",value:[{n:"全部",v:""},{n:"国语",v:"国语"},{n:"英语",v:"英语"},{n:"粤语",v:"粤语"},{n:"闽南语",v:"闽南语"},{n:"韩语",v:"韩语"},{n:"日语",v:"日语"},{n:"其它",v:"其它"}]},{key:"letter",name:"字母",value:[{n:"全部",v:""},{n:"A",v:"A"},{n:"B",v:"B"},{n:"C",v:"C"},{n:"D",v:"D"},{n:"E",v:"E"},{n:"F",v:"F"},{n:"G",v:"G"},{n:"H",v:"H"},{n:"I",v:"I"},{n:"J",v:"J"},{n:"K",v:"K"},{n:"L",v:"L"},{n:"M",v:"M"},{n:"N",v:"N"},{n:"O",v:"O"},{n:"P",v:"P"},{n:"Q",v:"Q"},{n:"R",v:"R"},{n:"S",v:"S"},{n:"T",v:"T"},{n:"U",v:"U"},{n:"V",v:"V"},{n:"W",v:"W"},{n:"X",v:"X"},{n:"Y",v:"Y"},{n:"Z",v:"Z"}]},{key:"by",name:"排序",value:[{n:"时间",v:"time"},{n:"人气",v:"hits"},{n:"评分",v:"score"}]}],4:[{key:"class",name:"剧情",value:[{n:"全部",v:""},{n:"玄幻",v:"玄幻"},{n:"武侠",v:"武侠"},{n:"情感",v:"情感"},{n:"科幻",v:"科幻"},{n:"热血",v:"热血"},{n:"推理",v:"推理"},{n:"搞笑",v:"搞笑"},{n:"冒险",v:"冒险"},{n:"萝莉",v:"萝莉"},{n:"校园",v:"校园"},{n:"动作",v:"动作"},{n:"机战",v:"机战"},{n:"运动",v:"运动"},{n:"战争",v:"战争"},{n:"少年",v:"少年"},{n:"少女",v:"少女"},{n:"社会",v:"社会"},{n:"亲子",v:"亲子"},{n:"益智",v:"益智"},{n:"励志",v:"励志"},{n:"其他",v:"其他"}]},{key:"area",name:"地区",value:[{n:"全部",v:""},{n:"国产",v:"国产"},{n:"日本",v:"日本"},{n:"美国",v:"美国"},{n:"法国",v:"法国"},{n:"其他",v:"其他"}]},{key:"year",name:"年份",value:[{n:"全部",v:""},{n:"2023",v:"2023"},{n:"2022",v:"2022"},{n:"2021",v:"2021"},{n:"2020",v:"2020"},{n:"2019",v:"2019"},{n:"2018",v:"2018"},{n:"2017",v:"2017"}]},{key:"lang",name:"语言",value:[{n:"全部",v:""},{n:"国语",v:"国语"},{n:"英语",v:"英语"},{n:"粤语",v:"粤语"},{n:"闽南语",v:"闽南语"},{n:"韩语",v:"韩语"},{n:"日语",v:"日语"},{n:"其它",v:"其它"}]},{key:"letter",name:"字母",value:[{n:"全部",v:""},{n:"A",v:"A"},{n:"B",v:"B"},{n:"C",v:"C"},{n:"D",v:"D"},{n:"E",v:"E"},{n:"F",v:"F"},{n:"G",v:"G"},{n:"H",v:"H"},{n:"I",v:"I"},{n:"J",v:"J"},{n:"K",v:"K"},{n:"L",v:"L"},{n:"M",v:"M"},{n:"N",v:"N"},{n:"O",v:"O"},{n:"P",v:"P"},{n:"Q",v:"Q"},{n:"R",v:"R"},{n:"S",v:"S"},{n:"T",v:"T"},{n:"U",v:"U"},{n:"V",v:"V"},{n:"W",v:"W"},{n:"X",v:"X"},{n:"Y",v:"Y"},{n:"Z",v:"Z"}]},{key:"by",name:"排序",value:[{n:"时间",v:"time"},{n:"人气",v:"hits"},{n:"评分",v:"score"}]}],13:[{key:"class",name:"剧情",value:[{n:"全部",v:""},{n:"悬疑",v:"悬疑"},{n:"武侠",v:"武侠"},{n:"科幻",v:"科幻"},{n:"都市",v:"都市"},{n:"爱情",v:"爱情"},{n:"古装",v:"古装"},{n:"战争",v:"战争"},{n:"青春",v:"青春"},{n:"偶像",v:"偶像"},{n:"喜剧",v:"喜剧"},{n:"家庭",v:"家庭"},{n:"犯罪",v:"犯罪"},{n:"奇幻",v:"奇幻"},{n:"剧情",v:"剧情"},{n:"乡村",v:"乡村"},{n:"年代",v:"年代"},{n:"警匪",v:"警匪"},{n:"谍战",v:"谍战"},{n:"冒险",v:"冒险"},{n:"罪案",v:"罪案"},{n:"宫廷",v:"宫廷"},{n:"BL",v:"BL"}]},{key:"year",name:"年份",value:[{n:"全部",v:""},{n:"2023",v:"2023"},{n:"2022",v:"2022"},{n:"2021",v:"2021"},{n:"2020",v:"2020"},{n:"2019",v:"2019"},{n:"2018",v:"2018"},{n:"2017",v:"2017"}]},{key:"letter",name:"字母",value:[{n:"全部",v:""},{n:"A",v:"A"},{n:"B",v:"B"},{n:"C",v:"C"},{n:"D",v:"D"},{n:"E",v:"E"},{n:"F",v:"F"},{n:"G",v:"G"},{n:"H",v:"H"},{n:"I",v:"I"},{n:"J",v:"J"},{n:"K",v:"K"},{n:"L",v:"L"},{n:"M",v:"M"},{n:"N",v:"N"},{n:"O",v:"O"},{n:"P",v:"P"},{n:"Q",v:"Q"},{n:"R",v:"R"},{n:"S",v:"S"},{n:"T",v:"T"},{n:"U",v:"U"},{n:"V",v:"V"},{n:"W",v:"W"},{n:"X",v:"X"},{n:"Y",v:"Y"},{n:"Z",v:"Z"}]},{key:"by",name:"排序",value:[{n:"时间",v:"time"},{n:"人气",v:"hits"},{n:"评分",v:"score"}]}],15:[{key:"class",name:"剧情",value:[{n:"全部",v:""},{n:"悬疑",v:"悬疑"},{n:"武侠",v:"武侠"},{n:"科幻",v:"科幻"},{n:"都市",v:"都市"},{n:"爱情",v:"爱情"},{n:"古装",v:"古装"},{n:"战争",v:"战争"},{n:"青春",v:"青春"},{n:"偶像",v:"偶像"},{n:"喜剧",v:"喜剧"},{n:"家庭",v:"家庭"},{n:"犯罪",v:"犯罪"},{n:"奇幻",v:"奇幻"},{n:"剧情",v:"剧情"},{n:"乡村",v:"乡村"},{n:"年代",v:"年代"},{n:"警匪",v:"警匪"},{n:"谍战",v:"谍战"},{n:"冒险",v:"冒险"},{n:"罪案",v:"罪案"},{n:"宫廷",v:"宫廷"},{n:"BL",v:"BL"}]},{key:"area",name:"地区",value:[{n:"全部",v:""},{n:"韩国",v:"韩国"},{n:"日本",v:"日本"}]},{key:"year",name:"年份",value:[{n:"全部",v:""},{n:"2023",v:"2023"},{n:"2022",v:"2022"},{n:"2021",v:"2021"},{n:"2020",v:"2020"},{n:"2019",v:"2019"},{n:"2018",v:"2018"},{n:"2017",v:"2017"}]},{key:"letter",name:"字母",value:[{n:"全部",v:""},{n:"A",v:"A"},{n:"B",v:"B"},{n:"C",v:"C"},{n:"D",v:"D"},{n:"E",v:"E"},{n:"F",v:"F"},{n:"G",v:"G"},{n:"H",v:"H"},{n:"I",v:"I"},{n:"J",v:"J"},{n:"K",v:"K"},{n:"L",v:"L"},{n:"M",v:"M"},{n:"N",v:"N"},{n:"O",v:"O"},{n:"P",v:"P"},{n:"Q",v:"Q"},{n:"R",v:"R"},{n:"S",v:"S"},{n:"T",v:"T"},{n:"U",v:"U"},{n:"V",v:"V"},{n:"W",v:"W"},{n:"X",v:"X"},{n:"Y",v:"Y"},{n:"Z",v:"Z"}]},{key:"by",name:"排序",value:[{n:"时间",v:"time"},{n:"人气",v:"hits"},{n:"评分",v:"score"}]}],21:[{key:"class",name:"剧情",value:[{n:"全部",v:""},{n:"悬疑",v:"悬疑"},{n:"武侠",v:"武侠"},{n:"科幻",v:"科幻"},{n:"都市",v:"都市"},{n:"爱情",v:"爱情"},{n:"古装",v:"古装"},{n:"战争",v:"战争"},{n:"青春",v:"青春"},{n:"偶像",v:"偶像"},{n:"喜剧",v:"喜剧"},{n:"家庭",v:"家庭"},{n:"犯罪",v:"犯罪"},{n:"奇幻",v:"奇幻"},{n:"剧情",v:"剧情"},{n:"乡村",v:"乡村"},{n:"年代",v:"年代"},{n:"警匪",v:"警匪"},{n:"谍战",v:"谍战"},{n:"冒险",v:"冒险"},{n:"罪案",v:"罪案"},{n:"宫廷",v:"宫廷"},{n:"BL",v:"BL"}]},{key:"year",name:"年份",value:[{n:"全部",v:""},{n:"2023",v:"2023"},{n:"2022",v:"2022"},{n:"2021",v:"2021"},{n:"2020",v:"2020"},{n:"2019",v:"2019"},{n:"2018",v:"2018"},{n:"2017",v:"2017"}]},{key:"letter",name:"字母",value:[{n:"全部",v:""},{n:"A",v:"A"},{n:"B",v:"B"},{n:"C",v:"C"},{n:"D",v:"D"},{n:"E",v:"E"},{n:"F",v:"F"},{n:"G",v:"G"},{n:"H",v:"H"},{n:"I",v:"I"},{n:"J",v:"J"},{n:"K",v:"K"},{n:"L",v:"L"},{n:"M",v:"M"},{n:"N",v:"N"},{n:"O",v:"O"},{n:"P",v:"P"},{n:"Q",v:"Q"},{n:"R",v:"R"},{n:"S",v:"S"},{n:"T",v:"T"},{n:"U",v:"U"},{n:"V",v:"V"},{n:"W",v:"W"},{n:"X",v:"X"},{n:"Y",v:"Y"},{n:"Z",v:"Z"}]},{key:"by",name:"排序",value:[{n:"时间",v:"time"},{n:"人气",v:"hits"},{n:"评分",v:"score"}]}],14:[{key:"class",name:"剧情",value:[{n:"全部",v:""},{n:"悬疑",v:"悬疑"},{n:"武侠",v:"武侠"},{n:"科幻",v:"科幻"},{n:"都市",v:"都市"},{n:"爱情",v:"爱情"},{n:"古装",v:"古装"},{n:"战争",v:"战争"},{n:"青春",v:"青春"},{n:"偶像",v:"偶像"},{n:"喜剧",v:"喜剧"},{n:"家庭",v:"家庭"},{n:"犯罪",v:"犯罪"},{n:"奇幻",v:"奇幻"},{n:"剧情",v:"剧情"},{n:"乡村",v:"乡村"},{n:"年代",v:"年代"},{n:"警匪",v:"警匪"},{n:"谍战",v:"谍战"},{n:"冒险",v:"冒险"},{n:"罪案",v:"罪案"},{n:"宫廷",v:"宫廷"},{n:"BL",v:"BL"}]},{key:"area",name:"地区",value:[{n:"全部",v:""},{n:"台湾",v:"台湾"},{n:"泰国",v:"泰国"}]},{key:"year",name:"年份",value:[{n:"全部",v:""},{n:"2023",v:"2023"},{n:"2022",v:"2022"},{n:"2021",v:"2021"},{n:"2020",v:"2020"},{n:"2019",v:"2019"},{n:"2018",v:"2018"},{n:"2017",v:"2017"}]},{key:"letter",name:"字母",value:[{n:"全部",v:""},{n:"A",v:"A"},{n:"B",v:"B"},{n:"C",v:"C"},{n:"D",v:"D"},{n:"E",v:"E"},{n:"F",v:"F"},{n:"G",v:"G"},{n:"H",v:"H"},{n:"I",v:"I"},{n:"J",v:"J"},{n:"K",v:"K"},{n:"L",v:"L"},{n:"M",v:"M"},{n:"N",v:"N"},{n:"O",v:"O"},{n:"P",v:"P"},{n:"Q",v:"Q"},{n:"R",v:"R"},{n:"S",v:"S"},{n:"T",v:"T"},{n:"U",v:"U"},{n:"V",v:"V"},{n:"W",v:"W"},{n:"X",v:"X"},{n:"Y",v:"Y"},{n:"Z",v:"Z"}]},{key:"by",name:"排序",value:[{n:"时间",v:"time"},{n:"人气",v:"hits"},{n:"评分",v:"score"}]}],20:[{key:"class",name:"剧情",value:[{n:"全部",v:""},{n:"悬疑",v:"悬疑"},{n:"武侠",v:"武侠"},{n:"科幻",v:"科幻"},{n:"都市",v:"都市"},{n:"爱情",v:"爱情"},{n:"古装",v:"古装"},{n:"战争",v:"战争"},{n:"青春",v:"青春"},{n:"偶像",v:"偶像"},{n:"喜剧",v:"喜剧"},{n:"家庭",v:"家庭"},{n:"犯罪",v:"犯罪"},{n:"奇幻",v:"奇幻"},{n:"剧情",v:"剧情"},{n:"乡村",v:"乡村"},{n:"年代",v:"年代"},{n:"警匪",v:"警匪"},{n:"谍战",v:"谍战"},{n:"冒险",v:"冒险"},{n:"罪案",v:"罪案"},{n:"宫廷",v:"宫廷"},{n:"BL",v:"BL"}]},{key:"year",name:"年份",value:[{n:"全部",v:""},{n:"2023",v:"2023"},{n:"2022",v:"2022"},{n:"2021",v:"2021"},{n:"2020",v:"2020"},{n:"2019",v:"2019"},{n:"2018",v:"2018"},{n:"2017",v:"2017"}]},{key:"letter",name:"字母",value:[{n:"全部",v:""},{n:"A",v:"A"},{n:"B",v:"B"},{n:"C",v:"C"},{n:"D",v:"D"},{n:"E",v:"E"},{n:"F",v:"F"},{n:"G",v:"G"},{n:"H",v:"H"},{n:"I",v:"I"},{n:"J",v:"J"},{n:"K",v:"K"},{n:"L",v:"L"},{n:"M",v:"M"},{n:"N",v:"N"},{n:"O",v:"O"},{n:"P",v:"P"},{n:"Q",v:"Q"},{n:"R",v:"R"},{n:"S",v:"S"},{n:"T",v:"T"},{n:"U",v:"U"},{n:"V",v:"V"},{n:"W",v:"W"},{n:"X",v:"X"},{n:"Y",v:"Y"},{n:"Z",v:"Z"}]},{key:"by",name:"排序",value:[{n:"时间",v:"time"},{n:"人气",v:"hits"},{n:"评分",v:"score"}]}]}})}async function homeVod(){var html=await request(url+"/vodshow/2--hits---------.html");const $=load(html);html=$("div.myui-panel_bd > ul.myui-vodlist > li"),html=_.map(html,item=>{var it=$(item).find("a:first")[0],item=$($(item).find("span.pic-text")[0]).text().trim();return{vod_id:it.attribs.href.replace(/.*?\/voddetail\/(.*).html/g,"$1"),vod_name:it.attribs.title,vod_pic:it.attribs["data-original"],vod_remarks:item||""}});return JSON.stringify({list:html})}async function category(tid,pg,filter,extend){pg<=0&&(pg=1);tid=await request(url+"/vodshow/"+(extend.CateId||tid)+"-"+(extend.area||"")+"-"+(extend.by||"time")+"-"+(extend.class||"")+"-"+(extend.lang||"")+"-"+(extend.letter||"")+"---"+pg+"---"+(extend.year||"")+".html");const $=load(tid);extend=$("div.myui-panel_bd > ul.myui-vodlist > li"),tid=_.map(extend,item=>{var it=$(item).find("a:first")[0],item=$($(item).find("span.pic-text")[0]).text().trim();return{vod_id:it.attribs.href.replace(/.*?\/voddetail\/(.*).html/g,"$1"),vod_name:it.attribs.title,vod_pic:it.attribs["data-original"],vod_remarks:item||""}}),extend=0<$("ul.myui-page > li > a:contains(下一页)").length?parseInt(pg)+1:parseInt(pg);return JSON.stringify({page:parseInt(pg),pagecount:extend,limit:24,total:24*extend,list:tid})}async function detail(id){var html=await request(url+"/voddetail/"+id+".html"),html=load(html),id={vod_id:id,vod_name:html("h1:first").text().trim(),vod_type:html(".myui-content__detail p:first a").text(),vod_actor:html(".myui-content__detail p:nth-child(5)").text().replace("主演:",""),vod_director:html(".myui-content__detail p:nth-child(6)").text().replace("导演:",""),vod_pic:html("div.myui-content__thumb img:first").attr("data-original"),vod_remarks:html("#rating:first span").text().replace(/\s{2,}/g," "),vod_content:html("span.data").text().trim()},html=_.map(html("ul.sort-list > li > a"),it=>it.children[0].data+"$"+it.attribs.href.replace(/\/vodplay\/(.*).html/g,"$1"));return id.vod_play_from=key,id.vod_play_url=html.join("#"),JSON.stringify({list:[id]})}async function play(flag,id,flags){id=await request(url+"/vodplay/"+id+".html"),id=load(id),id=JSON.parse(id("script:contains(player_)").html().replace("var player_data=","")).url.replace("index.m3u8","hls/index.m3u8");return JSON.stringify({parse:0,url:id})}async function search(wd,quick){var videos=[];for(const vod of JSON.parse(await request(url+"/index.php/ajax/suggest?mid=1&wd="+wd)).list)videos.push({vod_id:vod.id,vod_name:vod.name,vod_pic:vod.pic,vod_remarks:""});return JSON.stringify({list:videos})}function __jsEvalReturn(){return{init:init,home:home,homeVod:homeVod,category:category,detail:detail,play:play,search:search}}export{__jsEvalReturn};
+266
View File
@@ -0,0 +1,266 @@
// !!!!! Do not use in release mode. Just a native inject fake wrapper for test spider. !!!!!
// !!!!! Do not use in release mode. Just a native inject fake wrapper for test spider. !!!!!
// !!!!! Do not use in release mode. Just a native inject fake wrapper for test spider. !!!!!
import axios from 'axios';
import crypto from 'crypto';
import https from 'https';
import fs from 'node:fs';
import qs from 'qs';
import { Uri, _ } from '../lib/cat.js';
const confs = {};
function initLocalStorage(storage) {
if (!_.has(confs, storage)) {
if (!fs.existsSync('local')) {
fs.mkdirSync('local');
}
const storagePath = 'local/js_' + storage;
if (!fs.existsSync(storagePath)) {
fs.writeFileSync(storagePath, '{}');
confs[storage] = {};
} else {
confs[storage] = JSON.parse(fs.readFileSync(storagePath).toString());
}
}
}
function localGet(storage, key) {
initLocalStorage(storage);
return _.get(confs[storage], key, '');
}
function localSet(storage, key, value) {
initLocalStorage(storage);
confs[storage][key] = value;
fs.writeFileSync('local/js_' + storage, JSON.stringify(confs[storage]));
}
async function request(url, opt) {
try {
var data = opt ? opt.data || null : null;
var postType = opt ? opt.postType || null : null;
var returnBuffer = opt ? opt.buffer || 0 : 0;
var timeout = opt ? opt.timeout || 5000 : 5000;
var headers = opt ? opt.headers || {} : {};
if (postType == 'form') {
headers['Content-Type'] = 'application/x-www-form-urlencoded';
if (data != null) {
data = qs.stringify(data, { encode: false });
}
}
let respType = returnBuffer == 1 || returnBuffer == 2 ? 'arraybuffer' : undefined;
var resp = await axios(url, {
responseType: respType,
method: opt ? opt.method || 'get' : 'get',
headers: headers,
data: data,
timeout: timeout,
httpsAgent: https.Agent({
rejectUnauthorized: false,
}),
});
var data = resp.data;
var resHeader = {};
for (const hks of resp.headers) {
var v = hks[1];
resHeader[hks[0]] = Array.isArray(v) ? (v.length == 1 ? v[0] : v) : v;
}
if (!returnBuffer) {
if (typeof data === 'object') {
data = JSON.stringify(data);
}
} else if (returnBuffer == 1) {
return { code: resp.status, headers: resHeader, content: data };
} else if (returnBuffer == 2) {
return { code: resp.status, headers: resHeader, content: data.toString('base64') };
}
return { code: resp.status, headers: resHeader, content: data };
} catch (error) {
console.error(error);
}
return { headers: {}, content: '' };
}
function base64EncodeBuf(buff, urlsafe = false) {
return buff.toString(urlsafe ? 'base64url' : 'base64');
}
function base64Encode(text, urlsafe = false) {
return base64EncodeBuf(Buffer.from(text, 'utf8'), urlsafe);
}
function base64DecodeBuf(text) {
return Buffer.from(text, 'base64');
}
function base64Decode(text) {
return base64DecodeBuf(text).toString('utf8');
}
function md5(text) {
return crypto.createHash('md5').update(Buffer.from(text, 'utf8')).digest('hex');
}
function aes(mode, encrypt, input, inBase64, key, iv, outBase64) {
if (iv.length == 0) iv = null;
try {
if (mode.startsWith('AES/CBC')) {
switch (key.length) {
case 16:
mode = 'aes-128-cbc';
break;
case 32:
mode = 'aes-256-cbc';
break;
}
} else if (mode.startsWith('AES/ECB')) {
switch (key.length) {
case 16:
mode = 'aes-128-ecb';
break;
case 32:
mode = 'aes-256-ecb';
break;
}
}
const inBuf = inBase64 ? base64DecodeBuf(input) : Buffer.from(input, 'utf8');
let keyBuf = Buffer.from(key);
if (keyBuf.length < 16) keyBuf = Buffer.concat([keyBuf], 16);
let ivBuf = iv == null ? Buffer.alloc(0) : Buffer.from(iv);
if (iv != null && ivBuf.length < 16) ivBuf = Buffer.concat([ivBuf], 16);
const cipher = encrypt ? crypto.createCipheriv(mode, keyBuf, ivBuf) : crypto.createDecipheriv(mode, keyBuf, ivBuf);
const outBuf = Buffer.concat([cipher.update(inBuf), cipher.final()]);
return outBase64 ? base64EncodeBuf(outBuf) : outBuf.toString('utf8');
} catch (error) {
console.log(error);
}
return '';
}
function des(mode, encrypt, input, inBase64, key, iv, outBase64) {
try {
if (mode.startsWith('DESede/CBC')) {
// https://stackoverflow.com/questions/29831300/convert-desede-ecb-nopadding-algorithm-written-in-java-into-nodejs-using-crypto
switch (key.length) {
case 16:
mode = 'des-ede-cbc';
break;
case 24:
mode = 'des-ede3-cbc';
break;
}
}
const inBuf = inBase64 ? base64DecodeBuf(input) : Buffer.from(input, 'utf8');
let keyBuf = Buffer.from(key);
if (keyBuf.length < 16) keyBuf = Buffer.concat([keyBuf], 16);
let ivBuf = iv == null ? Buffer.alloc(0) : Buffer.from(iv);
if (iv != null && ivBuf.length < 8) ivBuf = Buffer.concat([ivBuf], 8);
const cipher = encrypt ? crypto.createCipheriv(mode, keyBuf, ivBuf) : crypto.createDecipheriv(mode, keyBuf, ivBuf);
const outBuf = Buffer.concat([cipher.update(inBuf), cipher.final()]);
return outBase64 ? base64EncodeBuf(outBuf) : outBuf.toString('utf8');
} catch (error) {
console.log(error);
}
return '';
}
// pkcs8 only
function rsa(mode, pub, encrypt, input, inBase64, key, outBase64) {
try {
let pd = undefined;
const keyObj = pub ? crypto.createPublicKey(key) : crypto.createPrivateKey(key);
if (!keyObj.asymmetricKeyDetails || !keyObj.asymmetricKeyDetails.modulusLength) return '';
const moduleLen = keyObj.asymmetricKeyDetails.modulusLength;
let blockLen = moduleLen / 8;
switch (mode) {
case 'RSA/PKCS1':
pd = crypto.constants.RSA_PKCS1_PADDING;
blockLen = encrypt ? blockLen - 11 : blockLen;
break;
case 'RSA/None/NoPadding':
pd = crypto.constants.RSA_NO_PADDING;
break;
case 'RSA/None/OAEPPadding':
pd = crypto.constants.RSA_PKCS1_OAEP_PADDING;
blockLen = encrypt ? blockLen - 41 : blockLen;
break;
default:
throw Error('not support ' + mode);
}
let inBuf = inBase64 ? base64DecodeBuf(input) : Buffer.from(input, 'utf8');
let bufIdx = 0;
let outBuf = Buffer.alloc(0);
while (bufIdx < inBuf.length) {
const bufEndIdx = Math.min(bufIdx + blockLen, inBuf.length);
let tmpInBuf = inBuf.subarray(bufIdx, bufEndIdx);
if (pd == crypto.constants.RSA_NO_PADDING) {
if (tmpInBuf.length < blockLen) {
tmpInBuf = Buffer.concat([Buffer.alloc(128 - tmpInBuf.length), tmpInBuf]);
}
}
let tmpBuf;
if (pub) {
tmpBuf = encrypt ? crypto.publicEncrypt({ key: keyObj, padding: pd }, tmpInBuf) : crypto.publicDecrypt({ key: keyObj, padding: pd }, tmpInBuf);
} else {
tmpBuf = encrypt ? crypto.privateEncrypt({ key: keyObj, padding: pd }, tmpInBuf) : crypto.privateDecrypt({ key: keyObj, padding: pd }, tmpInBuf);
}
bufIdx = bufEndIdx;
outBuf = Buffer.concat([outBuf, tmpBuf]);
}
return outBase64 ? base64EncodeBuf(outBuf) : outBuf.toString('utf8');
} catch (error) {
console.log(error);
}
return '';
}
var charStr = 'abacdefghjklmnopqrstuvwxyzABCDEFGHJKLMNOPQRSTUVWXYZ0123456789';
function randStr(len, withNum) {
var _str = '';
let containsNum = withNum === undefined ? true : withNum;
for (var i = 0; i < len; i++) {
let idx = _.random(0, containsNum ? charStr.length - 1 : charStr.length - 11);
_str += charStr[idx];
}
return _str;
}
globalThis.local = {
get: async function (storage, key) {
return localGet(storage, key);
},
set: async function (storage, key, val) {
localSet(storage, key, val);
},
};
globalThis.md5X = md5;
globalThis.rsaX = rsa;
globalThis.aesX = aes;
globalThis.desX = des;
globalThis.req = request;
globalThis.url2Proxy = async function (type, url, headers) {
let hd = Object.keys(headers).length == 0 ? '_' : encodeURIComponent(JSON.stringify(headers));
let uri = new Uri(url);
let path = uri.path();
path = path.substring(path.lastIndexOf('/'));
let ext = path.indexOf('.') >= 0 ? path.substring(path.indexOf('.')) : '.bin';
return 'http://127.0.0.1:13333/up/' + randStr(6) + '/' + type + '/' + hd + '/' + encodeURIComponent(url) + '/' + ext;
};
globalThis.js2Proxy = async function (dynamic, siteType, site, url, headers) {
let hd = Object.keys(headers).length == 0 ? '_' : encodeURIComponent(JSON.stringify(headers));
return (dynamic ? 'js2p://_WEB_/' : 'http://127.0.0.1:13333/jp/') + randStr(6) + '/' + siteType + '/' + site + '/' + hd + '/' + encodeURIComponent(url);
};
export default {};