/* title: '厂长资源', author: '小可乐/v6.1.1' 说明:可以不写ext,也可以写ext,ext支持的参数和格式参数如下 "ext": { "host": "xxxx", //站点网址 "timeout": 6000 //请求超时,单位毫秒 } */ const MOBILE_UA = 'Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36'; const DefHeader = {'User-Agent': MOBILE_UA}; var HOST; var KParams = { headers: {'User-Agent': MOBILE_UA}, timeout: 5000 }; async function init(cfg) { try { HOST = (cfg.ext?.host?.trim() || 'https://www.cz01.org').replace(/\/$/, ''); KParams.headers['Referer'] = HOST; let parseTimeout = parseInt(cfg.ext?.timeout?.trim(), 10); if (parseTimeout > 0) {KParams.timeout = parseTimeout;} } catch (e) { console.error('初始化参数失败:', e.message); } } async function home(filter) { try { let kclassName = '全部$movie_bt&电影$movie_bt_series/dyy&剧集$movie_bt_series/dianshiju&动画$movie_bt_series/dohua'; let classes = kclassName.split('&').map(it => { let [cName, cId] = it.split('$'); return {type_name: cName, type_id: cId}; }); let filters = {}; try { const nameObj = { cateId: 'cateId,分类', area: 'area,地区', year: 'year,年份', class: 'class,影片类型', series: 'series,子类'}; const flValues = { cateId: {'movie_bt_series/dyy': '全部$movie_bt_series/dyy&豆瓣电影Top250$dbtop250&最新电影$zuixindianying&高分影视$gaofenyingshi&热映中$reyingzhong&会员专区$movie_bt_series/huiyuanzhuanqu&站长推荐$movie_bt_series/zhanchangtuijian&华语电影$movie_bt_series/huayudianying&欧美电影$movie_bt_series/meiguodianying&韩国电影$movie_bt_series/hanguodianying&日本电影$movie_bt_series/ribendianying&印度电影$movie_bt_series/yindudianying&俄罗斯电影$movie_bt_series/eluosidianying&加拿大电影$movie_bt_series/jianadadianying', 'movie_bt_series/dianshiju': '全部$movie_bt_series/dianshiju&国产剧$gcj&美剧$meijutt&韩剧$hanjutv&日剧$movie_bt_series/rj&海外剧$movie_bt_series/hwj', 'movie_bt_series/dohua': '全部$movie_bt_series/dohua&剧场版$dongmanjuchangban&番剧$fanju'}, area: {'movie_bt': '全部$&中国台湾$tw&中国大陆$zh&中国香港$hk&丹麦$dm&乌克兰$wukelan&以色列$ysl&伊朗$yilang&俄罗斯$els&保加利亚$baojialiya&其他$qt&冰岛$冰岛&利比里亚$libiliya&加拿大$jnd&匈牙利$xiongyali&南非$nanfei&卡塔尔$kataer&卢森堡$lusenbao&印度$yidu&印度尼西亚$yindunixiya&哈萨克斯坦$hasakesitan&哥伦比亚$gelunbiya&土耳其$tuerqi&埃及$aiji&塞尔维亚$塞尔维亚&塞浦路斯$saipulusi&墨西哥$mxg&奥地利$aodili&巴哈马$bahama&巴基斯坦$bajisitan&巴西$bx&希腊$xila&德国$dg&意大利$ydl&拉脱维亚$拉脱维亚&挪威$nuewei&捷克$jieke&摩洛哥$moluoge&摩纳哥$monage&新加坡$xinjiapo&新西兰$xinxilan&日本$riben&柬埔寨$jianpuzhai&比利时$bilishi&法国$fg&波兰$bolan&泰国$taiguo&澳大利亚$adly&爱尔兰$aierlan&瑞典$ruidian&瑞士$ruishi&白俄罗斯$baieluosi&立陶宛$立陶宛&罗马尼亚$luomaniya&美国$meiguo&芬兰$fenlan&英国$yinguo&荷兰$hnwe&蒙古$menggu&西德$xide&西班牙$xby&越南$yuenan&阿根廷$agenting&阿联酋$alianqiu&韩国$hggggg&马来西亚$malaixiya&马耳他$maerta&黎巴嫩$libanen'}, year: {'movie_bt': '全部$&1900~2000年代$19002000nd&2001~2010年代$20012010nd&2011$2011nd&2012$2012&2013$2013&2014$2014&2015$2015&2016$2016&2017$2017&2018$2018&2019$2019&2020$2020&2021$2021&2022$2022&2023$2023&2024$2024&2025$2025&2026$2026'}, class: {'movie_bt': '全部$&传记$chuanji&儿童$etet&冒险$maoxian&剧情$juqing&动作$dozuo&动漫$doman&动画$dhh&历史$lishi&古装$guzhuang&同性$tongxing&喜剧$xiju&奇幻$qihuan&家庭$jiating&恐怖$kubu&悬疑$xuanyi&情色$qingse&惊悚$kingsong&战争$zhanzheng&歌舞$gw&武侠$wuxia&灾难$zainan&爱情$aiqing&犯罪$fanzui&真人秀$zrx&短片$dp&科幻$kh&纪录片$jlpp&西部$xb&运动$yd&音乐$yy&鬼怪$鬼怪'}, series: {'movie_bt': '全部$&会员专区$huiyuanzhuanqu&站长推荐$zhanchangtuijian&电影$dyy&华语电影$huayudianying&欧美电影$meiguodianying&韩国电影$hanguodianying&日本电影$ribendianying&印度电影$yindudianying&俄罗斯电影$eluosidianying&加拿大电影$jianadadianying&电视剧$dianshiju&国产剧$guochanju&美剧$mj&韩剧$hj&日剧$rj&海外剧(其他)$hwj&动画$dohua'} }; for (let item of classes) { filters[item.type_id] = Object.entries(nameObj).map(([nObjk, nObjv]) => { let [kkey, kname] = nObjv.split(','); let fvalue = flValues[kkey]?.[item.type_id]?.split('&') || []; let kvalue = fvalue.map(it => { let [n, v] = it.split('$'); return {n: n, v: v}; }); return {key: kkey, name: kname, value: kvalue}; }).filter(flt => flt.key && flt.value.length); } } catch (e) { filters = {}; } return JSON.stringify({class: classes, filters: filters}); } catch (e) { console.error('获取分类失败:', e.message); return JSON.stringify({class: [], filters: {}}); } } async function homeVod() { try { let resHtml = await request(HOST); let VODS = getVodList(resHtml); return JSON.stringify({list: VODS}); } catch (e) { console.error('推荐页获取失败:', e.message); return JSON.stringify({list: []}); } } async function category(tid, pg, filter, extend) { try { pg = parseInt(pg, 10), pg = pg > 0 ? pg : 1; let fl = extend ? extend : {}; let cateUrl = `${HOST}/${fl.cateId || tid}${fl.area ? `/movie_bt_cat/${fl.area}` : ''}${fl.year ? `/year/${fl.year}` : ''}${fl.class ? `/movie_bt_tags/${fl.class}` : ''}${fl.series ? `/movie_bt_series/${fl.series}` : ''}/page/${pg}`; let resHtml = await request(cateUrl); let VODS = getVodList(resHtml); let limit = VODS.length; let hasMore = cutStr(resHtml, 'pagenavi_txt">', '').includes('>'); let pagecount = hasMore ? pg + 1 : pg; return JSON.stringify({list: VODS, page: pg, pagecount: pagecount, limit: limit, total: limit*pagecount}); } catch (e) { console.error('类别页获取失败:', e.message); return JSON.stringify({list: [], page: 1, pagecount: 0, limit: 30, total: 0}); } } async function search(wd, quick, pg) { try { pg = parseInt(pg, 10), pg = pg > 0 ? pg : 1; let VODS = []; let searchStop = false, cPage = 1, pgMax = 228; while (!searchStop && cPage < pgMax) { let batchEnd = Math.min(cPage + 10, pgMax); let batchUrlList = []; for (let page = cPage; page < batchEnd; page++) { batchUrlList.push(`${HOST}/movie_bt/page/${page}`); } let resHtmlList = await Promise.all( batchUrlList.map(async (burl) => { try {return await request(burl);} catch (sErr) {return '';} }) ); for (let resHtml of resHtmlList) { let svods = getVodList(resHtml).filter(it => it.vod_name.includes(wd)); if (svods.length) {VODS.push(...svods)}; } if (VODS.length) {searchStop = true;} cPage = batchEnd; } return JSON.stringify({list: VODS, page: pg, pagecount: 10, limit: 30, total: 300}); } catch (e) { console.error('搜索页获取失败:', e.message); return JSON.stringify({list: [], page: 1, pagecount: 0, limit: 30, total: 0}); } } function getVodList(khtml) { try { if (!khtml) {throw new Error('源码为空');} let kvods = []; let listArr = cutStr(khtml, '