This commit is contained in:
Liu committed 2026-01-20 02:40:41 +08:00
1 parent f4d7dfae4b
commit f406764297
55 files changed
+23695 -22718

No files matched your search

-19
View File
@@ -84,25 +84,6 @@
"filterable": 1,
"ext": "7lj763gg402i7942463j9j9jh8579590k3hjii5gi4i73l2k5l"
},
{
"key": "狂风",
"name": "🌪狂风",
"type": 3,
"api": "csp_Qiji",
"playerType": 2,
"ext": "7lj763gg402i7942522l99jhh90ljii5g1l09i13i39g2l6i514l56l1li1k5107159113h6945h8g91351kgkijl5l315g8l3656756kjk698gi689125k773lg5k6hl2l3i1g3gk5l1g5l8g5h06018gkh1l7559h9lk6j26hkk694g29k309h3i070l3i3197"
},
{
"key": "橘子",
"name": "🍊橘子",
"type": 3,
"api": "csp_Qiji",
"playerType": 2,
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"ext": "7lj763gg402i79425h3l90jgh14i9ijik6h8i75lj8i73l2l4k6g48lhgl2k4j3j2kik7l83gj54h687390196j0lkgg21l1i3552i7ij087ijj9258721g03lll"
},
{
"key": "驿站",
"name": "🚗驿站",
+41 -58
View File
@@ -4,7 +4,7 @@
"sites": [
{
"key": "豆豆",
"name": "🌈热播┃项目链接>:https://link3.cc/lovemm",
"name": "🌈热播┃网盘线路晚高峰不卡!项目链接>:https://link3.cc/lovemm",
"type": 3,
"quickSearch": 0,
"filterable": 0,
@@ -127,6 +127,13 @@
"searchable": 0,
"ext": ""
},
{
"key": "csp_Living",
"name": "🎮聚合┃直播",
"type": 3,
"api": "csp_Living",
"ext": "https://lemonlive-api-1.deno.dev"
},
{
"key": "88看球",
"name": "🏀看球┃直播",
@@ -167,13 +174,6 @@
"host": "https://cms99api.ystva.com"
}
},
{
"key": "聚搜2",
"name": "🚗JUSOU┃1080P",
"type": 3,
"api": "./api/AppToV5.py",
"ext": "http://118.89.203.120:8365/"
},
{
"key": "巧技2",
"name": "💢聚搜┃1080P✨",
@@ -185,39 +185,9 @@
"jar": "./jars/巧技2.jar",
"ext": "7lj763gg402i7942412h849jg1558j9jl8g19213il86316k465719lik158491h179312h4934183ig2l05g9"
},
{
"key": "爆炸",
"name": "🎴爆炸┃1080P",
"type": 3,
"api": "csp_AppGetV2",
"changeable": "1",
"quickSearch": 0,
"filterable": 1,
"ext": "pghUv+IPbIqGFEhny2nIStK3kvYuQF1lj98M0YXLH7Vmu8vVscTp5N3ez4yblkrSfdCHlm4BW9GfqxpmOugdHzmaIMUcG6iFE2QkGiogg/EkrBoFyqPlXfgqCnwvnkLTwIm6HlAJq81hOBdm8KYMAenzS1FXuj3q8/Rbai4OcSMAWvA2Wl8uB576gCLKVN0lFUFcvAYefFSkfhF9f0iyDuG/LBv87IIBNwyVB/MgWEuUwwoBhSfvjS09Mc9Ic7G4yBz6TguFIQ5Xqa2xQBGjFYb4nDoygkIbt3a7bQGmktJxEHdOhhm8nYvhDe9+/8HB7EJgHSlT5hnLoCgqcFHLqn+oof8StNPQo8Pjjik3L4VEfTfCYWaN7ZFWASzTkPIr"
},
{
"key": "橘子",
"name": "🎴JUZI┃1080P",
"type": 3,
"api": "csp_AppGetV2",
"changeable": "1",
"quickSearch": 0,
"filterable": 1,
"ext": "FNc7O3Sq/hxz7uCzbccPTwmKS9QhqbhDC5J/tBK99TWfK0aEwzyajhrUANmtu0o/w36kBG8LM77XaSazDF+/gYPfNaL4qTRYwqUKxL4cr84pssT9H168H7YT0HD1jUpcBYXSFfirex66s9O56hHTJCavdCBPyAY+K1jwYeoEEhGWSCLhW+JJBxU7rItkKh2VHMg4vh/A7M+5ydA1fIuNP8T5JR3+475o6yUWkUH7nv/8uqjmZKhq70mQZTaMPiVaBqG+SL9NKYo5Yk4vpsUBErE2uzducc78nK0PT5ShRhLv6POBMNNZZN+/O0MFX+83BqCWsbHMNipM5zOIja/xr2x14WPH7BDlUqkw9w105US6oRwZ8jtdS0cvn5u4BT9W14rSUBAMy36xrjYR3f1OUkmlIvz6sC8OAagD/CRSwFYrh9zbMvw5V2ntYK+wDdiIq6HTkXG/86MN6lYEHkEAC4sYoxBpS5KaPlDFoOo5ED4="
},
{
"key": "爱营",
"name": "🎴AIYIN┃1080P",
"type": 3,
"api": "csp_AppGetV2",
"changeable": "1",
"quickSearch": 0,
"filterable": 1,
"ext": "N/01JeZBCBEQ0wOXNuAI/kwsk5p8MqEDFtLQfMnVixAS3aeDEPdCV317OImxNn6T3Hb5VmwFLOhgFAQJ+is4HZ3ndDCtqOfPVULszPg13PiW+RHbzH5TtSdAiFfw0D1dLa7TDpTcFxuXv5MJI8925dg51pBjkSqNZt8Jz0nbRDK8eQSoCbsw2I93ke+olS9cVWkurB8mwxms5nD8AqSV4eHdYOwwU2q4ln6jV8KEyhnOHxJEjNLT8hk0SFdgLqRwqbqyl6kSqmTlPX681FYZnBN19r49ojprcBeFmLUB3Rn0LrpWzz0zIeycV8N00oXiCh5kd2caQMyUPPWdyfQbKwV6V+6dQAKtSNoTpxRNGqTimifZEJFGizQMko6AQpQpW0FHr7B3gLmmiknNMWJe/gcG7lhWSAiIGzxVnzBhCmSlOKB3sq/tAQSBrPNWKpSNFx5prQHKpStELIHAnqdNUS31u0xrGq9ejUdadgR9pxO6QcCHk0Ln0tnUA69uiJ9q1udCFx8+5i+c320rpMKGnA=="
},
{
"key": "QD4K",
"name": "🐷猪猪┃影视",
"name": "🐷猪猪┃1080P",
"type": 3,
"searchable": 1,
"quickSearch": 0,
@@ -229,6 +199,16 @@
"apisignkey": "lvdoutv-1.0.0"
}
},
{
"key": "爱营",
"name": "🎴爱影┃1080P",
"type": 3,
"api": "csp_AppGetV2",
"changeable": "1",
"quickSearch": 0,
"filterable": 1,
"ext": "pghUv+IPbIqGFEhny2nISuI5KzOEA1E0lc1jMsyog/OYwSADcPIna2eOlbOHVLkxfaciWdUITQtbDmt+qom9EMJRiVaiwwN4fq/9mc2DAAgugdkhTXND+52hgm3ggj65qar4TjeNrCTAD/U6Er0wTLydN68QCGnUP+Az4vpxMIKNJutdzRf+Z5rYQtKX8IglZ92N7G1shuFGXBEngnUmpPhCqPzJHH3gm+Q/sNjl2Camb0qGi8XDNhl4cGORH0dvvpkHLhEzZ+1+/9LwxcTPrLUUJLtYVjCfcGT/jJT24JXrJfVWm+WngZXr8IjU/Apk0ZoHUAmte8/dLlplNyNafu3Tb3FgGkrRS0eVyWUB3d8="
},
{
"key": "顾我",
"name": "🎴顾我┃1080P",
@@ -237,7 +217,7 @@
"changeable": "1",
"quickSearch": 0,
"filterable": 1,
"ext": "FNc7O3Sq/hxz7uCzbccPTwmKS9QhqbhDC5J/tBK99TXBAOG5IeeHo7xSXryC0vBoO5B1l2XmjJKdkeCZu5v1UxCZcIXe/1cmcBYcHAk746JE1FosonleIPqUFKByjhLwUU1doZS06jAVhSjz7X90y5GWmFqHmqD7ArxYzUSMQxyKerhNQ2ZWaJ2ka4jFMRPVVDQrBge5CgBGsw/HTb/+Q12qdcSTymLUN/cfwoUZ4uqBcSPbxSIrB4znIU2PcCtnX14vLtsWp1u/cbGV+kP8486YY8kGEs2qq+T34UaXBZf9Kk1t0Qt6yrj57yptwkeJXa2gK176ebs/D71tmX2ErBjije7pqwpRtEmeAmBWxohh9kLrGdh97ODRSzyNYE93Ai7nbGoskd/2r1Uu5NLCEqCIBBhH1qI6Jl/jWIVcngIDBm5KoTPs1ZxNWEqnOyP8nf8FuHZkRp/o26HL5LXb17UOkCmecqDKg3vjcnBKPNg="
"ext": "N/01JeZBCBEQ0wOXNuAI/kwsk5p8MqEDFtLQfMnVixDNodW6h3yknJ0O47HN+ySzcqHSPQtTeHgAvnMVMolGPqTNRfEJ/8Ig5H0hTsHFjNFIfIj6CZ3MehTe7ks7NBA9mkCsDFeQI7u6Fapavayh76Kn9daiTSr08UO1N+PNA3Nwz0nVRPNP7X/2+t7BC6YAArHVuO75i4MCgmh+b7O3JRvsgQiH6DhYzb+nWPjyLhUjTBKtCCTAyJY5L+b3nxdZCBROsMaWBDl7ZKgI9+1OQRRvjXJsuM95dvSGbkjYeMRw9qTwOnuog2JiDxtdYYCzXs3hPlDuOBvOnV9kLm455GYR/47kZIGTKIhm6e+eP72visnIQN7vtrmlxLKDvTvoKF+EsSRau+9N2o1ZV84mlDU0Lrh+caSZHfMdbWIkjkzYT6Dc3CIxrYlzEicxgWhk/zwpwGjcYAf/6SF/iGvP+s8aGbHMVb01IDRKcdAh1fY="
},
{
"key": "仓鼠",
@@ -271,17 +251,17 @@
},
{
"key": "JINPAI",
"name": "🍥JINPIA┃1080P",
"name": "🍥金牌┃1080P",
"type": 3,
"api": "csp_AppGetV2",
"changeable": "1",
"quickSearch": 0,
"filterable": 1,
"ext": "N/01JeZBCBEQ0wOXNuAI/kwsk5p8MqEDFtLQfMnVixDB3xui1lDymx4fnoCgxm59NbdMM2FDEd1LoNOCZvedKAplW6Go0JtGfzXnn65Pg1kPIthOoYoQWgY/lKhQKzzcLQKb1ezm1qhhKR/lEhfm+EbojsfeaAOeOaSCVPPzSkVw2DmHMhYv+yWi9ExOHyfuXX1csfF6G/UWPw12lFNeElpZMAUAQG2LEcbRadEvVmNm3YDM07Dn4F8Fcvsnb08MRb3GO2sEZSdjqf85kk1tVNb5zdfho1F01S/Cvzp4Lz+TE9ttJdTPredSWbGdEqE6nSkfEYZvFEnCD8bleLRdOPik/WqX5gPv+gSRakGrrGx7FwM3Ase0Bd8sy6ZfJqfs8IllB1ckfC0POuFEmprDW4ERNmIFJHsZcS128w9xhNUrtuPnocdErRw7+shj+W3Hc4pGqZpprTTxaXp9zA+HcGj/qeNIOXt32yoDOnpy9SOHNSvD4Joue4EcTCkqnJoC"
"ext": "N/01JeZBCBEQ0wOXNuAI/kwsk5p8MqEDFtLQfMnVixDB3xui1lDymx4fnoCgxm59NbdMM2FDEd1LoNOCZvedKAplW6Go0JtGfzXnn65Pg1kPIthOoYoQWgY/lKhQKzzcLQKb1ezm1qhhKR/lEhfm+EbojsfeaAOeOaSCVPPzSkVw2DmHMhYv+yWi9ExOHyfuXX1csfF6G/UWPw12lFNeElpZMAUAQG2LEcbRadEvVmNm3YDM07Dn4F8Fcvsnb08MRb3GO2sEZSdjqf85kk1tVNb5zdfho1F01S/Cvzp4Lz84cQdryYTNnZCggLd9vL5TzLkGb3USPOKaq2v4jzsIlGKXcyRYbIDf/vcihcS2/VvRXNBBU782kwniaIiq+4rEN3u8hlLic89wNWeBa60vQgYvjsfM7t1zsospH+7CcEEliFOlYdCrMcW2NGR9Gjj/"
},
{
"key": "荐片",
"name": "🧲JIANPIAN┃磁力",
"name": "🧲荐片┃磁力",
"quickSearch": 0,
"changeable": "0",
"searchable": 1,
@@ -293,15 +273,28 @@
},
"ext": "https://ev2089.zxbwv.com"
},
{
"key": "csp_duanju",
"name": "🔥短剧┃影视",
"type": 3,
"api": "csp_DuanJu"
},
{
"key": "csp_SaoHuo",
"name": "🔥HUOHUO┃影视",
"name": "🔥火火┃影视",
"type": 3,
"api": "csp_SaoHuo"
},
{
"key": "csp_Wwys",
"name": "🔥农民┃影视",
"type": 3,
"api": "csp_Wwys",
"ext": "https://vip.wwgz.cn:5200"
},
{
"key": "csp_LiteApple",
"name": "🍎APPLE┃影视💯",
"name": "🍎苹果┃影视💯",
"type": 3,
"searchable": 1,
"quickSearch": 0,
@@ -309,7 +302,7 @@
},
{
"key": "csp_Gz360",
"name": "🍉GUAZI┃影视",
"name": "🍉瓜子┃影视",
"type": 3,
"searchable": 1,
"quickSearch": 0,
@@ -317,7 +310,7 @@
},
{
"key": "csp_Jpys",
"name": "🥇JINPAI┃影视",
"name": "🥇金牌┃影视",
"type": 3,
"searchable": 1,
"quickSearch": 0,
@@ -325,22 +318,12 @@
},
{
"key": "csp_MiSou",
"name": "🔍MISOU┃盘搜",
"name": "🔍米搜┃盘搜",
"type": 3,
"searchable": 1,
"quickSearch": 0,
"api": "csp_MiSou"
},
{
"key": "剧和短剧",
"name": "🪗聚合┃短剧",
"type": 3,
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"changeable": 1,
"api": "./api/%E8%81%9A%E5%90%88%E7%9F%AD%E5%89%A7.js"
},
{
"key": "csp_TingBook",
"name": "📕有声┃听书",
@@ -1,427 +0,0 @@
const aggConfig = {
headers: {
default: { 'User-Agent': 'okhttp/3.12.11', 'content-type': 'application/json; charset=utf-8' },
niuniu: { 'Cache-Control': 'no-cache', 'Content-Type': 'application/json;charset=UTF-8', 'User-Agent': 'okhttp/4.12.0' }
},
platform: {
百度: { host: 'https://api.jkyai.top', url1: '/API/bddjss.php?name=fyclass&page=fypage', url2: '/API/bddjss.php?id=fyid', search: '/API/bddjss.php?name=**&page=fypage' },
甜圈: { host: 'https://mov.cenguigui.cn', url1: '/duanju/api.php?classname', url2: '/duanju/api.php?book_id', search: '/duanju/api.php?name' },
锦鲤: { host: 'https://api.jinlidj.com', search: '/api/search', url2: '/api/detail' },
番茄: { host: 'https://reading.snssdk.com', url1: '/reading/bookapi/bookmall/cell/change/v', url2: 'https://fqgo.52dns.cc/catalog', search: 'https://fqgo.52dns.cc/search' },
星芽: { host: 'https://app.whjzjx.cn', url1: '/cloud/v2/theater/home_page?theater_class_id', url2: '/v2/theater_parent/detail', search: '/v3/search', loginUrl: 'https://u.shytkjgs.com/user/v1/account/login' },
西饭: { host: 'https://xifan-api-cn.youlishipin.com', url1: '/xifan/drama/portalPage', url2: '/xifan/drama/getDuanjuInfo', search: '/xifan/search/getSearchList' },
围观: { host: 'https://api.drama.9ddm.com', url1: '/drama/home/shortVideoTags', url2: '/drama/home/shortVideoDetail', search: '/drama/home/search' },
碎片: { host: 'https://free-api.bighotwind.cc', url1: '/papaya/papaya-api/theater/tags', url2: '/papaya/papaya-api/videos/info', search: '/papaya/papaya-api/videos/page' }
},
platformList: [
{ name: '甜圈短剧', id: '甜圈' }, { name: '锦鲤短剧', id: '锦鲤' }, { name: '番茄短剧', id: '番茄' },
{ name: '星芽短剧', id: '星芽' }, { name: '西饭短剧', id: '西饭' }, { name: '百度短剧', id: '百度' },
{ name: '围观短剧', id: '围观' }, { name: '碎片剧场', id: '碎片' }
],
search: { limit: 30, timeout: 6000 }
};
const ruleFilterDef = {
百度: { area: '逆袭' }, 甜圈: { area: '推荐榜' }, 锦鲤: { area: '' }, 番茄: { area: 'videoseries_hot' },
星芽: { area: '1' }, 西饭: { area: '' }, 围观: { area: '' }, 碎片: { area: '' }
};
let xingyaToken = '';
let suipianToken = '';
function getRandomItem(arr) { return arr[Math.floor(Math.random() * arr.length)]; }
function guid() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
const r = Math.random() * 16 | 0;
return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
});
}
function base64Decode(str) {
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
let output = '';
str = str.replace(/=+$/, '');
for (let i = 0; i < str.length; i += 4) {
const [e1, e2, e3, e4] = [str[i], str[i + 1], str[i + 2], str[i + 3]].map(c => chars.indexOf(c));
const chr1 = (e1 << 2) | (e2 >> 4);
const chr2 = ((e2 & 15) << 4) | (e3 >> 2);
const chr3 = ((e3 & 3) << 6) | e4;
output += String.fromCharCode(chr1);
if (e3 !== -1) output += String.fromCharCode(chr2);
if (e4 !== -1) output += String.fromCharCode(chr3);
}
return output;
}
function safeParse(res) {
if (!res) return null;
if (typeof res === 'string') return JSON.parse(res);
if (typeof res === 'object') {
const content = res.content || res.body || (typeof res.data === 'string' ? res.data : null);
return content ? JSON.parse(content) : res;
}
return null;
}
function getHeaders(platId) {
if (platId === '星芽' && xingyaToken) return { ...aggConfig.headers.default, authorization: xingyaToken };
if (platId === '碎片' && suipianToken) return { ...aggConfig.headers.default, Authorization: suipianToken };
return aggConfig.headers.default;
}
async function init() {
try {
const res = await req(aggConfig.platform.星芽.loginUrl, {
method: 'POST',
headers: { 'User-Agent': 'okhttp/4.10.0', platform: '1', 'Content-Type': 'application/json' },
body: JSON.stringify({ device: '24250683a3bdb3f118dff25ba4b1cba1a' })
});
const data = safeParse(res);
xingyaToken = data?.data?.token || data?.token || '';
} catch (e) { /* ignore */ }
return true;
}
async function ensureSuipianToken() {
if (suipianToken) return;
try {
const openId = guid();
const res = await req('https://free-api.bighotwind.cc/papaya/papaya-api/oauth2/uuid', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ openId })
});
const data = safeParse(res);
suipianToken = data?.data?.token || '';
} catch (e) { suipianToken = ''; }
}
async function home() {
return JSON.stringify({ class: aggConfig.platformList.map(p => ({ type_name: p.name, type_id: p.id })) });
}
async function homeVod() { return await recommend(); }
async function recommend() {
const randomPlat = getRandomItem(aggConfig.platformList);
const platId = randomPlat.id;
const area = ruleFilterDef[platId]?.area || '';
const videos = await fetchList(platId, area, 1, 10);
return JSON.stringify({ list: videos.slice(0, 10) });
}
// Category & Search common fetch
async function fetchList(platId, area, page, pageSize = 24) {
const plat = aggConfig.platform[platId];
if (!plat) return [];
if (platId === '星芽' && !xingyaToken) await init();
if (platId === '碎片') await ensureSuipianToken();
try {
let data = [];
const headers = getHeaders(platId);
const host = plat.host;
switch (platId) {
case '百度': {
const res = await req(`${host}${plat.url1.replace('fyclass', area).replace('fypage', page)}`, { headers });
const d = safeParse(res)?.data || [];
data = d.map(i => ({ vod_id: `百度@${i.id}`, vod_name: i.title, vod_pic: i.cover, vod_remarks: `更新至${i.totalChapterNum}集` }));
break;
}
case '甜圈': {
const res = await req(`${host}${plat.url1}=${area}&offset=${page}`, { headers });
const d = safeParse(res)?.data || [];
data = d.map(i => ({ vod_id: `甜圈@${i.book_id}`, vod_name: i.title, vod_pic: i.cover, vod_remarks: i.copyright || '' }));
break;
}
case '锦鲤': {
const res = await req(`${host}${plat.search}`, { method: 'POST', body: JSON.stringify({ page, limit: pageSize, type_id: area, keyword: '' }) });
const d = safeParse(res)?.data?.list || [];
data = d.map(i => ({ vod_id: `锦鲤@${i.vod_id}`, vod_name: i.vod_name, vod_pic: i.vod_pic, vod_remarks: `${i.vod_total}集` }));
break;
}
case '番茄': {
const sessionId = new Date().toISOString().slice(0, 16).replace(/-|T:/g, '');
const url = `${host}${plat.url1}?change_type=0&selected_items=${area}&tab_type=8&cell_id=6952850996422770718&version_tag=video_feed_refactor&device_id=1423244030195267&aid=1967&app_name=novelapp&ssmix=a&session_id=${sessionId}${page > 1 ? `&offset=${(page - 1) * 12}` : ''}`;
const res = await req(url, { headers });
const d = safeParse(res);
const items = d?.data?.cell_view?.cell_data || (Array.isArray(d?.data) ? d.data : []);
data = items.map(i => {
const v = i.video_data?.[0] || i;
return { vod_id: `番茄@${v.series_id || v.book_id || ''}`, vod_name: v.title, vod_pic: v.cover || v.horiz_cover, vod_remarks: v.sub_title || '' };
});
break;
}
case '星芽': {
const res = await req(`${host}${plat.url1}=${area}&type=1&class2_ids=0&page_num=${page}&page_size=${pageSize}`, { headers });
const d = safeParse(res)?.data?.list || [];
data = d.map(i => ({ vod_id: `星芽@${host}${plat.url2}?theater_parent_id=${i.theater.id}`, vod_name: i.theater.title, vod_pic: i.theater.cover_url, vod_remarks: `${i.theater.total}集` }));
break;
}
case '西饭': {
const [typeId] = area.split('@');
const url = `${host}${plat.url1}?reqType=aggregationPage&offset=${(page - 1) * 30}&categoryId=${typeId}`;
const res = await req(url, { headers });
const elements = safeParse(res)?.result?.elements || [];
elements.forEach(s => (s.contents || []).forEach(v => {
const d = v.duanjuVo;
data.push({ vod_id: `西饭@${d.duanjuId}#${d.source}`, vod_name: d.title, vod_pic: d.coverImageUrl, vod_remarks: `${d.total}集` });
}));
break;
}
case '围观': {
const res = await req(`${host}${plat.search}`, {
method: 'POST', headers,
body: JSON.stringify({ audience: "全部受众", page, pageSize, searchWord: "", subject: "全部主题" })
});
const d = safeParse(res)?.data || [];
data = d.map(i => ({ vod_id: `围观@${i.oneId}`, vod_name: i.title, vod_pic: i.vertPoster, vod_remarks: `集数:${i.episodeCount} 播放:${i.viewCount}` }));
break;
}
case '碎片': {
const res = await req(`${host}${plat.search}?type=5&tagId=&pageNum=${page}&pageSize=${pageSize}`, { headers });
const d = safeParse(res)?.list || [];
data = d.map(i => {
const id = `${i.itemId}@${i.videoCode}`;
const pic = `https://speed.hiknz.com/papaya/papaya-file/files/download/${i.imageKey}/${i.imageName}`;
return { vod_id: `碎片@${id}`, vod_name: i.title, vod_pic: pic, vod_remarks: `集数:${i.episodesMax} 播放:${i.hitShowNum}` };
});
break;
}
}
return data;
} catch { return []; }
}
async function category(tid, pg, filter, extend) {
const page = parseInt(pg) || 1;
const area = filter?.area || ruleFilterDef[tid]?.area || '';
const videos = await fetchList(tid, area, page);
return JSON.stringify({
list: videos,
page,
pagecount: page + 1,
limit: videos.length,
total: videos.length * (page + 1)
});
}
async function detail(id) {
const [platId, ...rest] = id.split('@');
const did = rest.join('@');
const plat = aggConfig.platform[platId];
if (!plat) return JSON.stringify({ list: [{ vod_id: id, vod_name: '平台不支持', vod_play_url: '' }] });
if (platId === '星芽' && !xingyaToken) await init();
if (platId === '碎片') await ensureSuipianToken();
try {
let vod = { vod_id: id, vod_name: '未知', vod_pic: '', vod_remarks: '', vod_content: '', vod_play_from: '', vod_play_url: '' };
const headers = getHeaders(platId);
switch (platId) {
case '百度': {
const res = safeParse(await req(`${plat.host}${plat.url2.replace('fyid', did)}`, { headers }));
if (res) vod = { ...vod, vod_name: res.title, vod_pic: res.data?.[0]?.cover, vod_remarks: `更新至:${res.total || 0}集`, vod_play_from: '百度短剧', vod_play_url: (res.data || []).map(i => `${i.title}$${i.video_id}`).join('#') };
break;
}
case '甜圈': {
const res = safeParse(await req(`${plat.host}${plat.url2}=${did}`, { headers }));
if (res) vod = { ...vod, vod_name: res.book_name || res.title, vod_pic: res.book_pic || res.cover, vod_remarks: `更新时间:${res.time}`, vod_content: res.desc, vod_play_from: '甜圈短剧', vod_play_url: (res.data || []).map(i => `${i.title || '第1集'}$${i.video_id || i.id}`).join('#') };
break;
}
case '锦鲤': {
const res = safeParse(await req(`${plat.host}${plat.url2}/${did}`, { headers }));
if (res?.data) {
const list = res.data;
const urls = list.player ? Object.keys(list.player).map(k => `${k}$${list.player[k]}`) : [];
vod = { ...vod, vod_name: list.vod_name, vod_pic: list.vod_pic, vod_remarks: list.vod_remarks, vod_play_from: '锦鲤短剧', vod_play_url: urls.join('#') };
}
break;
}
case '番茄': {
const res = safeParse(await req(`${plat.url2}?book_id=${did}`, { headers }));
if (res?.data) {
const b = res.data.book_info;
const u = (res.data.item_data_list || []).map(i => `${i.title}$${i.item_id}`).join('#');
vod = { ...vod, vod_name: b.book_name, vod_pic: b.thumb_url, vod_remarks: `更新至${res.data.item_data_list?.length}集`, vod_play_from: '番茄短剧', vod_play_url: u };
}
break;
}
case '星芽': {
const res = safeParse(await req(did, { headers }));
if (res?.data) {
const d = res.data;
const u = (d.theaters || []).map(i => `${i.num}$${i.son_video_url}`).join('#');
vod = { ...vod, vod_name: d.title, vod_pic: d.cover_url, vod_remarks: d.desc_tags + '', vod_play_from: '星芽短剧', vod_play_url: u };
}
break;
}
case '西饭': {
const [duanjuId, source] = did.split('#');
const url = `${plat.host}${plat.url2}?duanjuId=${duanjuId}&source=${source}`;
const res = safeParse(await req(url, { headers }));
if (res?.result) {
const d = res.result;
const u = (d.episodeList || []).map(e => `${e.index}$${e.playUrl}`).join('#');
vod = { ...vod, vod_name: d.title, vod_pic: d.coverImageUrl, vod_remarks: d.updateStatus === 'over' ? `${d.total}集 已完结` : `更新${d.total}集`, vod_play_from: '西饭短剧', vod_play_url: u };
}
break;
}
case '围观': {
const res = safeParse(await req(`${plat.host}${plat.url2}?oneId=${did}&page=1&pageSize=1000`, { headers }));
if (res?.data?.length) {
const d = res.data;
vod = { ...vod, vod_name: d[0].title, vod_pic: d[0].vertPoster, vod_remarks: `共${d.length}集`, vod_play_from: '围观短剧', vod_play_url: d.map(e => `${e.title}第${e.playOrder}集$${e.playSetting}`).join('#') };
}
break;
}
case '碎片': {
const [itemId, videoCode] = did.split('@');
const res = safeParse(await req(`${plat.host}${plat.url2}?videoCode=${videoCode}&itemId=${itemId}`, { headers }));
if (res) {
const d = res.data || res;
const pic = `https://speed.hiknz.com/papaya/papaya-file/files/download/${d.imageKey}/${d.imageName}`;
const u = (d.episodesList || []).map(e => {
const best = e.resolutionList?.sort((a, b) => b.resolution - a.resolution)[0];
return best ? `第${e.episodes}集$https://speed.hiknz.com/papaya/papaya-file/files/download/${best.fileKey}/${best.fileName}` : null;
}).filter(Boolean).join('#');
vod = { ...vod, vod_name: d.title, vod_pic: pic, vod_remarks: `共${d.episodesMax || 0}集`, vod_play_from: '碎片剧场', vod_play_url: u };
}
break;
}
}
return JSON.stringify({ list: [vod] });
} catch {
return JSON.stringify({ list: [{ vod_id: id, vod_name: '加载失败', vod_play_url: '' }] });
}
}
async function play(flag, id) {
const input = id;
const defaultRes = () => JSON.stringify({ parse: 0, url: input });
if (/百度/.test(flag)) {
const res = safeParse(await req(`https://api.jkyai.top/API/bddjss.php?video_id=${input}`));
if (res?.data?.qualities) {
const order = ["1080p", "sc", "sd"];
const qMap = { "1080p": "蓝光", "sc": "超清", "sd": "标清" };
const urls = [];
order.forEach(k => {
const q = res.data.qualities.find(x => x.quality === k);
if (q) urls.push(qMap[k], q.download_url);
});
return JSON.stringify({ parse: 0, url: urls });
}
}
if (/甜圈/.test(flag)) {
return JSON.stringify({ parse: 0, url: `https://mov.cenguigui.cn/duanju/api.php?video_id=${input}&type=mp4` });
}
if (/锦鲤/.test(flag)) {
try {
const html = await req(`${input}&auto=1`, { headers: { referer: 'https://www.jinlidj.com/' } });
const str = typeof html === 'string' ? html : html.content || html.body || '{}';
const match = str.match(/let data\s*=\s*({[^;]*});/);
if (match) {
const data = JSON.parse(match[1]);
if (data.url) return JSON.stringify({ parse: 0, url: data.url });
}
} catch {}
}
if (/番茄/.test(flag)) {
try {
const res = safeParse(await req(`https://fqgo.52dns.cc/video?item_ids=${input}`));
if (res?.data?.[input]?.video_model) {
const model = JSON.parse(res.data[input].video_model);
const mainUrl = model?.video_list?.video_1?.main_url;
if (mainUrl) return JSON.stringify({ parse: 0, url: base64Decode(mainUrl) });
}
} catch { /* ignore */ }
}
if (/围观/.test(flag)) {
try {
const ps = typeof input === 'string' ? JSON.parse(input) : input;
const urls = [];
if (ps?.super) urls.push("超清", ps.super);
if (ps?.high) urls.push("高清", ps.high);
if (ps?.normal) urls.push("流畅", ps.normal);
return JSON.stringify({ parse: 0, url: urls });
} catch { return defaultRes(); }
}
return defaultRes();
}
async function search(wd, quick, pg) {
const page = parseInt(pg) || 1;
const timeout = aggConfig.search.timeout;
const limit = aggConfig.search.limit;
const promises = aggConfig.platformList.map(async p => {
const plat = aggConfig.platform[p.id];
try {
if (p.id === '星芽' && !xingyaToken) await init();
if (p.id === '碎片') await ensureSuipianToken();
let res, data;
const headers = getHeaders(p.id);
const host = plat.host;
switch (p.id) {
case '百度':
res = await req(`${host}${plat.search.replace('**', encodeURIComponent(wd)).replace('fypage', page)}`, { headers, timeout });
data = (safeParse(res)?.data || []).map(i => ({ vod_id: `百度@${i.id}`, vod_name: i.title, vod_pic: i.cover, vod_remarks: `百度短剧|更新至${i.totalChapterNum}集` }));
break;
case '甜圈':
res = await req(`${host}${plat.search}=${encodeURIComponent(wd)}&offset=${page}`, { headers, timeout });
data = (safeParse(res)?.data || []).map(i => ({ vod_id: `甜圈@${i.book_id}`, vod_name: i.title, vod_pic: i.cover, vod_remarks: `甜圈短剧|${i.copyright}` }));
break;
case '锦鲤':
res = await req(host + plat.search, { method: 'POST', body: JSON.stringify({ page, limit, keyword: wd }), timeout });
data = (safeParse(res)?.data?.list || []).map(i => ({ vod_id: `锦鲤@${i.vod_id}`, vod_name: i.vod_name, vod_pic: i.vod_pic, vod_remarks: `锦鲤短剧|${i.vod_total}集` }));
break;
case '番茄':
res = await req(`${plat.search}?keyword=${encodeURIComponent(wd)}&page=${page}`, { headers, timeout });
data = (safeParse(res)?.data || []).map(i => ({ vod_id: `番茄@${i.series_id}`, vod_name: i.title, vod_pic: i.cover, vod_remarks: `番茄短剧|${i.sub_title}` }));
break;
case '星芽':
res = await req(host + plat.search, { method: 'POST', headers, body: JSON.stringify({ text: wd }), timeout });
data = (safeParse(res)?.data?.theater?.search_data || []).map(i => ({ vod_id: `星芽@${host}${plat.url2}?theater_parent_id=${i.id}`, vod_name: i.title, vod_pic: i.cover_url, vod_remarks: `星芽短剧|${i.total}集 播放:${i.play_amount_str}` }));
break;
case '碎片':
res = await req(`${host}${plat.search}?type=5&tagId=&pageNum=${page}&pageSize=${limit}&title=${encodeURIComponent(wd)}`, { headers, timeout });
data = (safeParse(res)?.list || []).map(i => {
const id = `${i.itemId}@${i.videoCode}`;
const pic = `https://speed.hiknz.com/papaya/papaya-file/files/download/${i.imageKey}/${i.imageName}`;
return { vod_id: `碎片@${id}`, vod_name: i.title, vod_pic: pic, vod_remarks: `碎片剧场|集数:${i.episodesMax} 播放:${i.hitShowNum}` };
});
break;
default:
return [];
}
return data.filter(v => v.vod_name?.toLowerCase().includes(wd.toLowerCase()));
} catch { return []; }
});
const results = (await Promise.allSettled(promises))
.filter(r => r.status === 'fulfilled')
.flatMap(r => r.value || []);
return JSON.stringify({
list: results,
page,
pagecount: page + 1,
limit: results.length,
total: results.length * (page + 1)
});
}
export function __jsEvalReturn() {
return { init, home, homeVod, category, detail, play, proxy: null, search };
}
-225
View File
@@ -1,225 +0,0 @@
import sys, uuid, json
from base.spider import Spider
sys.path.append('..')
class Spider(Spider):
local_uuid = ''
config = ''
parsing_config = []
token = ''
headers = {
'User-Agent': "Dart/2.19 (dart:io)",
'Accept-Encoding': "gzip",
'appto-local-uuid': local_uuid,
'token': ''
}
line_order = []
block_keywords = []
def init(self, extend=""):
try:
self.token = ''
if extend.startswith('{') and extend.endswith('}'):
ext_dict = json.loads(extend.strip())
self.host = ext_dict.get('host', '').strip()
self.token = ext_dict.get('token', '').strip()
line_order_input = ext_dict.get('line_order', '')
line_order_str = ','.join(line_order_input) if isinstance(line_order_input, list) else str(line_order_input).strip()
if '@' in line_order_str:
order_part, block_part = line_order_str.split('@', 1)
self.line_order = list({kw.strip().lower() for kw in order_part.split(',') if kw.strip()})
self.block_keywords = list({kw.strip().lower() for kw in block_part.split(',') if kw.strip()})
else:
self.line_order = list({kw.strip().lower() for kw in line_order_str.split(',') if kw.strip()})
self.block_keywords = []
else:
self.host = extend.strip()
self.line_order = []
self.block_keywords = []
if not self.host.startswith('http'):
return {}
self.local_uuid = str(uuid.uuid4())
self.headers['appto-local-uuid'] = self.local_uuid
self.headers['token'] = self.token
response = self.fetch(f'{self.host}/apptov5/v1/config/get?p=android&__platform=android', headers=self.headers).json()
config = response['data']
self.config = config
parsing_conf = config['get_parsing']['lists']
parsing_config = {}
for i in parsing_conf:
if len(i['config']) != 0:
label = []
for j in i['config']:
if j['type'] == 'json':
label.append(j['label'])
parsing_config.update({i['key']: label})
self.parsing_config = parsing_config
except Exception as e:
print(f'初始化异常:{e}')
return {}
def detailContent(self, ids):
response = self.fetch(f"{self.host}/apptov5/v1/vod/getVod?id={ids[0]}", headers=self.headers).json()
data3 = response['data']
videos = []
vod_play_url = ''
vod_play_from = ''
vod_play_list = data3['vod_play_list']
if self.block_keywords:
filtered_list = []
for play_item in vod_play_list:
show_val = play_item['player_info'].get('show', '').strip().lower()
if not any(kw in show_val for kw in self.block_keywords):
filtered_list.append(play_item)
vod_play_list = filtered_list
if self.line_order:
def get_priority(play_item):
show_val = play_item['player_info'].get('show', '').strip().lower()
for idx, kw in enumerate(self.line_order):
if kw in show_val:
return idx
return float('inf')
vod_play_list = sorted(vod_play_list, key=get_priority, reverse=False)
for i in vod_play_list:
play_url = ''
line_name = i['player_info'].get('show', '未知线路')
from_value = i['player_info'].get('from', '')
display_name = f"{line_name}({from_value})" if from_value else line_name
for j in i['urls']:
play_url += f"{j['name']}${i['player_info']['from']}@{j['url']}#"
vod_play_from += display_name + '$$$'
vod_play_url += play_url.rstrip('#') + '$$$'
vod_play_url = vod_play_url.rstrip('$$$')
vod_play_from = vod_play_from.rstrip('$$$')
videos.append({
'vod_id': data3.get('vod_id'),
'vod_name': data3.get('vod_name'),
'vod_content': data3.get('vod_content', ''),
'vod_remarks': data3.get('vod_remarks'),
'vod_director': data3.get('vod_director'),
'vod_actor': data3.get('vod_actor'),
'vod_year': data3.get('vod_year'),
'vod_area': data3.get('vod_area'),
'vod_play_from': vod_play_from,
'vod_play_url': vod_play_url
})
return {'list': videos}
def searchContent(self, key, quick, pg='1'):
url = f"{self.host}/apptov5/v1/search/lists?wd={key}&page={pg}&type=&__platform=android"
response = self.fetch(url, headers=self.headers).json()
data = response['data']['data']
for i in data:
if i.get('vod_pic', '').startswith('mac://'):
i['vod_pic'] = i['vod_pic'].replace('mac://', 'http://', 1)
return {'list': data, 'page': pg, 'total': response['data']['total']}
def playerContent(self, flag, id, vipflags):
default_ua = 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'
parsing_config = self.parsing_config
parts = id.split('@')
if len(parts) != 2:
return {'parse': 0, 'url': id, 'header': {'User-Agent': default_ua}}
playfrom, rawurl = parts
label_list = parsing_config.get(playfrom)
if not label_list:
return {'parse': 0, 'url': rawurl, 'header': {'User-Agent': default_ua}}
result = {'parse': 1, 'url': rawurl, 'header': {'User-Agent': default_ua}}
for label in label_list:
payload = {
'play_url': rawurl,
'label': label,
'key': playfrom
}
try:
response = self.post(
f"{self.host}/apptov5/v1/parsing/proxy?__platform=android",
data=payload,
headers=self.headers
).json()
except Exception as e:
print(f"请求异常: {e}")
continue
if not isinstance(response, dict):
continue
if response.get('code') == 422:
continue
data = response.get('data')
if not isinstance(data, dict):
continue
url = data.get('url')
if not url:
continue
ua = data.get('UA') or data.get('UserAgent') or default_ua
result = {
'parse': 0,
'url': url,
'header': {'User-Agent': ua}
}
break
return result
def homeContent(self, filter):
config = self.config
if not config:
return {}
home_cate = config['get_home_cate']
classes = []
for i in home_cate:
if isinstance(i.get('extend', []), dict):
classes.append({'type_id': i['cate'], 'type_name': i['title']})
return {'class': classes}
def homeVideoContent(self):
response = self.fetch(f'{self.host}/apptov5/v1/home/data?id=1&mold=1&__platform=android', headers=self.headers).json()
data = response['data']
vod_list = []
for i in data['sections']:
for j in i['items']:
vod_pic = j.get('vod_pic', '')
if vod_pic.startswith('mac://'):
vod_pic = vod_pic.replace('mac://', 'http://', 1)
vod_list.append({
"vod_id": j.get('vod_id'),
"vod_name": j.get('vod_name'),
"vod_pic": vod_pic,
"vod_remarks": j.get('vod_remarks')
})
return {'list': vod_list}
def categoryContent(self, tid, pg, filter, extend):
response = self.fetch(
f"{self.host}/apptov5/v1/vod/lists?area={extend.get('area','')}&lang={extend.get('lang','')}&year={extend.get('year','')}&order={extend.get('sort','time')}&type_id={tid}&type_name=&page={pg}&pageSize=21&__platform=android",
headers=self.headers
).json()
data = response['data']
data2 = data['data']
for i in data['data']:
if i.get('vod_pic','').startswith('mac://'):
i['vod_pic'] = i['vod_pic'].replace('mac://', 'http://', 1)
return {'list': data2, 'page': pg, 'total': data['total']}
def getName(self):
pass
def isVideoFormat(self, url):
pass
def manualVideoCheck(self):
pass
def destroy(self):
pass
def localProxy(self, param):
pass
BIN
View File
Binary file not shown.
+28 -12
View File
@@ -1,7 +1,7 @@
{
"spider": "./spider.jar",
"logo": "https://open.wya6.com/d/down/2026/logo.gif",
"wallpaper": "http://127.0.0.1:9978/proxy?do=wallpaper",
"wallpaper": "http://127.0.0.1:5266/wallpaper",
"sites": [
{
"key": "Douban",
@@ -107,6 +107,14 @@
"api": "csp_AppFox",
"ext": "p+FPtr6fYIfomOnA4N4Sl0dFvFqJvfkho3Yem3nNyo6peH9nVFr0wIIfo96V7voEHGrq+0mvfYjwri/nkrWITQ=="
},
{
"key": "看呗",
"name": "看呗|APP",
"type": 3,
"searchable": 1,
"api": "csp_AppGet",
"ext": "bB1iyOjtXWh234iOsqOpQ65mKOL2sRd+RcTIk0cmjrD8688Xw5ArmjN9zmaBcFgVgymXypm6lVMfsF9YOHbdKm0QT6K8/+z1B6YhKTatmFsNRMAw995p8MscOfu0wUGg"
},
{
"key": "jumeng",
"name": "剧梦|APP",
@@ -146,7 +154,7 @@
"changeable": "1",
"quickSearch": 0,
"filterable": 1,
"ext": "sCnv2gwYzALZxDcfyX62oSKxLlLfPpOEf+mKvMQvSpMDoEavlzj4ib+jrumGW1Thrn8REq84SGVeJzq6F/vNAQbZlJ0rkT2djKJq4bTW1XFoW302XV0p+ZSEqBozzdjbdOxaZv+zZWCbSmIlsvXQU5cnwEBCx4/vTVK7uRAHKMytMSWmTqvFCAsCim4kXYme"
"ext": "sCnv2gwYzALZxDcfyX62oRPMT83Bt3Q5r5Q6ZwZ7Qq7ZfJZDdC8XcpJTArOjxs1hHGrH7JX/hlcGzED0RCFI/s5GJg5ZWPlTtK+GsArjWDyxNkvAnyr0ju34UuSCxQLD322RSid4K96h74Nx/SiPlH1VjrRyIHMEIfDj/wTAjZGrqJ89zsewId3PXJEpHlqc7ewAudH5J9EGzdit7AYOug=="
},
{
"key": "Guwo",
@@ -435,7 +443,7 @@
},
{
"key": "ReBoYingShi",
"name": "雪映|影视",
"name": "热播|影视",
"type": 3,
"api": "csp_ReBoYingShi",
"searchable": 1,
@@ -443,7 +451,7 @@
},
{
"key": "DianYingYunJi",
"name": "河清|影视",
"name": "云集|影视",
"type": 3,
"api": "csp_DianYingYunJi",
"searchable": 1,
@@ -474,7 +482,7 @@
},
{
"key": "Hema",
"name": "河马|影视",
"name": "河马|短剧",
"type": 3,
"api": "csp_Hema",
"searchable": 1,
@@ -508,6 +516,14 @@
"quickSearch": 1,
"filterable": 1
},
{
"key": "番薯动漫",
"name": "番薯丨动漫",
"type": 3,
"quickSearch": 1,
"api": "csp_AppGet",
"ext": "N5u2FS3i/elUFAoSVYBzne8+r0r/kX1E+KdfHQ6FVY6/wHmWZoFfjCv2f3YfjfSbJm0/trORuqYE1PzwW9Z2IT6SnMHG1Beaes3+9Ad9p9Dy7MPFARRTA33haDFOP4SZtpBkd4utjKPyprZNVKMxvA=="
},
{
"key": "mifun",
"name": "米饭|动漫",
@@ -636,6 +652,13 @@
]
}
},
{
"key": "TuneFree",
"name": "自由|音乐",
"type": 3,
"api": "csp_TuneFree",
"searchable": 1
},
{
"key": "Music24bit",
"name": "无损|音乐",
@@ -653,13 +676,6 @@
]
}
},
{
"key": "TuneFree",
"name": "自由|音乐",
"type": 3,
"api": "csp_TuneFree",
"searchable": 1
},
{
"key": "Kanqiu",
"name": "看球|体育",
Binary file not shown.
+319 -280
View File
@@ -13,14 +13,14 @@
"sites": [
{
"key": "豆瓣2",
"name": "📢网络收集勿演示贩卖!严谨用于任何商业用途!",
"name": "📢免费仅限测试用,请勿演示贩卖购买,谨防上当受骗!",
"type": 3,
"api": "csp_Douban",
"searchable": 0
},
{
"key": "豆瓣1",
"name": "📢公告❤更新01.14❤",
"name": "📢公告❤更新01.19❤",
"type": 3,
"api": "csp_Notice",
"searchable": 1,
@@ -64,7 +64,7 @@
],
"url_key": "wogg1",
"threadinfo": {
"chunksize": 261,
"chunksize": 217,
"threads": 16
}
}
@@ -86,7 +86,7 @@
],
"url_key": "woog2",
"threadinfo": {
"chunksize": 243,
"chunksize": 288,
"threads": 16
}
}
@@ -108,12 +108,6 @@
]
}
},
{
"key": "荐片",
"name": "💡荐片|影视",
"api": "csp_JianPian",
"type": 3
},
{
"key": "热播影视",
"name": "💡热播|影视",
@@ -127,15 +121,301 @@
}
},
{
"key": "浪酷影视",
"name": "💡浪酷|影视",
"key": "农民影视",
"name": "💡农民|影视",
"type": 3,
"api": "csp_Wwys",
"ext": "https://vip.wwgz.cn:5200"
},
{
"key": "荐片",
"name": "💡荐片|影视",
"api": "csp_JianPian",
"type": 3
},
{
"key": "小猪",
"name": "👑小猪丨弹幕",
"type": 3,
"api": "csp_AppRJ",
"searchable": 1,
"quickSearch": 1,
"filterable": 0,
"api": "csp_AppQi",
"ext": {
"url": "http://v.lkuys.cn"
"url": "",
"site": "https://tiantangyoulu.oss-cn-beijing.aliyuncs.com/tengxunyun.txt",
"dataKey": "seb5tq9mykp2w9ry",
"dataIv": "seb5tq9mykp2w9ry",
"deviceId": "",
"version": "",
"ua": "okhttp/3.10.0"
}
},
{
"key": "鲸鱼",
"name": "👑鲸鱼丨弹幕",
"type": 3,
"quickSearch": 1,
"api": "csp_AppQi",
"ext": {
"site": "https://jingyu4k-1312635929.cos.ap-nanjing.myqcloud.com/1.json",
"dataKey": "AAdgrdghjfgswerA",
"dataIv": "AAdgrdghjfgswerA"
}
},
{
"key": "数字",
"name": "👑数字丨弹幕",
"type": 3,
"quickSearch": 1,
"api": "csp_AppGet",
"ext": {
"url": "http://app1-0-0.87333.cc",
"dataKey": "VwsHxkCViDXEExWa",
"dataIv": "VwsHxkCViDXEExWa"
}
},
{
"key": "八天",
"name": "👑八天丨弹幕",
"type": 3,
"quickSearch": 1,
"api": "csp_AppGet",
"ext": {
"url": "https://dy.8ttv.cn",
"site": "",
"dataKey": "1111111111111111",
"dataIv": "1111111111111111",
"deviceId": "",
"version": "",
"ua": ""
}
},
{
"key": "茉莉",
"name": "👑茉莉|弹幕",
"type": 3,
"searchable": 1,
"api": "csp_AppGet",
"ext": {
"site": "https://gitee.com/wmmoliill/wimg/raw/master/img/bk/9.txt",
"dataKey": "88689667dce61725",
"dataIv": "88689667dce61725"
}
},
{
"key": "驿站",
"name": "👑驿站|弹幕",
"type": 3,
"quickSearch": 1,
"api": "csp_AppGet",
"ext": {
"site": "https://dyyztvappapigoodgx.68.gy:12689/ciwk28vu38io8/apiurl.txt",
"dataKey": "dyyztvapiappyyds",
"dataIv": "dyyztvapiappyyds"
}
},
{
"key": "火锅",
"name": "👑火锅|弹幕",
"type": 3,
"quickSearch": 1,
"api": "csp_AppGet",
"ext": {
"url": "https://ios.hgyx.vip",
"dataKey": "062dec75d039980e",
"dataIv": "062dec75d039980e",
"ua": "Dart/3.5 (dart:io)"
}
},
{
"key": "粉象世界",
"name": "👑粉象|弹幕",
"type": 3,
"changeable": 0,
"api": "csp_AppFox",
"ext": {
"host": "http://121.40.131.51:2556/host.json",
"ver": 2
}
},
{
"key": "小猫",
"name": "👑小猫┃影视",
"type": 3,
"searchable": 1,
"changeable": 1,
"api": "csp_AppGet",
"ext": {
"site": "http://xywlkj.oss-cn-beijing.aliyuncs.com/wp-content/uploads/2024/12/1.txt",
"dataKey": "xmyxmyxywlkjxywl",
"dataIv": "xmyxmyxywlkjxywl"
}
},
{
"key": "木瓜",
"name": "👑木瓜┃影视",
"type": 3,
"changeable": 0,
"api": "csp_AppFox",
"ext": {
"host": "http://www.yezitv.top/dtym.json",
"ver": 2
}
},
{
"key": "麒麟",
"name": "👑麒麟┃影视",
"type": 3,
"changeable": 0,
"api": "csp_AppFox",
"ext": {
"host": "https://qh.70qh.top",
"ver": 2
}
},
{
"key": "粉象",
"name": "👑粉象┃影视",
"type": 3,
"changeable": 0,
"api": "csp_AppFox",
"ext": {
"host": "http://121.40.131.51:2556/host.json",
"ver": 2
}
},
{
"key": "仓鼠",
"name": "👑仓鼠|影视",
"type": 3,
"quickSearch": 1,
"api": "csp_AppQi",
"ext": {
"url": "https://hk440cms.cs4k.top",
"dataKey": "fL7sY4zN4kB3pG4p",
"dataIv": "fL7sY4zN4kB3pG4p",
"init": "initV122",
"ua": "okhttp/3.10.0"
}
},
{
"key": "影视",
"name": "👑影视┃影视",
"type": 3,
"searchable": 1,
"changeable": 1,
"api": "csp_AppGet",
"ext": {
"host": "https://jingyu4k-1312635929.cos.ap-nanjing.myqcloud.com/1.json",
"datakey": "AAdgrdghjfgswerA",
"api": 2
}
},
{
"key": "奇奇",
"name": "👑奇奇|弹幕",
"type": 3,
"api": "csp_AppQi",
"ext": {
"site": "https://yun-1316442804.cos.ap-guangzhou.myqcloud.com/a.txt",
"dataKey": "123456789abcdefg",
"dataIv": "123456789abcdefg"
}
},
{
"key": "方圆",
"name": "👑方圆|弹幕",
"type": 3,
"searchable": 1,
"api": "csp_AppGet",
"ext": {
"url": "https://fyys1.fytd.top",
"dataKey": "0ef6fc92a64b4ee7",
"dataIv": "0ef6fc92a64b4ee7"
}
},
{
"key": "看呗",
"name": "👑看呗|弹幕",
"type": 3,
"searchable": 1,
"api": "csp_AppGet",
"ext": {
"url": "http://www.winter1.fun",
"dataKey": "abcdefghigklmn11",
"dataIv": "abcdefghigklmn11"
}
},
{
"key": "小猫影视",
"name": "👑小猫|弹幕",
"type": 3,
"searchable": 1,
"api": "csp_AppGet",
"ext": {
"site": "http://xywlkj.oss-cn-beijing.aliyuncs.com/wp-content/uploads/2024/12/1.txt",
"dataKey": "xmyxmyxywlkjxywl",
"dataIv": "xmyxmyxywlkjxywl"
}
},
{
"key": "气球",
"name": "👑气球|弹幕",
"type": 3,
"api": "csp_AppGet",
"ext": {
"url": "https://vv.229d.cn",
"dataKey": "8888888888888888",
"dataIv": "8888888888888888"
}
},
{
"key": "随看",
"name": "👑随看|弹幕",
"type": 3,
"api": "csp_AppGet",
"ext": {
"url": "https://suikan.tpmbt.cn",
"dataKey": "pHQsm6wjYaCuSPEz",
"dataIv": "pHQsm6wjYaCuSPEz"
}
},
{
"key": "白鸽",
"name": "👑白鸽|弹幕",
"type": 3,
"searchable": 1,
"changeable": 1,
"api": "csp_AppGet",
"ext": {
"url": "https://cy.baige.asia",
"dataKey": "599D0FE5178642FD",
"dataIv": "599D0FE5178642FD"
}
},
{
"key": "剧梦",
"name": "👑剧梦|弹幕",
"type": 3,
"searchable": 1,
"changeable": 1,
"api": "csp_AppGet",
"ext": {
"url": "https://www.jumengwu.com",
"dataKey": "1f0a873caf2550a5",
"dataIv": "1f0a873caf2550a5"
}
},
{
"key": "魔方",
"name": "👑魔方|弹幕",
"type": 3,
"searchable": 1,
"changeable": 1,
"api": "csp_AppGet",
"ext": {
"site": "https://snysw.xyz/mf4kzs327.txt",
"dataKey": "1234567887654321",
"dataIv": "1234567887654321"
}
},
{
@@ -165,12 +445,6 @@
"quickSearch": 1,
"filterable": 1
},
{
"key": "三六零",
"name": "💡三六|视频",
"type": 3,
"api": "csp_SP360"
},
{
"key": "奇优影视",
"name": "💡奇优|影视",
@@ -218,259 +492,6 @@
"jar": "./jars/柠檬.jar",
"ext": "7lj763gg402i7942503g839jg74h8h88highi40799jh6i6k454419l0l5184k0g549h0kg2i01i838i2h42g891lgg1"
},
{
"key": "聚搜",
"name": "🐢聚搜┃影视",
"type": 3,
"api": "./api/072e7d2e5c69f201f0bf58ee5ec55b2b.py",
"ext": "http://101.35.85.16:5555"
},
{
"key": "巧技2",
"name": "🔍搜艘┃影视",
"type": 3,
"searchable": 1,
"quickSearch": 1,
"api": "csp_qiao2",
"playerType": 2,
"jar": "./jars/巧技2.jar",
"ext": "7lj763gg402i7942412h849jg1558j9jl8g19213il86316k465719lik158491h179312h4934183ig2l05g9"
},
{
"key": "顾我",
"name": "👑顾我|弹幕",
"type": 3,
"api": "csp_AppQi",
"changeable": "1",
"quickSearch": 0,
"filterable": 1,
"ext": {
"site": "https://guwozj-1319364746.cos.ap-guangzhou.myqcloud.com/guwo.txt",
"dataKey": "ca94b06ca3c7d80e",
"dataIv": "ca94b06ca3c7d80e",
"ua": "okhttp/3.10.0"
}
},
{
"key": "云云",
"name": "👑云云丨弹幕",
"type": 3,
"quickSearch": 1,
"api": "csp_AppQi",
"ext": {
"site": "https://staraugust123456.oss-cn-hangzhou.aliyuncs.com/2.txt",
"dataKey": "staraugust123456",
"dataIv": "staraugust123456",
"version": "120"
}
},
{
"key": "小猪",
"name": "👑小猪丨弹幕",
"type": 3,
"quickSearch": 1,
"api": "csp_AppQi",
"ext": {
"url": "",
"site": "https://tiantangyoulu.oss-cn-beijing.aliyuncs.com/tengxunyun.txt",
"dataKey": "seb5tq9mykp2w9ry",
"dataIv": "seb5tq9mykp2w9ry",
"deviceId": "",
"version": "",
"ua": "okhttp/3.10.0"
}
},
{
"key": "金牌2",
"name": "👑金牌丨弹幕",
"type": 3,
"searchable": 1,
"changeable": 1,
"api": "csp_AppQi",
"ext": {
"site": "https://dtqj1.gg1080.com:443/dtjp.txt",
"dataKey": "kecbio48dsq131ed",
"dataIv": "kecbio48dsq131ed"
}
},
{
"key": "布雷",
"name": "👑布雷丨弹幕",
"type": 3,
"quickSearch": 1,
"api": "csp_AppQi",
"ext": {
"site": "https://ceshi307386.oss-cn-beijing.aliyuncs.com/blurl.txt",
"dataKey": "5f2b7ed203a3a581",
"dataIv": "5f2b7ed203a3a581",
"version": "120"
}
},
{
"key": "仓鼠",
"name": "👑仓鼠丨弹幕",
"type": 3,
"quickSearch": 1,
"api": "csp_AppQi",
"ext": {
"site": "https://ceshi307386.oss-cn-beijing.aliyuncs.com/ceshi430.txt",
"dataKey": "7sKhdca8HXGuyZ4x",
"dataIv": "7sKhdca8HXGuyZ4x",
"version": "120"
}
},
{
"key": "鲸鱼",
"name": "👑鲸鱼丨弹幕",
"type": 3,
"quickSearch": 1,
"api": "csp_AppQi",
"ext": {
"site": "https://jingyu4k-1312635929.cos.ap-nanjing.myqcloud.com/1.json",
"dataKey": "AAdgrdghjfgswerA",
"dataIv": "AAdgrdghjfgswerA"
}
},
{
"key": "数字",
"name": "👑数字丨弹幕",
"type": 3,
"quickSearch": 1,
"api": "csp_AppGet",
"ext": {
"url": "http://app1-0-0.87333.cc",
"dataKey": "VwsHxkCViDXEExWa",
"dataIv": "VwsHxkCViDXEExWa"
}
},
{
"key": "丫丫",
"name": "👑丫丫|弹幕",
"type": 3,
"quickSearch": 1,
"api": "csp_AppGet",
"ext": {
"url": "http://tv.yy-fun.cc",
"dataKey": "qkxnwkfjwpcnwycl",
"dataIv": "qkxnwkfjwpcnwycl",
"deviceId": "",
"version": ""
}
},
{
"key": "八天",
"name": "👑八天丨弹幕",
"type": 3,
"quickSearch": 1,
"api": "csp_AppGet",
"ext": {
"url": "https://dy.8ttv.cn",
"site": "",
"dataKey": "1111111111111111",
"dataIv": "1111111111111111",
"deviceId": "",
"version": "",
"ua": ""
}
},
{
"key": "茉莉",
"name": "👑茉莉|弹幕",
"type": 3,
"searchable": 1,
"api": "csp_AppGet",
"ext": {
"site": "https://gitee.com/wmmoliill/wimg/raw/master/img/bk/9.txt",
"dataKey": "88689667dce61725",
"dataIv": "88689667dce61725"
}
},
{
"key": "旗星",
"name": "👑旗星|弹幕",
"type": 3,
"quickSearch": 1,
"api": "csp_AppGet",
"ext": {
"url": "http://ys.qist.top",
"dataKey": "2SWSPFxugBLPPOKo",
"dataIv": "2SWSPFxugBLPPOKo",
"version": "120"
}
},
{
"key": "驿站",
"name": "👑驿站|弹幕",
"type": 3,
"quickSearch": 1,
"api": "csp_AppGet",
"ext": {
"site": "https://dyyztvappapigoodgx.68.gy:12689/ciwk28vu38io8/apiurl.txt",
"dataKey": "dyyztvapiappyyds",
"dataIv": "dyyztvapiappyyds"
}
},
{
"key": "火锅",
"name": "👑火锅|弹幕",
"type": 3,
"quickSearch": 1,
"api": "csp_AppGet",
"ext": {
"url": "https://ios.hgyx.vip",
"dataKey": "062dec75d039980e",
"dataIv": "062dec75d039980e",
"ua": "Dart/3.5 (dart:io)"
}
},
{
"key": "粉象世界",
"name": "👑粉象|弹幕",
"type": 3,
"changeable": 0,
"api": "csp_AppFox",
"ext": {
"host": "http://121.40.131.51:2556/host.json",
"ver": 2
}
},
{
"key": "老丫",
"name": "👑老雅┃影视",
"type": 3,
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"changeable": 1,
"api": "./api/c971b46d3dedf50d9cb99ae963206db6.js",
"ext": {
"host": "https://app2512.ystva.com"
}
},
{
"key": "小猫",
"name": "👑小猫┃影视",
"type": 3,
"searchable": 1,
"changeable": 1,
"api": "csp_AppGet",
"ext": {
"site": "http://xywlkj.oss-cn-beijing.aliyuncs.com/wp-content/uploads/2024/12/1.txt",
"dataKey": "xmyxmyxywlkjxywl",
"dataIv": "xmyxmyxywlkjxywl"
}
},
{
"key": "花柳",
"name": "👑花柳┃影视",
"type": 3,
"changeable": 0,
"api": "csp_AppFox",
"ext": {
"host": "http://nico.oiio.fun",
"ver": 2
}
},
{
"key": "cat_荐片app",
"name": "🥇荐片|备用",
@@ -1475,7 +1496,25 @@
"quickSearch": 1,
"filterable": 1,
"changeable": 1,
"api": "https://xvt68j53fh.coze.site/api/proxy/browse?u=aHR0cHM6Ly9ieTEuNDMwNTIwLnh5ei93Yi9kb3duLnBocC85M2UwZGVjZWZlM2EyYWQ4OTQ5YzVmZTM4OWQ2Y2FiMi5qcw%3D%3D&mode=browse"
"api": "./api/93e0decefe3a2ad8949c5fe389d6cab2.js"
},
{
"key": "采集之王",
"name": "🐢采集|合集",
"type": 3,
"api": "./api/drpy2.min.js",
"ext": "./js/采集之王.js?type=url&params=https://cdn.jsdmirror.com/gh/ouhaibo1980/tvbox@main/json/采集静态.json$1$1"
},
{
"key": "巧技2",
"name": "🔍搜艘┃影视",
"type": 3,
"searchable": 1,
"quickSearch": 1,
"api": "csp_qiao2",
"playerType": 2,
"jar": "./jars/巧技2.jar",
"ext": "7lj763gg402i7942412h849jg1558j9jl8g19213il86316k465719lik158491h179312h4934183ig2l05g9"
},
{
"key": "push_agent",
@@ -1519,7 +1558,7 @@
{
"name": "失败手动换",
"type": "1",
"url": "https://by1.nxog.eu.org/jx.php?ou=74&mz=0&url=",
"url": "https://by1.nxog.eu.org/jx.php?ou=77&mz=0&url=",
"ext": {
"header": {
"user-agent": "Mozilla/5.0(Linux;Android13;V2049ABuild/TP1A.220624.014;wv)AppleWebKit/537.36(KHTML,likeGecko)Version/4.0Chrome/116.0.0.0MobileSafari/537.36"
@@ -1529,17 +1568,17 @@
{
"name": "-关注-",
"type": 1,
"url": "https://by1.nxog.eu.org/jx.php?ou=74&mz=1&url="
"url": "https://by1.nxog.eu.org/jx.php?ou=77&mz=1&url="
},
{
"name": "-装歌API-",
"type": 1,
"url": "https://by1.nxog.eu.org/jx.php?ou=74&mz=2&url="
"url": "https://by1.nxog.eu.org/jx.php?ou=77&mz=2&url="
},
{
"name": "-公众号-",
"type": 1,
"url": "https://by1.nxog.eu.org/jx.php?ou=74&mz=3&url="
"url": "https://by1.nxog.eu.org/jx.php?ou=77&mz=3&url="
},
{
"name": "装歌APP",
@@ -1,187 +0,0 @@
# -*- coding: utf-8 -*-
# 本资源来源于互联网公开渠道,仅可用于个人学习及爬虫技术交流。
# 严禁将其用于任何商业用途,下载后请于 24 小时内删除,搜索结果均来自源站,本人不承担任何责任。
"""
{
"key": "xxx",
"name": "xxx",
"type": 3,
"api": "./ApptoV5无加密.py",
"ext": "http://domain.com"
}
"""
import re,sys,uuid
from base.spider import Spider
sys.path.append('..')
class Spider(Spider):
host,config,local_uuid,parsing_config = '','','',[]
headers = {
'User-Agent': "Dart/2.19 (dart:io)",
'Accept-Encoding': "gzip",
'appto-local-uuid': local_uuid
}
def init(self, extend=''):
try:
host = extend.strip()
if not host.startswith('http'):
return {}
if not re.match(r'^https?://[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(:\d+)?/?$', host):
host_=self.fetch(host).json()
self.host = host_['domain']
else:
self.host = host
self.local_uuid = str(uuid.uuid4())
response = self.fetch(f'{self.host}/apptov5/v1/config/get?p=android&__platform=android', headers=self.headers).json()
config = response['data']
self.config = config
parsing_conf = config['get_parsing']['lists']
parsing_config = {}
for i in parsing_conf:
if len(i['config']) != 0:
label = []
for j in i['config']:
if j['type'] == 'json':
label.append(j['label'])
parsing_config.update({i['key']:label})
self.parsing_config = parsing_config
return None
except Exception as e:
print(f'初始化异常:{e}')
return {}
def detailContent(self, ids):
response = self.fetch(f"{self.host}/apptov5/v1/vod/getVod?id={ids[0]}",headers=self.headers).json()
data3 = response['data']
videos = []
vod_play_url = ''
vod_play_from = ''
for i in data3['vod_play_list']:
play_url = ''
for j in i['urls']:
play_url += f"{j['name']}${i['player_info']['from']}@{j['url']}#"
vod_play_from += i['player_info']['show'] + '$$$'
vod_play_url += play_url.rstrip('#') + '$$$'
vod_play_url = vod_play_url.rstrip('$$$')
vod_play_from = vod_play_from.rstrip('$$$')
videos.append({
'vod_id': data3.get('vod_id'),
'vod_name': data3.get('vod_name'),
'vod_content': data3.get('vod_content'),
'vod_remarks': data3.get('vod_remarks'),
'vod_director': data3.get('vod_director'),
'vod_actor': data3.get('vod_actor'),
'vod_year': data3.get('vod_year'),
'vod_area': data3.get('vod_area'),
'vod_play_from': vod_play_from,
'vod_play_url': vod_play_url
})
return {'list': videos}
def searchContent(self, key, quick, pg='1'):
url = f"{self.host}/apptov5/v1/search/lists?wd={key}&page={pg}&type=&__platform=android"
response = self.fetch(url, headers=self.headers).json()
data = response['data']['data']
for i in data:
if i.get('vod_pic').startswith('mac://'):
i['vod_pic'] = i['vod_pic'].replace('mac://', 'http://', 1)
return {'list': data, 'page': pg, 'total': response['data']['total']}
def playerContent(self, flag, id, vipflags):
default_ua = 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'
parsing_config = self.parsing_config
parts = id.split('@')
if len(parts) != 2:
return {'parse': 0, 'url': id, 'header': {'User-Agent': default_ua}}
playfrom, rawurl = parts
label_list = parsing_config.get(playfrom)
if not label_list:
return {'parse': 0, 'url': rawurl, 'header': {'User-Agent': default_ua}}
result = {'parse': 1, 'url': rawurl, 'header': {'User-Agent': default_ua}}
for label in label_list:
payload = {
'play_url': rawurl,
'label': label,
'key': playfrom
}
try:
response = self.post(
f"{self.host}/apptov5/v1/parsing/proxy?__platform=android",
data=payload,
headers=self.headers
).json()
except Exception as e:
print(f"请求异常: {e}")
continue
if not isinstance(response, dict):
continue
if response.get('code') == 422:
continue
data = response.get('data')
if not isinstance(data, dict):
continue
url = data.get('url')
if not url:
continue
ua = data.get('UA') or data.get('UserAgent') or default_ua
result = {
'parse': 0,
'url': url,
'header': {'User-Agent': ua}
}
break
return result
def homeContent(self, filter):
config = self.config
if not config:
return {}
home_cate = config['get_home_cate']
classes = []
for i in home_cate:
if isinstance(i.get('extend', []),dict):
classes.append({'type_id': i['cate'], 'type_name': i['title']})
return {'class': classes}
def homeVideoContent(self):
response = self.fetch(f'{self.host}/apptov5/v1/home/data?id=1&mold=1&__platform=android',headers=self.headers).json()
data = response['data']
vod_list = []
for i in data['sections']:
for j in i['items']:
vod_pic = j.get('vod_pic')
if vod_pic.startswith('mac://'):
vod_pic = vod_pic.replace('mac://', 'http://', 1)
vod_list.append({
"vod_id": j.get('vod_id'),
"vod_name": j.get('vod_name'),
"vod_pic": vod_pic,
"vod_remarks": j.get('vod_remarks')
})
return {'list': vod_list}
def categoryContent(self, tid, pg, filter, extend):
response = self.fetch(f"{self.host}/apptov5/v1/vod/lists?area={extend.get('area','')}&lang={extend.get('lang','')}&year={extend.get('year','')}&order={extend.get('sort','time')}&type_id={tid}&type_name=&page={pg}&pageSize=21&__platform=android", headers=self.headers).json()
data = response['data']
data2 = data['data']
for i in data['data']:
if i.get('vod_pic','').startswith('mac://'):
i['vod_pic'] = i['vod_pic'].replace('mac://', 'http://', 1)
return {'list': data2, 'page': pg, 'total': data['total']}
def getName(self):
pass
def isVideoFormat(self, url):
pass
def manualVideoCheck(self):
pass
def destroy(self):
pass
def localProxy(self, param):
pass
@@ -0,0 +1,475 @@
import 'assets://js/lib/crypto-js.js';
const UA = 'Mozilla/5.0 (Linux; Android 9; V2196A Build/PQ3A.190705.08211809; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/91.0.4472.114 Mobile Safari/537.36;webank/h5face;webank/1.0;netType:NETWORK_WIFI;appVersion:416;packageName:com.jp3.xg3';
const aggConfig = {
keys: 'd3dGiJc651gSQ8w1',
charMap: {
'+': 'P', '/': 'X', '0': 'M', '1': 'U', '2': 'l', '3': 'E', '4': 'r', '5': 'Y', '6': 'W', '7': 'b', '8': 'd', '9': 'J',
'A': '9', 'B': 's', 'C': 'a', 'D': 'I', 'E': '0', 'F': 'o', 'G': 'y', 'H': '_', 'I': 'H', 'J': 'G', 'K': 'i', 'L': 't',
'M': 'g', 'N': 'N', 'O': 'A', 'P': '8', 'Q': 'F', 'R': 'k', 'S': '3', 'T': 'h', 'U': 'f', 'V': 'R', 'W': 'q', 'X': 'C',
'Y': '4', 'Z': 'p', 'a': 'm', 'b': 'B', 'c': 'O', 'd': 'u', 'e': 'c', 'f': '6', 'g': 'K', 'h': 'x', 'i': '5', 'j': 'T',
'k': '-', 'l': '2', 'm': 'z', 'n': 'S', 'o': 'Z', 'p': '1', 'q': 'V', 'r': 'v', 's': 'j', 't': 'Q', 'u': '7', 'v': 'D',
'w': 'w', 'x': 'n', 'y': 'L', 'z': 'e'
},
headers: {
default: { 'User-Agent': 'okhttp/3.12.11', 'content-type': 'application/json; charset=utf-8' }
},
platform: {
百度: { host: 'https://api.jkyai.top', url1: '/API/bddjss.php?name=fyclass&page=fypage', url2: '/API/bddjss.php?id=fyid', search: '/API/bddjss.php?name=**&page=fypage' },
锦鲤: { host: 'https://api.jinlidj.com', search: '/api/search', url2: '/api/detail' },
番茄: { host: 'https://reading.snssdk.com', url1: '/reading/bookapi/bookmall/cell/change/v', url2: 'https://fqgo.52dns.cc/catalog', search: 'https://fqgo.52dns.cc/search' },
星芽: { host: 'https://app.whjzjx.cn', url1: '/cloud/v2/theater/home_page?theater_class_id', url2: '/v2/theater_parent/detail', search: '/v3/search', loginUrl: 'https://u.shytkjgs.com/user/v1/account/login' },
西饭: { host: 'https://xifan-api-cn.youlishipin.com', url1: '/xifan/drama/portalPage', url2: '/xifan/drama/getDuanjuInfo', search: '/xifan/search/getSearchList' },
软鸭: { host: 'https://api.xingzhige.com', url1: '/API/playlet', search: '/API/playlet' },
七猫: { host: 'https://api-store.qmplaylet.com', url1: '/api/v1/playlet/index', url2: 'https://api-read.qmplaylet.com/player/api/v1/playlet/info', search: '/api/v1/playlet/search' },
围观: { host: 'https://api.drama.9ddm.com', url1: '/drama/home/shortVideoTags', url2: '/drama/home/shortVideoDetail', search: '/drama/home/search' },
甜圈: { host: 'https://mov.cenguigui.cn', url1: '/duanju/api.php?classname', url2: '/duanju/api.php?book_id', search: '/duanju/api.php?name' }
},
platformList: [
{ name: '甜圈短剧', id: '甜圈' }, { name: '七猫短剧', id: '七猫' }, { name: '锦鲤短剧', id: '锦鲤' },
{ name: '番茄短剧', id: '番茄' }, { name: '星芽短剧', id: '星芽' }, { name: '西饭短剧', id: '西饭' },
{ name: '软鸭短剧', id: '软鸭' }, { name: '百度短剧', id: '百度' }, { name: '围观短剧', id: '围观' }
],
search: { limit: 30, timeout: 6000 }
};
const ruleFilterDef = {
百度: { area: '逆袭' },
锦鲤: { area: '' },
番茄: { area: 'videoseries_hot' },
星芽: { area: '1' },
西饭: { area: '' },
软鸭: { area: '战神' },
七猫: { area: '0' },
围观: { area: '' },
甜圈: { area: '推荐榜' }
};
const filterOptionsB64 = "eyLnlJzlnIgiOlt7ImtleSI6ImFyZWEiLCJuYW1lIjoi5Ymn5oOFIiwidmFsdWUiOlt7Im4iOiLlhajpg6giLCJ2IjoiIn0seyJuIjoi5o6o6I2Q5qacIiwidiI6IuaOqOiNkOamnCJ9LHsibiI6IueDreaSreamnCIsInYiOiLng63mkq3mppwifSx7Im4iOiLmlrDkuabmppwiLCJ2Ijoi5paw5Lmm5qacIn0seyJuIjoi5a6M57uT5qacIiwidiI6IuWujOe7k+amnCJ9LHsibiI6Iui/nui9veamnCIsInYiOiLov57ovb3mppwifSx7Im4iOiLlhY3otLnmppwiLCJ2Ijoi5YWN6LS55qacIn0seyJuIjoi5paw5YmnIiwidiI6IuaWsOWJpyJ9LHsibiI6IumAhuiirSIsInYiOiLpgIbooq0ifSx7Im4iOiLpnLjmgLsiLCJ2Ijoi6Zy45oC7In0seyJuIjoi546w5Luj6KiA5oOFIiwidiI6IueOsOS7o+iogOaDhSJ9LHsibiI6IuaJk+iEuOiZkOa4oyIsInYiOiLmiZPohLjomZDmuKMifSx7Im4iOiLosarpl6jmganmgKgiLCJ2Ijoi6LGq6Zeo5oGp5oCoIn0seyJuIjoi56We6LGqIiwidiI6IuelnuixqiJ9LHsibiI6IumprOeUsiIsInYiOiLpqaznlLIifSx7Im4iOiLpg73luILml6XluLgiLCJ2Ijoi6YO95biC5pel5bi4In0seyJuIjoi5oiY56We5b2S5p2lIiwidiI6IuaImOelnuW9kuadpSJ9LHsibiI6IuWwj+S6uueJqSIsInYiOiLlsI/kurrniakifSx7Im4iOiLlpbPmgKfmiJDplb8iLCJ2Ijoi5aWz5oCn5oiQ6ZW/In0seyJuIjoi5aSn5aWz5Li7IiwidiI6IuWkp+Wls+S4uyJ9LHsibiI6Iuepv+i2iiIsInYiOiLnqb/otooifSx7Im4iOiLpg73luILkv67ku5kiLCJ2Ijoi6YO95biC5L+u5LuZIn0seyJuIjoi5by66ICF5Zue5b2SIiwidiI6IuW8uuiAheWbnuW9kiJ9LHsibiI6IuS6suaDhSIsInYiOiLkurLmg4UifSx7Im4iOiLlj6Too4UiLCJ2Ijoi5Y+k6KOFIn0seyJuIjoi6YeN55SfIiwidiI6IumHjeeUnyJ9LHsibiI6IumXquWpmiIsInYiOiLpl6rlqZoifSx7Im4iOiLotZjlqb/pgIbooq0iLCJ2Ijoi6LWY5am/6YCG6KKtIn0seyJuIjoi6JmQ5oGLIiwidiI6IuiZkOaBiyJ9LHsibiI6Iui/veWmuyIsInYiOiLov73lprsifSx7Im4iOiLlpKnkuIvml6DmlYwiLCJ2Ijoi5aSp5LiL5peg5pWMIn0seyJuIjoi5a625bqt5Lym55CGIiwidiI6IuWutuW6reS8pueQhiJ9LHsibiI6IuiQjOWunSIsInYiOiLokIzlrp0ifSx7Im4iOiLlj6Tpo47mnYPosIsiLCJ2Ijoi5Y+k6aOO5p2D6LCLIn0seyJuIjoi6IGM5Zy6IiwidiI6IuiBjOWcuiJ9LHsibiI6IuWlh+W5u+iEkea0niIsInYiOiLlpYflubvohJHmtJ4ifSx7Im4iOiLlvILog70iLCJ2Ijoi5byC6IO9In0seyJuIjoi5peg5pWM56We5Yy7IiwidiI6IuaXoOaVjOelnuWMuyJ9LHsibiI6IuWPpOmjjuiogOaDhSIsInYiOiLlj6Tpo47oqIDmg4UifSx7Im4iOiLkvKDmib/op4nphpIiLCJ2Ijoi5Lyg5om/6KeJ6YaSIn0seyJuIjoi546w6KiA55Sc5a6gIiwidiI6IueOsOiogOeUnOWuoCJ9LHsibiI6IuWlh+W5u+eIseaDhSIsInYiOiLlpYflubvniLHmg4UifSx7Im4iOiLkuaHmnZEiLCJ2Ijoi5Lmh5p2RIn0seyJuIjoi5Y6G5Y+y5Y+k5LujIiwidiI6IuWOhuWPsuWPpOS7oyJ9LHsibiI6IueOi+WmgyIsInYiOiLnjovlpoMifSx7Im4iOiLpq5jmiYvkuIvlsbEiLCJ2Ijoi6auY5omL5LiL5bGxIn0seyJuIjoi5aix5LmQ5ZyIIiwidiI6IuWoseS5kOWciCJ9XX1dLCLplKbpsqQiOlt7ImtleSI6ImFyZWEiLCJuYW1lIjoi5YiG57G7IiwidmFsdWUiOlt7Im4iOiLlhajpg6giLCJ2IjoiIn0seyJuIjoi5oOF5oSf5YWz57O7IiwidiI6IjEifSx7Im4iOiLmiJDplb/pgIbooq0iLCJ2IjoiMiJ9LHsibiI6IuWlh+W5u+W8guiDvSIsInYiOiIzIn0seyJuIjoi5oiY5paX54Ot6KGAIiwidiI6IjQifSx7Im4iOiLkvKbnkIbnjrDlrp4iLCJ2IjoiNSJ9LHsibiI6IuaXtuepuuepv+i2iiIsInYiOiI2In0seyJuIjoi5p2D6LCL6Lqr5Lu9IiwidiI6IjcifV19XSwi55Wq6IyEIjpbeyJrZXkiOiJhcmVhIiwibmFtZSI6IuWIhuexuyIsInZhbHVlIjpbeyJuIjoi54Ot5YmnIiwidiI6InZpZGVvc2VyaWVzX2hvdCJ9LHsibiI6IuaWsOWJpyIsInYiOiJmaXJzdG9ubGluZXRpbWVfbmV3In0seyJuIjoi6YCG6KKtIiwidiI6ImNhdGVfNzM5In0seyJuIjoi5oC76KOBIiwidiI6ImNhdGVfMjkifSx7Im4iOiLnjrDoqIAiLCJ2IjoiY2F0ZV8zIn0seyJuIjoi5omT6IS4IiwidiI6ImNhdGVfMTA1MSJ9LHsibiI6IumprOeUsiIsInYiOiJjYXRlXzI2NiJ9LHsibiI6IuixqumXqCIsInYiOiJjYXRlXzEwNTMifSx7Im4iOiLpg73luIIiLCJ2IjoiY2F0ZV8yNjEifSx7Im4iOiLnpZ7osaoiLCJ2IjoiY2F0ZV8yMCJ9XX1dLCLmmJ/oir0iOlt7ImtleSI6ImFyZWEiLCJuYW1lIjoi5YiG57G7IiwidmFsdWUiOlt7Im4iOiLliaflnLoiLCJ2IjoiMSJ9LHsibiI6IueDreaSreWJpyIsInYiOiIyIn0seyJuIjoi5Lya5ZGY5LiT5LqrIiwidiI6IjgifSx7Im4iOiLmmJ/pgInlpb3liaciLCJ2IjoiNyJ9LHsibiI6IuaWsOWJpyIsInYiOiIzIn0seyJuIjoi6Ziz5YWJ5Ymn5Zy6IiwidiI6IjUifV19XSwi6KW/6aWtIjpbeyJrZXkiOiJhcmVhIiwibmFtZSI6IuWIhuexuyIsInZhbHVlIjpbeyJuIjoi5YWo6YOoIiwidiI6IiJ9LHsibiI6IumDveW4giIsInYiOiI2OEDpg73luIIifSx7Im4iOiLpnZLmmKUiLCJ2IjoiNjhA6Z2S5pilIn0seyJuIjoi546w5Luj6KiA5oOFIiwidiI6IjgxQOeOsOS7o+iogOaDhSJ9LHsibiI6IuixqumXqCIsInYiOiI4MUDosarpl6gifSx7Im4iOiLlpKflpbPkuLsiLCJ2IjoiODBA5aSn5aWz5Li7In0seyJuIjoi6YCG6KKtIiwidiI6Ijc5QOmAhuiirSJ9LHsibiI6IuaJk+iEuOiZkOa4oyIsInYiOiI3OUDmiZPohLjomZDmuKMifSx7Im4iOiLnqb/otooiLCJ2IjoiODFA56m/6LaKIn1dfV0sIui9r+m4rSI6W3sia2V5IjoiYXJlYSIsIm5hbWUiOiLliIbnsbsiLCJ2YWx1ZSI6W3sibiI6IuWFqOmDqCIsInYiOiIifSx7Im4iOiLmiJjnpZ4iLCJ2Ijoi5oiY56WeIn0seyJuIjoi6YCG6KKtIiwidiI6IumAhuiirSJ9LHsibiI6IumcuOaAuyIsInYiOiLpnLjmgLsifSx7Im4iOiLnpZ7osaoiLCJ2Ijoi56We6LGqIn0seyJuIjoi6YO95biCIiwidiI6IumDveW4giJ9LHsibiI6IueOhOW5uyIsInYiOiLnjoTlubsifSx7Im4iOiLoqIDmg4UiLCJ2Ijoi6KiA5oOFIn1dfV0sIuS4g+eMqyI6W3sia2V5IjoiYXJlYSIsIm5hbWUiOiLliIbnsbsiLCJ2YWx1ZSI6W3sibiI6IuWFqOmDqCIsInYiOiIifSx7Im4iOiLmjqjojZAiLCJ2IjoiMCJ9LHsibiI6IuaWsOWJpyIsInYiOiItMSJ9LHsibiI6IumDveW4guaDheaEnyIsInYiOiIxMjczIn0seyJuIjoi5Y+k6KOFIiwidiI6IjEyNzIifSx7Im4iOiLpg73luIIiLCJ2IjoiNTcxIn0seyJuIjoi546E5bm75LuZ5L6gIiwidiI6IjEyODYifSx7Im4iOiLlpYflubsiLCJ2IjoiNTcwIn0seyJuIjoi5Lmh5p2RIiwidiI6IjU5MCJ9LHsibiI6IuawkeWbvSIsInYiOiI1NzMifSx7Im4iOiLlubTku6MiLCJ2IjoiNTcyIn0seyJuIjoi6Z2S5pil5qCh5ZutIiwidiI6IjEyODgifSx7Im4iOiLmrabkvqAiLCJ2IjoiMzcxIn0seyJuIjoi56eR5bm7IiwidiI6IjU5NCJ9LHsibiI6Iuacq+S4liIsInYiOiI1NTYifSx7Im4iOiLkuozmrKHlhYMiLCJ2IjoiMTI4OSJ9LHsibiI6IumAhuiirSIsInYiOiI0MDAifSx7Im4iOiLnqb/otooiLCJ2IjoiMzczIn0seyJuIjoi5aSN5LuHIiwidiI6Ijc5NSJ9LHsibiI6Iuezu+e7nyIsInYiOiI3ODcifSx7Im4iOiLmnYPosIsiLCJ2IjoiNzkwIn0seLine truncated
let xingya_headers = {};
function base64Encode(text) {
return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(text));
}
function base64Decode(text) {
return CryptoJS.enc.Utf8.stringify(CryptoJS.enc.Base64.parse(text));
}
async function request(url, options = {}) {
const { method = 'GET', headers = {}, body, timeout = 5000 } = options;
const isPost = method.toUpperCase() === 'POST';
let requestBody = body && typeof body === 'object' ? JSON.stringify(body) : body;
if (typeof req !== 'undefined') {
return (await req(url, {
method,
headers: { ...aggConfig.headers.default, ...headers },
body: isPost ? requestBody : null,
timeout
})).content;
}
}
async function md5(str) {
return CryptoJS.MD5(str).toString(CryptoJS.enc.Hex).toLowerCase();
}
function guid() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {
const r = Math.random() * 16 | 0;
return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
});
}
function getFilterOptions() {
try {
return JSON.parse(base64Decode(filterOptionsB64));
} catch (e) {
console.error('filterOptions 解码失败', e);
return {};
}
}
async function getQmParamsAndSign() {
const sessionId = Date.now().toString();
const data = {
"static_score": "0.8",
"uuid": "00000000-7fc7-08dc-0000-000000000000",
"device-id": "20250220125449b9b8cac84c2dd3d035c9052a2572f7dd0122edde3cc42a70",
"sourceuid": "aa7de295aad621a6",
"refresh-type": "0",
"model": "22021211RC",
"client-id": "aa7de295aad621a6",
"brand": "Redmi",
"sys-ver": "12",
"phone-level": "H",
"wlb-uid": "aa7de295aad621a6",
"session-id": sessionId
};
const jsonStr = JSON.stringify(data);
const base64Str = base64Encode(unescape(encodeURIComponent(jsonStr)));
let qmParams = '';
for (const c of base64Str) {
qmParams += aggConfig.charMap[c] || c;
}
const paramsStr = `AUTHORIZATION=app-version=10001application-id=com.duoduo.readchannel=unknownis-white=net-env=5platform=androidqm-params=${qmParams}reg=${aggConfig.keys}`;
const sign = await md5(paramsStr);
return { qmParams, sign };
}
async function getHeaderX() {
const { qmParams, sign } = await getQmParamsAndSign();
return {
'net-env': '5',
'reg': '',
'channel': 'unknown',
'is-white': '',
'platform': 'android',
'application-id': 'com.duoduo.read',
'authorization': '',
'app-version': '10001',
'user-agent': 'webviewversion/0',
'qm-params': qmParams,
'sign': sign
};
}
async function init(cfg) {
try {
const res = JSON.parse(await request(aggConfig.platform.星芽.loginUrl, {
method: 'POST',
headers: { 'User-Agent': 'okhttp/4.10.0', platform: '1', 'Content-Type': 'application/json' },
body: JSON.stringify({ device: '24250683a3bdb3f118dff25ba4b1cba1a' })
}));
const token = res?.data?.token || res?.token;
xingya_headers = token ? { ...aggConfig.headers.default, authorization: token } : aggConfig.headers.default;
} catch (e) {
xingya_headers = aggConfig.headers.default;
}
return true;
}
async function getXingyaHeaders() {
return xingya_headers.authorization ? xingya_headers : aggConfig.headers.default;
}
async function home(filter) {
const classes = aggConfig.platformList.map(p => ({ type_name: p.name, type_id: p.id }));
const filters = {};
const filterOptions = getFilterOptions();
aggConfig.platformList.forEach(item => {
const platformId = item.id;
if (filterOptions[platformId]) {
filters[platformId] = filterOptions[platformId];
}
});
return JSON.stringify({ class: classes, filters });
}
async function homeVod() { return await recommend(); }
async function recommend() {
const randomPlat = aggConfig.platformList[Math.floor(Math.random() * aggConfig.platformList.length)];
const platId = randomPlat.id;
const area = ruleFilterDef[platId]?.area || '';
const videos = await category(platId, 1, false, { area });
const list = JSON.parse(videos).list.slice(0, 10).map(v => ({ ...v, vod_content: `${randomPlat.name} | ${v.vod_remarks}` }));
return JSON.stringify({ list });
}
async function category(tid, pg, filter, extend) {
const plat = aggConfig.platform[tid];
const area = (extend?.area !== undefined ? extend.area : ruleFilterDef[tid]?.area) || '';
const page = parseInt(pg) || 1;
const videos = [];
if (!plat) return JSON.stringify({ list: videos, page, pagecount: 1, limit: 0, total: 0 });
try {
if (tid === '七猫') {
const sign = await md5(`operation=1playlet_privacy=1tag_id=${area}${aggConfig.keys}`);
const url = `${plat.host}${plat.url1}?tag_id=${area}&playlet_privacy=1&operation=1&sign=${sign}`;
const res = JSON.parse(await request(url, { headers: { ...await getHeaderX(), ...aggConfig.headers.default } }));
(res?.data?.list || []).forEach(i => videos.push({
vod_id: `七猫@${encodeURIComponent(i.playlet_id)}`,
vod_name: i.title,
vod_pic: i.image_link,
vod_remarks: `${i.total_episode_num}集`
}));
} else if (tid === '百度') {
const url = `${plat.host}${plat.url1.replace('fyclass', area).replace('fypage', page)}`;
const res = JSON.parse(await request(url));
if (res?.data) videos.push(...res.data.map(i => ({
vod_id: `百度@${i.id}`, vod_name: i.title, vod_pic: i.cover, vod_remarks: `更新至${i.totalChapterNum}集`
})));
} else if (tid === '锦鲤') {
const res = JSON.parse(await request(plat.host + plat.search, { method: 'POST', body: JSON.stringify({ page, limit: 24, type_id: area, keyword: '' }) }));
if (res?.data?.list) videos.push(...res.data.list.map(i => ({
vod_id: `锦鲤@${i.vod_id}`, vod_name: i.vod_name, vod_pic: i.vod_pic, vod_remarks: `${i.vod_total}集`
})));
} else if (tid === '番茄') {
const sessionId = new Date().toISOString().slice(0, 16).replace(/-|T:/g, '');
let url = `${plat.host}${plat.url1}?change_type=0&selected_items=${area}&tab_type=8&cell_id=6952850996422770718&version_tag=video_feed_refactor&device_id=1423244030195267&aid=1967&app_name=novelapp&ssmix=a&session_id=${sessionId}`;
if (page > 1) url += `&offset=${(page - 1) * 12}`;
const res = JSON.parse(await request(url));
const items = res?.data?.cell_view?.cell_data || (Array.isArray(res?.data) ? res.data : []);
items.forEach(i => {
const v = i.video_data?.[0] || i;
videos.push({ vod_id: `番茄@${v.series_id || v.book_id || ''}`, vod_name: v.title, vod_pic: v.cover || v.horiz_cover, vod_remarks: v.sub_title || '' });
});
} else if (tid === '星芽') {
const headers = await getXingyaHeaders();
const url = `${plat.host}${plat.url1}=${area}&type=1&class2_ids=0&page_num=${page}&page_size=24`;
const res = JSON.parse(await request(url, { headers }));
if (res?.data?.list) videos.push(...res.data.list.map(i => ({
vod_id: `星芽@${plat.host}${plat.url2}?theater_parent_id=${i.theater.id}`,
vod_name: i.theater.title, vod_pic: i.theater.cover_url, vod_remarks: `${i.theater.total}集`
})));
} else if (tid === '西饭') {
const [typeId, typeName] = area.split('@');
const ts = Math.floor(Date.now() / 1000);
const url = `${plat.host}${plat.url1}?reqType=aggregationPage&offset=${(page - 1) * 30}&categoryId=${typeId}&quickEngineVersion=-1&scene=&categoryNames=${encodeURIComponent(typeName || '')}&categoryVersion=1&density=1.5&pageID=page_theater&version=2001001&androidVersionCode=28&requestId=${ts}aa498144140ef297&appId=drama&teenMode=false&userBaseMode=false&session=eyJpbmZvIjp7InVpZCI6IiIsInJ0IjoiMTc0MDY1ODI5NCIsInVuIjoiT1BHXzFlZGQ5OTZhNjQ3ZTQ1MjU4Nzc1MTE2YzFkNzViN2QwIiwiZnQiOiIxNzQwNjU4Mjk0In19&feedssession=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1dHlwIjowLCJidWlkIjoxNjMzOTY4MTI2MTQ4NjQxNTM2LCJhdWQiOiJkcmFtYSIsInZlciI6MiwicmF0IjoxNzQwNjU4Mjk0LCJ1bm0iOiJPUEdfMWVkZDk5NmE2NDdlNDUyNTg3NzUxMTZjMWQ3NWI3ZDAiLCJpZCI6IjNiMzViZmYzYWE0OTgxNDQxNDBlZjI5N2JkMDY5NGNhIiwiZXhwIjoxNzQxMjYzMDk0LCJkYyI6Imd6cXkifQ.JS3QY6ER0P2cQSxAE_OGKSMIWNAMsYUZ3mJTnEpf-Rc`;
const res = JSON.parse(await request(url, { headers: aggConfig.headers.default }));
const elements = res?.result?.elements || [];
elements.forEach(s => (s.contents || []).forEach(v => {
const d = v.duanjuVo;
if (d) {
videos.push({ vod_id: `西饭@${d.duanjuId}#${d.source}`, vod_name: d.title, vod_pic: d.coverImageUrl, vod_remarks: `${d.total}集` });
}
}));
} else if (tid === '软鸭') {
const url = `${plat.host}${plat.url1}/?keyword=${encodeURIComponent(area)}&page=${page}`;
const res = JSON.parse(await request(url));
if (res?.data) videos.push(...res.data.map(i => {
const purl = `${i.title}@${i.cover}@${i.author}@${i.type}@${i.desc}@${i.book_id}`;
return { vod_id: `软鸭@${encodeURIComponent(purl)}`, vod_name: i.title, vod_pic: i.cover, vod_remarks: i.type };
}));
} else if (tid === '围观') {
const res = JSON.parse(await request(`${plat.host}${plat.search}`, {
method: 'POST', body: JSON.stringify({ audience: "全部受众", page, pageSize: 30, searchWord: "", subject: "全部主题" })
}));
if (res?.data) videos.push(...res.data.map(i => ({
vod_id: `围观@${i.oneId}`, vod_name: i.title, vod_pic: i.vertPoster, vod_remarks: `集数:${i.episodeCount} 播放:${i.viewCount}`
})));
} else if (tid === '甜圈') {
const url = `${plat.host}${plat.url1}=${encodeURIComponent(area)}&offset=${page}`;
const res = JSON.parse(await request(url));
if (res?.data) {
videos.push(...res.data.map(i => ({
vod_id: `甜圈@${i.book_id}`,
vod_name: i.title,
vod_pic: i.cover,
vod_remarks: `${i.sub_title || ''}`
})));
}
}
} catch (e) { }
return JSON.stringify({ list: videos, page, pagecount: page + 1, limit: videos.length, total: videos.length * (page + 1) });
}
async function detail(id) {
const [platId, ...rest] = id.split('@');
const did = rest.join('@');
const plat = aggConfig.platform[platId];
if (!plat) return JSON.stringify({ list: [{ vod_id: id, vod_name: '平台不支持', vod_play_url: '' }] });
let vod = { vod_id: id, vod_name: '未知', vod_pic: '', vod_remarks: '', vod_content: '', vod_play_from: '', vod_play_url: '' };
try {
if (platId === '七猫') {
const didDecoded = decodeURIComponent(did);
const sign = await md5(`playlet_id=${didDecoded}${aggConfig.keys}`);
const url = `${plat.url2}?playlet_id=${didDecoded}&sign=${sign}`;
const res = JSON.parse(await request(url, { headers: { ...await getHeaderX(), ...aggConfig.headers.default } }));
if (res?.data) {
const d = res.data;
vod = {
...vod,
vod_name: d.title,
vod_pic: d.image_link,
vod_remarks: `${d.total_episode_num}集`,
vod_content: d.intro,
vod_play_from: '七猫短剧',
vod_play_url: (d.play_list || []).map(i => `${i.sort}$${i.video_url}`).join('#')
};
}
} else if (platId === '百度') {
const res = JSON.parse(await request(`${plat.host}${plat.url2.replace('fyid', did)}`));
if (res) vod = { ...vod, vod_name: res.title, vod_pic: res.data?.[0]?.cover, vod_remarks: `更新至:${res.total || 0}集`, vod_play_from: '百度短剧', vod_play_url: (res.data || []).map(i => `${i.title}$${i.video_id}`).join('#') };
} else if (platId === '锦鲤') {
const res = JSON.parse(await request(`${plat.host}${plat.url2}/${did}`));
if (res?.data) {
const list = res.data;
const urls = list.player ? Object.keys(list.player).map(k => `${k}$${list.player[k]}`) : [];
vod = { ...vod, vod_name: list.vod_name, vod_pic: list.vod_pic, vod_remarks: list.vod_remarks, vod_play_from: '锦鲤短剧', vod_play_url: urls.join('#') };
}
} else if (platId === '番茄') {
const res = JSON.parse(await request(`${plat.url2}?book_id=${did}`));
if (res?.data) {
const b = res.data.book_info;
const u = (res.data.item_data_list || []).map(i => `${i.title}$${i.item_id}`).join('#');
vod = { ...vod, vod_name: b.book_name, vod_pic: b.thumb_url, vod_remarks: `更新至${res.data.item_data_list?.length}集`, vod_play_from: '番茄短剧', vod_play_url: u };
}
} else if (platId === '星芽') {
const headers = await getXingyaHeaders();
const res = JSON.parse(await request(did, { headers }));
if (res?.data) {
const d = res.data;
const u = (d.theaters || []).map(i => `${i.num}$${i.son_video_url}`).join('#');
vod = { ...vod, vod_name: d.title, vod_pic: d.cover_url, vod_remarks: d.desc_tags + '', vod_play_from: '星芽短剧', vod_play_url: u };
}
} else if (platId === '西饭') {
const [duanjuId, source] = did.split('#');
const url = `${plat.host}${plat.url2}?duanjuId=${duanjuId}&source=${source}`;
const res = JSON.parse(await request(url));
if (res?.result) {
const d = res.result;
const u = (d.episodeList || []).map(e => `${e.index}$${e.playUrl}`).join('#');
vod = { ...vod, vod_name: d.title, vod_pic: d.coverImageUrl, vod_remarks: d.updateStatus === 'over' ? `${d.total}集 已完结` : `更新${d.total}集`, vod_play_from: '西饭短剧', vod_play_url: u };
}
} else if (platId === '甜圈') {
const url = `${plat.host}${plat.url2}=${did}`;
const res = JSON.parse(await request(url));
if (res) {
const u = (res.data || []).map(item => `${item.title}$${item.video_id}`).join('#');
vod = { ...vod, vod_name: res.book_name, vod_pic: res.book_pic, vod_remarks: `${res.duration || ''}`, vod_content: res.desc || '', vod_play_from: '甜圈短剧', vod_play_url: u };
}
} else if (platId === '软鸭') {
const didDecoded = decodeURIComponent(did);
const [title, img, author, type, desc, book_id] = didDecoded.split('@');
const detailUrl = `${plat.host}${plat.url1}/?book_id=${book_id || did.split('@')[5]}`;
const res = JSON.parse(await request(detailUrl, { headers: aggConfig.headers.default }));
const u = (res.data?.video_list || []).map(e => `${e.title}$${e.video_id}`).join('#');
vod = { ...vod, vod_name: title, vod_pic: img, vod_remarks: type, vod_content: desc, vod_play_from: '软鸭短剧', vod_play_url: u };
} else if (platId === '围观') {
const res = JSON.parse(await request(`${plat.host}${plat.url2}?oneId=${did}&page=1&pageSize=1000`));
if (res?.data?.length) {
const d = res.data;
vod = { ...vod, vod_name: d[0].title, vod_pic: d[0].vertPoster, vod_remarks: `共${d.length}集`, vod_play_from: '围观短剧', vod_play_url: d.map(e => `${e.title}第${e.playOrder}集$${e.playSetting}`).join('#') };
}
}
} catch (e) { vod.vod_name = '加载失败'; }
return JSON.stringify({ list: [vod] });
}
async function play(flag, id) {
if (/七猫/.test(flag)) {
return JSON.stringify({ parse: 0, url: id });
}
if (/百度/.test(flag)) {
const res = JSON.parse(await request(`https://api.jkyai.top/API/bddjss.php?video_id=${id}`));
if (res?.data?.qualities) {
const order = ["1080p", "sc", "sd"];
const qMap = { "1080p": "蓝光", "sc": "超清", "sd": "标清" };
const urls = [];
order.forEach(k => {
const q = res.data.qualities.find(x => x.quality === k);
if (q) urls.push(qMap[k], q.download_url);
});
return JSON.stringify({ parse: 0, url: urls });
}
}
if (/甜圈/.test(flag)) {
return JSON.stringify({ parse: 0, url: `https://mov.cenguigui.cn/duanju/api.php?video_id=${id}&type=mp4` });
}
if (/锦鲤/.test(flag)) {
try {
const html = await request(`${id}&auto=1`, { headers: { referer: 'https://www.jinlidj.com/' } });
const match = html.match(/let data\s*=\s*({[^;]*});/);
if (match) {
const data = JSON.parse(match[1]);
if (data.url) return JSON.stringify({ parse: 0, url: data.url });
}
} catch {}
}
if (/番茄/.test(flag)) {
try {
const res = JSON.parse(await request(`https://fqgo.52dns.cc/video?item_ids=${id}`));
if (res?.data?.[id]?.video_model) {
const model = JSON.parse(res.data[id].video_model);
const mainUrl = model?.video_list?.video_1?.main_url;
if (mainUrl) return JSON.stringify({ parse: 0, url: base64Decode(mainUrl) });
}
} catch {}
}
if (/软鸭/.test(flag)) {
const response = await request(`${aggConfig.platform.软鸭.host}/API/playlet/?video_id=${id}&quality=1080p`, { headers: aggConfig.headers.default });
const res = JSON.parse(response);
return JSON.stringify({ parse: 0, url: res.data?.video?.url || '' });
}
if (/围观/.test(flag)) {
try {
const ps = typeof id === 'string' ? JSON.parse(id) : id;
const urls = [];
if (ps?.super) urls.push("超清", ps.super);
if (ps?.high) urls.push("高清", ps.high);
if (ps?.normal) urls.push("流畅", ps.normal);
return JSON.stringify({ parse: 0, url: urls });
} catch { return JSON.stringify({ parse: 0, url: id }); }
}
return JSON.stringify({ parse: 0, url: id });
}
async function search(wd, quick, pg) {
const page = parseInt(pg) || 1;
const videos = [];
try {
const sign = await md5(`operation=2playlet_privacy=1search_word=${wd}${aggConfig.keys}`);
const url = `${aggConfig.platform.七猫.host}${aggConfig.platform.七猫.search}?search_word=${encodeURIComponent(wd)}&playlet_privacy=1&operation=2&sign=${sign}`;
const res = JSON.parse(await request(url, {
headers: { ...await getHeaderX(), ...aggConfig.headers.default },
timeout: aggConfig.search.timeout
}));
(res?.data?.list || []).forEach(i => {
if (i.title.toLowerCase().includes(wd.toLowerCase())) {
videos.push({
vod_id: `七猫@${encodeURIComponent(i.playlet_id)}`,
vod_name: i.title,
vod_pic: i.image_link,
vod_remarks: `七猫短剧|${i.total_episode_num}集`
});
}
});
} catch {}
const platforms = ['百度', '锦鲤', '番茄', '星芽', '西饭', '软鸭', '围观', '甜圈'];
for (const tid of platforms) {
const plat = aggConfig.platform[tid];
try {
let res, data;
if (tid === '百度') {
res = await request(`${plat.host}${plat.search.replace('**', encodeURIComponent(wd)).replace('fypage', page)}`);
data = (JSON.parse(res)?.data || []).map(i => ({ vod_id: `百度@${i.id}`, vod_name: i.title, vod_pic: i.cover, vod_remarks: `百度短剧|更新至${i.totalChapterNum}集` }));
} else if (tid === '锦鲤') {
res = await request(plat.host + plat.search, { method: 'POST', body: JSON.stringify({ page, limit: 30, keyword: wd }) });
data = (JSON.parse(res)?.data?.list || []).map(i => ({ vod_id: `锦鲤@${i.vod_id}`, vod_name: i.vod_name, vod_pic: i.vod_pic, vod_remarks: `锦鲤短剧|${i.vod_total}集` }));
} else if (tid === '番茄') {
res = await request(`${plat.search}?keyword=${encodeURIComponent(wd)}&page=${page}`);
data = (JSON.parse(res)?.data || []).map(i => ({ vod_id: `番茄@${i.series_id}`, vod_name: i.title, vod_pic: i.cover, vod_remarks: `番茄短剧|${i.sub_title}` }));
} else if (tid === '星芽') {
const headers = await getXingyaHeaders();
res = await request(plat.host + plat.search, { method: 'POST', headers, body: JSON.stringify({ text: wd }) });
data = (JSON.parse(res)?.data?.theater?.search_data || []).map(i => ({ vod_id: `星芽@${plat.host}${plat.url2}?theater_parent_id=${i.id}`, vod_name: i.title, vod_pic: i.cover_url, vod_remarks: `星芽短剧|${i.total}集 播放:${i.play_amount_str}` }));
} else if (tid === '西饭') {
const ts = Math.floor(Date.now() / 1000);
const url = `${plat.host}${plat.search}?reqType=search&offset=${(page - 1) * 30}&keyword=${encodeURIComponent(wd)}&quickEngineVersion=-1&scene=`;
res = await request(url);
data = (JSON.parse(res)?.result?.elements || []).map(vod => {
const dj = vod.duanjuVo || {};
return { vod_id: `西饭@${dj.duanjuId}#${dj.source}`, vod_name: dj.title, vod_pic: dj.coverImageUrl, vod_remarks: `西饭短剧|${dj.total}集` };
});
} else if (tid === '软鸭') {
res = await request(`${plat.host}${plat.search}/?keyword=${encodeURIComponent(wd)}&page=${page}`);
data = (JSON.parse(res)?.data || []).map(i => {
const purl = `${i.title}@${i.cover}@${i.author}@${i.type}@${i.desc}@${i.book_id}`;
return { vod_id: `软鸭@${encodeURIComponent(purl)}`, vod_name: i.title, vod_pic: i.cover, vod_remarks: `软鸭短剧|${i.type}` };
});
} else if (tid === '围观') {
res = await request(`${plat.host}${plat.search}`, {
method: 'POST',
body: JSON.stringify({ audience: "", page, pageSize: 30, searchWord: wd, subject: "" })
});
data = (JSON.parse(res)?.data || []).map(i => ({ vod_id: `围观@${i.oneId}`, vod_name: i.title, vod_pic: i.vertPoster, vod_remarks: `围观短剧|集数:${i.episodeCount} 播放:${i.viewCount}` }));
} else if (tid === '甜圈') {
const url = `${plat.host}${plat.search}=${encodeURIComponent(wd)}&offset=${page}`;
res = await request(url);
data = (JSON.parse(res)?.data || []).map(i => ({
vod_id: `甜圈@${i.book_id}`,
vod_name: i.title,
vod_pic: i.cover,
vod_remarks: `甜圈短剧|${i.sub_title || '无简介'}`
}));
}
if (data) videos.push(...data.filter(v => v.vod_name?.toLowerCase().includes(wd.toLowerCase())));
} catch {}
}
return JSON.stringify({
list: videos,
page,
pagecount: page + 1,
limit: videos.length,
total: videos.length * (page + 1)
});
}
export function __jsEvalReturn() {
return { init, home, homeVod, category, detail, play, proxy: null, search };
}
@@ -1,663 +0,0 @@
/*小心儿悠悠
配置说明:
{
"host": "https://xxx", // 必填,站点地址
"ver": 1, // 可选,API版本:1或2,默认1
"cms": "", // 可选,CMS地址
"from": "", // 可选,搜索来源
"category": 1, // 可选,分类模式:0-无分类 1-普通 2-搜索
"timeout": 5, // 可选,超时时间(秒),默认5
"custom_first": 0, // 可选,自定义解析优先:0-否 1-是
"source_order": ["线路A", "线路B"], // 可选,线路排序
// UA配置//可选,特殊站点需要自定义
"ua": {
"host": "UA字符串", // 主机检测UA
"config": "UA字符串", // 配置获取UA
"home": "UA字符串", // 首页UA
"category": "UA字符串", // 分类页UA
"search": "UA字符串", // 搜索页UA
"parse": "UA字符串", // 解析UA
"player": "UA字符串" // 播放UA
},
// 解析配置
"parse": {
"线路名": "解析地址或parse:前缀"
}
}
使用示例:
{
"host": "https://xxx",
"ver": 1,
"source_order": ["超清", "高清", "标清"],
"ua": {
"home": "Mozilla/5.0...",
"player": "Mozilla/5.0..."
},
"parse": {
"超清": "https://jx.xxx/?url=",
"高清": "parse:https://parse.xxx.com/"
}
}
*/
import { Crypto, _ } from 'assets://js/lib/cat.js';
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 TV_UA = "Dalvik/2.1.0 (Linux; U; Android 9; Pixel Build/PI)";
var def_header = {'User-Agent': TV_UA};
var cachedPlayUrls = {};
var HOST;
var foxConfig = {
host: '',
headers: {'User-Agent': TV_UA},
timeout: 5000,
ver: 1,
uas: {},
parses: {},
custom_parses: {},
froms: '',
detail: [],
custom_first: 0,
category: 1,
cms: '',
sourceOrder: []
};
var recommendCache = {
data: [],
timestamp: 0,
cacheTime: 30 * 60 * 1000
};
function decodeBase64(str) {
try {
return Crypto.enc.Utf8.stringify(Crypto.enc.Base64.parse(str));
} catch (e) {
return str;
}
}
function request(reqUrl, header, data, method) {
try {
let optObj = {
headers: header || foxConfig.headers,
method: method || 'get',
timeout: foxConfig.timeout,
};
if (method === 'post') {
optObj.data = data || {};
optObj.postType = 'form';
}
let res = req(reqUrl, optObj);
return res.content;
} catch (e) {
throw new Error('请求失败: ' + reqUrl);
}
}
function getdata(url, data, method) {
try {
url = /^http/.test(url) ? url : `${HOST}${url}`;
let res = request(url, foxConfig.headers, data, method);
return JSON.parse(res);
} catch (e) {
return {};
}
}
function sortSources(play_from, play_urls) {
if (!foxConfig.sourceOrder || foxConfig.sourceOrder.length === 0) {
return { play_from, play_urls };
}
let sourceMap = new Map();
for (let i = 0; i < play_from.length; i++) {
if (i < play_urls.length) {
sourceMap.set(play_from[i], {
originalName: play_from[i],
url: play_urls[i],
index: i
});
}
}
let sorted_play_from = [];
let sorted_play_urls = [];
for (let sourceName of foxConfig.sourceOrder) {
for (let [key, source] of sourceMap) {
if (key.includes(sourceName)) {
sorted_play_from.push(source.originalName);
sorted_play_urls.push(source.url);
sourceMap.delete(key);
break;
}
}
}
for (let [key, source] of sourceMap) {
sorted_play_from.push(source.originalName);
sorted_play_urls.push(source.url);
}
return {
play_from: sorted_play_from,
play_urls: sorted_play_urls
};
}
async function getRecommendVideos() {
try {
const now = Date.now();
if (recommendCache.data.length > 0 && now - recommendCache.timestamp < recommendCache.cacheTime) {
return recommendCache.data;
}
let headers = Object.assign({}, foxConfig.headers);
let recommend_ua = foxConfig.uas.home || foxConfig.uas.homeVideo;
if (recommend_ua) headers['User-Agent'] = recommend_ua;
let videos = [];
let res = request(HOST + '/api.php/Appfox/vodList?sort=热门&page=1&limit=12', headers);
let response = JSON.parse(res);
if (response.data && response.data.list) {
videos = response.data.list.slice(0, 12);
} else if (response.data && response.data.recommend_list) {
videos = response.data.recommend_list.slice(0, 12);
} else if (Array.isArray(response.data)) {
videos = response.data.slice(0, 12);
}
if (videos.length > 0) {
recommendCache.data = videos;
recommendCache.timestamp = now;
}
return videos;
} catch (e) {
return [];
}
}
async function init(cfg) {
try {
if (!cfg.ext) throw new Error('配置参数为空');
let extValue = cfg.ext;
if (typeof extValue === 'string') {
try {
extValue = decodeBase64(extValue);
} catch (e) {}
try {
extValue = JSON.parse(extValue);
} catch (e) {
if (extValue.startsWith('http')) {
extValue = {host: extValue};
} else {
throw new Error('配置格式错误');
}
}
}
let host = extValue.host || '';
if (!host) throw new Error('主机地址为空');
if (!host.match(/^https?:\/\/[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(:\d+)?(\/)?$/)) {
let headers = Object.assign({}, foxConfig.headers);
let custom_ua = foxConfig.uas.host;
if (custom_ua) headers['User-Agent'] = custom_ua;
let res = request(host, headers);
let result = JSON.parse(res);
host = result.apiDomain;
}
foxConfig.host = host.replace(/\/+$/, '');
HOST = foxConfig.host;
foxConfig.ver = extValue.ver === 2 ? 2 : 1;
foxConfig.cms = extValue.cms || '';
foxConfig.froms = extValue.from || '';
foxConfig.custom_parses = extValue.parse || {};
foxConfig.custom_first = extValue.custom_first || 0;
foxConfig.category = extValue.category || 1;
foxConfig.timeout = (extValue.timeout || 5) * 1000;
foxConfig.sourceOrder = extValue.source_order || [];
let ua = extValue.ua;
if (ua) {
if (typeof ua === 'string') {
foxConfig.headers['User-Agent'] = ua;
} else if (typeof ua === 'object') {
foxConfig.uas = {
host: ua.host,
config: ua.config,
home: ua.home,
category: ua.category,
search: ua.search,
parse: ua.parse,
player: ua.player || 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1'
};
}
}
if (foxConfig.cms) {
let cms = foxConfig.cms.replace(/\/+$/, '');
if (cms.match(/^https?:\/\/.*\/vod/)) {
cms += cms.includes('?') ? '&' : '?';
foxConfig.cms = cms;
}
}
} catch (e) {
throw new Error('初始化失败: ' + e.message);
}
}
async function home(filter) {
try {
if (!HOST || foxConfig.category === 0) return '{"class":[]}';
let headers = Object.assign({}, foxConfig.headers);
let custom_ua = foxConfig.uas.home;
if (custom_ua) headers['User-Agent'] = custom_ua;
if (foxConfig.cms && foxConfig.category !== 2) {
let class_url = foxConfig.cms.replace(/&ac=videolist|ac=videolist&|ac=videolist|ac=detail/g, '');
if (!class_url.includes('ac=')) class_url += 'ac=list';
let classRes = request(class_url, headers);
let classes = JSON.parse(classRes).class;
let recommendVideos = await getRecommendVideos();
let dataRes = request(foxConfig.cms.replace(/&$/, ''), headers);
let data = JSON.parse(dataRes);
data.class = classes;
if (recommendVideos.length > 0) {
data.recommend = recommendVideos;
}
return JSON.stringify(data);
} else {
let res = request(HOST + '/api.php/Appfox/init', headers);
let response = JSON.parse(res);
let classes = [];
for (let i of response.data.type_list) {
classes.push({type_id: i.type_id, type_name: i.type_name});
}
let recommendVideos = await getRecommendVideos();
let result = {class: classes};
if (recommendVideos.length > 0) {
result.recommend = recommendVideos;
}
return JSON.stringify(result);
}
} catch (e) {
return '{"class":[]}';
}
}
async function homeVod() {
try {
if (!HOST || foxConfig.category === 0) return '{"list":[]}';
if (foxConfig.cms && foxConfig.category !== 2) {
let headers = Object.assign({}, foxConfig.headers);
let custom_ua = foxConfig.uas.homeVideo || foxConfig.uas.home;
if (custom_ua) headers['User-Agent'] = custom_ua;
let res = request(foxConfig.cms.replace(/&$/, ''), headers);
let data = JSON.parse(res);
if (!data.list || data.list.length === 0) {
let recommendVideos = await getRecommendVideos();
if (recommendVideos.length > 0) {
data.list = recommendVideos;
}
}
if (foxConfig.category === 2 && data.list) {
for (let i of data.list) {
i.vod_id = 'msearch:' + i.vod_id;
}
}
return JSON.stringify(data);
}
let headers = Object.assign({}, foxConfig.headers);
let custom_ua = foxConfig.uas.homeVideo || foxConfig.uas.home;
if (custom_ua) headers['User-Agent'] = custom_ua;
let path = foxConfig.ver === 2 ? 'nav' : 'index';
let res = request(HOST + '/api.php/Appfox/' + path, headers);
let response = JSON.parse(res);
let videos = [];
if (foxConfig.ver === 2) {
let navigationId = '';
for (let i of response.data) {
if (i.navigationId) {
navigationId = i.navigationId;
break;
}
}
if (navigationId) {
let navRes = request(HOST + '/api.php/Appfox/nav_video?id=' + navigationId, headers);
let navData = JSON.parse(navRes);
for (let item of navData.data) {
if (item.videos) {
videos = videos.concat(item.videos);
}
}
}
} else {
for (let item of response.data) {
if (item.banner) videos = videos.concat(item.banner);
if (item.categories) {
for (let cat of item.categories) {
if (cat.videos) videos = videos.concat(cat.videos);
}
}
}
}
if (videos.length === 0) {
videos = await getRecommendVideos();
}
if (foxConfig.category === 2) {
for (let i of videos) {
i.vod_id = 'msearch:' + i.vod_id;
}
}
return JSON.stringify({list: videos.slice(0, 20)});
} catch (e) {
try {
let recommendVideos = await getRecommendVideos();
return JSON.stringify({list: recommendVideos});
} catch (e2) {
return '{"list":[]}';
}
}
}
async function category(tid, pg, filter, extend) {
try {
if (!HOST) return '{"list":[]}';
pg = parseInt(pg) || 1;
let headers = Object.assign({}, foxConfig.headers);
let category_ua = foxConfig.uas.category;
if (category_ua) headers['User-Agent'] = category_ua;
if (foxConfig.cms && foxConfig.category !== 2) {
let res = request(foxConfig.cms + 'pg=' + pg + '&t=' + tid, headers);
let data = JSON.parse(res);
if (foxConfig.category === 2 && data.list) {
for (let i of data.list) {
i.vod_id = 'msearch:' + i.vod_id;
}
}
return JSON.stringify(data);
} else {
let res = request(HOST + '/api.php/Appfox/vodList?type_id=' + tid + '&page=' + pg, headers);
let response = JSON.parse(res);
let videos = response.data?.list || response.data?.recommend_list || [];
let data = {list: videos};
if (foxConfig.category === 2) {
for (let i of data.list) {
i.vod_id = 'msearch:' + i.vod_id;
}
}
return JSON.stringify(data);
}
} catch (e) {
return '{"list":[]}';
}
}
async function search(wd, quick, pg) {
try {
if (!HOST) return '{"list":[]}';
pg = parseInt(pg) || 1;
let headers = Object.assign({}, foxConfig.headers);
let search_ua = foxConfig.uas.search;
if (search_ua) headers['User-Agent'] = search_ua;
if (foxConfig.cms) {
let cms = foxConfig.cms.split('?')[0] + '?';
let res = request(cms + 'ac=detail&wd=' + encodeURIComponent(wd), headers);
let response = JSON.parse(res);
foxConfig.detail = response.list || [];
return JSON.stringify(response);
} else {
let path = HOST + '/api.php/Appfox/vod?ac=detail&wd=' + encodeURIComponent(wd);
if (foxConfig.froms) path += '&from=' + foxConfig.froms;
let res = request(path, headers);
let response = JSON.parse(res);
foxConfig.detail = response.list || [];
return JSON.stringify(response);
}
} catch (e) {
return '{"list":[]}';
}
}
async function detail(id) {
try {
let headers = Object.assign({}, foxConfig.headers);
let detail_ua = foxConfig.uas.detail || foxConfig.uas.search;
if (detail_ua) headers['User-Agent'] = detail_ua;
let video = null;
for (let i of foxConfig.detail) {
if (String(i.vod_id) === String(id)) {
video = Object.assign({}, i);
break;
}
}
if (!video) {
if (foxConfig.cms) {
let cms = foxConfig.cms.split('?')[0] + '?';
let res = request(cms + 'ac=detail&ids=' + id, headers);
let response = JSON.parse(res);
video = response.list?.[0] || null;
} else {
let res = request(HOST + '/api.php/Appfox/vod?ac=detail&ids=' + id, headers);
let response = JSON.parse(res);
video = response.list?.[0] || null;
}
}
if (!video) return '{"list":[]}';
let play_from = video.vod_play_from ? video.vod_play_from.split('$$$') : [];
let play_urls = video.vod_play_url ? video.vod_play_url.split('$$$') : [];
let sortedSources = sortSources(play_from, play_urls);
play_from = sortedSources.play_from;
play_urls = sortedSources.play_urls;
try {
let config_headers = Object.assign({}, foxConfig.headers);
let custom_ua = foxConfig.uas.config;
if (custom_ua) config_headers['User-Agent'] = custom_ua;
let res = request(HOST + '/api.php/Appfox/config', config_headers);
let config_response = JSON.parse(res);
let player_list = config_response.data?.playerList || [];
let jiexi_data_list = config_response.data?.jiexiDataList || [];
let player_map = {};
for (let player of player_list) {
player_map[player.playerCode] = player;
}
let processed_play_urls = [];
for (let idx = 0; idx < play_from.length; idx++) {
let play_code = play_from[idx];
if (player_map[play_code]) {
let player_info = player_map[play_code];
if (player_info.playerCode !== player_info.playerName) {
play_from[idx] = player_info.playerName + '\u2005(' + play_code + ')';
}
}
if (idx < play_urls.length) {
let urls = play_urls[idx].split('#');
let processed_urls = [];
for (let url of urls) {
let parts = url.split('$');
if (parts.length >= 2) {
parts[1] = play_code + '@' + parts[1];
processed_urls.push(parts.join('$'));
} else {
processed_urls.push(url);
}
}
processed_play_urls.push(processed_urls.join('#'));
}
}
video.vod_play_from = play_from.join('$$$');
video.vod_play_url = processed_play_urls.join('$$$');
foxConfig.parses = {};
for (let p of jiexi_data_list) {
if (p.url && p.url.startsWith('http')) {
foxConfig.parses[p.playerCode] = p.url;
}
}
} catch (e) {
}
return JSON.stringify({list: [video]});
} catch (e) {
return '{"list":[]}';
}
}
async function play(flag, id, flags) {
try {
let parts = id.split('@', 2);
if (parts.length < 2) {
throw new Error('ID格式错误');
}
let play_from = parts[0];
let raw_url = parts[1];
let jx = 0, parse = 0, parsed = 0;
let headers = Object.assign({}, foxConfig.headers);
let parse_ua = foxConfig.uas.parse;
if (parse_ua) headers['User-Agent'] = parse_ua;
let player_ua = foxConfig.uas.player || MOBILE_UA;
let url = raw_url;
let parses_main = [];
if (foxConfig.custom_first === 1) {
parses_main.push(foxConfig.custom_parses);
parses_main.push(foxConfig.parses);
} else {
parses_main.push(foxConfig.parses);
parses_main.push(foxConfig.custom_parses);
}
outer: for (let parses2 of parses_main) {
if (!parsed && !url.match(/https?:\/\/.*\.(m3u8|mp4|flv|mkv)/)) {
for (let key in parses2) {
if (!play_from.includes(key)) continue;
let parsers = parses2[key];
if (Array.isArray(parsers)) {
for (let parser of parsers) {
if (parser && parser.startsWith('parse:')) {
url = parser.split('parse:')[1] + raw_url;
jx = 0;
parse = 1;
break outer;
}
if (parser && parser.startsWith('http')) {
try {
let res = request(parser + raw_url, headers);
let response = JSON.parse(res);
if (response.url && response.url.startsWith('http')) {
url = response.url;
parsed = 1;
break outer;
}
} catch (e) {
continue;
}
}
}
} else {
if (parsers && parsers.startsWith('parse:')) {
url = parsers.split('parse:')[1] + raw_url;
jx = 0;
parse = 1;
break outer;
}
if (parsers && parsers.startsWith('http')) {
try {
let res = request(parsers + raw_url, headers);
let response = JSON.parse(res);
if (response.url && response.url.startsWith('http')) {
url = response.url;
parsed = 1;
break outer;
}
} catch (e) {
continue;
}
}
}
if (parsed || parse) break;
}
}
if (parsed || parse) break;
}
if (!(url.match(/https?:\/\/.*\.(m3u8|mp4|flv|mkv)/) || parsed === 1)) {
jx = 1;
}
return JSON.stringify({
jx: jx,
parse: parse,
url: url,
header: {'User-Agent': player_ua}
});
} catch (e) {
return JSON.stringify({
jx: 0,
parse: 0,
url: id,
header: {}
});
}
}
export function __jsEvalReturn() {
return {
init: init,
home: home,
homeVod: homeVod,
category: category,
search: search,
detail: detail,
play: play
};
}
+3108
View File
File diff suppressed because it is too large. Load diff
+607
View File
@@ -0,0 +1,607 @@
/*!
* Jinja Templating for JavaScript v0.1.8
* https://github.com/sstur/jinja-js
*
* This is a slimmed-down Jinja2 implementation [http://jinja.pocoo.org/]
*
* In the interest of simplicity, it deviates from Jinja2 as follows:
* - Line statements, cycle, super, macro tags and block nesting are not implemented
* - auto escapes html by default (the filter is "html" not "e")
* - Only "html" and "safe" filters are built in
* - Filters are not valid in expressions; `foo|length > 1` is not valid
* - Expression Tests (`if num is odd`) not implemented (`is` translates to `==` and `isnot` to `!=`)
*
* Notes:
* - if property is not found, but method '_get' exists, it will be called with the property name (and cached)
* - `{% for n in obj %}` iterates the object's keys; get the value with `{% for n in obj %}{{ obj[n] }}{% endfor %}`
* - subscript notation `a[0]` takes literals or simple variables but not `a[item.key]`
* - `.2` is not a valid number literal; use `0.2`
*
*/
/*global require, exports, module, define */
(function(global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.jinja = {}));
})(this, (function(jinja) {
"use strict";
var STRINGS = /'(\\.|[^'])*'|"(\\.|[^"'"])*"/g;
var IDENTS_AND_NUMS = /([$_a-z][$\w]*)|([+-]?\d+(\.\d+)?)/g;
var NUMBER = /^[+-]?\d+(\.\d+)?$/;
//non-primitive literals (array and object literals)
var NON_PRIMITIVES = /\[[@#~](,[@#~])*\]|\[\]|\{([@i]:[@#~])(,[@i]:[@#~])*\}|\{\}/g;
//bare identifiers such as variables and in object literals: {foo: 'value'}
var IDENTIFIERS = /[$_a-z][$\w]*/ig;
var VARIABLES = /i(\.i|\[[@#i]\])*/g;
var ACCESSOR = /(\.i|\[[@#i]\])/g;
var OPERATORS = /(===?|!==?|>=?|<=?|&&|\|\||[+\-\*\/%])/g;
//extended (english) operators
var EOPS = /(^|[^$\w])(and|or|not|is|isnot)([^$\w]|$)/g;
var LEADING_SPACE = /^\s+/;
var TRAILING_SPACE = /\s+$/;
var START_TOKEN = /\{\{\{|\{\{|\{%|\{#/;
var TAGS = {
'{{{': /^('(\\.|[^'])*'|"(\\.|[^"'"])*"|.)+?\}\}\}/,
'{{': /^('(\\.|[^'])*'|"(\\.|[^"'"])*"|.)+?\}\}/,
'{%': /^('(\\.|[^'])*'|"(\\.|[^"'"])*"|.)+?%\}/,
'{#': /^('(\\.|[^'])*'|"(\\.|[^"'"])*"|.)+?#\}/
};
var delimeters = {
'{%': 'directive',
'{{': 'output',
'{#': 'comment'
};
var operators = {
and: '&&',
or: '||',
not: '!',
is: '==',
isnot: '!='
};
var constants = {
'true': true,
'false': false,
'null': null
};
function Parser() {
this.nest = [];
this.compiled = [];
this.childBlocks = 0;
this.parentBlocks = 0;
this.isSilent = false;
}
Parser.prototype.push = function(line) {
if (!this.isSilent) {
this.compiled.push(line);
}
};
Parser.prototype.parse = function(src) {
this.tokenize(src);
return this.compiled;
};
Parser.prototype.tokenize = function(src) {
var lastEnd = 0,
parser = this,
trimLeading = false;
matchAll(src, START_TOKEN, function(open, index, src) {
//here we match the rest of the src against a regex for this tag
var match = src.slice(index + open.length).match(TAGS[open]);
match = (match ? match[0] : '');
//here we sub out strings so we don't get false matches
var simplified = match.replace(STRINGS, '@');
//if we don't have a close tag or there is a nested open tag
if (!match || ~simplified.indexOf(open)) {
return index + 1;
}
var inner = match.slice(0, 0 - open.length);
//check for white-space collapse syntax
if (inner.charAt(0) === '-') var wsCollapseLeft = true;
if (inner.slice(-1) === '-') var wsCollapseRight = true;
inner = inner.replace(/^-|-$/g, '').trim();
//if we're in raw mode and we are not looking at an "endraw" tag, move along
if (parser.rawMode && (open + inner) !== '{%endraw') {
return index + 1;
}
var text = src.slice(lastEnd, index);
lastEnd = index + open.length + match.length;
if (trimLeading) text = trimLeft(text);
if (wsCollapseLeft) text = trimRight(text);
if (wsCollapseRight) trimLeading = true;
if (open === '{{{') {
//liquid-style: make {{{x}}} => {{x|safe}}
open = '{{';
inner += '|safe';
}
parser.textHandler(text);
parser.tokenHandler(open, inner);
});
var text = src.slice(lastEnd);
if (trimLeading) text = trimLeft(text);
this.textHandler(text);
};
Parser.prototype.textHandler = function(text) {
this.push('write(' + JSON.stringify(text) + ');');
};
Parser.prototype.tokenHandler = function(open, inner) {
var type = delimeters[open];
if (type === 'directive') {
this.compileTag(inner);
} else if (type === 'output') {
var extracted = this.extractEnt(inner, STRINGS, '@');
//replace || operators with ~
extracted.src = extracted.src.replace(/\|\|/g, '~').split('|');
//put back || operators
extracted.src = extracted.src.map(function(part) {
return part.split('~').join('||');
});
var parts = this.injectEnt(extracted, '@');
if (parts.length > 1) {
var filters = parts.slice(1).map(this.parseFilter.bind(this));
this.push('filter(' + this.parseExpr(parts[0]) + ',' + filters.join(',') + ');');
} else {
this.push('filter(' + this.parseExpr(parts[0]) + ');');
}
}
};
Parser.prototype.compileTag = function(str) {
var directive = str.split(' ')[0];
var handler = tagHandlers[directive];
if (!handler) {
throw new Error('Invalid tag: ' + str);
}
handler.call(this, str.slice(directive.length).trim());
};
Parser.prototype.parseFilter = function(src) {
src = src.trim();
var match = src.match(/[:(]/);
var i = match ? match.index : -1;
if (i < 0) return JSON.stringify([src]);
var name = src.slice(0, i);
var args = src.charAt(i) === ':' ? src.slice(i + 1) : src.slice(i + 1, -1);
args = this.parseExpr(args, {
terms: true
});
return '[' + JSON.stringify(name) + ',' + args + ']';
};
Parser.prototype.extractEnt = function(src, regex, placeholder) {
var subs = [],
isFunc = typeof placeholder == 'function';
src = src.replace(regex, function(str) {
var replacement = isFunc ? placeholder(str) : placeholder;
if (replacement) {
subs.push(str);
return replacement;
}
return str;
});
return {
src: src,
subs: subs
};
};
Parser.prototype.injectEnt = function(extracted, placeholder) {
var src = extracted.src,
subs = extracted.subs,
isArr = Array.isArray(src);
var arr = (isArr) ? src : [src];
var re = new RegExp('[' + placeholder + ']', 'g'),
i = 0;
arr.forEach(function(src, index) {
arr[index] = src.replace(re, function() {
return subs[i++];
});
});
return isArr ? arr : arr[0];
};
//replace complex literals without mistaking subscript notation with array literals
Parser.prototype.replaceComplex = function(s) {
var parsed = this.extractEnt(s, /i(\.i|\[[@#i]\])+/g, 'v');
parsed.src = parsed.src.replace(NON_PRIMITIVES, '~');
return this.injectEnt(parsed, 'v');
};
//parse expression containing literals (including objects/arrays) and variables (including dot and subscript notation)
//valid expressions: `a + 1 > b.c or c == null`, `a and b[1] != c`, `(a < b) or (c < d and e)`, 'a || [1]`
Parser.prototype.parseExpr = function(src, opts) {
opts = opts || {};
//extract string literals -> @
var parsed1 = this.extractEnt(src, STRINGS, '@');
//note: this will catch {not: 1} and a.is; could we replace temporarily and then check adjacent chars?
parsed1.src = parsed1.src.replace(EOPS, function(s, before, op, after) {
return (op in operators) ? before + operators[op] + after : s;
});
//sub out non-string literals (numbers/true/false/null) -> #
// the distinction is necessary because @ can be object identifiers, # cannot
var parsed2 = this.extractEnt(parsed1.src, IDENTS_AND_NUMS, function(s) {
return (s in constants || NUMBER.test(s)) ? '#' : null;
});
//sub out object/variable identifiers -> i
var parsed3 = this.extractEnt(parsed2.src, IDENTIFIERS, 'i');
//remove white-space
parsed3.src = parsed3.src.replace(/\s+/g, '');
//the rest of this is simply to boil the expression down and check validity
var simplified = parsed3.src;
//sub out complex literals (objects/arrays) -> ~
// the distinction is necessary because @ and # can be subscripts but ~ cannot
while (simplified !== (simplified = this.replaceComplex(simplified)));
//now @ represents strings, # represents other primitives and ~ represents non-primitives
//replace complex variables (those with dot/subscript accessors) -> v
while (simplified !== (simplified = simplified.replace(/i(\.i|\[[@#i]\])+/, 'v')));
//empty subscript or complex variables in subscript, are not permitted
simplified = simplified.replace(/[iv]\[v?\]/g, 'x');
//sub in "i" for @ and # and ~ and v (now "i" represents all literals, variables and identifiers)
simplified = simplified.replace(/[@#~v]/g, 'i');
//sub out operators
simplified = simplified.replace(OPERATORS, '%');
//allow 'not' unary operator
simplified = simplified.replace(/!+[i]/g, 'i');
var terms = opts.terms ? simplified.split(',') : [simplified];
terms.forEach(function(term) {
//simplify logical grouping
while (term !== (term = term.replace(/\(i(%i)*\)/g, 'i')));
if (!term.match(/^i(%i)*/)) {
throw new Error('Invalid expression: ' + src + " " + term);
}
});
parsed3.src = parsed3.src.replace(VARIABLES, this.parseVar.bind(this));
parsed2.src = this.injectEnt(parsed3, 'i');
parsed1.src = this.injectEnt(parsed2, '#');
return this.injectEnt(parsed1, '@');
};
Parser.prototype.parseVar = function(src) {
var args = Array.prototype.slice.call(arguments);
var str = args.pop(),
index = args.pop();
//quote bare object identifiers (might be a reserved word like {while: 1})
if (src === 'i' && str.charAt(index + 1) === ':') {
return '"i"';
}
var parts = ['"i"'];
src.replace(ACCESSOR, function(part) {
if (part === '.i') {
parts.push('"i"');
} else if (part === '[i]') {
parts.push('get("i")');
} else {
parts.push(part.slice(1, -1));
}
});
return 'get(' + parts.join(',') + ')';
};
//escapes a name to be used as a javascript identifier
Parser.prototype.escName = function(str) {
return str.replace(/\W/g, function(s) {
return '$' + s.charCodeAt(0).toString(16);
});
};
Parser.prototype.parseQuoted = function(str) {
if (str.charAt(0) === "'") {
str = str.slice(1, -1).replace(/\\.|"/, function(s) {
if (s === "\\'") return "'";
return s.charAt(0) === '\\' ? s : ('\\' + s);
});
str = '"' + str + '"';
}
//todo: try/catch or deal with invalid characters (linebreaks, control characters)
return JSON.parse(str);
};
//the context 'this' inside tagHandlers is the parser instance
var tagHandlers = {
'if': function(expr) {
this.push('if (' + this.parseExpr(expr) + ') {');
this.nest.unshift('if');
},
'else': function() {
if (this.nest[0] === 'for') {
this.push('}, function() {');
} else {
this.push('} else {');
}
},
'elseif': function(expr) {
this.push('} else if (' + this.parseExpr(expr) + ') {');
},
'endif': function() {
this.nest.shift();
this.push('}');
},
'for': function(str) {
var i = str.indexOf(' in ');
var name = str.slice(0, i).trim();
var expr = str.slice(i + 4).trim();
this.push('each(' + this.parseExpr(expr) + ',' + JSON.stringify(name) + ',function() {');
this.nest.unshift('for');
},
'endfor': function() {
this.nest.shift();
this.push('});');
},
'raw': function() {
this.rawMode = true;
},
'endraw': function() {
this.rawMode = false;
},
'set': function(stmt) {
var i = stmt.indexOf('=');
var name = stmt.slice(0, i).trim();
var expr = stmt.slice(i + 1).trim();
this.push('set(' + JSON.stringify(name) + ',' + this.parseExpr(expr) + ');');
},
'block': function(name) {
if (this.isParent) {
++this.parentBlocks;
var blockName = 'block_' + (this.escName(name) || this.parentBlocks);
this.push('block(typeof ' + blockName + ' == "function" ? ' + blockName + ' : function() {');
} else if (this.hasParent) {
this.isSilent = false;
++this.childBlocks;
blockName = 'block_' + (this.escName(name) || this.childBlocks);
this.push('function ' + blockName + '() {');
}
this.nest.unshift('block');
},
'endblock': function() {
this.nest.shift();
if (this.isParent) {
this.push('});');
} else if (this.hasParent) {
this.push('}');
this.isSilent = true;
}
},
'extends': function(name) {
name = this.parseQuoted(name);
var parentSrc = this.readTemplateFile(name);
this.isParent = true;
this.tokenize(parentSrc);
this.isParent = false;
this.hasParent = true;
//silence output until we enter a child block
this.isSilent = true;
},
'include': function(name) {
name = this.parseQuoted(name);
var incSrc = this.readTemplateFile(name);
this.isInclude = true;
this.tokenize(incSrc);
this.isInclude = false;
}
};
//liquid style
tagHandlers.assign = tagHandlers.set;
//python/django style
tagHandlers.elif = tagHandlers.elseif;
var getRuntime = function runtime(data, opts) {
var defaults = {
autoEscape: 'toJson'
};
var _toString = Object.prototype.toString;
var _hasOwnProperty = Object.prototype.hasOwnProperty;
var getKeys = Object.keys || function(obj) {
var keys = [];
for (var n in obj)
if (_hasOwnProperty.call(obj, n)) keys.push(n);
return keys;
};
var isArray = Array.isArray || function(obj) {
return _toString.call(obj) === '[object Array]';
};
var create = Object.create || function(obj) {
function F() {}
F.prototype = obj;
return new F();
};
var toString = function(val) {
if (val == null) return '';
return (typeof val.toString == 'function') ? val.toString() : _toString.call(val);
};
var extend = function(dest, src) {
var keys = getKeys(src);
for (var i = 0, len = keys.length; i < len; i++) {
var key = keys[i];
dest[key] = src[key];
}
return dest;
};
//get a value, lexically, starting in current context; a.b -> get("a","b")
var get = function() {
var val, n = arguments[0],
c = stack.length;
while (c--) {
val = stack[c][n];
if (typeof val != 'undefined') break;
}
for (var i = 1, len = arguments.length; i < len; i++) {
if (val == null) continue;
n = arguments[i];
val = (_hasOwnProperty.call(val, n)) ? val[n] : (typeof val._get == 'function' ? (val[n] = val._get(n)) : null);
}
return (val == null) ? '' : val;
};
var set = function(n, val) {
stack[stack.length - 1][n] = val;
};
var push = function(ctx) {
stack.push(ctx || {});
};
var pop = function() {
stack.pop();
};
var write = function(str) {
output.push(str);
};
var filter = function(val) {
for (var i = 1, len = arguments.length; i < len; i++) {
var arr = arguments[i],
name = arr[0],
filter = filters[name];
if (filter) {
arr[0] = val;
//now arr looks like [val, arg1, arg2]
val = filter.apply(data, arr);
} else {
throw new Error('Invalid filter: ' + name);
}
}
if (opts.autoEscape && name !== opts.autoEscape && name !== 'safe') {
//auto escape if not explicitly safe or already escaped
val = filters[opts.autoEscape].call(data, val);
}
output.push(val);
};
var each = function(obj, loopvar, fn1, fn2) {
if (obj == null) return;
var arr = isArray(obj) ? obj : getKeys(obj),
len = arr.length;
var ctx = {
loop: {
length: len,
first: arr[0],
last: arr[len - 1]
}
};
push(ctx);
for (var i = 0; i < len; i++) {
extend(ctx.loop, {
index: i + 1,
index0: i
});
fn1(ctx[loopvar] = arr[i]);
}
if (len === 0 && fn2) fn2();
pop();
};
var block = function(fn) {
push();
fn();
pop();
};
var render = function() {
return output.join('');
};
data = data || {};
opts = extend(defaults, opts || {});
var filters = extend({
html: function(val) {
return toString(val)
.split('&').join('&amp;')
.split('<').join('&lt;')
.split('>').join('&gt;')
.split('"').join('&quot;');
},
safe: function(val) {
return val;
},
toJson: function(val) {
if (typeof val === 'object') {
return JSON.stringify(val);
}
return toString(val);
}
}, opts.filters || {});
var stack = [create(data || {})],
output = [];
return {
get: get,
set: set,
push: push,
pop: pop,
write: write,
filter: filter,
each: each,
block: block,
render: render
};
};
var runtime;
jinja.compile = function(markup, opts) {
opts = opts || {};
var parser = new Parser();
parser.readTemplateFile = this.readTemplateFile;
var code = [];
code.push('function render($) {');
code.push('var get = $.get, set = $.set, push = $.push, pop = $.pop, write = $.write, filter = $.filter, each = $.each, block = $.block;');
code.push.apply(code, parser.parse(markup));
code.push('return $.render();');
code.push('}');
code = code.join('\n');
if (opts.runtime === false) {
var fn = new Function('data', 'options', 'return (' + code + ')(runtime(data, options))');
} else {
runtime = runtime || (runtime = getRuntime.toString());
fn = new Function('data', 'options', 'return (' + code + ')((' + runtime + ')(data, options))');
}
return {
render: fn
};
};
jinja.render = function(markup, data, opts) {
var tmpl = jinja.compile(markup);
return tmpl.render(data, opts);
};
jinja.templateFiles = [];
jinja.readTemplateFile = function(name) {
var templateFiles = this.templateFiles || [];
var templateFile = templateFiles[name];
if (templateFile == null) {
throw new Error('Template file not found: ' + name);
}
return templateFile;
};
/*!
* Helpers
*/
function trimLeft(str) {
return str.replace(LEADING_SPACE, '');
}
function trimRight(str) {
return str.replace(TRAILING_SPACE, '');
}
function matchAll(str, reg, fn) {
//copy as global
reg = new RegExp(reg.source, 'g' + (reg.ignoreCase ? 'i' : '') + (reg.multiline ? 'm' : ''));
var match;
while ((match = reg.exec(str))) {
var result = fn(match[0], match.index, str);
if (typeof result == 'number') {
reg.lastIndex = result;
}
}
}
}));
+360
View File
@@ -0,0 +1,360 @@
/*
* ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development").
* This devtool is neither made for production nor for readable output files.
* It uses "eval()" calls to create a separate source file in the browser devtools.
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
* or disable the default devtool with "devtool: false".
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
*/
(function webpackUniversalModuleDefinition(root, factory) {
if (typeof exports === 'object' && typeof module === 'object') {
// CommonJS
module.exports = exports = factory();
} else if (typeof define === 'function' && define.amd) {
// AMD
define([], factory);
} else {
// Global (browser)
globalThis.JSEncrypt = factory();
}
})(this, () => {
return /******/ (() => { // webpackBootstrap
/******/
var __webpack_modules__ = ({
/***/
"./lib/JSEncrypt.js":
/*!**************************!*\
!*** ./lib/JSEncrypt.js ***!
\**************************/
/***/
((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"JSEncrypt\": () => (/* binding */ JSEncrypt)\n/* harmony export */ });\n/* harmony import */ var _lib_jsbn_base64__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lib/jsbn/base64 */ \"./lib/lib/jsbn/base64.js\");\n/* harmony import */ var _JSEncryptRSAKey__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./JSEncryptRSAKey */ \"./lib/JSEncryptRSAKey.js\");\n/* provided dependency */ var process = __webpack_require__(/*! process/browser */ \"./node_modules/process/browser.js\");\nvar _a;\n\n\nvar version = typeof process !== 'undefined'\n ? (_a = process.env) === null || _a === void 0 ? void 0 : \"3.3.2\"\n : undefined;\n/**\n *\n * @param {Object} [options = {}] - An object to customize JSEncrypt behaviour\n * possible parameters are:\n * - default_key_size {number} default: 1024 the key size in bit\n * - default_public_exponent {string} default: '010001' the hexadecimal representation of the public exponent\n * - log {boolean} default: false whether log warn/error or not\n * @constructor\n */\nvar JSEncrypt = /** @class */ (function () {\n function JSEncrypt(options) {\n if (options === void 0) { options = {}; }\n options = options || {};\n this.default_key_size = options.default_key_size\n ? parseInt(options.default_key_size, 10)\n : 1024;\n this.default_public_exponent = options.default_public_exponent || \"010001\"; // 65537 default openssl public exponent for rsa key type\n this.log = options.log || false;\n // The private and public key.\n this.key = null;\n }\n /**\n * Method to set the rsa key parameter (one method is enough to set both the public\n * and the private key, since the private key contains the public key paramenters)\n * Log a warning if logs are enabled\n * @param {Object|string} key the pem encoded string or an object (with or without header/footer)\n * @public\n */\n JSEncrypt.prototype.setKey = function (key) {\n if (this.log && this.key) {\n console.warn(\"A key was already set, overriding existing.\");\n }\n this.key = new _JSEncryptRSAKey__WEBPACK_IMPORTED_MODULE_1__.JSEncryptRSAKey(key);\n };\n /**\n * Proxy method for setKey, for api compatibility\n * @see setKey\n * @public\n */\n JSEncrypt.prototype.setPrivateKey = function (privkey) {\n // Create the key.\n this.setKey(privkey);\n };\n /**\n * Proxy method for setKey, for api compatibility\n * @see setKey\n * @public\n */\n JSEncrypt.prototype.setPublicKey = function (pubkey) {\n // Sets the public key.\n this.setKey(pubkey);\n };\n /**\n * Proxy method for RSAKey object's decrypt, decrypt the string using the private\n * components of the rsa key object. Note that if the object was not set will be created\n * on the fly (by the getKey method) using the parameters passed in the JSEncrypt constructor\n * @param {string} str base64 encoded crypted string to decrypt\n * @return {string} the decrypted string\n * @public\n */\n JSEncrypt.prototype.decrypt = function (str) {\n // Return the decrypted string.\n try {\n return this.getKey().decrypt((0,_lib_jsbn_base64__WEBPACK_IMPORTED_MODULE_0__.b64tohex)(str));\n }\n catch (ex) {\n return false;\n }\n };\n /**\n * Proxy method for RSAKey object's encrypt, encrypt the string using the public\n * components of the rsa key object. Note that if the object was not set will be created\n * on the fly (by the getKey method) using the parameters passed in the JSEncrypt constructor\n * @param {string} str the string to encrypt\n * @return {string} the encrypted string encoded in base64\n * @public\n */\n JSEncrypt.prototype.encrypt = function (str) {\n // Return the encrypted string.\n try {\n return (0,_lib_jsbn_base64__WEBPACK_IMPORTED_MODULE_0__.hex2b64)(this.getKey().encrypt(str));\n }\n catch (ex) {\n return false;\n }\n };\n /**\n * Proxy method for RSAKey object's sign.\n * @param {string} str the string to sign\n * @param {function} digestMethod hash method\n * @param {string} digestName the name of the hash algorithm\n * @return {string} the signature encoded in base64\n * @public\n */\n JSEncrypt.prototype.sign = function (str, digestMethod, digestName) {\n // return the RSA signature of 'str' in 'hex' format.\n try {\n return (0,_lib_jsbn_base64__WEBPACK_IMPORTED_MODULE_0__.hex2b64)(this.getKey().sign(str, digestMethod, digestName));\n }\n catch (ex) {\n return false;\n }\n };\n Line truncated
/***/
}),
/***/
"./lib/JSEncryptRSAKey.js":
/*!********************************!*\
!*** ./lib/JSEncryptRSAKey.js ***!
\********************************/
/***/
((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"JSEncryptRSAKey\": () => (/* binding */ JSEncryptRSAKey)\n/* harmony export */ });\n/* harmony import */ var _lib_jsbn_base64__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./lib/jsbn/base64 */ \"./lib/lib/jsbn/base64.js\");\n/* harmony import */ var _lib_asn1js_hex__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./lib/asn1js/hex */ \"./lib/lib/asn1js/hex.js\");\n/* harmony import */ var _lib_asn1js_base64__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./lib/asn1js/base64 */ \"./lib/lib/asn1js/base64.js\");\n/* harmony import */ var _lib_asn1js_asn1__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./lib/asn1js/asn1 */ \"./lib/lib/asn1js/asn1.js\");\n/* harmony import */ var _lib_jsbn_rsa__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./lib/jsbn/rsa */ \"./lib/lib/jsbn/rsa.js\");\n/* harmony import */ var _lib_jsbn_jsbn__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./lib/jsbn/jsbn */ \"./lib/lib/jsbn/jsbn.js\");\n/* harmony import */ var _lib_jsrsasign_asn1_1_0__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./lib/jsrsasign/asn1-1.0 */ \"./lib/lib/jsrsasign/asn1-1.0.js\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n\n\n\n\n\n/**\n * Create a new JSEncryptRSAKey that extends Tom Wu's RSA key object.\n * This object is just a decorator for parsing the key parameter\n * @param {string|Object} key - The key in string format, or an object containing\n * the parameters needed to build a RSAKey object.\n * @constructor\n */\nvar JSEncryptRSAKey = /** @class */ (function (_super) {\n __extends(JSEncryptRSAKey, _super);\n function JSEncryptRSAKey(key) {\n var _this = _super.call(this) || this;\n // Call the super constructor.\n // RSAKey.call(this);\n // If a key key was provided.\n if (key) {\n // If this is a string...\n if (typeof key === \"string\") {\n _this.parseKey(key);\n }\n else if (JSEncryptRSAKey.hasPrivateKeyProperty(key) ||\n JSEncryptRSAKey.hasPublicKeyProperty(key)) {\n // Set the values for the key.\n _this.parsePropertiesFrom(key);\n }\n }\n return _this;\n }\n /**\n * Method to parse a pem encoded string containing both a public or private key.\n * The method will translate the pem encoded string in a der encoded string and\n * will parse private key and public key parameters. This method accepts public key\n * in the rsaencryption pkcs #1 format (oid: 1.2.840.113549.1.1.1).\n *\n * @todo Check how many rsa formats use the same format of pkcs #1.\n *\n * The format is defined as:\n * PublicKeyInfo ::= SEQUENCE {\n * algorithm AlgorithmIdentifier,\n * PublicKey BIT STRING\n * }\n * Where AlgorithmIdentifier is:\n * AlgorithmIdentifier ::= SEQUENCE {\n * algorithm OBJECT IDENTIFIER, the OID of the enc algorithm\n * parameters ANY DEFINED BY algorithm OPTIONAL (NULL for PKCS #1)\n * }\n * and PublicKey is a SEQUENCE encapsulated in a BIT STRING\n * RSAPublicKey ::= SEQUENCE {\n * modulus INTEGER, -- n\n * publicExponent INTEGER -- e\n * }\n * it's possible to examine the structure of the keys obtained from openssl using\n * an asn.1 dumper as the one used here to parse the components: http://lapo.it/asn1js/\n * @argument {string} pem the pem encoded string, can include the BEGIN/END header/footer\n * @private\n */\n JSEncryptRSAKey.prototype.parseKey = function (pem) {\n try {\n var modulus = 0;\n var public_exponent = 0;\n var reHex = /^\\s*(?:[0-9A-Fa-f][0-9A-Fa-f]\\s*)+$/;\n var der = reHex.test(pem) ? _lib_asn1js_hex__WEBPACK_IMPORTED_MODULE_1__.Hex.decode(pem) : _lib_asn1js_base64__WEBPACK_IMPORTED_MODULE_2__.Base64.unarmor(pem);\n var asn1 = _lib_asn1js_asn1__WEBPACK_IMPORTED_MODULE_3__.ASN1.decode(der);\n // Fixes a bug with OpenSSL Line truncated
/***/
}),
/***/
"./lib/index.js":
/*!**********************!*\
!*** ./lib/index.js ***!
\**********************/
/***/
((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"JSEncrypt\": () => (/* reexport safe */ _JSEncrypt__WEBPACK_IMPORTED_MODULE_0__.JSEncrypt),\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _JSEncrypt__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./JSEncrypt */ \"./lib/JSEncrypt.js\");\n\n\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_JSEncrypt__WEBPACK_IMPORTED_MODULE_0__.JSEncrypt);\n\n\n//# sourceURL=webpack://JSEncrypt/./lib/index.js?");
/***/
}),
/***/
"./lib/lib/asn1js/asn1.js":
/*!********************************!*\
!*** ./lib/lib/asn1js/asn1.js ***!
\********************************/
/***/
((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"ASN1\": () => (/* binding */ ASN1),\n/* harmony export */ \"ASN1Tag\": () => (/* binding */ ASN1Tag),\n/* harmony export */ \"Stream\": () => (/* binding */ Stream)\n/* harmony export */ });\n/* harmony import */ var _int10__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./int10 */ \"./lib/lib/asn1js/int10.js\");\n// ASN.1 JavaScript decoder\n// Copyright (c) 2008-2014 Lapo Luchini <lapo@lapo.it>\n// Permission to use, copy, modify, and/or distribute this software for any\n// purpose with or without fee is hereby granted, provided that the above\n// copyright notice and this permission notice appear in all copies.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n/*jshint browser: true, strict: true, immed: true, latedef: true, undef: true, regexdash: false */\n/*global oids */\n\nvar ellipsis = \"\\u2026\";\nvar reTimeS = /^(\\d\\d)(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])([01]\\d|2[0-3])(?:([0-5]\\d)(?:([0-5]\\d)(?:[.,](\\d{1,3}))?)?)?(Z|[-+](?:[0]\\d|1[0-2])([0-5]\\d)?)?$/;\nvar reTimeL = /^(\\d\\d\\d\\d)(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])([01]\\d|2[0-3])(?:([0-5]\\d)(?:([0-5]\\d)(?:[.,](\\d{1,3}))?)?)?(Z|[-+](?:[0]\\d|1[0-2])([0-5]\\d)?)?$/;\nfunction stringCut(str, len) {\n if (str.length > len) {\n str = str.substring(0, len) + ellipsis;\n }\n return str;\n}\nvar Stream = /** @class */ (function () {\n function Stream(enc, pos) {\n this.hexDigits = \"0123456789ABCDEF\";\n if (enc instanceof Stream) {\n this.enc = enc.enc;\n this.pos = enc.pos;\n }\n else {\n // enc should be an array or a binary string\n this.enc = enc;\n this.pos = pos;\n }\n }\n Stream.prototype.get = function (pos) {\n if (pos === undefined) {\n pos = this.pos++;\n }\n if (pos >= this.enc.length) {\n throw new Error(\"Requesting byte offset \".concat(pos, \" on a stream of length \").concat(this.enc.length));\n }\n return (\"string\" === typeof this.enc) ? this.enc.charCodeAt(pos) : this.enc[pos];\n };\n Stream.prototype.hexByte = function (b) {\n return this.hexDigits.charAt((b >> 4) & 0xF) + this.hexDigits.charAt(b & 0xF);\n };\n Stream.prototype.hexDump = function (start, end, raw) {\n var s = \"\";\n for (var i = start; i < end; ++i) {\n s += this.hexByte(this.get(i));\n if (raw !== true) {\n switch (i & 0xF) {\n case 0x7:\n s += \" \";\n break;\n case 0xF:\n s += \"\\n\";\n break;\n default:\n s += \" \";\n }\n }\n }\n return s;\n };\n Stream.prototype.isASCII = function (start, end) {\n for (var i = start; i < end; ++i) {\n var c = this.get(i);\n if (c < 32 || c > 176) {\n return false;\n }\n }\n return true;\n };\n Stream.prototype.parseStringISO = function (start, end) {\n var s = \"\";\n for (var i = start; i < end; ++i) {\n s += String.fromCharCode(this.get(i));\n }\n return s;\n };\n Stream.prototype.parseStringUTF = function (start, end) {\n var s = \"\";\n for (var i = start; i < end;) {\n var c = this.get(i++);\n if (c < 128) {\n s += String.fromCharCode(c);\n }\n else if ((c > 191) && (c < 224)) {\n s += String.fromCharCode(((c & 0x1F) << 6) | (this.get(i++) & 0x3F));\n }\n else {\n s += String.fromCharCode(((c & 0x0F) << 12) | ((this.get(i++) & 0x3F) << 6) | (this.get(i++) & 0x3F));\n }\n }\n return s;\n };\n Stream.prototype.parseStringBMP = function (start, end) {\n var str = \"\";\n var hi;\n var lo;\n for (var i = start; i < end;) {\n hi = this.get(i++);\n lo = this.get(i++);\n str += String.fromCharCode((hi << 8) | lo);\n }\n return str;\n };\n Stream.prototype.parseTime = function (start, end, shortYear) {\n var s = this.parseStringISO(start, end);\n var m = (shoLine truncated
/***/
}),
/***/
"./lib/lib/asn1js/base64.js":
/*!**********************************!*\
!*** ./lib/lib/asn1js/base64.js ***!
\**********************************/
/***/
((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Base64\": () => (/* binding */ Base64)\n/* harmony export */ });\n// Base64 JavaScript decoder\n// Copyright (c) 2008-2013 Lapo Luchini <lapo@lapo.it>\n// Permission to use, copy, modify, and/or distribute this software for any\n// purpose with or without fee is hereby granted, provided that the above\n// copyright notice and this permission notice appear in all copies.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n/*jshint browser: true, strict: true, immed: true, latedef: true, undef: true, regexdash: false */\nvar decoder;\nvar Base64 = {\n decode: function (a) {\n var i;\n if (decoder === undefined) {\n var b64 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n var ignore = \"= \\f\\n\\r\\t\\u00A0\\u2028\\u2029\";\n decoder = Object.create(null);\n for (i = 0; i < 64; ++i) {\n decoder[b64.charAt(i)] = i;\n }\n decoder['-'] = 62; //+\n decoder['_'] = 63; //-\n for (i = 0; i < ignore.length; ++i) {\n decoder[ignore.charAt(i)] = -1;\n }\n }\n var out = [];\n var bits = 0;\n var char_count = 0;\n for (i = 0; i < a.length; ++i) {\n var c = a.charAt(i);\n if (c == \"=\") {\n break;\n }\n c = decoder[c];\n if (c == -1) {\n continue;\n }\n if (c === undefined) {\n throw new Error(\"Illegal character at offset \" + i);\n }\n bits |= c;\n if (++char_count >= 4) {\n out[out.length] = (bits >> 16);\n out[out.length] = (bits >> 8) & 0xFF;\n out[out.length] = bits & 0xFF;\n bits = 0;\n char_count = 0;\n }\n else {\n bits <<= 6;\n }\n }\n switch (char_count) {\n case 1:\n throw new Error(\"Base64 encoding incomplete: at least 2 bits missing\");\n case 2:\n out[out.length] = (bits >> 10);\n break;\n case 3:\n out[out.length] = (bits >> 16);\n out[out.length] = (bits >> 8) & 0xFF;\n break;\n }\n return out;\n },\n re: /-----BEGIN [^-]+-----([A-Za-z0-9+\\/=\\s]+)-----END [^-]+-----|begin-base64[^\\n]+\\n([A-Za-z0-9+\\/=\\s]+)====/,\n unarmor: function (a) {\n var m = Base64.re.exec(a);\n if (m) {\n if (m[1]) {\n a = m[1];\n }\n else if (m[2]) {\n a = m[2];\n }\n else {\n throw new Error(\"RegExp out of sync\");\n }\n }\n return Base64.decode(a);\n }\n};\n\n\n//# sourceURL=webpack://JSEncrypt/./lib/lib/asn1js/base64.js?");
/***/
}),
/***/
"./lib/lib/asn1js/hex.js":
/*!*******************************!*\
!*** ./lib/lib/asn1js/hex.js ***!
\*******************************/
/***/
((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Hex\": () => (/* binding */ Hex)\n/* harmony export */ });\n// Hex JavaScript decoder\n// Copyright (c) 2008-2013 Lapo Luchini <lapo@lapo.it>\n// Permission to use, copy, modify, and/or distribute this software for any\n// purpose with or without fee is hereby granted, provided that the above\n// copyright notice and this permission notice appear in all copies.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n/*jshint browser: true, strict: true, immed: true, latedef: true, undef: true, regexdash: false */\nvar decoder;\nvar Hex = {\n decode: function (a) {\n var i;\n if (decoder === undefined) {\n var hex = \"0123456789ABCDEF\";\n var ignore = \" \\f\\n\\r\\t\\u00A0\\u2028\\u2029\";\n decoder = {};\n for (i = 0; i < 16; ++i) {\n decoder[hex.charAt(i)] = i;\n }\n hex = hex.toLowerCase();\n for (i = 10; i < 16; ++i) {\n decoder[hex.charAt(i)] = i;\n }\n for (i = 0; i < ignore.length; ++i) {\n decoder[ignore.charAt(i)] = -1;\n }\n }\n var out = [];\n var bits = 0;\n var char_count = 0;\n for (i = 0; i < a.length; ++i) {\n var c = a.charAt(i);\n if (c == \"=\") {\n break;\n }\n c = decoder[c];\n if (c == -1) {\n continue;\n }\n if (c === undefined) {\n throw new Error(\"Illegal character at offset \" + i);\n }\n bits |= c;\n if (++char_count >= 2) {\n out[out.length] = bits;\n bits = 0;\n char_count = 0;\n }\n else {\n bits <<= 4;\n }\n }\n if (char_count) {\n throw new Error(\"Hex encoding incomplete: 4 bits missing\");\n }\n return out;\n }\n};\n\n\n//# sourceURL=webpack://JSEncrypt/./lib/lib/asn1js/hex.js?");
/***/
}),
/***/
"./lib/lib/asn1js/int10.js":
/*!*********************************!*\
!*** ./lib/lib/asn1js/int10.js ***!
\*********************************/
/***/
((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Int10\": () => (/* binding */ Int10)\n/* harmony export */ });\n// Big integer base-10 printing library\n// Copyright (c) 2014 Lapo Luchini <lapo@lapo.it>\n// Permission to use, copy, modify, and/or distribute this software for any\n// purpose with or without fee is hereby granted, provided that the above\n// copyright notice and this permission notice appear in all copies.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n/*jshint browser: true, strict: true, immed: true, latedef: true, undef: true, regexdash: false */\nvar max = 10000000000000; // biggest integer that can still fit 2^53 when multiplied by 256\nvar Int10 = /** @class */ (function () {\n function Int10(value) {\n this.buf = [+value || 0];\n }\n Int10.prototype.mulAdd = function (m, c) {\n // assert(m <= 256)\n var b = this.buf;\n var l = b.length;\n var i;\n var t;\n for (i = 0; i < l; ++i) {\n t = b[i] * m + c;\n if (t < max) {\n c = 0;\n }\n else {\n c = 0 | (t / max);\n t -= c * max;\n }\n b[i] = t;\n }\n if (c > 0) {\n b[i] = c;\n }\n };\n Int10.prototype.sub = function (c) {\n // assert(m <= 256)\n var b = this.buf;\n var l = b.length;\n var i;\n var t;\n for (i = 0; i < l; ++i) {\n t = b[i] - c;\n if (t < 0) {\n t += max;\n c = 1;\n }\n else {\n c = 0;\n }\n b[i] = t;\n }\n while (b[b.length - 1] === 0) {\n b.pop();\n }\n };\n Int10.prototype.toString = function (base) {\n if ((base || 10) != 10) {\n throw new Error(\"only base 10 is supported\");\n }\n var b = this.buf;\n var s = b[b.length - 1].toString();\n for (var i = b.length - 2; i >= 0; --i) {\n s += (max + b[i]).toString().substring(1);\n }\n return s;\n };\n Int10.prototype.valueOf = function () {\n var b = this.buf;\n var v = 0;\n for (var i = b.length - 1; i >= 0; --i) {\n v = v * max + b[i];\n }\n return v;\n };\n Int10.prototype.simplify = function () {\n var b = this.buf;\n return (b.length == 1) ? b[0] : this;\n };\n return Int10;\n}());\n\n\n\n//# sourceURL=webpack://JSEncrypt/./lib/lib/asn1js/int10.js?");
/***/
}),
/***/
"./lib/lib/jsbn/base64.js":
/*!********************************!*\
!*** ./lib/lib/jsbn/base64.js ***!
\********************************/
/***/
((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"b64toBA\": () => (/* binding */ b64toBA),\n/* harmony export */ \"b64tohex\": () => (/* binding */ b64tohex),\n/* harmony export */ \"hex2b64\": () => (/* binding */ hex2b64)\n/* harmony export */ });\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ \"./lib/lib/jsbn/util.js\");\n\nvar b64map = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\nvar b64pad = \"=\";\nfunction hex2b64(h) {\n var i;\n var c;\n var ret = \"\";\n for (i = 0; i + 3 <= h.length; i += 3) {\n c = parseInt(h.substring(i, i + 3), 16);\n ret += b64map.charAt(c >> 6) + b64map.charAt(c & 63);\n }\n if (i + 1 == h.length) {\n c = parseInt(h.substring(i, i + 1), 16);\n ret += b64map.charAt(c << 2);\n }\n else if (i + 2 == h.length) {\n c = parseInt(h.substring(i, i + 2), 16);\n ret += b64map.charAt(c >> 2) + b64map.charAt((c & 3) << 4);\n }\n while ((ret.length & 3) > 0) {\n ret += b64pad;\n }\n return ret;\n}\n// convert a base64 string to hex\nfunction b64tohex(s) {\n var ret = \"\";\n var i;\n var k = 0; // b64 state, 0-3\n var slop = 0;\n for (i = 0; i < s.length; ++i) {\n if (s.charAt(i) == b64pad) {\n break;\n }\n var v = b64map.indexOf(s.charAt(i));\n if (v < 0) {\n continue;\n }\n if (k == 0) {\n ret += (0,_util__WEBPACK_IMPORTED_MODULE_0__.int2char)(v >> 2);\n slop = v & 3;\n k = 1;\n }\n else if (k == 1) {\n ret += (0,_util__WEBPACK_IMPORTED_MODULE_0__.int2char)((slop << 2) | (v >> 4));\n slop = v & 0xf;\n k = 2;\n }\n else if (k == 2) {\n ret += (0,_util__WEBPACK_IMPORTED_MODULE_0__.int2char)(slop);\n ret += (0,_util__WEBPACK_IMPORTED_MODULE_0__.int2char)(v >> 2);\n slop = v & 3;\n k = 3;\n }\n else {\n ret += (0,_util__WEBPACK_IMPORTED_MODULE_0__.int2char)((slop << 2) | (v >> 4));\n ret += (0,_util__WEBPACK_IMPORTED_MODULE_0__.int2char)(v & 0xf);\n k = 0;\n }\n }\n if (k == 1) {\n ret += (0,_util__WEBPACK_IMPORTED_MODULE_0__.int2char)(slop << 2);\n }\n return ret;\n}\n// convert a base64 string to a byte/number array\nfunction b64toBA(s) {\n // piggyback on b64tohex for now, optimize later\n var h = b64tohex(s);\n var i;\n var a = [];\n for (i = 0; 2 * i < h.length; ++i) {\n a[i] = parseInt(h.substring(2 * i, 2 * i + 2), 16);\n }\n return a;\n}\n\n\n//# sourceURL=webpack://JSEncrypt/./lib/lib/jsbn/base64.js?");
/***/
}),
/***/
"./lib/lib/jsbn/jsbn.js":
/*!******************************!*\
!*** ./lib/lib/jsbn/jsbn.js ***!
\******************************/
/***/
((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"BigInteger\": () => (/* binding */ BigInteger),\n/* harmony export */ \"intAt\": () => (/* binding */ intAt),\n/* harmony export */ \"nbi\": () => (/* binding */ nbi),\n/* harmony export */ \"nbits\": () => (/* binding */ nbits),\n/* harmony export */ \"nbv\": () => (/* binding */ nbv),\n/* harmony export */ \"parseBigInt\": () => (/* binding */ parseBigInt)\n/* harmony export */ });\n/* harmony import */ var _util__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./util */ \"./lib/lib/jsbn/util.js\");\n// Copyright (c) 2005 Tom Wu\n// All Rights Reserved.\n// See \"LICENSE\" for details.\n// Basic JavaScript BN library - subset useful for RSA encryption.\n\n// Bits per digit\nvar dbits;\n// JavaScript engine analysis\nvar canary = 0xdeadbeefcafe;\nvar j_lm = ((canary & 0xffffff) == 0xefcafe);\n//#region\nvar lowprimes = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997];\nvar lplim = (1 << 26) / lowprimes[lowprimes.length - 1];\n//#endregion\n// (public) Constructor\nvar BigInteger = /** @class */ (function () {\n function BigInteger(a, b, c) {\n if (a != null) {\n if (\"number\" == typeof a) {\n this.fromNumber(a, b, c);\n }\n else if (b == null && \"string\" != typeof a) {\n this.fromString(a, 256);\n }\n else {\n this.fromString(a, b);\n }\n }\n }\n //#region PUBLIC\n // BigInteger.prototype.toString = bnToString;\n // (public) return string representation in given radix\n BigInteger.prototype.toString = function (b) {\n if (this.s < 0) {\n return \"-\" + this.negate().toString(b);\n }\n var k;\n if (b == 16) {\n k = 4;\n }\n else if (b == 8) {\n k = 3;\n }\n else if (b == 2) {\n k = 1;\n }\n else if (b == 32) {\n k = 5;\n }\n else if (b == 4) {\n k = 2;\n }\n else {\n return this.toRadix(b);\n }\n var km = (1 << k) - 1;\n var d;\n var m = false;\n var r = \"\";\n var i = this.t;\n var p = this.DB - (i * this.DB) % k;\n if (i-- > 0) {\n if (p < this.DB && (d = this[i] >> p) > 0) {\n m = true;\n r = (0,_util__WEBPACK_IMPORTED_MODULE_0__.int2char)(d);\n }\n while (i >= 0) {\n if (p < k) {\n d = (this[i] & ((1 << p) - 1)) << (k - p);\n d |= this[--i] >> (p += this.DB - k);\n }\n else {\n d = (this[i] >> (p -= k)) & km;\n if (p <= 0) {\n p += this.DB;\n --i;\n }\n }\n if (d > 0) {\n m = true;\n }\n if (m) {\n r += (0,_util__WEBPACK_IMPORTED_MODULE_0__.int2char)(d);\n }\n }\n }\n return m ? r : \"0\";\n };\n // BigInteger.prototype.negate = bnNegate;\n // (public) -this\n BigInteger.prototype.negate = function () {\n var r = nbi();\n BigInteger.ZERO.subTo(this, r);\n return r;\n };\n // BigInteger.prototype.abs = bnAbs;\n // (public) |this|\n BigInteger.prototype.abs = function () {\n return (this.s < 0) ? this.negate() : this;\n };\n // BigInteger.prototype.compareTo = bnCompareTo;\n // (public) return + if this > a, - if this < a, 0 if equal\n BigInteger.prototype.compareTo = function (a) {\n var r = this.s - a.s;\n if (r != 0) {\n return r;\n }\n var i = this.t;\n r = i - a.t;\n if (r != 0) {\n return (this.s < 0) ? -r : r;\n }\n while (--i >= 0) {\n if ((r = this[i] - a[i]) != 0) {\n return r;\n }\n }\n return 0;\n };\n // BigInteger.protot Line truncated
/***/
}),
/***/
"./lib/lib/jsbn/prng4.js":
/*!*******************************!*\
!*** ./lib/lib/jsbn/prng4.js ***!
\*******************************/
/***/
((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Arcfour\": () => (/* binding */ Arcfour),\n/* harmony export */ \"prng_newstate\": () => (/* binding */ prng_newstate),\n/* harmony export */ \"rng_psize\": () => (/* binding */ rng_psize)\n/* harmony export */ });\n// prng4.js - uses Arcfour as a PRNG\nvar Arcfour = /** @class */ (function () {\n function Arcfour() {\n this.i = 0;\n this.j = 0;\n this.S = [];\n }\n // Arcfour.prototype.init = ARC4init;\n // Initialize arcfour context from key, an array of ints, each from [0..255]\n Arcfour.prototype.init = function (key) {\n var i;\n var j;\n var t;\n for (i = 0; i < 256; ++i) {\n this.S[i] = i;\n }\n j = 0;\n for (i = 0; i < 256; ++i) {\n j = (j + this.S[i] + key[i % key.length]) & 255;\n t = this.S[i];\n this.S[i] = this.S[j];\n this.S[j] = t;\n }\n this.i = 0;\n this.j = 0;\n };\n // Arcfour.prototype.next = ARC4next;\n Arcfour.prototype.next = function () {\n var t;\n this.i = (this.i + 1) & 255;\n this.j = (this.j + this.S[this.i]) & 255;\n t = this.S[this.i];\n this.S[this.i] = this.S[this.j];\n this.S[this.j] = t;\n return this.S[(t + this.S[this.i]) & 255];\n };\n return Arcfour;\n}());\n\n// Plug in your RNG constructor here\nfunction prng_newstate() {\n return new Arcfour();\n}\n// Pool size must be a multiple of 4 and greater than 32.\n// An array of bytes the size of the pool will be passed to init()\nvar rng_psize = 256;\n\n\n//# sourceURL=webpack://JSEncrypt/./lib/lib/jsbn/prng4.js?");
/***/
}),
/***/
"./lib/lib/jsbn/rng.js":
/*!*****************************!*\
!*** ./lib/lib/jsbn/rng.js ***!
\*****************************/
/***/
((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"SecureRandom\": () => (/* binding */ SecureRandom)\n/* harmony export */ });\n/* harmony import */ var _prng4__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./prng4 */ \"./lib/lib/jsbn/prng4.js\");\n// Random number generator - requires a PRNG backend, e.g. prng4.js\n\nvar rng_state;\nvar rng_pool = null;\nvar rng_pptr;\n// Initialize the pool with junk if needed.\nif (rng_pool == null) {\n rng_pool = [];\n rng_pptr = 0;\n var t = void 0;\n if (typeof window !== 'undefined' && window.crypto && window.crypto.getRandomValues) {\n // Extract entropy (2048 bits) from RNG if available\n var z = new Uint32Array(256);\n window.crypto.getRandomValues(z);\n for (t = 0; t < z.length; ++t) {\n rng_pool[rng_pptr++] = z[t] & 255;\n }\n }\n // Use mouse events for entropy, if we do not have enough entropy by the time\n // we need it, entropy will be generated by Math.random.\n var count = 0;\n var onMouseMoveListener_1 = function (ev) {\n count = count || 0;\n if (count >= 256 || rng_pptr >= _prng4__WEBPACK_IMPORTED_MODULE_0__.rng_psize) {\n if (window.removeEventListener) {\n window.removeEventListener(\"mousemove\", onMouseMoveListener_1, false);\n }\n else if (window.detachEvent) {\n window.detachEvent(\"onmousemove\", onMouseMoveListener_1);\n }\n return;\n }\n try {\n var mouseCoordinates = ev.x + ev.y;\n rng_pool[rng_pptr++] = mouseCoordinates & 255;\n count += 1;\n }\n catch (e) {\n // Sometimes Firefox will deny permission to access event properties for some reason. Ignore.\n }\n };\n if (typeof window !== 'undefined') {\n if (window.addEventListener) {\n window.addEventListener(\"mousemove\", onMouseMoveListener_1, false);\n }\n else if (window.attachEvent) {\n window.attachEvent(\"onmousemove\", onMouseMoveListener_1);\n }\n }\n}\nfunction rng_get_byte() {\n if (rng_state == null) {\n rng_state = (0,_prng4__WEBPACK_IMPORTED_MODULE_0__.prng_newstate)();\n // At this point, we may not have collected enough entropy. If not, fall back to Math.random\n while (rng_pptr < _prng4__WEBPACK_IMPORTED_MODULE_0__.rng_psize) {\n var random = Math.floor(65536 * Math.random());\n rng_pool[rng_pptr++] = random & 255;\n }\n rng_state.init(rng_pool);\n for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) {\n rng_pool[rng_pptr] = 0;\n }\n rng_pptr = 0;\n }\n // TODO: allow reseeding after first request\n return rng_state.next();\n}\nvar SecureRandom = /** @class */ (function () {\n function SecureRandom() {\n }\n SecureRandom.prototype.nextBytes = function (ba) {\n for (var i = 0; i < ba.length; ++i) {\n ba[i] = rng_get_byte();\n }\n };\n return SecureRandom;\n}());\n\n\n\n//# sourceURL=webpack://JSEncrypt/./lib/lib/jsbn/rng.js?");
/***/
}),
/***/
"./lib/lib/jsbn/rsa.js":
/*!*****************************!*\
!*** ./lib/lib/jsbn/rsa.js ***!
\*****************************/
/***/
((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"RSAKey\": () => (/* binding */ RSAKey)\n/* harmony export */ });\n/* harmony import */ var _jsbn__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsbn */ \"./lib/lib/jsbn/jsbn.js\");\n/* harmony import */ var _rng__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./rng */ \"./lib/lib/jsbn/rng.js\");\n// Depends on jsbn.js and rng.js\n// Version 1.1: support utf-8 encoding in pkcs1pad2\n// convert a (hex) string to a bignum object\n\n\n// function linebrk(s,n) {\n// var ret = \"\";\n// var i = 0;\n// while(i + n < s.length) {\n// ret += s.substring(i,i+n) + \"\\n\";\n// i += n;\n// }\n// return ret + s.substring(i,s.length);\n// }\n// function byte2Hex(b) {\n// if(b < 0x10)\n// return \"0\" + b.toString(16);\n// else\n// return b.toString(16);\n// }\nfunction pkcs1pad1(s, n) {\n if (n < s.length + 22) {\n console.error(\"Message too long for RSA\");\n return null;\n }\n var len = n - s.length - 6;\n var filler = \"\";\n for (var f = 0; f < len; f += 2) {\n filler += \"ff\";\n }\n var m = \"0001\" + filler + \"00\" + s;\n return (0,_jsbn__WEBPACK_IMPORTED_MODULE_0__.parseBigInt)(m, 16);\n}\n// PKCS#1 (type 2, random) pad input string s to n bytes, and return a bigint\nfunction pkcs1pad2(s, n) {\n if (n < s.length + 11) { // TODO: fix for utf-8\n console.error(\"Message too long for RSA\");\n return null;\n }\n var ba = [];\n var i = s.length - 1;\n while (i >= 0 && n > 0) {\n var c = s.charCodeAt(i--);\n if (c < 128) { // encode using utf-8\n ba[--n] = c;\n }\n else if ((c > 127) && (c < 2048)) {\n ba[--n] = (c & 63) | 128;\n ba[--n] = (c >> 6) | 192;\n }\n else {\n ba[--n] = (c & 63) | 128;\n ba[--n] = ((c >> 6) & 63) | 128;\n ba[--n] = (c >> 12) | 224;\n }\n }\n ba[--n] = 0;\n var rng = new _rng__WEBPACK_IMPORTED_MODULE_1__.SecureRandom();\n var x = [];\n while (n > 2) { // random non-zero pad\n x[0] = 0;\n while (x[0] == 0) {\n rng.nextBytes(x);\n }\n ba[--n] = x[0];\n }\n ba[--n] = 2;\n ba[--n] = 0;\n return new _jsbn__WEBPACK_IMPORTED_MODULE_0__.BigInteger(ba);\n}\n// \"empty\" RSA key constructor\nvar RSAKey = /** @class */ (function () {\n function RSAKey() {\n this.n = null;\n this.e = 0;\n this.d = null;\n this.p = null;\n this.q = null;\n this.dmp1 = null;\n this.dmq1 = null;\n this.coeff = null;\n }\n //#region PROTECTED\n // protected\n // RSAKey.prototype.doPublic = RSADoPublic;\n // Perform raw public operation on \"x\": return x^e (mod n)\n RSAKey.prototype.doPublic = function (x) {\n return x.modPowInt(this.e, this.n);\n };\n // RSAKey.prototype.doPrivate = RSADoPrivate;\n // Perform raw private operation on \"x\": return x^d (mod n)\n RSAKey.prototype.doPrivate = function (x) {\n if (this.p == null || this.q == null) {\n return x.modPow(this.d, this.n);\n }\n // TODO: re-calculate any missing CRT params\n var xp = x.mod(this.p).modPow(this.dmp1, this.p);\n var xq = x.mod(this.q).modPow(this.dmq1, this.q);\n while (xp.compareTo(xq) < 0) {\n xp = xp.add(this.p);\n }\n return xp.subtract(xq).multiply(this.coeff).mod(this.p).multiply(this.q).add(xq);\n };\n //#endregion PROTECTED\n //#region PUBLIC\n // RSAKey.prototype.setPublic = RSASetPublic;\n // Set the public key fields N and e from hex strings\n RSAKey.prototype.setPublic = function (N, E) {\n if (N != null && E != null && N.length > 0 && E.length > 0) {\n this.n = (0,_jsbn__WEBPACK_IMPORTED_MODULE_0__.parseBigInt)(N, 16);\n this.e = parseInt(E, 16);\n }\n else {\n console.error(\"Invalid RSA public key\");\n }\n };\n // RSAKey.prototype.encrypt = RSAEncrypt;\n // Return the PKCS#1 RSA encryption of \"text\" as an even-length hex string\n RSAKey.prototype.encrypt = function (text) {\n var maxLength = (this.n.bitLength() + 7) >> 3;\n var m = pkcs1pad2(text, maxLength);\n if (m == null) {\n return null;\n }\n var c = this.doPublic(m);\n if (c == null) {\n return null;\n }\n var h = c.toString(16);\n var length = h.length;\n // fix zero before result\n for (var i = 0; i < maxLength * 2 - length; i++) {\n h = \"0\" + h;\n }\n return h;\n };\n // RSAKey.prototype.setPrivate = RSASetPrivate;\n // Set the private key fields N, e, and d from hex strings\n RSAKey.prototype.setPrivate = function (N, E, Line truncated
/***/
}),
/***/
"./lib/lib/jsbn/util.js":
/*!******************************!*\
!*** ./lib/lib/jsbn/util.js ***!
\******************************/
/***/
((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"cbit\": () => (/* binding */ cbit),\n/* harmony export */ \"int2char\": () => (/* binding */ int2char),\n/* harmony export */ \"lbit\": () => (/* binding */ lbit),\n/* harmony export */ \"op_and\": () => (/* binding */ op_and),\n/* harmony export */ \"op_andnot\": () => (/* binding */ op_andnot),\n/* harmony export */ \"op_or\": () => (/* binding */ op_or),\n/* harmony export */ \"op_xor\": () => (/* binding */ op_xor)\n/* harmony export */ });\nvar BI_RM = \"0123456789abcdefghijklmnopqrstuvwxyz\";\nfunction int2char(n) {\n return BI_RM.charAt(n);\n}\n//#region BIT_OPERATIONS\n// (public) this & a\nfunction op_and(x, y) {\n return x & y;\n}\n// (public) this | a\nfunction op_or(x, y) {\n return x | y;\n}\n// (public) this ^ a\nfunction op_xor(x, y) {\n return x ^ y;\n}\n// (public) this & ~a\nfunction op_andnot(x, y) {\n return x & ~y;\n}\n// return index of lowest 1-bit in x, x < 2^31\nfunction lbit(x) {\n if (x == 0) {\n return -1;\n }\n var r = 0;\n if ((x & 0xffff) == 0) {\n x >>= 16;\n r += 16;\n }\n if ((x & 0xff) == 0) {\n x >>= 8;\n r += 8;\n }\n if ((x & 0xf) == 0) {\n x >>= 4;\n r += 4;\n }\n if ((x & 3) == 0) {\n x >>= 2;\n r += 2;\n }\n if ((x & 1) == 0) {\n ++r;\n }\n return r;\n}\n// return number of 1 bits in x\nfunction cbit(x) {\n var r = 0;\n while (x != 0) {\n x &= x - 1;\n ++r;\n }\n return r;\n}\n//#endregion BIT_OPERATIONS\n\n\n//# sourceURL=webpack://JSEncrypt/./lib/lib/jsbn/util.js?");
/***/
}),
/***/
"./lib/lib/jsrsasign/asn1-1.0.js":
/*!***************************************!*\
!*** ./lib/lib/jsrsasign/asn1-1.0.js ***!
\***************************************/
/***/
((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"KJUR\": () => (/* binding */ KJUR)\n/* harmony export */ });\n/* harmony import */ var _jsbn_jsbn__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../jsbn/jsbn */ \"./lib/lib/jsbn/jsbn.js\");\n/* harmony import */ var _yahoo__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./yahoo */ \"./lib/lib/jsrsasign/yahoo.js\");\n/* asn1-1.0.13.js (c) 2013-2017 Kenji Urushima | kjur.github.com/jsrsasign/license\n */\n/*\n * asn1.js - ASN.1 DER encoder classes\n *\n * Copyright (c) 2013-2017 Kenji Urushima (kenji.urushima@gmail.com)\n *\n * This software is licensed under the terms of the MIT License.\n * https://kjur.github.io/jsrsasign/license\n *\n * The above copyright and license notice shall be\n * included in all copies or substantial portions of the Software.\n */\n\n\n/**\n * @fileOverview\n * @name asn1-1.0.js\n * @author Kenji Urushima kenji.urushima@gmail.com\n * @version asn1 1.0.13 (2017-Jun-02)\n * @since jsrsasign 2.1\n * @license <a href=\"https://kjur.github.io/jsrsasign/license/\">MIT License</a>\n */\n/**\n * kjur's class library name space\n * <p>\n * This name space provides following name spaces:\n * <ul>\n * <li>{@link KJUR.asn1} - ASN.1 primitive hexadecimal encoder</li>\n * <li>{@link KJUR.asn1.x509} - ASN.1 structure for X.509 certificate and CRL</li>\n * <li>{@link KJUR.crypto} - Java Cryptographic Extension(JCE) style MessageDigest/Signature\n * class and utilities</li>\n * </ul>\n * </p>\n * NOTE: Please ignore method summary and document of this namespace. This caused by a bug of jsdoc2.\n * @name KJUR\n * @namespace kjur's class library name space\n */\nvar KJUR = {};\n/**\n * kjur's ASN.1 class library name space\n * <p>\n * This is ITU-T X.690 ASN.1 DER encoder class library and\n * class structure and methods is very similar to\n * org.bouncycastle.asn1 package of\n * well known BouncyCaslte Cryptography Library.\n * <h4>PROVIDING ASN.1 PRIMITIVES</h4>\n * Here are ASN.1 DER primitive classes.\n * <ul>\n * <li>0x01 {@link KJUR.asn1.DERBoolean}</li>\n * <li>0x02 {@link KJUR.asn1.DERInteger}</li>\n * <li>0x03 {@link KJUR.asn1.DERBitString}</li>\n * <li>0x04 {@link KJUR.asn1.DEROctetString}</li>\n * <li>0x05 {@link KJUR.asn1.DERNull}</li>\n * <li>0x06 {@link KJUR.asn1.DERObjectIdentifier}</li>\n * <li>0x0a {@link KJUR.asn1.DEREnumerated}</li>\n * <li>0x0c {@link KJUR.asn1.DERUTF8String}</li>\n * <li>0x12 {@link KJUR.asn1.DERNumericString}</li>\n * <li>0x13 {@link KJUR.asn1.DERPrintableString}</li>\n * <li>0x14 {@link KJUR.asn1.DERTeletexString}</li>\n * <li>0x16 {@link KJUR.asn1.DERIA5String}</li>\n * <li>0x17 {@link KJUR.asn1.DERUTCTime}</li>\n * <li>0x18 {@link KJUR.asn1.DERGeneralizedTime}</li>\n * <li>0x30 {@link KJUR.asn1.DERSequence}</li>\n * <li>0x31 {@link KJUR.asn1.DERSet}</li>\n * </ul>\n * <h4>OTHER ASN.1 CLASSES</h4>\n * <ul>\n * <li>{@link KJUR.asn1.ASN1Object}</li>\n * <li>{@link KJUR.asn1.DERAbstractString}</li>\n * <li>{@link KJUR.asn1.DERAbstractTime}</li>\n * <li>{@link KJUR.asn1.DERAbstractStructured}</li>\n * <li>{@link KJUR.asn1.DERTaggedObject}</li>\n * </ul>\n * <h4>SUB NAME SPACES</h4>\n * <ul>\n * <li>{@link KJUR.asn1.cades} - CAdES long term signature format</li>\n * <li>{@link KJUR.asn1.cms} - Cryptographic Message Syntax</li>\n * <li>{@link KJUR.asn1.csr} - Certificate Signing Request (CSR/PKCS#10)</li>\n * <li>{@link KJUR.asn1.tsp} - RFC 3161 Timestamping Protocol Format</li>\n * <li>{@link KJUR.asn1.x509} - RFC 5280 X.509 certificate and CRL</li>\n * </ul>\n * </p>\n * NOTE: Please ignore method summary and document of this namespace.\n * This caused by a bug of jsdoc2.\n * @name KJUR.asn1\n * @namespace\n */\nif (typeof KJUR.asn1 == \"undefined\" || !KJUR.asn1)\n KJUR.asn1 = {};\n/**\n * ASN1 utilities class\n * @name KJUR.asn1.ASN1Util\n * @class ASN1 utilities class\n * @since asn1 1.0.2\n */\nKJUR.asn1.ASN1Util = new function () {\n this.integerToByteHex = function (i) {\n var h = i.toString(16);\n if ((h.length % 2) == 1)\n h = '0' + h;\n return h;\n };\n this.bigIntToMinTwosComplementsHex = function (bigIntegerValue) {\n var h = bigIntegerValue.toString(16);\n if (h.substr(0, 1) != '-') {\n if (h.length % 2 == 1) {\n h = '0' + h;\n }\n else {\n if (!h.match(/^[0-7]/)) {\n h = '00' + h;\n }\n }\n }\n else {\n var hPos = h.substr(1);\n var xorLen = hPos.length;\n if (xorLen % 2 == 1) {\n xorLen += 1;\n }\n else {\n if (!h.match(/^[0-7]/)) {\n xorLen += 2;\n }\n }\n var hMask = '';\n for (var i = 0; i < xorLen; i++) {\n hMask += 'f';\n Line truncated
/***/
}),
/***/
"./lib/lib/jsrsasign/yahoo.js":
/*!************************************!*\
!*** ./lib/lib/jsrsasign/yahoo.js ***!
\************************************/
/***/
((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
"use strict";
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"YAHOO\": () => (/* binding */ YAHOO)\n/* harmony export */ });\n/*!\nCopyright (c) 2011, Yahoo! Inc. All rights reserved.\nCode licensed under the BSD License:\nhttp://developer.yahoo.com/yui/license.html\nversion: 2.9.0\n*/\nvar YAHOO = {};\nYAHOO.lang = {\n /**\n * Utility to set up the prototype, constructor and superclass properties to\n * support an inheritance strategy that can chain constructors and methods.\n * Static members will not be inherited.\n *\n * @method extend\n * @static\n * @param {Function} subc the object to modify\n * @param {Function} superc the object to inherit\n * @param {Object} overrides additional properties/methods to add to the\n * subclass prototype. These will override the\n * matching items obtained from the superclass\n * if present.\n */\n extend: function (subc, superc, overrides) {\n if (!superc || !subc) {\n throw new Error(\"YAHOO.lang.extend failed, please check that \" +\n \"all dependencies are included.\");\n }\n var F = function () { };\n F.prototype = superc.prototype;\n subc.prototype = new F();\n subc.prototype.constructor = subc;\n subc.superclass = superc.prototype;\n if (superc.prototype.constructor == Object.prototype.constructor) {\n superc.prototype.constructor = superc;\n }\n if (overrides) {\n var i;\n for (i in overrides) {\n subc.prototype[i] = overrides[i];\n }\n /*\n * IE will not enumerate native functions in a derived object even if the\n * function was overridden. This is a workaround for specific functions\n * we care about on the Object prototype.\n * @property _IEEnumFix\n * @param {Function} r the object to receive the augmentation\n * @param {Function} s the object that supplies the properties to augment\n * @static\n * @private\n */\n var _IEEnumFix = function () { }, ADD = [\"toString\", \"valueOf\"];\n try {\n if (/MSIE/.test(navigator.userAgent)) {\n _IEEnumFix = function (r, s) {\n for (i = 0; i < ADD.length; i = i + 1) {\n var fname = ADD[i], f = s[fname];\n if (typeof f === 'function' && f != Object.prototype[fname]) {\n r[fname] = f;\n }\n }\n };\n }\n }\n catch (ex) { }\n ;\n _IEEnumFix(subc.prototype, overrides);\n }\n }\n};\n\n\n//# sourceURL=webpack://JSEncrypt/./lib/lib/jsrsasign/yahoo.js?");
/***/
}),
/***/
"./node_modules/process/browser.js":
/*!*****************************************!*\
!*** ./node_modules/process/browser.js ***!
\*****************************************/
/***/
((module) => {
eval("// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess Line truncated
/***/
})
/******/
});
/************************************************************************/
/******/ // The module cache
/******/
var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/
function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/
var cachedModule = __webpack_module_cache__[moduleId];
/******/
if (cachedModule !== undefined) {
/******/
return cachedModule.exports;
/******/
}
/******/ // Create a new module (and put it into the cache)
/******/
var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/
exports: {}
/******/
};
/******/
/******/ // Execute the module function
/******/
__webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/
return module.exports;
/******/
}
/******/
/************************************************************************/
/******/
/* webpack/runtime/define property getters */
/******/
(() => {
/******/ // define getter functions for harmony exports
/******/
__webpack_require__.d = (exports, definition) => {
/******/
for (var key in definition) {
/******/
if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/
Object.defineProperty(exports, key, {
enumerable: true,
get: definition[key]
});
/******/
}
/******/
}
/******/
};
/******/
})();
/******/
/******/
/* webpack/runtime/hasOwnProperty shorthand */
/******/
(() => {
/******/
__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/
})();
/******/
/******/
/* webpack/runtime/make namespace object */
/******/
(() => {
/******/ // define __esModule on exports
/******/
__webpack_require__.r = (exports) => {
/******/
if (typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/
Object.defineProperty(exports, Symbol.toStringTag, {
value: 'Module'
});
/******/
}
/******/
Object.defineProperty(exports, '__esModule', {
value: true
});
/******/
};
/******/
})();
/******/
/************************************************************************/
/******/
/******/ // startup
/******/ // Load entry module and return exports
/******/ // This entry module can't be inlined because the eval devtool is used.
/******/
var __webpack_exports__ = __webpack_require__("./lib/index.js");
/******/
__webpack_exports__ = __webpack_exports__["default"];
/******/
/******/
return __webpack_exports__;
/******/
})();
});
+1809
View File
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+1439
View File
File diff suppressed because it is too large. Load diff
+429
View File
@@ -0,0 +1,429 @@
if (typeof Object.assign !== 'function') {
Object.assign = function() {
let target = arguments[0];
for (let i = 1; i < arguments.length; i++) {
let source = arguments[i];
for (let key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
return target;
};
}
// 通用免嗅探播放
let common_lazy = `js:
let html = request(input);
let hconf = html.match(/r player_.*?=(.*?)</)[1];
let json = JSON5.parse(hconf);
let url = json.url;
if (json.encrypt == '1') {
url = unescape(url);
} else if (json.encrypt == '2') {
url = unescape(base64Decode(url));
}
if (/\\.(m3u8|mp4|m4a|mp3)/.test(url)) {
input = {
parse: 0,
jx: 0,
url: url,
};
} else {
input = url && url.startsWith('http') && tellIsJx(url) ? {parse:0,jx:1,url:url}:input;
}`;
// 默认嗅探播放
let def_lazy = `js:
input = { parse: 1, url: input, js: '' };`;
// 采集站播放
let cj_lazy = `js:
if (/\\.(m3u8|mp4)/.test(input)) {
input = { parse: 0, url: input };
} else {
if (rule.parse_url.startsWith('json:')) {
let purl = rule.parse_url.replace('json:', '') + input;
let html = request(purl);
let json = JSON.parse(html);
if (json.url) {
input = { parse: 0, url: json.url };
}
} else {
input = rule.parse_url + input;
}
}`;
function getMubans() {
const mubanDict = { // 模板字典
mx: {
title: '',
host: '',
url: '/vodshow/fyclass--------fypage---/',
searchUrl: '/vodsearch/**----------fypage---/',
class_parse: '.top_nav li;a&&Text;a&&href;.*/(.*?)/',
searchable: 2,
quickSearch: 0,
filterable: 0,
headers: {
'User-Agent': 'MOBILE_UA',
},
play_parse: true,
lazy: common_lazy,
limit: 6,
double: true,
推荐: '.cbox_list;*;*;*;*;*',
一级: 'ul.vodlist li;a&&title;a&&data-original;.pic_text&&Text;a&&href',
二级: {
title: 'h2&&Text;.content_detail:eq(1)&&li&&a:eq(2)&&Text',
img: '.vodlist_thumb&&data-original',
desc: '.content_detail:eq(1)&&li:eq(1)&&Text;.content_detail:eq(1)&&li&&a&&Text;.content_detail:eq(1)&&li&&a:eq(1)&&Text;.content_detail:eq(1)&&li:eq(2)&&Text;.content_detail:eq(1)&&li:eq(3)&&Text',
content: '.content_desc&&span&&Text',
tabs: '.play_source_tab&&a',
lists: '.content_playlist:eq(#id) li',
},
搜索: '*',
},
mxpro: {
title: '',
host: '', // homeUrl:'/',
url: '/vodshow/fyclass--------fypage---.html',
searchUrl: '/vodsearch/**----------fypage---.html',
searchable: 2, //是否启用全局搜索,
quickSearch: 0, //是否启用快速搜索,
filterable: 0, //是否启用分类筛选,
headers: { //网站的请求头,完整支持所有的,常带ua和cookies
'User-Agent': 'MOBILE_UA', // "Cookie": "searchneed=ok"
},
class_parse: '.navbar-items li:gt(0):lt(10);a&&Text;a&&href;/(\\d+)',
play_parse: true,
lazy: common_lazy,
limit: 6,
double: true, // 推荐内容是否双层定位
推荐: '.tab-list.active;a.module-poster-item.module-item;.module-poster-item-title&&Text;.lazyload&&data-original;.module-item-note&&Text;a&&href',
一级: 'body a.module-poster-item.module-item;a&&title;.lazyload&&data-original;.module-item-note&&Text;a&&href',
二级: {
title: 'h1&&Text;.module-info-tag-link:eq(-1)&&Text',
img: '.lazyload&&data-original||data-src||src',
desc: '.module-info-item:eq(-2)&&Text;.module-info-tag-link&&Text;.module-info-tag-link:eq(1)&&Text;.module-info-item:eq(2)&&Text;.module-info-item:eq(1)&&Text',
content: '.module-info-introduction&&Text',
tabs: '.module-tab-item',
lists: '.module-play-list:eq(#id) a',
tab_text: 'div--small&&Text',
},
搜索: 'body .module-item;.module-card-item-title&&Text;.lazyload&&data-original;.module-item-note&&Text;a&&href;.module-info-item-content&&Text',
},
mxone5: {
title: '',
host: '',
url: '/show/fyclass--------fypage---.html',
searchUrl: '/search/**----------fypage---.html',
searchable: 2, //是否启用全局搜索,
quickSearch: 0, //是否启用快速搜索,
filterable: 0, //是否启用分类筛选,
class_parse: '.nav-menu-items&&li;a&&Text;a&&href;.*/(.*?)\.html',
play_parse: true,
lazy: common_lazy,
limit: 6,
double: true, // 推荐内容是否双层定位
推荐: '.module-list;.module-items&&.module-item;a&&title;img&&data-src;.module-item-text&&Text;a&&href',
一级: '.module-items .module-item;a&&title;img&&data-src;.module-item-text&&Text;a&&href',
二级: {
title: 'h1&&Text;.tag-link&&Text',
img: '.module-item-pic&&img&&data-src',
desc: '.video-info-items:eq(3)&&Text;.tag-link:eq(2)&&Text;.tag-link:eq(1)&&Text;.video-info-items:eq(1)&&Text;.video-info-items:eq(0)&&Text',
content: '.vod_content&&Text',
tabs: '.module-tab-item',
lists: '.module-player-list:eq(#id)&&.scroll-content&&a',
tab_text: 'div--small&&Text',
},
搜索: '.module-items .module-search-item;a&&title;img&&data-src;.video-serial&&Text;a&&href',
},
首图: {
title: '',
host: '',
url: '/vodshow/fyclass--------fypage---/',
searchUrl: '/vodsearch/**----------fypage---.html',
searchable: 2, //是否启用全局搜索,
quickSearch: 0, //是否启用快速搜索,
filterable: 0, //是否启用分类筛选,
headers: { //网站的请求头,完整支持所有的,常带ua和cookies
'User-Agent': 'MOBILE_UA', // "Cookie": "searchneed=ok"
},
class_parse: '.myui-header__menu li.hidden-sm:gt(0):lt(7);a&&Text;a&&href;/(\\d+).html',
play_parse: true,
lazy: common_lazy,
limit: 6,
double: true, // 推荐内容是否双层定位
推荐: 'ul.myui-vodlist.clearfix;li;a&&title;a&&data-original;.pic-text&&Text;a&&href',
一级: '.myui-vodlist li;a&&title;a&&data-original;.pic-text&&Text;a&&href',
二级: {
title: '.myui-content__detail .title--span&&Text;.myui-content__detail p.data:eq(3)&&Text',
img: '.myui-content__thumb .lazyload&&data-original',
desc: '.myui-content__detail p.otherbox&&Text;.year&&Text;.myui-content__detail p.data:eq(4)&&Text;.myui-content__detail p.data:eq(2)&&Text;.myui-content__detail p.data:eq(0)&&Text',
content: '.content&&Text',
tabs: '.myui-panel__head&&li',
// tabs: '.nav-tabs&&li',
lists: '.myui-content__list:eq(#id) li',
},
搜索: '#searchList li;a&&title;.lazyload&&data-original;.pic-text&&Text;a&&href;.detail&&Text',
},
首图2: {
title: '',
host: '',
url: '/list/fyclass-fypage.html',
searchUrl: '/vodsearch/**----------fypage---.html',
searchable: 2, //是否启用全局搜索,
quickSearch: 0, //是否启用快速搜索,
filterable: 0, //是否启用分类筛选,
headers: {
'User-Agent': 'UC_UA', // "Cookie": ""
},
class_parse: '.stui-header__menu li:gt(0):lt(7);a&&Text;a&&href;.*/(.*?).html',
play_parse: true,
lazy: common_lazy,
limit: 6,
double: true, // 推荐内容是否双层定位
推荐: 'ul.stui-vodlist.clearfix;li;a&&title;.lazyload&&data-original;.pic-text&&Text;a&&href',
一级: '.stui-vodlist li;a&&title;a&&data-original;.pic-text&&Text;a&&href',
二级: {
title: '.stui-content__detail .title&&Text;.stui-content__detail&&p:eq(-2)&&a&&Text',
title1: '.stui-content__detail .title&&Text;.stui-content__detail&&p&&Text',
img: '.stui-content__thumb .lazyload&&data-original',
desc: '.stui-content__detail p&&Text;.stui-content__detail&&p:eq(-2)&&a:eq(2)&&Text;.stui-content__detail&&p:eq(-2)&&a:eq(1)&&Text;.stui-content__detail p:eq(2)&&Text;.stui-content__detail p:eq(1)&&Text',
desc1: '.stui-content__detail p:eq(4)&&Text;;;.stui-content__detail p:eq(1)&&Text',
content: '.detail&&Text',
tabs: '.stui-pannel__head h3',
tabs1: '.stui-vodlist__head h3',
lists: '.stui-content__playlist:eq(#id) li',
},
搜索: 'ul.stui-vodlist__media,ul.stui-vodlist,#searchList li;a&&title;.lazyload&&data-original;.pic-text&&Text;a&&href;.detail&&Text',
},
默认: {
title: '',
host: '',
url: '',
searchUrl: '',
searchable: 2,
quickSearch: 0,
filterable: 0,
filter: '',
filter_url: '',
filter_def: {},
headers: {
'User-Agent': 'MOBILE_UA',
},
timeout: 5000,
class_parse: '#side-menu li;a&&Text;a&&href;/(.*?)\.html',
cate_exclude: '',
play_parse: true,
lazy: def_lazy,
double: true,
推荐: '列表1;列表2;标题;图片;描述;链接;详情',
一级: '列表;标题;图片;描述;链接;详情',
二级: {
title: 'vod_name;vod_type',
img: '图片链接',
desc: '主要信息;年代;地区;演员;导演',
content: '简介',
tabs: '',
lists: 'xx:eq(#id)&&a',
tab_text: 'body&&Text',
list_text: 'body&&Text',
list_url: 'a&&href',
},
搜索: '列表;标题;图片;描述;链接;详情',
},
vfed: {
title: '',
host: '',
url: '/index.php/vod/show/id/fyclass/page/fypage.html',
searchUrl: '/index.php/vod/search/page/fypage/wd/**.html',
searchable: 2, //是否启用全局搜索,
quickSearch: 0, //是否启用快速搜索,
filterable: 0, //是否启用分类筛选,
headers: {
'User-Agent': 'UC_UA',
},
class_parse: '.fed-pops-navbar&&ul.fed-part-rows&&a;a&&Text;a&&href;.*/(.*?).html',
play_parse: true,
lazy: common_lazy,
limit: 6,
double: true, // 推荐内容是否双层定位
推荐: 'ul.fed-list-info.fed-part-rows;li;a.fed-list-title&&Text;a&&data-original;.fed-list-remarks&&Text;a&&href',
一级: '.fed-list-info&&li;a.fed-list-title&&Text;a&&data-original;.fed-list-remarks&&Text;a&&href',
二级: {
title: 'h1.fed-part-eone&&Text;.fed-deta-content&&.fed-part-rows&&li&&Text',
img: '.fed-list-info&&a&&data-original',
desc: '.fed-deta-content&&.fed-part-rows&&li:eq(1)&&Text;.fed-deta-content&&.fed-part-rows&&li:eq(2)&&Text;.fed-deta-content&&.fed-part-rows&&li:eq(3)&&Text',
content: '.fed-part-esan&&Text',
tabs: '.fed-drop-boxs&&.fed-part-rows&&li',
lists: '.fed-play-item:eq(#id)&&ul:eq(1)&&li',
},
搜索: '.fed-deta-info;h1&&Text;.lazyload&&data-original;.fed-list-remarks&&Text;a&&href;.fed-deta-content&&Text',
},
海螺3: {
title: '',
host: '',
searchUrl: '/v_search/**----------fypage---.html',
url: '/vod_____show/fyclass--------fypage---.html',
headers: {
'User-Agent': 'MOBILE_UA',
},
timeout: 5000,
class_parse: 'body&&.hl-nav li:gt(0);a&&Text;a&&href;.*/(.*?).html',
cate_exclude: '明星|专题|最新|排行',
limit: 40,
play_parse: true,
lazy: common_lazy,
double: true,
推荐: '.hl-vod-list;li;a&&title;a&&data-original;.remarks&&Text;a&&href',
一级: '.hl-vod-list&&.hl-list-item;a&&title;a&&data-original;.remarks&&Text;a&&href',
二级: {
title: '.hl-dc-title&&Text;.hl-dc-content&&li:eq(6)&&Text',
img: '.hl-lazy&&data-original',
desc: '.hl-dc-content&&li:eq(10)&&Text;.hl-dc-content&&li:eq(4)&&Text;.hl-dc-content&&li:eq(5)&&Text;.hl-dc-content&&li:eq(2)&&Text;.hl-dc-content&&li:eq(3)&&Text',
content: '.hl-content-text&&Text',
tabs: '.hl-tabs&&a',
tab_text: 'a--span&&Text',
lists: '.hl-plays-list:eq(#id)&&li',
},
搜索: '.hl-list-item;a&&title;a&&data-original;.remarks&&Text;a&&href',
searchable: 2, //是否启用全局搜索,
quickSearch: 0, //是否启用快速搜索,
filterable: 0, //是否启用分类筛选,
},
海螺2: {
title: '',
host: '',
searchUrl: '/index.php/vod/search/page/fypage/wd/**/',
url: '/index.php/vod/show/id/fyclass/page/fypage/',
headers: {
'User-Agent': 'MOBILE_UA',
},
timeout: 5000,
class_parse: '#nav-bar li;a&&Text;a&&href;id/(.*?)/',
limit: 40,
play_parse: true,
lazy: common_lazy,
double: true,
推荐: '.list-a.size;li;a&&title;.lazy&&data-original;.bt&&Text;a&&href',
一级: '.list-a&&li;a&&title;.lazy&&data-original;.list-remarks&&Text;a&&href',
二级: {
title: 'h2&&Text;.deployment&&Text',
img: '.lazy&&data-original',
desc: '.deployment&&Text',
content: '.ec-show&&Text',
tabs: '#tag&&a',
lists: '.play_list_box:eq(#id)&&li',
},
搜索: '.search-list;a&&title;.lazy&&data-original;.deployment&&Text;a&&href',
searchable: 2, //是否启用全局搜索,
quickSearch: 0, //是否启用快速搜索,
filterable: 0, //是否启用分类筛选,
},
短视: {
title: '',
host: '', // homeUrl:'/',
url: '/channel/fyclass-fypage.html',
searchUrl: '/search.html?wd=**',
searchable: 2, //是否启用全局搜索,
quickSearch: 0, //是否启用快速搜索,
filterable: 0, //是否启用分类筛选,
headers: { //网站的请求头,完整支持所有的,常带ua和cookies
'User-Agent': 'MOBILE_UA', // "Cookie": "searchneed=ok"
},
class_parse: '.menu_bottom ul li;a&&Text;a&&href;.*/(.*?).html',
cate_exclude: '解析|动态',
play_parse: true,
lazy: common_lazy,
limit: 6,
double: true, // 推荐内容是否双层定位
推荐: '.indexShowBox;ul&&li;a&&title;img&&data-src;.s1&&Text;a&&href',
一级: '.pic-list&&li;a&&title;img&&data-src;.s1&&Text;a&&href',
二级: {
title: 'h1&&Text;.content-rt&&p:eq(0)&&Text',
img: '.img&&img&&data-src',
desc: '.content-rt&&p:eq(1)&&Text;.content-rt&&p:eq(2)&&Text;.content-rt&&p:eq(3)&&Text;.content-rt&&p:eq(4)&&Text;.content-rt&&p:eq(5)&&Text',
content: '.zkjj_a&&Text',
tabs: '.py-tabs&&option',
lists: '.player:eq(#id) li',
},
搜索: '.sr_lists&&ul&&li;h3&&Text;img&&data-src;.int&&p:eq(0)&&Text;a&&href',
},
短视2: {
title: '',
host: '',
class_name: '电影&电视剧&综艺&动漫',
class_url: '1&2&3&4',
searchUrl: '/index.php/ajax/suggest?mid=1&wd=**&limit=50',
searchable: 2,
quickSearch: 0,
headers: {
'User-Agent': 'MOBILE_UA'
},
url: '/index.php/api/vod#type=fyclass&page=fypage',
filterable: 0, //是否启用分类筛选,
filter_url: '',
filter: {},
filter_def: {},
detailUrl: '/index.php/vod/detail/id/fyid.html',
play_parse: true,
lazy: common_lazy,
limit: 6,
推荐: '.list-vod.flex .public-list-box;a&&title;.lazy&&data-original;.public-list-prb&&Text;a&&href',
一级: 'js:let body=input.split("#")[1];let t=Math.round(new Date/1e3).toString();let key=md5("DS"+t+"DCC147D11943AF75");let url=input.split("#")[0];body=body+"&time="+t+"&key="+key;print(body);fetch_params.body=body;let html=post(url,fetch_params);let data=JSON.parse(html);VODS=data.list.map(function(it){it.vod_pic=urljoin2(input.split("/i")[0],it.vod_pic);return it});',
二级: {
title: '.slide-info-title&&Text;.slide-info:eq(2)--strong&&Text',
img: '.detail-pic&&data-original',
desc: '.slide-info-remarks&&Text;.slide-info-remarks:eq(1)&&Text;.slide-info-remarks:eq(2)&&Text;.slide-info:eq(1)--strong&&Text;.info-parameter&&ul&&li:eq(3)&&Text',
content: '#height_limit&&Text',
tabs: '.anthology.wow.fadeInUp.animated&&.swiper-wrapper&&a',
tab_text: 'a--span&&Text',
lists: '.anthology-list-box:eq(#id) li',
},
搜索: 'json:list;name;pic;;id',
},
采集1: {
title: '',
host: '',
homeTid: '13',
homeUrl: '/api.php/provide/vod/?ac=detail&t={{rule.homeTid}}',
detailUrl: '/api.php/provide/vod/?ac=detail&ids=fyid',
searchUrl: '/api.php/provide/vod/?wd=**&pg=fypage',
url: '/api.php/provide/vod/?ac=detail&pg=fypage&t=fyclass',
headers: {
'User-Agent': 'MOBILE_UA'
},
timeout: 5000, // class_name: '电影&电视剧&综艺&动漫',
// class_url: '1&2&3&4',
// class_parse:'js:let html=request(input);input=JSON.parse(html).class;',
class_parse: 'json:class;',
limit: 20,
multi: 1,
searchable: 2, //是否启用全局搜索,
quickSearch: 1, //是否启用快速搜索,
filterable: 0, //是否启用分类筛选,
play_parse: true,
parse_url: '',
lazy: cj_lazy,
推荐: '*',
一级: 'json:list;vod_name;vod_pic;vod_remarks;vod_id;vod_play_from',
二级: `js:
let html=request(input);
html=JSON.parse(html);
let data=html.list;
VOD=data[0];`,
搜索: '*',
},
};
return JSON.parse(JSON.stringify(mubanDict));
}
var mubanDict = getMubans();
var muban = getMubans();
export default {
muban,
getMubans
};
+378
View File
@@ -0,0 +1,378 @@
globalThis.getRandomItem = function(items) {
return items[Math.random() * items.length | 0];
}
var rule = {
title: '采集之王[合]',
author: '道长',
version: '20240706 beta17',
update_info: ``.trim(),
host: '',
homeTid: '',
homeUrl: '/api.php/provide/vod/?ac=detail&t={{rule.homeTid}}',
detailUrl: '/api.php/provide/vod/?ac=detail&ids=fyid',
searchUrl: '/api.php/provide/vod/?wd=**&pg=#TruePage##page=fypage',
classUrl: '/api.php/provide/vod/',
url: '/api.php/provide/vod/?ac=detail&pg=fypage&t=fyfilter',
filter_url: '{{fl.类型}}',
headers: {
'User-Agent': 'MOBILE_UA'
},
timeout: 5000,
limit: 20,
search_limit: 10,
searchable: 1,
quickSearch: 0,
filterable: 1,
play_parse: true,
parse_url: '',
search_match: false,
search_pic: true,
预处理: $js.toString(() => {
function getClasses(item) {
let classes = [];
if (item.class_name && item.class_url) {
if (!/&|电影|电视剧|综艺|动漫[\u4E00-\u9FA5]+/.test(item.class_name)) {
try {
item.class_name = ungzip(item.class_name)
} catch (e) {
log(`不识别的class_name导致gzip解码失败:${e}`)
return classes
}
}
let names = item.class_name.split('&');
let urls = item.class_url.split('&');
let cnt = Math.min(names.length, urls.length);
for (let i = 0; i < cnt; i++) {
classes.push({
'type_id': urls[i],
'type_name': names[i]
});
}
}
return classes
}
if (typeof(batchFetch) === 'function') {
rule.search_limit = 16;
log('当前程序支持批量请求[batchFetch],搜索限制已设置为16');
}
let _url = rule.params;
log(`传入参数:${_url}`);
if (_url && typeof(_url) === 'string' && /^(http|file)/.test(_url)) {
if (_url.includes('$')) {
let _url_params = _url.split('$');
_url = _url_params[0];
rule.search_match = !!(_url_params[1]);
if (_url_params.length > 2) {
rule.search_pic = !!(_url_params[2]);
}
}
let html = request(_url);
let json = JSON.parse(html);
let _classes = [];
rule.filter = {};
rule.filter_def = {};
json.forEach(it => {
let _obj = {
type_name: it.name,
type_id: it.url,
parse_url: it.parse_url || '',
searchable: it.searchable !== 0,
api: it.api || '',
cate_exclude: it.cate_exclude || '',
cate_excludes: it.cate_excludes || [],
};
_classes.push(_obj);
try {
let json1 = [];
if (it.class_name && it.class_url) {
json1 = getClasses(it);
} else {
json1 = JSON.parse(request(urljoin(_obj.type_id, _obj.api || rule.classUrl))).class;
}
if (_obj.cate_excludes && Array.isArray(_obj.cate_excludes) && _obj.cate_excludes.length > 0) {
json1 = json1.filter(cl => !_obj.cate_excludes.includes(cl.type_name));
} else if (_obj.cate_exclude) {
json1 = json1.filter(cl => !new RegExp(_obj.cate_exclude, 'i').test(cl.type_name));
}
rule.filter[_obj.type_id] = [{
"key": "类型",
"name": "类型",
"value": json1.map(i => {
return {
"n": i.type_name,
'v': i.type_id
}
})
}];
if (json1.length > 0) {
rule.filter_def[it.url] = {
"类型": json1[0].type_id
};
}
} catch (e) {
rule.filter[it.url] = [{
"key": "类型",
"name": "类型",
"value": [{
"n": "全部",
"v": ""
}]
}];
}
});
rule.classes = _classes;
}
}),
class_parse: $js.toString(() => {
input = rule.classes;
}),
推荐: $js.toString(() => {
VODS = [];
if (rule.classes) {
let randomClass = getRandomItem(rule.classes);
let _url = urljoin(randomClass.type_id, input);
if (randomClass.api) {
_url = _url.replace('/api.php/provide/vod/', randomClass.api)
}
try {
let html = request(_url, {
timeout: rule.timeout
});
let json = JSON.parse(html);
VODS = json.list;
VODS.forEach(it => {
it.vod_id = randomClass.type_id + '$' + it.vod_id;
it.vod_remarks = it.vod_remarks + '|' + randomClass.type_name;
});
} catch (e) {}
}
}),
一级: $js.toString(() => {
VODS = [];
if (rule.classes) {
let _url = urljoin(MY_CATE, input);
let current_vod = rule.classes.find(item => item.type_id === MY_CATE);
if (current_vod && current_vod.api) {
_url = _url.replace('/api.php/provide/vod/', current_vod.api)
}
let html = request(_url);
let json = JSON.parse(html);
VODS = json.list;
VODS.forEach(it => {
it.vod_id = MY_CATE + '$' + it.vod_id
});
}
}),
二级: $js.toString(() => {
VOD = {};
if (orId === 'update_info') {
VOD = {
vod_content: rule.update_info.trim(),
vod_name: '更新日志',
type_name: '更新日志',
vod_pic: 'https://resource-cdn.tuxiaobei.com/video/FtWhs2mewX_7nEuE51_k6zvg6awl.png',
vod_remarks: `版本:${rule.version}`,
vod_play_from: '道长在线',
vod_play_url: '随机小视频$http://api.yujn.cn/api/zzxjj.php',
};
} else {
if (rule.classes) {
let _url = urljoin(fyclass, input);
let current_vod = rule.classes.find(item => item.type_id === fyclass);
if (current_vod && current_vod.api) {
_url = _url.replace('/api.php/provide/vod/', current_vod.api)
}
let html = request(_url);
let json = JSON.parse(html);
let data = json.list;
VOD = data[0];
if (current_vod && current_vod.type_name) {
VOD.vod_play_from = VOD.vod_play_from.split('$$$').map(it => current_vod.type_name + '|' + it).join('$$$')
}
}
}
}),
搜索: $js.toString(() => {
VODS = [];
if (rule.classes) {
let canSearch = rule.classes.filter(it => it.searchable);
let page = Number(MY_PAGE);
page = (MY_PAGE - 1) % Math.ceil(canSearch.length / rule.search_limit) + 1;
let truePage = Math.ceil(MY_PAGE / Math.ceil(canSearch.length / rule.search_limit));
if (rule.search_limit) {
let start = (page - 1) * rule.search_limit;
let end = page * rule.search_limit;
let t1 = new Date().getTime();
let searchMode = typeof(batchFetch) === 'function' ? '批量' : '单个';
log('start:' + start);
log('end:' + end);
log('搜索模式:' + searchMode);
log('精准搜索:' + rule.search_match);
log('强制获取图片:' + rule.search_pic);
if (start < canSearch.length) {
let search_classes = canSearch.slice(start, end);
let urls = [];
search_classes.forEach(it => {
let _url = urljoin(it.type_id, input);
if (it.api) {
_url = _url.replace('/api.php/provide/vod/', it.api)
}
_url = _url.replace("#TruePage#", "" + truePage);
urls.push(_url);
});
let results_list = [];
let results = [];
if (typeof(batchFetch) === 'function') {
let reqUrls = urls.map(it => {
return {
url: it,
options: {
timeout: rule.timeout
}
}
});
let rets = batchFetch(reqUrls);
let detailUrls = [];
let detailUrlCount = 0;
rets.forEach((ret, idx) => {
let it = search_classes[idx];
if (ret) {
try {
let json = JSON.parse(ret);
let data = json.list;
data.forEach(i => {
i.site_name = it.type_name;
i.vod_id = it.type_id + '$' + i.vod_id;
i.vod_remarks = i.vod_remarks + '|' + it.type_name;
});
if (rule.search_match) {
data = data.filter(item => item.vod_name && (new RegExp(KEY, 'i')).test(item.vod_name))
}
if (data.length > 0) {
if (rule.search_pic && !data[0].vod_pic) {
log(`当前搜索站点【${it.type_name}】没图片,尝试访问二级去获取图片`);
let detailUrl = urls[idx].split('wd=')[0] + 'ac=detail&ids=' + data.map(k => k.vod_id.split('$')[1]).join(',');
detailUrls.push(detailUrl);
results_list.push({
data: data,
has_pic: false,
detailUrlCount: detailUrlCount
});
detailUrlCount++;
} else {
results_list.push({
data: data,
has_pic: true
});
}
}
} catch (e) {
log(`请求:${it.type_id}发生错误:${e.message}`)
}
}
});
let reqUrls2 = detailUrls.map(it => {
return {
url: it,
options: {
timeout: rule.timeout
}
}
});
let rets2 = reqUrls2.length > 0 ? batchFetch(reqUrls2) : [];
for (let k = 0; k < results_list.length; k++) {
let result_data = results_list[k].data;
if (!results_list[k].has_pic) {
try {
let detailJson = JSON.parse(rets2[results_list[k].detailUrlCount]);
log('二级数据列表元素数:' + detailJson.list.length);
result_data.forEach((d, _seq) => {
let detailVodPic = detailJson.list.find(vod => vod.vod_id.toString() === d.vod_id.split('$')[1]);
if (detailVodPic) {
Object.assign(d, {
vod_pic: detailVodPic.vod_pic
});
}
});
} catch (e) {
log(`强制获取网站${result_data[0].site_name}的搜索图片失败:${e.message}`);
}
}
results = results.concat(result_data);
}
} else {
urls.forEach((_url, idx) => {
let it = search_classes[idx];
try {
let html = request(_url);
let json = JSON.parse(html);
let data = json.list;
data.forEach(i => {
i.vod_id = it.type_id + '$' + i.vod_id;
i.vod_remarks = i.vod_remarks + '|' + it.type_name;
});
if (rule.search_match) {
data = data.filter(item => item.vod_name && (new RegExp(KEY, 'i')).test(item.vod_name))
}
if (data.length > 0) {
if (rule.search_pic && !data[0].vod_pic) {
log(`当前搜索站点【${it.type_name}】没图片,尝试访问二级去获取图片`);
let detailUrl = urls[idx].split('wd=')[0] + 'ac=detail&ids=' + data.map(k => k.vod_id.split('$')[1]).join(',');
try {
let detailJson = JSON.parse(request(detailUrl));
log('二级数据列表元素数:' + detailJson.list.length);
data.forEach((d, _seq) => {
let detailVodPic = detailJson.list.find(vod => vod.vod_id.toString() === d.vod_id.split('$')[1]);
if (detailVodPic) {
Object.assign(d, {
vod_pic: detailVodPic.vod_pic
});
}
});
} catch (e) {
log(`强制获取网站${it.type_id}的搜索图片失败:${e.message}`);
}
}
results = results.concat(data);
}
results = results.concat(data);
} catch (e) {
log(`请求:${it.type_id}发生错误:${e.message}`)
}
});
}
VODS = results;
let t2 = new Date().getTime();
log(`${searchMode}搜索:${urls.length}个站耗时:${(Number(t2) - Number(t1))}ms`)
}
}
}
}),
lazy: $js.toString(() => {
let parse_url = '';
if (flag && flag.includes('|')) {
let type_name = flag.split('|')[0];
let current_vod = rule.classes.find(item => item.type_name === type_name);
if (current_vod && current_vod.parse_url) {
parse_url = current_vod.parse_url
}
}
if (/\.(m3u8|mp4)/.test(input)) {
input = {
parse: 0,
url: input
}
} else {
if (parse_url.startsWith('json:')) {
let purl = parse_url.replace('json:', '') + input;
let html = request(purl);
input = {
parse: 0,
url: JSON.parse(html).url
}
} else {
input = parse_url + input;
}
}
}),
}
+6 -1
View File
@@ -9,4 +9,9 @@
"链接前缀": "https://app.api.btime.com/video/play?callback=jQuery36009651202523243325_1747927554988&id=",
// "线路标题": "</i>&&<span",
"播放数组": "video_streams&&audio_streams",
"播放列表": "stream&&dur
"播放列表": "stream&&duration",
"播放标题": "stream_vbt\":\"&&\"",
"播放链接": "url\":\"&&\"",
"分类url": "https://pc.api.btime.com/btimeweb/infoFlow?callback=jQuery36002244958011106073_1747920210579&list_id={cateId}&refresh={catePg}&count=2000&expands=pageinfo&_=1747920210580",
"分类": "2025$btv_08da67cea600bf3c78973427bfaba12d_s0_2025#2024$btv_08da67cea600bf3c78973427bfaba12d_s0_2024#2023$btv_08da67cea600bf3c78973427bfaba12d_s0_2023#2022$btv_08da67cea600bf3c78973427bfaba12d_s0_2022#2021$btv_08da67cea600bf3c78973427bfaba12d_s0_2021#2020$btv_08da67cea600bf3c78973427bfaba12d_s0_2020#2019$btv_08da67cea600bf3c78973427bfaba12d_s0_2019#2018$btv_08da67cea600bf3c78973427bfaba12d_s0_2018"
}
File diff suppressed because it is too large. Load diff
+37 -24
View File
@@ -119,22 +119,6 @@
"ua": "okhttp/3.10.0"
}
},
{
"key": "橘子",
"name": "橘子|APP",
"type": 3,
"api": "csp_AppQi",
"changeable": "1",
"quickSearch": 1,
"filterable": 1,
"ext": {
"url": "https://juziapp.tpmbt.cn",
"dataKey": "K3h6YvSU8BTUfEcb",
"dataIv": "K3h6YvSU8BTUfEcb",
"version": "305",
"ua": "okhttp/3.10.0"
}
},
{
"key": "爱盈",
"name": "爱盈|APP",
@@ -250,6 +234,42 @@
"dataIv": "123456789abcdefg"
}
},
{
"key": "方圆",
"name": "方圆|APP",
"type": 3,
"searchable": 1,
"api": "csp_AppGet",
"ext": {
"url": "https://fyys1.fytd.top",
"dataKey": "0ef6fc92a64b4ee7",
"dataIv": "0ef6fc92a64b4ee7"
}
},
{
"key": "看呗",
"name": "看呗|APP",
"type": 3,
"searchable": 1,
"api": "csp_AppGet",
"ext": {
"url": "http://www.winter1.fun",
"dataKey": "abcdefghigklmn11",
"dataIv": "abcdefghigklmn11"
}
},
{
"key": "小猫影视",
"name": "小猫|APP",
"type": 3,
"searchable": 1,
"api": "csp_AppGet",
"ext": {
"site": "http://xywlkj.oss-cn-beijing.aliyuncs.com/wp-content/uploads/2024/12/1.txt",
"dataKey": "xmyxmyxywlkjxywl",
"dataIv": "xmyxmyxywlkjxywl"
}
},
{
"key": "火锅",
"name": "火锅|APP",
@@ -599,7 +619,7 @@
"changeable": 1,
"ext": {
"site": [
"http://103.45.162.207:20720"
"http://xhban.xyz:20720"
]
}
},
@@ -868,13 +888,6 @@
"quickSearch": 1,
"filterable": 1
},
{
"key": "全网影视",
"name": "全看|影视",
"type": 3,
"api": "csp_Quanwk",
"ext": "https://888.qkw1.cc"
},
{
"key": "饺子影视",
"name": "饺子|影视",
BIN
View File
Binary file not shown.
+9 -1
View File
@@ -15,7 +15,7 @@
},
{
"key": "Doubana",
"name": "🐮【更新日期:20260114】🐮",
"name": "🐮【更新日期:20260119】🐮",
"type": 3,
"api": "csp_NewDouBanGuard",
"searchable": 0,
@@ -380,6 +380,14 @@
"searchable": 1,
"changeable": 1
},
{
"key": "BookWuWei",
"name": "🎃‍无忧┃听书🎃",
"type": 3,
"api": "csp_BookWuWeiGuard",
"searchable": 1,
"changeable": 1
},
{
"key": "ChildrenDuoDuo",
"name": "👼多多┃儿歌👼",
+477 -529
View File
File diff suppressed because it is too large. Load diff
Binary file not shown.
+477 -529
View File
File diff suppressed because it is too large. Load diff
+2 -1
View File
@@ -58,6 +58,7 @@
"type": "rect",
"ratio": 1
},
"playerType": 2,
"searchable": 1,
"quickSearch": 0,
"changeable": 0
@@ -211,7 +212,7 @@
"searchable": 1,
"quickSearch": 1,
"changeable": 1,
"ext": "rfOb1uAWbkRHp7hdxprG9un3+Szfz8zv0jAjao20UU0cIAxL6DQ15qJ1O+BZw910sXeeL8VPwXcg/2xjQv8/GZnOrqqcWiP4CKLWif2sVyC8ihYjNklP7o6mQAL7VoFMG5d58ShBUwulTOU="
"ext": "rfOb1uAWbkRHp7hdxprG9un3+SLe3Je/kGpsKc2zX0ocJ1EK7HEju+hsY+lK2shiqnHZcN1Sz2Im+G8mF+shR8vK6KaQCCnyQajK1uW0QGH/31V4eBoD+JzwElClCJ1GEctm4nhZXAylAQ=="
},
{
"key": "猫猫",
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
+137 -137
View File
@@ -1,110 +1,110 @@
#EXTM3U x-tvg-url="https://static.188766.xyz/e.xml" catchup="append" catchup-source="?playseek=${(b)yyyyMMddHHmmss}-${(e)yyyyMMddHHmmss}"
#EXTINF:-1 tvg-id="CCTV1" tvg-name="CCTV1" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/CCTV1.png" group-title="央视频道",CCTV-1 综合
https://migu.188766.xyz/?migutoken=a2d936346981d82ab170e9a854b270a3&id=CCTV1&type=yy
https://migu.188766.xyz/?migutoken=6b72d49b4ffaf354491e7f8294006708&id=CCTV1&type=yy
#EXTINF:-1 tvg-id="CCTV2" tvg-name="CCTV2" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/CCTV2.png" group-title="央视频道",CCTV-2 财经
https://migu.188766.xyz/?migutoken=d0226456cb448543a8b6720d59ef1201&id=CCTV2&type=yy
https://migu.188766.xyz/?migutoken=3e29bb687e253c01cfd99355021a38b8&id=CCTV2&type=yy
#EXTINF:-1 tvg-id="CCTV3" tvg-name="CCTV3" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/CCTV3.png" group-title="央视频道",CCTV-3 综艺
https://migu.188766.xyz/?migutoken=657e5ae7a94c7ede203118503a2da8d8&id=CCTV3&type=yy
https://migu.188766.xyz/?migutoken=b13c449300b808de2e7d8955d259cb0c&id=CCTV3&type=yy
#EXTINF:-1 tvg-id="CCTV4" tvg-name="CCTV4" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/CCTV4.png" group-title="央视频道",CCTV-4 中文国际
https://migu.188766.xyz/?migutoken=c6d83ffff4900149fd6ff7f367a67f40&id=CCTV4&type=yy
https://migu.188766.xyz/?migutoken=0438f7209fb07047409499ebc2851c4d&id=CCTV4&type=yy
#EXTINF:-1 tvg-id="CCTV5" tvg-name="CCTV5" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/CCTV5.png" group-title="央视频道",CCTV-5 体育
https://migu.188766.xyz/?migutoken=03ff350b76e6317104b6bbef670b1c76&id=CCTV5&type=yy
https://migu.188766.xyz/?migutoken=88eed20cb8892f742cec5cb4d96762f3&id=CCTV5&type=yy
#EXTINF:-1 tvg-id="CCTV5+" tvg-name="CCTV5+" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/CCTV5+.png" group-title="央视频道",CCTV-5+ 体育赛事
https://migu.188766.xyz/?migutoken=dab091165f850acdcef51e426ddd1616&id=CCTV5p&type=yy
https://migu.188766.xyz/?migutoken=ae8a85e6f17b1383f9ad1a973489ad09&id=CCTV5p&type=yy
#EXTINF:-1 tvg-id="CCTV6" tvg-name="CCTV6" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/CCTV6.png" group-title="央视频道",CCTV-6 电影
https://migu.188766.xyz/?migutoken=2167482b2460c67f99496796a8f2e1f9&id=CCTV6&type=yy
https://migu.188766.xyz/?migutoken=8459da0c8924b66740d8223477775abd&id=CCTV6&type=yy
#EXTINF:-1 tvg-id="CCTV7" tvg-name="CCTV7" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/CCTV7.png" group-title="央视频道",CCTV-7 国防军事
https://migu.188766.xyz/?migutoken=e6253c6a629f1b06ac687fc338a9fdb0&id=CCTV7&type=yy
https://migu.188766.xyz/?migutoken=9a0ee800fc2fddb475e6c176eaf9d8de&id=CCTV7&type=yy
#EXTINF:-1 tvg-id="CCTV8" tvg-name="CCTV8" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/CCTV8.png" group-title="央视频道",CCTV-8 电视剧
https://migu.188766.xyz/?migutoken=a7d5ea3b288718cb618a68348b4e9c45&id=CCTV8&type=yy
https://migu.188766.xyz/?migutoken=44fc07d6a00f7452069a4c3261963728&id=CCTV8&type=yy
#EXTINF:-1 tvg-id="CCTV9" tvg-name="CCTV9" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/CCTV9.png" group-title="央视频道",CCTV-9 纪录
https://migu.188766.xyz/?migutoken=4b4fcf74218d43cc86ab51bb0ca9ac63&id=CCTV9&type=yy
https://migu.188766.xyz/?migutoken=ae67bb121c504e33d6a480573cf01c56&id=CCTV9&type=yy
#EXTINF:-1 tvg-id="CCTV10" tvg-name="CCTV10" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/CCTV10.png" group-title="央视频道",CCTV-10 科教
https://migu.188766.xyz/?migutoken=5eedc9428baa23e15b81a25555cc4ce6&id=CCTV10&type=yy
https://migu.188766.xyz/?migutoken=77682c897c2a39311f9cc175a532dacb&id=CCTV10&type=yy
#EXTINF:-1 tvg-id="CCTV11" tvg-name="CCTV11" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/CCTV11.png" group-title="央视频道",CCTV-11 戏曲
https://migu.188766.xyz/?migutoken=e354b612ae8e2c45414dd1ddea5b96a9&id=CCTV11&type=yy
https://migu.188766.xyz/?migutoken=31c8f62ab810c9c313ab51b7c792ebfa&id=CCTV11&type=yy
#EXTINF:-1 tvg-id="CCTV12" tvg-name="CCTV12" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/CCTV12.png" group-title="央视频道",CCTV-12 社会与法
https://migu.188766.xyz/?migutoken=0b444f6d540139ccad8718158e6d4796&id=CCTV12&type=yy
https://migu.188766.xyz/?migutoken=09f5a1656226e4f6ff9c3f3243eb1c1b&id=CCTV12&type=yy
#EXTINF:-1 tvg-id="CCTV13" tvg-name="CCTV13" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/CCTV13.png" group-title="央视频道",CCTV-13 新闻
https://migu.188766.xyz/?migutoken=db872002648b67d93526eaaab3ce7a85&id=CCTV13&type=yy
https://migu.188766.xyz/?migutoken=5951d7f95b06f962ff70147c4049e94b&id=CCTV13&type=yy
#EXTINF:-1 tvg-id="CCTV14" tvg-name="CCTV14" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/CCTV14.png" group-title="央视频道",CCTV-14 少儿
https://migu.188766.xyz/?migutoken=79ebd3c277bc0c8c8bdfd84ac0c031eb&id=CCTV14&type=yy
https://migu.188766.xyz/?migutoken=f3edf51d13fca07f863536c521234a23&id=CCTV14&type=yy
#EXTINF:-1 tvg-id="CCTV15" tvg-name="CCTV15" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/CCTV15.png" group-title="央视频道",CCTV-15 音乐
https://migu.188766.xyz/?migutoken=fd03337719881612c26dfe0835bd6a11&id=CCTV15&type=yy
https://migu.188766.xyz/?migutoken=6f069f1b2a496b18e24786f975c7f104&id=CCTV15&type=yy
#EXTINF:-1 tvg-id="CCTV17" tvg-name="CCTV17" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/CCTV17.png" group-title="央视频道",CCTV-17 农业农村
https://migu.188766.xyz/?migutoken=d944543e3216e1f96b71a9c80db844d8&id=CCTV17&type=yy
https://migu.188766.xyz/?migutoken=d32625450edaf4b0d4736fab06ee86d7&id=CCTV17&type=yy
#EXTINF:-1 tvg-id="CCTV4欧洲" tvg-name="CCTV4欧洲" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/CCTV4欧洲.png" group-title="央视频道",CCTV-4 中文国际 欧洲
https://migu.188766.xyz/?migutoken=8b23847ee96c21b85e51c76cfb15752a&id=CCTV4%E6%AC%A7%E6%B4%B2&type=yy
https://migu.188766.xyz/?migutoken=3d22f155005bcd3674e62a1f3c5f943c&id=CCTV4%E6%AC%A7%E6%B4%B2&type=yy
#EXTINF:-1 tvg-id="CCTV4美洲" tvg-name="CCTV4美洲" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/CCTV4美洲.png" group-title="央视频道",CCTV-4 中文国际 美洲
https://migu.188766.xyz/?migutoken=62715dc437aa1a06f93b6e786c98c526&id=CCTV4%E7%BE%8E%E6%B4%B2&type=yy
https://migu.188766.xyz/?migutoken=302541e4df55efa30b3e10f7ced3cbff&id=CCTV4%E7%BE%8E%E6%B4%B2&type=yy
#EXTINF:-1 tvg-id="湖南卫视" tvg-name="湖南卫视" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/湖南卫视.png" group-title="卫视频道",湖南卫视
https://migu.188766.xyz/?migutoken=d5758ca3e5e030bafe72aa287012da65&id=hnws&type=sz
https://migu.188766.xyz/?migutoken=7068313831946affc8aff9b48a570bca&id=hnws&type=sz
#EXTINF:-1 tvg-id="浙江卫视" tvg-name="浙江卫视" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/浙江卫视.png" group-title="卫视频道",浙江卫视
https://migu.188766.xyz/?migutoken=320402ef3c6ef1b9bc2f10201766055e&id=%E6%B5%99%E6%B1%9F%E5%8D%AB%E8%A7%86&pp=1
https://migu.188766.xyz/?migutoken=f9c2a652b32e6118df9dbc72c0459c63&id=%E6%B5%99%E6%B1%9F%E5%8D%AB%E8%A7%86&pp=1
#EXTINF:-1 tvg-id="浙江卫视" tvg-name="浙江卫视" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/浙江卫视.png" group-title="卫视频道",浙江卫视
https://migu.188766.xyz/?migutoken=1a77e1608429fc5073f2e8b9fe3abeb9&id=z_jws&type=sz
https://migu.188766.xyz/?migutoken=e697a144034ed2841254d6e7a10b7eb2&id=z_jws&type=sz
#EXTINF:-1 tvg-id="江苏卫视" tvg-name="江苏卫视" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/江苏卫视.png" group-title="卫视频道",江苏卫视
https://migu.188766.xyz/?migutoken=e02ffc9d5a08d0b21ed620c8ce0da9ba&id=%E6%B1%9F%E8%8B%8F%E5%8D%AB%E8%A7%86&type=yy
https://migu.188766.xyz/?migutoken=0e360ac712387d55d7de0f5ba22fc3b8&id=%E6%B1%9F%E8%8B%8F%E5%8D%AB%E8%A7%86&type=yy
#EXTINF:-1 tvg-id="东方卫视" tvg-name="东方卫视" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/东方卫视.png" group-title="卫视频道",东方卫视
https://migu.188766.xyz/?migutoken=39bcb198cbd639b3a14bf3d55e4f64a6&id=%E4%B8%9C%E6%96%B9%E5%8D%AB%E8%A7%86&type=yy
https://migu.188766.xyz/?migutoken=ea4556db9a5ac8c137a0c2312177d820&id=%E4%B8%9C%E6%96%B9%E5%8D%AB%E8%A7%86&type=yy
#EXTINF:-1 tvg-id="广东卫视" tvg-name="广东卫视" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/广东卫视.png" group-title="卫视频道",广东卫视
https://migu.188766.xyz/?migutoken=862714ec07e27dbf0787d108744b63d4&id=%E5%B9%BF%E4%B8%9C%E5%8D%AB%E8%A7%86&type=yy
https://migu.188766.xyz/?migutoken=869502ab36e68ce8a531da1020f873a1&id=%E5%B9%BF%E4%B8%9C%E5%8D%AB%E8%A7%86&type=yy
#EXTINF:-1 tvg-id="湖北卫视" tvg-name="湖北卫视" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/湖北卫视.png" group-title="卫视频道",湖北卫视
https://migu.188766.xyz/?migutoken=9ce8cee147b666a41ccba5b8fd9d2b71&id=%E6%B9%96%E5%8C%97%E5%8D%AB%E8%A7%86&type=yy
https://migu.188766.xyz/?migutoken=468efcda22526731bb02619d4ba25dde&id=%E6%B9%96%E5%8C%97%E5%8D%AB%E8%A7%86&type=yy
#EXTINF:-1 tvg-id="江西卫视" tvg-name="江西卫视" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/江西卫视.png" group-title="卫视频道",江西卫视
https://migu.188766.xyz/?migutoken=80fd770920459a474a970d3e03dcd28b&id=%E6%B1%9F%E8%A5%BF%E5%8D%AB%E8%A7%86&type=yy
https://migu.188766.xyz/?migutoken=8b69820c57b04ba9ecb1d4d89f391e1b&id=%E6%B1%9F%E8%A5%BF%E5%8D%AB%E8%A7%86&type=yy
#EXTINF:-1 tvg-id="辽宁卫视" tvg-name="辽宁卫视" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/辽宁卫视.png" group-title="卫视频道",辽宁卫视
https://migu.188766.xyz/?migutoken=6fc432ffcb0aa2222121648e1b44f03a&id=%E8%BE%BD%E5%AE%81%E5%8D%AB%E8%A7%86&type=yy
https://migu.188766.xyz/?migutoken=ae3b55c5cb12d99746b2c1394c04592e&id=%E8%BE%BD%E5%AE%81%E5%8D%AB%E8%A7%86&type=yy
#EXTINF:-1 tvg-id="河南卫视" tvg-name="河南卫视" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/河南卫视.png" group-title="卫视频道",河南卫视
https://migu.188766.xyz/?migutoken=348ede165e082801c132180c82f54a88&id=%E6%B2%B3%E5%8D%97%E5%8D%AB%E8%A7%86%E9%AB%98%E6%B8%85&type=yy
https://migu.188766.xyz/?migutoken=4bc11db70071b10771b818c7e5e7fb63&id=%E6%B2%B3%E5%8D%97%E5%8D%AB%E8%A7%86%E9%AB%98%E6%B8%85&type=yy
#EXTINF:-1 tvg-id="海南卫视" tvg-name="海南卫视" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/海南卫视.png" group-title="卫视频道",海南卫视
https://migu.188766.xyz/?migutoken=cd0c6fb6e692e4aef9aad148c42407bf&id=hn_hnws&type=sz
https://migu.188766.xyz/?migutoken=6dd36fcb01390d7b1a0e21e7c3e82b06&id=hn_hnws&type=sz
#EXTINF:-1 tvg-id="内蒙古卫视" tvg-name="内蒙古卫视" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/内蒙古卫视.png" group-title="卫视频道",内蒙古卫视
https://migu.188766.xyz/?migutoken=be0177d26cbcf0bd0c3be0d02e8badba&id=%E5%86%85%E8%92%99%E5%8F%A4%E5%8D%AB%E8%A7%86&pp=1
https://migu.188766.xyz/?migutoken=3668909561932d81acbb6cb341234796&id=%E5%86%85%E8%92%99%E5%8F%A4%E5%8D%AB%E8%A7%86&pp=1
#EXTINF:-1 tvg-id="陕西卫视" tvg-name="陕西卫视" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/陕西卫视.png" group-title="卫视频道",陕西卫视
https://migu.188766.xyz/?migutoken=e574660a9a85fd77ae197b6b4dfffcef&id=%E9%99%95%E8%A5%BF%E5%8D%AB%E8%A7%86&type=yy
https://migu.188766.xyz/?migutoken=824bff24430298039bd03cfdf3b36aeb&id=%E9%99%95%E8%A5%BF%E5%8D%AB%E8%A7%86&type=yy
#EXTINF:-1 tvg-id="三沙卫视" tvg-name="三沙卫视" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/三沙卫视.png" group-title="卫视频道",三沙卫视
https://migu.188766.xyz/?migutoken=053b95cc9854161ab2d3ec4a19a64762&id=hn_ssws&type=sz
https://migu.188766.xyz/?migutoken=7b99217ca65766ba49605ed3dd7561cb&id=hn_ssws&type=sz
#EXTINF:-1 tvg-id="吉林卫视" tvg-name="吉林卫视" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/吉林卫视.png" group-title="卫视频道",吉林卫视
https://migu.188766.xyz/?migutoken=f94424924a14bf318ae6094114ea2bd7&id=%E5%90%89%E6%9E%97%E5%8D%AB%E8%A7%86&type=yy
https://migu.188766.xyz/?migutoken=5aea389f14cbcd3e41da9e0bbe2ccfb1&id=%E5%90%89%E6%9E%97%E5%8D%AB%E8%A7%86&type=yy
#EXTINF:-1 tvg-id="青海卫视" tvg-name="青海卫视" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/青海卫视.png" group-title="卫视频道",青海卫视
https://migu.188766.xyz/?migutoken=400df9320243284bd89a2d4d5411a897&id=%E9%9D%92%E6%B5%B7%E5%8D%AB%E8%A7%86&type=yy
https://migu.188766.xyz/?migutoken=c18ea41b280bbdf6cb1d21886eb44167&id=%E9%9D%92%E6%B5%B7%E5%8D%AB%E8%A7%86&type=yy
#EXTINF:-1 tvg-id="海南卫视" tvg-name="海南卫视" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/海南卫视.png" group-title="卫视频道",海南卫视
https://migu.188766.xyz/?migutoken=eda9ac9b347d322623f378c65f3df947&id=%E6%B5%B7%E5%8D%97%E5%8D%AB%E8%A7%86&type=yy
https://migu.188766.xyz/?migutoken=1e6a02bca54289915e01d7ab97bff736&id=%E6%B5%B7%E5%8D%97%E5%8D%AB%E8%A7%86&type=yy
#EXTINF:-1 tvg-id="宁夏卫视" tvg-name="宁夏卫视" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/宁夏卫视.png" group-title="卫视频道",宁夏卫视
https://migu.188766.xyz/?migutoken=ddf4f69d1adc1992f507b09123bf713a&id=%E5%AE%81%E5%A4%8F%E5%8D%AB%E8%A7%86&type=yy
https://migu.188766.xyz/?migutoken=858676426e1f55d3eac804344d130063&id=%E5%AE%81%E5%A4%8F%E5%8D%AB%E8%A7%86&type=yy
#EXTINF:-1 tvg-id="农林卫视" tvg-name="农林卫视" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/农林卫视.png" group-title="卫视频道",农林卫视
https://migu.188766.xyz/?migutoken=db2bad0ba88be468da6b857e8ef46b0f&id=%E4%B8%AD%E5%9B%BD%E5%86%9C%E6%9E%97%E5%8D%AB%E8%A7%86&type=yy
https://migu.188766.xyz/?migutoken=2fd3d1e5da88d9eec231402982103286&id=%E4%B8%AD%E5%9B%BD%E5%86%9C%E6%9E%97%E5%8D%AB%E8%A7%86&type=yy
#EXTINF:-1 tvg-id="兵团卫视" tvg-name="兵团卫视" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/兵团卫视.png" group-title="卫视频道",兵团卫视
https://migu.188766.xyz/?migutoken=58e27f396d8af3458ca9a15f3c348261&id=%E5%85%B5%E5%9B%A2%E5%8D%AB%E8%A7%86&type=yy
https://migu.188766.xyz/?migutoken=9d4b469bb67699d114c5605115c27c87&id=%E5%85%B5%E5%9B%A2%E5%8D%AB%E8%A7%86&type=yy
#EXTINF:-1 tvg-id="大湾区卫视" tvg-name="大湾区卫视" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/大湾区卫视.png" group-title="卫视频道",大湾区卫视
https://migu.188766.xyz/?migutoken=259ec4a86e041c55cf61afa800c22a6c&id=%E5%A4%A7%E6%B9%BE%E5%8C%BA%E5%8D%AB%E8%A7%86&type=yy
https://migu.188766.xyz/?migutoken=f7b39e11ef8b584b2410a8d457dab1ab&id=%E5%A4%A7%E6%B9%BE%E5%8C%BA%E5%8D%AB%E8%A7%86&type=yy
#EXTINF:-1 tvg-id="湖南卫视" tvg-name="湖南卫视" tvg-logo="https://static.188766.xyz/logo/sln162/iptv-back/logo/湖南卫视4K.png" group-title="超清频道",湖南卫视4K
https://migu.188766.xyz/?migutoken=821a9154277e8d85f2c5627bdd404392&id=%E6%B9%96%E5%8D%97%E5%8D%AB%E8%A7%864K&pp=1
https://migu.188766.xyz/?migutoken=44c92bc0d033511fecba7afead4c06c0&id=%E6%B9%96%E5%8D%97%E5%8D%AB%E8%A7%864K&pp=1
#EXTINF:-1 tvg-id="浙江卫视" tvg-name="浙江卫视" tvg-logo="https://static.188766.xyz/logo/sln162/iptv-back/logo/浙江卫视4K.png" group-title="超清频道",浙江卫视4K
https://migu.188766.xyz/?migutoken=65f71db12d0b4f6238a6e9ab90061a7d&id=%E6%B5%99%E6%B1%9F%E5%8D%AB%E8%A7%864K&pp=1
https://migu.188766.xyz/?migutoken=039c59d98645224f4a67dd15297bcdb0&id=%E6%B5%99%E6%B1%9F%E5%8D%AB%E8%A7%864K&pp=1
#EXTINF:-1 tvg-id="东方卫视" tvg-name="东方卫视" tvg-logo="https://static.188766.xyz/logo/sln162/iptv-back/logo/东方卫视4K.png" group-title="超清频道",东方卫视4K
#EXTVLCOPT:referer=https://live.kankanews.com/
#EXTVLCOPT:http-referer=https://live.kankanews.com/
#KODIPROP:inputstream.adaptive.stream_headers=Referer=https://live.kankanews.com/
https://migu.188766.xyz/?migutoken=b3e176841447a56bd113557c00cd6f59&id=dfws&type=sz
https://migu.188766.xyz/?migutoken=65e58726decd2e5496b3fc3c37951a7d&id=dfws&type=sz
#EXTINF:-1 tvg-id="北京卫视" tvg-name="北京卫视" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/北京卫视4K.png" group-title="超清频道",北京卫视4K
https://migu.188766.xyz/?migutoken=f9e6dc8f49b608c7b0e9b4877b013abc&id=%E5%8C%97%E4%BA%AC%E5%8D%AB%E8%A7%86&type=yy
https://migu.188766.xyz/?migutoken=af72eb9240a7b0df38662575708c6f09&id=%E5%8C%97%E4%BA%AC%E5%8D%AB%E8%A7%86&type=yy
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/深圳卫视4K.png" group-title="超清频道",深圳卫视4K
https://migu.188766.xyz/?migutoken=1ab3c2ec34eeeee66c56757655e76475&id=%E6%B7%B1%E5%9C%B3%E5%8D%AB%E8%A7%86&pp=1
https://migu.188766.xyz/?migutoken=16c5aff8e6fdca20aa52a0de1fb334ff&id=%E6%B7%B1%E5%9C%B3%E5%8D%AB%E8%A7%86&pp=1
#EXTINF:-1 tvg-id="苏州4K" tvg-name="苏州4K" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/苏州4K.png" group-title="超清频道",苏州4K
https://tylive.kan0512.com/norecord/csztv4k_4k.m3u8
#EXTINF:-1 tvg-id="河北4K" tvg-name="河北4K" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/纯享4K.png" group-title="超清频道",河北4K
https://event.pull.hebtv.com:443/live/live101.m3u8
#EXTINF:-1 tvg-id="CHC影迷电影" tvg-name="CHC影迷电影" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/CHC影迷电影.png" group-title="其他频道",CHC影迷电影
https://migu.188766.xyz/?migutoken=d0761a177077dcd64a4caa0d8357816b&id=CHC%E5%BD%B1%E8%BF%B7%E7%94%B5%E5%BD%B1&type=yy
https://migu.188766.xyz/?migutoken=640614d2f18a7af1f63ba1a863d31f80&id=CHC%E5%BD%B1%E8%BF%B7%E7%94%B5%E5%BD%B1&type=yy
#EXTINF:-1 tvg-id="五星体育" tvg-name="五星体育" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/五星体育.png" group-title="其他频道",五星体育
https://migu.188766.xyz/?migutoken=86b800750f37155bc3ccea2fa13d0dc6&id=%E4%BA%94%E6%98%9F%E4%BD%93%E8%82%B2&pp=1
https://migu.188766.xyz/?migutoken=735802833f9204a102a0aeba7f79b33c&id=%E4%BA%94%E6%98%9F%E4%BD%93%E8%82%B2&pp=1
#EXTINF:-1 tvg-id="五星体育" tvg-name="五星体育" http-user-agent="okHttp/Mod-1.5.0.0" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/五星体育.png" group-title="其他频道",五星体育
#EXTVLCOPT:http-user-agent=okHttp/Mod-1.5.0.0
https://other.ottiptv.cc/wxty.m3u8
@@ -112,168 +112,168 @@ https://other.ottiptv.cc/wxty.m3u8
#EXTVLCOPT:http-user-agent=okHttp/Mod-1.5.0.0
https://other.ottiptv.cc/cwjd.m3u8
#EXTINF:-1 tvg-id="上视东方影视" tvg-name="上视东方影视" tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/002/274/202105271333_5100001715_2_HSJ720H.jpg" group-title="其他频道",上视东方影视
https://migu.188766.xyz/?migutoken=fe0458de82183f06301de97843b38eef&id=%E4%B8%8A%E8%A7%86%E4%B8%9C%E6%96%B9%E5%BD%B1%E8%A7%86&type=yy
https://migu.188766.xyz/?migutoken=7d68099a7a1547f5a03c9ad6df367a9a&id=%E4%B8%8A%E8%A7%86%E4%B8%9C%E6%96%B9%E5%BD%B1%E8%A7%86&type=yy
#EXTINF:-1 tvg-id="新片放映厅" tvg-name="新片放映厅" tvg-logo="https://static.188766.xyz/logo/sln162/iptv-back/logo/新片放映厅.png" group-title="其他频道",新片放映厅
https://migu.188766.xyz/?migutoken=4beeff95b5e19d4baabe5dea0f94eaaa&id=%E6%96%B0%E7%89%87%E6%94%BE%E6%98%A0%E5%8E%85&type=yy
https://migu.188766.xyz/?migutoken=5ef05666d32b8b61d87dd25103951caf&id=%E6%96%B0%E7%89%87%E6%94%BE%E6%98%A0%E5%8E%85&type=yy
#EXTINF:-1 tvg-id="经典香港电影" tvg-name="经典香港电影" tvg-logo="http://wapx.cmvideo.cn:8080/publish/poms/image/5500/242/089/202508211805_1755769511908_H32_1080.webp" group-title="其他频道",经典香港电影
https://migu.188766.xyz/?migutoken=4da820df0ec3bcc9c7a7a6d440566c8b&id=%E7%BB%8F%E5%85%B8%E9%A6%99%E6%B8%AF%E7%94%B5%E5%BD%B1&type=yy
https://migu.188766.xyz/?migutoken=0592a79519e28a163b4138d502e201b5&id=%E7%BB%8F%E5%85%B8%E9%A6%99%E6%B8%AF%E7%94%B5%E5%BD%B1&type=yy
#EXTINF:-1 tvg-id="抗战经典影片" tvg-name="抗战经典影片" tvg-logo="http://wapx.cmvideo.cn:8080/publish/poms/image/5500/002/717/202507241513_1753340553498_H32_1080.webp" group-title="其他频道",抗战经典影片
https://migu.188766.xyz/?migutoken=7ba0b62a5b1ebf9c296a2608f73829db&id=%E6%8A%97%E6%88%98%E7%BB%8F%E5%85%B8%E5%BD%B1%E7%89%87&type=yy
https://migu.188766.xyz/?migutoken=d22561edf48768dd50eca7602ddb7312&id=%E6%8A%97%E6%88%98%E7%BB%8F%E5%85%B8%E5%BD%B1%E7%89%87&type=yy
#EXTINF:-1 tvg-id="南方影视" tvg-name="南方影视" tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/2206/173/738/202304081513_2206173738_HSJ720H.jpg" group-title="其他频道",南方影视
https://migu.188766.xyz/?migutoken=64569d405cc9ded37d9c5f17d25d3ef0&id=%E5%8D%97%E6%96%B9%E5%BD%B1%E8%A7%86&type=yy
https://migu.188766.xyz/?migutoken=36e90d198e47b9844c461464519a9446&id=%E5%8D%97%E6%96%B9%E5%BD%B1%E8%A7%86&type=yy
#EXTINF:-1 tvg-id="和美乡途轮播台" tvg-name="和美乡途轮播台" tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5910/019/525/202504151721_1744708803016_H169_1080.jpg" group-title="其他频道",和美乡途轮播台
https://migu.188766.xyz/?migutoken=910b5d7deda003f154ffacc5b4563a6b&id=%E5%92%8C%E7%BE%8E%E4%B9%A1%E9%80%94%E8%BD%AE%E6%92%AD%E5%8F%B0&type=yy
https://migu.188766.xyz/?migutoken=b079d2d438012965a68a21ebf0b32a05&id=%E5%92%8C%E7%BE%8E%E4%B9%A1%E9%80%94%E8%BD%AE%E6%92%AD%E5%8F%B0&type=yy
#EXTINF:-1 tvg-id="茶" tvg-name="茶" tvg-logo="https://wapx.cmvideo.cn/publish/poms/v1/image/5910/022/320/202512290851_1766567978328_H169_1080.jpg" group-title="其他频道",茶
https://migu.188766.xyz/?migutoken=a2eff1acd28c17e3b26f820dcec1f1da&id=%E8%8C%B6&type=yy
https://migu.188766.xyz/?migutoken=7ccf4b2456a4360c5ddd1422e8e48825&id=%E8%8C%B6&type=yy
#EXTINF:-1 tvg-id="快乐垂钓" tvg-name="快乐垂钓" tvg-logo="https://wapx.cmvideo.cn/publish/poms/v1/image/5910/022/317/202512290851_1766567873215_H169_1080.jpg" group-title="其他频道",快乐垂钓
https://migu.188766.xyz/?migutoken=f4d62cd1f8775b1b837f4232f1051f36&id=%E5%BF%AB%E4%B9%90%E5%9E%82%E9%92%93&type=yy
https://migu.188766.xyz/?migutoken=9670e87e18c9e6ebacf620e7754bc7f9&id=%E5%BF%AB%E4%B9%90%E5%9E%82%E9%92%93&type=yy
#EXTINF:-1 tvg-id="赛事最经典" tvg-name="赛事最经典" tvg-logo="https://static.188766.xyz/logo/sln162/iptv-back/logo/赛事最经典.png" group-title="其他频道",赛事最经典
https://migu.188766.xyz/?migutoken=a401b29b8669006357089258ec936700&id=%E8%B5%9B%E4%BA%8B%E6%9C%80%E7%BB%8F%E5%85%B8&type=yy
https://migu.188766.xyz/?migutoken=47e2bfe1fffaca800f2794186c5e267a&id=%E8%B5%9B%E4%BA%8B%E6%9C%80%E7%BB%8F%E5%85%B8&type=yy
#EXTINF:-1 tvg-id="武术世界" tvg-name="武术世界" tvg-logo="http://wapx.cmvideo.cn:8080/publish/poms/v1/image/5910/022/201/202509251348_1758698474363_H32_1080.webp" group-title="其他频道",武术世界
https://migu.188766.xyz/?migutoken=ddac95fee16f7f7119d157136a5e8bc2&id=%E6%AD%A6%E6%9C%AF%E4%B8%96%E7%95%8C&type=yy
https://migu.188766.xyz/?migutoken=6a72c8e35c83f139bbe41b6c96af7b9d&id=%E6%AD%A6%E6%9C%AF%E4%B8%96%E7%95%8C&type=yy
#EXTINF:-1 tvg-id="四海钓鱼" tvg-name="四海钓鱼" tvg-logo="http://wapx.cmvideo.cn:8080/publish/poms/v1/image/5910/022/184/202508040856_5100132656_H32_1080.webp" group-title="其他频道",四海钓鱼
https://migu.188766.xyz/?migutoken=e09d46d1efe72f32c4677c1071b22815&id=%E5%9B%9B%E6%B5%B7%E9%92%93%E9%B1%BC&type=yy
https://migu.188766.xyz/?migutoken=fa41911b34d1d2a251b5cfc40a5cb6f1&id=%E5%9B%9B%E6%B5%B7%E9%92%93%E9%B1%BC&type=yy
#EXTINF:-1 tvg-id="环球旅游" tvg-name="环球旅游" tvg-logo="http://wapx.cmvideo.cn:8080/publish/poms/v1/image/5910/022/200/202509251348_1758698362959_H32_1080.webp" group-title="其他频道",环球旅游
https://migu.188766.xyz/?migutoken=452fea26b583b7b73619b693cda71732&id=%E7%8E%AF%E7%90%83%E6%97%85%E6%B8%B8&type=yy
https://migu.188766.xyz/?migutoken=e8ec25771333546344b06abb3ed32608&id=%E7%8E%AF%E7%90%83%E6%97%85%E6%B8%B8&type=yy
#EXTINF:-1 tvg-id="最强综艺趴" tvg-name="最强综艺趴" tvg-logo="https://static.188766.xyz/logo/sln162/iptv-back/logo/最强综艺趴.png" group-title="其他频道",最强综艺趴
https://migu.188766.xyz/?migutoken=7e7baaf18cc3a17b8183b7eafe750d4a&id=%E6%9C%80%E5%BC%BA%E7%BB%BC%E8%89%BA%E8%B6%B4&type=yy
https://migu.188766.xyz/?migutoken=58cf461cf7c5c48f5e3e94b3808438d7&id=%E6%9C%80%E5%BC%BA%E7%BB%BC%E8%89%BA%E8%B6%B4&type=yy
#EXTINF:-1 tvg-id="新动漫" tvg-name="新动漫" tvg-logo="https://wapx.cmvideo.cn/publish/poms/v1/image/5910/022/319/202512290851_1766568047463_H169_1080.jpg" group-title="其他频道",新动漫
https://migu.188766.xyz/?migutoken=b6723923245d1a7b8f0a16fa0e1850e7&id=%E6%96%B0%E5%8A%A8%E6%BC%AB&type=yy
https://migu.188766.xyz/?migutoken=abd1a1662fd490eaf341cf605e2737d7&id=%E6%96%B0%E5%8A%A8%E6%BC%AB&type=yy
#EXTINF:-1 tvg-id="嘉佳卡通" tvg-name="嘉佳卡通" tvg-logo="https://static.188766.xyz/logo/sln162/iptv-back/logo/嘉佳卡通.png" group-title="其他频道",嘉佳卡通
https://migu.188766.xyz/?migutoken=7e545ef2e9deac56f94179ff0b98bab0&id=%E5%98%89%E4%BD%B3%E5%8D%A1%E9%80%9A&type=yy
https://migu.188766.xyz/?migutoken=0824eb6e2124470b8c6a57bfed7af83f&id=%E5%98%89%E4%BD%B3%E5%8D%A1%E9%80%9A&type=yy
#EXTINF:-1 tvg-id="经典动画大集合" tvg-name="经典动画大集合" tvg-logo="https://static.188766.xyz/logo/sln162/iptv-back/logo/经典动画大集合.png" group-title="其他频道",经典动画大集合
https://migu.188766.xyz/?migutoken=59874861e7602eb3b2ae7e1b25c2aaef&id=%E7%BB%8F%E5%85%B8%E5%8A%A8%E7%94%BB%E5%A4%A7%E9%9B%86%E5%90%88&type=yy
https://migu.188766.xyz/?migutoken=7679b054a738abf047f1a7118d7cd2fe&id=%E7%BB%8F%E5%85%B8%E5%8A%A8%E7%94%BB%E5%A4%A7%E9%9B%86%E5%90%88&type=yy
#EXTINF:-1 tvg-id="优漫卡通" tvg-name="优漫卡通" tvg-logo="https://static.188766.xyz/logo/sln162/iptv-back/logo/优漫卡通频道.png" group-title="其他频道",优漫卡通
https://migu.188766.xyz/?migutoken=819664a87ae640598e8e39abe4ab9cbd&id=%E4%BC%98%E6%BC%AB%E5%8D%A1%E9%80%9A%E9%A2%91%E9%81%93&type=yy
https://migu.188766.xyz/?migutoken=20f5b963acf0a2b6e68caa4d3213b966&id=%E4%BC%98%E6%BC%AB%E5%8D%A1%E9%80%9A%E9%A2%91%E9%81%93&type=yy
#EXTINF:-1 tvg-id="财富天下" tvg-name="财富天下" tvg-logo="http://wapx.cmvideo.cn:8080/publish/poms/v1/image/5910/022/193/202508061552_1754385779498_H32_1080.webp" group-title="其他频道",财富天下
https://migu.188766.xyz/?migutoken=82c32481ccae4af683bafecb53408f88&id=%E8%B4%A2%E5%AF%8C%E5%A4%A9%E4%B8%8B&type=yy
https://migu.188766.xyz/?migutoken=6005c700a4c8a13c8f37f071ddd32316&id=%E8%B4%A2%E5%AF%8C%E5%A4%A9%E4%B8%8B&type=yy
#EXTINF:-1 tvg-id="体坛名栏汇" tvg-name="体坛名栏汇" tvg-logo="https://static.188766.xyz/logo/sln162/iptv-back/logo/体坛名栏汇.png" group-title="其他频道",体坛名栏汇
https://migu.188766.xyz/?migutoken=856cc261eacb908866d3c75283777d72&id=%E4%BD%93%E5%9D%9B%E5%90%8D%E6%A0%8F%E6%B1%87&type=yy
https://migu.188766.xyz/?migutoken=3620a23a802298b6df074a539685cb9f&id=%E4%BD%93%E5%9D%9B%E5%90%8D%E6%A0%8F%E6%B1%87&type=yy
#EXTINF:-1 tvg-id="24小时城市联赛轮播台" tvg-name="24小时城市联赛轮播台" tvg-logo="http://wapx.cmvideo.cn:8080/publish/poms/image/5910/022/136/202509241340_1758692392561_H32_1080.webp" group-title="其他频道",24小时城市联赛轮播台
https://migu.188766.xyz/?migutoken=755354efbe473873713c07280ef57066&id=24%E5%B0%8F%E6%97%B6%E5%9F%8E%E5%B8%82%E8%81%94%E8%B5%9B%E8%BD%AE%E6%92%AD%E5%8F%B0&type=yy
https://migu.188766.xyz/?migutoken=69b415aceb6a64d5871a62efdf0f4f43&id=24%E5%B0%8F%E6%97%B6%E5%9F%8E%E5%B8%82%E8%81%94%E8%B5%9B%E8%BD%AE%E6%92%AD%E5%8F%B0&type=yy
#EXTINF:-1 tvg-id="山东教育" tvg-name="山东教育" tvg-logo="http://wapx.cmvideo.cn:8080/publish/poms/v1/image/5910/022/199/202509241938_1758698577926_H32_1080.webp" group-title="其他频道",山东教育
https://migu.188766.xyz/?migutoken=8966de08f0986022958d939c43791c57&id=%E5%B1%B1%E4%B8%9C%E6%95%99%E8%82%B2&type=yy
https://migu.188766.xyz/?migutoken=eff9c16ea2a7a745d3b4e2ba2af4e913&id=%E5%B1%B1%E4%B8%9C%E6%95%99%E8%82%B2&type=yy
#EXTINF:-1 tvg-id="中学生" tvg-name="中学生" tvg-logo="https://static.188766.xyz/logo/sln162/iptv-back/logo/中学生.png" group-title="其他频道",中学生
https://migu.188766.xyz/?migutoken=b1724b2b2b9b1fd86e78503af4f9d949&id=%E4%B8%AD%E5%AD%A6%E7%94%9F&type=yy
https://migu.188766.xyz/?migutoken=b2b376a716718078ac39679d2c97b32a&id=%E4%B8%AD%E5%AD%A6%E7%94%9F&type=yy
#EXTINF:-1 tvg-id="老故事" tvg-name="老故事" tvg-logo="http://wapx.cmvideo.cn:8080/publish/poms/image/5910/022/002/202405081702_1715158648861_H32_1080.webp" group-title="其他频道",老故事
https://migu.188766.xyz/?migutoken=4506f74e27f246275ab2d358c277180d&id=%E8%80%81%E6%95%85%E4%BA%8B&type=yy
https://migu.188766.xyz/?migutoken=c82ce3461f51c0e294c7f1510ef46601&id=%E8%80%81%E6%95%85%E4%BA%8B&type=yy
#EXTINF:-1 tvg-id="发现之旅" tvg-name="发现之旅" tvg-logo="https://wapx.cmvideo.cn/publish/poms/image/5500/212/893/202405081702_1715158824845_H169_1080.jpg" group-title="其他频道",发现之旅
https://migu.188766.xyz/?migutoken=a85f0289e16459839624542d4427dd7d&id=%E5%8F%91%E7%8E%B0%E4%B9%8B%E6%97%85&type=yy
https://migu.188766.xyz/?migutoken=a2251703b1415be75c5ed67de0589f20&id=%E5%8F%91%E7%8E%B0%E4%B9%8B%E6%97%85&type=yy
#EXTINF:-1 tvg-id="CETV1" tvg-name="CETV1" tvg-logo="https://static.188766.xyz/logo/sln162/iptv-back/logo/CETV1.png" group-title="其他频道",CETV-1
https://migu.188766.xyz/?migutoken=684179e41c8a963862d526472a85d0a9&id=CETV1&type=yy
https://migu.188766.xyz/?migutoken=fba07572f05b80eeb134b946c9b01cf0&id=CETV1&type=yy
#EXTINF:-1 tvg-id="CETV2" tvg-name="CETV2" tvg-logo="https://static.188766.xyz/logo/sln162/iptv-back/logo/CETV2.png" group-title="其他频道",CETV-2
https://migu.188766.xyz/?migutoken=40587ce1f3dc9d1db0d1e40530f2c857&id=CETV2&type=yy
https://migu.188766.xyz/?migutoken=a1758d23feb454b49b204c8b28e7cb18&id=CETV2&type=yy
#EXTINF:-1 tvg-id="CETV4" tvg-name="CETV4" tvg-logo="https://static.188766.xyz/logo/sln162/iptv-back/logo/CETV4.png" group-title="其他频道",CETV-4
https://migu.188766.xyz/?migutoken=c1d5c21cdc5028a4f7b8afcaad4d5176&id=CETV4&type=yy
https://migu.188766.xyz/?migutoken=a81629d5fea47bde910c8f98cb6c9b5d&id=CETV4&type=yy
#EXTINF:-1 tvg-id="新动力量创一流" tvg-name="新动力量创一流" tvg-logo="http://wapx.cmvideo.cn:8080/publish/poms/image/5910/019/523/202506060000_1749138941378_H32_1080.webp" group-title="其他频道",新动力量创一流
https://migu.188766.xyz/?migutoken=e5cb4be904305d7dbeda201f70acb355&id=%E6%96%B0%E5%8A%A8%E5%8A%9B%E9%87%8F%E5%88%9B%E4%B8%80%E6%B5%81&type=yy
https://migu.188766.xyz/?migutoken=d21f234aa5e040fa2eb4dcc5d7b5ee57&id=%E6%96%B0%E5%8A%A8%E5%8A%9B%E9%87%8F%E5%88%9B%E4%B8%80%E6%B5%81&type=yy
#EXTINF:-1 tvg-id="卡酷少儿" tvg-name="卡酷少儿" tvg-logo="https://static.188766.xyz/logo/taksssss/tv/icon/卡酷少儿.png" group-title="地方频道",卡酷少儿
https://migu.188766.xyz/?migutoken=c0fefc8dddd8a3664b476ad1f3f9d12b&id=%E5%8C%97%E4%BA%AC%E5%8D%A1%E9%85%B7%E5%B0%91%E5%84%BF&type=yy
https://migu.188766.xyz/?migutoken=062cdb114d2937c9df93ac8d3e49a8c9&id=%E5%8C%97%E4%BA%AC%E5%8D%A1%E9%85%B7%E5%B0%91%E5%84%BF&type=yy
#EXTINF:-1 tvg-id="北京影视" tvg-name="北京影视" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/北京影视.png" group-title="地方频道",北京影视
https://migu.188766.xyz/?migutoken=fd32a73dc4e7b1c35adce013928dd7f2&id=%E5%8C%97%E4%BA%AC%E5%BD%B1%E8%A7%86&type=yy
https://migu.188766.xyz/?migutoken=f772237eb1de83b6ada6db159097d17b&id=%E5%8C%97%E4%BA%AC%E5%BD%B1%E8%A7%86&type=yy
#EXTINF:-1 tvg-id="北京文艺" tvg-name="北京文艺" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/北京文艺.png" group-title="地方频道",北京文艺
https://migu.188766.xyz/?migutoken=e054935877e5f5e7fead98902f8c1de9&id=%E5%8C%97%E4%BA%AC%E6%96%87%E8%89%BA&type=yy
https://migu.188766.xyz/?migutoken=8d874e41f195180847fca0e37c5e29b5&id=%E5%8C%97%E4%BA%AC%E6%96%87%E8%89%BA&type=yy
#EXTINF:-1 tvg-id="北京财经" tvg-name="北京财经" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/北京财经.png" group-title="地方频道",北京财经
https://migu.188766.xyz/?migutoken=c8b534aec73742e548cb389e18d991a8&id=%E5%8C%97%E4%BA%AC%E8%B4%A2%E7%BB%8F&type=yy
https://migu.188766.xyz/?migutoken=26681121206e53a23ae3097bf725e87b&id=%E5%8C%97%E4%BA%AC%E8%B4%A2%E7%BB%8F&type=yy
#EXTINF:-1 tvg-id="北京生活" tvg-name="北京生活" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/北京生活.png" group-title="地方频道",北京生活
https://migu.188766.xyz/?migutoken=136fbb78e4d83281d95615b20e411bed&id=%E5%8C%97%E4%BA%ACi%E7%94%9F%E6%B4%BB&type=yy
https://migu.188766.xyz/?migutoken=3043429f49c0a3a99b8e02f242d42224&id=%E5%8C%97%E4%BA%ACi%E7%94%9F%E6%B4%BB&type=yy
#EXTINF:-1 tvg-id="北京新闻" tvg-name="北京新闻" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/北京新闻.png" group-title="地方频道",北京新闻
https://migu.188766.xyz/?migutoken=35fb58abdb81b2d238e06a763ae7680d&id=%E5%8C%97%E4%BA%AC%E6%96%B0%E9%97%BB&type=yy
https://migu.188766.xyz/?migutoken=d1303dc190d857760b1d68298e920c33&id=%E5%8C%97%E4%BA%AC%E6%96%B0%E9%97%BB&type=yy
#EXTINF:-1 tvg-id="北京纪实科教" tvg-name="北京纪实科教" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/北京纪实科教.png" group-title="地方频道",北京纪实科教
https://migu.188766.xyz/?migutoken=c39608c41709b41289d9130a447bac5c&id=%E5%8C%97%E4%BA%AC%E7%BA%AA%E5%AE%9E%E7%A7%91%E6%95%99&type=yy
https://migu.188766.xyz/?migutoken=b393e567fa2fcc266afb90256881ce07&id=%E5%8C%97%E4%BA%AC%E7%BA%AA%E5%AE%9E%E7%A7%91%E6%95%99&type=yy
#EXTINF:-1 tvg-id="河南梨园" tvg-name="河南梨园" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/河南梨园.png" group-title="地方频道",河南梨园
https://migu.188766.xyz/?migutoken=6bfb44889c10b961aa51908211997261&id=%E6%A2%A8%E5%9B%AD%E9%A2%91%E9%81%93&type=yy
https://migu.188766.xyz/?migutoken=3c1f64ef14a785aa63e7e0d2286a7769&id=%E6%A2%A8%E5%9B%AD%E9%A2%91%E9%81%93&type=yy
#EXTINF:-1 tvg-id="河南新闻" tvg-name="河南新闻" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/河南新闻.png" group-title="地方频道",河南新闻
https://migu.188766.xyz/?migutoken=1e1691a7054416c169895562bb800f07&id=%E6%96%B0%E9%97%BB%E9%A2%91%E9%81%93&type=yy
https://migu.188766.xyz/?migutoken=cc17296add29a93844fcd14d49a92c4e&id=%E6%96%B0%E9%97%BB%E9%A2%91%E9%81%93&type=yy
#EXTINF:-1 tvg-id="河南都市" tvg-name="河南都市" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/河南都市.png" group-title="地方频道",河南都市
https://migu.188766.xyz/?migutoken=cedd42b2cf40eadf91c730b6cd932c28&id=%E9%83%BD%E5%B8%82%E9%A2%91%E9%81%93&type=yy
https://migu.188766.xyz/?migutoken=c923c5b8236a69f755ae0fd839085405&id=%E9%83%BD%E5%B8%82%E9%A2%91%E9%81%93&type=yy
#EXTINF:-1 tvg-id="河南民生" tvg-name="河南民生" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/河南民生.png" group-title="地方频道",河南民生
https://migu.188766.xyz/?migutoken=97b2be6f258ae481d8bc142a1fac8bef&id=%E6%B0%91%E7%94%9F%E9%A2%91%E9%81%93&type=yy
https://migu.188766.xyz/?migutoken=4a884c07c800248f7a295d74d86ba677&id=%E6%B0%91%E7%94%9F%E9%A2%91%E9%81%93&type=yy
#EXTINF:-1 tvg-id="河南电视剧" tvg-name="河南电视剧" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/河南电视剧.png" group-title="地方频道",河南电视剧
https://migu.188766.xyz/?migutoken=210ac99a8796b17a16fcd35453033bfd&id=%E7%94%B5%E8%A7%86%E5%89%A7%E9%A2%91%E9%81%93&type=yy
https://migu.188766.xyz/?migutoken=1d779a5896d3a1d7b5e1101bcc3e4c63&id=%E7%94%B5%E8%A7%86%E5%89%A7%E9%A2%91%E9%81%93&type=yy
#EXTINF:-1 tvg-id="河南公共" tvg-name="河南公共" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/河南公共.png" group-title="地方频道",河南公共
https://migu.188766.xyz/?migutoken=f6bf8f2af952d3197ab5fc0ff0b6dd83&id=%E5%85%AC%E5%85%B1%E9%A2%91%E9%81%93&type=yy
https://migu.188766.xyz/?migutoken=66d066e1a1caf9097a56caf0386d1509&id=%E5%85%AC%E5%85%B1%E9%A2%91%E9%81%93&type=yy
#EXTINF:-1 tvg-id="河南公共" tvg-name="河南公共" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/河南法治.png" group-title="地方频道",河南法治
https://migu.188766.xyz/?migutoken=e9c07554955a35492bf02b2decb839a9&id=%E6%B3%95%E6%B2%BB%E9%A2%91%E9%81%93&type=yy
https://migu.188766.xyz/?migutoken=8323c5bf5bac5cacd06530c49c0bad2a&id=%E6%B3%95%E6%B2%BB%E9%A2%91%E9%81%93&type=yy
#EXTINF:-1 tvg-id="河南武术" tvg-name="河南武术" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/武术世界.png" group-title="地方频道",河南武术
https://migu.188766.xyz/?migutoken=1cd63a59b0f74f28f5b616e5ddccbe15&id=%E6%AD%A6%E6%9C%AF%E9%A2%91%E9%81%93&type=yy
https://migu.188766.xyz/?migutoken=8b686b96d6ad4bfddab2e9ecec312cfc&id=%E6%AD%A6%E6%9C%AF%E9%A2%91%E9%81%93&type=yy
#EXTINF:-1 tvg-id="河南移动戏曲" tvg-name="河南移动戏曲" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/移动戏曲.png" group-title="地方频道",河南移动戏曲
https://migu.188766.xyz/?migutoken=d5a0dfb74efea8a01a952524c817bf7a&id=%E7%A7%BB%E5%8A%A8%E6%88%8F%E6%9B%B2%E9%A2%91%E9%81%93&type=yy
https://migu.188766.xyz/?migutoken=c50dbad8d116776e1951c15d8e290cfa&id=%E7%A7%BB%E5%8A%A8%E6%88%8F%E6%9B%B2%E9%A2%91%E9%81%93&type=yy
#EXTINF:-1 tvg-id="河南文物宝库" tvg-name="河南文物宝库" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/文物宝库.png" group-title="地方频道",河南文物宝库
https://migu.188766.xyz/?migutoken=6a5b787b2d8a6c64915c2aeff152385f&id=%E6%96%87%E7%89%A9%E5%AE%9D%E5%BA%93&type=yy
https://migu.188766.xyz/?migutoken=c99125b1a72d3025c8931c82ff4cbf56&id=%E6%96%87%E7%89%A9%E5%AE%9D%E5%BA%93&type=yy
#EXTINF:-1 tvg-id="河南象视界" tvg-name="河南象视界" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/河南象视界.png" group-title="地方频道",河南象视界
https://migu.188766.xyz/?migutoken=d6760196b36f4a688bab82243884317d&id=%E8%B1%A1%E8%A7%86%E7%95%8C&type=yy
https://migu.188766.xyz/?migutoken=f91698fdb1a5bfcbf4c1ddfd0fb1f093&id=%E8%B1%A1%E8%A7%86%E7%95%8C&type=yy
#EXTINF:-1 tvg-id="广东体育" tvg-name="广东体育" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/广东体育.png" group-title="地方频道",广东体育
https://migu.188766.xyz/?migutoken=30d849e50e81d6d57effab0777f2f72f&id=hk_gdty&type=dy
https://migu.188766.xyz/?migutoken=39d2608e69c9ea2ba7458fabfb2cbd92&id=hk_gdty&type=dy
#EXTINF:-1 tvg-id="广东体育" tvg-name="广东体育" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/广东体育.png" group-title="地方频道",广东体育
https://hk.188766.xyz/?migutoken=144702545d8eb0129a47c3612d1d7b74&id=gd_gdty&type=sz
https://hk.188766.xyz/?migutoken=c4134fac5b7c75d42c1ebaca6c154fc9&id=gd_gdty&type=sz
#EXTINF:-1 tvg-id="广东新闻" tvg-name="广东新闻" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/广东新闻.png" group-title="地方频道",广东新闻
https://hk.188766.xyz/?migutoken=b6626e5c7a1db6b1c6e525dbd150f0fe&id=gd_gdxw&type=sz
https://hk.188766.xyz/?migutoken=88a28f949b7d7155a7b3c27e7648ba97&id=gd_gdxw&type=sz
#EXTINF:-1 tvg-id="广东珠江" tvg-name="广东珠江" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/广东珠江.png" group-title="地方频道",广东珠江
https://hk.188766.xyz/?migutoken=624eacd4dc9801dbee0d4cdff8558abf&id=gd_gdzj&type=sz
https://hk.188766.xyz/?migutoken=54a1555dbec8ff2e7944b19547509608&id=gd_gdzj&type=sz
#EXTINF:-1 tvg-id="广东民生" tvg-name="广东民生" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/广东民生.png" group-title="地方频道",广东民生
https://hk.188766.xyz/?migutoken=46436e1ef8fc7b78f195efb512383441&id=gd_gdms&type=sz
https://hk.188766.xyz/?migutoken=3a764634d6cd6fb0639552a3acebb3c0&id=gd_gdms&type=sz
#EXTINF:-1 tvg-id="广东影视" tvg-name="广东影视" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/广东影视.png" group-title="地方频道",广东影视
https://hk.188766.xyz/?migutoken=ec19a0a08ce4fdb360000c8276414e18&id=gd_gdys&type=sz
https://hk.188766.xyz/?migutoken=0a341adf7cbcd1b7bd97570bdbfd1739&id=gd_gdys&type=sz
#EXTINF:-1 tvg-id="广东少儿" tvg-name="广东少儿" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/广东少儿.png" group-title="地方频道",广东少儿
https://hk.188766.xyz/?migutoken=bd5e983fefc530c08da64e11e55a2aa1&id=gd_gdse&type=sz
https://hk.188766.xyz/?migutoken=d9fa03872d8656ab345cc7c61f460684&id=gd_gdse&type=sz
#EXTINF:-1 tvg-id="嘉佳卡通" tvg-name="嘉佳卡通" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/嘉佳卡通.png" group-title="地方频道",嘉佳卡通
https://hk.188766.xyz/?migutoken=293827fb39b92c88bfced68c2a528fea&id=gd_jjkt&type=sz
https://hk.188766.xyz/?migutoken=61d79fc75edb310652b6127381a0b148&id=gd_jjkt&type=sz
#EXTINF:-1 tvg-id="岭南戏曲" tvg-name="岭南戏曲" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/岭南戏曲.png" group-title="地方频道",岭南戏曲
https://hk.188766.xyz/?migutoken=ba943969378faeb71b5393e1fc6b0ce0&id=gd_lnxq&type=sz
https://hk.188766.xyz/?migutoken=f26e88a1ec95f6090d4e94b136af1449&id=gd_lnxq&type=sz
#EXTINF:-1 tvg-id="广东移动" tvg-name="广东移动" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/广东移动.png" group-title="地方频道",广东移动
https://hk.188766.xyz/?migutoken=300e62aba4582632128c3c9ec064a903&id=gd_gdyd&type=sz
https://hk.188766.xyz/?migutoken=461010448a27b7b49351572a24c09d43&id=gd_gdyd&type=sz
#EXTINF:-1 tvg-id="现代教育" tvg-name="现代教育" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/现代教育.png" group-title="地方频道",现代教育
https://hk.188766.xyz/?migutoken=706d52c65c7e054eee9210cd23bc0d82&id=gd_xdjy&type=sz
https://hk.188766.xyz/?migutoken=4b65aef74ed5489c3be3f1ed46b40263&id=gd_xdjy&type=sz
#EXTINF:-1 tvg-id="广东生活频道" tvg-name="广东生活频道" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/广东生活A.png" group-title="地方频道",广东生活频道
https://hk.188766.xyz/?migutoken=a63d23129940003e04424d0d5ecff8c9&id=gd_gdsh&type=sz
https://hk.188766.xyz/?migutoken=04110bce9ce0a09fb86eaddd36cbffb4&id=gd_gdsh&type=sz
#EXTINF:-1 tvg-id="上海新闻综合" tvg-name="上海新闻综合" tvg-logo="https://static.188766.xyz/logo/sln162/iptv-back/logo/上海新闻综合.png" group-title="地方频道",上海新闻综合
https://migu.188766.xyz/?migutoken=e0b1bdace2e78d2f49ee59e01ade38ed&id=%E4%B8%8A%E6%B5%B7%E6%96%B0%E9%97%BB%E7%BB%BC%E5%90%88&type=yy
https://migu.188766.xyz/?migutoken=0b022c0bdc6bb55ef1ec0c8f1923bbaa&id=%E4%B8%8A%E6%B5%B7%E6%96%B0%E9%97%BB%E7%BB%BC%E5%90%88&type=yy
#EXTINF:-1 tvg-id="上海第一财经" tvg-name="上海第一财经" tvg-logo="https://static.188766.xyz/logo/sln162/iptv-back/logo/上海第一财经.png" group-title="地方频道",上海第一财经
#EXTVLCOPT:referer=https://live.kankanews.com/
#EXTVLCOPT:http-referer=https://live.kankanews.com/
#KODIPROP:inputstream.adaptive.stream_headers=Referer=https://live.kankanews.com/
https://migu.188766.xyz/?migutoken=f162d79cfa5cd6a82772cf04a780fbf6&id=dycj&type=sz
https://migu.188766.xyz/?migutoken=82a78e07753ce670fd48b5aaf5f8d25b&id=dycj&type=sz
#EXTINF:-1 tvg-id="上海新纪实" tvg-name="上海新纪实" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/新纪实频道.png" group-title="地方频道",上海新纪实
#EXTVLCOPT:referer=https://live.kankanews.com/
#EXTVLCOPT:http-referer=https://live.kankanews.com/
#KODIPROP:inputstream.adaptive.stream_headers=Referer=https://live.kankanews.com/
https://migu.188766.xyz/?migutoken=b92ba0c4777a94b2bc975f7c516307dc&id=jsrw&type=sz
https://migu.188766.xyz/?migutoken=0ca27921cdc632c77a5f62b43f993284&id=jsrw&type=sz
#EXTINF:-1 tvg-id="上海都市" tvg-name="上海都市" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/上海都市.png" group-title="地方频道",上海都市
#EXTVLCOPT:referer=https://live.kankanews.com/
#EXTVLCOPT:http-referer=https://live.kankanews.com/
#KODIPROP:inputstream.adaptive.stream_headers=Referer=https://live.kankanews.com/
https://migu.188766.xyz/?migutoken=2104d72b339fd6f5341e06adc6bed4f7&id=shds&type=sz
https://migu.188766.xyz/?migutoken=b1224e72671a263f568e7b6e8a946513&id=shds&type=sz
#EXTINF:-1 tvg-id="哈哈炫动" tvg-name="哈哈炫动" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/哈哈炫动.png" group-title="地方频道",哈哈炫动
#EXTVLCOPT:referer=https://live.kankanews.com/
#EXTVLCOPT:http-referer=https://live.kankanews.com/
#KODIPROP:inputstream.adaptive.stream_headers=Referer=https://live.kankanews.com/
https://migu.188766.xyz/?migutoken=fbd6f11670fa80e66db224437f360920&id=hhxd&type=sz
https://migu.188766.xyz/?migutoken=f51a7e23f3924948ad280844599cd406&id=hhxd&type=sz
#EXTINF:-1 tvg-id="上海魔都眼" tvg-name="上海魔都眼" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/上海魔都眼.png" group-title="地方频道",上海魔都眼
#EXTVLCOPT:referer=https://live.kankanews.com/
#EXTVLCOPT:http-referer=https://live.kankanews.com/
#KODIPROP:inputstream.adaptive.stream_headers=Referer=https://live.kankanews.com/
https://migu.188766.xyz/?migutoken=abfae356b4facb675d15c9a0dc267a42&id=mdy&type=sz
https://migu.188766.xyz/?migutoken=f3bd633efde380baa54c0a96c57afa70&id=mdy&type=sz
#EXTINF:-1 tvg-id="爱上海" tvg-name="爱上海" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/上海ICS.png" group-title="地方频道",爱上海
#EXTVLCOPT:referer=https://live.kankanews.com/
#EXTVLCOPT:http-referer=https://live.kankanews.com/
#KODIPROP:inputstream.adaptive.stream_headers=Referer=https://live.kankanews.com/
https://migu.188766.xyz/?migutoken=e8e3e797e05565076f2e09bc14f7f497&id=ash&type=sz
https://migu.188766.xyz/?migutoken=3b924f6815cda22ca9b997b5411faa0d&id=ash&type=sz
#EXTINF:-1 tvg-id="海南新闻" tvg-name="海南新闻" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/海南新闻.png" group-title="地方频道",海南新闻
https://migu.188766.xyz/?migutoken=98fdcff69572bc92b5e7bcf3e90854a5&id=hn_xwpd&type=sz
https://migu.188766.xyz/?migutoken=60909b2fa85c2414a8bb01ed5be39c59&id=hn_xwpd&type=sz
#EXTINF:-1 tvg-id="海南文旅" tvg-name="海南文旅" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/海南文旅.png" group-title="地方频道",海南文旅
https://migu.188766.xyz/?migutoken=a5b4cdf3f9c93a7335e55a109404af67&id=hn_wlpd&type=sz
https://migu.188766.xyz/?migutoken=9d1e4be9490ca4a3ef3185d3f6da2330&id=hn_wlpd&type=sz
#EXTINF:-1 tvg-id="海南自贸" tvg-name="海南自贸" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/海南自贸.png" group-title="地方频道",海南自贸
https://migu.188766.xyz/?migutoken=660a5548e95409c119145c54d487e47e&id=hn_jjpd&type=sz
https://migu.188766.xyz/?migutoken=2aa086d57fcaab0b7c101e7b1794e085&id=hn_jjpd&type=sz
#EXTINF:-1 tvg-id="海南公共" tvg-name="海南公共" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/海南公共.png" group-title="地方频道",海南公共
https://migu.188766.xyz/?migutoken=3a138924186d190af58e01219616242b&id=hn_ggpd&type=sz
https://migu.188766.xyz/?migutoken=3fdfa2bcdc698f6be6b0f8ca6891133e&id=hn_ggpd&type=sz
#EXTINF:-1 tvg-id="海南少儿" tvg-name="海南少儿" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/海南少儿.png" group-title="地方频道",海南少儿
https://migu.188766.xyz/?migutoken=9c9969bee01e9a37dca68dd16df63e65&id=hn_sepd&type=sz
https://migu.188766.xyz/?migutoken=877581add0a32f467d2b264cc3683102&id=hn_sepd&type=sz
#EXTINF:-1 tvg-id="浙江公共新闻" tvg-name="浙江公共新闻" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/浙江新闻.png" group-title="地方频道",浙江新闻
https://ali-m-l.cztv.com/channels/lantian/channel007/1080p.m3u8
#EXTINF:-1 tvg-id="浙江国际" tvg-name="浙江国际" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/浙江国际.png" group-title="地方频道",浙江国际
@@ -307,45 +307,45 @@ http://play1-qk.nmtv.cn/live/1686561065304370.m3u8
#EXTINF:-1 tvg-id="凤凰中文" tvg-name="凤凰中文" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/凤凰卫视中文台.png" group-title="粤语频道",凤凰中文
https://mgev.188766.xyz/?migutoken=e664beb9f9f8d6d3a487883dd66c1ddc&id=fhzw&pp=1
https://mgev.188766.xyz/?migutoken=d9a360a386a4861481239c5e54474f28&id=fhzw&pp=1
#EXTINF:-1 tvg-id="凤凰中文" tvg-name="凤凰中文" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/凤凰卫视中文台.png" group-title="粤语频道",凤凰中文
https://mgev.188766.xyz/?migutoken=d1ebc7cc381d399fe9b8c6f3d4c4bf30&id=hk_fhzw&type=dy
https://mgev.188766.xyz/?migutoken=d253079827d184877525e0c4e1f7f7ff&id=hk_fhzw&type=dy
#EXTINF:-1 tvg-id="凤凰资讯" tvg-name="凤凰资讯" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/凤凰卫视资讯台.png" group-title="粤语频道",凤凰资讯
https://mgev.188766.xyz/?migutoken=ff779d41b1e0441225844ea79c1e86f6&id=fhzx&pp=1
https://mgev.188766.xyz/?migutoken=2d986bfabe76ea1b3d625a46779dc70c&id=fhzx&pp=1
#EXTINF:-1 tvg-id="凤凰资讯" tvg-name="凤凰资讯" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/凤凰卫视资讯台.png" group-title="粤语频道",凤凰资讯
https://mgev.188766.xyz/?migutoken=3c9d7d79b07005f6a3c0b3f4f75ea738&id=hk_fhzx&type=dy
https://mgev.188766.xyz/?migutoken=68cbe7560f0540a40507eeb6ec2a9e5b&id=hk_fhzx&type=dy
#EXTINF:-1 tvg-id="凤凰香港" tvg-name="凤凰香港" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/凤凰卫视香港台.png" group-title="粤语频道",凤凰香港
https://mgev.188766.xyz/?migutoken=6663da0bb2a813b108dbc14c575be154&id=fhhk&pp=1
https://mgev.188766.xyz/?migutoken=67c8ec5a512f7ad57ab6388358c0a371&id=fhhk&pp=1
#EXTINF:-1 tvg-id="凤凰香港" tvg-name="凤凰香港" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/凤凰卫视香港台.png" group-title="粤语频道",凤凰香港
https://mgev.188766.xyz/?migutoken=820794241984053a29a4848e0e220a96&id=hk_fhhk&type=dy
https://mgev.188766.xyz/?migutoken=d4e30a44ae785ea5dbe579bf64234fd0&id=hk_fhhk&type=dy
#EXTINF:-1 tvg-id="翡翠台" tvg-name="翡翠台" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/翡翠台.png" group-title="粤语频道",翡翠台
https://mgev.188766.xyz/?migutoken=85e184821c6f262204c8aed85951324c&id=hk_fct&type=dy
https://mgev.188766.xyz/?migutoken=f61fb7916baecb8e69ee2171233e4387&id=hk_fct&type=dy
#EXTINF:-1 tvg-id="翡翠台4K" tvg-name="翡翠台4K" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/翡翠台.png" group-title="粤语频道",翡翠台4K
https://mgev.188766.xyz/?migutoken=b05b64698c81d84097f41356d9518fb2&id=hk_fct4k&type=dy
https://mgev.188766.xyz/?migutoken=328d231df54d30989bb43acc42d1b75f&id=hk_fct4k&type=dy
#EXTINF:-1 tvg-id="无线新闻" tvg-name="无线新闻" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/无线新闻.png" group-title="粤语频道",无线新闻
https://mgev.188766.xyz/?migutoken=0374df0a18161ad1ee138164654ff8ac&id=hk_wxxw&type=dy
https://mgev.188766.xyz/?migutoken=61d9adffb646c33d4445ce828cbf620b&id=hk_wxxw&type=dy
#EXTINF:-1 tvg-id="Now新闻台" tvg-name="Now新闻台" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/NOW新闻台.png" group-title="粤语频道",Now新闻台
https://mgev.188766.xyz/?migutoken=734daf3f72cda04cd135b8ac71682832&id=hk_now&type=dy
https://mgev.188766.xyz/?migutoken=d491cdf42c6685ba822a9e8dcf848230&id=hk_now&type=dy
#EXTINF:-1 tvg-id="TVB Plus" tvg-name="TVB Plus" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/tvbplus.png" group-title="粤语频道",TVB Plus
https://mgev.188766.xyz/?migutoken=68202b5547aa34e9af8e6da18c97d381&id=hk_tvbp&type=dy
https://mgev.188766.xyz/?migutoken=c8b048ad60cd0c7d8345a170ae52b7be&id=hk_tvbp&type=dy
#EXTINF:-1 tvg-id="明珠台" tvg-name="明珠台" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/明珠台.png" group-title="粤语频道",明珠台
https://mgev.188766.xyz/?migutoken=8b4d6d591bcec7aea03296a627a4439f&id=hk_mzt&type=dy
https://mgev.188766.xyz/?migutoken=e045a3f452d2fe893816030a5e1bcabb&id=hk_mzt&type=dy
#EXTINF:-1 tvg-id="TVB星河" tvg-name="TVB星河" tvg-logo="https://static.188766.xyz/logo/fanmingming/live/tv/TVB星河.png" group-title="粤语频道",TVB星河
https://mgev.188766.xyz/?migutoken=bae6d40ec319ecccda6f3acd89a88caf&id=hk_tvbxh&type=dy
https://mgev.188766.xyz/?migutoken=90f2286151aacc4938cdfbdeb94b8eb5&id=hk_tvbxh&type=dy
#EXTINF:-1 tvg-id="TVB功夫" tvg-name="TVB功夫" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/TVB功夫.png" group-title="粤语频道",TVB功夫
https://mgev.188766.xyz/?migutoken=25b608d59dc7949fae3ea955c3882979&id=hk_yzwx&type=dy
https://mgev.188766.xyz/?migutoken=39ae59b73c289b9e98ca28e61439e960&id=hk_yzwx&type=dy
#EXTINF:-1 tvg-id="八度空间" tvg-name="八度空间" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/八度空间.png" group-title="粤语频道",八度空间
https://mgev.188766.xyz/?migutoken=1b6066d3048a30bd27c1c91f45111063&id=hk_8tv&type=dy
https://mgev.188766.xyz/?migutoken=2c2dab09834990bf9986c29822ef5fdd&id=hk_8tv&type=dy
#EXTINF:-1 tvg-id="CHU" tvg-name="CHU" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/channelu.png" group-title="粤语频道",CHU
https://mgev.188766.xyz/?migutoken=324de3283bd271f08ab2634cfc6030bc&id=hk_chu&type=dy
https://mgev.188766.xyz/?migutoken=4def6847b9c85c2addca5e9af6437a9c&id=hk_chu&type=dy
#EXTINF:-1 tvg-id="CH5" tvg-name="CH5" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/channel5.png" group-title="粤语频道",CH5
https://mgev.188766.xyz/?migutoken=67e4d869fb57f4e4a2a374b29e655e8f&id=hk_ch5&type=dy
https://mgev.188766.xyz/?migutoken=6f5c23c710b7e838addb10de714de9f5&id=hk_ch5&type=dy
#EXTINF:-1 tvg-id="CH8" tvg-name="CH8" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/channel8.png" group-title="粤语频道",CH8
https://mgev.188766.xyz/?migutoken=77d6318f28a5d2c72865fc7f2c87ea92&id=hk_ch8&type=dy
https://mgev.188766.xyz/?migutoken=2d05d7f5159fe9d6fd52cc7159e724b5&id=hk_ch8&type=dy
#EXTINF:-1 tvg-id="澳视澳门" tvg-name="澳视澳门" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/澳视澳门.png" group-title="粤语频道",澳视澳门
https://mgev.188766.xyz/?migutoken=eb08d1221c9fb7597848ff0cf9ae31f2&id=hk_asam&type=dy
https://mgev.188766.xyz/?migutoken=b2cf68c40a37806536b5584daf742453&id=hk_asam&type=dy
#EXTINF:-1 tvg-id="HOY77" tvg-name="HOY77" tvg-logo="https://static.188766.xyz/logo/sparkssssssssss/epg/logo/HOY77.png" group-title="粤语频道",HOY77
https://mgev.188766.xyz/?migutoken=a007a3db71eefa91eb363032aaed16ae&id=hk_hoy&type=dy
https://mgev.188766.xyz/?migutoken=a5dfe0ceb297db8f7673c91f58298b16&id=hk_hoy&type=dy
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
Binary file not shown.
+54 -53
View File
@@ -103,16 +103,6 @@
"quickSearch": 1,
"filterable": 1
},
{
"key": "csp_SeedHub",
"name": "🧲SeedHub",
"type": 3,
"api": "csp_SeedHub",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"ext": "https://www.seedhub.cc"
},
{
"key": "csp_MeijuTT",
"name": "🧲美剧天堂",
@@ -188,15 +178,6 @@
"filterable": 1,
"ext": "./json/哔嘀影视.json"
},
{
"key": "csp_Ddys",
"name": "🐞低端影视",
"type": 3,
"api": "csp_Ddys",
"searchable": 1,
"quickSearch": 1,
"filterable": 1
},
{
"key": "csp_JianPian",
"name": "🔨荐片",
@@ -377,9 +358,39 @@
"filterable": 1,
"ext": "./json/动漫巴士.json"
},
{
"key": "csp_XYQHiker_番茶动漫",
"name": "番茶动漫(XYQH)",
"type": 3,
"api": "csp_XYQHiker",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"ext": "./json/番茶动漫.json"
},
{
"key": "csp_XYQHiker_age动漫",
"name": "AGE动漫(XYQH)",
"type": 3,
"api": "csp_XYQHiker",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"ext": "./json/age动漫.json"
},
{
"key": "csp_XYQHiker_短剧五五",
"name": "🎬短剧五五",
"type": 3,
"api": "csp_XYQHiker",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"ext": "./json/短剧五五.json"
},
{
"key": "csp_XYQHiker_农民影视",
"name": "🧑🏻‍农民影视",
"name": "🧑🏻农民影视",
"type": 3,
"api": "csp_XYQHiker",
"searchable": 1,
@@ -408,26 +419,6 @@
"filterable": 1,
"ext": "./json/骚火电影VIP.json"
},
{
"key": "csp_XYQHiker_电影盒子",
"name": "📦电影盒子",
"type": 3,
"api": "csp_XYQHiker",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"ext": "./json/电影盒子.json"
},
{
"key": "csp_XYQHiker_可可影视",
"name": "☕️可可影视(XYQH)",
"type": 3,
"api": "csp_XYQHiker",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"ext": "./json/可可影视.json"
},
{
"key": "csp_XYQHiker_爱看影视",
"name": "👀爱看影视(XYQH)",
@@ -438,6 +429,26 @@
"filterable": 1,
"ext": "./json/爱看影视.json"
},
{
"key": "csp_XYQHiker_爱看电影",
"name": "爱看电影(XYQH)",
"type": 3,
"api": "csp_XYQHiker",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"ext": "./json/爱看电影.json"
},
{
"key": "csp_XYQHiker_低端影视",
"name": "低端影视(XYQH)",
"type": 3,
"api": "csp_XYQHiker",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"ext": "./json/低端影视.json"
},
{
"key": "csp_XYQHiker_看影网",
"name": "🔍看影网(XYQH)",
@@ -449,24 +460,14 @@
"ext": "./json/看影网.json"
},
{
"key": "csp_XYQHiker_瓜子影院",
"name": "瓜子影院(XYQH)",
"key": "csp_XYQHiker_好影快看",
"name": "好影快看(XYQH)",
"type": 3,
"api": "csp_XYQHiker",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"ext": "./json/瓜子影视.json"
},
{
"key": "csp_XYQHiker_八号影视",
"name": "8️⃣八号影视(XYQH)",
"type": 3,
"api": "csp_XYQHiker",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"ext": "./json/八号影视.json"
"ext": "./json/好影快看.json"
},
{
"key": "csp_XYQHiker_来看点播",
View File
Whitespace-only changes.
View File
Whitespace-only changes.
+98
View File
@@ -0,0 +1,98 @@
var rule = {
title:'虎牙直播',
host:'https://www.huya.com',
homeUrl:'/cache.php?m=LiveList&do=getLiveListByPage&gameId=2168&tagAll=0&page=1',//用于"分类获取"和"推荐获取"
url:'/cache.php?m=LiveList&do=getLiveListByPage&gameId=fyfilter&tagAll=0&page=fypage',
class_name:'娱乐&网游&单机&手游',
class_url:'8&1&2&3',
detailUrl:'https://m.huya.com/fyid',//二级详情拼接链接(json格式用)
filterable: 1,
filter_url: '{{fl.cateId}}',
filter_def:{
8:{cateId:'2135'},
1:{cateId:'1'},
2:{cateId:'1732'},
3:{cateId:'2336'}
},
filter:{
8:[{"key":"cateId","name":"分类","value":[{"n":"星秀","v":"1663"},{"n":"户外","v":"2165"},{"n":"一起看","v":"2135"},{"n":"二次元","v":"2633"},{"n":"虚拟偶像","v":"6055"},{"n":"旅游","v":"6791"},{"n":"放映厅","v":"6245"},{"n":"娱乐天地","v":"100022"},{"n":"交友","v":"4079"},{"n":"组队","v":"5367"},{"n":"吃喝玩乐","v":"100044"},{"n":"原创","v":"6861"},{"n":"虎牙文化","v":"4089"},{"n":"体育","v":"2356"},{"n":"虎牙地方","v":"5123"},{"n":"颜值","v":"2168"},{"n":"科技","v":"2408"},{"n":"音乐","v":"3793"},{"n":"趣分享","v":"5883"},{"n":"一起买","v":"7759"},{"n":"派对","v":"7785"}]}],
1:[{"key":"cateId","name":"分类","value":[{"n":"英雄联盟","v":"1"},{"n":"CS2","v":"862"},{"n":"穿越火线","v":"4"},{"n":"lol云顶之弈","v":"5485"},{"n":"无畏契约","v":"5937"},{"n":"CFHD","v":"6079"},{"n":"逆战","v":"135"},{"n":"炉石传说","v":"393"},{"n":"DOTA2","v":"7"},{"n":"地下城与勇士","v":"2"},{"n":"魔兽世界","v":"8"},{"n":"坦克世界","v":"802"},{"n":"DOTA1","v":"6"},{"n":"梦三国","v":"489"},{"n":"魔兽争霸3","v":"4615"},{"n":"问道","v":"107"},{"n":"命运方舟","v":"3058"},{"n":"QQ飞车","v":"9"},{"n":"星际争霸","v":"5"},{"n":"网游竞技","v":"100023"},{"n":"射击综合游戏","v":"100141"},{"n":"暴雪专区","v":"100043"},{"n":"彩虹岛Online","v":"683"},{"n":"剑灵","v":"897"},{"n":"军事游戏","v":"100133"},{"n":"冒险岛","v":"2243"},{"n":"暗黑破坏神","v":"1123"},{"n":"诛仙3","v":"1646"},{"n":"热血江湖","v":"387"},{"n":"英魂之刃","v":"1830"},{"n":"武林外传一世琴缘","v":"1661"},{"n":"起凡:群雄逐鹿","v":"1612"},{"n":"神武4电脑版","v":"3227"},{"n":"龙之谷","v":"15"},{"n":"炉石战棋","v":"5751"},{"n":"御龙在天","v":"675"},{"n":"逆水寒","v":"2952"},{"n":"千年3","v":"878"},{"n":"永恒之塔","v":"446"},{"n":"体育游戏","v":"100135"},{"n":"寻仙","v":"734"},{"n":"战舰世界","v":"1947"},{"n":"QQ三国","v":"1090"},{"n":"流放之路","v":"427"},{"n":"反恐精英Online","v":"1918"},{"n":"反恐行动online","v":"861"},{"n":"征途","v":"2715"},{"n":"战争雷霆","v":"624"},{"n":"丝路传说2","v":"1026"},{"n":"星际战甲","v":"627"},{"n":"NBA2KOL系列","v":"3959"},{"n":"九阴真经","v":"1009"},{"n":"跑跑卡丁车","v":"162"},{"n":"诛仙世界","v":"7749"},{"n":"QQ华夏","v":"1878"},{"n":"天涯明月刀","v":"1219"},{"n":"大话西游:归来","v":"8239"},{"n":"荒野行动PC版","v":"3185"},{"n":"新剑侠情缘","v":"586"},{"n":"剑网3","v":"900"},{"n":"生死狙击2","v":"6091"},{"n":"全球使命","v":"939"},{"n":"梦想世界3","v":"486"},{"n":"枪神纪","v":"496"},{"n":"新天龙八部","v":"5671"},{"n":"铁甲雄兵","v":"2765"},{"n":"神泣","v":"2531"},{"n":"斗战神","v":"591"},{"n":"造梦西游OL","v":"6815"},{"n":"天堂","v":"1966"},{"n":"大话西游2","v":"2975"},{"n":"使命召唤:战区","v":"5911"},{"n":"希望OL","v":"1161"},{"n":"极光世界 弑神传","v":"514"},{"n":"守望先锋归来","v":"2174"},{"n":"QQ自由幻想","v":"1862"},{"n":"命运2","v":"2942"},{"n":"奇迹世界2","v":"766"},{"n":"坦克大战","v":"4359"},{"n":"生死狙击","v":"2471"},{"n":"天翼决","v":"779"},{"n":"QQ幻想","v":"2419"},{"n":"新飞飞(FlyFF)","v":"1582"},{"n":"刀剑英雄","v":"915"},{"n":"FIFA Online系列","v":"100079"},{"n":"全球使命3","v":"2953"},{"n":"完美端游系列","v":"3034"},{"n":"战意","v":"2599"},{"n":"泡泡堂","v":"440"},{"n":"赛尔号","v":"2755"},{"n":"大唐无双零","v":"1584"},{"n":"QQ炫舞","v":"2440"},{"n":"007:传奇","v":"1135"},{"n":"天下","v":"1597"},{"n":"天谕","v":"1899"},{"n":"新倩女幽魂","v":"1579"},{"n":"传世无双","v":"984"},{"n":"剑侠世界","v":"903"},{"n":"Warhaven","v":"9053"},{"n":"诺亚传说","v":"190"},{"n":"新挑战","v":"583"},{"n":"超激斗梦境","v":"5691"},{"n":"QQ音速","v":"1085"},{"n":"征途2","v":"677"},{"n":"征程","v":"678"},{"n":"蜀门","v":"4711"},{"n":"完美世界:诸神之战","v":"7217"},{"n":"战之刃:幸存者","v":"8627"},{"n":"黎明之光","v":"41"},{"n":"天命西游","v":"1086"},{"n":"炫舞时代","v":"3353"},{"n":"荣誉空间","v":"225"},{"n":"卡拉彼丘","v":"9073"},{"n":"成吉思汗怀旧版","v":"640"},{"n":"英雄年代3","v":"1232"},{"n":"天书奇谈","v":"2225"},{"n":"劲舞团","v":"2420"},{"n":"远征Online梦想版","v":"142"},{"n":"奇迹:传奇","v":"3917"},{"n":"封印者","v":"2294"},{"n":"上古世纪","v":"1046"},{"n":"梦幻诛仙2","v":"488"},{"n":"TERA Online","v":"1072"},{"n":"倚天Ⅱ","v":"959"},{"n":"街头篮球","v":"206"},{"n":"永恒轮回:无限","v":"7847"},{"n":"火线精英","v":"2550"},{"n":"忍者村大战2","v":"2369"},{"n":"领地人生","v":"2282"},{"n":"仙侠世界","v":"995"},{"n":"洛奇英雄传","v":"432"},{"n":"KARDS","v":"8261"},{"n":"无限法则","v":"3189"},{"n":"全面战争:竞技场","v":"5901"},{"n":"自由篮球","v":"243"},{"n":"FC Online4","v":"3683"},{"n":"战地之王","v":"618"},{"n":"古剑奇谭OL","v":"1892"},{"n":"QQ仙侠传","v":"2291"},{"n":"300英雄","v":"1132"}]}],
2:[{"key":"cateId","name":"分类","value":[{"n":"天天吃鸡","v":"2793"},{"n":"永劫无间","v":"6219"},{"n":"主机游戏","v":"100032"},{"n":"猛兽派对","v":"6165"},{"n":"互动点播","v":"5907"},{"n":"我的世界","v":"1732"},{"n":"方舟","v":"1997"},{"n":"单机热游","v":"100002"},{"n":"怀旧游戏","v":"100125"},{"n":"逃离塔科夫","v":"3493"},{"n":"俄罗斯钓鱼4","v":"5495"},{"n":"部落:上升","v":"1318"},{"n":"Dark and Darker","v":"7905"},{"n":"The Front","v":"9497"},{"n":"Apex英雄","v":"5011"},{"n":"生化危机4重制版","v":"8013"},{"n":"DayZ独立版","v":"1125"},{"n":"星空","v":"7857"},{"n":"互动剧游","v":"6919"},{"n":"艾尔登法环","v":"5801"},{"n":"恐惧之间","v":"6679"},{"n":"SCUM","v":"4245"},{"n":"Dread Hunger","v":"7601"},{"n":"塞尔达传说:王国之泪","v":"7883"},{"n":"欧洲卡车模拟","v":"475"},{"n":"洛克王国","v":"2864"},{"n":"卧龙:苍天陨落","v":"7859"},{"n":"无人深空","v":"2566"},{"n":"帝国神话","v":"6821"},{"n":"饥荒","v":"74"},{"n":"森林之子","v":"7943"},{"n":"星球大战系列","v":"554"},{"n":"极限竞速:地平线","v":"2634"},{"n":"最终幻想16","v":"7869"},{"n":"Among Us","v":"6163"},{"n":"怪物猎人:崛起","v":"6479"},{"n":"怪物猎人物语","v":"7101"},{"n":"骑马与砍杀系列","v":"4783"},{"n":"荒野大镖客2","v":"4319"},{"n":"太荒初境","v":"7685"},{"n":"罗布乐思","v":"5771"},{"n":"只狼:影逝二度","v":"4505"},{"n":"双人成行","v":"6737"},{"n":"重生边缘","v":"6201"},{"n":"海贼王 寻秘世界","v":"5097"},{"n":"战神:诸神黄昏","v":"7771"},{"n":"恐鬼症","v":"6205"},{"n":"鬼谷八荒","v":"6571"},{"n":"霍格沃茨之遗","v":"7881"},{"n":"全面战争","v":"3521"},{"n":"仁王2","v":"5795"},{"n":"奥拉星","v":"2846"},{"n":"甜蜜之家","v":"6739"},{"n":"仙剑奇侠传七","v":"6509"},{"n":"消逝的光芒2","v":"7581"},{"n":"渡神记","v":"6231"},{"n":"归家异途","v":"2949"},{"n":"博德之门3","v":"6147"},{"n":"看门狗:军团","v":"6155"},{"n":"使命召唤系列","v":"100137"},{"n":"育碧游戏","v":"100139"},{"n":"帝国时代4","v":"4835"},{"n":"英灵神殿","v":"6609"},{"n":"蛮荒志异:起源","v":"9709"},{"n":"岛","v":"3019"},{"n":"沙盒与副本","v":"9151"},{"n":"扫雷","v":"2349"},{"n":"街机游戏","v":"5999"},{"n":"幽灵线:东京","v":"7669"},{"n":"怪物猎人世界","v":"3519"},{"n":"盗贼之海","v":"3641"},{"n":"纸人","v":"5257"},{"n":"黑色像素人","v":"28"},{"n":"对马岛之魂","v":"6039"},{"n":"瑞奇与叮当","v":"2455"},{"n":"港诡实录","v":"5853"},{"n":"剑士","v":"1467"},{"n":"魔法门之英雄无敌系列","v":"2096"},{"n":"星露谷物语","v":"2443"},{"n":"仙剑奇侠传四","v":"1659"},{"n":"伤害世界","v":"2337"},{"n":"禁闭求生","v":"6065"},{"n":"真三国无双","v":"1599"},{"n":"恐怖黎明","v":"3435"},{"n":"其他单机","v":"3069"},{"n":"幽灵行动:荒野","v":"2794"},{"n":"边缘","v":"151"},{"n":"阿凡达","v":"106"},{"n":"全面战争:三国","v":"3004"},{"n":"黎明之星","v":"40"},{"n":"翼星求生","v":"7463"},{"n":"黎明传说","v":"39"},{"n":"恶魔之魂","v":"6151"},{"n":"艾兰岛","v":"3855"},{"n":"龙与地下城:秘影历代记HD","v":"17"},{"n":"龙与地下城:匕首谷","v":"18"},{"n":"沙石镇时光","v":"7687"},{"n":"三国志曹操传","v":"2592"},{"n":"FIFA足球","v":"1888"},{"n":"最终幻想7:重制版","v":"5809"},{"n":"四海兄弟","v":"5995"},{"n":"最终幻想:起源","v":"7653"},{"n":"摔跤城大乱斗","v":"7773"},{"n":"音乐游戏","v":"2761"},{"n":"精灵与萤火意志","v":"5895"},{"n":"桥梁建造师","v":"3275"},{"n":"哈迪斯","v":"6153"},{"n":"小缇娜的奇幻之地","v":"7647"},{"n":"宝可梦:剑盾","v":"5715"},{"n":"边境","v":"4779"},{"n":"人类一败涂地","v":"3289"},{"n":"糖豆人:终极淘汰赛","v":"6083"},{"n":"精灵宝可梦Let's Go","v":"4375"},{"n":"战锤40K:暗潮","v":"3016"},{"n":"石油骚动","v":"2585"},{"n":"紫塞秋风","v":"6045"},{"n":"阿尔比恩","v":"8115"},{"n":"猎人:荒野的召唤","v":"2906"},{"n":"FIFA 23","v":"7789"},{"n":"都市:天际线","v":"2201"},{"n":"乐高大电影:游戏版","v":"1439"},{"n":"全面战争:阿提拉","v":"2383"},{"n":"斩妖行","v":"6105"},{"n":"马里奥赛车8","v":"5947"},{"n":"复仇者联盟","v":"6121"},{"n":"霓虹深渊","v":"5743"}]}],
3:[{"key":"cateId","name":"分类","value":[{"n":"王者荣耀","v":"2336"},{"n":"和平精英","v":"3203"},{"n":"英雄联盟手游","v":"6203"},{"n":"CF手游","v":"2413"},{"n":"金铲铲之战","v":"7185"},{"n":"三国杀","v":"1669"},{"n":"原神","v":"5489"},{"n":"棋牌桌游","v":"100036"},{"n":"综合手游","v":"100029"},{"n":"劲乐幻想","v":"7691"},{"n":"新游广场","v":"100052"},{"n":"崩坏:星穹铁道","v":"7349"},{"n":"火影忍者手游","v":"2429"},{"n":"第五人格","v":"3115"},{"n":"问道手游","v":"2477"},{"n":"暗区突围","v":"7209"},{"n":"QQ飞车手游","v":"2928"},{"n":"球球大作战","v":"2411"},{"n":"明日之后","v":"3483"},{"n":"皇室战争","v":"2439"},{"n":"COD手游","v":"4769"},{"n":"手游休闲","v":"100004"},{"n":"二次元手游","v":"100091"},{"n":"摸了个鱼","v":"9283"},{"n":"MMORPG","v":"100273"},{"n":"动作游戏","v":"100197"},{"n":"战争冲突","v":"7449"},{"n":"王者模拟战","v":"5699"},{"n":"逆水寒手游","v":"7725"},{"n":"幻塔","v":"6437"},{"n":"欢乐斗地主","v":"1749"},{"n":"神武4手游","v":"3135"},{"n":"阴阳师","v":"2598"},{"n":"DNF手游","v":"4921"},{"n":"欢乐麻将","v":"1751"},{"n":"英雄联盟电竞经理","v":"7177"},{"n":"狼人杀手游","v":"100049"},{"n":"新天龙八部手游","v":"6945"},{"n":"中国象棋","v":"1671"},{"n":"天天象棋","v":"4997"},{"n":"传奇世界3D","v":"3961"},{"n":"御龙在天手游","v":"2568"},{"n":"高能英雄","v":"8359"},{"n":"天龙八部手游","v":"2852"},{"n":"三国志战略版","v":"5619"},{"n":"忍者必须死3","v":"4041"},{"n":"SKY光遇","v":"3719"},{"n":"虎牙领主争霸","v":"7529"},{"n":"云上城之歌","v":"5977"},{"n":"晶核","v":"7279"},{"n":"仙境传说RO","v":"2675"},{"n":"天天狼人","v":"2774"},{"n":"JJ棋牌","v":"3841"},{"n":"奇迹MU:觉醒","v":"3116"},{"n":"指尖四川麻将","v":"7215"},{"n":"部落冲突","v":"1797"},{"n":"新剑侠情缘手游","v":"6259"},{"n":"萌宠远征","v":"9385"},{"n":"暗黑破坏神:不朽","v":"6385"},{"n":"英雄杀","v":"2688"},{"n":"热血江湖手游","v":"2817"},{"n":"蛋仔派对","v":"6909"},{"n":"完美世界手游","v":"4237"},{"n":"巅峰战舰","v":"2502"},{"n":"狼人杀","v":"2785"},{"n":"斗罗大陆:魂师对决","v":"6745"},{"n":"武侠乂手游","v":"4929"},{"n":"诛仙手游","v":"2647"},{"n":"斗破苍穹手游","v":"4337"},{"n":"迷你世界","v":"2683"},{"n":"风云","v":"3061"},{"n":"妄想山海","v":"6007"},{"n":"曙光英雄","v":"6169"},{"n":"三国战纪2","v":"6049"},{"n":"梦幻新诛仙","v":"5975"},{"n":"黎明觉醒:生机","v":"6131"},{"n":"远征","v":"7837"},{"n":"航海王:燃烧意志","v":"3943"},{"n":"火炬之光:无限","v":"6399"},{"n":"巅峰极速","v":"6979"},{"n":"圣境之塔","v":"7055"},{"n":"魔力宝贝","v":"2891"},{"n":"香肠派对","v":"3639"},{"n":"创造与魔法","v":"2931"},{"n":"JJ斗地主","v":"6271"},{"n":"永恒纪元:戒","v":"2646"},{"n":"天涯明月刀手游","v":"5115"},{"n":"狼人杀官方","v":"3679"},{"n":"混沌起源","v":"5985"},{"n":"多多自走棋","v":"5133"},{"n":"梦幻诛仙手游","v":"2672"},{"n":"鸿图之下","v":"6027"},{"n":"新笑傲江湖","v":"5669"},{"n":"凡人修仙传:人界篇","v":"8297"},{"n":"多乐棋牌","v":"6209"},{"n":"口袋觉醒","v":"5953"},{"n":"跑跑卡丁车手游","v":"2620"},{"n":"奶块","v":"2775"},{"n":"月圆之夜","v":"4339"},{"n":"率土之滨","v":"2691"},{"n":"征途2手游","v":"2811"},{"n":"英魂之刃口袋版","v":"2760"},{"n":"精灵盛典:黎明","v":"6123"},{"n":"方舟手游","v":"4035"},{"n":"掼蛋","v":"6225"},{"n":"绝世仙王","v":"6619"},{"n":"流星群侠传","v":"3927"},{"n":"寻仙手游","v":"2979"},{"n":"一梦江湖","v":"3082"},{"n":"Lost Light(萤火突击国际服)","v":"6859"},{"n":"弹幕云游戏","v":"7001"},{"n":"猎魂觉醒","v":"3071"},{"n":"冒险岛:枫之传说","v":"8005"},{"n":"征途手游","v":"2556"},{"n":"海岛奇兵","v":"2624"},{"n":"倩女幽魂手游","v":"2503"},{"n":"超凡先锋","v":"6507"},{"n":"龙之谷2手游","v":"2736"},{"n":"崩坏3","v":"2639"},{"n":"猫和老鼠","v":"2758"},{"n":"七人传奇:光与暗之交战","v":"8125"},{"n":"JJ麻将","v":"9487"},{"n":"拉轰西游","v":"9543"},{"n":"三国战纪","v":"6047"},{"n":"自由幻想手游","v":"4015"},{"n":"秦时明月世界","v":"5279"},{"n":"新斗罗大陆","v":"6657"},{"n":"新神魔大陆","v":"5939"},{"n":"逃跑吧!少年","v":"4137"},{"n":"太古神王2","v":"6649"},{"n":"剑侠世界3","v":"7183"},{"n":"天天吃鸡手机版","v":"4341"},{"n":"时空猎人3","v":"6411"},{"n":"合金弹头:觉醒","v":"6931"},{"n":"明日方舟","v":"4925"},{"n":"原始征途","v":"7713"},{"n":"奇迹:最强者","v":"3215"},{"n":"天天酷跑","v":"1715"},{"n":"FC 足球世界","v":"3873"},{"n":"万国觉醒","v":"6159"},{"n":"机动都市阿尔法","v":"5411"},{"n":"航海王热血航线","v":"6181"},{"n":"幻世九歌","v":"7199"},{"n":"植物大Line truncated
},
searchUrl:'https://search.cdn.huya.com/?m=Search&do=getSearchContent&q=**&uid=0&v=4&typ=-5&livestate=0&rows=40&start=0',
searchable:2,
quickSearch:0,
headers:{
'User-Agent':'MOBILE_UA'
},
timeout:5000,
limit:8,
play_parse:true,
lazy:`js:
let rid = input.match(/\\/ (\\d + ) / )[1];
function getRealUrl(live_url) {
let [i, b] = live_url.split('?');
let r = i.split('/').pop();
let s = r.replace(/\.(flv|m3u8)/, '');
let c_tmp = b.split('&').filter(n => n);
let n = {};
let c_tmp2 = [];
c_tmp.forEach(function(tmp, index) {
if (index < 3) {
n[tmp.split('=')[0]] = tmp.split('=')[1]
} else {
c_tmp2.push(tmp)
}
});
let tmp2 = c_tmp2.join('&');
n[tmp2.split('=')[0]] = tmp2.split('=')[1];
let fm = decodeURIComponent(n.fm).split('&')[0];
let u = base64Decode(fm);
let p = u.split('_')[0];
let f = new Date().getTime() + '0000';
let ll = n.wsTime;
let t = '0';
let h = [p, t, s, f, ll].join('_');
let m = md5(h);
return (i + '?wsSecret=' + m + '&wsTime=' + ll + '&u=' + t + '&seqid=' + f + '&' + c_tmp2.pop()).replace('hls', 'flv').replace('m3u8', 'flv')
}
let purl = JSON.parse(request('https://mp.huya.com/cache.php?m=Live&do=profileRoom&roomid=' + rid)).data.stream.flv.multiLine[0].url;
input = {
jx: 0,
url: getRealUrl(purl),
parse: 0,
header: JSON.stringify({
'user-agent': 'Mozilla/5.0'
})
}
`,
推荐:`js:
let d = [];
let jo = JSON.parse(request(input)).data.datas;
jo.forEach(it => {
d.push({
url: it.profileRoom,
title: it.introduction,
img: it.screenshot,
desc: '👁' + it.totalCount + ' 🆙' + it.nick,
})
});
setResult(d);
`,
一级:`js:
let d = [];
let jo = JSON.parse(request(input)).data.datas;
jo.forEach(it => {
d.push({
url: it.profileRoom,
title: it.introduction,
img: it.screenshot,
desc: '👁' + it.totalCount + ' 🆙' + it.nick,
})
});
setResult(d);
`,
二级:'*',
搜索:'json:response.3.docs;game_roomName;game_screenshot;game_nick;room_id',
}
+112
View File
@@ -0,0 +1,112 @@
var rule = {
title: '金牌影院',
host: 'https://m.sunnafh.com',
url: '/api/mw-movie/anonymous/video/list?pageNum=fypage&pageSize=30&sort=1&sortBy=1&type1=fyclass',
searchUrl: '/api/mw-movie/anonymous/video/searchByWordPageable?keyword=**&pageNum=fypage&pageSize=12&type=false',
headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36'
},
searchable: 2,
quickSearch: 0,
filterable: 0,
class_name: '电影&电视剧&综艺&动漫',
class_url: '1&2&3&4',
limit: 6,
double: false,
play_parse:true,
lazy:`js:
let pid = input.split('/')[5];
let nid = input.split('/')[7];
const t = new Date().getTime();
eval(getCryptoJS);
let signkey = 'clientType=1&id='+pid+'&nid='+nid+'&key=cb808529bae6b6be45ecfab29a4889bc&t='+t;
const key = CryptoJS.SHA1(CryptoJS.MD5(signkey).toString()).toString();
let json_data = JSON.parse(request('https://m.sunnafh.com/api/mw-movie/anonymous/v2/video/episode/url?clientType=1&id='+pid+'&nid='+nid,{headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
'deviceid': '63ffad23-a598-4f96-85d7-7bf5f3e4a0a2',
'sign': key,
't': t
}}));
let link = json_data.data.list[0].url;
if(/\\.(m3u8|mp4)/.test(link)){input={jx:0,parse:0,url:link}}else{input={jx:0,parse:1,url:link}}
`,
一级: `js:
let d = [];
let url = '';
let t = new Date().getTime();
eval(getCryptoJS);
let signkey = 'pageNum='+MY_PAGE+'&pageSize=30&sort=1&sortBy=1&type1='+MY_CATE+'&key=cb808529bae6b6be45ecfab29a4889bc&t='+t;
let key = CryptoJS.SHA1(CryptoJS.MD5(signkey).toString()).toString();
let list = JSON.parse(request(input,{headers:{
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36',
'Accept': 'application/json, text/plain, */*',
'deviceId': '63ffad23-a598-4f96-85d7-7bf5f3e4a0a2',
'sign': key,
't': t
}})).data.list;
list.forEach((it)=>{
d.push({
title: it.vodName,
desc:it.vodRemarks,
img:it.vodPic,
url:'http'+it.vodId
})
});
setResult(d);
`,
二级: `js:
let kid=input.split('http')[1];
let t = new Date().getTime();
eval(getCryptoJS);
let signkey = 'id='+kid+'&key=cb808529bae6b6be45ecfab29a4889bc&t='+t;
let key = CryptoJS.SHA1(CryptoJS.MD5(signkey).toString()).toString();
let kjson = JSON.parse(request('https://m.sunnafh.com/api/mw-movie/anonymous/video/detail?id='+kid,{headers:{
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36',
'Accept': 'application/json, text/plain, */*',
'deviceId': '63ffad23-a598-4f96-85d7-7bf5f3e4a0a2',
'sign': key,
't': t
}})).data;
let kurls = kjson.episodeList.map(function(it) => {
return it.name + "$" + "https://m.sunnafh.com/vod/play/"+kid+"/sid/"+it.nid
}).join('#');
VOD = {
vod_id: kid,
vod_name: kjson.vodName,
vod_pic: kjson.vodPic,
type_name: kjson.vodClass,
vod_remarks: kjson.vodRemarks,
vod_year: kjson.vodYear,
vod_area: kjson.vodArea,
vod_lang: kjson.vodLang,
vod_director: kjson.vodDirector,
vod_actor: kjson.vodActor,
vod_content: kjson.vodContent,
vod_play_from: '金牌线路',
vod_play_url: kurls
}`,
搜索: `js:
let t = new Date().getTime();
eval(getCryptoJS);
let pg = MY_PAGE;
let signkey = 'keyword='+KEY+'&pageNum='+pg+'&pageSize=12&type=false&key=cb808529bae6b6be45ecfab29a4889bc&t='+t;
let key = CryptoJS.SHA1(CryptoJS.MD5(signkey).toString()).toString();
let html = JSON.parse(request(input,{headers: {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
'deviceid': '63ffad23-a598-4f96-85d7-7bf5f3e4a0a2',
'sign': key,
't': t
}}));
let data = html.data.list;
let d = [];
data.forEach(it=>{
d.push({
title: it.vodName,
desc:it.vodVersion,
img:it.vodPic,
url:'http'+it.vodId
})
});
setResult(d)
`,
}
+87
View File
@@ -0,0 +1,87 @@
{
"规则名": "age动漫",
"规则作者": "",
"请求头参数": "User-Agent$电脑",
"网页编码格式": "UTF-8",
"图片是否需要代理": "0",
"是否开启获取首页数据": "1",
"首页推荐链接": "https://www.agedm.io",
"首页列表数组规则": "body&&.video_list_box",
"首页片单列表数组规则": ".video_item",
"首页片单是否Jsoup写法": "1",
"首页片单标题": ".video_item-title&&Text",
"首页片单链接": "a&&href[替换:http://=>https://]",
"首页片单图片": ".lazyload&&data-original",
"首页片单副标题": ".video_item--info&&Text",
"首页片单链接加前缀": "",
"首页片单链接加后缀": "",
"分类起始页码": "1",
"分类链接": "https://www.agedm.io/catalog/{cateId}-all-all-all-all-time-{catePg}",
"分类名称": "全部&TV&剧场版&OVA",
"分类名称替换词": "all&TV&剧场版&OVA",
"筛选数据": {},
//"筛选数据": "ext",
//{cateId}
"筛选子分类名称": "",
"筛选子分类替换词": "",
//{class}
"筛选类型名称": "",
"筛选类型替换词": "*",
//{area}
"筛选地区名称": "",
"筛选地区替换词": "*",
//{year}
"筛选年份名称": "",
"筛选年份替换词": "*",
//{lang}
"筛选语言名称": "",
"筛选语言替换词": "*",
//{by}
"筛选排序名称": "时间&人气&评分",
"筛选排序替换词": "time&hits&score",
"分类截取模式": "1",
"分类列表数组规则": "#cata_video_list&&.cata_video_item",
"分类片单是否Jsoup写法": "1",
"分类片单标题": "a&&title",
"分类片单链接": "a&&href[替换:http://=>https://]",
"分类片单图片": ".lazyload&&data-original",
"分类片单副标题": ".video_play_status&&Text",
"分类片单链接加前缀": "",
"分类片单链接加后缀": "",
"搜索请求头参数": "User-Agent$电脑",
"搜索链接": "https://www.agedm.io/search?query={wd}&page={SearchPg}",
"POST请求数据": "",
"搜索截取模式": "1",
"搜索列表数组规则": "#cata_video_list&&.cata_video_item",
"搜索片单是否Jsoup写法": "1",
"搜索片单图片": ".lazyload&&data-original",
"搜索片单标题": "a&&title",
"搜索片单链接": "a&&href[替换:http://=>https://]",
"搜索片单副标题": ".video_play_status&&Text",
"搜索片单链接加前缀": "",
"搜索片单链接加后缀": "",
"链接是否直接播放": "0",
"直接播放链接加前缀": "",
"直接播放链接加后缀": "",
"直接播放直链视频请求头": "",
"详情是否Jsoup写法": "1",
"类型详情": "",
"年代详情": "",
"地区详情": "",
"演员详情": "",
"简介详情": ".video_detail_desc&&Text",
"线路列表数组规则": ".video_detail_playlist_wrapper&&.nav-item",
"线路标题": "Text",
"播放列表数组规则": ".video_detail_playlist_wrapper&&.video_detail_episode",
"选集列表数组规则": "li",
"选集标题链接是否Jsoup写法": "1",
"选集标题": "a&&Text",
"选集链接": "a&&href",
"是否反转选集序列": "0",
"选集链接加前缀": "https://www.agedm.io",
"选集链接加后缀": "",
"分析MacPlayer": "0",
"是否开启手动嗅探": "1",
"手动嗅探视频链接关键词": ".mp4#.m3u8#.flv#video/tos",
"手动嗅探视频链接过滤词": ".html#=http"
}
+81
View File
@@ -0,0 +1,81 @@
{
"规则名": "低端影视",
"规则作者": "",
"请求头参数": "手机",
"网页编码格式": "UTF-8",
"图片是否需要代理": "0",
"是否开启获取首页数据": "1",
"首页推荐链接": "https://www.ddys.run",
"首页列表数组规则": "body&&.stui-vodlist:has(h4)",
"首页片单列表数组规则": "li",
"首页片单是否Jsoup写法": "1",
"分类起始页码": "1",
"分类链接": "https://www.ddys.run/list/{cateId}--------{catePg}---.html[firstPg=https://www.ddys.run/category/{cateId}.html]",
"分类名称": "电影&电视剧&动漫",
"分类名称替换词": "dianying&juji&dongman",
"筛选数据": {},
//"筛选数据": "ext",
//{cateId}
"筛选子分类名称": "",
"筛选子分类替换词": "",
//{class}
"筛选类型名称": "",
"筛选类型替换词": "*",
//{area}
"筛选地区名称": "",
"筛选地区替换词": "*",
//{year}
"筛选年份名称": "",
"筛选年份替换词": "*",
//{lang}
"筛选语言名称": "",
"筛选语言替换词": "*",
//{by}
"筛选排序名称": "时间&人气&评分",
"筛选排序替换词": "time&hits&score",
"分类截取模式": "1",
"分类列表数组规则": ".stui-vodlist&&li",
"分类片单是否Jsoup写法": "1",
"分类片单标题": "h4&&a&&Text",
"分类片单链接": "h4&&a&&href",
"分类片单图片": ".lazyload&&data-original",
"分类片单副标题": ".pic-text&&Text",
"分类片单链接加前缀": "https://www.ddys.run",
"分类片单链接加后缀": "",
"搜索请求头参数": "User-Agent$手机",
"搜索链接": "https://www.ddys.run/search/{wd}----------{SearchPg}---.html",
"POST请求数据": "searchword={wd}",
"搜索截取模式": "1",
"搜索列表数组规则": ".stui-vodlist&&li",
"搜索片单是否Jsoup写法": "1",
"搜索片单图片": ".lazyload&&data-original",
"搜索片单标题": "h4&&a&&Text",
"搜索片单链接": "h4&&a&&href",
"搜索片单副标题": ".pic-text&&Text",
"搜索片单链接加前缀": "https://www.ddys.run",
"搜索片单链接加后缀": "",
"链接是否直接播放": "0",
"直接播放链接加前缀": "",
"直接播放链接加后缀": "",
"直接播放直链视频请求头": "",
"详情是否Jsoup写法": "0",
"类型详情": "类型:</span>&&</a>",
"年代详情": "年份:</span>&&</a>",
"地区详情": "地区:</span>&&</a>",
"演员详情": "主演:</span>&&</p>",
"简介详情": "简介:</span>&&</p>",
"线路列表数组规则": "",
"线路标题": "",
"播放列表数组规则": "body&&.stui-content__playlist",
"选集列表数组规则": "li",
"选集标题链接是否Jsoup写法": "1",
"选集标题": "a&&Text",
"选集链接": "a&&href",
"是否反转选集序列": "0",
"选集链接加前缀": "https://www.ddys.run",
"选集链接加后缀": "",
"分析MacPlayer": "0",
"是否开启手动嗅探": "0",
"手动嗅探视频链接关键词": ".mp4#.m3u8#.flv#video/tos",
"手动嗅探视频链接过滤词": ".html#=http"
}
+72
View File
@@ -0,0 +1,72 @@
{
"规则名": "农民影视",
"规则作者": "香雅情",
"请求头参数": "User-Agent$手机#accept$text/html#Referer$https://vip.wwgz.cn:5200",
"网页编码格式": "UTF-8",
"图片是否需要代理": "0",
"是否开启获取首页数据": "1",
"首页推荐链接": "https://vip.wwgz.cn:5200",
"首页列表数组规则": "body&&.globalPicList",
"首页片单列表数组规则": "li:has(img)",
"首页片单是否Jsoup写法": "1",
"首页片单标题": ".sTit&&Text",
"首页片单链接": "a&&href",
"首页片单图片": "img&&data-echo||data-src||src",
"首页片单副标题": ".sBottom&&Text",
"首页片单链接加前缀": "https://vip.wwgz.cn:5200",
"首页片单链接加后缀": "",
"分类起始页码": "1",
"分类链接": "https://vip.wwgz.cn:5200/vod-list-id-{cateId}-pg-{catePg}-order--by-{by}-class--year-{year}-letter--area-{area}-lang-.html",
"分类名称": "电影&电视剧&综艺&动漫&短剧",
"分类名称替换词": "1&2&3&4&26",
"筛选数据": "ext",
"筛选子分类名称": "动作片&喜剧片&爱情片&科幻片&恐怖片&剧情片&战争片&惊悚片&奇幻片||国产剧&港台泰&日韩剧&欧美剧||空||动漫剧&动漫片",
"筛选子分类替换词": "5&6&7&8&9&10&11&16&17||12&13&14&15||空||18&19",
"筛选地区名称": "大陆&香港&台湾&美国&韩国&日本&泰国&新加坡&马来西亚&印度&英国&法国&加拿大&西班牙&俄罗斯&其它",
"筛选地区替换词": "*",
"分类截取模式": "1",
"分类列表数组规则": ".globalPicList&&li",
"分类片单是否Jsoup写法": "1",
"分类片单标题": ".sTit&&Text",
"分类片单链接": "a&&href",
"分类片单图片": "img&&data-echo||data-src||src",
"分类片单副标题": ".sBottom&&Text",
"分类片单链接加前缀": "https://vip.wwgz.cn:5200",
"分类片单链接加后缀": "",
"搜索请求头参数": "User-Agent$手机#Referer$https://vip.wwgz.cn:5200",
"search_url": "https://vip.wwgz.cn:5200/index.php?m=vod-search;post",
"sea_PtBody": "wd={wd}",
"search_mode": "1",
"sea_arr_rule": "#data_list&&li",
"sea_is_jsoup": "1",
"sea_pic": ".lazyload&&data-src",
"sea_title": ".sTit&&Text",
"sea_url": "a&&href",
"搜索片单副标题": ".sDes,-1&&Text",
"搜索片单链接加前缀": "https://vip.wwgz.cn:5200",
"搜索片单链接加后缀": "",
"链接是否直接播放": "0",
"直接播放链接加前缀": "https://live.52sf.ga/huya/",
"直接播放链接加后缀": "#isVideo=true#",
"直接播放直链视频请求头": "authority$ku.peizq.online#Referer$https://play.peizq.online",
"详情是否Jsoup写法": "1",
"类型详情": ".type-title&&Text",
"年代详情": "body&&span:contains(年代:)&&Text!年代:",
"地区详情": "",
"演员详情": "body&&.sDes:contains(主演:)&&Text!主演:",
"简介详情": ".detail-con&&p&&Text!简介:",
"线路列表数组规则": "#leftTabBox&&ul&&li",
"线路标题": "Text[替换:默认=>农民专线]",
"播放列表数组规则": "#leftTabBox&&.numList",
"选集列表数组规则": "li",
"选集标题链接是否Jsoup写法": "1",
"选集标题": "a&&Text",
"选集链接": "a&&href",
"是否反转选集序列": "1",
"选集链接加前缀": "https://vip.wwgz.cn:5200",
"选集链接加后缀": "",
"分析MacPlayer": "0",
"是否开启手动嗅探": "1",
"手动嗅探视频链接关键词": ".mp4#.m3u8#item/video#video_mp4#video/tos",
"手动嗅探视频链接过滤词": ".html#=http"
}
+82
View File
@@ -0,0 +1,82 @@
{
"规则名": "剧圈圈",
"规则作者": "香雅情",
"OCR_API":"https://api.nn.ci/ocr/b64/text",
"请求头参数": "MOBILE_UA",
"网页编码格式": "UTF-8",
"图片是否需要代理": "否",
"是否开启获取首页数据": "1",
"首页推荐链接": "https://www.jqqzx.me",
"首页列表数组规则": "body&&.module-main.tab-list.active",
"首页片单列表数组规则": ".module-item",
"首页片单是否Jsoup写法": "1",
"分类起始页码": "1",
"分类链接": "https://www.jqqzx.me/vodshow/id/{cateId}/page/{catePg}.html",
"分类名称": "电影&电视剧&综艺&动漫&纪录片&爽剧",
"分类名称替换词": "dianying&juji&zongyi&dongman&jilupian&shuangju",
"筛选数据": {},
//"筛选数据": "ext",
//{cateId}
"筛选子分类名称": "",
"筛选子分类替换词": "",
//{class}
"筛选类型名称": "",
"筛选类型替换词": "*",
//{area}
"筛选地区名称": "",
"筛选地区替换词": "*",
//{year}
"筛选年份名称": "",
"筛选年份替换词": "*",
//{lang}
"筛选语言名称": "",
"筛选语言替换词": "*",
//{by}
"筛选排序名称": "时间&人气&评分",
"筛选排序替换词": "time&hits&score",
"分类截取模式": "1",
"分类列表数组规则": ".module-items&&.module-item",
"分类片单是否Jsoup写法": "是",
"分类片单标题": ".module-poster-item-title&&Text",
"分类片单链接": "a&&href",
"分类片单图片": ".lazyload&&data-original",
"分类片单副标题": ".module-item-note&&Text",
"分类片单链接加前缀": "https://www.jqqzx.me",
"分类片单链接加后缀": "",
"搜索请求头参数": "User-Agent$MOBILE_UA",
"搜索链接": "https://www.jqqzx.me/vodsearch{wd}/page/{SearchPg}.html",
"POST请求数据": "",
"搜索截取模式": "1",
"搜索列表数组规则": ".module-items&&.module-item",
"搜索片单是否Jsoup写法": "是",
"搜索片单图片": ".lazyload&&data-original",
"搜索片单标题": ".module-card-item-title&&Text",
"搜索片单链接": "a&&href",
"搜索片单副标题": ".module-item-note&&Text",
"搜索片单链接加前缀": "https://www.jqqzx.me",
"搜索片单链接加后缀": "",
"链接是否直接播放": "否",
"直接播放链接加前缀": "",
"直接播放链接加后缀": "",
"直接播放直链视频请求头": "",
"详情是否Jsoup写法": "是",
"类型详情": "",
"年代详情": ".module-info-content&&.module-info-item,3&&Text",
"地区详情": "",
"演员详情": ".module-info-content&&.module-info-item,2&&Text",
"简介详情": ".module-info-content&&.module-info-item&&Text",
"线路列表数组规则": ".module-tab-items-box&&.module-tab-item",
"线路标题": "Text",
"播放列表数组规则": "body&&.module-play-list-content",
"选集列表数组规则": "a",
"选集标题链接是否Jsoup写法": "是",
"选集标题": "a&&Text",
"选集链接": "a&&href",
"是否反转选集序列": "否",
"选集链接加前缀": "https://www.jqqzx.me",
"选集链接加后缀": "",
"分析MacPlayer": "否",
"是否开启手动嗅探": "否",
"手动嗅探视频链接关键词": ".mp4#.m3u8#.flv#video/tos",
"手动嗅探视频链接过滤词": ".html#=http"
}
+82
View File
@@ -0,0 +1,82 @@
{
"规则名": "好影快看",
"规则作者": "香雅情",
//"OCR_API":"https://api.nn.ci/ocr/b64/text",
"请求头参数": "MOBILE_UA",
"网页编码格式": "UTF-8",
"图片是否需要代理": "否",
"是否开启获取首页数据": "1",
"首页推荐链接": "https://www.hitv.app",
"首页列表数组规则": "body&&.module-main.tab-list.active",
"首页片单列表数组规则": ".module-item",
"首页片单是否Jsoup写法": "1",
"分类起始页码": "1",
"分类链接": "https://www.hitv.app/show/{cateId}--------{catePg}---.html",
"分类名称": "电影&电视剧&综艺&动漫&儿童",
"分类名称替换词": "1&2&3&4&58",
"筛选数据": {},
//"筛选数据": "ext",
//{cateId}
"筛选子分类名称": "",
"筛选子分类替换词": "",
//{class}
"筛选类型名称": "",
"筛选类型替换词": "*",
//{area}
"筛选地区名称": "",
"筛选地区替换词": "*",
//{year}
"筛选年份名称": "",
"筛选年份替换词": "*",
//{lang}
"筛选语言名称": "",
"筛选语言替换词": "*",
//{by}
"筛选排序名称": "时间&人气&评分",
"筛选排序替换词": "time&hits&score",
"分类截取模式": "1",
"分类列表数组规则": "body&&.module-item",
"分类片单是否Jsoup写法": "是",
"分类片单标题": ".module-poster-item-title&&Text",
"分类片单链接": "a&&href",
"分类片单图片": ".lazyload&&src",
"分类片单副标题": ".module-item-note&&Text",
"分类片单链接加前缀": "https://www.hitv.app",
"分类片单链接加后缀": "",
"搜索请求头参数": "User-Agent$MOBILE_UA",
"搜索链接": "https://www.hitv.app/search/{wd}----------{SearchPg}---.html",
"POST请求数据": "",
"搜索截取模式": "1",
"搜索列表数组规则": ".module-items&&.module-item",
"搜索片单是否Jsoup写法": "是",
"搜索片单图片": ".lazyload&&src",
"搜索片单标题": ".module-card-item-title&&Text",
"搜索片单链接": "a&&href",
"搜索片单副标题": ".module-item-note&&Text",
"搜索片单链接加前缀": "https://www.hitv.app",
"搜索片单链接加后缀": "",
"链接是否直接播放": "否",
"直接播放链接加前缀": "",
"直接播放链接加后缀": "",
"直接播放直链视频请求头": "",
"详情是否Jsoup写法": "是",
"类型详情": "",
"年代详情": "",
"地区详情": "",
"演员详情": ".module-info-content&&.module-info-item,3&&Text",
"简介详情": ".show-desc&&Text",
"线路列表数组规则": ".module-tab-items-box&&.module-tab-item",
"线路标题": "Text",
"播放列表数组规则": "body&&.module-play-list-content",
"选集列表数组规则": "a",
"选集标题链接是否Jsoup写法": "是",
"选集标题": "a&&Text",
"选集链接": "a&&href",
"是否反转选集序列": "否",
"选集链接加前缀": "https://www.hitv.app",
"选集链接加后缀": "",
"分析MacPlayer": "否",
"是否开启手动嗅探": "否",
"手动嗅探视频链接关键词": ".mp4#.m3u8#.flv#video/tos",
"手动嗅探视频链接过滤词": ".html#=http"
}
+43
View File
@@ -0,0 +1,43 @@
{
"规则名": "斗鱼直播",
"规则作者": "香雅情",
"请求头参数": "手机",
"网页编码格式": "UTF-8",
"图片是否需要代理": "0",
"是否开启获取首页数据": "0",
"分类起始页码": "1",
"分类链接": "https://m.douyu.com/api/room/list?page={catePg}&type={cateId}",
"分类名称": "网游竞技&单机热游&手游休闲&娱乐天地&颜值&科技文化&语音互动&语音直播&正能量&赛车竞技&京斗云",
"分类名称替换词": "LOL&TVgame&wzry&ecy&yz&wh&paidui&yyjy&znl&eracing&jdy",
"筛选数据": "ext",
"筛选子分类名称": "英雄联盟&热门游戏&穿越火线&超击突破&CFHD&使命召唤&DNF&DOTA2&炉石传说&CS:GO&无畏契约&lol云顶之弈&魔兽争霸&魔兽怀旧服&自走棋&传奇&跑跑卡丁车&网易游戏&星际争霸&格斗游戏&守望先锋归来&DOTA&魔兽世界&剑网3&魔域&我的世界&超激斗梦境&冒险岛&三国杀&梦幻西游&天涯明月刀&街头篮球&NBA2KOL2&QQ飞车端游&战地之王&军事游戏&棋牌娱乐&FIFA ONLINE 4&热门网游&诛仙世界&千古风流&APEX&流放之路POE&剑网3缘起&逆水寒&风暴英雄&逆战&坦克世界&战舰世界&巫师之昆特牌&反恐精英Online&暗黑破坏神&梦三国2&传奇世界&方舟:生存进化&刀塔霸业&神武4电脑版&群雄逐鹿&堡垒之夜&无限法则&问道电脑版&西山居游戏&最终幻想14&战意&剑灵&星际战甲&龙之谷&铁甲雄兵&古剑奇谭网络版&轩辕传奇&神途&激战2&高达文化区&忍者村大战2&RPG网游专区&诛仙3&Artifact&斗鱼游戏&笑傲江湖OL&冒险岛2&无尽战区&生死狙击&斗战神&永恒之塔&竞速游戏&九阴真经&我的起源&FPS综合网游&劲舞团&天下&刀锋铁骑&火箭联盟&泡泡堂&武侠乂&音乐游戏&百变球球&游戏装机&新倩女幽魂&创世战车&天谕&征途2&QQ炫舞&泰亚史诗&大唐无双&枪火游侠&海战世界&秘境对决&兽人必须死&怪物猎人ol&火源&生存竞技&手工星球&艾兰岛&腾讯游戏&星战前夜:晨曦&热血传奇怀旧版&仙侠世界2&Anarea&枪火重生&彩虹岛&御龙在天&英魂之刃&自由篮球&洛奇英雄传&洛奇&封印者&奇奥英雄传&合金弹头&新英雄年代&星尘传说&盛趣游戏&九阴真经2&沙盒游戏&体育网游&我的世界:地下城&恐鬼症&领地人生&梦塔防&重生边缘&大话西游2&猎人&虎豹骑&传奇之梦&伏魔传&梦想世界3电脑版&海之乐章2&新风火之旅&鬼谷无双&猎龙战记&不败传说&天子剑&热血江湖online&血杀英雄&千年3&逍遥情缘&天空之城&快乐西游&诺亚传说&鹿鼎记&新桃花源记&疾风之刃电脑版&武魂2电脑版&奇迹世界sun&地城之光&新丝路&剑侠世界2电脑版&斩魂&大唐2&幻想神域电脑版&蜀山:初章&狼人对决网游&武林群侠传&飘流幻境&卡拉彼丘&破天一剑&剑雨江湖&四国军棋&命运方舟&新大话西游3&装甲战争&释厄英雄&隆冬&暴雪游戏综合&Battlebit&HypeSquad&长尾4部虚拟分区&幕后高手&燕云十六声&THE FINALS&不良土壤&篮球高手&NBA2K Online&塔瑞斯世界&再战Online&跑跑卡丁车:漂移&传奇永恒&ARC Raiders&传奇归来&权力的游戏 凛冬将至页游&异星前哨&The Front&欺骗公司&全境封锁2||主机游戏&刺客信条:英灵殿&马里奥制造&逃离塔科夫&命运2&墲人之境&Evil Dead&恐怖游戏&荒野大镖客&九劫曲&灵魂筹码&骑马与砍杀&只狼&饥荒&全境封锁&怀旧游戏&战地风云&隐形守护者&ATLAS&进击的巨人&NBA2K&八方旅人&血污:夜之仪式&人类一败涂地&挺进地牢&环世界&古墓丽影&波西亚时光&鬼泣&往日不再&仙剑奇侠传&神秘海域&塞尔达系列&僵尸世界大战&足球游戏&橙光&莎木&圣歌&了不起的修仙模拟器&女神异闻录&斯普拉遁&超级马里奥&三国志系列&星际公民&最终幻想&中土世界:战争之影&流放者柯南&行尸走肉&深海迷航&三国群英传&腐烂国度&无主之地&层层恐惧&圣女战旗&瘟疫传说:无罪&哆啦A梦:牧场物语&鬼哭邦&幽灵行动:断点&不屈者柯南&风之旅人&辐射&太吾绘卷&SCUM&正当防卫&以撒的结合&文明&仁王&缺氧&全面吃鸡模拟器&古剑奇谭&宝可梦:剑/盾&魔法破碎&JUMP大乱斗&皇牌空战&体育游戏&海岛大亨&NBA 2K 欢乐竞技场2&碧海黑帆&最后生还者2&装机模拟器&侏罗纪世界:进化&植物大战僵尸:花园战争系列&蜘蛛侠&战争机器5&战国无双&勇者斗恶龙:建造者2&遗迹:灰烬重生&血源&羞辱系列&星之卡比&侠客风云传&旺达与巨像&吞食孔明传&突变元年:伊甸园之路&死亡搁浅&双点医院&守墓人&忍者龙剑传&模拟人生&迷雾侦探&龙腾世纪&猎天使魔女&狂野星球之旅&空洞骑士&狙击精英&救赎之路&精灵宝可梦Let's Go!&驾驶俱乐部&极限竞速&极品飞车&胡闹厨房&河洛群侠传&归于沉寂&光之子&疯狂的麦克斯&地铁:离去&沉没之城&尘埃系列&超凡双生&飙酷车神&鬼泣5&孢子&暗黑地牢&Rime&生死狙击2&Inside&三国战纪&怀旧FC&讨鬼传&经典单机&奇异小队&英雄无敌&索尼克系列&暗黑血统&街机游戏&合金装备&红色警戒&星球大战系列&纪元:变异&镜之边缘&无双大蛇&海贼王系列&波斯王子&灵魂之火&Hob&祖先:人类史诗&勿忘我&寂静之人&海贼无双&黑道圣徒系列&鬼屋魔影:启蒙&我还活着&巨神狩猎&三合会之战&女巫&大将军:罗马&人类黎明&漫展模拟器&电竞传奇&爱丽丝:庇护&深渊狂猎&古惑狼三部Line truncated
"筛选子分类替换词": "LOL&rmyx&CF&SuperPeople&CFHD&COD&DNF&DOTA2&How&CSGO&VALORANT&ydzhy&mszb&wowclassic&dota2rpg&cq&Popkart&wyyx&SC&FTG&Overwatch&DOTA&WOW&JX3&EudemonsOnline&MC&cjdmj&mxd&sanguosha&MHXYOL&tianya&jtlq&NBA2KOL2&qqfcdy&AVA&jsyx&qipai&FOL4&rmwy&zxsj&qgflpc&APEX&PathofExile&JW3YQ&nsh&HOTS&NZ&TKSJ&wfws&wszktp&CS&DIABLO&msg2&cqsj&fzscjh&DotaUnderlords&swdnb&qxzl&blzy&roe&wddnb&Seasun&FF14&WYZY&BladeSoul&Warframe&DragonNest&tjxb&gjqtwlb&XYCQ&shentu&GuildWars2&gdyxq&rzcdz2&rpgwyzq&zhuxian3&Artifact&DYYX&xajhol&MXD2&WJZQ&BattleTeams&dzs&AION&jingsu&JYZJ&wdqy&FPSOL&jwt&tianxai&dftq&hjlm&ppt&wxy&MG&BBQQ&youxizhuangji&ONLINE&cszc&tianyu&zhengtu2&qqxw&tyss&dtws&qhyx&hzsj&mjdj&srbxs&MHol&hy&scjj&sgxq&ald&TencentGame&EVE&rxcqhjsgb&xxsj2&Anarea&qhcs&CHD&YLZT&YHZR&ZYLQ&LQYXZ&LQ&FYZ&QAYXZ&HJDT&XYXSD&XCCS&SQYX&JYZJ2&SHYX&TYWY&MD&KGZ&LDRS&TDOTK&CSBYOL&dhxy2&lr&hbq&cqzm&fmz&mxsjpc3&hzyz2&xfhzl&ggws&llzj&bbcs&tianzijian&rxjhol&xsxy&qn3&xyqy&tkzc&klxy&nycs&ldj&xthyj&jfzr1&wh2pc&qjsjsun&dczg&xsl1&jxsj2pc&zhpc&dt2pc&hxsypc&ssczpc&lrdjpc&wlqxzpc&plhjpc&klbq&ptyj&jyjh&sgjq&LostArk&xy3&zjzz&SEYX&longvinter&g_bliz&BBR&HypeSquad&cw4bxnfq&VEILEDEXPERTS&WHEREWINDSMEET&THEFINALS&Dysterra&lqgs&NBA2KOL&Tarisland&zzonline&KartRiderDrift&EternalLegend&ARCR&TheReturnofLegend&GOTPC&AlienMarauder&TheFront&DeceiveInc&TheDivision2||TVgame&AC&Mario&EFT&MY2&wu&EvilDead&Horror&hydbk&jjq&lhcm&MountAndBlade&ZL&DontStarve&qjfs&classic&BF&yxshz&ATLAS&AoT&NBA2K&OT&Blood&Human&Enter&RimWorld&gmly&bxysg&DMC&WRBZ&PAL&Uncharted&TLoZ&WWZ&zq&cg&Shenmue&sg&ACS&P5&Splatoon&SMO&Sangokushi&StarCitizen&FF&MiddleEarth&Conan&TWD&Subnautica&SANGO&SoD2&Bor&LoF&Banner&Innocence&Doraemon&GKB&Ghost&bqzkn&Journey&fs&twhj&Scum&zdfw&Isaac&CVI&NIOH&ONI&TAB&GuJian3&PSS&SpellBreak&JUMPDLD&hpkz&tyyx&hddh&nba2khljjc2&klhdt&TLOU2&PCBS&JWE&PvsZ&Spide&Gears&ZGWS&DQB2&Rem&BB&Dish&Kirby&ToW&SotC&ETwK&MYZ&DS&TPH&GK&NG&Sims&TotNS&DA&Bayonetta&JttSP&HKS&SE&SSfR&PLsGo&DriveClub&jxjs&jpfc&Overcooked&TBoD&FtS&COL&MadMax&ME&TSC&DiRT&BTS&Crew&DevilMayCry5&Spore&DD&Rime&ssjjtwo&Inside&sgzj&edwcy&Toukiden&jddj&StrangeBrigade&HoMM&Sonic&Darksiders&jjyx&MetalGear&hsjj&StarWars&ANNO&MsE&WO&OnePiece&PfP&lhzh&Hob&Ancestors&Remw&QuietMan&OPPW&SR&AitD&Alive&PftG&TW&Noita&Rome&DawnMan&ConSim&ESL&Alice&LxL&CBNST&Prey&MMX&Int&FireEmblem&Fable&Outward&Stardew&Effect&SSZSG&Heroes&SAO&BG&Ziggurat&Torchlight&CodeVein&TheEvilWithin&TES&VC&Dauntless&HoF&FoD&LostSphear&Cyberpunk&GF&CP&DQ&HXSGZ&LotF&Biomutant&Pokemon&Disgaea&TLG&NieR&Ys&Surge&JE&KingdomCome&DS3&Phantom&CoC&LiS&TDP&Celeste&GoT&WHF&TWAU&NMS&LEGOW&CapSp&TIF&Deracine&Eastward&EVOTINCTION&Firewatch&F1&RD&Genie&GT&PC&Ride&SRW&XCOM2&KOEINOBU&SuperMeatBoy&TWoM&SHT&sljt&Frostpunk&AoEIV&CKII&ED&MP&QB&swkj&Bright&OPWS&UH&Beholder&CFB&GE3&Onimusha&Insurgency&KH&Crackdown3&BladedFury&SSBS&Hitman&Mordhau&Rage&Wf&Control&Med&Moons&YCW&Trine&ToolsUp&Sakura&Desp&WARSAW&Otaku&Dark&Ember&KLK&Ori&2020Olympic&WRC&Aegis&DEEEER&Soulstorm&mugen&HomeWork&Football&Post&RoR&Billions&Unheard&Farm&JustDance&ArmA&Pedro&AHT&Kingdoms&Skyhill&Escapists&Oil&BioShock&Divinity&Honor&TABS&Truck&Delivery&Fugitive&mmcy&Wolves&STEEP&Survival&Crysis&FarCry&Holmes&Forager&Skylines&Earth&hdzh&Dungeon&raft&DayZ&60S&RF&DECEIT&theHunter&LC&GD&PK&DC&Cuphead&SoR&MUA&kmg&DW&Anno1800&Yww&CotN&Besiege&Worms&AlanWake&BT&Terraria&EE&Unturned&Factorio&Stellaris&WTLOL&DL&UFC&Portal&Detroit&Castlevania&RL&SpM&Halo&HB&gsczx&Doom&Naruto&JHCC&PA&TF&Kerbal&LoveSim&CookingSim&BumSim&DBX&MarioKart&SimCity&SimFarm&GoatSim&Magicka&EU&TCE&HoboToughLife&ThiefSimulator&TabletopSimulator&AceA&T99&slmmc&QCSZJ&FTL&Undertale&DRGD&CBA&PvZ&CC&BroForce&GGM&HL&Moon&Batman&Refunct&Room&Amnesia&Edith&VH&Shadow&AWO&YJSL&PlanetZoo&TWSJ&LO&VRChat&RichMan&LM&MST&SOSRIMT&Raksasi&Leg&fkjy&DISTRAINT&yxl&Hacknet&SOASER&Starbound&TRS&KF2&YAZD&CH&Kingdom&BCZH&ES2&Mafia&BS&DFZ&swn&BAT&CW&BD2&NB&DDDA&RK&NTF&FFC&NW&HUMANKIND&CT&IR&DBZ&MIKU&BE&THS&MA&Wasteland&BLYWD&OPM&Raji&HERO&PH&Ghostrunner&DRG&mega&Samurai&Forest&kenshi&Hades&Hurtworld&JLDSK&YZBL&GTFO&fcptdl&jsjc&biped&INVAXION&jjygqsjb&Unrailed&NA&Morta&Moonlighter&Wizard&UnderMine&longya&OG&WJSJ&UE&MFS&CPLR&SHC&BYLM&TMQY&DYZR&RFG&ZCXD&CJR&NTB&TLDG&TJPP&MKKE&HJXD&BNG&GH&SF&METRO&REND&PB&YL&WWPC&ISI&WLOM&TFINF&TCSCB&JS&LMSH&TISLE&BJZD&ygzbdsh&JJYS&DYQZ&CDXQ&hh3&lgzljsj&gcyx&cscyj&czsj&dxc&DYYM&FCDR&ftxl&jtzz&krhc&lmzz&pxsj&FBSM&RJDY&tldl&wglwjz&WPYX&WDZY&xxgbsxz&yxwy&Squad&zzxw&zjsjc&ZJDZY&WZDJ&LUNA&DXM&temtem&ECO&bmcs&FWF&RG&dwlp&dushen&FGSK&FKYS&hdqs&HJMS&jldld&JY&jshmgc&JTG&QL&GZ&mgljsyc&mwsc&KM&qljzz&Depth&SHSD&SLKS&stjk&TTZL&AZ&XZZZ&xydg&YSCQ&YWGD&AUDIOS&SSHD&YYJL&SAS&DirtyBomb&zyzxcdjl&zcjnh&AL&CSZW&ZZT&SRS&Corr&Zom4&GAA&WP&OnAir&GTWJ&Hellpoint&MO&FGJP&LTH&BP&FT&Mara&9M&Skul&TMS&JWJL&Neov&WOH&SP&RQFST&ZJJT&SPAZ&Witch&Bunny&Rat&HS&UCH&RFA&CARP&NFB&LJGF&ZE&TP&AST&GCFW&SZDXC&TCSW&MYDL&ALWD&CMD&CA&DITF&CZDL&LATG&FWGF&MLQJ&HAL&GNXD&IoD&Wanba&TRDS&SKYHILLHW&EtG&PAQK&Oth&YJYG&MZSK&BeatMe&HSKN&DMR&Psy&VTLN&ZZCJ&DAH&hmbb&Cl&BSPBR&HWCT&Par&Ret&Dis&North&CarFLine truncated
"分类截取模式": "0",
"分类列表数组规则": "data.list",
"分类片单是否Jsoup写法": "1",
"分类片单标题": "roomName",
"分类片单链接": "rid",
"分类片单图片": "roomSrc",
"分类片单副标题": "nickname",
"分类片单链接加前缀": "http://huanqiuzhibo.cn/manifest/douyu.php?id=",
"分类片单链接加后缀": "#IILL线路$https://live.iill.top/douyu/'input'",
"搜索请求头参数": "User-Agent$手机",
"搜索链接": "https://m.douyu.com/api/search/liveRoom;post",
"POST请求数据": {"sk":"{wd}","offset":0,"limit":20,"did":"bf1f5579c0b2f6066af0bee200051531"},
"搜索截取模式": "0",
"搜索列表数组规则": "data.list",
"搜索片单是否Jsoup写法": "1",
"搜索片单图片": "roomSrc",
"搜索片单标题": "roomName",
"搜索片单链接": "roomId",
"搜索片单副标题": "nickname",
"搜索片单链接加前缀": "http://huanqiuzhibo.cn/manifest/douyu.php?id=",
"搜索片单链接加后缀": "#IILL线路$https://live.iill.top/douyu/'input'",
"链接是否直接播放": "1",
"直接播放链接加前缀": "",
"直接播放链接加后缀": "",
"直接播放直链视频请求头": "User-Agent$MXPlayer/1.86.0",
"是否开启手动嗅探": "1",
"手动嗅探视频链接关键词": "/douyu#yiandrive",
"手动嗅探视频链接过滤词": ".html#=http"
}
+86
View File
@@ -0,0 +1,86 @@
{
"规则名": "来看点播",
"规则作者": "",
"请求头参数": "User-Agent$PC_UA#accept$text/html",
"网页编码格式": "UTF-8",
"图片是否需要代理": "0",
"是否开启获取首页数据": "1",
"首页推荐链接": "https://lkvod.org",
"首页列表数组规则": "body&&.fadeInUp:has(.gen-movie-img)",
"首页片单列表数组规则": ".public-list-box",
"首页片单是否Jsoup写法": "1",
"首页片单标题": "a&&title",
"首页片单链接": "a&&href",
"首页片单图片": ".lazy&&data-src",
"首页片单副标题": ".public-list-subtitle&&Text",
"首页片单链接加前缀": "https://lkvod.org",
"首页片单链接加后缀": "",
"分类起始页码": "1",
"分类链接": "https://lkvod.org/show/{cateId}--------{catePg}---.html",
"分类名称": "电影&剧集&综艺&动漫",
"分类名称替换词": "1&2&3&4",
"筛选数据": "ext",
//{cateId}
"筛选子分类名称": "",
"筛选子分类替换词": "",
//{class}
"筛选类型名称": "",
"筛选类型替换词": "*",
//{area}
"筛选地区名称": "",
"筛选地区替换词": "*",
//{year}
"筛选年份名称": "",
"筛选年份替换词": "*",
//{lang}
"筛选语言名称": "",
"筛选语言替换词": "*",
//{by}
"筛选排序名称": "最新&最热&评分",
"筛选排序替换词": "time&hits&score",
"分类截取模式": "1",
"分类列表数组规则": ".fadeInUp:has(.gen-movie-img)&&.public-list-box",
"分类片单是否Jsoup写法": "1",
"分类片单标题": "a&&title",
"分类片单链接": "a&&href",
"分类片单图片": ".lazy&&data-src",
"分类片单副标题": ".public-list-subtitle&&Text",
"分类片单链接加前缀": "https://lkvod.org",
"分类片单链接加后缀": "",
"搜索请求头参数": "User-Agent$PC_UA#accept$text/html",
"搜索链接": "https://lkvod.org/index.php/ajax/suggest?mid=1&wd={wd}&limit=10",
"POST请求数据": "wd={wd}",
"搜索截取模式": "0",
"搜索列表数组规则": "list",
"搜索片单是否Jsoup写法": "1",
"搜索片单图片": "pic",
"搜索片单标题": "name",
"搜索片单链接": "id",
"搜索片单副标题": "",
"搜索片单链接加前缀": "https://lkvod.org/voddetail/",
"搜索片单链接加后缀": ".html",
"链接是否直接播放": "0",
"直接播放链接加前缀": "",
"直接播放链接加后缀": "#isVideo=true#",
"直接播放直链视频请求头": "",
"详情是否Jsoup写法": "1",
"类型详情": "",
"年代详情": "",
"地区详情": "",
"演员详情": ".detail-info&&.slide-info,3&&Text!演员 :",
"简介详情": "#height_limit&&Text",
"线路列表数组规则": ".anthology-tab&&a",
"线路标题": "Text[排序:玉米]",
"播放列表数组规则": "body&&.anthology-list-play",
"选集列表数组规则": "li",
"选集标题链接是否Jsoup写法": "1",
"选集标题": "a&&Text",
"选集链接": "a&&href",
"是否反转选集序列": "0",
"选集链接加前缀": "https://lkvod.org",
"选集链接加后缀": "",
"分析MacPlayer": "0",
"是否开启手动嗅探": "1",
"手动嗅探视频链接关键词": ".mp4#.m3u8#.flv#obj/tos#video/tos#mime_type=video_mp4#x-oss-signature=",
"手动嗅探视频链接过滤词": ".html#=http#=https"
}
+1 -1
View File
@@ -4,7 +4,7 @@
"请求头参数": "User-Agent$MOBILE_UA#Referer$WebView",
"网页编码格式": "UTF-8",
"图片是否需要代理": "0",
"是否开启获取首页数据": "0",
"是否开启获取首页数据": "1",
"首页推荐链接": "http://www.yinghuadm.cn",
"首页列表数组规则": "body&&.module-main.tab-list.active",
"首页片单列表数组规则": ".module-item",
+86
View File
@@ -0,0 +1,86 @@
{
"规则名": "爱看影视",
"规则作者": "",
"请求头参数": "User-Agent$PC_UA#Referer$https://www.akysw.pro#accept$text/html",
"网页编码格式": "UTF-8",
"图片是否需要代理": "0",
"是否开启获取首页数据": "1",
"首页推荐链接": "https://www.akysw.pro",
"首页列表数组规则": "body&&.fadeInUp:has(.gen-movie-img)",
"首页片单列表数组规则": ".public-list-box",
"首页片单是否Jsoup写法": "1",
"首页片单标题": "a&&title",
"首页片单链接": "a&&href",
"首页片单图片": ".lazy&&data-src",
"首页片单副标题": ".public-list-prb&&Text",
"首页片单链接加前缀": "https://www.akysw.pro",
"首页片单链接加后缀": "",
"分类起始页码": "1",
"分类链接": "https://www.akysw.pro/index.php/api/vod?type={cateId}&class=&area=&lang=&version=&state=&letter=&page={catePg}&time=时间戳&key=md5(DS时间戳DCC147D11943AF75);post",
"分类名称": "电影&剧集&综艺&动漫&短剧",
"分类名称替换词": "1&2&3&4&20",
"筛选数据": "ext",
//{cateId}
"筛选子分类名称": "",
"筛选子分类替换词": "",
//{class}
"筛选类型名称": "",
"筛选类型替换词": "*",
//{area}
"筛选地区名称": "",
"筛选地区替换词": "*",
//{year}
"筛选年份名称": "",
"筛选年份替换词": "*",
//{lang}
"筛选语言名称": "",
"筛选语言替换词": "*",
//{by}
"筛选排序名称": "最新&最热&评分",
"筛选排序替换词": "time&hits&score",
"分类截取模式": "0",
"分类列表数组规则": "list",
"分类片单是否Jsoup写法": "1",
"分类片单标题": "vod_name",
"分类片单链接": "vod_id",
"分类片单图片": "vod_pic",
"分类片单副标题": "vod_remarks",
"分类片单链接加前缀": "https://www.akysw.pro/voddetail/",
"分类片单链接加后缀": ".html",
"搜索请求头参数": "User-Agent$PC_UA#accept$text/html",
"搜索链接": "https://www.akysw.pro/index.php/ajax/suggest?mid=1&wd={wd}&limit=10",
"POST请求数据": "wd={wd}",
"搜索截取模式": "0",
"搜索列表数组规则": "list",
"搜索片单是否Jsoup写法": "1",
"搜索片单图片": "pic",
"搜索片单标题": "name",
"搜索片单链接": "id",
"搜索片单副标题": "",
"搜索片单链接加前缀": "https://www.akysw.pro/voddetail/",
"搜索片单链接加后缀": ".html",
"链接是否直接播放": "0",
"直接播放链接加前缀": "",
"直接播放链接加后缀": "#isVideo=true#",
"直接播放直链视频请求头": "",
"详情是否Jsoup写法": "1",
"类型详情": "",
"年代详情": "",
"地区详情": "",
"演员详情": ".detail-info&&.slide-info,2&&Text!演员:",
"简介详情": "#height_limit&&Text",
"线路列表数组规则": ".anthology-tab&&a",
"线路标题": "Text",
"播放列表数组规则": "body&&.anthology-list-play",
"选集列表数组规则": "li",
"选集标题链接是否Jsoup写法": "1",
"选集标题": "a&&Text",
"选集链接": "a&&href",
"是否反转选集序列": "0",
"选集链接加前缀": "https://www.akysw.pro",
"选集链接加后缀": "",
"分析MacPlayer": "0",
"是否开启手动嗅探": "0",
"手动嗅探视频链接关键词": ".mp4#.m3u8#.flv#obj/tos",
"手动嗅探视频链接过滤词": ".html#=http#=https"
}
+81
View File
@@ -0,0 +1,81 @@
{
"规则名": "爱看电影",
"规则作者": "https://ikandyy.vip/",
"请求头参数": "User-Agent$MOBILE_UA#Referer$WebView",
"网页编码格式": "UTF-8",
"图片是否需要代理": "0",
"是否开启获取首页数据": "1",
"首页推荐链接": "https://www.ikandyy.com",
"首页列表数组规则": "body&&.module-main.tab-list.active",
"首页片单列表数组规则": ".module-item",
"首页片单是否Jsoup写法": "1",
"分类起始页码": "1",
"分类链接": "https://www.ikandyy.com/vodshow/{cateId}--------{catePg}---.html",
"分类名称": "电影&电视剧&综艺&动漫",
"分类名称替换词": "1&2&3&4",
"筛选数据": {},
//"筛选数据": "ext",
//{cateId}
"筛选子分类名称": "",
"筛选子分类替换词": "",
//{class}
"筛选类型名称": "",
"筛选类型替换词": "*",
//{area}
"筛选地区名称": "",
"筛选地区替换词": "*",
//{year}
"筛选年份名称": "",
"筛选年份替换词": "*",
//{lang}
"筛选语言名称": "",
"筛选语言替换词": "*",
//{by}
"筛选排序名称": "时间&人气&评分",
"筛选排序替换词": "time&hits&score",
"分类截取模式": "1",
"分类列表数组规则": "body&&.module-item",
"分类片单是否Jsoup写法": "1",
"分类片单标题": "a&&title",
"分类片单链接": "a&&href",
"分类片单图片": ".lazyload&&data-original",
"分类片单副标题": ".module-item-note&&Text",
"分类片单链接加前缀": "https://www.ikandyy.com",
"分类片单链接加后缀": "",
"搜索请求头参数": "User-Agent$MOBILE_UA",
"搜索链接": "https://www.ikandyy.com/vodsearch/{wd}----------{SearchPg}---.html",
"POST请求数据": "",
"搜索截取模式": "1",
"搜索列表数组规则": "body&&.module-item",
"搜索片单是否Jsoup写法": "1",
"搜索片单图片": ".lazyload&&data-original",
"搜索片单标题": ".module-card-item-title&&Text",
"搜索片单链接": "a&&href",
"搜索片单副标题": ".module-item-note&&Text",
"搜索片单链接加前缀": "https://www.ikandyy.com",
"搜索片单链接加后缀": "",
"链接是否直接播放": "0",
"直接播放链接加前缀": "",
"直接播放链接加后缀": "#isVideo=true#",
"直接播放直链视频请求头": "",
"详情是否Jsoup写法": "0",
"类型详情": "",
"年代详情": "",
"地区详情": "",
"演员详情": "主演:</span>&&</div>",
"简介详情": "introduction\">&&</p>",
"线路列表数组规则": "#y-playList&&.module-tab-item",
"线路标题": "Text",
"播放列表数组规则": "body&&.module-play-list-content",
"选集列表数组规则": "a",
"选集标题链接是否Jsoup写法": "1",
"选集标题": "a&&Text",
"选集链接": "a&&href",
"是否反转选集序列": "0",
"选集链接加前缀": "https://www.ikandyy.com",
"选集链接加后缀": "",
"分析MacPlayer": "0",
"是否开启手动嗅探": "0",
"手动嗅探视频链接关键词": ".mp4#.m3u8#.flv#video/tos",
"手动嗅探视频链接过滤词": ".html#=http"
}
+86
View File
@@ -0,0 +1,86 @@
{
"规则名": "番茶动漫",
"规则作者": "",
"请求头参数": "User-Agent$MOBILE_UA#Referer$https://www.fanchawu.cc#accept$text/html",
"网页编码格式": "UTF-8",
"图片是否需要代理": "0",
"是否开启获取首页数据": "1",
"首页推荐链接": "https://www.fanchawu.cc",
"首页列表数组规则": "body&&.fadeInUp:has(.gen-movie-img)",
"首页片单列表数组规则": ".public-list-box",
"首页片单是否Jsoup写法": "1",
"首页片单标题": "a&&title",
"首页片单链接": "a&&href!.html",
"首页片单图片": ".lazy&&data-src",
"首页片单副标题": ".public-list-prb&&Text",
"首页片单链接加前缀": "https://www.fanchawu.cc",
"首页片单链接加后缀": "",
"分类起始页码": "1",
"分类链接": "https://www.fanchawu.cc/index.php/api/vod?type={cateId}&class=&area=&lang=&version=&state=&letter=&page={catePg}&time=时间戳&key=md5(DS时间戳DCC147D11943AF75);post",
"分类名称": "TV&剧场&美漫&海外剧",
"分类名称替换词": "1&3&4&20",
"筛选数据": "ext",
//{cateId}
"筛选子分类名称": "",
"筛选子分类替换词": "",
//{class}
"筛选类型名称": "",
"筛选类型替换词": "*",
//{area}
"筛选地区名称": "",
"筛选地区替换词": "*",
//{year}
"筛选年份名称": "",
"筛选年份替换词": "*",
//{lang}
"筛选语言名称": "",
"筛选语言替换词": "*",
//{by}
"筛选排序名称": "最新&最热&评分",
"筛选排序替换词": "time&hits&score",
"分类截取模式": "0",
"分类列表数组规则": "list",
"分类片单是否Jsoup写法": "1",
"分类片单标题": "vod_name",
"分类片单链接": "vod_id",
"分类片单图片": "vod_pic",
"分类片单副标题": "vod_remarks",
"分类片单链接加前缀": "https://www.fanchawu.cc/voddetail/",
"分类片单链接加后缀": ".html",
"搜索请求头参数": "User-Agent$MOBILE_UA#accept$text/html",
"搜索链接": "https://www.fanchawu.cc/vodsearch/-------------.html?wd={wd}",
"POST请求数据": "wd={wd}",
"搜索截取模式": "1",
"搜索列表数组规则": "body&&.public-list-box",
"搜索片单是否Jsoup写法": "1",
"搜索片单图片": "img&&data-src",
"搜索片单标题": "a&&title",
"搜索片单链接": "a&&href",
"搜索片单副标题": ".public-list-prb&&Text",
"搜索片单链接加前缀": "https://www.fanchawu.cc",
"搜索片单链接加后缀": "",
"链接是否直接播放": "0",
"直接播放链接加前缀": "",
"直接播放链接加后缀": "#isVideo=true#",
"直接播放直链视频请求头": "",
"详情是否Jsoup写法": "1",
"类型详情": "",
"年代详情": "",
"地区详情": "",
"演员详情": ".detail-info&&.slide-info,2&&Text!演员:",
"简介详情": "#height_limit&&Text",
"线路列表数组规则": ".anthology-tab&&a",
"线路标题": "Text",
"播放列表数组规则": "body&&.anthology-list-play",
"选集列表数组规则": "li",
"选集标题链接是否Jsoup写法": "1",
"选集标题": "a&&Text",
"选集链接": "a&&href",
"是否反转选集序列": "0",
"选集链接加前缀": "https://www.fanchawu.cc",
"选集链接加后缀": "",
"分析MacPlayer": "0",
"是否开启手动嗅探": "1",
"手动嗅探视频链接关键词": ".mp4#.m3u8#.flv#video/tos#obj/tos#com/tos-cn",
"手动嗅探视频链接过滤词": ".html#=http#=https"
}
+81
View File
@@ -0,0 +1,81 @@
{
"规则名": "看影网",
"规则作者": "",
"请求头参数": "手机",
"网页编码格式": "UTF-8",
"图片是否需要代理": "0",
"是否开启获取首页数据": "1",
"首页推荐链接": "https://www.kanyingv.com",
"首页列表数组规则": "body&&.myui-vodlist",
"首页片单列表数组规则": "li",
"首页片单是否Jsoup写法": "1",
"分类起始页码": "1",
"分类链接": "https://www.kanyingv.com/so/{cateId}/-{by}------{catePg}---/",
"分类名称": "电影&电视剧&综艺&动漫",
"分类名称替换词": "movie&tv&variety&anime",
"筛选数据": {},
//"筛选数据": "ext",
//{cateId}
"筛选子分类名称": "",
"筛选子分类替换词": "",
//{class}
"筛选类型名称": "",
"筛选类型替换词": "*",
//{area}
"筛选地区名称": "",
"筛选地区替换词": "*",
//{year}
"筛选年份名称": "",
"筛选年份替换词": "*",
//{lang}
"筛选语言名称": "",
"筛选语言替换词": "*",
//{by}
"筛选排序名称": "时间&人气&评分",
"筛选排序替换词": "time&hits&score",
"分类截取模式": "1",
"分类列表数组规则": ".myui-vodlist&&li",
"分类片单是否Jsoup写法": "1",
"分类片单标题": "h4&&a&&Text",
"分类片单链接": "h4&&a&&href",
"分类片单图片": ".lazyload||.myui-vodlist__thumb&&style||data-original",
"分类片单副标题": ".pic-text&&Text",
"分类片单链接加前缀": "https://www.kanyingv.com",
"分类片单链接加后缀": "",
"搜索请求头参数": "User-Agent$手机",
"搜索链接": "https://www.kanyingv.com/search/{wd}----------{SearchPg}---/",
"POST请求数据": "",
"搜索截取模式": "1",
"搜索列表数组规则": ".myui-vodlist__media&&li",
"搜索片单是否Jsoup写法": "1",
"搜索片单图片": ".lazyload&&data-original",
"搜索片单标题": "h4&&a&&Text",
"搜索片单链接": "h4&&a&&href",
"搜索片单副标题": ".pic-text&&Text",
"搜索片单链接加前缀": "https://www.kanyingv.com",
"搜索片单链接加后缀": "",
"链接是否直接播放": "0",
"直接播放链接加前缀": "https://live.52sf.ga/huya/",
"直接播放链接加后缀": "#isVideo=true#",
"直接播放直链视频请求头": "authority$ku.peizq.online#Referer$https://play.peizq.online",
"详情是否Jsoup写法": "1",
"类型详情": "",
"年代详情": "",
"地区详情": "",
"演员详情": "",
"简介详情": ".content&&Text",
"线路列表数组规则": "body&&a[href^=#playlist]",
"线路标题": "Text",
"播放列表数组规则": "body&&.myui-content__list",
"选集列表数组规则": "li",
"选集标题链接是否Jsoup写法": "1",
"选集标题": "a&&Text",
"选集链接": "a&&href",
"是否反转选集序列": "0",
"选集链接加前缀": "https://www.kanyingv.com",
"选集链接加后缀": "",
"分析MacPlayer": "0",
"是否开启手动嗅探": "0",
"手动嗅探视频链接关键词": ".mp4#.m3u8#.flv#video/tos",
"手动嗅探视频链接过滤词": ".html#=http"
}
+87
View File
@@ -0,0 +1,87 @@
{
"规则名": "短剧五五",
"规则作者": "",
"请求头参数": "手机",
"网页编码格式": "UTF-8",
"图片是否需要代理": "0",
"是否开启获取首页数据": "1",
"首页推荐链接": "https://www.duanju55.com",
"首页列表数组规则": "body&&.FeaturedList_featuredBox",
"首页片单列表数组规则": ".FeaturedList_featuredItem",
"首页片单是否Jsoup写法": "1",
"首页片单标题": ".FeaturedList_bookName&&Text",
"首页片单链接": ".FeaturedList_bookName&&href",
"首页片单图片": ".image_imageItem&&src",
"首页片单副标题": ".FeaturedList_lastChapter&&Text",
"首页片单链接加前缀": "https://www.duanju55.com",
"首页片单链接加后缀": "",
"分类起始页码": "1",
"分类链接": "https://www.duanju55.com/index.php/vod/show/{class}id/{cateId}/page/{catePg}.html",
"分类名称": "全部",
"分类名称替换词": "1",
//"筛选数据": {},
"筛选数据": "ext",
//{cateId}
"筛选子分类名称": "",
"筛选子分类替换词": "",
//{class}
"筛选类型名称": "都市&赘婿&战神&古代&言情&历史&脑洞&玄幻&搞笑&喜剧&萌宝&神豪&奇幻&脑洞&强者&回归&甜宠&豪门&恩怨&复仇&神医&马甲&亲情&人物&无敌&重生&闪婚&职场&商战&穿越&年代&权谋&高手&下山&悬疑&家国&虐恋&古装&时空&之旅&仙侠&欢喜&冤家&传承&觉醒&情感&逆袭&家庭",
"筛选类型替换词": "class/都市/&class/赘婿/&class/战神/&class/古代/&class/言情/&class/历史/&class/脑洞/&class/玄幻/&class/搞笑/&class/喜剧/&class/萌宝/&class/神豪/&class/奇幻/&class/脑洞/&class/强者/&class/回归/&class/甜宠/&class/豪门/&class/恩怨/&class/复仇/&class/神医/&class/马甲/&class/亲情/&class/人物/&class/无敌/&class/重生/&class/闪婚/&class/职场/&class/商战/&class/穿越/&class/年代/&class/权谋/&class/高手/&class/下山/&class/悬疑/&class/家国/&class/虐恋/&class/古装/&class/时空/&class/之旅/&class/仙侠/&class/欢喜/&class/冤家/&class/传承/&class/觉醒/&class/情感/&class/逆袭/&class/家庭/",
//{area}
"筛选地区名称": "",
"筛选地区替换词": "*",
//{year}
"筛选年份名称": "",
"筛选年份替换词": "*",
//{lang}
"筛选语言名称": "",
"筛选语言替换词": "*",
//{by}
"筛选排序名称": "时间&人气&评分",
"筛选排序替换词": "time&hits&score",
"分类截取模式": "1",
"分类列表数组规则": ".BrowseList_listBox&&.BrowseList_listItem",
"分类片单是否Jsoup写法": "1",
"分类片单标题": ".BrowseList_bookName&&Text",
"分类片单链接": ".BrowseList_bookViewCount&&href",
"分类片单图片": ".image_imageItem&&src",
"分类片单副标题": ".BrowseList_lastChapter&&Text",
"分类片单链接加前缀": "https://www.duanju55.com",
"分类片单链接加后缀": "",
"搜索请求头参数": "User-Agent$手机",
"搜索链接": "https://www.duanju55.com/index.php/vod/search/page/1/wd/{wd}.html",
"POST请求数据": "searchword={wd}",
"搜索截取模式": "1",
"搜索列表数组规则": ".search_searchList&&.MTagBookList_tagBookItem",
"搜索片单是否Jsoup写法": "1",
"搜索片单图片": ".image_imageItem&&src",
"搜索片单标题": ".MTagBookList_bookName&&Text",
"搜索片单链接": ".MTagBookList_intro&&href",
"搜索片单副标题": ".image_imageItem&&alt",
"搜索片单链接加前缀": "https://www.duanju55.com",
"搜索片单链接加后缀": "",
"链接是否直接播放": "0",
"直接播放链接加前缀": "",
"直接播放链接加后缀": "",
"直接播放直链视频请求头": "",
"详情是否Jsoup写法": "0",
"类型详情": "",
"年代详情": "",
"地区详情": "",
"演员详情": "",
"简介详情": "",
"线路列表数组规则": "",
"线路标题": "",
"播放列表数组规则": "body&&.CatalogList_swiperBox",
"选集列表数组规则": "a",
"选集标题链接是否Jsoup写法": "1",
"选集标题": "a&&Text",
"选集链接": "a&&href",
"是否反转选集序列": "0",
"选集链接加前缀": "https://www.duanju55.com",
"选集链接加后缀": "",
"分析MacPlayer": "0",
"是否开启手动嗅探": "0",
"手动嗅探视频链接关键词": ".mp4#.m3u8#.flv#video/tos",
"手动嗅探视频链接过滤词": ".html#=http"
}
+53
View File
@@ -0,0 +1,53 @@
{
"规则名": "虎牙直播",
"规则作者": "香雅情",
"请求头参数": "手机",
"网页编码格式": "UTF-8",
"图片是否需要代理": "0",
"是否开启获取首页数据": "1",
"首页推荐链接": "clan://XYQTVBox/虎牙主播.html",
"首页列表数组规则": "body&&.list",
"首页片单列表数组规则": "a",
"首页片单是否Jsoup写法": "1",
"首页片单标题": "a&&Text",
"首页片单链接": "a&&href",
"首页片单图片": "a&&data-original",
"首页片单副标题": "a&&desc",
"首页片单链接加前缀": "https://lunbo.freetv.top/huya/",
"首页片单链接加后缀": "#GD线路$https://www.goodiptv.club/huya/'input'",
"分类起始页码": "1",
"分类链接": "https://live.cdn.huya.com/liveHttpUI/getLiveList?iGid={cateId}&iPageNo={catePg}&iPageSize=120",
"分类名称": "热门&网游&单机&娱乐&手游",
"分类名称替换词": "2336&1&7771&1663&3203",
"筛选数据": "ext",
"筛选子分类名称": "王者荣耀&云梦之星&绝地求生&英雄联盟&星秀&吃喝玩乐&主机游戏&和平精英&穿越火线&颜值&二次元&地下城与勇士&暴雪专区&一起看&我的世界||英雄联盟&lol云顶之弈&守望先锋归来&超击突破&穿越火线&地下城与勇士&炉石传说&魔兽世界&DOTA2&CS:GO&CFHD&DOTA1&QQ飞车&问道&魔兽争霸3&逆战&梦三国&坦克世界&起凡:群雄逐鹿&神武4电脑版&堡垒之夜&英魂之刃&网游竞技&暴雪专区&射击综合游戏&军事游戏&无畏契约&逆水寒&剑灵&冒险岛&永恒之塔&诛仙3&彩虹岛Online&热血江湖&传奇&炉石战棋&龙之谷&传奇类游戏&御龙在天&QQ三国&寻仙&天谕&剑网3&枪神纪&反恐精英Online&体育游戏&星际争霸&武林外传一世琴缘&战舰世界&生死狙击2&千年3&星际战甲&铁甲雄兵&斗战神&荒野行动PC版&暗黑破坏神&九阴真经&QQ华夏&天涯明月刀&丝路传说2&大唐无双零&QQ自由幻想&战争雷霆&使命召唤:战区&NBA2KOL系列&跑跑卡丁车&命运方舟&征途&梦想世界3&刀剑英雄&激战2&新倩女幽魂&诛仙世界&流放之路&FIFA Online系列&真·三国无双OL&神泣&轩辕传奇&天翼决&大话西游2&战地之王&造梦西游OL&生死狙击&完美世界:诸神之战&QQ仙侠传&战意&反恐行动online&蜀山:初章&希望OL&完美端游系列&天下&命运2&征途2&创世战车&全球使命3&天命西游&洛奇英雄传&剑侠世界&赛尔号&泡泡堂&蜀门&劲舞团&QQ幻想&古剑奇谭OL&QQ炫舞&新飞飞(FlyFF)&新剑侠情缘&热血江湖2&天堂&装甲战争&疾风之刃&起凡游戏三国争霸&征程&FIFA Online4&极光世界 弑神传&坦克大战&QQ幻想世界&使命召唤:现代战争&奇迹世界2&鹿鼎记&QQ音速&梦幻诛仙2&诺亚传说&飞龙在天传奇&天书奇谈&成吉思汗3&全球使命&街头篮球&权力的游戏 凛冬将至 页游&新挑战&星辰变&火线精英&自在西游&黑色沙漠&起凡:群雄逐鹿HD&斗破苍穹&赤壁&刀剑2&远征Online梦想版&Project Zomboid&奇迹:传奇&逍遥江湖零&黄易群侠传2&释厄英雄&反恐精英&炫舞时代&魔侠传&神魔大陆&EVE Online&无尽战区&全面战争:竞技场&千古风流&万王之王3&冰原之战&冒险岛2&云端王国&北地物语2&梦幻龙族II&数码精灵Online&倚天Ⅱ&神话&三国&九天神话&名将三国&阿克拉什:传承&最强军团&忍者村大战2&夺宝传世&300英雄&风云龙战天下&成吉思汗怀旧版&领地人生&笑傲江湖&上古世纪&劲乐团&蜀山剑侠传&上古封神&人类必须反击&热血轩辕OL&超激斗梦境&极品飞车Online&独孤求败&威尼斯崛起&蜀山神话&圣境传说&永久基地&火瀑&圣斗士星矢ol&无限法则&仙侠世界2&坠星大陆&霸刀群侠传online&闪烁之光&龙麒&画皮世界&黎明之光&神佑&创世联盟&泰亚史诗&使命召唤:黑色行动4&御天降魔传||战神:诸神黄昏&Dread Hunger&天天吃鸡&永劫无间&主机游戏&我的世界&方舟&单机热游&互动点播&怀旧游戏&逃离塔科夫&Apex英雄&部落:上升&卧龙:苍天陨落&俄罗斯钓鱼4&怪物猎人物语&怪物猎人:崛起&骑马与砍杀系列&死亡之夜&SCUM&饥荒&艾尔登法环&荒野大镖客2&恐惧之间&使命召唤系列&星球大战系列&怪物猎人世界&森林之子&互动剧游&恐鬼症&欧洲卡车模拟&极限竞速:地平线&DayZ独立版&战地5&阿尔比恩&盗贼之海&幽灵线:东京&纸人&育碧游戏&港诡实录&漫漫长夜&三国志&只狼:影逝二度&黑与白2&其他单机&Among Us&Dark and Darker&仙剑奇侠传七&罗布乐思&归家异途&霍格沃茨之遗&仁王2&岛&帝国神话&双人成行&灵魂筹码&九霄缳神记&都市:天际线&甜蜜之家&流放者柯南&鬼谷八荒&海底大作战&帝国时代4&深岩银河:下潜&猎人:荒野的召唤&大侠立志传&英灵神殿&Stray&洛克王国&石油骚动&消逝的光芒2&非对称派对游戏&真三国无双&魔法门之英雄无敌系列&海贼王 寻秘世界&音乐游戏&任天堂专区&扫雷&全面战争:三国&战术小队&文明6&全境封锁&流星蝴蝶剑&WWE 2K&哈迪斯&刺客信条&看门狗:军团&对马岛之魂&渡神记&全面战争&精灵与萤火意志&层层恐惧&伤害世界&拾荒者&英雄连&奥奇传说&缺氧&逃生者2&美丽水世界&机械迷城&沙石镇时光&禁闭求生&帝国时代系列&宝可梦:剑盾&武装突袭&十三月&糖豆人:终极淘汰赛&幽灵行动:荒野&战锤40K:暗潮&海贼王:热血燃烧&胡闹厨房&精灵宝可梦Let's Go&紫塞秋风&雨血前传:蜃楼&小骨:英雄杀手&最终幻想7:重制版&四海兄弟&FIFA足球&奥拉星&生化3:抵抗计划&戴森球计划&足球小将&新世界&环世界&无人深空&星露谷物语&游戏王&三国群英传8&实况足球系列&神秘海域4&塞尔达传说:荒野之息&路易鬼屋3&摔跤城大乱斗&恐怖黎明&罗马复兴&马里奥专区&人间地狱&冰汽Line truncated
"筛选子分类替换词": "2336&9521&2793&1&1663&100044&100032&3203&4&2168&2633&2&100043&2135&1732||1&5485&2174&7467&4&2&393&8&7&862&6079&6&9&107&4615&135&489&802&1612&3227&100117&1830&100023&100043&100141&100133&5937&2952&897&2243&446&1646&683&387&983&5751&15&2060&675&1090&734&1899&900&496&1918&100135&5&1661&1947&6091&878&627&2765&591&3185&1123&1009&1878&1219&1026&1584&1862&624&5911&3959&162&3058&2715&486&915&406&1579&7749&427&100079&324&2531&159&779&2975&618&6815&2471&7217&2291&2599&861&7761&1161&3034&1597&2942&677&2741&2953&1086&432&903&2755&440&4711&2420&2419&1892&2440&1582&586&386&1966&2276&334&11&678&3683&514&4359&2897&5713&766&45&1085&488&190&77&2225&641&939&206&7945&583&553&2550&7907&1877&5423&590&179&1867&142&1319&3917&133&42&7677&863&3353&55&296&1292&2318&5901&7155&1057&925&2350&1003&1204&1524&594&959&299&1053&1153&6741&1142&534&2369&772&1132&84&640&2282&288&1046&2469&217&1824&997&385&5691&2563&365&1200&216&822&447&399&1652&3189&2723&1337&91&7455&2814&337&41&2090&2713&2977&4429&676||7771&7601&2793&6219&100032&1732&1997&100002&5907&100125&3493&5011&1318&7859&5495&7101&6479&4783&6129&4245&74&5801&4319&6679&100137&554&3519&7943&6919&6205&475&2634&1125&4371&8115&3641&7669&5257&100139&5853&2303&2270&4505&38&3069&6163&7905&6509&5771&2949&7881&5795&3019&6821&6737&4059&5941&2201&6739&2772&6571&3101&4835&3647&2906&7993&6609&7745&2864&2585&7581&6101&1599&2096&5097&2761&100087&2349&3004&2360&2650&2342&426&2796&6153&1962&6155&6039&6231&3521&5895&2288&2337&6851&232&2848&2884&3015&2365&1834&7687&6065&708&5715&465&7823&6083&2794&3016&2473&4217&4375&6045&98&6565&5809&5995&1888&2846&5931&6523&6103&7239&4865&2566&2443&412&6425&2596&2486&2924&5719&7773&3435&2430&2120&5429&5725&6149&4249&7871&1807&1946&6151&7647&5307&1737&3289&6105&5243&51&896&37&111&5999&3275&5947&5235&40&1498&7685&6121&5695&7789&2344&6607&270&7885&175&61&7653&5743&2454&3981&2455&157&230&1446&1083&14&289&2965||1663&2165&2135&2633&6055&6791&100022&6245&4079&5367&100044&2168&6861&5123&2356&4089&5883&2752&2408&3793&7785&7759||3203&9521&2336&6131&6203&7185&5489&2413&7937&100029&100052&2928&2429&1751&1671&1669&2774&1749&7209&2477&1797&2439&4041&100004&100273&7449&100197&100036&5699&2852&100091&7529&6613&3483&100049&4769&6385&6437&3135&3115&5115&2568&5619&2411&2785&6909&6209&2639&4997&2688&4921&2647&2817&4237&6007&5669&7349&7215&2683&6745&3679&6159&7929&5977&3116&3841&2775&4337&2988&7825&4929&6259&2931&7725&2598&5133&2503&2620&2502&2811&2691&7177&3927&2760&6955&3719&2646&7183&2556&6619&6009&3082&6123&4413&2624&4545&7719&5985&2672&1715&5219&5479&6411&6649&2979&4341&3873&4035&2857&6727&3943&3061&6939&2891&5953&6049&6251&6657&2675&7781&2777&6767&2561&3071&5399&6463&8109&6027&6047&6119&7093&4613&6477&5975&6181&7107&4925&4977&7579&2736&2927&6931&6507&5411&5891&3064&3150&4137&3084&3639&485&5835&3885&3901&5925&3379&2991&4695&6859&6419&7019&3743&1674&7501&6557&3481&4451&7713&3027&2824&4087&6979&3331&7797&6631&7287&2551&7573&2868&6125&6225&5019&7889&4287&3087&2649&7837&4227&2609&6399&2615&7711&2444&7465&2830&6561&6415&2680&3925&7027&5365&4629&7893&7017&7127&6881&6247&1673&4649&3160&6943&5981&7291&6381&1739&5837&1694&7199&6877&6831&2838&6843&7361&7069&7451&7269&7191&7675&6635&7803&2957&6787&7681&4317&3847&6863&7795&6547&2584&4133&4471&2521&6581&7913&3745&1781&3829&2807&1755&6029&1685&2671&3827&4421&6923&3749&2867&3459&7631&4195&2625&1670&2744&1794&2655&7849&7059&7213&6667&7133&6543&3705&1672&4761&2930&6233&6299&3881&4995&2627&1784&6951&2626&4759&2511&7071&1987&3439&2648&2621&2778&3329&6405&3549&3757&1688&3143&6291&1667&2707&1759&6641&7037&6621&1677&6809&2875&2702&3215&1764&5425&6497&7899&3741&6793&4045&1679&6491&1719&6071&6927&5403&6439&7005&2758",
"分类截取模式": "0",
"分类列表数组规则": "vList",
"分类片单是否Jsoup写法": "1",
"分类片单标题": "sIntroduction",
"分类片单链接": "lProfileRoom",
"分类片单图片": "sScreenshot",
"分类片单副标题": "sNick",
"分类片单链接加前缀": "https://lunbo.freetv.top/huya/",
"分类片单链接加后缀": "#GD线路$https://www.goodiptv.club/huya/'input'",
"搜索请求头参数": "User-Agent$手机",
"搜索链接": "https://search.cdn.huya.com/?m=Search&do=getSearchContent&plt=m&q={wd}&uid=0&app=11&v=4&typ=-5&start=0@&rows=40",
"POST请求数据": "",
"搜索截取模式": "0",
"搜索列表数组规则": "response.3.docs",
"搜索片单是否Jsoup写法": "1",
"搜索片单图片": "game_screenshot",
"搜索片单标题": "game_nick",
"搜索片单链接": "room_id",
"搜索片单副标题": "gameName",
"搜索片单链接加前缀": "https://lunbo.freetv.top/huya/",
"搜索片单链接加后缀": "#GD线路$https://www.goodiptv.club/huya/'input'",
"链接是否直接播放": "1",
"直接播放链接加前缀": "",
"直接播放链接加后缀": "",
"直接播放直链视频请求头": "User-Agent$MXPlayer/1.86.0",
"是否开启手动嗅探": "1",
"手动嗅探视频链接关键词": "/huya",
"手动嗅探视频链接过滤词": ".html#=http"
}
+81
View File
@@ -0,0 +1,81 @@
{
"规则名": "骚火电影VIP",
"规则作者": "",
"请求头参数": "User-Agent$MOBILE_UA#accept-language$zh-CN,zh;q=0.8",
"网页编码格式": "UTF-8",
"图片是否需要代理": "0",
"是否开启获取首页数据": "0",
"首页推荐链接": "https://saohuo.tv/",
"首页列表数组规则": "body&&.v_list",
"首页片单列表数组规则": "li",
"首页片单是否Jsoup写法": "1",
"分类起始页码": "1",
"分类链接": "https://saohuo.tv/list/{cateId}-{catePg}.html[firstPage=https://saohuo.tv/list/{cateId}.html]",
"分类名称": "电影&电视剧&动漫",
"分类名称替换词": "1&2&13",
"筛选数据": {},
//"筛选数据": "ext",
//{cateId}
"筛选子分类名称": "",
"筛选子分类替换词": "",
//{class}
"筛选类型名称": "",
"筛选类型替换词": "*",
//{area}
"筛选地区名称": "",
"筛选地区替换词": "*",
//{year}
"筛选年份名称": "",
"筛选年份替换词": "*",
//{lang}
"筛选语言名称": "",
"筛选语言替换词": "*",
//{by}
"筛选排序名称": "时间&人气&评分",
"筛选排序替换词": "time&hits&score",
"分类截取模式": "1",
"分类列表数组规则": ".v_list&&li",
"分类片单是否Jsoup写法": "1",
"分类片单标题": "a&&title",
"分类片单链接": "a&&href",
"分类片单图片": "img&&data-original",
"分类片单副标题": ".v_note&&Text",
"分类片单链接加前缀": "https://saohuo.tv",
"分类片单链接加后缀": "",
"搜索请求头参数": "User-Agent$手机#Accept$text/html#accept-language$zh-CN,zh;q=0.8",
"搜索链接": "https://saohuo.tv/s-{wd}---------{SearchPg}.html",
"POST请求数据": "",
"搜索截取模式": "1",
"搜索列表数组规则": ".v_list&&li",
"搜索片单是否Jsoup写法": "1",
"搜索片单图片": "img&&data-original",
"搜索片单标题": "a&&title",
"搜索片单链接": "a&&href",
"搜索片单副标题": ".v_note&&Text",
"搜索片单链接加前缀": "https://saohuo.tv",
"搜索片单链接加后缀": "",
"链接是否直接播放": "0",
"直接播放链接加前缀": "",
"直接播放链接加后缀": "",
"直接播放直链视频请求头": "",
"详情是否Jsoup写法": "1",
"类型详情": "",
"年代详情": "",
"地区详情": "",
"演员详情": "",
"简介详情": ".p_txt&&Text",
"线路列表数组规则": ".from_list&&li",
"线路标题": "Text",
"播放列表数组规则": ".play_list&&li",
"选集列表数组规则": "a",
"选集标题链接是否Jsoup写法": "1",
"选集标题": "a&&Text",
"选集链接": "a&&href",
"是否反转选集序列": "1",
"选集链接加前缀": "https://saohuo.tv",
"选集链接加后缀": "",
"分析MacPlayer": "0",
"是否开启手动嗅探": "0",
"手动嗅探视频链接关键词": ".mp4#.m3u8#.flv#video/tos",
"手动嗅探视频链接过滤词": ".html#=http"
}
+64 -64
View File
@@ -1,84 +1,86 @@
# IPv4 Streams
AMC电影,http://61.221.215.25:8800/hls/43/index.m3u8
CCTV1,http://58.57.40.22:9901/tsfile/live/0001_1.m3u8
CCTV1,http://23.237.228.134/live5/CCTV1.m3u8
CCTV1,http://112.46.85.60:8009/hls/501/index.m3u8
CCTV1,http://120.238.94.10:9901/tsfile/live/1018_1.m3u8
CCTV1,http://183.11.239.36:808/hls/19/index.m3u8
CCTV1,http://61.136.172.236:9901/tsfile/live/0001_1.m3u8
CCTV10,http://58.57.40.22:9901/tsfile/live/1010_1.m3u8
CCTV10,http://27.41.245.32:801/hls/10/index.m3u8
CCTV10,http://23.237.228.134/live5/CCTV10.m3u8
CCTV10,http://120.238.94.10:9901/tsfile/live/1028_1.m3u8
CCTV10,http://183.11.239.36:808/hls/28/index.m3u8
CCTV10,http://120.211.62.180:8000/hls/10/index.m3u8
CCTV10,http://27.41.245.32:801/hls/10/index.m3u8
CCTV10,http://61.136.172.236:9901/tsfile/live/0010_1.m3u8
CCTV11,http://58.57.40.22:9901/tsfile/live/1011_1.m3u8
CCTV11,http://69.30.246.194/live/cctv11.m3u8
CCTV11,http://120.238.94.10:9901/tsfile/live/1029_1.m3u8
CCTV11,http://120.211.62.180:8000/hls/11/index.m3u8
CCTV11,http://61.136.172.236:9901/tsfile/live/0011_1.m3u8
CCTV12,http://58.57.40.22:9901/tsfile/live/1012_1.m3u8
CCTV12,http://23.237.228.134/live3/CCTV12.m3u8
CCTV12,http://69.30.246.194/live/cctv12.m3u8
CCTV12,http://120.238.94.10:9901/tsfile/live/1030_1.m3u8
CCTV12,http://112.46.85.60:8009/hls/507/index.m3u8
CCTV12,http://183.11.239.36:808/hls/30/index.m3u8
CCTV12,http://120.238.94.10:9901/tsfile/live/1030_1.m3u8
CCTV13,http://58.57.40.22:9901/tsfile/live/1013_1.m3u8
CCTV13,http://1.24.39.180:9003/hls/13/index.m3u8
CCTV13,http://183.11.239.36:808/hls/31/index.m3u8
CCTV13,http://120.211.62.180:8000/hls/13/index.m3u8
CCTV13,http://8.138.7.223/【公众号:榴芒电视】/cctv13.m3u8
CCTV14,http://58.57.40.22:9901/tsfile/live/1014_1.m3u8
CCTV14,http://23.237.228.134/live3/CCTV14.m3u8
CCTV14,http://69.30.246.194/live/cctv14.m3u8
CCTV14,http://27.41.245.32:801/hls/14/index.m3u8
CCTV14,http://120.211.62.180:8000/hls/14/index.m3u8
CCTV14,http://61.136.172.236:9901/tsfile/live/0014_1.m3u8
CCTV15,http://58.57.40.22:9901/tsfile/live/1015_1.m3u8
CCTV15,http://23.237.228.134/live3/CCTV15.m3u8
CCTV15,http://69.30.246.194/live/cctv15.m3u8
CCTV15,http://183.11.239.36:808/hls/102/index.m3u8
CCTV15,http://120.211.62.180:8000/hls/15/index.m3u8
CCTV16,http://69.30.246.194/live/cctv16.m3u8
CCTV16,http://39.152.103.17:8089/tsfile/live/1015_1.m3u8
CCTV16,http://183.11.239.36:808/hls/169/index.m3u8
CCTV17,http://58.57.40.22:9901/tsfile/live/0019_1.m3u8
CCTV17,http://23.237.228.134/live3/CCTV17.m3u8
CCTV17,http://120.238.94.10:9901/tsfile/live/1048_1.m3u8
CCTV17,http://120.211.62.180:8000/hls/17/index.m3u8
CCTV17,http://183.11.239.36:808/hls/35/index.m3u8
CCTV17,http://120.76.248.139/live/bfgd/4200000204.m3u8
CCTV17,http://120.211.62.180:8000/hls/17/index.m3u8
CCTV2,http://58.57.40.22:9901/tsfile/live/1001_1.m3u8
CCTV2,http://23.237.228.134/live5/CCTV2.m3u8
CCTV2,http://218.17.33.178:53290/tsfile/live/1002_1.m3u8
CCTV2,http://27.41.245.32:801/hls/2/index.m3u8
CCTV2,http://120.238.94.10:9901/tsfile/live/1019_1.m3u8
CCTV2,http://112.123.206.32:808/hls/2/index.m3u8
CCTV3,http://58.57.40.22:9901/tsfile/live/1002_1.m3u8
CCTV3,http://23.237.228.134/live5/CCTV3.m3u8
CCTV3,http://120.238.94.10:9901/tsfile/live/1020_1.m3u8
CCTV3,http://39.152.103.17:8089/tsfile/live/1002_1.m3u8
CCTV3,http://112.46.85.60:8009/hls/3/index.m3u8
CCTV3,http://183.11.239.36:808/hls/91/index.m3u8
CCTV4,http://58.57.40.22:9901/tsfile/live/1003_1.m3u8
CCTV4,http://120.238.94.10:9901/tsfile/live/1021_1.m3u8
CCTV4,http://221.226.51.220:50081/newlive/live/hls/4/live.m3u8
CCTV5,http://58.57.40.22:9901/tsfile/live/1004_1.m3u8
CCTV5,http://23.237.228.134/live5/CCTV5p.m3u8
CCTV5,http://23.237.228.134/live5/CCTV5.m3u8
CCTV5,http://120.238.94.10:9901/tsfile/live/1022_1.m3u8
CCTV5,http://23.237.228.134/live5/CCTV5p.m3u8
CCTV5,http://27.41.245.32:801/hls/5/index.m3u8
CCTV5,http://183.11.239.36:808/hls/93/index.m3u8
CCTV5,http://38.75.136.137:98/gslb/dsdqpub/cctv5p.m3u8?auth=testpub
CCTV5+,http://120.238.94.10:9901/tsfile/live/1023_1.m3u8
CCTV5+,http://120.211.62.180:8000/hls/18/index.m3u8
CCTV5+,http://61.136.172.236:9901/tsfile/live/0016_1.m3u8
CCTV5+,http://120.211.62.180:8000/hls/18/index.m3u8
CCTV5+,http://58.57.40.22:9901/tsfile/live/1005_1.m3u8
CCTV5+,http://222.169.85.8:9901/tsfile/live/0116_1.m3u8
CCTV5+,http://120.76.248.139/live/bfgd/4200000246.m3u8
CCTV6,http://58.57.40.22:9901/tsfile/live/1006_1.m3u8
CCTV6,http://27.41.245.32:801/hls/6/index.m3u8
CCTV6,http://183.11.239.36:808/hls/94/index.m3u8
CCTV6,http://182.150.23.74:808/hls/6/index.m3u8
CCTV6,http://61.136.172.236:9901/tsfile/live/0006_1.m3u8
CCTV6,http://183.11.239.36:808/hls/94/index.m3u8
CCTV6,http://120.76.248.139/live/bfgd/4200000065.m3u8
CCTV7,http://58.57.40.22:9901/tsfile/live/1007_1.m3u8
CCTV7,http://23.237.228.134/live5/CCTV7.m3u8
CCTV7,http://27.41.245.32:801/hls/7/index.m3u8
CCTV7,http://120.238.94.10:9901/tsfile/live/1025_1.m3u8
CCTV8,http://58.57.40.22:9901/tsfile/live/1008_1.m3u8
CCTV8,http://120.238.94.10:9901/tsfile/live/1026_1.m3u8
CCTV8,http://27.41.245.32:801/hls/8/index.m3u8
CCTV8,http://183.11.239.36:808/hls/96/index.m3u8
CCTV9,http://58.57.40.22:9901/tsfile/live/1009_1.m3u8
CCTV9,http://23.237.228.134/live5/CCTV9.m3u8
CCTV9,http://27.41.245.32:801/hls/9/index.m3u8
CCTV9,http://112.46.85.60:8009/hls/509/index.m3u8
CCTV9,http://120.238.94.10:9901/tsfile/live/1027_1.m3u8
CCTV世界地理,http://111.61.236.247:9081/hls/62/index.m3u8
CCTV世界地理,http://38.75.136.137:98/gslb/dsdqpub/sjdl.m3u8?auth=testpub
@@ -92,12 +94,12 @@ CCTV第一剧场,http://61.184.46.85:9901/tsfile/live/1021_1.m3u8?key=txiptv&pla
CCTV风云足球,http://27.41.245.32:801/hls/906/index.m3u8
CCTV风云足球,http://38.75.136.137:98/gslb/dsdqpub/fyzq.m3u8?auth=testpub
CCTV风云足球,http://111.61.236.247:9081/hls/58/index.m3u8
CHC动作电影,http://183.237.95.108:9901/tsfile/live/1006_1.m3u8?key=txiptv&playlive=0&authid=0
CHC动作电影,http://61.184.46.85:9901/tsfile/live/1024_1.m3u8?key=txiptv&playlive=1&authid=0
CHC动作电影,http://38.75.136.137:98/gslb/dsdqpub/chcdz.m3u8?auth=testpub
CHC家庭影院,http://61.184.46.85:9901/tsfile/live/1023_1.m3u8?key=txiptv&playlive=1&authid=0
CHC家庭影院,http://38.75.136.137:98/gslb/dsdqpub/chcjt.m3u8?auth=testpub
CHC电影,http://183.237.95.108:9901/tsfile/live/1008_1.m3u8?key=txiptv&playlive=0&authid=0
IPTV经典电影,http://43.138.0.72:35455/yy/1382754187
万州三峡移民,http://123.146.162.24:8017/c2F0hmi/1000/live.m3u8
万州三峡移民,http://123.146.162.24:8017/c2F0hmi/1000/live.m3u8?zzhongqd
万州综合,http://123.146.162.24:8017/iTXwrGs/800/live.m3u8?zzhongqd
万荣综合,http://60.222.246.220:19433/hls1.m3u8
@@ -106,13 +108,13 @@ IPTV经典电影,http://43.138.0.72:35455/yy/1382754187
东南卫视,http://23.237.228.134/live8/gansu.m3u8
东南卫视,http://36.32.174.67:60080/newlive/live/hls/33/live.m3u8
东南卫视,http://61.136.172.236:9901/tsfile/live/0137_1.m3u8
东南卫视,http://120.76.248.139/live/bfgd/4200000483.m3u8
东方卫视,http://223.105.252.8/PLTV/4/224/3221228150/index.m3u8
东方卫视,http://58.57.40.22:9901/tsfile/live/1030_1.m3u8
东方卫视,http://23.237.228.134/live6/dongnan.m3u8
东方卫视,http://69.30.246.194/live/dfws.m3u8
东方卫视,http://36.32.174.67:60080/newlive/live/hls/24/live.m3u8
中华小当家,http://61.221.215.25:8800/hls/40/index.m3u8
中华特产,http://120.76.248.139/live/bfgd/4200000158.m3u8
乐至综合,http://175.155.106.72:89/live1/live1.m3u8
乐至综合,http://175.155.106.72:89/live1/live1.m3u8?zsicd
乐至综合,http://175.155.106.72:89/live1/live1.m3u8?zsicd;http://rmlive.lzxrmtzx.com/live1/live1.m3u8?zsicd
云南卫视,http://58.57.40.22:9901/tsfile/live/1047_1.m3u8
@@ -134,20 +136,23 @@ IPTV经典电影,http://43.138.0.72:35455/yy/1382754187
兵团八师石河子新闻综合,http://124.88.144.73:1935/live/xwzh/playlist.m3u8?zxinjd
兵团卫视,http://183.11.239.36:808/hls/7/index.m3u8
兵团卫视,http://120.76.248.139/live/bfgd/4200000124.m3u8
内蒙古卫视,http://23.237.228.134/live8/neimenggu.m3u8
兵团卫视,http://218.13.170.98:9901/tsfile/live/0115_1.m3u8
内蒙古卫视,http://120.76.248.139/live/bfgd/4200000110.m3u8
内蒙古卫视,http://23.237.228.134/live8/neimenggu.m3u8
内蒙古卫视,http://60.16.0.216:5757/hls/41/index.m3u8
内蒙古卫视,http://183.11.239.36:808/hls/60/index.m3u8
内蒙古卫视,http://111.61.236.247:9081/hls/48/index.m3u8
农林卫视,http://120.76.248.139/live/bfgd/4200000122.m3u8
农林卫视,http://8.138.7.223/【公众号:榴芒电视】/农林卫视.m3u8
北京卡酷少儿,http://58.57.40.22:9901/tsfile/live/1060_1.m3u8
北京卫视,http://223.105.252.8/PLTV/4/224/3221228115/index.m3u8
北京卡酷少儿,http://218.13.170.98:9901/tsfile/live/1021_1.m3u8
北京卫视,http://58.57.40.22:9901/tsfile/live/1032_1.m3u8
北京卫视,http://183.11.239.36:808/hls/41/index.m3u8
北京卫视,http://124.116.183.146:9901/tsfile/live/0122_1.m3u8
北京卫视,http://120.211.62.180:8000/hls/35/index.m3u8
北京卫视,http://120.76.248.139/live/bfgd/4200000083.m3u8
厦门卫视,http://38.75.136.137:98/gslb/dsdqpub/xmws.m3u8?auth=testpub
厦门卫视,http://183.11.239.36:808/hls/17/index.m3u8
厦门卫视,http://125.42.151.45:9901/tsfile/live/0125_1.m3u8?key=txiptv&playlive=1&authid=0
合肥新闻,http://112.27.235.94:8000/hls/18/index.m3u8
吉林卫视,http://58.57.40.22:9901/tsfile/live/1050_1.m3u8
吉林卫视,http://23.237.228.134/live8/jilin.m3u8
@@ -159,17 +164,16 @@ IPTV经典电影,http://43.138.0.72:35455/yy/1382754187
四川卫视,http://58.57.40.22:9901/tsfile/live/1046_1.m3u8
四川卫视,http://39.152.103.17:8089/tsfile/live/1044_1.m3u8
四川卫视,http://120.238.94.10:9901/tsfile/live/1058_1.m3u8
四川科教,http://182.150.115.21:8030/pcgacg/pcgacg_0.m3u8
四海钓鱼,http://120.76.248.139/live/bfgd/4200000229.m3u8
大湾区卫视,http://222.128.55.152:9080/live/dwq.m3u8
大湾区卫视,http://183.11.239.36:808/hls/132/index.m3u8
天津卫视,http://58.57.40.22:9901/tsfile/live/1034_1.m3u8
天津卫视,http://23.237.228.134/live8/tianjing.m3u8
天津卫视,http://222.169.85.8:9901/tsfile/live/0135_1.m3u8
天津卫视,http://112.46.85.60:8009/hls/44/index.m3u8
天津卫视,http://111.61.236.247:9081/hls/29/index.m3u8
天津卫视,http://111.221.137.234:44330/tsfile/live/0132_1.m3u8?key=txiptv&playlive=0&authid=0
天津卫视,http://153.0.171.163:9901/tsfile/live/0135_1.m3u8?key=txiptv&playlive=1&authid=0
奎屯哈萨克语,http://218.84.12.186:8002/hls/main/playlist.m3u8
奎屯哈萨克语,http://218.84.12.186:8002/hls/main/playlist.m3u8?zxinjd
奎屯汉语,http://218.84.12.186:8001/hls/main/playlist.m3u8?zxinjd
宁夏卫视,http://58.57.40.22:9901/tsfile/live/1054_1.m3u8
宁夏卫视,http://120.238.94.10:9901/tsfile/live/1076_1.m3u8
@@ -177,79 +181,79 @@ IPTV经典电影,http://43.138.0.72:35455/yy/1382754187
宁夏卫视,http://111.61.236.247:9081/hls/51/index.m3u8
安徽卫视,http://58.57.40.22:9901/tsfile/live/1033_1.m3u8
安徽卫视,http://23.237.228.134/live8/anhui.m3u8
安徽卫视,http://222.214.208.34:59901/tsfile/live/0130_1.m3u8
安徽卫视,http://183.11.239.36:808/hls/40/index.m3u8
安徽卫视,http://61.136.172.236:9901/tsfile/live/0130_1.m3u8
安徽影视,http://112.27.235.94:8000/hls/24/index.m3u8
安徽综艺体育,http://112.27.235.94:8000/hls/25/index.m3u8
山东体育,http://61.156.228.12:8154/tsfile/live/1006_1.m3u8
山东体育,http://58.57.40.22:9901/tsfile/live/1020_1.m3u8
山东体育,http://61.156.228.12:8154/tsfile/live/1006_1.m3u8
山东体育,http://123.130.84.106:8154/tsfile/live/1006_1.m3u8
山东农科,http://58.57.40.22:9901/tsfile/live/1022_1.m3u8
山东卫视,http://183.11.239.36:808/hls/43/index.m3u8
山东卫视,http://36.32.174.67:60080/newlive/live/hls/42/live.m3u8
山东卫视,http://120.211.62.180:8000/hls/38/index.m3u8
山东卫视,http://61.136.172.236:9901/tsfile/live/0131_1.m3u8
山东卫视,http://182.150.23.74:808/hls/23/index.m3u8
山东卫视,http://120.76.248.139/live/bfgd/4200000099.m3u8
山东卫视,http://61.156.228.12:8154/tsfile/live/0131_1.m3u8
山东文旅,http://58.57.40.22:9901/tsfile/live/1023_1.m3u8
山东文旅,http://221.2.148.205:8154/tsfile/live/1004_1.m3u8?key=txiptv&playlive=1&authid=0
山东生活,http://58.57.40.22:9901/tsfile/live/1018_1.m3u8
山东综艺,http://58.57.40.22:9901/tsfile/live/1021_1.m3u8
山东齐鲁,http://61.156.228.12:8154/tsfile/live/1001_1.m3u8
山西卫视,http://119.39.9.8:9901/tsfile/live/0118_1.m3u8
山东齐鲁,http://123.130.84.106:8154/tsfile/live/1001_1.m3u8
山西卫视,http://23.237.228.134/live8/shanxi.m3u8
山西卫视,http://60.16.0.216:5757/hls/39/index.m3u8
山西卫视,http://119.39.9.8:9901/tsfile/live/0118_1.m3u8
山西卫视,http://38.75.136.137:98/gslb/dsdqpub/sxwshd.m3u8?auth=testpub
巴音郭楞州,http://58.57.40.22:9901/tsfile/live/1024_1.m3u8
广东体育,http://120.238.94.10:9901/tsfile/live/1012_1.m3u8
广东体育,http://183.11.239.36:808/hls/2/index.m3u8
广东体育,http://218.13.170.98:9901/tsfile/live/0019_1.m3u8
广东体育,http://74.91.26.218:82/live/gdty.m3u8
广东体育,http://116.77.33.98:44330/tsfile/live/1004_1.m3u8?key=txiptv&playlive=0&authid=0
广东卫视,http://223.105.252.8/PLTV/4/224/3221227445/index.m3u8
广东卫视,http://58.57.40.22:9901/tsfile/live/1039_1.m3u8
广东卫视,http://23.237.228.134/live6/guangdong.m3u8
广东卫视,http://222.169.85.8:9901/tsfile/live/0125_1.m3u8
广东卫视,http://120.238.94.10:9901/tsfile/live/1008_1.m3u8
广东卫视,http://183.11.239.36:808/hls/80/index.m3u8
广东新闻,http://116.77.33.98:44330/tsfile/live/1006_1.m3u8?key=txiptv&playlive=0&authid=0
广东民生,http://183.11.239.36:808/hls/18/index.m3u8
广东珠江,http://120.238.94.10:9901/tsfile/live/1009_1.m3u8
广东珠江,http://183.11.239.36:808/hls/83/index.m3u8
广州竞赛,http://8.138.7.223/tv/gzjs.m3u8
广西卫视,http://58.57.40.22:9901/tsfile/live/1049_1.m3u8
广西卫视,http://23.237.228.134/live6/guangxi.m3u8
广西卫视,http://23.237.228.134/live6/guizhou.m3u8
广西卫视,http://23.237.228.134/live6/guangxi.m3u8
广西卫视,http://60.16.0.216:5757/hls/45/index.m3u8
广西国际,http://38.75.136.137:98/gslb/dsdqpub/gxgj.m3u8?auth=testpub
广西新闻,http://38.75.136.137:98/gslb/dsdqpub/gxxw.m3u8?auth=testpub
延边卫视,http://120.76.248.139/live/bfgd/4200000117.m3u8
新疆卫视,http://58.57.40.22:9901/tsfile/live/1055_1.m3u8
新疆卫视,http://221.2.148.205:8154/tsfile/live/0110_1.m3u8
新疆卫视,http://183.11.239.36:808/hls/65/index.m3u8
新疆卫视,http://120.76.248.139/live/bfgd/4200000150.m3u8
新疆卫视,http://61.156.228.12:8154/tsfile/live/0110_1.m3u8
新疆卫视,http://221.2.148.205:8154/tsfile/live/0110_1.m3u8
新疆卫视,http://38.75.136.137:98/gslb/dsdqpub/xjws.m3u8?auth=testpub
新疆卫视,http://222.169.85.8:9901/tsfile/live/0110_1.m3u8
新疆卫视,http://36.32.174.67:60080/newlive/live/hls/47/live.m3u8
新视觉,http://120.76.248.139/live/bfgd/4200000249.m3u8
朝阳新闻综合,http://120.76.248.139/live/bfgd/4200000282.m3u8
江津新闻综合,http://222.179.155.21:1935/ch1.m3u8?zzhongqd
欢笑剧场,http://38.75.136.137:98/gslb/dsdqpub/hxjchd.m3u8?auth=testpub
江苏卫视,http://58.57.40.22:9901/tsfile/live/1031_1.m3u8
江苏卫视,http://69.30.246.194/live/jsws.m3u8
江苏卫视,http://27.41.245.32:801/hls/42/index.m3u8
江苏卫视,http://60.16.0.216:5757/hls/24/index.m3u8
江苏卫视,http://112.46.85.60:8009/hls/33/index.m3u8
江苏卫视,http://60.16.0.216:5757/hls/24/index.m3u8
江西卫视,http://58.57.40.22:9901/tsfile/live/1043_1.m3u8
江西卫视,http://23.237.228.134/live8/jiangxi.m3u8
江西卫视,http://36.32.174.67:60080/newlive/live/hls/22/live.m3u8
江西卫视,http://183.11.239.36:808/hls/44/index.m3u8
江西卫视,http://120.76.248.139/live/bfgd/4200000098.m3u8
江西卫视,http://36.32.174.67:60080/newlive/live/hls/31/live.m3u8
河北卫视,http://58.57.40.22:9901/tsfile/live/1044_1.m3u8
河北卫视,http://23.237.228.134/live8/hebei.m3u8
河北卫视,http://36.32.174.67:60080/newlive/live/hls/36/live.m3u8
河北卫视,http://111.61.236.247:9081/hls/17/index.m3u8
河南卫视,http://58.57.40.22:9901/tsfile/live/1048_1.m3u8
河南卫视,http://23.237.228.134/live6/henan.m3u8
河南卫视,http://120.238.94.10:9901/tsfile/live/1068_1.m3u8
河南卫视,http://120.211.62.180:8000/hls/40/index.m3u8
河南卫视,http://183.222.242.31:8088/hls/35/index.m3u8
河南卫视,http://61.136.172.236:9901/tsfile/live/0139_1.m3u8
浙江卫视,http://58.57.40.22:9901/tsfile/live/1029_1.m3u8
浙江卫视,http://23.237.228.134/live6/zhejiang.m3u8
浙江卫视,http://69.30.246.194/live/zjws.m3u8
海南卫视,http://58.57.40.22:9901/tsfile/live/1000_1.m3u8
海南卫视,http://120.76.248.139/live/bfgd/4200000473.m3u8
@@ -263,7 +267,7 @@ IPTV经典电影,http://43.138.0.72:35455/yy/1382754187
深圳卫视,http://58.57.40.22:9901/tsfile/live/1036_1.m3u8
深圳卫视,http://23.237.228.134/live6/shenzhen.m3u8
深圳卫视,http://38.64.72.148:80/hls/modn/list/4007/playlist.m3u8
深圳卫视,http://113.26.202.52:1299/tsfile/live/0126_1.m3u8
深圳卫视,http://111.61.236.247:9081/hls/38/index.m3u8
深圳卫视,http://183.11.239.36:808/hls/45/index.m3u8
深圳卫视,http://222.214.208.34:59901/tsfile/live/0126_1.m3u8
深圳卫视,http://111.221.137.234:44330/tsfile/live/1013_1.m3u8?key=txiptv&playlive=0&authid=0
@@ -272,9 +276,9 @@ IPTV经典电影,http://43.138.0.72:35455/yy/1382754187
湖北卫视,http://23.237.228.134/live6/hubei.m3u8
湖北卫视,http://120.238.94.10:9901/tsfile/live/1055_1.m3u8
湖北卫视,http://60.16.0.216:5757/hls/33/index.m3u8
湖北卫视,http://183.11.239.36:808/hls/46/index.m3u8
湖南卫视,http://23.237.228.134/live6/hunan.m3u8
湖北经视,http://61.184.46.85:9901/tsfile/live/0019_1.m3u8?key=txiptv&playlive=1&authid=0
湖南卫视,http://58.57.40.22:9901/tsfile/live/1028_1.m3u8
湖南卫视,http://23.237.228.134/live6/hunan.m3u8
湖南卫视,http://69.30.246.194/live/hnws.m3u8
玛纳斯综合,http://218.84.127.245:1026/hls/main1/playlist.m3u8
玛纳斯综合,http://218.84.127.245:1026/hls/main1/playlist.m3u8?zxinjd
@@ -306,7 +310,7 @@ IPTV经典电影,http://43.138.0.72:35455/yy/1382754187
辽宁卫视,http://23.237.228.134/live8/liaoning.m3u8
辽宁卫视,http://39.152.103.17:8089/tsfile/live/1024_1.m3u8
辽宁卫视,http://60.16.0.216:5757/hls/32/index.m3u8
辽宁卫视,http://183.11.239.36:808/hls/47/index.m3u8
辽宁卫视,http://120.211.62.180:8000/hls/37/index.m3u8
辽宁影视剧,http://120.76.248.139/live/bfgd/4200000070.m3u8
辽宁教育青少,http://120.76.248.139/live/bfgd/4200000075.m3u8
辽宁生活,http://120.76.248.139/live/bfgd/4200000073.m3u8
@@ -317,36 +321,33 @@ IPTV经典电影,http://43.138.0.72:35455/yy/1382754187
鄂托克旗电视台,http://110.19.181.138:10080/hls/F509Rh7GR/F509Rh7GR_live.m3u8?zneimd
重庆卫视,http://23.237.228.134/live6/chongqing.m3u8
重庆卫视,http://36.32.174.67:60080/newlive/live/hls/34/live.m3u8
重庆卫视,http://222.169.85.8:9901/tsfile/live/0142_1.m3u8
重庆卫视,http://60.16.0.216:5757/hls/36/index.m3u8
重庆卫视,http://111.61.236.247:9081/hls/41/index.m3u8
重庆新闻,http://38.75.136.137:98/gslb/dsdqpub/cqxw.m3u8?auth=testpub
重庆汽摩,http://222.179.155.21:1935/ch1.m3u8
重庆汽摩,http://183.230.184.51:65500/tntv1.m3u8
重庆汽摩,http://183.64.181.25:40023/rongchang01.m3u8
重庆汽摩,http://123.146.162.24:8017/iTXwrGs/800/live.m3u8
重庆汽摩,http://123.146.162.24:8017/c2F0hmi/1000/live.m3u8
重庆汽摩,http://120.76.248.139/live/bfgd/4200000168.m3u8
重庆汽摩,http://183.230.184.51:65500/tntv1.m3u8?zzhongqd
重庆汽摩,http://222.179.155.21:1935/ch1.m3u8?%E5%85%B3%E6%B3%A8%E5%BE%AE%E4%BF%A1%E5%85%AC%E4%BC%97%E5%8F%B7[%E6%99%B4%E5%9B%AD]
金鹰卡通,http://58.57.40.22:9901/tsfile/live/1059_1.m3u8
金鹰卡通,http://1.197.250.30:9901/tsfile/live/1020_1.m3u8?key=txiptv&playlive=1&authid=0
金鹰卡通,http://113.57.93.165:9900/tsfile/live/1000_1.m3u8?key=txiptv&playlive=1&authid=0
金鹰卡通,http://101.66.195.28:9901/tsfile/live/1000_1.m3u8?key=txiptv&playlive=0&authid=0
金鹰卡通,http://124.228.160.14:9901/tsfile/live/0011_1.m3u8?key=txiptv&playlive=1&authid=0
金鹰卡通,http://221.13.235.214:9901/tsfile/live/1010_1.m3u8?key=txiptv&playlive=1&authid=0
金鹰卡通,http://101.66.195.31:9901/tsfile/live/1000_1.m3u8?key=txiptv&playlive=0&authid=0
金鹰卡通,http://101.66.198.64:9901/tsfile/live/1000_1.m3u8?key=txiptv&playlive=0&authid=0
金鹰纪实,http://58.57.40.22:9901/tsfile/live/1070_1.m3u8
铜梁综合,http://183.64.174.171:40123/ch1.m3u8
铜梁综合,http://183.64.174.171:40123/ch1.m3u8?zzhongqd
陕西卫视,http://23.237.228.134/live6/sichuan.m3u8
陕西卫视,http://222.169.85.8:9901/tsfile/live/0136_1.m3u8
陕西卫视,http://61.156.228.12:8154/tsfile/live/0136_1.m3u8
陕西卫视,http://117.36.76.86:9901/tsfile/live/0136_1.m3u8?key=txiptv&playlive=1&authid=0
陕西卫视,http://222.169.85.8:9901/tsfile/live/0136_1.m3u8?key=txiptv&playlive=1&authid=0
陕西新闻咨询,http://112.46.105.20:8009/hls/18/index.m3u8
陕西秦腔,http://112.46.105.20:8009/hls/22/index.m3u8
陕西都市青春,http://112.46.105.20:8009/hls/19/index.m3u8
陕西银龄,http://112.46.105.20:8009/hls/20/index.m3u8
青海卫视,http://58.57.40.22:9901/tsfile/live/1057_1.m3u8
青海卫视,http://23.237.228.134/live8/shandong.m3u8
青海卫视,http://23.237.228.134/live8/qinghai.m3u8
青海卫视,http://120.238.94.10:9901/tsfile/live/1073_1.m3u8
青海卫视,http://120.76.248.139/live/bfgd/4200000111.m3u8
青海卫视,http://111.61.236.247:9081/hls/49/index.m3u8
靖天戏剧,http://220.135.64.124:5050/li-4gtv-4gtv058/index.m3u8?proxy=true
靖天戏剧,http://220.135.64.124:5050/4gtv-4gtv058/index.m3u8?proxy=true
靖天映画,http://220.135.64.124:5050/4gtv-4gtv055/index.m3u8?proxy=true
@@ -358,9 +359,8 @@ IPTV经典电影,http://43.138.0.72:35455/yy/1382754187
黎城综合,http://111.53.96.67:8081/live/1/index.m3u8
黎城综合,http://111.53.96.67:8081/live/1/index.m3u8?%E5%85%B3%E6%B3%A8%E5%BE%AE%E4%BF%A1%E5%85%AC%E4%BC%97%E5%8F%B7[%E6%99%B4%E5%9B%AD]
黑龙江卫视,http://58.57.40.22:9901/tsfile/live/1040_1.m3u8
黑龙江卫视,http://23.237.228.134/live6/heilongjiang.m3u8
黑龙江卫视,http://183.11.239.36:808/hls/48/index.m3u8
黑龙江卫视,http://61.136.172.236:9901/tsfile/live/0143_1.m3u8
黑龙江卫视,http://120.76.248.139/live/bfgd/4200000095.m3u8
黑龙江卫视,http://61.156.228.12:8154/tsfile/live/0143_1.m3u8
# IPv6 Streams