/* title: 'HDmoli', author: '小可乐/v6.1.1' 说明:可以不写ext,也可以写ext,ext支持的参数和格式参数如下 "ext": { "host": "xxxx", //站点网址 "timeout": 6000 //请求超时,单位毫秒 } */ var HOST; 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 }; const KParams = { headers: { 'User-Agent': MOBILE_UA }, timeout: 5000 }; async function init(cfg) { try { let host = cfg.ext?.host?.trim() || 'https://www.hdmoli.com'; HOST = host.replace(/\/$/, ''); KParams.headers['Referer'] = HOST; let parseTimeout = parseInt(cfg.ext?.timeout?.trim(), 10); KParams.timeout = parseTimeout > 0 ? parseTimeout : 5000; KParams.resHtml = await request(HOST); } catch (e) { console.error('初始化参数失败:', e.message); } } async function home(filter) { try { let resHtml = KParams.resHtml; let classes = pdfa(resHtml, '.nav-list&&a').slice(1, -1).map(it => { let cName = _pdfh(it, 'Text', '分类名'); let cId = _pdfh(it, 'a&&href').match(/(\d+)/)?.[1] ?? '分类值'; return { type_name: cName, type_id: cId }; }); let filters = { "1": [{ "key": "cateId", "name": "类型", "value": [{ "n": "全部", "v": "1" }, { "n": "动作", "v": "6" }, { "n": "喜剧", "v": "7" }, { "n": "爱情", "v": "8" }, { "n": "科幻", "v": "9" }, { "n": "恐怖", "v": "10" }, { "n": "剧情", "v": "11" }, { "n": "战争", "v": "12" }] }, { "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": "纪录片", "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": "美国" }, { "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": "year", "name": "年份", "value": [{ "n": "全部", "v": "" }, { "n": "2026", "v": "2026" }, { "n": "2025", "v": "2025" }, { "n": "2024", "v": "2024" }, { "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" }, { "n": "2016", "v": "2016" }, { "n": "2015", "v": "2015" }, { "n": "2014", "v": "2014" }, { "n": "2013", "v": "2013" }, { "n": "2012", "v": "2012" }, { "n": "2011", "v": "2011" }] }, { "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" }, { "n": "0-9", "v": "0-9" }] }, { "key": "by", "name": "排序", "value": [{ "n": "时间", "v": "time" }, { "n": "评分", "v": "score" }] } ], "2": [{ "key": "cateId", "name": "类型", "value": [{ "n": "全部", "v": "2" }, { "n": "国产剧", "v": "13" }, { "n": "港台剧", "v": "14" }, { "n": "日韩剧", "v": "15" }, { "n": "海外剧", "v": "16" }] }, { "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": "传记", "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": "大陆" }, { "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": "2026", "v": "2026" }, { "n": "2025", "v": "2025" }, { "n": "2024", "v": "2024" }, { "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" }, { "n": "2016", "v": "2016" }, { "n": "2015", "v": "2015" }, { "n": "2014", "v": "2014" }, { "n": "2013", "v": "2013" }, { "n": "2012", "v": "2012" }, { "n": "2011", "v": "2011" }] }, { "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" }, { "n": "0-9", "v": "0-9" }] }, { "key": "by", "name": "排序", "value": [{ "n": "时间", "v": "time" }, { "n": "评分", "v": "score" }] } ], "4": [{ "key": "cateId", "name": "类型", "value": [{ "n": "全部", "v": "4" }, { "n": "国产动漫", "v": "24" }, { "n": "日韩动漫", "v": "25" }, { "n": "港台动漫", "v": "26" }, { "n": "欧美动漫", "v": "27" }] }, { "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": "历史", "v": "历史" }, { "n": "短片", "v": "短片" }, { "n": "国产动漫", "v": "国产动漫" }, { "n": "战斗", "v": "战斗" }] }, { "key": "area", "name": "地区", "value": [{ "n": "全部", "v": "" }, { "n": "大陆", "v": "大陆" }, { "n": "日本", "v": "日本" }, { "n": "美国", "v": "美国" }, { "n": "韩国", "v": "韩国" }, { "n": "西班牙", "v": "西班牙" }, { "n": "其它", "v": "其它" }] }, { "key": "year", "name": "年份", "value": [{ "n": "全部", "v": "" }, { "n": "2026", "v": "2026" }, { "n": "2025", "v": "2025" }, { "n": "2024", "v": "2024" }, { "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" }, { "n": "2016", "v": "2016" }, { "n": "2015", "v": "2015" }, { "n": "2014", "v": "2014" }, { "n": "2013", "v": "2013" }, { "n": "2012", "v": "2012" }, { "n": "2011", "v": "2011" }] }, { "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" }, { "n": "0-9", "v": "0-9" }] }, { "key": "by", "name": "排序", "value": [{ "n": "时间", "v": "time" }, { "n": "评分", "v": "score" }]}]}; return JSON.stringify({ class: classes, filters: filters }); } catch (e) { console.error('获取分类失败:', e.message); return JSON.stringify({ class: [], filters: {} }); } } async function homeVod() { try { let resHtml = KParams.resHtml; 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 cateUrl = `${HOST}/search.php?page=${pg}&searchtype=5&order=${extend?.by ?? ''}&tid=${extend?.cateId || tid}&area=${extend?.area ?? ''}&year=${extend?.year ?? ''}&letter=${extend?.letter ?? ''}&yuyan=&state=&money=&ver=&jq=${extend?.class ?? ''}`; let resHtml = await request(cateUrl); let VODS = getVodList(resHtml); let pagecount = 999; return JSON.stringify({ list: VODS, page: pg, pagecount: pagecount, limit: 30, total: 30 * 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 searchUrl = `${HOST}/search.php?page=${pg}&searchkey=${wd}&searchtype=`; let resHtml = await request(searchUrl); let VODS = getVodList(resHtml); 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 { let kvods = []; let listArr = pdfa(khtml, '.lazyload'); for (let it of listArr) { let kname = _pdfh(it, 'a&&title', '名称'); let kpic = _pdfh(it, 'a&&data-original', '图片'); let kremarks = `${_pdfh(it, '.pic-text&&Text', '无状态')}|${_pdfh(it, '.pic-tag&&Text', '无评分')}`; kvods.push({ vod_name: kname, vod_pic: kpic, vod_remarks: kremarks, vod_id: `${_pdfh(it, 'a&&href')}@${kname}@${kpic}@${kremarks}`, }); } return kvods; } catch (e) { console.error(`生成视频列表失败:`, e.message); return []; } } async function detail(ids) { try { let [id, kname, kpic, kremarks] = ids.split('@'); let detailUrl = !/^http/.test(id) ? `${HOST}${id}` : id; let resHtml = await request(detailUrl); let intros = pdfh(resHtml, '.myui-content__detail'); let ktabs = pdfa(resHtml, '.myui-panel__head :has(h3)&&h3').map((it, idx) => _pdfh(it, 'Text', `线-${idx+1}`)); let kurls = pdfa(resHtml, '.stui-vodlist__text').map(item => { let kurl = pdfa(item, 'a').map(it => { return _pdfh(it, 'a&&title', 'noEpi') + '$' + _pdfh(it, 'a&&href', 'noUrl'); }); return kurl.join('#'); }); let VOD = { vod_id: detailUrl, vod_name: kname, vod_pic: kpic, type_name: cutStrm(intros, '分类:', '', '导演'), vod_actor: cutStrm(intros, '演员:', '

', '主演'), vod_content: _pdfh(resHtml, '.myui-panel-box&&Text', '简介').split(',').slice(1).join(','), vod_play_from: ktabs.join('$$$'), vod_play_url: kurls.join('$$$') }; return JSON.stringify({ list: [VOD] }); } catch (e) { console.error('详情页获取失败:', e.message); return JSON.stringify({ list: [] }); } } function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } async function play(flag, id, flags) { await sleep(5000); return JSON.stringify({ parse: 0, url: `push://${id}` }); } function _pdfh(dom, selector, defaultValue = '') { if (typeof dom !== 'string' || typeof selector !== 'string' || !dom.trim() || !selector.trim()) { return defaultValue; } return (pdfh(dom, selector) || '').replace(/\s+/g, ' ').trim() || defaultValue; } function cutStrm(str, prefix = '', suffix = '', defaultVal = '截取失败') { if (!str || typeof str !== 'string') return defaultVal; const esc = s => String(s).replace(/[.*+?${}()|[\]\\/^]/g, '\\$&'); let [pre, end] = [esc(prefix), esc(suffix)]; let regex = new RegExp(`${pre ? pre : '^'}([^]*?)${end ? end : '$'}`); let result = str.match(regex)?.[1].replace(/<[^>]*?>/g, ' ').replaceAll(' ', ' ').trim().replace(/\s+/g, '/') ?? defaultVal; return result; } function safeParseJSON(jStr) { try { return JSON.parse(jStr); } catch (e) { return null; } } async function request(reqUrl, options = {}) { try { if (typeof reqUrl !== 'string' || !reqUrl.trim()) { throw new Error('reqUrl需为字符串且非空'); } if (typeof options !== 'object' || Array.isArray(options) || !options) { throw new Error('options类型需为非null对象'); } options.method = options.method?.toLowerCase() || 'get'; if (['get', 'head'].includes(options.method)) { delete options.data; delete options.postType; } else { options.data = options.data ?? ''; options.postType = options.postType?.toLowerCase() || 'form'; } let { headers, timeout, charset, toBase64 = false, ...restOpts } = options; const optObj = { headers: (typeof headers === 'object' && !Array.isArray(headers) && headers) ? headers : KParams.headers, timeout: parseInt(timeout, 10) > 0 ? parseInt(timeout, 10) : KParams.timeout, charset: charset?.toLowerCase() || 'utf-8', buffer: toBase64 ? 2 : 0, ...restOpts }; const res = await req(reqUrl, optObj); if (options.withHeaders) { const resHeaders = typeof res.headers === 'object' && !Array.isArray(res.headers) && res.headers ? res.headers : {}; const resWithHeaders = { ...resHeaders, body: res?.content ?? '' }; return JSON.stringify(resWithHeaders); } return res?.content ?? ''; } catch (e) { console.error(`${reqUrl}→请求失败:`, e.message); return options?.withHeaders ? JSON.stringify({ body: '' }) : ''; } } export function __jsEvalReturn() { return { init: init, home: home, homeVod: homeVod, category: category, search: search, detail: detail, play: play, proxy: null }; }