mirror of
				https://github.com/qist/tvbox.git
				synced 2025-10-29 19:22:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			263 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			263 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // 网站搜索异常
 | |
| import { load, _ } from './lib/cat.js';
 | |
| 
 | |
| let key = '爱上你听书网';
 | |
| let HOST = 'https://wap.230ts.net';
 | |
| let siteKey = '';
 | |
| let siteType = 0;
 | |
| const MOBILE_UA = 'Mozilla/5.0 (Linux; Android 11; M2007J3SC Build/RKQ1.200826.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045714 Mobile Safari/537.36';
 | |
| 
 | |
| async function request(reqUrl, agentSp) {
 | |
|     let res = await req(reqUrl, {
 | |
|         method: 'get',
 | |
|         headers: {
 | |
|             'User-Agent': agentSp || MOBILE_UA,
 | |
|             'Referer': HOST
 | |
|         },
 | |
|     });
 | |
|     return res.content;
 | |
| }
 | |
| 
 | |
| // cfg = {skey: siteKey, ext: extend}
 | |
| async function init(cfg) {
 | |
|     siteKey = cfg.skey;
 | |
|     siteType = cfg.stype;
 | |
| }
 | |
| 
 | |
| async function home(filter) {
 | |
|     const html = await request(HOST + '/sort/');
 | |
|     const $ = load(html);
 | |
|     let filterObj = {};
 | |
|     const class_parse = $('dl.pd-class:first > dd > a[href*=sort]');
 | |
|     let classes = [];
 | |
|     classes = _.map(class_parse, (cls) => {
 | |
|         let typeId = cls.attribs['href'];
 | |
|         typeId = typeId.replace(/.*?\/sort\/(.*).html/g, '$1');
 | |
|         return {
 | |
|             type_id: typeId,
 | |
|             type_name: cls.children[0].data,
 | |
|         };
 | |
|     });
 | |
|     const sortName = ['玄幻有声', '灵异有声', '综艺娱乐', '长篇评书', '都市有声', '军事有声', '职场有声', '其他有声'];
 | |
|     classes = _.sortBy(classes, (c) => {
 | |
|         const index = sortName.indexOf(c.type_name);
 | |
|         return index === -1 ? sortName.length : index;
 | |
|     });
 | |
|     return JSON.stringify({
 | |
|         class: classes,
 | |
|         filters: filterObj,
 | |
|     });
 | |
| }
 | |
| 
 | |
| async function homeVod() {
 | |
|     const link = HOST + '/top/lastupdate/1.html';
 | |
|     const html = await request(link);
 | |
|     const $ = load(html);
 | |
|     const items = $('ul.list-ul > li');
 | |
|     let videos = _.map(items, (item) => {
 | |
|         const it = $(item).find('a:first')[0];
 | |
|         const img = $(item).find('img:first')[0];
 | |
|         const remarks = $($(item).find('p.module-slide-author')[0]).text().trim();
 | |
|         return {
 | |
|             vod_id: it.attribs.href.replace(/.*?\/tingshu\/(.*)/g, '$1'),
 | |
|             vod_name: it.attribs.title.replace('有声小说',''),
 | |
|             vod_pic: HOST + img.attribs['data-original'],
 | |
|             vod_remarks: remarks || '',
 | |
|         };
 | |
|     });
 | |
|     return JSON.stringify({
 | |
|         list: videos,
 | |
|     });
 | |
| }
 | |
| 
 | |
