diff --git a/jtxtv12/js/人人电影.js b/jtxtv12/js/人人电影.js new file mode 100644 index 0000000..43a01a8 --- /dev/null +++ b/jtxtv12/js/人人电影.js @@ -0,0 +1,126 @@ +var rule = { + title: '人人电影网', + host: 'https://www.rrdynb.com', + homeUrl: '/', + url: '/fyclass_fypage.html?', + filter_url: '{{fl.class}}', + filter: {}, + searchUrl: '/plus/search.php?q=**&pagesize=10&submit=', + searchable: 2, + quickSearch: 1, + filterable: 0, + headers: { + 'User-Agent': 'PC_UA', + 'Cookie': '' + }, + timeout: 5000, + class_name: '影视&电视剧&老电影&动漫', + class_url: 'movie/list_2&dianshiju/list_6&zongyi/list_10&dongman/list_13', + play_parse: true, + play_json: [{ + re: '*', + json: { + parse: 0, + jx: 0 + } + }], + lazy: "js:\n input = 'push://' + input;\n ", + limit: 6, + 推荐: '', + 一级: 'li:has(img);img&&alt;img&&data-original;;a&&href', + 二级: { + title: "h1&&Text", + img: "img&&src", + desc: ".info:eq(0)&&Text", + content: ".content&&Text", + tabs: `js: + pdfh = jsp.pdfh; + pdfa = jsp.pdfa; + TABS = []; + let d = pdfa(html, 'span a'); + let hasBaidu = false; + let hasQuark = false; + + d.forEach(function(it) { + let burl = pdfh(it, 'a&&href'); + if (burl.includes("pan.baidu.com/s/")) { + hasBaidu = true; + } else if (burl.includes("pan.quark.cn/s/")) { + hasQuark = true; + } + }); + + // 确保线路顺序固定:百度网盘在前,夸克网盘在后 + if (hasBaidu) TABS.push("百度网盘"); + if (hasQuark) TABS.push("夸克网盘"); + + log('生成TABS: ' + JSON.stringify(TABS));`, + lists: `js: + pdfh = jsp.pdfh; + pdfa = jsp.pdfa; + LISTS = []; + let d = pdfa(html, 'span a'); + + // 提取码识别函数 + function extractCode(title, patterns) { + for (let pattern of patterns) { + const match = title.match(pattern); + if (match && match[1]) { + return match[1]; + } + } + return null; + } + + // 创建资源分类数组 + let baiduList = []; + let quarkList = []; + + d.forEach(function(it) { + let burl = pdfh(it, 'a&&href'); + let title = pdfh(it, 'a&&Text'); + + // 百度网盘处理 + if (burl.includes("pan.baidu.com/s/")) { + const baiduPatterns = [ + /(?:提取码|密码|验证码|code|pwd|码)[::\s]*(\w{4})/i, + /(?:\b|\s)(\w{4})(?=提取|百度|网盘|分享|$)/i, + /[\s\[](\w{4})[\s\]]/, + /\b(\w{4})\b/ + ]; + const code = extractCode(title, baiduPatterns); + if (code) { + burl += '#' + code; + log('百度网盘提取码识别成功: ' + code); + } else { + log('未识别到百度提取码,使用原始链接'); + } + baiduList.push(title + '$' + burl); + } + // 夸克网盘处理 + else if (burl.includes("pan.quark.cn/s/")) { + const quarkPatterns = [ + /(?:密码|pwd)[::\s]*(\w{4,8})/i, + /(?:\b|\s)(\w{4,8})(?=提取|夸克|网盘|分享|$)/i, + /[\s\[](\w{4,8})[\s\]]/, + /\b(\w{4,8})\b/ + ]; + const code = extractCode(title, quarkPatterns); + if (code) { + burl += '#' + code; + log('夸克网盘密码识别成功: ' + code); + } + quarkList.push(title + '$' + burl); + } + }); + + // 按固定顺序添加资源列表,与TABS顺序一致 + if (baiduList.length > 0) { + LISTS.push(baiduList); + } + if (quarkList.length > 0) { + LISTS.push(quarkList); + }`, + }, + 搜索: 'li:has(img);h2&&Text;img&&data-original;.tags&&Text;a&&href', +}; \ No newline at end of file diff --git a/jtxtv12/js/努努影院.js b/jtxtv12/js/努努影院.js new file mode 100644 index 0000000..4304446 --- /dev/null +++ b/jtxtv12/js/努努影院.js @@ -0,0 +1,105 @@ +var rule = { +//rc4解密函数 +rc4Decrypt: function (encryptedHex) { + const key = "i_love_you"; + const encryptedBytes = new Uint8Array(encryptedHex.length / 2); + for (let i = 0; i < encryptedBytes.length; i++) { + encryptedBytes[i] = parseInt(encryptedHex.substr(i * 2, 2), 16); + } + const s = Array.from({ length: 256 }, (_, i) => i); + let j = 0; + const keyLength = key.length; + for (let i = 0; i < 256; i++) { + j = (j + s[i] + key.charCodeAt(i % keyLength)) % 256; + [s[i], s[j]] = [s[j], s[i]]; + } + let i = 0; + j = 0; + const decryptedBytes = new Uint8Array(encryptedBytes.length); + for (let k = 0; k < encryptedBytes.length; k++) { + i = (i + 1) % 256; + j = (j + s[i]) % 256; + [s[i], s[j]] = [s[j], s[i]]; + const keyStreamByte = s[(s[i] + s[j]) % 256]; + decryptedBytes[k] = encryptedBytes[k] ^ keyStreamByte; + } + const decoder = new TextDecoder('utf-8'); + const result = decoder.decode(decryptedBytes); + return result; +}, + +author: '小可乐/v5.10.1', +title: '努努影院', +类型: '影视', +host: 'https://nnyy.la', +hostJs: '', +headers: {'User-Agent': MOBILE_UA}, +编码: 'utf-8', +timeout: 5000, + +homeUrl: '/', +url: '/fyclass/?page=fypage&fyfilter', +filter_url: 'area={{fl.area}}&by={{fl.by}}&class={{fl.class}}&year={{fl.year}}', +searchUrl: '/search?page=fypage&wd=**', +detailUrl: '', + +limit: 9, +double: false, +class_name: '电影&剧集&综艺&动漫&短剧&纪录', +class_url: 'dianying&dianshiju&zongyi&dongman&duanju&jilupian', +filter_def: {}, + +推荐: '*', +一级: $js.toString(() => { + let klists = pdfa(fetch(input), '.thumbnail'); + VODS = []; + klists.forEach((it) => { + VODS.push({ + vod_name: pdfh(it, 'img&&alt'), + vod_pic: pdfh(it, 'img&&data-src'), + vod_remarks: pdfh(it, '.note&&Text'), + vod_id: pdfh(it, 'a&&href') + }) + }) +}), +搜索: '*', +二级: $js.toString(() => { + let khtml = fetch(input); + let ktabs = pdfa(khtml, 'dl&&dt').map((it) => { return pdfh(it, 'body&&Text') }); + let kurls = pdfa(khtml, '.sort-list').map((item) => { + let kurl = pdfa(item, 'a').map((it) => { return pdfh(it, 'body&&Text') + '$' + input + '@' + pdfh(it, 'a&&onclick') }); + return kurl.join('#') + }); + VOD = { + vod_id: input, + vod_name: pdfh(khtml, '.thumb&&alt'), + vod_pic: pdfh(khtml, '.thumb&&data-src'), + type_name: pdfh(khtml, '.product-excerpt:contains(类型)&&Text').replace('类型:','') || '未提供', + vod_remarks: pdfh(khtml, 'h1.product-title&&span:eq(-1)&&Text') || '未提供', + vod_year: pdfh(khtml, 'h2&&span&&Text').replace(/\D+/g, '') || '3000', + vod_area: pdfh(khtml, '.product-excerpt:contains(地区:)&&a&&Text') || '未提供', + vod_lang: '未提供', + vod_director: pdfh(khtml, '.product-excerpt:contains(导演)&&Text').replace('导演:','') || '未提供', + vod_actor: pdfh(khtml, '.product-excerpt:contains(主演)&&Text').replace('主演:','') || '未提供', + vod_content: pdfh(khtml, '.product-excerpt:eq(-1)&&span&&Text') || '未提供', + vod_play_from: ktabs.join('$$$'), + vod_play_url: kurls.join('$$$') + } +}), + +play_parse: true, +lazy: $js.toString(() => { + let [kurl, kids] = input.split('@'); + let [sid, kid] = kids.match(/\d+/g); + let flag = `[${sid}][${kid}]`; + kurl = fetch(kurl).split(`${flag}`)[1].split('"')[1]; + if (kurl) { kurl = rule.rc4Decrypt(kurl) }; + if (/\.(m3u8|mp4|mkv)/.test(kurl)) { + input = { jx: 0, parse: 0, url: kurl, header: rule.headers } + } else { + input = { jx: 0, parse: 1, url: input } + } +}), + +filter: 'H4sIAAAAAAAAA+1Y204iQRB99zPm2Qfvt18xPsy6RHEVN6KbsMbECyioC2oUFiXqxgvqiuIlKsOCPzPdA3+xDd1d3YOmmWyM7kO/cep09a16qk4x22J89puBkD8wYgwMtswaX3whY8AYHjeDQaPVCJgTPgJRLIuXIgR/M8dniGFw1gjUzJGz6tJZzUyAMdfKrMkMGc+sDHDOid6wiQQAv9Uzu5ThfhSAX3YTFYrcjwLJz9kuCr8a4BxevHSSm4xjAOZcvXZKF3xOCsBvaRUv7nI/CmC95a1q+pyvRwHnqgd3dmGDcQyAX3wZJW65HwXAnayI8zEAe1nYwPNJvhcKgIv+tK0Y5yjgnP3nsHKVZxwD4Jdbr0T3uR8Fgju1y4fA1YG4l0gldgv3Ugdwnwvl6m6Z3ycFnKucPIuXwgD4WReotOPEVrgrYBhxkJNoCuaG5lrhuZpTPlN6rZk8Wre8vtYf8cp1jt88BXDay6xTjvPTUiAifY72ShDpOgC/1AnOXHI/CiAqTzkyFB1nq+llHhvZBGcux8X8DLjnqJ6m8dO1aw5malgrkceFsnstaoLorN2ItRiAs9ztCI4BuLvyo+AYAL9wgpwIRfmHIrD0JpwEiWVaPAuGRWzyyDqF2NSB2Fde3lfedT/PYaeUwkm4HMAiZxzitWeyIUgbHMP85Tu6X9uCPCCbpIyG8tsowj80gWHE5j6KPHGaAtjH4z05Nt8EBSJ6hSqcngHXqw/5zCnp1Rfu7WLJ46vvaOtoqzscMUYySGO6Bdst27uEvUu2dwp7p2zvEPYO2d4u7O2uvUm7kuzt/WAnPyV741naX56lrXFMW+OYfveI/ka+z833NfK9br63ke9x8z2NPN67xyn4XChwxftTSEQbx7eQlXgRbbwew6mHauqeTTPtJ6NhgfWYbVk4v83IUf90UCYr12EU5UkpODw55aut3zLUSjVCcNQ/NvPRIkFV0JVCQFHUUOK4csTXYwC4qwdkQXmgwIuAUAkWVUFXiQRVsVeJJ5VgUYkEEVABPAkWhXhSiQSVKHlVWH2wBKgXbR5HBt5LHniVACoZoS77ivLqUVY0lwD/Ki6aS4fmEuBNy7IHwdJccjSXEk1FiZYHWh58gDz4PhkYCfnfShs4mQOyESc7z78DwPD9h29Q4kiMENhLI/5qndG1RNcSXUt0LdG15KNbTVJLJszAmxWTeFhqxCjw1KSpGkZFQ0X6MpxMiSatBoDb2HcuoXmlQDSFa+QbhaawDqAA5LbFPhmAM/zex6tQKSnw0iyTWoGeeMpiALjDX2iPFzEG3MXZVZmFX/zM2eBRZcBLY+sUE1L6pAD8Ig92EQojBW9WrJcjZDzEsQ68FFZlIW+2X51KdSp9r1Q6Ywb0X3b6LzvG/W9/2elMqDPhO2XCMf/4zFe/W1XqLl93+brL1wlZJ+T3Tsgtc38Bc7UuQ3cmAAA=' +} \ No newline at end of file diff --git a/jtxtv12/js/夸克影院.js b/jtxtv12/js/夸克影院.js new file mode 100644 index 0000000..6cce20b --- /dev/null +++ b/jtxtv12/js/夸克影院.js @@ -0,0 +1,66 @@ +/* +@header({ + searchable: 1, + filterable: 0, + quickSearch: 0, + title: '夸克影院' +}) +*/ + +var rule = { + title: '夸克影院', + host: 'https://www.qkmov.cc', //发布页http://www.taoju.vip + searchable: 1, + quickSearch: 0, + filterable: 0, + url: '/type/fyclass-fypage.html', + class_name: "电影&电视剧&动漫&综艺", + class_url: "20&21&22&23", + searchUrl: '/search/-------------.html?wd=**', + play_parse: true, + limit: 6, + 推荐:'*', + 一级:'.col-md-6.col-sm-4.col-xs-3;a&&title;a&&data-original;.pic-text&&Text;a&&href', + 二级: async function () { + let {input,pdfa,pdfh,pd} = this; + input = input.replace(/video/g, 'play').replace(/.html/g, '-1-1.html') + let html = await request(input); + let VOD = {}; + VOD.vod_name = pdfh(html, '.stui-content__detail .title&&Text'); + VOD.vod_content = pdfh(html, '.detail&&Text'); + let playlist = pdfa(html, '.cloud-links a') + let play_urls = [] + let play_from = [] + playlist.map((item) => { + play_urls.push(pdfh(item,'a&&title') + '$' + pdfh(item,'a&&href')); + play_from.push(pdfh(item,'a&&title')) + }); + VOD.vod_play_from =play_from.join('$$$'); + VOD.vod_play_url = play_urls.join('#'); + return VOD + }, + lazy:async function (){ + let {input} = this; + if(/pan.quark.cn/.test(input)){ + return {parse: 0,jx: 0,url: 'push://' + input} + }else{ + return {parse: 1,jx: 0,url: input} + } + }, + 搜索: async function () { + let {input,pdfa,pdfh,pd} = this; + let html = await request(input); + let d = []; + let data = pdfa(html, '.stui-vodlist__media li'); + data.forEach((it) => { + d.push({ + title: pdfh(it, '.thumb a&&title'), + pic_url: pd(it, '.thumb a&&data-original'), + desc: pdfh(it, '.pic-text&&Text'), + url: pd(it, '.thumb a&&href'), + content: pdfh(it, '.hl-item-content&&p:eq(0)&&Text'), + }) + }); + return setResult(d) + } +} \ No newline at end of file diff --git a/jtxtv12/js/泥泥视频.js b/jtxtv12/js/泥泥视频.js new file mode 100644 index 0000000..5438b85 --- /dev/null +++ b/jtxtv12/js/泥泥视频.js @@ -0,0 +1,412 @@ +var rule = { + author: '书虫/250613/第1版', + title: '泥视频', + 类型: '影视', + //主页 网页的域名根 + host: 'https://www.nivod.vip/', + hostJs: ``, + headers: { + 'User-Agent': 'Mozilla/5.0' + }, + //不填就默认utf-8,根据网页源码所显示的格式填,根据需要可填UTF-8,GBK,GB2312 + 编码: 'utf-8', + timeout: 5000, + //首页链接,可以是完整路径或者相对路径,用于分类获取和推荐获取 + homeUrl: '/', + //分类链接,分类参数用fyclasss,页码用fypage,带筛选的用fyfilter,第一页无页码的用[]括起,处理方式同xbpq方式,fyfilter代表filter_url里内容 + + // https://www.nivod.vip/k/6-大陆-------2---2021/ + url: 'https://www.nivod.vip/k/fyfilter/', + filter_url: '{{fl.cateId}}-{{fl.area}}-------fypage---{{fl.year}}', + detailUrl: 'https://www.nivod.vip/nivod/fyid/', + //搜索链接 可以是完整路径或者相对路径,用于分类获取和推荐获取 **代表搜索词 fypage代表页数 +// searchUrl: 'https://www.shkangping.com/vodsearch/**----------fypage---.html', + // 搜索页找参数 数组标题图片副标题链接 +// 搜索: '*', + //rss搜索写法 + // searchUrl: '/rss/index.xml?wd=**&page=fypage', + // ajax搜索写法 + searchUrl: '/index.php/ajax/suggest?mid=1&wd=**&page=fypage&limit=30', + + 搜索: 'json:list;name;pic;en;id', + + searchable: 1, + quickSearch: 1, + filterable: 1, + limit: 10, + double: false, + class_name: '电影&电视剧&综艺&动漫', + //静态分类值 + class_url: '1&2&3&4', + + + filter_def: { + 1: { + cateId: '1' + }, + 2: { + cateId: '2' + }, + 3: { + cateId: '3' + }, + 4: { + cateId: '4' + } + + + }, + //推荐列表可以单独写也是几个参数,和一级列表部分参数一样的可以用*代替,不一样写不一样的,全和一级一样,可以用一个*代替 + 推荐: 'a:has(.lazyload);a&&title;.lazyload&&data-original;.module-item-note&&Text;a&&href', + //推荐页的json模式 + //推荐: 'json:list;vod_name;vod_pic;vod_remarks;vod_id', + //数组、标题、图片、副标题、链接,分类页找参数 + 一级: 'a:has(.module-item-pic);a&&title;.lazyload&&data-original;.module-item-note&&Text;a&&href', + + + //数组、标题、图片、副标题、链接,分类页找参数 + + //一级: `js: + //let klist=pdfa(request(input),'.vertical-box'); + // let k=[]; + //klist.forEach(it=>{ + // k.push({ + //title: pdfh(it,'.title&&Text'), + // pic_url: !pdfh(it,'.lazyload&&data-original').startsWith('http') ? HOST + pdfh(it,'.lazyload&&data-original') : pdfh(it,'.lazyload&&data-original'), + + //desc: pdfh(it,''), + // url: pdfh(it,'a&&href'), + //content: '' + // }) + //}); + //setResult(k) + //`, + + //普通搜索模板 搜索数组标题图片副标题链接 + //搜索: `js: + + //let klist=pdfa(request(input),'.hzixunui-vodlist__thumb'); + // let k=[]; + //klist.forEach(it=>{ + //k.push({ + // title: pdfh(it,'a&&title'), + // pic_url: !pdfh(it,'a&&data-original').startsWith('http') ? HOST + pdfh(it,'a&&data-original') : pdfh(it,'a&&data-original'), + // desc: pdfh(it,'.text-right&&Text'), + // url: pdfh(it,'a&&href'), + // content: '' + // }) + // }); + // setResult(k) + // `, + + //rss搜索模板 + // 搜索: `js: + //let klist=pdfa(request(input),'rss&&item'); + // let k=[]; + // klist.forEach(it=>{ + // it=it.replace(/title|link|author|pubdate|description/g,'p'); + // k.push({ + // title: pdfh(it,'p:eq(0)&&Text'), + // pic_url: '', + // desc: pdfh(it,'p:eq(3)&&Text'), + // url: pdfh(it,'p:eq(1)&&Text').replace('cc','la'), + // content: pdfh(it,'p:eq(4)&&Text') + // }) + // }); + // setResult(k) + //" `, + + //详情页找参数 + //第一部分分别是对应参数式中的标题、类型、图片、备注、年份、地区、导演、主演、简介 + //第二部分分别对应参数式中的线路数组和线路标题 + //第三部分分别对应参数式中的播放数组、播放列表、播放标题、播放链接 + + 二级: `js: +let html = request(input); +VOD = {}; + VOD.vod_id = input; +VOD.vod_name = '标题: '+pdfh(html, 'h1&&Text'); + VOD.type_name = pdfh(html, '.module-info-tag-link:eq(2)&&Text'); + VOD.vod_pic = pd(html, '.lazyload&&data-original', input); + VOD.vod_remarks = pdfh(html, '.module-info-item:contains(集数)&&Text').replace('集数:',''); + VOD.vod_year = pdfh(html, '.module-info-tag-link:eq(0)&&Text'); +VOD.vod_area = pdfh(html, '.module-info-tag-link:eq(1)&&Text'); + VOD.vod_director = pdfh(html, '.module-info-item:contains(导演)&&Text').replace('导演:',''); + VOD.vod_actor = pdfh(html, '.module-info-item:contains(主演)&&Text').replace('主演:',''); + VOD.vod_content = '祝您观影愉快!介绍剧情:' + pdfh(html, '.module-info-introduction-content&&Text'); + + let r_ktabs = pdfa(html,'#y-playList&&span'); + let ktabs = r_ktabs.map(it => pdfh(it, 'Text')); + VOD.vod_play_from = ktabs.join('$$$'); + + +let klists = []; + let r_plists = pdfa(html, '.module-play-list'); + r_plists.forEach((rp) => { + let klist = pdfa(rp, 'body&&a:not([rel])').map((it) => { + return pdfh(it, 'a&&Text') + '$' + pd(it, 'a&&href', input); + }); + klist = klist.join('#'); + klists.push(klist); + }); + VOD.vod_play_url = klists.join('$$$') + + + `, + //是否启用辅助嗅探: 1,0 + sniffer: 0, + // 辅助嗅探规则 + isVideo: 'http((?!http).){26,}\\.(m3u8|mp4|flv|avi|mkv|wmv|mpg|mpeg|mov|ts|3gp|rm|rmvb|asf|m4a|mp3|wma)', + + play_parse: true, + //播放地址通用解析 + lazy: `js: +let kcode = JSON.parse(request(input).match(/var player_.*?=(.*?) { + let kname = it.disk_name.replace(/<[^>]*?>/g, '') || '名称'; + let kpic = rule.panPics[it.disk_type] || '图片'; + let kremarks = `${it.disk_type}|${it.shared_time || '无分享时间'}`; + kvods.push({ + vod_name: kname, + vod_pic: kpic, + vod_remarks: kremarks, + vod_id: `${it.link}@${kname}@${kpic}@${kremarks}` + }); + }); + return kvods; +}, + +author: '小可乐/v5.12.1', +title: '米盘搜', +类型: '影视', +host: 'http://misopan.fun', +headers: {'User-Agent': MOBILE_UA}, +编码: 'utf-8', +timeout: 5000, + +homeUrl: '/v1/search/disk', +url: '/v1/search/disk', +searchUrl: '/v1/search/disk', + +limit: 9, +double: false, +class_name: '电影&国产剧&短剧', +class_url: '电影&国产剧&短剧', +pagecount: {"电影": 1, "国产剧": 1, "短剧": 1}, + +exaxt: false,//精准搜索改为true +panPics: { + "QUARK": "https://so.slowread.net/static/img/quark.jpg", + "BDY": "https://so.slowread.net/static/img/baidu.jpg", + "UC": "https://so.slowread.net/static/img/uc.jpg" +}, + +推荐: $js.toString(() => { + let kwd = '美剧'; + VODS = rule.getkvods(input, kwd, rule.exaxt); +}), +一级: $js.toString(() => { + VODS = rule.getkvods(input, MY_CATE, rule.exaxt); +}), +搜索: $js.toString(() => { + VODS = rule.getkvods(input, KEY, rule.exaxt); +}), +二级: $js.toString(() => { + let [kid, kname, kpic, kremarks] = input.split('@'); + let [type, remark='状态'] = kremarks.split('|'); + let kurl = `合集$${kid}`; + VOD = { + vod_id: kid, + vod_name: kname, + vod_pic: kpic, + type_name: type, + vod_remarks: remark, + vod_year: '1000', + vod_area: '地区', + vod_lang: '语言', + vod_director: '导演', + vod_actor: '演员', + vod_content: `${kname}_${kid}`, + vod_play_from: type, + vod_play_url: kurl + }; +}), + +play_parse: true, +lazy: $js.toString(() => { + let kurl = `push://${input}`; + input = { jx: 0, parse: 0, url: kurl }; +}), +} \ No newline at end of file