diff --git a/jar/fanty.jar b/jar/fanty.jar index 2f85f143..52def133 100644 Binary files a/jar/fanty.jar and b/jar/fanty.jar differ diff --git a/js.json b/js.json index 63524b23..8158e988 100644 --- a/js.json +++ b/js.json @@ -1,5 +1,5 @@ { -"spider": "./jar/fanty.jar;md5;09a472702befaecf58154f50533395fd", +"spider": "./jar/fanty.jar;md5;a4c63fe74439b399ccd4eaaf4c639588", "lives":[{"name":"live","type":0,"url":"http://home.jundie.top:81/Cat/tv/live.txt","playerType":1,"ua": "okhttp/3.12.13","epg":"http://epg.112114.xyz/?ch={name}&date={date}","logo": "https://epg.112114.xyz/logo/{name}.png"}], "wallpaper":"https://jianbian.chuqiuyu.tk", "sites":[ @@ -13,6 +13,7 @@ {"key":"drpy_js_爱看","name":"影视 | 爱看[js]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/爱看.js"}, {"key":"drpy_js_低端","name":"影视 | 低端[js]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/ddys.js"}, {"key":"drpy_js_胖虎","name":"影视 | 胖虎[js]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/胖虎.js"}, +{"key":"drpy_js_cokemv","name":"影视 | cokemv","type":3,"api":"./lib/drpy2.min.js","ext":"./js/cokemv.js"}, {"key":"drpy_js_LIBVIO","name":"影视 | LIBVIO[js]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/LIBVIO.js"}, {"key":"drpy_js_农民","name":"影视 | 农民[js]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/农民影视.js"}, {"key":"drpy_js_饭团电影","name":"影视 | 饭团电影[js]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/饭团影视.js"}, @@ -28,18 +29,21 @@ {"key":"drpy_js_剧白白","name":"影视 | 剧白白[js]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/剧白白.js"}, {"key":"drpy_js_扛把子影院","name":"影视 | 扛把子影院[js]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/扛把子影院.js"}, {"key":"drpy_js_美视网","name":"影视 | 美视网[js]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/美视网.js"}, +{"key":"drpy_js_思古影视","name":"影视 | 思古影视","type":3,"api":"./lib/drpy2.min.js","ext":"./js/思古影视.js"}, {"key":"drpy_js_555影视[V2]","name":"影视 | 555影视[V2]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/555影视[V2].js"}, {"key":"drpy_js_69美剧[V2]","name":"影视 | 69美剧[V2]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/69美剧[V2].js"}, -{"key":"drpy_js_啊班[V2]","name":"影视 | 啊班[V2]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/啊班[V2].js"}, +{"key":"drpy_js_HG影院[V2]","name":"影视 | HG影院[V2]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/HG影院[V2].js"}, {"key":"drpy_js_爱迪[V2]","name":"影视 | 爱迪[V2]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/爱迪[V2].js"}, {"key":"drpy_js_布雷蓝光[V2]","name":"影视 | 布雷蓝光[V2]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/布雷蓝光[V2].js"}, {"key":"drpy_js_创艺影视[V2]","name":"影视 | 创艺影视[V2]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/创艺影视[V2].js"}, {"key":"drpy_js_多米[V2]","name":"影视 | 多米[V2]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/多米[V2].js"}, {"key":"drpy_js_咕噜[V2]","name":"影视 | 咕噜[V2]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/咕噜[V2].js"}, +{"key":"drpy_js_酷影[V2]","name":"影视 | 酷影[V2]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/酷影[V2].js"}, {"key":"drpy_js_萌蛋蛋[V2]","name":"影视 | 萌蛋蛋[V2]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/萌蛋蛋[V2].js"}, {"key":"drpy_js_迷你库[V2]","name":"影视 | 迷你库[V2]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/迷你库[V2].js"}, {"key":"drpy_js_如意[V2]","name":"影视 | 如意[V2]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/如意[V2].js"}, +{"key":"drpy_js_速看100[V2]","name":"影视 | 速看100[V2]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/速看100[V2].js"}, {"key":"drpy_js_天空影视[V2]","name":"影视 | 天空影视[V2]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/天空影视[V2].js"}, {"key":"drpy_js_鸭鸭[V2]","name":"影视 | 鸭鸭[V2]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/鸭鸭[V2].js"}, @@ -68,6 +72,8 @@ {"key":"drpy_js_310直播","name":"体育 | 310直播[js]","type":3,"api":"./lib/drpy2.min.js","changeable":0,"ext":"./js/310直播.js"}, {"key":"drpy_js_JRKAN直播","name":"体育 | JRKAN直播[js]","type":3,"api":"./lib/drpy.min.js","changeable":0,"ext":"./js/JRKAN直播.js"}, {"key":"drpy_js_好趣网","name":"电视 | 好趣网[js]","type":3,"api":"./lib/drpy2.min.js","changeable":0,"ext":"./js/好趣网.js"}, +{"key":"drpy_js_直播大全","name":"电视 | 直播大全[js]","type":3,"api":"./lib/live2cms.js","changeable":0,"ext":"./js/live2mv_data.json"}, +{"key":"MV_vod","name":"电视┃VOD","type":1,"api":"https://tvbox-mv--leosam2048.repl.co/mv/vod"}, {"key":"drpy_js_相声随身听","name":"相声 | 相声随身听[js]","type":3,"api":"./lib/drpy2.min.js","changeable":0,"ext":"./js/相声随身听.js"}, {"key":"drpy_js_评书随身听","name":"评书 | 评书随身听[js]","type":3,"api":"./lib/drpy2.min.js","changeable":0,"ext":"./js/评书随身听.js"}, {"key":"drpy_js_Alist","name":"网盘 | Alist[js]","type":3,"api":"./lib/alist.min.js","changeable":0,"ext":"./js/alist.json"}, @@ -176,7 +182,6 @@ {"key":"drpy_js_骚火电影","name":"影视 | 骚火电影[js]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/骚火电影.js"}, {"key":"drpy_js_时光影视","name":"影视 | 时光影视[js]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/时光影视.js"}, {"key":"drpy_js_首播影院","name":"影视 | 首播影院[js]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/首播影院.js"}, -{"key":"drpy_js_思古影视","name":"影视 | 思古影视[js]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/思古影视.js"}, {"key":"drpy_js_素白白","name":"影视 | 素白白[js]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/素白白.js"}, {"key":"drpy_js_天空影视","name":"影视 | 天空影视[js]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/天空影视.js"}, {"key":"drpy_js_万能影视","name":"影视 | 万能影视[js]","type":3,"api":"./lib/drpy2.min.js","ext":"./js/万能影视.js"}, diff --git a/js/B站影视.js b/js/B站影视.js index be431935..5502e02c 100644 --- a/js/B站影视.js +++ b/js/B站影视.js @@ -1,7 +1,8 @@ // 搜索验证 var rule = { title:'B站影视', - host:'https://bzhanys.com', + // host:'https://bzhanys.com', + host:'https://bzhanyy.com', // url:'/index.php/vod/show/id/fyclass/page/fypage.html', url:'/index.php/vod/show/id/fyfilter.html', filterable:1,//是否启用分类筛选, @@ -25,7 +26,7 @@ var rule = { }, class_parse: '.fixed-nav&&.flex:lt(4);li&&Text;li&&data-id', play_parse:true, - lazy:"js:var html=JSON.parse(request(input).match(/r player_.*?=(.*?)0){ + try { + any = JSON.stringify(any); + console.log(any); + }catch (e) { + // console.log('print:'+e.message); + console.log(typeof(any)+':'+any.length); + } + }else if(typeof(any)=='object'&&Object.keys(any).length<1){ + console.log('null object'); + }else{ + console.log(any); + } +} + +/*** js自封装的方法 ***/ + +/** + * 获取链接的host(带http协议的完整链接) + * @param url 任意一个正常完整的Url,自动提取根 + * @returns {string} + */ +function getHome(url){ + if(!url){ + return '' + } + let tmp = url.split('//'); + url = tmp[0] + '//' + tmp[1].split('/')[0]; + try { + url = decodeURIComponent(url); + }catch (e) {} + return url +} + +/** + * m3u直播格式转一般直播格式 + * @param m3u + * @returns {string} + */ +function convertM3uToNormal(m3u) { + try { + const lines = m3u.split('\n'); + let result = ''; + let TV=''; + // let flag='#genre#'; + let flag='#m3u#'; + let currentGroupTitle = ''; + lines.forEach((line) => { + if (line.startsWith('#EXTINF:')) { + const groupTitle = line.split('"')[1].trim(); + TV= line.split('"')[2].substring(1); + if (currentGroupTitle !== groupTitle) { + currentGroupTitle = groupTitle; + result += `\n${currentGroupTitle},${flag}\n`; + } + } else if (line.startsWith('http')) { + const splitLine = line.split(','); + result += `${TV}\,${splitLine[0]}\n`; + } + }); + return result.trim(); + }catch (e) { + print(`m3u直播转普通直播发生错误:${e.message}`); + return m3u + } +} + + +const http = function (url, options = {}) { + if(options.method ==='POST' && options.data){ + options.body = JSON.stringify(options.data); + options.headers = Object.assign({'content-type':'application/json'}, options.headers); + } + options.timeout = request_timeout; + if(!options.headers){ + options.headers = {}; + } + let keys = Object.keys(options.headers).map(it=>it.toLowerCase()); + if(!keys.includes('referer')){ + options.headers['Referer'] = getHome(url); + } + if(!keys.includes('user-agent')){ + options.headers['User-Agent'] = UA; + } + console.log(JSON.stringify(options.headers)); + try { + const res = req(url, options); + // if(options.headers['Authorization']){ + // console.log(res.content); + // } + res.json = () => res&&res.content ? JSON.parse(res.content) : null; + res.text = () => res&&res.content ? res.content:''; + return res + }catch (e) { + return { + json() { + return null + }, text() { + return '' + } + } + } +}; +["get", "post"].forEach(method => { + http[method] = function (url, options = {}) { + return http(url, Object.assign(options, {method: method.toUpperCase()})); + } +}); + +function init(ext) { + console.log("当前版本号:"+VERSION); + let data; + if (typeof ext == 'object'){ + data = ext; + print('live ext:object'); + } else if (typeof ext == 'string') { + if (ext.startsWith('http')) { + let ext_paramas = ext.split(';'); + let data_url = ext_paramas[0]; + print(data_url); + data = http.get(data_url).json(); + } + } + print(data); + __ext.data = data; + print('init执行完毕'); +} + +function home(filter) { + let classes = __ext.data.map(it => ({ + type_id: it.url, + type_name: it.name, + })); + print("----home----"); + print(classes); + return JSON.stringify({ 'class': classes}); +} + +function homeVod(params) { + let _get_url = __ext.data[0].url; + let html; + if(__ext.data_dict[_get_url]){ + html = __ext.data_dict[_get_url]; + }else{ + html = http.get(_get_url).text(); + if(/#EXTM3U/.test(html)){ + html = convertM3uToNormal(html); + } + __ext.data_dict[_get_url] = html; + } + let arr = html.match(/.*?,#[\s\S].*?#/g); + let _list = []; + try { + arr.forEach(it=>{ + _list.push({ + vod_name:it.split(',')[0], + vod_id:_get_url+'$'+it.split(',')[0], + vod_pic:def_pic, + vod_remarks:it.split(',')[1], + }); + }); + }catch (e) { + print('Live2cms获取首页推荐发送错误:'+e.message); + } + return JSON.stringify({ 'list': _list }); +} + +function category(tid, pg, filter, extend) { + if(parseInt(pg)>1){ + return JSON.stringify({ + 'list': [], + }); + } + let _get_url = tid; + let html; + if(__ext.data_dict[_get_url]){ + html = __ext.data_dict[_get_url]; + }else{ + html = http.get(_get_url).text(); + if(/#EXTM3U/.test(html)){ + html = convertM3uToNormal(html); + } + __ext.data_dict[_get_url] = html; + } + let arr = html.match(/.*?,#[\s\S].*?#/g); + let _list = []; + try { + arr.forEach(it=>{ + _list.push({ + vod_name:it.split(',')[0], + vod_id:_get_url+'$'+it.split(',')[0], + vod_pic:def_pic, + vod_remarks:it.split(',')[1], + }); + }); + }catch (e) { + print('Live2cms获取一级分类页发生错误:'+e.message); + } + + return JSON.stringify({ + 'page': 1, + 'pagecount': 1, + 'limit': _list.length, + 'total': _list.length, + 'list': _list, + }); +} + +function detail(tid) { // ⛵ 港•澳•台 + let _get_url = tid.split('$')[0]; + let _tab = tid.split('$')[1]; + if(tid.includes('#search#')){ + let vod_play_url = _tab.replace('#search#','')+'$'+_get_url; + print(vod_play_url); + return JSON.stringify({ + list: [{ + vod_id: tid, + vod_name: '搜索:'+_tab.replace('#search#',''), + type_name: "直播列表", + vod_pic: def_pic, + vod_content: tid, + vod_play_from: '来自搜索', + vod_play_url: vod_play_url, + vod_director: tips, + vod_remarks: `道长直播转点播js-当前版本${VERSION}`, + }] + }); + } + let html; + if(__ext.data_dict[_get_url]){ + html = __ext.data_dict[_get_url]; + }else{ + html = http.get(_get_url).text(); + if(/#EXTM3U/.test(html)){ + html = convertM3uToNormal(html); + } + __ext.data_dict[_get_url] = html; + } + let a = new RegExp(`.*?${_tab},#[\\s\\S].*?#`); + let b = html.match(a)[0]; + let c = html.split(b)[1]; + if(c.match(/.*?,#[\s\S].*?#/)){ + let d = c.match(/.*?,#[\s\S].*?#/)[0]; + c = c.split(d)[0]; + } + let arr = c.trim().split('\n'); + let _list = []; + arr.forEach((it)=>{ + if(it.trim()){ + let t = it.trim().split(',')[0]; + let u = it.trim().split(',')[1]; + _list.push(t+'$'+u); + } + }); + // let groups = [[],[],[],[],[],[]]; + // _list.forEach((it)=>{ + // + // }); + let vod_name = __ext.data.find(x=>x.url===_get_url).name; + let vod_play_url = _list.join('#'); + + let vod = { + vod_id: tid, + vod_name: vod_name+'|'+_tab, + type_name: "直播列表", + vod_pic: def_pic, + vod_content: tid, + vod_play_from: vod_name, + vod_play_url: vod_play_url, + vod_director: tips, + vod_remarks: `道长直播转点播js-当前版本${VERSION}`, + }; + + return JSON.stringify({ + list: [vod] + }); +} + +function play(flag, id, flags) { + let vod = { + 'parse': /m3u8/.test(id)?0:1, + 'playUrl': '', + 'url': id + }; + print(vod); + return JSON.stringify(vod); +} + +function search(wd, quick) { + let _get_url = __ext.data[0].url; + let html; + if(__ext.data_dict[_get_url]){ + html = __ext.data_dict[_get_url]; + }else{ + html = http.get(_get_url).text(); + if(/#EXTM3U/.test(html)){ + html = convertM3uToNormal(html); + } + __ext.data_dict[_get_url] = html; + } + let str=''; + Object.keys(__ext.data_dict).forEach(()=>{ + str+=__ext.data_dict[_get_url]; + }); + let links = str.split('\n').filter(it=>it.trim() && it.includes(',')); + links = links.map(it=>it.trim()); + let plays = Array.from(new Set(links)); + print('搜索关键词:'+wd); + print('过滤前:'+plays.length); + plays = plays.filter(it=>it.includes(wd)); + print('过滤后:'+plays.length); + print(plays); + let _list = []; + plays.forEach((it)=>{ + _list.push({ + 'vod_name':it.split(',')[0], + 'vod_id':it.split(',')[1].trim()+'$'+it.split(',')[0].trim()+'#search#', + 'vod_pic':def_pic, + }) + }); + return JSON.stringify({ + 'list': _list + }); +} + +// 导出函数对象 +export default { + init: init, + home: home, + homeVod: homeVod, + category: category, + detail: detail, + play: play, + search: search +} \ No newline at end of file