| async function category(tid, pg, filter, extend) {
 | |
|     if (pg <= 0) pg = 1;
 | |
|     const link = HOST + '/sort/' + tid +'/' + (`${pg}`) + '.html';
 | |
|     const html = await request(link);
 | |
|     const $ = load(html);
 | |
|     const items = $('ul.book-ol > li');
 | |
|     let videos = _.map(items, (item) => {
 | |
|         const it = $(item).find('a:first')[0];
 | |
|         const img = $(item).find('img:first')[0];
 | |
|         const remarks = $($(item).find('div.book-meta')[0]).text().trim();
 | |
|         return {
 | |
|             book_id: it.attribs.href.replace(/.*?\/tingshu\/(.*)/g, '$1'),
 | |
|             book_name: it.attribs.title.replace('有声小说',''),
 | |
|             book_pic: HOST + img.attribs['data-original'],
 | |
|             book_remarks: remarks.replace('佚名(著)','').replace('佚名(播)','').replace('未知(著)','').replace('未知(播)','') || '',
 | |
|         };
 | |
|     });
 | |
|     const hasMore = $('div.paging > a:contains(下一页)').length > 0;
 | |
|     const pgCount = hasMore ? parseInt(pg) + 1 : parseInt(pg);
 | |
|     return JSON.stringify({
 | |
|         page: parseInt(pg),
 | |
|         pagecount: pgCount,
 | |
|         limit: 24,
 | |
|         total: 24 * pgCount,
 | |
|         list: videos,
 | |
|     });
 | |
| }
 | |
| 
 | |
| async function detail(id) {
 | |
|     const html = await request(HOST + '/tingshu/' + id);
 | |
|     const $ = load(html);
 | |
|     const detail = $('div.book-cell:first > div');
 | |
|     let vod = {
 | |
| 		audio:1,
 | |
|         book_id: id,
 | |
|         type_name: $('h1:first').text().trim().replace('有声小说',''),
 | |
|         // vod_pic: HOST + $('div.myui-content__thumb img:first').attr('data-original'),
 | |
|         // vod_content: $('div.ellipsis').text().trim(),
 | |
|         book_year: '',
 | |
|         book_area: '',
 | |
|         book_remarks: '',
 | |
|         book_actor: '',
 | |
|         book_director: '',
 | |
|         book_content: '',
 | |
|     };
 | |
|     // for (const info of detail) {
 | |
|     //     const i = $(info).text().trim();
 | |
|     //     if (i.startsWith('类型:')) {
 | |
|     //         vod.vod_type = _.map($(info).find('a'), (a) => {
 | |
|     //             return a.children[0].data;
 | |
|     //         }).join('/');
 | |
|     //     } else if (i.startsWith('作者:')) {
 | |
|     //         vod.vod_director = _.map($(info).find('a'), (a) => {
 | |
|     //             return a.children[0].data;
 | |
|     //         }).join('/');
 | |
|     //     } else if (i.startsWith('演播:')) {
 | |
|     //         vod.vod_actor = _.map($(info).find('a'), (a) => {
 | |
|     //             return a.children[0].data;
 | |
|     //         }).join('/');
 | |
|     //     } else if (i.startsWith('连载中')) {
 | |
|     //         vod.vod_remarks = i.substring(3);
 | |
|     //     }
 | |
|     // }
 | |
|     const playlist = _.map($('#playlist > ul > li > a'), (it) => {
 | |
|         return it.children[0].data + '$' + it.attribs.href.replace(/\/mp3\/(.*).html/g, '$1');
 | |
|     }).join("#");
 | |
|     vod.volumes = '道长在线';
 | |
|     vod.urls = playlist;
 | |
|     // vod.vod_play_from = '道长在线';
 | |
|     // vod.vod_play_url = playlist.join('#');
 | |
|     return JSON.stringify({
 | |
|         list: [vod],
 | |
|     });
 | |
| }
 | |
| 
 | |
