From e669acbb323f8b381b5c250e6a436d25cc67895d Mon Sep 17 00:00:00 2001 From: ygbhbox Date: Tue, 23 Dec 2025 11:15:17 +0000 Subject: [PATCH] xpg.js created online with Bitbucket --- TVBoxOSC/tvbox/js/xpg.js | 136 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 TVBoxOSC/tvbox/js/xpg.js diff --git a/TVBoxOSC/tvbox/js/xpg.js b/TVBoxOSC/tvbox/js/xpg.js new file mode 100644 index 0000000..d5dec81 --- /dev/null +++ b/TVBoxOSC/tvbox/js/xpg.js @@ -0,0 +1,136 @@ + +let host = 'http://asp.xpgtv.com'; +let headers = { + "User-Agent": "okhttp/3.12.11" +}; + +async function init(cfg) {} + +function getList(data) { + let videos = []; + data.forEach(vod => { + let r = vod.updateInfo ? "更新至" + vod.updateInfo : ""; + videos.push({ + "vod_id": vod.id.toString(), + "vod_name": vod.name, + "vod_pic": vod.pic, + "vod_remarks": r || (vod.score ? vod.score.toString() : "") + }); + }); + return videos; +} + +async function home(filter) { + let url = host + "/api.php/v2.vod/androidtypes"; + let resp = await req(url, { headers: headers }); + let data = JSON.parse(resp.content); + let dy = { "classes": "类型", "areas": "地区", "years": "年份", "sortby": "排序" }; + let demos = ['时间', '人气', '评分']; + let classes = []; + let filters = {}; + + data.data.forEach(item => { + let typeId = item.type_id.toString(); + classes.push({ "type_name": item.type_name, "type_id": typeId }); + item['sortby'] = ['updatetime', 'hits', 'score']; + let filterArray = []; + for (let key in dy) { + if (item[key] && item[key].length > 1) { + let values = []; + item[key].forEach((val, idx) => { + let vStr = val.toString().trim(); + if (vStr !== "") { + values.push({ "n": key === "sortby" ? demos[idx] : vStr, "v": vStr }); + } + }); + let fKey = key === "areas" ? "areaes" : (key === "years" ? "yeares" : key); + filterArray.push({ "key": fKey, "name": dy[key], "value": values }); + } + } + filters[typeId] = filterArray; + }); + return JSON.stringify({ class: classes, filters: filters }); +} + +async function homeVod() { + let url = host + "/api.php/v2.main/androidhome"; + let resp = await req(url, { headers: headers }); + let data = JSON.parse(resp.content); + let videos = []; + data.data.list.forEach(i => { videos = videos.concat(getList(i.list)); }); + return JSON.stringify({ list: videos }); +} + +async function category(tid, pg, filter, extend) { + let params = { "page": pg, "type": tid, "area": extend.areaes || '', "year": extend.yeares || '', "sortby": extend.sortby || '', "class": extend.classes || '' }; + let query = Object.keys(params).filter(k => params[k] !== '').map(k => k + '=' + encodeURIComponent(params[k])).join('&'); + let url = host + '/api.php/v2.vod/androidfilter10086?' + query; + let resp = await req(url, { headers: headers }); + let data = JSON.parse(resp.content); + return JSON.stringify({ list: getList(data.data), page: parseInt(pg), pagecount: 9999, limit: 90, total: 999999 }); +} + +async function detail(id) { + let url = host + '/api.php/v3.vod/androiddetail2?vod_id=' + id; + let resp = await req(url, { headers: headers }); + let data = JSON.parse(resp.content).data; + + // 过滤掉包含“及时雨”的选集 + let filteredUrls = data.urls.filter(i => !i.key.includes("及时雨")); + let playlist = filteredUrls.map(i => i.key + '$' + i.url).join('#'); + + let vod = { + 'vod_id': id, + 'vod_name': data.name, + 'vod_year': data.year, + 'vod_area': data.area, + 'vod_lang': data.lang, + 'type_name': data.className, + 'vod_actor': data.actor, + 'vod_director': data.director, + 'vod_content': data.content, + 'vod_play_from': '宝盒精选线路', + 'vod_play_url': playlist + }; + + return JSON.stringify({ list: [vod] }); +} + +async function search(wd, quick, pg) { + let page = pg || '1'; + let url = host + '/api.php/v2.vod/androidsearch10086?page=' + page + '&wd=' + encodeURIComponent(wd); + let resp = await req(url, { headers: headers }); + let data = JSON.parse(resp.content); + return JSON.stringify({ list: getList(data.data), page: page }); +} + +// --- 重点修改:更新为 1.5.7 最新播放头 --- +async function play(flag, id, flags) { + let playUrl = id; + if (!id.startsWith('http')) { + playUrl = "http://c.xpgtv.net/m3u8/" + id + ".m3u8"; + } + + // 1:1 还原你提供的 PHP 数组头 + const playHeader = { + 'user_id': 'XPGBOX', + 'token2': 'SnAXiSW8vScXE0Z9aDOnK5xffbO75w1+uPom3WjnYfVEA1oWtUdi2Ihy1N8=', + 'version': 'XPGBOX com.phoenix.tv1.5.7', + 'hash': 'd78a', + 'screenx': '2345', + 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/117.0.0.0 Safari/537.36', + 'token': 'ElEDlwCVgXcFHFhddiq2JKteHofExRBUrfNlmHrWetU3VVkxnzJAodl52N9EUFS+Dig2A/fBa/V9RuoOZRBjYvI+GW8kx3+xMlRecaZuECdb/3AdGkYpkjW3wCnpMQxf8vVeCz5zQLDr8l8bUChJiLLJLGsI+yiNskiJTZz9HiGBZhZuWh1mV1QgYah5CLTbSz8=', + 'timestamp': '1743060300', + 'screeny': '1065', + 'Accept': '*/*', + 'Connection': 'keep-alive' + }; + + return JSON.stringify({ + parse: 0, + url: playUrl, + header: playHeader // 传给播放器挂载请求 + }); +} + +export default { init, home, homeVod, category, detail, search, play };