// 本资源来源于互联网公开渠道,仅可用于个人学习爬虫技术。 // 严禁将其用于任何商业用途,下载后请于 24 小时内删除,搜索结果均来自源站,本人不承担任何责任。 import { Crypto as e, _ as t } from "assets://js/lib/cat.js"; let a, o, r, n, s, i, d, c, l, p, u, f = `${o}_3qys_B7k7Dt56Rn`; const _ = "function" == typeof js2Proxy && "function" == typeof desX && "function" != typeof getProxy, v = { "User-Agent": "okhttp/4.12.0" }, y = { "电影": { class: ["动作", "喜剧", "爱情", "科幻", "恐怖", "悬疑", "犯罪", "战争", "动画", "冒险", "历史", "灾难", "纪录", "剧情"], area: ["大陆", "香港", "台湾", "美国", "日本", "韩国", "泰国", "印度", "英国", "法国", "德国", "加拿大", "西班牙", "意大利", "澳大利亚"], year: k(2016, ["2015-2011", "2010-2000", "90年代", "80年代", "更早"]) }, "剧集": { class: ["爱情", "古装", "武侠", "历史", "家庭", "喜剧", "悬疑", "犯罪", "战争", "奇幻", "科幻", "恐怖"], area: ["大陆", "香港", "台湾", "美国", "日本", "韩国", "泰国", "英国"], year: k(2021, ["2020-2016", "2015-2011", "2010-2000", "更早"]) }, "综艺": { class: ["真人秀", "音乐", "脱口秀", "歌舞", "爱情"], area: ["大陆", "香港", "台湾", "美国", "日本", "韩国"], year: k(2011, ["更早"]) }, "动漫": { class: ["冒险", "奇幻", "科幻", "武侠", "悬疑"], area: ["大陆", "日本", "欧美"], year: k(2011, ["更早"]) } }; async function h(e) { try { const t = e.ext; if (a = t.host, o = t.pkg, s = t.sk, n = t.finger, r = String(t.ver), i = t.updateId, d = t.device_id, p = t.filterDef || null, !(a && o && r && i && n && s)) throw new Error(""); c = t.deviceBrand || "vivo", l = t.deviceModel || "V2309A", p = t.filterDef || null } catch (e) { a = 0 } } async function m(e) { if (!a) return; const o = await O(); let r = t.map(o.data.categories, e => ({ type_id: e.type_name, type_name: e.type_name })); const n = {}; for (const e of o.data.categories) { let t = e.type_name, a = e.filter_options && Object.keys(e.filter_options).length > 0 ? e.filter_options : y[t] || null; if (a) { n[t] = []; for (let e in a) { let o = "class" === e ? "类型" : "area" === e ? "地区" : "year" === e ? "年份" : e, r = a[e], s = [{ n: "全部", v: "" }]; r.forEach(e => { s.push({ n: e, v: e }) }); let i = ""; if (p && p[t] && p[t][o]) { const e = p[t][o].split(","); for (const t of e) { const e = t.trim(), a = s.find(t => t.n === e); if (a) { i = a.v; break } } } n[t].push({ key: e, name: o, init: i, value: s }) } } } void 0 !== _ && _ && r.unshift({ type_id: "首页", type_name: "首页" }); const s = []; if (!_) for (const e of o.data.categories) s.push(...J(e.videos)); return JSON.stringify({ class: r, filters: n, list: s }) } async function g() { if (!a) return JSON.stringify({ list: [] }); const e = await O(), t = []; if (e.data) { let a = []; if (Array.isArray(e.data.appCarouselVideos) && a.push(...e.data.appCarouselVideos), Array.isArray(e.data.recommend) && a.push(...e.data.recommend), Array.isArray(e.data.webCarouselVideos) && a.push(...e.data.webCarouselVideos), a.length > 0) { let e = J(a), o = new Set; for (let a = 0; a < e.length; a++) { let r = e[a].vod_id; o.has(r) || (o.add(r), t.push(e[a])) } } else if (e.data.categories) for (const a of e.data.categories) t.push(...J(a.videos)) } return JSON.stringify({ list: t }) } async function $(e, t, o, r) { if ("首页" === e) { const e = JSON.parse(await g()); return JSON.stringify({ list: e.list, page: 1 }) } const n = await C(); let s = `${a}/api.php/app/filter/vod?type_name=${encodeURIComponent(e)}&page=${t}&sort=hits`; if (r) for (let e in r) r[e] && (s += `&${e}=${encodeURIComponent(r[e])}`); const i = await req(s, { headers: n }), d = JSON.parse(i.content); return JSON.stringify({ list: J(d.data), page: parseInt(t) }) } async function w(e, t, o = 1) { const r = await C(), n = `${a}/api.php/app/search/index?wd=${encodeURIComponent(e)}&page=${o}&limit=15`, s = await req(n, { headers: r }), i = JSON.parse(s.content); return JSON.stringify({ list: J(i.data), page: parseInt(o) }) } async function S(e) { const o = await C(), r = await req(`${a}/api.php/app/vod/get_detail?vod_id=${e}`, { headers: o }), n = JSON.parse(r.content), s = n.data[0], i = n.vodplayer || [], d = s.vod_play_from.split("$$$"), c = s.vod_play_url.split("$$$"); let l = []; for (let e = 0; e < d.length; e++) { const a = d[e], o = c[e], r = t.find(i, e => e.from === a); r && l.push({ show_code: a, urls_str: o, player_info: r, sort: void 0 !== r.sort && null !== r.sort ? parseFloat(r.sort) : 999 }) } l.sort((e, t) => e.sort - t.sort); const p = [], u = []; for (const e of l) { const t = e.show_code, a = e.player_info; let o = a.decode_status || 0, r = a.decode_mode || "server", n = a.parse_url || "", s = t; t.toLowerCase() !== a.show.toLowerCase() && (s = `${a.show} (${t})`); const i = []; for (const a of e.urls_str.split("#")) if (a.includes("$")) { const [e, s] = a.split("$"); i.push(`${e}$${t}@@${o}@@${r}@@${encodeURIComponent(n)}@@${s}`) } i.length > 0 && (u.push(i.join("#")), p.push(s)) } const f = { vod_id: s.vod_id.toString(), vod_name: s.vod_name, vod_pic: N(s.vod_pic), vod_remarks: s.vod_remarks, vod_year: s.vod_year, vod_area: s.vod_area, vod_actor: s.vod_actor, vod_director: s.vod_director, vod_content: s.vod_content, vod_play_from: p.join("$$$"), vod_play_url: u.join("$$$"), type_name: s.vod_class }; return JSON.stringify({ list: [f] }) } async function x(e, t, o) { const r = t.split("@@"); let n, s, i, d, c; if (r.length >= 5) n = r[0], s = r[1], i = r[2], d = decodeURIComponent(r[3]), c = r.slice(4).join("@@"); else { const e = t.split("@"); n = e[0], s = e[1], c = e.slice(2).join("@"), i = "server", d = "" } let l = "", p = 0; if ("1" === s) if ("client" === i && d && d.startsWith("http")) { let e = ""; e = d.includes("{url}") ? d.replace("{url}", c) : d + c; try { const t = await req(e, { headers: v, timeout: 15e3 }), a = JSON.parse(t.content); a.url ? l = a.url : a.data && a.data.url && (l = a.data.url) } catch (e) {} } else try { const e = await C(), t = `${a}/api.php/app/decode/url/?url=${encodeURIComponent(c)}&vodFrom=${n}`, o = await req(t, { headers: e, timeout: 3e4 }), r = JSON.parse(o.content); r.data && r.data.startsWith("http") && (l = r.data) } catch (e) {} l || (l = c, /(www\.iqiyi|v\.qq|v\.youku|www\.mgtv|www\.bilibili)\.com/.test(c) && (p = 1)); let u = { jx: p, parse: 0, url: l, header: { "User-Agent": "com.sunshine.tv/1.2.0 (Linux;Android 15) AndroidXMedia3/1.4.1" } }; return JSON.stringify(u) } async function C() { const t = Math.floor(Date.now() / 1e3).toString(), a = A(3, "0123456789"); d || (d = await local.get("cache", f), d && 16 === d.length || (d = A(16), await local.set("cache", f, d))); const p = `finger=${n}&id=${o}&nonce=${a}&sk=${s}&time=${t}&v=${r}`, u = e.SHA256(p).toString().toUpperCase(); let y = { ...v, Accept: "application/json", "x-aid": o, "x-ave": r, "x-time": t, "x-nonc": a, "x-sign": u, "x-device-id": d, "x-device-brand": c, "x-device-model": l, "x-platform": "android", "x-update-id": i }; return _ && (y["Accept-Encoding"] = "gzip"), y } async function O() { if (u) return u; const e = await C(), t = await req(`${a}/api.php/app/index/home`, { headers: e }), o = JSON.parse(t.content).data || {}; return u = { data: { appCarouselVideos: o.appCarouselVideos || [], recommend: o.recommend || [], webCarouselVideos: o.webCarouselVideos || [], categories: o.categories || [] } }, u } function J(e) { return t.map(e, e => { let t = e.type_name || ""; return e.vod_class && (t = t + (t ? "," : "") + e.vod_class), { vod_id: e.vod_id.toString(), vod_name: e.vod_name, vod_pic: N(e.vod_pic || ""), vod_remarks: e.vod_remarks, type_name: t, vod_year: e.vod_year } }) } const N = e => (e || "").replace("https://api.zxki.cn/api/imgfdl?url=", ""); function k(e, t) { let a = (new Date).getFullYear(), o = []; for (; a >= e;) o.push(String(a--)); return [...o, ...t] } function A(e, a = "0123456789abcdef") { let o = ""; for (let r = 0; r < e; r++) o += a[t.random(0, a.length - 1)]; return o } export function __jsEvalReturn() { return { init: h, home: m, homeVod: g, category: $, search: w, detail: S, play: x } }