| async function play(flag, id, flags) {
 | |
|     const link = HOST + '/mp3/' + id + '.html';
 | |
|     const html = await request(link);
 | |
|     const $ = load(html);
 | |
|     const iframe = $('body iframe[src*=player]');
 | |
|     const iframeHtml = (
 | |
|         await req(HOST + iframe[0].attribs.src, {
 | |
|             headers: {
 | |
|                 'Referer': link,
 | |
|                 'User-Agent': MOBILE_UA,
 | |
|             },
 | |
|         })
 | |
|     ).content;
 | |
|     const playUrl = iframeHtml.match(/mp3:'(.*?)'/)[1];
 | |
|     if (playUrl.indexOf('m4a') >= 0 || playUrl.indexOf('mp3') >= 0 ) {
 | |
|         return JSON.stringify({
 | |
|             parse: 0,
 | |
|             url: playUrl,
 | |
|         });
 | |
|     } else {
 | |
|         try {
 | |
|             const iframeHtml = (
 | |
|                 await req(HOST + iframe[0].attribs.src, {
 | |
|                     headers: {
 | |
|                         'Referer': link,
 | |
|                         'User-Agent': MOBILE_UA,
 | |
|                     },
 | |
|                 })
 | |
|             ).content;
 | |
|             const playUrl = playUrl + '.m4a' + iframeHtml.match(/(\?.*?)'/)[1];
 | |
|             if (playUrl.indexOf('http') >= 0) {
 | |
|                 return JSON.stringify({
 | |
|                     parse: 0,
 | |
|                     url: playUrl,
 | |
|                 });
 | |
|             } else {
 | |
|                 const iframeHtml = (
 | |
|                     await req(HOST + iframe[0].attribs.src, {
 | |
|                         headers: {
 | |
|                             'Referer': link,
 | |
|                             'User-Agent': MOBILE_UA,
 | |
|                         },
 | |
|                     })
 | |
|                 ).content;
 | |
|                 const playUrl2 = iframeHtml.match(/url[\s\S]*?(http.*?)'/)[1];
 | |
|                 if (playUrl2.indexOf('\?') >= 0) {
 | |
|                     return JSON.stringify({
 | |
|                         parse: 0,
 | |
|                         url: playUrl2,
 | |
|                     });
 | |
|                 } else {
 | |
|                     const playUrl3 = playUrl2 + playUrl
 | |
|                     return JSON.stringify({
 | |
|                         parse: 0,
 | |
|                         url: playUrl3,
 | |
|                     });
 | |
|                 }
 | |
|             }
 | |
|         } catch (e) {}
 | |
|         if (playUrl.indexOf('http') >= 0) {
 | |
|             const playUrl = playUrl + '.m4a';
 | |
|             return JSON.stringify({
 | |
|                 parse: 0,
 | |
|                 url: playUrl,
 | |
|             });
 | |
|         } else {
 | |
|             const iframeHtml = (
 | |
|                 await req(HOST + iframe[0].attribs.src, {
 | |
|                     headers: {
 | |
|                         'Referer': link,
 | |
|                         'User-Agent': MOBILE_UA,
 | |
|                     },
 | |
|                 })
 | |
|             ).content;
 | |
|             const playUrl4 = iframeHtml.match(/url[\s\S]*?(http.*?)'/)[1];
 | |
|             return JSON.stringify({
 | |
|                 parse: 0,
 | |
|                 url: playUrl4 + '.m4a',
 | |
|             });
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| async function search(wd, quick) {
 | |
|     const link = HOST + '/search.html?searchtype=name&searchword=' + wd +'&page=1';
 | |
|     const html = await request(link);
 | |
|     const $ = load(html);
 | |
|     const items = $('ul.book-ol > li');
 | |
|     let videos = _.map(items, (item) => {
 | |
|         const it = $(item).find('a:first')[0];
 | |
|         const img = $(item).find('img:first')[0];
 | |
|         const remarks = $($(item).find('div.book-meta')[0]).text().trim();
 | |
|         return {
 | |
|             book_id: it.attribs.href.replace(/.*?\/tingshu\/(.*)/g, '$1'),
 | |
|             book_name: it.attribs.title.replace('有声小说',''),
 | |
|             book_pic: img.attribs['data-original'],
 | |
|             book_remarks: remarks.replace('佚名(著)','').replace('佚名(播)','').replace('未知(著)','').replace('未知(播)','') || '',
 | |
|         };
 | |
|     });
 | |
|     return JSON.stringify({
 | |
|         list: videos,
 | |
|     });
 | |
| }
 | |
| 
 | |
| export function __jsEvalReturn() {
 | |
|     return {
 | |
|         init: init,
 | |
|         home: home,
 | |
|         homeVod: homeVod,
 | |
|         category: category,
 | |
|         detail: detail,
 | |
|         play: play,
 | |
|         search: search,
 | |
|     };
 | |
| }
 |