Sync all projects

This commit is contained in:
github-actions[bot]
2026-07-17 20:10:52 +00:00
parent 7e3499177e
commit 7b1c8bb187
61 changed files with 25279 additions and 10671 deletions
+19 -3
View File
@@ -36,9 +36,25 @@
},
"changeable": 1
},
{
"key": "油管py",
"name": "油管 | PY",
"type": 3,
"api": "./py/ytb.py",
"searchable": 1,
"quickSearch": 1,
"style": {
"type": "rect",
"ratio": 1.33
},
"ext": {
"count": "./lib/yt2.json"
},
"filterable": 1
},
{
"key": "油管so",
"name": "油管视频",
"name": "油管 | SO",
"type": 3,
"api": "csp_ProxySpider",
"searchable": 1,
@@ -46,7 +62,7 @@
"ext": {
"class": "Ytdl",
"ext": {
"youtube_txt": "./lib/youtube.json"
"youtube_txt": "./lib/yt2.json"
},
"style": {
"type": "rect",
@@ -64,7 +80,7 @@
"quickSearch": 1,
"ext": {
"class": "YoutubeSpidertv",
"ext": "./lib/youtube.json"
"ext": "./lib/yt2.json"
},
"style": {
"type": "rect",
+2 -2
View File
@@ -10,7 +10,7 @@
"ext": {
"class": "Ytdl",
"ext": {
"youtube_txt": "./lib/youtube.json"
"youtube_txt": "./lib/yt2.json"
},
"style": {
"type": "rect",
@@ -28,7 +28,7 @@
"quickSearch": 1,
"ext": {
"class": "YoutubeSpidertv",
"ext": "./lib/youtube.json"
"ext": "./lib/yt2.json"
},
"style": {
"type": "rect",
+9 -1
View File
@@ -108,6 +108,13 @@
"api": "csp_XBPQ",
"ext": "./js/s/大白鲨.json"
},
{
"key": "奇优",
"name": "奇优影院(没好",
"type": 3,
"api": "csp_XBPQ",
"ext": "./js/s/奇优.json"
},
{
"key": "2",
"name": "--- 2 ---"
@@ -1215,7 +1222,8 @@
"PPTV",
"migu"
],
"spider": "./jar/xbpq.jar;md5;./jar/xbpq.jar.md5",
"danmaku": "https://127.0.0.1:9978/proxy?do=danmaku&name={name}&episode={episode}",
"spider": "./jar/xb.jar",
"disabled_wallpaper": "./img/0.jpg",
"wallpaper": "./img/0.jpg",
"logo": "./img/pg.gif",
+8
View File
@@ -21,6 +21,14 @@
"api": "./py/51吸瓜.py",
"ext": ""
},
{
"key": "xp天堂",
"name": "XP天堂",
"type": 3,
"filterable": 0,
"changeable": 0,
"api": "./js/xp天堂.js"
},
{
"key": "Jable",
"name": "Jable",
BIN
View File
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
b5607360445087320ea3dadba0b543f9
ed8ac8071f355c035b2306a81ae46627
+26
View File
@@ -0,0 +1,26 @@
{
"请求头": "手机",
"主页url": "http://www.qiyoudy2.com/",
"状态": "地区:&&</p>",
"导演": "导演:&&</p>",
"主演": "主演:&&</p>",
"简介": "简介:&&</p>",
"数组": "<div class=\"stui-vodlist__box\">&&</a>",
"图片": "data-original=\"&&\"",
"标题": "title=\"&&\"",
"副标题": "text-right\">&&</span>",
"链接": "href=\"&&\"",
"搜索url": "http://www.qiyoudy2.com/search.php;post;searchword={wd}",
"搜索数组": "v-thumb stui-vodlist__thumb&&</a>[不包含:伦理#韩语中字#日语中字#高清中字#日本中字#高清#HD中字#日本#韩国#HD]",
"搜索图片": "data-original=\"&&\"",
"搜索标题": "title=\"&&\"",
"搜索副标题": "text-right\">&&</span>",
"搜索链接": "href=\"&&\"",
"线路数组": "href=\"#down&&/a>[替换:播放源1>>七月大佬一线#播放源2>>七月大佬二线#播放源3>>七月大佬三线#播放源4>>七月大佬四线]",
"线路标题": ">&&</a>",
"播放数组": "stui-content__playlist clearfix&&</ul>",
"播放列表": "<li>&&</li>",
"播放标题": ">&&</a>",
"分类url": "http://www.qiyoudy2.com/list/{cateId}_{catePg}.html;;ak",
"分类": "电影$1#电视剧$2#动漫$3#综艺$4#伦理$6"
}
+433
View File
@@ -0,0 +1,433 @@
import cheerio from 'assets://js/lib/cheerio.min.js';
const sites = [
'https://dzsx5k01kgm6y.cloudfront.net',//这个可以直连
'https://attack.bjidvlyog.com',
'https://agency.bjidvlyog.com/'
]
const baseUrl = sites[0];
const UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36";
function mylog() {
const TAG = "xp天堂18+";
console.log(TAG, ...arguments)
}
async function init(extend) { }
let cachedClasses = [];
let cachedFilters = {};
let hasParsed = false;
/**
* 1. 动态获取并解析全量的一级分类 (class)
*/
async function home(filter) {
try {
// 1. 请求首页或者含有这个导航 container 的网页源码
const html = await req(baseUrl).content; // 如果是在特定页面,把 baseUrl 改为对应路径
const $ = cheerio.load(html);
let classes = [];
let filters = {};
// 标准的排序规则
const sortFilter = [
{
key: "sort",
name: "排序",
value: [
{ n: "最近更新", v: "update" },
{ n: "最高收藏", v: "favorite" },
{ n: "近期最佳", v: "hot" },
{ n: "最多观看", v: "watch" }
]
}
];
// 2. 扫一遍所有的 container 区块,全量榨干“选片”和“标签”
$('.app-nav .container').each((index, element) => {
// 抓取区块的标题(比如“选片”)
const blockTitle = $(element).find('.title-box h2').text().trim();
// === 自动解析【选片主题】块 ===
if (blockTitle.includes("选片") || blockTitle.includes("主题")) {
$(element).find('a.tjtagmanager').each((i, el) => {
const name = $(el).text().trim();
let href = $(el).attr('href') || '';
// 砍掉末尾自带的 /favorite/ 或 /update/,还原成纯净的 ID 路径
// 例如: /theme/detail/64/favorite/ -> /theme/detail/64
href = href.replace(/\/(favorite|update|hot|watch)\/?$/, '');
if (href && name) {
classes.push({ type_id: href, type_name: name });
filters[href] = sortFilter; // 给它绑定排序筛选
}
});
}
// === 自动解析【平级标签】块 ===
// 根据特征:含有 .tag 类的 a 标签
if ($(element).find('a.tag').length > 0) {
$(element).find('a.tag').each((i, el) => {
const name = $(el).text().trim();
let href = $(el).attr('href') || '';
// 砍掉末尾可能自带的排序后缀(如 /hot/)和开头的斜杠,还原成纯净的 ID 路径
// 例如: /tags/9540/hot/ -> /tags/9540
href = href.replace(/\/(favorite|update|hot|watch)\/?$/, '');
if (href && name) {
// 加上前缀或者小图标区分标签和主题
classes.push({ type_id: href, type_name: `🏷️ ${name}` });
filters[href] = sortFilter; // 给标签也绑定平级的排序筛选
}
});
}
});
// 3. 缓存结果,防止后续调用 homeFilter 时二次请求浪费时间
// 暂时过滤资讯和回家
cachedClasses = classes.filter(item => !item.type_name.includes("资讯")&&!item.type_name.includes('回家'));
cachedFilters = filters;
hasParsed = true;
return JSON.stringify({
class: cachedClasses,
filters: await homeFilter()
});
} catch (e) {
console.error("❌ 全自动解析 class 失败: ", e.message);
// 崩溃兜底,防止壳子黑屏
return JSON.stringify({ class: [] });
}
}
/**
* 2. 完美的平级筛选逻辑
*/
async function homeFilter() {
mylog("开始解析筛选逻辑");
// 如果已经解析过了,直接扔出缓存结果
if (hasParsed) {
return cachedFilters;
}
// 理论上壳子会先执行 home 再执行 homeFilter,如果未解析则返回空对象防错
return {};
}
function fixVodName(name = "") {
return name.trim().split(" ").slice(1, -1).join("");
}
// async function parseArticleList(html) {
// // 确保已经加载了 cheerio
// const $ = cheerio.load(html);
// const list = [];
// // 针对每个视频卡片进行遍历
// $('.video-img-box').each((index, element) => {
// const titleEl = $(element).find('h3.title a.text');
// const imgEl = $(element).find('img.zximg');
// const descEl = $(element).find('p.sub-title');
// // 提取核心数据
// const vod_id = titleEl.attr('href') || '';
// const vod_name = titleEl.text().trim();
// // 关键点:提取自定义属性 z-image-loader-url
// const vod_pic = imgEl.attr('z-image-loader-url') || '';
// // 提取备注(简介/日期)
// const vod_remarks = descEl.text().trim();
// // 过滤掉无效数据(如果没有链接或标题则跳过)
// if (vod_id && vod_name) {
// list.push({
// vod_id: vod_id, // 对应详情页接口的参数
// vod_name: vod_name, // 列表显示的标题
// vod_pic: vod_pic, // 封面图
// vod_remarks: vod_remarks // 列表右上角的备注信息
// });
// }
// });
// return JSON.stringify({ list: list });
// }
// ⭐ 优化 1:分类页采用 Promise.all 并发多线程解析
async function category(tid, pg, filter, extend) {
try {
if(!tid) return JSON.stringify({ list: [] });
pg = pg || 1;
// const url = baseUrl + tid + (extend.type || '') + `/${pg}/`;
const sort = extend.sort || '';
let url = `${baseUrl}${tid}/${sort}/${pg}/`;
mylog(`🚀 正在请求分类URL: ${url}`);
// if (tid.includes('article')) {
// url = baseUrl + tid
// mylog(`🚀 正在请求分类URL: ${url}`);
// const html = (await req(url)).content;
// const $ = cheerio.load(html);
// return parseArticleList(html)
// }
const html = (await req(url)).content;
const $ = cheerio.load(html);
const videoElements = $('.col-6.col-sm-4.col-lg-3').toArray();
// 将每一项的解析包装成独立的异步任务(不阻塞彼此)
const tasks = videoElements.map(async (el) => {
const item = $(el).find('.video-img-box a');
const href = item.attr('href') || '';
if (href.includes('/videos/')) {
const vod_id = href;
let vod_name = $(el).find('.title a').text().trim();
vod_name = fixVodName(vod_name);
const watchCount = $(el).find('span[class^="interaction_watch_count_"]').text().trim() || '';
const vod_remarks = watchCount && (watchCount + "播放");
const vod_year = $(el).find('.label').text().trim();
let vod_pic = $(el).find('img.zximg').attr('z-image-loader-url') || '';
// 并发执行:所有的图片解密网络请求同时发出
vod_pic = await getRealImgurl(vod_pic);
return {
vod_id,
vod_name,
vod_pic,
vod_year,
vod_remarks,
land: 1,
ratio: 1.78
};
}
return null;
});
// ⭐ 核心:静静等待所有并发任务一起完成
const results = await Promise.all(tasks);
// 过滤掉广告(null数据)
let list = results.filter(item => item !== null);
// 分页逻辑
let total = $('ul.dx-pager ').attr("data-rec-total");
let perPageCount = $('ul.dx-pager ').attr("data-rec-per-page");
const pagecount = Math.ceil(total / perPageCount);
mylog(`category 成功并发抓取有效视频数: ${list.length}`);
return JSON.stringify({ list, pagecount });
} catch (e) {
mylog(e);
return JSON.stringify({ list: [] });
}
}
/**
* 专用函数:解析“文章类型”页面
*/
// async function parseArticleDetail($, id) {
// const vod_name = $('h1').text().trim();
// // 优先读取 textarea 的 Markdown 内容
// const vod_content = $('textarea').text().trim() || $('.text-content').text().trim();
// let play_url = "";
// // 逻辑:从 Markdown 内容中正则提取播放地址
// const match = vod_content.match(/\(\/(videos|play)\/([^\/]+)\/\)/);
// if (match) {
// play_url = match[0].replace(/[()]/g, '');
// } else {
// // 兜底:搜索页面上的链接
// const link = $('a[href*="/videos/"]').first().attr('href');
// if (link) play_url = link;
// }
// return JSON.stringify({
// list: [{
// vod_name: vod_name,
// vod_content: vod_content,
// vod_play_from: play_url ? "XP天堂" : "文章内容",
// vod_play_url: play_url ? `立即播放$${play_url}` : ""
// }]
// });
// }
async function detail(vid) {
try {
const url = baseUrl + vid;
const html = (await req(url)).content;
const $ = cheerio.load(html);
// if (vid.includes('/article/')) {
// return await parseArticleDetail($, vid);
// }
let vod_name = $('h1.my-foldable-content').text().trim();
let vod_pic = $('#player').attr('data-src') || '';
vod_pic = await getRealImgurl(vod_pic);
// 🔍 1. 精准提取标签,确保没有任何前后空格
let tagsArray = [];
$('h5.tags a').each((i, el) => {
let tagName = $(el).text().trim();
if (tagName) tagsArray.push(tagName);
});
let vod_actor = tagsArray.join('/');
let vod_class = tagsArray.join(' ');
// 🔍 3. 备用保险:利用 CLICKER 规则,在简介里生成绝对能跳转的超链接
let vod_content = "(todo)标签快捷搜索:\n";
tagsArray.forEach(tag => {
// 拼接蜂蜜专属的底层的 CLICKER 格式
vod_content += `[a=cr:{"action":"category","key":"${tag}"}/]【${tag}】[/a] `;
});
// 提取播放地址
const regex = /https?:\/\/[^\s"'`]+\.m3u8(?:\?[^\s"'`]+)?/g;
const match = html.match(regex);
let hlsUrl = match ? match[0] : '';
const lines = ["hls线路"];
const vod_play_from = lines.join("$$$");
const playlistArray = [`正片\$${hlsUrl}`];
const vod_play_url = playlistArray.join('$$$');
const watchCount = $('.video-info span[class^="interaction_watch_count_"]').text().trim().toUpperCase() || '';
const favorite_count = $('#bind_collect_count').text().trim().toUpperCase() || '';
let vod_remarks = watchCount && (watchCount + "播放");
vod_remarks += favorite_count && (" | " + favorite_count + "收藏");
const back = {
vod_id: vid,
vod_remarks,
vod_name: vod_name,
vod_pic: vod_pic,
vod_content: vod_content, // 👈 简介里会显示高亮可点击的标签
vod_actor: vod_actor, // 👈 演员药丸标签(已剔除空格坑)
vod_class: vod_class, // 👈 类型标签(多重兼容兜底)
vod_play_from,
vod_play_url
};
return JSON.stringify({ list: [back] });
} catch (e) {
mylog(e);
return JSON.stringify({ list: [] });
}
}
// ⭐ 优化 2:搜索页同样采用 Promise.all 并发加速
async function search(key, quick, page) {
try {
page = page || 1;
const url = baseUrl + `/search/${key}/${page}/`;
mylog(`正在搜索: ${url}`);
const html = (await req(url)).content;
const $ = cheerio.load(html);
const searchElements = $('.video-img-box').toArray();
const tasks = searchElements.map(async (el) => {
const a = $(el).find('.img-box > a');
const vod_id = $(a).attr('href') || '';
const vod_name = $(a).find('img').attr('alt') || '';
let vod_pic = $(a).find('img.zximg').attr('z-image-loader-url') || '';
if (vod_pic) {
vod_pic = await getRealImgurl(vod_pic);
}
const vod_remarks = $(el).find('.absolute-bottom-right .label').text().trim();
return {
vod_id: vod_id,
vod_name: fixVodName(vod_name),
vod_pic: vod_pic,
vod_remarks: vod_remarks
};
});
const list = await Promise.all(tasks);
// 分页逻辑
let total = $('ul.dx-pager ').attr("data-rec-total");
let perPageCount = $('ul.dx-pager ').attr("data-rec-per-page");
const pagecount = Math.ceil(total / perPageCount);
return JSON.stringify({
list,
pagecount
});
} catch (e) {
mylog(e);
return JSON.stringify({ list: [] });
}
}
async function play(flag, id, vipFlags) {
return JSON.stringify({
parse: 0,
url: id,
header: { "User-Agent": UA, "Referer": baseUrl }
});
}
async function getRealImgurl(imgurl) {
try {
if (!imgurl) return "";
let res = await req(imgurl, {
method: "get",
headers: {
"User-Agent": UA,
"Referer": "https://wuabeza.gyqspl.cn/"
},
buffer: 2
});
const encryptedBase64 = res.content;
if (!encryptedBase64) return "";
let realImageBase64 = aesX(
"AES/CBC/No",
false,
encryptedBase64,
true,
"f5d965df75336270",
"97b60394abc2fbe1",
true
);
if (!realImageBase64) return "";
let ext = "jpeg";
if (imgurl.toLowerCase().indexOf(".gif") !== -1) {
ext = "gif";
} else if (imgurl.toLowerCase().indexOf(".png") !== -1) {
ext = "png";
}
const back = "data:image/" + ext + ";base64," + realImageBase64;
// ⭐ 优化 3:【核心改动】删除了原先直接打印超长 base64 的 mylog,改为只打印长度,解放系统 CPU
// mylog("[base64] ", back);
return back;
} catch (e) {
return "";
}
}
export default { init, home, category, detail, search, play };
+14 -22
View File
@@ -177,26 +177,18 @@
"filterable": 1,
"timeout": 60,
"ext": {
"key": "PanSouGo",
"name": "PanSou",
"type": 3,
"api": "csp_PanSouGo",
"searchable": 1,
"changeable": 0,
"ext": {
"token": "./lib/tokenm.json",
"siteurl": "",
"proxy": "noproxy",
"danmu": "0",
"plugins": "all",
"panlist": "all",
"filters": {
"include": [],
"exclude": [
"广告",
"预告"
]
}
"token": "./lib/tokenm.json",
"siteurl": "",
"proxy": "noproxy",
"danmu": "0",
"plugins": "all",
"panlist": "all",
"filters": {
"include": [],
"exclude": [
"广告",
"预告"
]
}
}
},
@@ -314,7 +306,7 @@
"changeable": 1,
"filterable": 1,
"timeout": 60,
"ext": "./lib/tokenm.json$$$http://www.libvio.mov/$$$noproxy$$$1"
"ext": "./lib/tokenm.json$$$https://www.libvio.io/$$$noproxy$$$1"
},
{
"key": "Guazi",
@@ -336,7 +328,7 @@
"changeable": 1,
"filterable": 1,
"timeout": 60,
"ext": "./lib/tokenm.json$$$https://www.hdmoli.pro/$$$proxy$$$1$$$./lib/moli.json"
"ext": "./lib/tokenm.json$$$https://www.hdmoli.com/$$$noproxy$$$1$$$./lib/moli.json"
},
{
"key": "美剧迷",
+1573
View File
@@ -0,0 +1,1573 @@
#coding=utf-8
#!/usr/bin/python
import re
import json
import html
import time
from urllib.parse import quote, unquote, parse_qs, urlencode, urlparse, urlunparse, urljoin
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
from base.spider import Spider
YOUTUBE_CLASSES = [
{"type_id": "电影", "type_name": "电影"},
{"type_id": "直播", "type_name": "直播"},
{"type_id": "音乐", "type_name": "音乐"},
{"type_id": "HDR", "type_name": "HDR"},
{"type_id": "免费", "type_name": "免费"},
{"type_id": "短劇", "type_name": "短剧"},
{"type_id": "动画片", "type_name": "动画片"}
]
CATEGORY_FILTERS = {
"电影": [
{"key": "topic", "name": "官方分类", "value": [{"n": "电影", "v": "电影"}, {"n": "电影与动画", "v": "电影与动画"}, {"n": "电视节目", "v": "电视节目"}]},
{"key": "tid", "name": "地区", "value": [{"n": "大陆", "v": "大陆"}, {"n": "香港", "v": "香港"}, {"n": "台湾", "v": "台湾"}, {"n": "美国", "v": "美国"}, {"n": "韩国", "v": "韩国"}, {"n": "日本", "v": "日本"}]},
{"key": "date", "name": "排序/时间", "value": [{"n": "默认", "v": ""}, {"n": "最新", "v": "latest"}, {"n": "最热", "v": "hottest"}, {"n": "评分最高", "v": "favorite"}, {"n": "当天", "v": "day"}, {"n": "本周", "v": "week"}, {"n": "本月", "v": "month"}]}
],
"直播": [
{"key": "topic", "name": "官方分类", "value": [{"n": "新闻直播", "v": "新闻直播"}, {"n": "游戏直播", "v": "游戏直播"}, {"n": "体育直播", "v": "体育直播"}, {"n": "音乐直播", "v": "音乐直播"}]},
{"key": "tid", "name": "直播类型", "value": [{"n": "全部直播", "v": "全部直播"}, {"n": "游戏", "v": "游戏"}, {"n": "新闻", "v": "新闻"}, {"n": "体育", "v": "体育"}, {"n": "音乐现场", "v": "音乐现场"}, {"n": "生活", "v": "生活"}]},
{"key": "date", "name": "排序/时间", "value": [{"n": "默认", "v": ""}, {"n": "最新", "v": "latest"}, {"n": "最热", "v": "hottest"}, {"n": "评分最高", "v": "favorite"}, {"n": "当天", "v": "day"}, {"n": "本周", "v": "week"}, {"n": "本月", "v": "month"}]}
],
"音乐": [
{"key": "topic", "name": "官方分类", "value": [{"n": "音乐", "v": "音乐"}, {"n": "流行音乐", "v": "流行音乐"}, {"n": "摇滚乐", "v": "摇滚乐"}, {"n": "嘻哈音乐", "v": "嘻哈音乐"}, {"n": "电子音乐", "v": "电子音乐"}, {"n": "重金属", "v": "重金属"}, {"n": "重金属根源雷鬼", "v": "重金属根源雷鬼"}, {"n": "Dub", "v": "Dub"}, {"n": "Bass", "v": "Bass"}]},
{"key": "tid", "name": "形式/场景", "value": [{"n": "MV", "v": "MV"}, {"n": "现场", "v": "现场"}, {"n": "翻唱", "v": "翻唱"}, {"n": "精选", "v": "精选"}, {"n": "车载", "v": "车载"}]},
{"key": "date", "name": "排序/时间", "value": [{"n": "默认", "v": ""}, {"n": "最新", "v": "latest"}, {"n": "最热", "v": "hottest"}, {"n": "评分最高", "v": "favorite"}, {"n": "当天", "v": "day"}, {"n": "本周", "v": "week"}, {"n": "本月", "v": "month"}]}
],
"HDR": [
{"key": "tid", "name": "画质类型", "value": [{"n": "HDR", "v": "HDR"}, {"n": "杜比", "v": "杜比"}, {"n": "4K", "v": "4K"}, {"n": "8K", "v": "8K"}, {"n": "12K", "v": "12K"}, {"n": "16K", "v": "16K"}]},
{"key": "topic", "name": "关联主题(加画质)", "value": [{"n": "自然+8K", "v": "自然+8K"}, {"n": "电影+4K", "v": "电影+4K"}, {"n": "风景+HDR", "v": "风景+HDR"}]},
{"key": "date", "name": "排序/时间", "value": [{"n": "默认", "v": ""}, {"n": "最新", "v": "latest"}, {"n": "最热", "v": "hottest"}, {"n": "评分最高", "v": "favorite"}, {"n": "当天", "v": "day"}, {"n": "本周", "v": "week"}, {"n": "本月", "v": "month"}]}
],
"免费": [
{"key": "tid", "name": "免费内容", "value": [{"n": "免费电影", "v": "免费电影"}, {"n": "免费电视剧", "v": "免费电视剧"}, {"n": "免费纪录片", "v": "免费纪录片"}, {"n": "免费音乐", "v": "免费音乐"}, {"n": "免费课程", "v": "免费课程"}, {"n": "免费直播", "v": "免费直播"}]},
{"key": "topic", "name": "关联主题(加免费)", "value": [{"n": "电影+免费", "v": "电影+免费"}, {"n": "教育+免费", "v": "教育+免费"}, {"n": "音乐+免费", "v": "音乐+免费"}]},
{"key": "date", "name": "排序/时间", "value": [{"n": "默认", "v": ""}, {"n": "最新", "v": "latest"}, {"n": "最热", "v": "hottest"}, {"n": "评分最高", "v": "favorite"}, {"n": "当天", "v": "day"}, {"n": "本周", "v": "week"}, {"n": "本月", "v": "month"}]}
],
"短劇": [
{"key": "date", "name": "排序/时间", "value": [{"n": "默认", "v": ""}, {"n": "最新", "v": "latest"}, {"n": "最热", "v": "hottest"}, {"n": "评分最高", "v": "favorite"}, {"n": "当天", "v": "day"}, {"n": "本周", "v": "week"}, {"n": "本月", "v": "month"}]},
{"key": "tid", "name": "地区/平台", "value": [{"n": "全部", "v": ""}, {"n": "抖音", "v": "抖音 短剧"}, {"n": "快手", "v": "快手 短剧"}, {"n": "大陆", "v": "大陆 短剧"}, {"n": "香港", "v": "香港 短剧"}, {"n": "澳門", "v": "澳門 短剧"}, {"n": "台湾", "v": "台湾 短剧"}, {"n": "新加坡", "v": "新加坡 短剧"}, {"n": "馬來西亞", "v": "馬來西亞 短剧"}, {"n": "泰國", "v": "泰國 短剧"}, {"n": "越南", "v": "越南 短剧"}, {"n": "印度", "v": "印度 短剧"}, {"n": "韩国", "v": "韩国 短剧"}, {"n": "日本", "v": "日本 短剧"}, {"n": "欧美", "v": "欧美 短剧"}, {"n": "腾讯", "v": "腾讯 短剧"}, {"n": "爱奇艺", "v": "爱奇艺 短剧"}, {"n": "优酷", "v": "优酷 短剧"}, {"n": "芒果", "v": "芒果TV 短剧"}, {"n": "搜狐", "v": "搜狐 短剧"}]},
{"key": "topic", "name": "类型/频道", "value": [{"n": "全部", "v": ""}, {"n": "都市", "v": "@Urbanshort-TV 都市 短劇"}, {"n": "爱情", "v": "爱情 短劇"}, {"n": "复仇", "v": "复仇 短劇"}, {"n": "霸总", "v": "霸总 短劇"}, {"n": "萌宝", "v": "萌宝 短劇"}, {"n": "古装", "v": "古装 短劇"}, {"n": "穿越", "v": "穿越 短劇"}, {"n": "喜剧", "v": "喜剧 短劇"}, {"n": "奇幻", "v": "奇幻 短劇"}, {"n": "九酱爱追剧", "v": "@NineSauceDramaTV"}, {"n": "百万好剧场", "v": "@1-pw5ox"}, {"n": "咖啡追剧", "v": "@@coffeedrama605"}, {"n": "斗罗短剧", "v": "@DouluoDrama123 斗羅短劇"}, {"n": "嘟嘟剧场", "v": "@DUDUJUCHANG"}, {"n": "牛牛短剧", "v": "@niuniuduanju"}]}
],
"动画片": [
{"key": "date", "name": "排序/时间", "value": [{"n": "默认", "v": ""}, {"n": "最新", "v": "latest"}, {"n": "最热", "v": "hottest"}, {"n": "评分最高", "v": "favorite"}, {"n": "当天", "v": "day"}, {"n": "本周", "v": "week"}, {"n": "本月", "v": "month"}]},
{"key": "tid", "name": "平台/频道", "value": [{"n": "全部", "v": ""}, {"n": "小猪佩奇", "v": "@PeppaPigChineseOfficial 小猪佩奇 中文官方 - Peppa Pig"}, {"n": "CoComelon", "v": "@CoComelon"}, {"n": "国漫社", "v": "@Animation 次元 苍穹动漫 PP看动漫 公馆"}, {"n": "国漫工厂", "v": "@3DGuoman SUB"}, {"n": "阅文动漫", "v": "@yuewenanimation SUB"}, {"n": "哔哩", "v": "@madebybilibili 哔哩动漫"}, {"n": "腾讯", "v": "@TencentVideoAnimation SUB"}, {"n": "优酷", "v": "@youkuanimation 优酷动漫"}, {"n": "爱奇艺", "v": "@iQIYIAnime 爱奇艺动漫"}]},
{"key": "topic", "name": "主题/类别", "value": [{"n": "全部", "v": ""}, {"n": "默认中文国漫", "v": "國漫 劇集 3D"}, {"n": "默认动画", "v": "animation"}, {"n": "儿童早教", "v": "儿童早教"}, {"n": "儿童歌曲", "v": "儿童歌曲"}, {"n": "儿童音乐", "v": "儿童音乐"}, {"n": "儿童绘画", "v": "儿童绘画"}, {"n": "宝宝巴士", "v": "宝宝巴士"}, {"n": "儿歌多多", "v": "儿歌多多"}, {"n": "儿童英语启蒙", "v": "儿童英语启蒙"}, {"n": "儿童启蒙故事", "v": "儿童启蒙故事"}, {"n": "儿童安全教育", "v": "儿童安全教育"}, {"n": "默认英文国漫", "v": "3D Chinese cartoon"}, {"n": "合集", "v": "Anime ENG SUB 合集"}]}
]
}
class BaseExtractor:
@staticmethod
def extract_video_id(text):
text = str(text or '').strip()
for pattern in [
r'(?:v=|/v/|/embed/|/shorts/|youtu\.be/)([0-9A-Za-z_-]{11})',
r'^([0-9A-Za-z_-]{11})$',
]:
m = re.search(pattern, text)
if m:
return m.group(1)
raise Exception('无法识别 YouTube 视频 ID')
@staticmethod
def _client_name_id(client_name):
return {
'WEB': 1, 'MWEB': 2, 'ANDROID': 3, 'IOS': 5,
'TVHTML5': 7, 'ANDROID_VR': 28, 'WEB_EMBEDDED_PLAYER': 56,
'WEB_REMIX': 67,
}.get(client_name, 1)
@staticmethod
def _extract_ytcfg(text):
m = re.search(r'ytcfg\.set\s*\(\s*({.+?})\s*\)\s*;', text, re.S)
if m:
try:
return json.loads(m.group(1))
except Exception:
pass
return None
@staticmethod
def _extract_json_after(text, marker):
pos = text.find(marker)
if pos < 0:
return None
start = text.find('{', pos)
if start < 0:
return None
depth = 0
in_str = None
escape = False
for i in range(start, len(text)):
ch = text[i]
if escape:
escape = False
continue
if ch == '\\':
escape = True
continue
if in_str:
if ch == in_str:
in_str = None
continue
if ch == '"':
in_str = ch
continue
if ch == '{':
depth += 1
elif ch == '}':
depth -= 1
if depth == 0:
try:
return json.loads(text[start:i+1])
except Exception:
return None
return None
@staticmethod
def _search(pattern, text, default=None):
m = re.search(pattern, text or '', re.S)
return m.group(1) if m else default
@staticmethod
def _extract_player_url(text):
for pattern in [
r'"jsUrl":"([^"]+)"',
r'"PLAYER_JS_URL":"([^"]+)"',
r'(/s/player/[^"\\]+/base\.js)',
]:
m = re.search(pattern, text)
if m:
return m.group(1).replace('\\/', '/')
return ''
class YouTubeLite(BaseExtractor):
def __init__(self, session, headers=None, config=None):
self.session = session
self.headers = headers or {}
self.config = config or {}
self.player_cache = {}
self.extract_cache = {}
self.sig_plan_cache = {}
self.n_function_cache = {}
self.extract_cache_ttl = int(self.config.get('extract_cache_ttl') or 300)
def extract(self, url_or_id):
video_id = self.extract_video_id(url_or_id)
cached = self.extract_cache.get(video_id)
if cached and cached.get('expires', 0) > time.time():
return cached.get('data')
watch_url = f"https://www.youtube.com/watch?v={video_id}"
page = self._get(watch_url, timeout=60).text
ytcfg = self._extract_ytcfg(page) or {}
player_response = self._extract_initial_player_response(page) or {}
player_url = self._extract_player_url(page)
api_key = ytcfg.get('INNERTUBE_API_KEY') or self._search(r'"INNERTUBE_API_KEY":"([^"]+)"', page)
visitor_data = (
self.config.get('visitor_data') or ytcfg.get('VISITOR_DATA') or
(((ytcfg.get('INNERTUBE_CONTEXT') or {}).get('client') or {}).get('visitorData')) or
((player_response.get('responseContext') or {}).get('visitorData'))
)
sts = self._extract_signature_timestamp(player_url)
context = ytcfg.get('INNERTUBE_CONTEXT') or {
'client': {'clientName': 'WEB', 'clientVersion': '2.20240310.01.00', 'hl': 'en', 'gl': 'US'}
}
responses = [player_response] if player_response else []
if api_key:
api_responses = self._call_player_api(video_id, api_key, context, watch_url, visitor_data, sts)
if not isinstance(api_responses, list):
api_responses = [api_responses] if api_responses else []
responses.extend([x for x in api_responses if x])
player_response = next((x for x in responses if (x.get('playabilityStatus') or {}).get('status') == 'OK'), player_response)
status = (player_response.get('playabilityStatus') or {}).get('status')
streaming = player_response.get('streamingData') or {}
if status and status not in ('OK', 'LIVE_STREAM_OFFLINE') and not streaming:
reason = (player_response.get('playabilityStatus') or {}).get('reason') or status
raise Exception(f'YouTube 不可播放: {reason}')
details = player_response.get('videoDetails') or {}
raw_formats = []
seen_raw = set()
for response in responses:
response_streaming = (response or {}).get('streamingData') or {}
source_raw = (response_streaming.get('formats') or []) + (response_streaming.get('adaptiveFormats') or [])
for raw in source_raw:
key = (raw.get('itag'), raw.get('url') or raw.get('signatureCipher') or raw.get('cipher') or raw.get('mimeType'))
if key not in seen_raw:
seen_raw.add(key)
raw = raw.copy()
raw['_client_name'] = (response or {}).get('_client_name')
raw['_client_ua'] = (response or {}).get('_client_ua')
raw_formats.append(raw)
formats = []
for raw in raw_formats:
item = self._normalize_format(raw, player_url)
if item and item.get('url'):
formats.append(item)
if not formats:
raise Exception('未获取到可用播放地址')
data = {
'id': video_id,
'title': details.get('title') or video_id,
'duration': int(details.get('lengthSeconds') or 0),
'formats': formats,
'is_live': bool(details.get('isLive')),
}
self.extract_cache[video_id] = {'data': data, 'expires': time.time() + self.extract_cache_ttl}
return data
def _extract_signature_timestamp(self, player_url):
try:
code = self._get_player_code(player_url)
sts = self._search(r'(?:signatureTimestamp|sts)\s*:\s*(\d{5})', code)
return int(sts) if sts else None
except Exception:
return None
def _get_po_token(self, client_name, context='gvs'):
tokens = self.config.get('po_token') or self.config.get('po_tokens') or {}
if isinstance(tokens, str):
return tokens
if isinstance(tokens, dict):
return tokens.get(f'{client_name}.{context}') or tokens.get(client_name) or tokens.get(context)
return None
def _get(self, url, **kwargs):
headers = self.headers.copy()
headers.update(kwargs.pop('headers', {}) or {})
timeout = kwargs.pop('timeout', 60)
r = self.session.get(url, headers=headers, timeout=timeout, **kwargs)
r.raise_for_status()
return r
def _post_json(self, url, payload, headers=None):
h = self.headers.copy()
h.update({'Content-Type': 'application/json', 'Origin': 'https://www.youtube.com'})
if headers:
h.update({k: v for k, v in headers.items() if v})
r = self.session.post(url, json=payload, headers=h, timeout=60)
r.raise_for_status()
return r.json()
def _call_player_api(self, video_id, api_key, context, referer, visitor_data=None, sts=None):
clients = [
{'client': {'clientName': 'ANDROID_VR', 'clientVersion': '1.65.10', 'deviceMake': 'Oculus', 'deviceModel': 'Quest 3', 'androidSdkVersion': 32, 'userAgent': 'com.google.android.apps.youtube.vr.oculus/1.65.10 (Linux; U; Android 12L; eureka-user Build/SQ3A.220605.009.A1) gzip', 'osName': 'Android', 'osVersion': '12L', 'hl': 'en', 'gl': 'US'}}
]
results = []
fallback = None
for ctx in clients:
client_name = (ctx.get('client') or {}).get('clientName')
try:
url = f'https://www.youtube.com/youtubei/v1/player?key={api_key}&prettyPrint=false'
payload = {
'context': ctx,
'videoId': video_id,
'playbackContext': {'contentPlaybackContext': {'html5Preference': 'HTML5_PREF_WANTS', **({'signatureTimestamp': sts} if sts else {})}},
'contentCheckOk': True,
'racyCheckOk': True,
}
client = ctx.get('client') or {}
headers = {
'Referer': referer,
'X-YouTube-Client-Name': str(self._client_name_id(client.get('clientName'))),
'X-YouTube-Client-Version': client.get('clientVersion') or '',
}
if visitor_data:
headers['X-Goog-Visitor-Id'] = visitor_data
client_ua = client.get('userAgent')
if client_ua:
headers['User-Agent'] = client_ua
data = self._post_json(url, payload, headers=headers)
streaming = data.get('streamingData') or {}
if streaming:
data['_client_name'] = client_name
data['_client_ua'] = client_ua
results.append(data)
if streaming and fallback is None:
fallback = data
elif fallback is None:
fallback = data
except Exception:
continue
return results or ([fallback] if fallback else [])
def _normalize_format(self, fmt, player_url):
media_url = fmt.get('url')
if not media_url:
cipher = fmt.get('signatureCipher') or fmt.get('cipher')
if cipher:
media_url = self._decrypt_signature_cipher(cipher, player_url)
if not media_url:
return None
media_url = self._decrypt_nsig(media_url, player_url)
client_name = fmt.get('_client_name')
po_token = self._get_po_token(client_name, 'gvs') if client_name else None
if po_token:
sep = '&' if '?' in media_url else '?'
media_url = f'{media_url}{sep}pot={quote(po_token)}'
mime = fmt.get('mimeType') or ''
ext = 'mp4' if 'mp4' in mime else 'webm' if 'webm' in mime else 'unknown'
codecs = self._search(r'codecs="([^"]+)"', mime) or ''
has_audio = mime.startswith('audio/') or any(x in codecs for x in ('mp4a', 'opus', 'vorbis'))
has_video = mime.startswith('video/') or any(x in codecs for x in ('avc', 'vp9', 'av01', 'h264'))
headers = (fmt.get('http_headers') or {}).copy()
if fmt.get('_client_ua'):
headers['User-Agent'] = fmt.get('_client_ua')
return {
'itag': fmt.get('itag'),
'url': media_url,
'mimeType': mime,
'client': fmt.get('_client_name'),
'ext': ext,
'width': fmt.get('width') or 0,
'height': fmt.get('height') or 0,
'fps': fmt.get('fps') or 0,
'bitrate': fmt.get('bitrate') or fmt.get('averageBitrate') or 0,
'contentLength': fmt.get('contentLength'),
'initRange': fmt.get('initRange') or {},
'indexRange': fmt.get('indexRange') or {},
'codecs': codecs,
'quality': fmt.get('qualityLabel') or fmt.get('quality'),
'vcodec': codecs if has_video else 'none',
'acodec': codecs if has_audio else 'none',
'headers': headers,
}
def _decrypt_signature_cipher(self, cipher, player_url):
data = parse_qs(cipher)
media_url = unquote(data.get('url', [''])[0])
sig = unquote(data.get('s', [''])[0])
sp = data.get('sp', ['sig'])[0]
if not media_url:
return ''
if sig:
decoded = self._decrypt_sig(sig, player_url)
sep = '&' if '?' in media_url else '?'
media_url = f'{media_url}{sep}{sp}={quote(decoded)}'
return media_url
def _decrypt_sig(self, sig, player_url):
cache_key = player_url or ''
if cache_key in self.sig_plan_cache:
plan = self.sig_plan_cache[cache_key]
else:
code = self._get_player_code(player_url)
plan = self._extract_sig_plan(code)
self.sig_plan_cache[cache_key] = plan
if not plan:
return sig
arr = list(sig)
for op, arg in plan:
if op == 'reverse':
arr.reverse()
elif op in ('slice', 'splice'):
arr = arr[int(arg):]
elif op == 'swap' and arr:
j = int(arg) % len(arr)
arr[0], arr[j] = arr[j], arr[0]
return ''.join(arr)
def _decrypt_nsig(self, media_url, player_url):
try:
parsed = urlparse(media_url)
query = parse_qs(parsed.query)
n_value = query.get('n', [None])[0]
if not n_value:
return media_url
path_match = re.search(r'/n/([^/]+)', parsed.path)
if path_match and path_match.group(1) != n_value:
new_path = parsed.path.replace(f"/n/{path_match.group(1)}", f"/n/{n_value}", 1)
return urlunparse(parsed._replace(path=new_path))
if player_url:
func = self._get_n_function(player_url)
if func:
new_n = func(n_value)
if new_n != n_value:
query['n'] = [new_n]
new_query = urlencode(query, doseq=True)
return urlunparse(parsed._replace(query=new_query))
return media_url
except Exception:
return media_url
def _get_n_function(self, player_url):
if player_url in self.n_function_cache:
return self.n_function_cache[player_url]
code = self._get_player_code(player_url)
func = self._extract_n_function(code)
self.n_function_cache[player_url] = func
return func
def _get_player_code(self, player_url):
if not player_url:
return ''
if player_url in self.player_cache:
return self.player_cache[player_url]
if player_url.startswith('//'):
player_url = 'https:' + player_url
elif player_url.startswith('/'):
player_url = 'https://www.youtube.com' + player_url
try:
code = self._get(player_url, timeout=60).text
except Exception:
code = ''
self.player_cache[player_url] = code
return code
def _extract_sig_plan(self, code):
if not code:
return None
name = None
for pattern in [
r'\.sig\|\|([a-zA-Z0-9_$]+)\(',
r'"signature",\s*([a-zA-Z0-9_$]+)\(',
r'([a-zA-Z0-9_$]+)=function\(a\)\{a=a\.split\(""\);',
]:
m = re.search(pattern, code)
if m:
name = m.group(1)
break
if not name:
return None
body = self._extract_js_function_body(code, name)
if not body:
return None
helper = self._search(r'([a-zA-Z0-9_$]+)\.[a-zA-Z0-9_$]+\(a,\d+\)', body)
helper_map = self._extract_helper_object(code, helper) if helper else {}
plan = []
for part in body.split(';'):
if 'reverse()' in part:
plan.append(('reverse', 0))
continue
m = re.search(r'\.slice\((\d+)\)', part)
if m:
plan.append(('slice', int(m.group(1))))
continue
m = re.search(r'\.splice\(0,(\d+)\)', part)
if m:
plan.append(('splice', int(m.group(1))))
continue
m = re.search(r'([a-zA-Z0-9_$]+)\.([a-zA-Z0-9_$]+)\(a,(\d+)\)', part)
if m and m.group(1) == helper:
op = helper_map.get(m.group(2))
if op:
plan.append((op, int(m.group(3))))
return plan or None
def _extract_helper_object(self, code, name):
if not name:
return {}
m = re.search(r'var\s+' + re.escape(name) + r'=\{(.+?)\};', code, re.S) or re.search(re.escape(name) + r'=\{(.+?)\};', code, re.S)
if not m:
return {}
result = {}
for method, body in re.findall(r'([a-zA-Z0-9_$]+):function\([a-z,]+\)\{(.*?)\}', m.group(1)):
if '.reverse(' in body:
result[method] = 'reverse'
elif '.splice(' in body:
result[method] = 'splice'
elif '.slice(' in body:
result[method] = 'slice'
elif 'a[0]' in body and 'length' in body:
result[method] = 'swap'
return result
def _extract_n_function(self, code):
if not code:
return None
name = None
for pattern in [
r'\.get\("n"\)\)&&\(b=([a-zA-Z0-9_$]+)(?:\[(\d+)\])?\(b\)',
r'\.get\("n"\)\)&&\(b=([a-zA-Z0-9_$]+)\(b\)',
r'([a-zA-Z0-9_$]+)=function\(a\)\{var b=a\.split\(""\)',
r'function\s+([a-zA-Z0-9_$]+)\(a\)\{var b=a\.split\(""\)',
r'([a-zA-Z0-9_$]+)=function\(a\)\{a=a\.split\(""\)',
]:
m = re.search(pattern, code)
if m:
name = m.group(1)
break
if not name:
return None
body = self._extract_js_function_body(code, name)
if not body:
return None
def transform(value):
arr = list(value)
for part in body.split(';'):
if 'reverse()' in part:
arr.reverse()
m = re.search(r'\.slice\((\d+)\)', part)
if m:
arr = arr[int(m.group(1)):]
m = re.search(r'\.splice\(0,(\d+)\)', part)
if m:
arr = arr[int(m.group(1)):]
return ''.join(arr) or value
return transform
def _extract_js_function_body(self, code, name):
starts = []
for pattern in [
r'function\s+' + re.escape(name) + r'\s*\([^)]*\)\s*\{',
re.escape(name) + r'\s*=\s*function\s*\([^)]*\)\s*\{',
r'var\s+' + re.escape(name) + r'\s*=\s*function\s*\([^)]*\)\s*\{',
]:
m = re.search(pattern, code)
if m:
starts.append(m.end() - 1)
if not starts:
return ''
start = starts[0]
depth = 0
in_str = None
escape = False
for i in range(start, len(code)):
ch = code[i]
if escape:
escape = False
continue
if ch == '\\':
escape = True
continue
if in_str:
if ch == in_str:
in_str = None
continue
if ch in ('"', "'", '`'):
in_str = ch
continue
if ch == '{':
depth += 1
elif ch == '}':
depth -= 1
if depth == 0:
return code[start + 1:i]
return ''
def _extract_initial_player_response(self, text):
return self._extract_json_after(text, 'ytInitialPlayerResponse')
class YouTubeLiveLite(BaseExtractor):
def __init__(self, session, headers=None, config=None):
self.session = session
self.headers = headers or {}
self.config = config or {}
self.cache = {}
self.cache_ttl = int(self.config.get('live_cache_ttl') or 45)
def extract_live(self, url_or_id):
video_id = self.extract_video_id(url_or_id)
now = time.time()
cached = self.cache.get(video_id)
if cached and cached.get('expires', 0) > now:
return cached.get('data')
watch_url = f'https://www.youtube.com/watch?v={video_id}'
page = self._get(watch_url, timeout=60).text
player_response = self._extract_initial_player_response(page) or {}
ytcfg = self._extract_ytcfg(page) or {}
api_key = ytcfg.get('INNERTUBE_API_KEY') or self._search(r'"INNERTUBE_API_KEY":"([^"]+)"', page)
visitor_data = (
self.config.get('visitor_data') or ytcfg.get('VISITOR_DATA') or
(((ytcfg.get('INNERTUBE_CONTEXT') or {}).get('client') or {}).get('visitorData')) or
((player_response.get('responseContext') or {}).get('visitorData'))
)
status_obj = player_response.get('playabilityStatus') or {}
streaming = player_response.get('streamingData') or {}
details = player_response.get('videoDetails') or {}
page_hls_url = streaming.get('hlsManifestUrl') or ''
api_data = None
if api_key:
api_data = self._call_player_api(video_id, api_key, ytcfg, watch_url, visitor_data)
if api_data:
api_streaming = api_data.get('streamingData') or {}
api_details = api_data.get('videoDetails') or {}
api_hls_url = api_streaming.get('hlsManifestUrl') or ''
if api_hls_url:
streaming = api_streaming
elif not page_hls_url and api_streaming:
streaming = api_streaming
if api_details:
details = api_details
status_obj = api_data.get('playabilityStatus') or status_obj
if not (streaming.get('hlsManifestUrl') or '') and page_hls_url:
streaming = dict(streaming or {})
streaming['hlsManifestUrl'] = page_hls_url
hls_url = streaming.get('hlsManifestUrl') or ''
is_live = bool(details.get('isLive') or hls_url)
status = status_obj.get('status') or ''
reason = status_obj.get('reason') or ''
title = details.get('title') or video_id
data = {
'id': video_id,
'title': title,
'is_live': is_live,
'status': status,
'reason': reason,
'hls_url': hls_url,
'duration': int(details.get('lengthSeconds') or 0),
}
self.cache[video_id] = {'data': data, 'expires': time.time() + self.cache_ttl}
return data
def _get(self, url, **kwargs):
headers = self.headers.copy()
headers.update(kwargs.pop('headers', {}) or {})
timeout = kwargs.pop('timeout', 60)
response = self.session.get(url, headers=headers, timeout=timeout, **kwargs)
response.raise_for_status()
return response
def _post_json(self, url, payload, headers=None):
final_headers = self.headers.copy()
final_headers.update({'Content-Type': 'application/json', 'Origin': 'https://www.youtube.com'})
if headers:
final_headers.update({k: v for k, v in headers.items() if v})
response = self.session.post(url, json=payload, headers=final_headers, timeout=60)
response.raise_for_status()
return response.json()
def _call_player_api(self, video_id, api_key, ytcfg, referer, visitor_data=None):
context = ytcfg.get('INNERTUBE_CONTEXT') or {
'client': {'clientName': 'WEB', 'clientVersion': '2.20240310.01.00', 'hl': 'en', 'gl': 'US'}
}
clients = [
{'client': {'clientName': 'ANDROID_VR', 'clientVersion': '1.65.10', 'deviceMake': 'Oculus', 'deviceModel': 'Quest 3', 'androidSdkVersion': 32, 'userAgent': 'com.google.android.apps.youtube.vr.oculus/1.65.10 (Linux; U; Android 12L; eureka-user Build/SQ3A.220605.009.A1) gzip', 'osName': 'Android', 'osVersion': '12L', 'hl': 'en', 'gl': 'US'}}
]
for ctx in clients:
client = ctx.get('client') or {}
client_name = client.get('clientName') or 'WEB'
try:
url = f'https://www.youtube.com/youtubei/v1/player?key={quote(api_key)}&prettyPrint=false'
headers = {
'Referer': referer,
'X-YouTube-Client-Name': str(self._client_name_id(client_name)),
'X-YouTube-Client-Version': client.get('clientVersion') or '',
}
if visitor_data:
headers['X-Goog-Visitor-Id'] = visitor_data
if client.get('userAgent'):
headers['User-Agent'] = client.get('userAgent')
payload = {
'context': ctx,
'videoId': video_id,
'contentCheckOk': True,
'racyCheckOk': True,
}
data = self._post_json(url, payload, headers=headers)
streaming = data.get('streamingData') or {}
if streaming.get('hlsManifestUrl'):
data['_client_name'] = client_name
return data
except Exception:
continue
return None
def _extract_initial_player_response(self, text):
return self._extract_json_after(text, 'ytInitialPlayerResponse')
class Spider(Spider):
def getName(self):
return 'YouTube 视频+直播'
def init(self, extend):
try:
self.extendDict = json.loads(extend) if extend else {}
except Exception:
self.extendDict = {}
self.session = requests.Session()
retry = Retry(
total=3,
backoff_factor=1,
status_forcelist=[500, 502, 503, 504, 408, 429],
allowed_methods=["GET", "POST"]
)
adapter = HTTPAdapter(max_retries=retry, pool_connections=20, pool_maxsize=20)
self.session.mount('http://', adapter)
self.session.mount('https://', adapter)
self.session.keep_alive = False
self._cache = {}
proxy_config = self.extendDict.get('proxy')
if proxy_config:
if isinstance(proxy_config, str):
proxy_str = proxy_config.strip()
if proxy_str:
if not proxy_str.startswith(('http://', 'https://')):
proxy_str = 'http://' + proxy_str
self.session.proxies = {'http': proxy_str, 'https': proxy_str}
elif isinstance(proxy_config, dict):
proxies = {}
for k, v in proxy_config.items():
if k in ('http', 'https') and v:
v_str = v.strip()
if v_str:
if not v_str.startswith(('http://', 'https://')):
v_str = 'http://' + v_str
proxies[k] = v_str
if proxies:
self.session.proxies = proxies
else:
self.session.proxies = {}
else:
self.session.proxies = {}
self.header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
'Referer': 'https://www.youtube.com/'
}
self.session.headers.update(self.header)
self.yt_video = YouTubeLite(self.session, self.header, self.extendDict)
self.yt_live = YouTubeLiveLite(self.session, self.header, self.extendDict)
self.search_page_cache = {}
self.live_search_cache = {}
self.hls_url_cache = {}
self.hls_proxy_enabled = self.extendDict.get('hls_proxy', True) is not False
self._hls_key_seq = 0
def setCache(self, key, value):
self._cache[key] = value
def getCache(self, key):
return self._cache.get(key)
def homeContent(self, filter):
result = {'class': YOUTUBE_CLASSES}
if filter:
video_filters = {}
for c in YOUTUBE_CLASSES:
cid = c['type_id']
if cid in CATEGORY_FILTERS:
video_filters[cid] = CATEGORY_FILTERS[cid]
result['filters'] = video_filters
return result
def homeVideoContent(self):
return {'list': []}
def categoryContent(self, cid, page, filter, ext):
page = int(page or 1)
filters = ext if isinstance(ext, dict) else {}
if self._is_live_category(cid):
keyword = self._build_live_keyword(cid, filters)
videos, has_more = self._search_live_page(keyword, page)
else:
keyword = self._build_video_keyword(cid, filters)
videos, has_more = self._search_video_page(keyword, page)
return {
'list': videos,
'page': page,
'pagecount': page + 1 if has_more else page,
'limit': len(videos),
'total': len(videos)
}
def searchContent(self, key, quick, pg=1):
page = int(pg or 1)
keyword = str(key or '').strip()
videos_v, _ = self._search_video_page(keyword, page)
live_keyword = f'{keyword} live' if 'live' not in keyword.lower() and '直播' not in keyword else keyword
videos_l, _ = self._search_live_page(live_keyword, page)
seen = set()
merged = []
for v in videos_v + videos_l:
if v['vod_id'] not in seen:
seen.add(v['vod_id'])
merged.append(v)
return {
'list': merged[:30],
'page': page,
'pagecount': page + 1,
'limit': len(merged),
'total': len(merged)
}
def detailContent(self, did):
video_id = did[0]
is_live = False
title = video_id
status = '视频'
has_super = False
try:
data = self.yt_video.extract(video_id)
title = data.get('title') or video_id
is_live = data.get('is_live', False)
status = '直播中' if is_live else '视频'
if not is_live:
formats = data.get('formats') or []
all_videos = [x for x in formats if x.get('vcodec') != 'none' and x.get('acodec') == 'none']
high_res = [x for x in all_videos if int(x.get('height') or 0) >= 720]
has_super = len(high_res) > 0
except Exception:
is_live = False
title = self._get_video_title(video_id) or video_id
status = '视频'
related = []
try:
r = self.session.get(f'https://www.youtube.com/watch?v={video_id}', timeout=60)
related = self._extract_videos_fixed(r.text, 20)
except Exception:
pass
safe_title = self._safe_title(title)
play_sources = []
play_urls = []
if is_live:
play_sources.append('直播')
play_urls.append(f'{safe_title}${video_id}@live')
else:
if has_super:
play_sources.append('极客VP')
play_urls.append(f'{safe_title}${video_id}@super')
play_sources.append('万能MP')
play_urls.append(f'{safe_title}${video_id}@normal')
if related:
play_sources.append('相关推荐')
play_url2 = '#'.join([f"{self._safe_title(v['vod_name'])}${v['vod_id']}@normal" for v in related if v.get('vod_id') != video_id])
play_urls.append(play_url2)
vod = {
'vod_id': video_id,
'vod_name': title,
'vod_pic': f'http://127.0.0.1:9978/proxy?do=py&type=image&vid={video_id}',
'vod_remarks': status,
'vod_play_from': '$$$'.join(play_sources),
'vod_play_url': '$$$'.join(play_urls)
}
return {'list': [vod]}
def playerContent(self, flag, pid, vipFlags):
raw_pid = pid.split('$')[-1]
if '@' in raw_pid:
video_id, quality_or_type = raw_pid.rsplit('@', 1)
else:
video_id, quality_or_type = raw_pid, 'super'
if quality_or_type == 'live':
return self._play_live(video_id)
else:
return self._play_video(video_id, quality_or_type)
def _is_live_category(self, cid):
return 'live' in cid.lower() or '直播' in cid.lower()
def _build_live_keyword(self, cid, filters=None):
terms = [cid]
if isinstance(filters, dict):
for value in filters.values():
term = self._normalize_filter_term(value)
if term:
terms.append(term)
keyword = ' '.join(terms).strip()
if 'live' not in keyword.lower() and '直播' not in keyword:
keyword = f'{keyword} live'
return keyword
def _build_video_keyword(self, cid, filters=None):
if cid.startswith('LIST:'):
raw = cid[5:].strip()
channels = [ch.strip() for ch in raw.split(',') if ch.strip()]
terms = []
for ch in channels:
if ch.startswith('@'):
terms.append(f'channel:{ch}')
else:
terms.append(f'"{ch}"')
keyword = ' OR '.join(terms) if terms else ''
else:
keyword = cid
if isinstance(filters, dict):
for value in filters.values():
term = self._normalize_filter_term(value)
if term:
keyword += ' ' + term
return keyword.strip()
def _normalize_filter_term(self, value):
if isinstance(value, (list, tuple)):
return ' '.join([self._normalize_filter_term(item) for item in value if item])
if isinstance(value, dict):
return ' '.join([self._normalize_filter_term(item) for item in value.values() if item])
return re.sub(r'\s+', ' ', str(value or '')).strip()[:180]
def _search_cache_key(self, key):
return re.sub(r'\s+', ' ', str(key or '')).strip().lower()
def _search_video_page(self, key, page=1):
page = max(1, int(page or 1))
cache_key = self._search_cache_key(key)
session = self.search_page_cache.get(cache_key)
if page == 1 or not session:
session = self._fetch_search_first_page(key)
self.search_page_cache[cache_key] = session
while len(session.get('pages', [])) < page and session.get('next'):
data = self._fetch_search_continuation(session)
videos = self._extract_videos_from_api(data, 30)
session.setdefault('pages', []).append(videos)
session['next'] = self._extract_continuation_token(data)
pages = session.get('pages', [])
videos = pages[page - 1] if len(pages) >= page else []
has_more = bool(session.get('next')) or len(pages) > page
return videos, has_more
def _search_live_page(self, key, page=1):
page = max(1, int(page or 1))
cache_key = f'live_{self._search_cache_key(key)}'
session = self.live_search_cache.get(cache_key)
if page == 1 or not session:
session = self._fetch_live_search_first_page(key)
self.live_search_cache[cache_key] = session
while len(session.get('pages', [])) < page and session.get('next'):
data = self._fetch_search_continuation(session)
videos = self._extract_live_videos_from_api(data, 30)
session.setdefault('pages', []).append(videos)
session['next'] = self._extract_continuation_token(data)
pages = session.get('pages', [])
videos = pages[page - 1] if len(pages) >= page else []
has_more = bool(session.get('next')) or len(pages) > page
return videos, has_more
def _fetch_live_search_first_page(self, key):
search_url = f'https://www.youtube.com/results?search_query={quote(str(key or ""))}&sp=EgJAAQ%253D%253D'
r = self.session.get(search_url, timeout=60)
html_str = r.text
data = self.yt_video._extract_json_after(html_str, 'ytInitialData') or {}
ytcfg = self.yt_video._extract_ytcfg(html_str) or {}
api_key = ytcfg.get('INNERTUBE_API_KEY') or self.yt_video._search(r'"INNERTUBE_API_KEY":"([^"]+)"', html_str)
context = ytcfg.get('INNERTUBE_CONTEXT') or {'client': {'clientName': 'WEB', 'clientVersion': '2.20240310.01.00', 'hl': 'zh-CN', 'gl': 'US'}}
client = context.get('client') or {}
return {
'key': key,
'api_key': api_key,
'context': context,
'client_name': client.get('clientName') or 'WEB',
'client_version': client.get('clientVersion') or '2.20240310.01.00',
'referer': search_url,
'pages': [self._extract_live_videos_from_api(data, 30)],
'next': self._extract_continuation_token(data),
}
def _fetch_search_first_page(self, key):
search_url = f'https://www.youtube.com/results?search_query={quote(str(key or ""))}'
r = self.session.get(search_url, timeout=60)
html_str = r.text
data = self.yt_video._extract_json_after(html_str, 'ytInitialData') or {}
ytcfg = self.yt_video._extract_ytcfg(html_str) or {}
api_key = ytcfg.get('INNERTUBE_API_KEY') or self.yt_video._search(r'"INNERTUBE_API_KEY":"([^"]+)"', html_str)
context = ytcfg.get('INNERTUBE_CONTEXT') or {'client': {'clientName': 'WEB', 'clientVersion': '2.20240310.01.00', 'hl': 'zh-CN', 'gl': 'US'}}
client = context.get('client') or {}
return {
'key': key,
'api_key': api_key,
'context': context,
'client_name': client.get('clientName') or 'WEB',
'client_version': client.get('clientVersion') or '2.20240310.01.00',
'referer': search_url,
'pages': [self._extract_videos_from_api(data, 30)],
'next': self._extract_continuation_token(data),
}
def _fetch_search_continuation(self, session):
token = session.get('next')
api_key = session.get('api_key')
if not token or not api_key:
return {}
url = f'https://www.youtube.com/youtubei/v1/search?key={quote(api_key)}'
headers = self.header.copy()
headers.update({
'Content-Type': 'application/json',
'Origin': 'https://www.youtube.com',
'Referer': session.get('referer') or 'https://www.youtube.com/',
'X-YouTube-Client-Name': str(self.yt_video._client_name_id(session.get('client_name'))),
'X-YouTube-Client-Version': session.get('client_version') or '2.20240310.01.00',
})
payload = {'context': session.get('context') or {}, 'continuation': token}
r = self.session.post(url, json=payload, headers=headers, timeout=60)
r.raise_for_status()
return r.json()
def _extract_continuation_token(self, data):
tokens = []
def scan(obj):
if isinstance(obj, dict):
endpoint = obj.get('continuationEndpoint') or {}
token = endpoint.get('continuationCommand', {}).get('token')
if token:
tokens.append(token)
renderer = obj.get('continuationItemRenderer') or {}
token = renderer.get('continuationEndpoint', {}).get('continuationCommand', {}).get('token')
if token:
tokens.append(token)
for value in obj.values():
scan(value)
elif isinstance(obj, list):
for value in obj:
scan(value)
scan(data)
return tokens[0] if tokens else ''
def _extract_videos_from_api(self, data, limit=30):
videos = []
seen = set()
def scan(obj):
if len(videos) >= limit:
return
if isinstance(obj, dict):
for key in ('videoRenderer', 'compactVideoRenderer', 'gridVideoRenderer'):
if key in obj:
item = self._parse_renderer(obj[key], is_live=False)
if item and item['vod_id'] not in seen:
seen.add(item['vod_id'])
videos.append(item)
for value in obj.values():
scan(value)
elif isinstance(obj, list):
for value in obj:
scan(value)
scan(data)
return videos[:limit]
def _extract_live_videos_from_api(self, data, limit=30):
videos = []
seen = set()
def scan(obj):
if len(videos) >= limit:
return
if isinstance(obj, dict):
for key in ('videoRenderer', 'compactVideoRenderer', 'gridVideoRenderer'):
if key in obj:
item = self._parse_renderer(obj[key], is_live=True)
if item and item['vod_id'] not in seen:
seen.add(item['vod_id'])
videos.append(item)
for value in obj.values():
scan(value)
elif isinstance(obj, list):
for value in obj:
scan(value)
scan(data)
return videos[:limit]
def _parse_renderer(self, renderer, is_live=False):
try:
vid = renderer.get('videoId')
if not vid:
nav = renderer.get('navigationEndpoint') or {}
vid = (nav.get('watchEndpoint') or {}).get('videoId')
if not vid:
return None
is_actually_live = False
badges = renderer.get('badges', [])
for badge in badges:
if isinstance(badge, dict):
text = badge.get('text', '') or badge.get('label', '') or ''
if '直播' in text or 'LIVE' in text.upper():
is_actually_live = True
break
if not is_live and is_actually_live:
return None
title_obj = renderer.get('title') or renderer.get('headline') or {}
title = title_obj.get('simpleText') or ''.join([x.get('text', '') for x in title_obj.get('runs', [])]) or 'YouTube Video'
dur = ''
if not is_actually_live:
dur_obj = renderer.get('lengthText') or {}
dur = dur_obj.get('simpleText') or ''
remarks = '直播' if is_actually_live else (dur if dur else '视频')
return {
'vod_id': vid,
'vod_name': html.unescape(title),
'vod_pic': f'http://127.0.0.1:9978/proxy?do=py&type=image&vid={vid}',
'vod_remarks': remarks
}
except Exception:
return None
def _extract_videos_fixed(self, html_str, limit=30):
data = None
match = re.search(r'var ytInitialData = (\{.*?\});', html_str)
if match:
try:
data = json.loads(match.group(1))
except Exception:
data = None
if not data:
return []
return self._extract_videos_from_api(data, limit)
def _get_video_title(self, vid):
try:
r = self.session.get(f'https://www.youtube.com/oembed?url=https://www.youtube.com/watch?v={vid}&format=json', timeout=30)
return r.json().get('title') or vid
except Exception:
return vid
def _safe_title(self, title):
if not title:
return 'video'
return re.sub(r'[#$@%&!?*|\\/:<>]', ' ', title)[:60]
def _play_video(self, video_id, quality):
try:
data = self.yt_video.extract(video_id)
formats = data.get('formats') or []
all_videos = [x for x in formats if x.get('vcodec') != 'none' and x.get('acodec') == 'none']
def filter_and_sort_videos(videos):
filtered = [v for v in videos if int(v.get('height') or 0) >= 720]
filtered.sort(key=lambda x: (int(x.get('height') or 0), int(x.get('bitrate') or 0)), reverse=True)
seen_res = {}
result = []
for v in filtered:
h = int(v.get('height') or 0)
if h not in seen_res:
seen_res[h] = True
result.append(v)
return result
webm_videos = filter_and_sort_videos([x for x in all_videos if x.get('ext') == 'webm'])
mp4_videos = filter_and_sort_videos([x for x in all_videos if x.get('ext') == 'mp4'])
if quality == 'normal':
target_videos = mp4_videos if mp4_videos else webm_videos
else:
target_videos = webm_videos if webm_videos else mp4_videos
audio_candidates = [x for x in formats if x.get('acodec') != 'none' and x.get('vcodec') == 'none']
audio_candidates.sort(
key=lambda x: (1 if x.get('ext') == 'mp4' else 0, int(x.get('bitrate') or 0)),
reverse=True
)
audio = audio_candidates[0] if audio_candidates else None
if not target_videos:
raise Exception('未获取到可用视频流')
cache_key = f'yt_{video_id}_{quality}'
all_cached = {}
for v in target_videos:
all_cached[str(v.get('itag'))] = v
if audio:
all_cached[str(audio.get('itag'))] = audio
self.setCache(cache_key, {
'target_videos': target_videos,
'audio_item': audio,
'all_by_itag': all_cached,
'duration': data.get('duration') or 0,
'expires': time.time() + 600,
})
return {
'parse': 0, 'jx': 0,
'url': f'http://127.0.0.1:9978/proxy?do=py&type=mpd&vid={video_id}&quality={quality}',
'format': 'application/dash+xml'
}
except Exception:
return {
'parse': 1,
'url': f'https://www.youtube.com/embed/{video_id}?autoplay=1',
'header': json.dumps(self.header)
}
def _proxy_mpd(self, params):
vid = params.get('vid')
quality = params.get('quality') or 'super'
data = self.getCache(f'yt_{vid}_{quality}') if vid else None
if not data:
return [404, 'text/plain', '视频缓存已过期或不存在']
target_videos = data.get('target_videos') or []
audio_item = data.get('audio_item') or {}
duration = data.get('duration') or 0
duration_pt = f"PT{int(duration)}S"
media_base = f'http://127.0.0.1:9978/proxy?do=py&type=media&vid={vid}&quality={quality}'
def build_video_repr(item, rank):
itag = item.get('itag', 0)
init = item.get('initRange') or {}
index = item.get('indexRange') or {}
return (
f' <Representation id="v{itag}" bandwidth="{item.get("bitrate", 1000000)}" '
f'codecs="{html.escape(item.get("codecs") or "")}" '
f'height="{item.get("height", 0)}" width="{item.get("width", 0)}" '
f'frameRate="{item.get("fps", 30)}" qualityRanking="{rank}">\n'
f' <BaseURL>{html.escape(media_base + f"&itag={itag}&track=video")}</BaseURL>\n'
f' <SegmentBase indexRange="{index.get("start", "0")}-{index.get("end", "0")}">'
f'<Initialization range="{init.get("start", "0")}-{init.get("end", "0")}"/></SegmentBase>\n'
f' </Representation>'
)
mpd = (
f'<?xml version="1.0" encoding="UTF-8"?>\n'
f'<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" type="static" '
f'mediaPresentationDuration="{duration_pt}" minBufferTime="PT1.5S" '
f'profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">\n'
f' <Period id="1" start="PT0S">'
)
if target_videos:
mime_type = "video/webm" if target_videos[0].get('ext') == 'webm' else "video/mp4"
label = "极客VP" if mime_type == "video/webm" else "万能MP"
mpd += f'\n <AdaptationSet mimeType="{mime_type}" startWithSAP="1" segmentAlignment="true" scanType="progressive">\n'
mpd += f' <Label>{label}</Label>\n'
for rank, v in enumerate(target_videos, start=1):
mpd += build_video_repr(v, rank) + '\n'
mpd += ' </AdaptationSet>'
if audio_item:
audio_itag = audio_item.get('itag', 0)
audio_init = audio_item.get('initRange') or {}
audio_index = audio_item.get('indexRange') or {}
audio_mime = (audio_item.get('mimeType') or 'audio/mp4').split(';')[0]
mpd += (
f'\n <AdaptationSet mimeType="{html.escape(audio_mime)}" startWithSAP="1" segmentAlignment="true" lang="und">\n'
f' <Representation id="a{audio_itag}" bandwidth="{audio_item.get("bitrate", 128000)}" '
f'codecs="{html.escape(audio_item.get("codecs") or "")}" audioSamplingRate="44100">\n'
f' <BaseURL>{html.escape(media_base + f"&itag={audio_itag}&track=audio")}</BaseURL>\n'
f' <SegmentBase indexRange="{audio_index.get("start", "0")}-{audio_index.get("end", "0")}">'
f'<Initialization range="{audio_init.get("start", "0")}-{audio_init.get("end", "0")}"/></SegmentBase>\n'
f' </Representation>\n'
f' </AdaptationSet>'
)
mpd += '\n </Period>\n</MPD>'
return [200, 'application/dash+xml', mpd]
def _proxy_media(self, params):
vid = params.get('vid')
quality = params.get('quality') or 'super'
itag = params.get('itag')
track = params.get('track')
data = self.getCache(f'yt_{vid}_{quality}') if vid else None
if not data:
return [404, 'text/plain', '媒体缓存不存在或已过期']
all_by_itag = data.get('all_by_itag') or {}
media_item = None
if itag and str(itag) in all_by_itag:
media_item = all_by_itag[str(itag)]
elif track == 'audio':
media_item = data.get('audio_item')
if not media_item:
return [404, 'text/plain', f'流不存在 (itag={itag})']
target_url = media_item.get('url')
if not target_url:
return [404, 'text/plain', '播放地址不存在']
headers = self.header.copy()
headers.update(media_item.get('headers') or {})
range_header = params.get('range') or params.get('Range')
if range_header:
headers['Range'] = range_header
max_retries = 3
for attempt in range(max_retries + 1):
try:
r = self.session.get(target_url, headers=headers, stream=True, timeout=120)
if r.status_code in (403, 404) and attempt < max_retries:
try:
fresh_data = self.yt_video.extract(vid)
fresh_formats = fresh_data.get('formats', [])
fresh_item = None
for f in fresh_formats:
if str(f.get('itag')) == str(itag):
fresh_item = f
break
if fresh_item and fresh_item.get('url'):
media_item['url'] = fresh_item['url']
target_url = fresh_item['url']
all_by_itag[str(itag)] = fresh_item
data['all_by_itag'] = all_by_itag
self.setCache(f'yt_{vid}_{quality}', data)
continue
except Exception:
pass
time.sleep(1)
continue
content_type = r.headers.get('content-type', 'application/octet-stream')
resp_headers = {
'Content-Type': content_type,
'Accept-Ranges': 'bytes',
'Cache-Control': 'no-cache',
}
if r.headers.get('content-range'):
resp_headers['Content-Range'] = r.headers.get('content-range')
if r.headers.get('content-length'):
resp_headers['Content-Length'] = r.headers.get('content-length')
return [r.status_code, content_type, r.content, resp_headers]
except Exception as e:
if attempt == max_retries:
return [500, 'text/plain', f'代理媒体失败: {str(e)}']
time.sleep(1)
return [500, 'text/plain', '代理媒体失败']
def _play_live(self, video_id):
try:
data = self.yt_live.extract_live(video_id)
hls_url = data.get('hls_url') or ''
if not hls_url:
raise Exception(data.get('reason') or '未获取到直播 HLS 地址')
if self.extendDict.get('hls_probe'):
self._probe_hls(video_id, hls_url)
play_url = hls_url
if self.hls_proxy_enabled:
play_url = self._cache_hls_url(hls_url, video_id, 'master')
return {
'parse': 0,
'jx': 0,
'url': play_url,
'header': self.header,
'format': 'application/x-mpegURL'
}
except Exception:
return {'parse': 1, 'jx': 1, 'url': f'https://www.youtube.com/embed/{video_id}?autoplay=1'}
def _probe_hls(self, video_id, hls_url):
try:
response = self.session.get(hls_url, headers=self.header, timeout=60)
full_text = response.text or ''
variant_url = self._pick_variant_playlist(hls_url, full_text)
if variant_url:
self.session.get(variant_url, headers=self.header, timeout=60)
except Exception:
pass
def _pick_variant_playlist(self, base_url, text):
lines = [line.strip() for line in (text or '').splitlines()]
best_score = -1
best_url = ''
for index, line in enumerate(lines):
if not line.startswith('#EXT-X-STREAM-INF'):
continue
score = 0
bandwidth = re.search(r'BANDWIDTH=(\d+)', line)
resolution = re.search(r'RESOLUTION=(\d+)x(\d+)', line)
if bandwidth:
score += int(bandwidth.group(1))
if resolution:
score += int(resolution.group(1)) * int(resolution.group(2))
for next_line in lines[index + 1:]:
if not next_line or next_line.startswith('#'):
continue
if score > best_score:
best_score = score
best_url = urljoin(base_url, next_line)
break
return best_url
HLS_TTL = {'master': 6 * 3600, 'playlist': 6 * 3600, 'media': 120, 'media_retry': 120}
def _hls_ttl(self, kind):
return self.HLS_TTL.get(kind, 180)
def _prune_hls_cache(self):
now = time.time()
expired = [k for k, v in self.hls_url_cache.items() if v.get('expires', 0) < now]
for k in expired:
self.hls_url_cache.pop(k, None)
def _cache_hls_url(self, target_url, video_id='', kind='media'):
self._prune_hls_cache()
self._hls_key_seq += 1
key = f'{int(time.time() * 1000)}_{self._hls_key_seq}'
self.hls_url_cache[key] = {
'url': target_url,
'video_id': video_id,
'kind': kind,
'expires': time.time() + self._hls_ttl(kind),
}
return f'http://127.0.0.1:9978/proxy?do=py&type=hls&key={quote(key)}'
def _hls_headers(self, target_url, kind=None):
if kind == 'media_retry':
return {
'User-Agent': 'com.google.android.youtube/21.02.35 (Linux; U; Android 11) gzip',
'Accept': '*/*',
}
headers = self.header.copy()
headers['Accept'] = '*/*'
if kind in ('master', 'playlist'):
headers['Origin'] = 'https://www.youtube.com'
headers['Referer'] = 'https://www.youtube.com/'
elif kind == 'media':
headers['User-Agent'] = 'com.google.android.youtube/21.02.35 (Linux; U; Android 11) gzip'
headers.pop('Origin', None)
headers.pop('Referer', None)
return headers
def _rewrite_m3u8(self, text, base_url, video_id=''):
output = []
for line in (text or '').splitlines():
stripped = line.strip()
if not stripped:
output.append(line)
continue
if stripped.startswith('#'):
output.append(self._rewrite_m3u8_tag(line, base_url, video_id))
continue
absolute = urljoin(base_url, stripped)
kind = 'playlist' if stripped.endswith('.m3u8') or '/hls_playlist/' in stripped else 'media'
output.append(self._cache_hls_url(absolute, video_id, kind))
return '\n'.join(output) + '\n'
def _rewrite_m3u8_tag(self, line, base_url, video_id=''):
def replace_uri(match):
raw_url = match.group(1)
absolute = urljoin(base_url, raw_url)
proxied = self._cache_hls_url(absolute, video_id, 'media')
return f'URI="{proxied}"'
return re.sub(r'URI="([^"]+)"', replace_uri, line)
def _proxy_hls(self, params):
key = params.get('key') or ''
item = self.hls_url_cache.get(key)
if not item or item.get('expires', 0) < time.time():
return [404, 'text/plain', 'HLS 缓存已过期']
item['expires'] = time.time() + self._hls_ttl(item.get('kind'))
target_url = item.get('url') or ''
video_id = item.get('video_id', '')
try:
headers = self._hls_headers(target_url, item.get('kind'))
max_retries = 3
for attempt in range(max_retries + 1):
try:
response = self.session.get(target_url, headers=headers, stream=True, timeout=120)
if response.status_code in (403, 404) and attempt < max_retries:
if video_id and item.get('kind') in ('master', 'playlist'):
try:
live_data = self.yt_live.extract_live(video_id)
new_hls = live_data.get('hls_url')
if new_hls:
item['url'] = new_hls
target_url = new_hls
self.hls_url_cache[key] = item
continue
except Exception:
pass
time.sleep(1)
continue
content_type = response.headers.get('content-type') or ''
is_m3u8 = item.get('kind') in ('master', 'playlist') or 'mpegurl' in content_type.lower() or target_url.split('?')[0].endswith('.m3u8')
if is_m3u8:
text = response.text
rewritten = self._rewrite_m3u8(text, target_url, video_id)
return [response.status_code, 'application/vnd.apple.mpegurl', rewritten, {'Content-Type': 'application/vnd.apple.mpegurl', 'Cache-Control': 'no-cache'}]
resp_headers = {'Content-Type': content_type or 'application/octet-stream', 'Cache-Control': 'no-cache'}
if response.headers.get('content-length'):
resp_headers['Content-Length'] = response.headers.get('content-length')
return [response.status_code, content_type or 'application/octet-stream', response.content, resp_headers]
except Exception as e:
if attempt == max_retries:
raise
time.sleep(1)
except Exception as e:
return [500, 'text/plain', f'HLS 代理失败: {str(e)}']
return [500, 'text/plain', 'HLS 代理失败']
def localProxy(self, params):
if params.get('do') != 'py':
return None
typ = params.get('type')
if typ == 'mpd':
return self._proxy_mpd(params)
if typ == 'media':
return self._proxy_media(params)
if typ == 'single':
return self._proxy_single(params)
if typ == 'image':
return self._proxy_image(params)
if typ == 'hls':
return self._proxy_hls(params)
return None
def _proxy_image(self, params):
vid = params.get('vid')
if not vid:
return [400, 'text/plain', '缺少 video id']
quality = params.get('quality', 'hqdefault')
img_url = f'https://i.ytimg.com/vi/{vid}/{quality}.jpg'
try:
r = self.session.get(img_url, timeout=30)
if r.status_code == 200:
content_type = r.headers.get('content-type', 'image/jpeg')
return [200, content_type, r.content, {'Cache-Control': 'max-age=86400'}]
else:
return [404, 'text/plain', f'图片不存在 ({r.status_code})']
except Exception:
return [500, 'text/plain', '代理图片失败']
def _proxy_single(self, params):
vid = params.get('vid')
data = self.getCache(f'yt_single_{vid}') if vid else None
if not data:
return [404, 'text/plain', '播放缓存已过期或不存在']
target_url = data.get('url')
if not target_url:
return [404, 'text/plain', '播放地址不存在']
headers = (data.get('headers') or self.header).copy()
range_header = params.get('range') or params.get('Range')
if range_header:
headers['Range'] = range_header
try:
r = self.session.get(target_url, headers=headers, stream=True, timeout=120)
content_type = r.headers.get('content-type', 'video/mp4')
resp_headers = {
'Content-Type': content_type,
'Accept-Ranges': 'bytes',
'Cache-Control': 'no-cache',
}
if r.headers.get('content-range'):
resp_headers['Content-Range'] = r.headers.get('content-range')
if r.headers.get('content-length'):
resp_headers['Content-Length'] = r.headers.get('content-length')
return [r.status_code, content_type, r.content, resp_headers]
except Exception:
return [500, 'text/plain', '代理播放失败']
def destroy(self):
try:
self.session.close()
except Exception:
pass
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
73b0a7d905aa71581bfad6860e7affc4
bf1480593cbb56542c8f183231818244
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
20b84d6b6d2f6f4e3445efe0cbe3d592
0b0eee7f30e33f4c9ef607f8bf3470f2
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
05be016ae6119c38a60f62717af8c883
0212473db4864d72a0a8aa9394ba2116
+151 -155
View File
@@ -68,7 +68,7 @@ http://101.43.145.141:12002/gaoma/cctv4k.m3u8$LR•IPV4•7『线路2』
#EXTINF:-1 tvg-id="CCTV4K" tvg-name="CCTV4K" group-title="4K",CCTV4K
https://live-play-hls.cctvnews.cctv.com/CCTVChannel/channel_cctv4k_mbd.m3u8?auth_key=1784358000-1-b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c-c0b2f705841d49d821e3075961bb6e84&yid=b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c$LR•IPV4•7『线路3』
#EXTINF:-1 tvg-id="CCTV4K" tvg-name="CCTV4K" group-title="4K",CCTV4K
https://live-play-hls.cctvnews.cctv.com/CCTVChannel/channel_cctv4k_mbd.m3u8?auth_key=1784361600-1-b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c-dbc4b9704792e97da2c65aeed2033e45&yid=b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c$LR•IPV4•7『线路4』
https://live-play-hls.cctvnews.cctv.com/CCTVChannel/channel_cctv4k_mbd.m3u8?auth_key=1784371500-1-b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c-48ffc61db508f8062cc67caddde58d68&yid=b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c$LR•IPV4•7『线路4』
#EXTINF:-1 tvg-id="CCTV4K" tvg-name="CCTV4K" group-title="4K",CCTV4K
http://198.204.240.250:82/live/cctv4k.m3u8$LR•IPV4•7『线路5』
#EXTINF:-1 tvg-id="CCTV4K" tvg-name="CCTV4K" group-title="4K",CCTV4K
@@ -170,7 +170,7 @@ p3p://167.114.175.6:55331/61244d9c0006885d64b1b7591f6c12a0$LR•IPV4•16『线
#EXTINF:-1 tvg-id="CCTV4" tvg-name="CCTV4" group-title="央视",CCTV4
https://live-play-hls.cctvnews.cctv.com/CCTVChannel/channel_cctv4_mbd.m3u8?auth_key=1784358000-1-b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c-109c81da2b0d59c7b20e5792a12e386f&yid=b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c$LR•IPV4•16『线路10』
#EXTINF:-1 tvg-id="CCTV4" tvg-name="CCTV4" group-title="央视",CCTV4
https://live-play-hls.cctvnews.cctv.com/CCTVChannel/channel_cctv4_mbd.m3u8?auth_key=1784361600-1-b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c-e246d8a5986fffcd5d21d25acc7aca83&yid=b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c$LR•IPV4•16『线路11』
https://live-play-hls.cctvnews.cctv.com/CCTVChannel/channel_cctv4_mbd.m3u8?auth_key=1784371500-1-b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c-bb4241b14453c4f49bd0749a3aab3caf&yid=b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c$LR•IPV4•16『线路11』
#EXTINF:-1 tvg-id="CCTV4" tvg-name="CCTV4" group-title="央视",CCTV4
https://live-play-hls.cctvnews.cctv.com/CCTVChannel/channel_cctv4_mbd.m3u8?auth_key=1784271600-1-b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c-6aec44040ec72def77e22587fc404005&yid=b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c$LR•IPV4•16『线路12』
#EXTINF:-1 tvg-id="CCTV4" tvg-name="CCTV4" group-title="央视",CCTV4
@@ -310,7 +310,7 @@ http://153.0.171.163:9901/tsfile/live/1008_1.m3u8?key=txiptv&playlive=1&authid=0
#EXTINF:-1 tvg-id="CCTV9" tvg-name="CCTV9" group-title="央视",CCTV9
https://v4-e6b1c5baf4e240fe63adbf68dda23435.livehwc4.com/play.kankanlive.com/live/1698423397390920.m3u8?sub_m3u8=true&edge_slice=true&user_session_id=8a60541ebe4d355d0da6b086b9f2026d$LR•IPV4•12『线路8』
#EXTINF:-1 tvg-id="CCTV9" tvg-name="CCTV9" group-title="央视",CCTV9
https://v4-702cae17a28d6e4f0c0002bba021d934.livehwc4.com/play.kankanlive.com/live/1698423397390920.m3u8?sub_m3u8=true&edge_slice=true&user_session_id=db97ec06b982224fd6b00b7bb1f6143c$LR•IPV4•12『线路9』
https://v4-702cae17a28d6e4f0c0002bba021d934.livehwc4.com/play.kankanlive.com/live/1698423397390920.m3u8?sub_m3u8=true&edge_slice=true&user_session_id=17294e1ca3c39692f88722ff53cecd2a$LR•IPV4•12『线路9』
#EXTINF:-1 tvg-id="CCTV9" tvg-name="CCTV9" group-title="央视",CCTV9
http://[2409:8087:8:21::18]:6610/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226944/1.m3u8?$LR•IPV6•12『线路10』
#EXTINF:-1 tvg-id="CCTV9" tvg-name="CCTV9" group-title="央视",CCTV9
@@ -876,41 +876,39 @@ http://153.0.171.163:9901/tsfile/live/0137_1.m3u8?key=txiptv&playlive=1&authid=0
#EXTINF:-1 tvg-id="东南卫视" tvg-name="东南卫视" group-title="卫视",东南卫视
http://118.81.195.79:9003/hls/24/index.m3u8$LR•IPV4•18『线路18』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="卫视",深圳卫视
http://[2409:8087:8:21::18]:6610/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226959/1.m3u8?GuardEncType=2&accountinfo=%7E%7EV2.0%7EGrVNEZREjuNVKiTJo2mtwg%7EtP4-l0lmSfjwLWEfK_el1vH_mv-s1zo4AQJwdedaVwG9xkuFTDg8J26cwOrNJzn20BErrHdLhuZ9EzLUCD3PMW-OMx4MGteHV2vLeW6BqoY%2CEND$LR•IPV6•18『线路1』
http://[2409:8087:8:21::18]:6610/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226959/1.m3u8?GuardEncType=2&accountinfo=%7E%7EV2.0%7EGrVNEZREjuNVKiTJo2mtwg%7EtP4-l0lmSfjwLWEfK_el1vH_mv-s1zo4AQJwdedaVwG9xkuFTDg8J26cwOrNJzn20BErrHdLhuZ9EzLUCD3PMW-OMx4MGteHV2vLeW6BqoY%2CEND$LR•IPV6•17『线路1』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="卫视",深圳卫视
http://120.198.95.220:9901/tsfile/live/1048_1.m3u8?key=txiptv&playlive=1&down=1$LR•IPV4•18『线路2』
http://120.198.95.220:9901/tsfile/live/1048_1.m3u8?key=txiptv&playlive=1&down=1$LR•IPV4•17『线路2』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="卫视",深圳卫视
http://120.198.95.220:9901/tsfile/live/1048_1.m3u8?key=txiptv$LR•IPV4•18『线路3』
http://120.198.95.220:9901/tsfile/live/1048_1.m3u8?key=txiptv$LR•IPV4•17『线路3』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="卫视",深圳卫视
http://173.208.212.130:8181/720p/szws.m3u8$LR•IPV4•18『线路4』
http://173.208.212.130:8181/720p/szws.m3u8$LR•IPV4•17『线路4』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="卫视",深圳卫视
http://192.151.150.154/live/szwshd.m3u8$LR•IPV4•18『线路5』
http://192.151.150.154/live/szwshd.m3u8$LR•IPV4•17『线路5』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="卫视",深圳卫视
http://124.228.160.210:9901/tsfile/live/0126_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•18『线路6』
http://124.228.160.210:9901/tsfile/live/0126_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•17『线路6』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="卫视",深圳卫视
http://36.136.38.87:9901/tsfile/live/0126_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•18『线路7』
http://36.136.38.87:9901/tsfile/live/0126_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•17『线路7』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="卫视",深圳卫视
http://183.11.239.36:808/hls/45/index.m3u8$LR•IPV4•18『线路8』
http://183.11.239.36:808/hls/45/index.m3u8$LR•IPV4•17『线路8』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="卫视",深圳卫视
https://sztv-hls.sztv.com.cn/AxeFRth/500/q37Age0.m3u8?sign=671fcd3c133f66cef04a83ae0b8c542b&t=6a59189c$LR•IPV4•18『线路9』
http://38.75.136.137:98/gslb/dsdqpub/szwshd.m3u8?auth=testpub$LR•IPV4•17『线路9』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="卫视",深圳卫视
http://38.75.136.137:98/gslb/dsdqpub/szwshd.m3u8?auth=testpub$LR•IPV4•18『线路10』
http://23.237.228.134/live6/shenzhen.m3u8$LR•IPV4•17『线路10』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="卫视",深圳卫视
http://23.237.228.134/live6/shenzhen.m3u8$LR•IPV4•18『线路11』
http://gfr.x3322.net:9901/tsfile/live/1095_1.m3u8$LR•IPV4•17『线路11』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="卫视",深圳卫视
http://gfr.x3322.net:9901/tsfile/live/1095_1.m3u8$LR•IPV4•18『线路12』
http://api.kkitv.itv888.cn:8080/hls/iftsd32ykm/index.m3u8$LR•IPV4•17『线路12』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="卫视",深圳卫视
http://api.kkitv.itv888.cn:8080/hls/iftsd32ykm/index.m3u8$LR•IPV4•18『线路13』
https://iptv.catvod.com/catvod.php?id=szws$LR•IPV4•17『线路13』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="卫视",深圳卫视
https://iptv.catvod.com/catvod.php?id=szws$LR•IPV4•18『线路14』
https://httop.top/ysp-深圳卫视$LR•IPV4•17『线路14』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="卫视",深圳卫视
https://httop.top/ysp-深圳卫视$LR•IPV4•18『线路15』
http://iptv.huuc.edu.cn/hls/szhd.m3u8$LR•IPV4•17『线路15』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="卫视",深圳卫视
http://iptv.huuc.edu.cn/hls/szhd.m3u8$LR•IPV4•18『线路16』
http://153.0.171.163:9901/tsfile/live/0126_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•17『线路16』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="卫视",深圳卫视
http://153.0.171.163:9901/tsfile/live/0126_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•18『线路17』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="卫视",深圳卫视
http://38.64.72.148:80/hls/modn/list/4007/playlist.m3u8$LR•IPV4•18『线路18』
http://38.64.72.148:80/hls/modn/list/4007/playlist.m3u8$LR•IPV4•17『线路17』
#EXTINF:-1 tvg-id="广东卫视" tvg-name="广东卫视" group-title="卫视",广东卫视
http://[2409:8087:8:21::18]:6610/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226961/1.m3u8?GuardEncType=2&accountinfo=%7E%7EV2.0%7E2MGyx659D_aaDPP0qt3NgA%7EtP4-l0lmSfjwLWEfK_el1vH_mv-s1zo4AQJwdedaVwG9xkuFTDg8J26cwOrNJzn20BErrHdLhuZ9EzLUCD3PMW-OMx4MGteHV2vLeW6BqoY%2CEND$LR•IPV6•12『线路1』
#EXTINF:-1 tvg-id="广东卫视" tvg-name="广东卫视" group-title="卫视",广东卫视
@@ -1018,31 +1016,33 @@ http://183.207.248.71/gitv/live1/G_GUIZHOU/G_GUIZHOU$LR•IPV4•16『线路15
#EXTINF:-1 tvg-id="贵州卫视" tvg-name="贵州卫视" group-title="卫视",贵州卫视
http://39.134.115.163:8080/PLTV/88888910/224/3221225728/index.m3u8$LR•IPV4•16『线路16』
#EXTINF:-1 tvg-id="河北卫视" tvg-name="河北卫视" group-title="卫视",河北卫视
http://[2409:8087:8:21::18]:6610/otttv.bj.chinamobile.com/PLTV/88888888/224/3221227014/1.m3u8?GuardEncType=2&accountinfo=%7E%7EV2.0%7ErSGjhI3DMaaAASPrbQJYTg%7EtP4-l0lmSfjwLWEfK_el1vH_mv-s1zo4AQJwdedaVwG9xkuFTDg8J26cwOrNJzn20BErrHdLhuZ9EzLUCD3PMW-OMx4MGteHV2vLeW6BqoY%2CEND$LR•IPV6•13『线路1』
http://[2409:8087:8:21::18]:6610/otttv.bj.chinamobile.com/PLTV/88888888/224/3221227014/1.m3u8?GuardEncType=2&accountinfo=%7E%7EV2.0%7ErSGjhI3DMaaAASPrbQJYTg%7EtP4-l0lmSfjwLWEfK_el1vH_mv-s1zo4AQJwdedaVwG9xkuFTDg8J26cwOrNJzn20BErrHdLhuZ9EzLUCD3PMW-OMx4MGteHV2vLeW6BqoY%2CEND$LR•IPV6•14『线路1』
#EXTINF:-1 tvg-id="河北卫视" tvg-name="河北卫视" group-title="卫视",河北卫视
http://101.66.194.63:9901/tsfile/live/0117_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•13『线路2』
http://101.66.194.63:9901/tsfile/live/0117_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•14『线路2』
#EXTINF:-1 tvg-id="河北卫视" tvg-name="河北卫视" group-title="卫视",河北卫视
http://101.66.199.247:9901/tsfile/live/0117_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•13『线路3』
http://101.66.199.247:9901/tsfile/live/0117_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•14『线路3』
#EXTINF:-1 tvg-id="河北卫视" tvg-name="河北卫视" group-title="卫视",河北卫视
http://204.12.221.218:8181/3m1080p/hews.m3u8$LR•IPV4•13『线路4』
http://204.12.221.218:8181/3m1080p/hews.m3u8$LR•IPV4•14『线路4』
#EXTINF:-1 tvg-id="河北卫视" tvg-name="河北卫视" group-title="卫视",河北卫视
http://event.pull.hebtv.com/jishi/weishi_tingyun.m3u8$LR•IPV4•13『线路5』
http://event.pull.hebtv.com/jishi/weishi_tingyun.m3u8$LR•IPV4•14『线路5』
#EXTINF:-1 tvg-id="河北卫视" tvg-name="河北卫视" group-title="卫视",河北卫视
http://183.11.239.36:808/hls/54/index.m3u8$LR•IPV4•13『线路6』
http://183.11.239.36:808/hls/54/index.m3u8$LR•IPV4•14『线路6』
#EXTINF:-1 tvg-id="河北卫视" tvg-name="河北卫视" group-title="卫视",河北卫视
http://23.237.228.134/live8/hebei.m3u8$LR•IPV4•13『线路7』
https://tv.pull.hebtv.com/jishi/nongminpindao.m3u8?t=1783932137&k=f5f7fa7a3e39ef329f1b86c4f866958c$LR•IPV4•14『线路7』
#EXTINF:-1 tvg-id="河北卫视" tvg-name="河北卫视" group-title="卫视",河北卫视
http://43.251.226.89:8080/play/42.m3u8$LR•IPV4•13『线路8』
http://23.237.228.134/live8/hebei.m3u8$LR•IPV4•14『线路8』
#EXTINF:-1 tvg-id="河北卫视" tvg-name="河北卫视" group-title="卫视",河北卫视
http://gfr.x3322.net:9901/tsfile/live/1091_1.m3u8$LR•IPV4•13『线路9』
http://43.251.226.89:8080/play/42.m3u8$LR•IPV4•14『线路9』
#EXTINF:-1 tvg-id="河北卫视" tvg-name="河北卫视" group-title="卫视",河北卫视
https://iptv.catvod.com/catvod.php?id=hbws$LR•IPV4•13『线路10』
http://gfr.x3322.net:9901/tsfile/live/1091_1.m3u8$LR•IPV4•14『线路10』
#EXTINF:-1 tvg-id="河北卫视" tvg-name="河北卫视" group-title="卫视",河北卫视
https://httop.top/ysp-河北卫视$LR•IPV4•13『线路11』
https://iptv.catvod.com/catvod.php?id=hbws$LR•IPV4•14『线路11』
#EXTINF:-1 tvg-id="河北卫视" tvg-name="河北卫视" group-title="卫视",河北卫视
http://iptv.huuc.edu.cn/hls/hebhd.m3u8$LR•IPV4•13『线路12』
https://httop.top/ysp-河北卫视$LR•IPV4•14『线路12』
#EXTINF:-1 tvg-id="河北卫视" tvg-name="河北卫视" group-title="卫视",河北卫视
http://153.0.171.163:9901/tsfile/live/0117_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•13『线路13』
http://iptv.huuc.edu.cn/hls/hebhd.m3u8$LR•IPV4•14『线路13』
#EXTINF:-1 tvg-id="河北卫视" tvg-name="河北卫视" group-title="卫视",河北卫视
http://153.0.171.163:9901/tsfile/live/0117_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•14『线路14』
#EXTINF:-1 tvg-id="河南卫视" tvg-name="河南卫视" group-title="卫视",河南卫视
http://101.66.195.138:9901/tsfile/live/0139_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•12『线路1』
#EXTINF:-1 tvg-id="河南卫视" tvg-name="河南卫视" group-title="卫视",河南卫视
@@ -1120,37 +1120,35 @@ http://www.745612.xyz:7788/rtp/235.254.198.72:1564$LR•IPV4•14『线路13』
#EXTINF:-1 tvg-id="湖北卫视" tvg-name="湖北卫视" group-title="卫视",湖北卫视
http://118.81.195.79:9003/hls/32/index.m3u8$LR•IPV4•14『线路14』
#EXTINF:-1 tvg-id="江西卫视" tvg-name="江西卫视" group-title="卫视",江西卫视
http://[2409:8087:8:21::18]:6610/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226956/1.m3u8?GuardEncType=2&accountinfo=%7E%7EV2.0%7Ei6ZIpVizXlewg-YfGvH8dA%7EtP4-l0lmSfjwLWEfK_el1vH_mv-s1zo4AQJwdedaVwG9xkuFTDg8J26cwOrNJzn20BErrHdLhuZ9EzLUCD3PMW-OMx4MGteHV2vLeW6BqoY%2CEND$LR•IPV6•16『线路1』
http://[2409:8087:8:21::18]:6610/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226956/1.m3u8?GuardEncType=2&accountinfo=%7E%7EV2.0%7Ei6ZIpVizXlewg-YfGvH8dA%7EtP4-l0lmSfjwLWEfK_el1vH_mv-s1zo4AQJwdedaVwG9xkuFTDg8J26cwOrNJzn20BErrHdLhuZ9EzLUCD3PMW-OMx4MGteHV2vLeW6BqoY%2CEND$LR•IPV6•15『线路1』
#EXTINF:-1 tvg-id="江西卫视" tvg-name="江西卫视" group-title="卫视",江西卫视
http://101.66.199.247:9901/tsfile/live/0138_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•16『线路2』
http://101.66.199.247:9901/tsfile/live/0138_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•15『线路2』
#EXTINF:-1 tvg-id="江西卫视" tvg-name="江西卫视" group-title="卫视",江西卫视
http://112.123.243.37:50085/tsfile/live/0132_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•16『线路3』
http://112.123.243.37:50085/tsfile/live/0132_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•15『线路3』
#EXTINF:-1 tvg-id="江西卫视" tvg-name="江西卫视" group-title="卫视",江西卫视
http://124.228.160.210:9901/tsfile/live/0138_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•16『线路4』
http://124.228.160.210:9901/tsfile/live/0138_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•15『线路4』
#EXTINF:-1 tvg-id="江西卫视" tvg-name="江西卫视" group-title="卫视",江西卫视
http://153.0.171.163:9901/tsfile/live/0138_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•16『线路5』
http://153.0.171.163:9901/tsfile/live/0138_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•15『线路5』
#EXTINF:-1 tvg-id="江西卫视" tvg-name="江西卫视" group-title="卫视",江西卫视
http://112.27.235.94:8000/hls/44/index.m3u8$LR•IPV4•16『线路6』
http://112.27.235.94:8000/hls/44/index.m3u8$LR•IPV4•15『线路6』
#EXTINF:-1 tvg-id="江西卫视" tvg-name="江西卫视" group-title="卫视",江西卫视
https://jsp-tv-live.jxtvcn.com.cn/live-jsp/tv_jxtv6.m3u8?t=1784004704&token=67a59c29-de6e-4407-90c8-39f7e099b3db&d=0a7a8c487c454bc7bb02a60298283c5e$LR•IPV4•16『线路7』
http://38.75.136.137:98/gslb/dsdqpub/jxwshd.m3u8?auth=testpub$LR•IPV4•15『线路7』
#EXTINF:-1 tvg-id="江西卫视" tvg-name="江西卫视" group-title="卫视",江西卫视
http://38.75.136.137:98/gslb/dsdqpub/jxwshd.m3u8?auth=testpub$LR•IPV4•16『线路8』
http://23.237.228.134/live8/jiangxi.m3u8$LR•IPV4•15『线路8』
#EXTINF:-1 tvg-id="江西卫视" tvg-name="江西卫视" group-title="卫视",江西卫视
http://23.237.228.134/live8/jiangxi.m3u8$LR•IPV4•16『线路9』
http://43.251.226.89:8080/play/43.m3u8$LR•IPV4•15『线路9』
#EXTINF:-1 tvg-id="江西卫视" tvg-name="江西卫视" group-title="卫视",江西卫视
http://43.251.226.89:8080/play/43.m3u8$LR•IPV4•16『线路10』
http://api.kkitv.itv888.cn:8080/hls/pv0np60bpin/index.m3u8$LR•IPV4•15『线路10』
#EXTINF:-1 tvg-id="江西卫视" tvg-name="江西卫视" group-title="卫视",江西卫视
http://api.kkitv.itv888.cn:8080/hls/pv0np60bpin/index.m3u8$LR•IPV4•16『线路11』
https://iptv.catvod.com/catvod.php?id=jxws$LR•IPV4•15『线路11』
#EXTINF:-1 tvg-id="江西卫视" tvg-name="江西卫视" group-title="卫视",江西卫视
https://iptv.catvod.com/catvod.php?id=jxws$LR•IPV4•16『线路12』
https://httop.top/ysp-江西卫视$LR•IPV4•15『线路12』
#EXTINF:-1 tvg-id="江西卫视" tvg-name="江西卫视" group-title="卫视",江西卫视
https://httop.top/ysp-江西卫视$LR•IPV4•16『线路13』
http://iptv.huuc.edu.cn/hls/jxhd.m3u8$LR•IPV4•15『线路13』
#EXTINF:-1 tvg-id="江西卫视" tvg-name="江西卫视" group-title="卫视",江西卫视
http://iptv.huuc.edu.cn/hls/jxhd.m3u8$LR•IPV4•16『线路14』
http://mg.hmysapp.cn:177/ckmg/zb.php?id=jxws$LR•IPV4•15『线路14』
#EXTINF:-1 tvg-id="江西卫视" tvg-name="江西卫视" group-title="卫视",江西卫视
http://mg.hmysapp.cn:177/ckmg/zb.php?id=jxws$LR•IPV4•16『线路15』
#EXTINF:-1 tvg-id="江西卫视" tvg-name="江西卫视" group-title="卫视",江西卫视
http://39.134.115.163:8080/PLTV/88888910/224/3221225705/index.m3u8$LR•IPV4•16『线路16』
http://39.134.115.163:8080/PLTV/88888910/224/3221225705/index.m3u8$LR•IPV4•15『线路15』
#EXTINF:-1 tvg-id="吉林卫视" tvg-name="吉林卫视" group-title="卫视",吉林卫视
http://[2409:8087:8:21::18]:6610/otttv.bj.chinamobile.com/PLTV/88888888/224/3221227015/1.m3u8?GuardEncType=2&accountinfo=%7E%7EV2.0%7EW5-3AVdwD5KlUpuA4mz7Cg%7EtP4-l0lmSfjwLWEfK_el1vH_mv-s1zo4AQJwdedaVwG9xkuFTDg8J26cwOrNJzn20BErrHdLhuZ9EzLUCD3PMW-OMx4MGteHV2vLeW6BqoY%2CEND$LR•IPV6•17『线路1』
#EXTINF:-1 tvg-id="吉林卫视" tvg-name="吉林卫视" group-title="卫视",吉林卫视
@@ -1400,39 +1398,37 @@ http://223.110.243.136/PLTV/3/224/3221225523/index.m3u8$LR•IPV4•14『线路1
#EXTINF:-1 tvg-id="新疆卫视" tvg-name="新疆卫视" group-title="卫视",新疆卫视
http://112.25.48.68/live/program/live/xjws/1300000/mnf.m3u8$LR•IPV4•14『线路14』
#EXTINF:-1 tvg-id="云南卫视" tvg-name="云南卫视" group-title="卫视",云南卫视
http://[2409:8087:8:21::18]:6610/otttv.bj.chinamobile.com/PLTV/88888888/224/3221227028/1.m3u8?GuardEncType=2&accountinfo=%7E%7EV2.0%7EGfQPqRNVeBjTMsZ48qu0SA%7EtP4-l0lmSfjwLWEfK_el1vH_mv-s1zo4AQJwdedaVwG9xkuFTDg8J26cwOrNJzn20BErrHdLhuZ9EzLUCD3PMW-OMx4MGteHV2vLeW6BqoY%2CEND$LR•IPV6•17『线路1』
http://[2409:8087:8:21::18]:6610/otttv.bj.chinamobile.com/PLTV/88888888/224/3221227028/1.m3u8?GuardEncType=2&accountinfo=%7E%7EV2.0%7EGfQPqRNVeBjTMsZ48qu0SA%7EtP4-l0lmSfjwLWEfK_el1vH_mv-s1zo4AQJwdedaVwG9xkuFTDg8J26cwOrNJzn20BErrHdLhuZ9EzLUCD3PMW-OMx4MGteHV2vLeW6BqoY%2CEND$LR•IPV6•16『线路1』
#EXTINF:-1 tvg-id="云南卫视" tvg-name="云南卫视" group-title="卫视",云南卫视
http://120.198.95.220:9901/tsfile/live/1056_1.m3u8?key=txiptv&playlive=1&down=1$LR•IPV4•17『线路2』
http://120.198.95.220:9901/tsfile/live/1056_1.m3u8?key=txiptv&playlive=1&down=1$LR•IPV4•16『线路2』
#EXTINF:-1 tvg-id="云南卫视" tvg-name="云南卫视" group-title="卫视",云南卫视
http://38.75.136.137:98/gslb/dsdqpub/ynwshd.m3u8?auth=testpub$LR•IPV4•17『线路3』
http://38.75.136.137:98/gslb/dsdqpub/ynwshd.m3u8?auth=testpub$LR•IPV4•16『线路3』
#EXTINF:-1 tvg-id="云南卫视" tvg-name="云南卫视" group-title="卫视",云南卫视
http://204.12.221.218:8181/3m1080p/ynws.m3u8$LR•IPV4•17『线路4』
http://204.12.221.218:8181/3m1080p/ynws.m3u8$LR•IPV4•16『线路4』
#EXTINF:-1 tvg-id="云南卫视" tvg-name="云南卫视" group-title="卫视",云南卫视
http://112.123.243.37:50085/tsfile/live/0117_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•17『线路5』
http://112.123.243.37:50085/tsfile/live/0117_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•16『线路5』
#EXTINF:-1 tvg-id="云南卫视" tvg-name="云南卫视" group-title="卫视",云南卫视
http://101.66.194.82:9901/tsfile/live/0119_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•17『线路6』
http://101.66.194.82:9901/tsfile/live/0119_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•16『线路6』
#EXTINF:-1 tvg-id="云南卫视" tvg-name="云南卫视" group-title="卫视",云南卫视
http://101.66.194.63:9901/tsfile/live/0119_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•17『线路7』
http://101.66.194.63:9901/tsfile/live/0119_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•16『线路7』
#EXTINF:-1 tvg-id="云南卫视" tvg-name="云南卫视" group-title="卫视",云南卫视
http://36.136.38.87:9901/tsfile/live/0119_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•17『线路8』
http://36.136.38.87:9901/tsfile/live/0119_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•16『线路8』
#EXTINF:-1 tvg-id="云南卫视" tvg-name="云南卫视" group-title="卫视",云南卫视
http://101.66.195.138:9901/tsfile/live/0119_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•17『线路9』
http://101.66.195.138:9901/tsfile/live/0119_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•16『线路9』
#EXTINF:-1 tvg-id="云南卫视" tvg-name="云南卫视" group-title="卫视",云南卫视
http://101.66.199.247:9901/tsfile/live/0119_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•17『线路10』
http://101.66.199.247:9901/tsfile/live/0119_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•16『线路10』
#EXTINF:-1 tvg-id="云南卫视" tvg-name="云南卫视" group-title="卫视",云南卫视
http://153.0.171.163:9901/tsfile/live/0119_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•17『线路11』
http://153.0.171.163:9901/tsfile/live/0119_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•16『线路11』
#EXTINF:-1 tvg-id="云南卫视" tvg-name="云南卫视" group-title="卫视",云南卫视
http://112.27.235.94:8000/hls/40/index.m3u8$LR•IPV4•17『线路12』
http://112.27.235.94:8000/hls/40/index.m3u8$LR•IPV4•16『线路12』
#EXTINF:-1 tvg-id="云南卫视" tvg-name="云南卫视" group-title="卫视",云南卫视
http://p2.ioioz.com/xgplayer.php?id=https://hwapi.yntv.net/ew265l/z1z6s5.m3u8$LR•IPV4•17『线路13』
http://23.237.228.134/live8/yunnan.m3u8$LR•IPV4•16『线路13』
#EXTINF:-1 tvg-id="云南卫视" tvg-name="云南卫视" group-title="卫视",云南卫视
http://23.237.228.134/live8/yunnan.m3u8$LR•IPV4•17『线路14』
https://iptv.catvod.com/catvod.php?id=ynws$LR•IPV4•16『线路14』
#EXTINF:-1 tvg-id="云南卫视" tvg-name="云南卫视" group-title="卫视",云南卫视
https://iptv.catvod.com/catvod.php?id=ynws$LR•IPV4•17『线路15』
https://httop.top/ysp-云南卫视$LR•IPV4•16『线路15』
#EXTINF:-1 tvg-id="云南卫视" tvg-name="云南卫视" group-title="卫视",云南卫视
https://httop.top/ysp-云南卫视$LR•IPV4•17『线路16』
#EXTINF:-1 tvg-id="云南卫视" tvg-name="云南卫视" group-title="卫视",云南卫视
https://hwapi.yunshicloud.com/8xughf/e0bx15.m3u8$LR•IPV4•17『线路17』
https://hwapi.yunshicloud.com/8xughf/e0bx15.m3u8$LR•IPV4•16『线路16』
#EXTINF:-1 tvg-id="西藏卫视" tvg-name="西藏卫视" group-title="卫视",西藏卫视
http://[2409:8087:8:21::18]:6610/otttv.bj.chinamobile.com/PLTV/88888888/224/3221227033/1.m3u8?GuardEncType=2&accountinfo=%7E%7EV2.0%7EdeTB7OZ9G_VNJk5C3t96fQ%7EtP4-l0lmSfjwLWEfK_el1vH_mv-s1zo4AQJwdedaVwG9xkuFTDg8J26cwOrNJzn20BErrHdLhuZ9EzLUCD3PMW-OMx4MGteHV2vLeW6BqoY%2CEND$LR•IPV6•12『线路1』
#EXTINF:-1 tvg-id="西藏卫视" tvg-name="西藏卫视" group-title="卫视",西藏卫视
@@ -1556,7 +1552,7 @@ http://101.66.199.247:9901/tsfile/live/0118_1.m3u8?key=txiptv&playlive=0&authid=
#EXTINF:-1 tvg-id="山西卫视" tvg-name="山西卫视" group-title="卫视",山西卫视
http://153.0.171.163:9901/tsfile/live/0118_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•15『线路10』
#EXTINF:-1 tvg-id="山西卫视" tvg-name="山西卫视" group-title="卫视",山西卫视
https://livehhhttps.sxrtv.com/lsdream/lce1mC4/800/h1thc41.m3u8$LR•IPV4•15『线路11』
https://livehhhttps.sxrtv.com/lsdream/Md571Kv/800/p7iM150.m3u8$LR•IPV4•15『线路11』
#EXTINF:-1 tvg-id="山西卫视" tvg-name="山西卫视" group-title="卫视",山西卫视
http://23.237.228.134/live8/shanxi.m3u8$LR•IPV4•15『线路12』
#EXTINF:-1 tvg-id="山西卫视" tvg-name="山西卫视" group-title="卫视",山西卫视
@@ -1884,9 +1880,9 @@ http://feiyang.ak47s.top:35455/itv/1000000001000009601.m3u8?cdn=ystenlive$LR•I
#EXTINF:-1 tvg-id="NewTV超级体育" tvg-name="NewTV超级体育" group-title="数字",NewTV超级体育
http://kkk.jjjj.jiduo.me/api.php?n=tttt&id=3188&tk=23a9aca1f79f$LR•IPV4•5『线路5』
#EXTINF:-1 tvg-id="NewTV动作电影" tvg-name="NewTV动作电影" group-title="数字",NewTV动作电影
http://39.134.19.68/dbiptv.sn.chinamobile.com/PLTV/88888888/224/3221226465/index.m3u8$LR•IPV4•2『线路1』
http://live.metshop.top/huya/11602077?cdn=alicdn$LR•IPV4•2『线路1』
#EXTINF:-1 tvg-id="NewTV动作电影" tvg-name="NewTV动作电影" group-title="数字",NewTV动作电影
http://live.metshop.top/huya/11602077?cdn=alicdn$LR•IPV4•2『线路2』
http://39.134.19.68/dbiptv.sn.chinamobile.com/PLTV/88888888/224/3221226465/index.m3u8$LR•IPV4•2『线路2』
#EXTINF:-1 tvg-id="NewTV精品体育" tvg-name="NewTV精品体育" group-title="数字",NewTV精品体育
https://epg.pw/stream/f7556eccd4ae06b0c2991fdc7a4f8388496559f728cc82459a8e50346040e226.m3u8$LR•IPV4•6『线路1』
#EXTINF:-1 tvg-id="NewTV精品体育" tvg-name="NewTV精品体育" group-title="数字",NewTV精品体育
@@ -2200,9 +2196,9 @@ https://ls.qingting.fm/live/21303/64k.m3u8$LR•IPV4•2『线路1』
#EXTINF:-1 tvg-id="铜陵新闻综合频道" tvg-name="铜陵新闻综合频道" group-title="安徽",铜陵新闻综合频道
http://dstpush1.retalltech.com/app/stream1.m3u8$LR•IPV4•2『线路2』
#EXTINF:-1 tvg-id="亳州农村" tvg-name="亳州农村" group-title="安徽",亳州农村
http://220.180.110.101:8083/videos/live/39/13/o4ncrHkSp7q09/o4ncrHkSp7q09.m3u8$LR•IPV4•2『线路1』
http://zbbf2.ahbztv.com/live/418.m3u8$LR•IPV4•2『线路1』
#EXTINF:-1 tvg-id="亳州农村" tvg-name="亳州农村" group-title="安徽",亳州农村
http://zbbf2.ahbztv.com/live/418.m3u8$LR•IPV4•2『线路2』
http://220.180.110.101:8083/videos/live/39/13/o4ncrHkSp7q09/o4ncrHkSp7q09.m3u8$LR•IPV4•2『线路2』
#EXTINF:-1 tvg-id="北京财经" tvg-name="北京财经" group-title="北京",北京财经
http://ivi.bupt.edu.cn/hls/btv5.m3u8$LR•IPV4
#EXTINF:-1 tvg-id="北京青年" tvg-name="北京青年" group-title="北京",北京青年
@@ -2222,31 +2218,31 @@ https://31182.hlsplay.aodianyun.com/lms_31182/tv_channel_175.m3u8$LR•IPV4
#EXTINF:-1 tvg-id="南宁影视娱乐" tvg-name="南宁影视娱乐" group-title="广西",南宁影视娱乐
http://hls.nntv.cn/nnlive/YSYL_244.m3u8$LR•IPV4
#EXTINF:-1 tvg-id="邢台综合" tvg-name="邢台综合" group-title="河北",邢台综合
http://222.223.119.21:8888/newlive/live/hls/54/live.m3u8$LR•IPV4•2『线路1』
https://jwplay.hebyun.com.cn:443/live/xtsrmtzs/1500k/tzwj_video.m3u8$LR•IPV4•2『线路1』
#EXTINF:-1 tvg-id="邢台综合" tvg-name="邢台综合" group-title="河北",邢台综合
https://jwplay.hebyun.com.cn:443/live/xtsrmtzs/1500k/tzwj_video.m3u8$LR•IPV4•2『线路2』
http://222.223.119.21:8888/newlive/live/hls/54/live.m3u8$LR•IPV4•2『线路2』
#EXTINF:-1 tvg-id="河北都市" tvg-name="河北都市" group-title="河北",河北都市
http://121.19.134.246:808/hls/21/index.m3u8$LR•IPV4•2『线路1』
http://1.94.31.214/php/hebei.php?id=hbds$LR•IPV4•2『线路1』
#EXTINF:-1 tvg-id="河北都市" tvg-name="河北都市" group-title="河北",河北都市
http://1.94.31.214/php/hebei.php?id=hbds$LR•IPV4•2『线路2』
http://121.19.134.246:808/hls/21/index.m3u8$LR•IPV4•2『线路2』
#EXTINF:-1 tvg-id="河北农民" tvg-name="河北农民" group-title="河北",河北农民
http://121.19.134.246:808/hls/25/index.m3u8$LR•IPV4•2『线路1』
https://ls.qingting.fm/live/1650/64k.m3u8$LR•IPV4•2『线路1』
#EXTINF:-1 tvg-id="河北农民" tvg-name="河北农民" group-title="河北",河北农民
https://ls.qingting.fm/live/1650/64k.m3u8$LR•IPV4•2『线路2』
http://121.19.134.246:808/hls/25/index.m3u8$LR•IPV4•2『线路2』
#EXTINF:-1 tvg-id="鹿泉一套" tvg-name="鹿泉一套" group-title="河北",鹿泉一套
http://hblq.chinashadt.com:2036/live/stream:luquan1.stream/playlist.m3u8$LR•IPV4
#EXTINF:-1 tvg-id="河北经济" tvg-name="河北经济" group-title="河北",河北经济
http://121.19.134.246:808/hls/20/index.m3u8$LR•IPV4•2『线路1』
http://1.94.31.214/php/hebei.php?id=jjsh$LR•IPV4•2『线路1』
#EXTINF:-1 tvg-id="河北经济" tvg-name="河北经济" group-title="河北",河北经济
http://1.94.31.214/php/hebei.php?id=jjsh$LR•IPV4•2『线路2』
http://121.19.134.246:808/hls/20/index.m3u8$LR•IPV4•2『线路2』
#EXTINF:-1 tvg-id="河北影视" tvg-name="河北影视" group-title="河北",河北影视
http://121.19.134.246:808/hls/22/index.m3u8$LR•IPV4•2『线路1』
http://1.94.31.214/php/hebei.php?id=hbys$LR•IPV4•2『线路1』
#EXTINF:-1 tvg-id="河北影视" tvg-name="河北影视" group-title="河北",河北影视
http://1.94.31.214/php/hebei.php?id=hbys$LR•IPV4•2『线路2』
http://121.19.134.246:808/hls/22/index.m3u8$LR•IPV4•2『线路2』
#EXTINF:-1 tvg-id="河北公共" tvg-name="河北公共" group-title="河北",河北公共
http://121.19.134.246:808/hls/24/index.m3u8$LR•IPV4•2『线路1』
http://1.94.31.214/php/hebei.php?id=hbgg$LR•IPV4•2『线路1』
#EXTINF:-1 tvg-id="河北公共" tvg-name="河北公共" group-title="河北",河北公共
http://1.94.31.214/php/hebei.php?id=hbgg$LR•IPV4•2『线路2』
http://121.19.134.246:808/hls/24/index.m3u8$LR•IPV4•2『线路2』
#EXTINF:-1 tvg-id="鹿泉二套" tvg-name="鹿泉二套" group-title="河北",鹿泉二套
http://hblq.chinashadt.com:2036/live/stream:luquan2.stream/playlist.m3u8$LR•IPV4
#EXTINF:-1 tvg-id="内蒙新闻" tvg-name="内蒙新闻" group-title="内蒙古",内蒙新闻
@@ -2288,13 +2284,13 @@ http://183.207.248.71/gitv/live1/G_NJSB/G_NJSB$LR•IPV4
#EXTINF:-1 tvg-id="江苏体育" tvg-name="江苏体育" group-title="江苏",江苏体育
http://183.207.248.71/gitv/live1/G_JSTY/G_JSTY$LR•IPV4
#EXTINF:-1 tvg-id="南京教科" tvg-name="南京教科" group-title="江苏",南京教科
https://live.nbs.cn/channels/njtv/jkpd/m3u8:500k/live.m3u8$LR•IPV4•4『线路1』
http://nklive.nbs.cn/hls/75b3c462-b831-4de7-a34b-5d3221db2069/index.m3u8$LR•IPV4•4『线路1』
#EXTINF:-1 tvg-id="南京教科" tvg-name="南京教科" group-title="江苏",南京教科
http://183.207.248.71/gitv/live1/G_NJJK/G_NJJK$LR•IPV4•4『线路2』
https://live.nbs.cn/channels/njtv/jkpd/m3u8:500k/live.m3u8$LR•IPV4•4『线路2』
#EXTINF:-1 tvg-id="南京教科" tvg-name="南京教科" group-title="江苏",南京教科
http://223.110.245.155/ott.js.chinamobile.com/PLTV/3/224/3221227194/index.m3u8$LR•IPV4•4『线路3』
http://183.207.248.71/gitv/live1/G_NJJK/G_NJJK$LR•IPV4•4『线路3』
#EXTINF:-1 tvg-id="南京教科" tvg-name="南京教科" group-title="江苏",南京教科
http://nklive.nbs.cn/hls/75b3c462-b831-4de7-a34b-5d3221db2069/index.m3u8$LR•IPV4•4『线路4』
http://223.110.245.155/ott.js.chinamobile.com/PLTV/3/224/3221227194/index.m3u8$LR•IPV4•4『线路4』
#EXTINF:-1 tvg-id="南京少儿" tvg-name="南京少儿" group-title="江苏",南京少儿
https://live.nbs.cn/channels/njtv/sepd/m3u8:500k/live.m3u8$LR•IPV4
#EXTINF:-1 tvg-id="苏州4k" tvg-name="苏州4k" group-title="江苏",苏州4k
@@ -5912,99 +5908,99 @@ https://stream1.freetv.fun/shang-hai-xin-wen-zong-he-8.m3u8$LR•IPV4•115『
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
https://stream1.freetv.fun/ipv6-xin-wen-zong-he-10.m3u8$LR•IPV4•115『线路70』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
https://stream2.jlntv.cn/baicheng1/sd/live.m3u8$LR•IPV4•115『线路71』
http://stream8.jlntv.cn/shulan/sd/live.m3u8?_upt=332db6421699196585$LR•IPV4•115『线路71』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://live.cztv.cc:85/live/xwpd.m3u8$LR•IPV4•115『线路72』
http://stream5.jlntv.cn/hn/sd/live.m3u8$LR•IPV4•115『线路72』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://117.156.28.119/270000001111/1110000001/index.m3u8$LR•IPV4•115『线路73』
http://pili-live-hls.ybcxjd.com/jdh-live/2108111201035597.m3u8?zsicd$LR•IPV4•115『线路73』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://pili-live-hls.hebitv.com/hebi/hebi.m3u8$LR•IPV4•115『线路74』
http://live.spccmc.com:90/live/spxwzh.m3u8$LR•IPV4•115『线路74』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
https://stream2.jlntv.cn/naxw/sd/live.m3u8$LR•IPV4•115『线路75』
http://live.iwcmt.cn:90/live/zhxw.m3u8$LR•IPV4•115『线路75』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://uni6rtmp.tulix.tv:1935/vbstv/vbsabr.smil/chunklist_w439903609_b1228800.m3u8$LR•IPV4•115『线路76』
http://live.jinchuanrmt.com:90/live/zhxw.m3u8?zsicd$LR•IPV4•115『线路76』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://221.5.213.4:30000/1111.m3u8$LR•IPV4•115『线路77』
https://play.yunxya.com/channellive/xinwen.m3u8$LR•IPV4•115『线路77』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
https://stream2.jlntv.cn/jilin1/sd/live.m3u8$LR•IPV4•115『线路78』
http://ls.qingting.fm/live/267.m3u8$LR•IPV4•115『线路78』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://30515.hlsplay.aodianyun.com/lms_30515/tv_channel_239.m3u8$LR•IPV4•115『线路79』
http://hslive.hsnewsnet.com/lsdream/hve9Wjs/1000/live.m3u8$LR•IPV4•115『线路79』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
https://stream2.jlntv.cn/sptv/sd/live.m3u8$LR•IPV4•115『线路80』
https://p2.vzan.com/slowlive/596867413819827251/live.m3u8?zbid=1725814272&amp;amp;tpid=1516989100&amp;amp;type=0$LR•IPV4•115『线路80』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://live.ahsz.tv/video/s10001-szzh/index.m3u8$LR•IPV4•115『线路81』
http://uzoiczhh.live.sxmty.com/live/hls/0d41f1480c4042d49927858f01fde707/53130407737b417b9a6259b57246bae3.m3u8?zshanxd$LR•IPV4•115『线路81』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://guangshui.live.tempsource.cjyun.org/videotmp/s10146-GSXW.m3u8$LR•IPV4•115『线路82』
https://ls.qingting.fm/live/5043/64k.m3u8$LR•IPV4•115『线路82』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
https://stream2.jlntv.cn/jlyb/sd/live.m3u8$LR•IPV4•115『线路83』
http://liveout.btzx.com.cn/62ds9e/4nxdih.m3u8?fbl=$LR•IPV4•115『线路83』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
https://stream2.jlntv.cn/sytv/sd/live.m3u8$LR•IPV4•115『线路84』
http://nklive.nbs.cn/hls/d511bc9d-a694-4453-b3a2-4fc842cc97a1/index.m3u8$LR•IPV4•115『线路84』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://222.179.155.21:1935/ch1.m3u8$LR•IPV4•115『线路85』
http://cm-wshls.homecdn.com/live/2aa50.m3u8$LR•IPV4•115『线路85』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://117.172.215.250:8083/videos/live/35/39/GQVbrgob5CGJM/GQVbrgob5CGJM.m3u8$LR•IPV4•115『线路86』
http://ls.qingting.fm/live/23797.m3u8$LR•IPV4•115『线路86』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://220.180.110.101:8083/videos/live/36/57/hwEHU4UVQ1Iv5/hwEHU4UVQ1Iv5.m3u8$LR•IPV4•115『线路87』
https://play.kankanlive.com/live/1720583434627241.m3u8$LR•IPV4•115『线路87』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://live.hnxttv.com:9601/live/xwzh/800K/tzwj_video.m3u8$LR•IPV4•115『线路88』
https://ls.qingting.fm/live/5022100/64k.m3u8$LR•IPV4•115『线路88』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://stream.bzcm.net/2/sd/live.m3u8$LR•IPV4•115『线路89』
https://liveout.xntv.tv/a65jur/96iln2.m3u8?zqinghd$LR•IPV4•115『线路89』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://117.156.28.119/270000001111/1110000145/index.m3u8$LR•IPV4•115『线路90』
http://live.qthnews.org.cn:1935/live/live1/800k/tzwj_video.m3u8$LR•IPV4•115『线路90』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
https://stream2.jlntv.cn/baishan1/sd/live.m3u8$LR•IPV4•115『线路91』
http://stream.hrbtv.net/xwzh/sd/live.m3u8?zheild$LR•IPV4•115『线路91』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://live1.wuhubtv.com/channel1/sd/live.m3u8$LR•IPV4•115『线路92』
https://stream2.jlntv.cn/baicheng1/sd/live.m3u8$LR•IPV4•115『线路92』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://palive.patv123.com:8091/live/xwpd_800K.m3u8$LR•IPV4•115『线路93』
http://live.cztv.cc:85/live/xwpd.m3u8$LR•IPV4•115『线路93』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
https://stream2.jlntv.cn/liaoyuan1/sd/live.m3u8$LR•IPV4•115『线路94』
http://117.156.28.119/270000001111/1110000001/index.m3u8$LR•IPV4•115『线路94』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://stream8.jlntv.cn/shulan/sd/live.m3u8?_upt=332db6421699196585$LR•IPV4•115『线路95』
http://pili-live-hls.hebitv.com/hebi/hebi.m3u8$LR•IPV4•115『线路95』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://stream5.jlntv.cn/hn/sd/live.m3u8$LR•IPV4•115『线路96』
https://stream2.jlntv.cn/naxw/sd/live.m3u8$LR•IPV4•115『线路96』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://pili-live-hls.ybcxjd.com/jdh-live/2108111201035597.m3u8?zsicd$LR•IPV4•115『线路97』
http://uni6rtmp.tulix.tv:1935/vbstv/vbsabr.smil/chunklist_w439903609_b1228800.m3u8$LR•IPV4•115『线路97』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://live.spccmc.com:90/live/spxwzh.m3u8$LR•IPV4•115『线路98』
http://221.5.213.4:30000/1111.m3u8$LR•IPV4•115『线路98』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://live.iwcmt.cn:90/live/zhxw.m3u8$LR•IPV4•115『线路99』
https://stream2.jlntv.cn/jilin1/sd/live.m3u8$LR•IPV4•115『线路99』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://live.jinchuanrmt.com:90/live/zhxw.m3u8?zsicd$LR•IPV4•115『线路100』
http://30515.hlsplay.aodianyun.com/lms_30515/tv_channel_239.m3u8$LR•IPV4•115『线路100』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
https://play.yunxya.com/channellive/xinwen.m3u8$LR•IPV4•115『线路101』
https://stream2.jlntv.cn/sptv/sd/live.m3u8$LR•IPV4•115『线路101』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://ls.qingting.fm/live/267.m3u8$LR•IPV4•115『线路102』
http://live.ahsz.tv/video/s10001-szzh/index.m3u8$LR•IPV4•115『线路102』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://hslive.hsnewsnet.com/lsdream/hve9Wjs/1000/live.m3u8$LR•IPV4•115『线路103』
http://guangshui.live.tempsource.cjyun.org/videotmp/s10146-GSXW.m3u8$LR•IPV4•115『线路103』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
https://p2.vzan.com/slowlive/596867413819827251/live.m3u8?zbid=1725814272&amp;amp;tpid=1516989100&amp;amp;type=0$LR•IPV4•115『线路104』
https://stream2.jlntv.cn/jlyb/sd/live.m3u8$LR•IPV4•115『线路104』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://uzoiczhh.live.sxmty.com/live/hls/0d41f1480c4042d49927858f01fde707/53130407737b417b9a6259b57246bae3.m3u8?zshanxd$LR•IPV4•115『线路105』
https://stream2.jlntv.cn/sytv/sd/live.m3u8$LR•IPV4•115『线路105』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
https://ls.qingting.fm/live/5043/64k.m3u8$LR•IPV4•115『线路106』
http://222.179.155.21:1935/ch1.m3u8$LR•IPV4•115『线路106』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://liveout.btzx.com.cn/62ds9e/4nxdih.m3u8?fbl=$LR•IPV4•115『线路107』
http://117.172.215.250:8083/videos/live/35/39/GQVbrgob5CGJM/GQVbrgob5CGJM.m3u8$LR•IPV4•115『线路107』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://nklive.nbs.cn/hls/d511bc9d-a694-4453-b3a2-4fc842cc97a1/index.m3u8$LR•IPV4•115『线路108』
http://220.180.110.101:8083/videos/live/36/57/hwEHU4UVQ1Iv5/hwEHU4UVQ1Iv5.m3u8$LR•IPV4•115『线路108』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://cm-wshls.homecdn.com/live/2aa50.m3u8$LR•IPV4•115『线路109』
http://live.hnxttv.com:9601/live/xwzh/800K/tzwj_video.m3u8$LR•IPV4•115『线路109』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://ls.qingting.fm/live/23797.m3u8$LR•IPV4•115『线路110』
http://stream.bzcm.net/2/sd/live.m3u8$LR•IPV4•115『线路110』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
https://play.kankanlive.com/live/1720583434627241.m3u8$LR•IPV4•115『线路111』
http://117.156.28.119/270000001111/1110000145/index.m3u8$LR•IPV4•115『线路111』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
https://ls.qingting.fm/live/5022100/64k.m3u8$LR•IPV4•115『线路112』
https://stream2.jlntv.cn/baishan1/sd/live.m3u8$LR•IPV4•115『线路112』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
https://liveout.xntv.tv/a65jur/96iln2.m3u8?zqinghd$LR•IPV4•115『线路113』
http://live1.wuhubtv.com/channel1/sd/live.m3u8$LR•IPV4•115『线路113』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://live.qthnews.org.cn:1935/live/live1/800k/tzwj_video.m3u8$LR•IPV4•115『线路114』
http://palive.patv123.com:8091/live/xwpd_800K.m3u8$LR•IPV4•115『线路114』
#EXTINF:-1 tvg-id="新闻综合" tvg-name="新闻综合" group-title="上海",新闻综合
http://stream.hrbtv.net/xwzh/sd/live.m3u8?zheild$LR•IPV4•115『线路115』
https://stream2.jlntv.cn/liaoyuan1/sd/live.m3u8$LR•IPV4•115『线路115』
#EXTINF:-1 tvg-id="西安新闻" tvg-name="西安新闻" group-title="陕西",西安新闻
http://stream2.xiancity.cn/xatv1/playlist.m3u8$LR•IPV4•2『线路1』
http://112.46.105.20:8009/hls/28/index.m3u8$LR•IPV4•2『线路1』
#EXTINF:-1 tvg-id="西安新闻" tvg-name="西安新闻" group-title="陕西",西安新闻
http://112.46.105.20:8009/hls/28/index.m3u8$LR•IPV4•2『线路2』
http://stream2.xiancity.cn/xatv1/playlist.m3u8$LR•IPV4•2『线路2』
#EXTINF:-1 tvg-id="山东少儿" tvg-name="山东少儿" group-title="山东",山东少儿
http://123.129.70.178:9901/tsfile/live/1004_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•16『线路1』
#EXTINF:-1 tvg-id="山东少儿" tvg-name="山东少儿" group-title="山东",山东少儿
@@ -6262,11 +6258,11 @@ http://218.206.193.218:8888/hls/66/index.m3u8$LR•IPV4•8『线路4』
#EXTINF:-1 tvg-id="凤凰中文" tvg-name="凤凰中文" group-title="港澳台",凤凰中文
http://120.198.95.220:9901/tsfile/live/1036_1.m3u8?key=txiptv$LR•IPV4•8『线路5』
#EXTINF:-1 tvg-id="凤凰中文" tvg-name="凤凰中文" group-title="港澳台",凤凰中文
http://223.110.245.139/ott.js.chinamobile.com/PLTV/3/224/3221226922/index.m3u8$LR•IPV4•8『线路6』
http://r.jdshipin.com/cCCzW$LR•IPV4•8『线路6』
#EXTINF:-1 tvg-id="凤凰中文" tvg-name="凤凰中文" group-title="港澳台",凤凰中文
http://r.jdshipin.com/cCCzW$LR•IPV4•8『线路7』
http://cdn6.163189.xyz/163189/fhzw$LR•IPV4•8『线路7』
#EXTINF:-1 tvg-id="凤凰中文" tvg-name="凤凰中文" group-title="港澳台",凤凰中文
http://cdn6.163189.xyz/163189/fhzw$LR•IPV4•8『线路8』
http://223.110.245.139/ott.js.chinamobile.com/PLTV/3/224/3221226922/index.m3u8$LR•IPV4•8『线路8』
#EXTINF:-1 tvg-id="凤凰资讯" tvg-name="凤凰资讯" group-title="港澳台",凤凰资讯
http://api.mg.itv888.cn:8080/hls/11ef1dc70d8/index.m3u8$LR•IPV4•10『线路1』
#EXTINF:-1 tvg-id="凤凰资讯" tvg-name="凤凰资讯" group-title="港澳台",凤凰资讯
@@ -6280,25 +6276,25 @@ http://120.198.95.220:9901/tsfile/live/1037_1.m3u8?key=txiptv$LR•IPV4•10『
#EXTINF:-1 tvg-id="凤凰资讯" tvg-name="凤凰资讯" group-title="港澳台",凤凰资讯
p3p://167.114.175.6:55331/5fffbf860003807cedf4e1016c3c3ed2$LR•IPV4•10『线路6』
#EXTINF:-1 tvg-id="凤凰资讯" tvg-name="凤凰资讯" group-title="港澳台",凤凰资讯
http://223.110.245.167/ott.js.chinamobile.com/PLTV/3/224/3221226923/index.m3u8$LR•IPV4•10『线路7』
http://r.jdshipin.com/0Rp07$LR•IPV4•10『线路7』
#EXTINF:-1 tvg-id="凤凰资讯" tvg-name="凤凰资讯" group-title="港澳台",凤凰资讯
http://r.jdshipin.com/0Rp07$LR•IPV4•10『线路8』
http://php.jdshipin.com/TVOD/iptv.php?id=fhzx$LR•IPV4•10『线路8』
#EXTINF:-1 tvg-id="凤凰资讯" tvg-name="凤凰资讯" group-title="港澳台",凤凰资讯
http://php.jdshipin.com/TVOD/iptv.php?id=fhzx$LR•IPV4•10『线路9』
http://cdn6.163189.xyz/163189/fhzx$LR•IPV4•10『线路9』
#EXTINF:-1 tvg-id="凤凰资讯" tvg-name="凤凰资讯" group-title="港澳台",凤凰资讯
http://cdn6.163189.xyz/163189/fhzx$LR•IPV4•10『线路10』
http://223.110.245.167/ott.js.chinamobile.com/PLTV/3/224/3221226923/index.m3u8$LR•IPV4•10『线路10』
#EXTINF:-1 tvg-id="凤凰香港" tvg-name="凤凰香港" group-title="港澳台",凤凰香港
http://122.152.202.33/s/81a8a44f/index.m3u8?id=fhhk$LR•IPV4•6『线路1』
#EXTINF:-1 tvg-id="凤凰香港" tvg-name="凤凰香港" group-title="港澳台",凤凰香港
p3p://167.114.175.6:55331/5fe0b82c000cac9774c17f262e43314d$LR•IPV4•6『线路2』
#EXTINF:-1 tvg-id="凤凰香港" tvg-name="凤凰香港" group-title="港澳台",凤凰香港
http://223.110.245.136/PLTV/3/224/3221226975/index.m3u8$LR•IPV4•6『线路3』
http://r.jdshipin.com/yDoTN$LR•IPV4•6『线路3』
#EXTINF:-1 tvg-id="凤凰香港" tvg-name="凤凰香港" group-title="港澳台",凤凰香港
http://r.jdshipin.com/yDoTN$LR•IPV4•6『线路4』
http://php.jdshipin.com/TVOD/iptv.php?id=fhhk$LR•IPV4•6『线路4』
#EXTINF:-1 tvg-id="凤凰香港" tvg-name="凤凰香港" group-title="港澳台",凤凰香港
http://php.jdshipin.com/TVOD/iptv.php?id=fhhk$LR•IPV4•6『线路5』
http://cdn6.163189.xyz/163189/fhhk$LR•IPV4•6『线路5』
#EXTINF:-1 tvg-id="凤凰香港" tvg-name="凤凰香港" group-title="港澳台",凤凰香港
http://cdn6.163189.xyz/163189/fhhk$LR•IPV4•6『线路6』
http://223.110.245.136/PLTV/3/224/3221226975/index.m3u8$LR•IPV4•6『线路6』
#EXTINF:-1 tvg-id="TVB翡翠台" tvg-name="TVB翡翠台" group-title="港澳台",TVB翡翠台
p3p://167.114.175.6:55331/653e4c02000ea0440c8c63fd3e5d709d$LR•IPV4•12『线路1』
#EXTINF:-1 tvg-id="TVB翡翠台" tvg-name="TVB翡翠台" group-title="港澳台",TVB翡翠台
@@ -6398,9 +6394,9 @@ p3p://167.114.175.6:55331/612ee2240008f3db8e0578dc59406f9e$LR•IPV4•10『线
#EXTINF:-1 tvg-id="台视" tvg-name="台视" group-title="港澳台",台视
p3p://167.114.175.6:55331/6223b571000a13023e78ece5030b5b05$LR•IPV4•10『线路8』
#EXTINF:-1 tvg-id="台视" tvg-name="台视" group-title="港澳台",台视
http://162.19.247.76:22222/live/taishi/index.m3u8$LR•IPV4•10『线路9』
http://38.64.72.148/hls/modn/list/4013/chunklist1.m3u8$LR•IPV4•10『线路9』
#EXTINF:-1 tvg-id="台视" tvg-name="台视" group-title="港澳台",台视
http://38.64.72.148/hls/modn/list/4013/chunklist1.m3u8$LR•IPV4•10『线路10』
http://162.19.247.76:22222/live/taishi/index.m3u8$LR•IPV4•10『线路10』
#EXTINF:-1 tvg-id="民视新闻" tvg-name="民视新闻" group-title="港澳台",民视新闻
http://38.64.72.148:80/hls/modn/list/4012/chunklist0.m3u8$LR•IPV4•4『线路1』
#EXTINF:-1 tvg-id="民视新闻" tvg-name="民视新闻" group-title="港澳台",民视新闻
@@ -6412,9 +6408,9 @@ http://38.64.72.148/hls/modn/list/4012/chunklist1.m3u8$LR•IPV4•4『线路4
#EXTINF:-1 tvg-id="耀才财经" tvg-name="耀才财经" group-title="港澳台",耀才财经
https://v3.mediacast.hk/webcast/bshdlive-pc/playlist.m3u8$LR•IPV4•3『线路1』
#EXTINF:-1 tvg-id="耀才财经" tvg-name="耀才财经" group-title="港澳台",耀才财经
http://202.69.67.66:443/webcast/bshdlive-mobile/playlist.m3u8$LR•IPV4•3『线路2』
https://v3.mediacast.hk/webcast/bshdlive-pc/chunklist_w99771165.m3u8$LR•IPV4•3『线路2』
#EXTINF:-1 tvg-id="耀才财经" tvg-name="耀才财经" group-title="港澳台",耀才财经
https://v3.mediacast.hk/webcast/bshdlive-pc/chunklist_w99771165.m3u8$LR•IPV4•3『线路3』
http://202.69.67.66:443/webcast/bshdlive-mobile/playlist.m3u8$LR•IPV4•3『线路3』
#EXTINF:-1 tvg-id="美亚C+" tvg-name="美亚C+" group-title="港澳台",美亚C+
http://ottproxy2.ist.ooo/livehls/MOB-U1-NO/03.m3u8$LR•IPV4•3『线路1』
#EXTINF:-1 tvg-id="美亚C+" tvg-name="美亚C+" group-title="港澳台",美亚C+
@@ -7024,9 +7020,9 @@ https://lotus.stingray.com/manifest/ose-317ads-montreal/samsungtvplus/master.m3u
#EXTINF:-1 tvg-id="HOY TV" tvg-name="HOY TV" group-title="港澳台",HOY TV
p3p://167.114.175.6:55331/62184bc3000cd48f11e47b06202b7e18$LR•IPV4•3『线路1』
#EXTINF:-1 tvg-id="HOY TV" tvg-name="HOY TV" group-title="港澳台",HOY TV
https://hoytv-live-stream.hoy.tv/ch77/index.m3u8$LR•IPV4•3『线路2』
http://php.jdshipin.com/TVOD/iptv.php?id=hoytv$LR•IPV4•3『线路2』
#EXTINF:-1 tvg-id="HOY TV" tvg-name="HOY TV" group-title="港澳台",HOY TV
http://php.jdshipin.com/TVOD/iptv.php?id=hoytv$LR•IPV4•3『线路3』
https://hoytv-live-stream.hoy.tv/ch77/index.m3u8$LR•IPV4•3『线路3』
#EXTINF:-1 tvg-id="MOMOTV" tvg-name="MOMOTV" group-title="港澳台",MOMOTV
rtmp://f13h.mine.nu/sat/tv761$LR•IPV4
#EXTINF:-1 tvg-id="大爱1" tvg-name="大爱1" group-title="港澳台",大爱1
+150 -152
View File
@@ -34,7 +34,7 @@
CCTV4K,http://vip1.xinketongxun.fun:8082/tsfile/live/1026_1.m3u8$LR•IPV4•7『线路1』
CCTV4K,http://101.43.145.141:12002/gaoma/cctv4k.m3u8$LR•IPV4•7『线路2』
CCTV4K,https://live-play-hls.cctvnews.cctv.com/CCTVChannel/channel_cctv4k_mbd.m3u8?auth_key=1784358000-1-b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c-c0b2f705841d49d821e3075961bb6e84&yid=b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c$LR•IPV4•7『线路3』
CCTV4K,https://live-play-hls.cctvnews.cctv.com/CCTVChannel/channel_cctv4k_mbd.m3u8?auth_key=1784361600-1-b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c-dbc4b9704792e97da2c65aeed2033e45&yid=b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c$LR•IPV4•7『线路4』
CCTV4K,https://live-play-hls.cctvnews.cctv.com/CCTVChannel/channel_cctv4k_mbd.m3u8?auth_key=1784371500-1-b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c-48ffc61db508f8062cc67caddde58d68&yid=b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c$LR•IPV4•7『线路4』
CCTV4K,http://198.204.240.250:82/live/cctv4k.m3u8$LR•IPV4•7『线路5』
CCTV4K,http://fn.tmde.top:35455/nptv/cctv4k.m3u8$LR•IPV4•7『线路6』
CCTV4K,http://xc.mfykeke.top:35455/nptv/cctv4k.m3u8$LR•IPV4•7『线路7』
@@ -89,7 +89,7 @@ CCTV4,http://112.46.105.20:8009/hls/4/index.m3u8$LR•IPV4•16『线路7』
CCTV4,http://74.91.26.218:82/live/cctv4hd.m3u8$LR•IPV4•16『线路8』
CCTV4,p3p://167.114.175.6:55331/61244d9c0006885d64b1b7591f6c12a0$LR•IPV4•16『线路9』
CCTV4,https://live-play-hls.cctvnews.cctv.com/CCTVChannel/channel_cctv4_mbd.m3u8?auth_key=1784358000-1-b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c-109c81da2b0d59c7b20e5792a12e386f&yid=b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c$LR•IPV4•16『线路10』
CCTV4,https://live-play-hls.cctvnews.cctv.com/CCTVChannel/channel_cctv4_mbd.m3u8?auth_key=1784361600-1-b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c-e246d8a5986fffcd5d21d25acc7aca83&yid=b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c$LR•IPV4•16『线路11』
CCTV4,https://live-play-hls.cctvnews.cctv.com/CCTVChannel/channel_cctv4_mbd.m3u8?auth_key=1784371500-1-b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c-bb4241b14453c4f49bd0749a3aab3caf&yid=b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c$LR•IPV4•16『线路11』
CCTV4,https://live-play-hls.cctvnews.cctv.com/CCTVChannel/channel_cctv4_mbd.m3u8?auth_key=1784271600-1-b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c-6aec44040ec72def77e22587fc404005&yid=b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c$LR•IPV4•16『线路12』
CCTV4,http://[2409:8087:8:21::18]:6610/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226335/1.m3u8?$LR•IPV6•16『线路13』
CCTV4,http://63.141.230.178:82/gslb/zbdq5.m3u8?id=cctv4hd$LR•IPV4•16『线路14』
@@ -159,7 +159,7 @@ CCTV9,http://74.91.26.218:82/live/cctv9hd.m3u8$LR•IPV4•12『线路5』
CCTV9,http://112.46.105.20:8009/hls/509/index.m3u8$LR•IPV4•12『线路6』
CCTV9,http://153.0.171.163:9901/tsfile/live/1008_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•12『线路7』
CCTV9,https://v4-e6b1c5baf4e240fe63adbf68dda23435.livehwc4.com/play.kankanlive.com/live/1698423397390920.m3u8?sub_m3u8=true&edge_slice=true&user_session_id=8a60541ebe4d355d0da6b086b9f2026d$LR•IPV4•12『线路8』
CCTV9,https://v4-702cae17a28d6e4f0c0002bba021d934.livehwc4.com/play.kankanlive.com/live/1698423397390920.m3u8?sub_m3u8=true&edge_slice=true&user_session_id=db97ec06b982224fd6b00b7bb1f6143c$LR•IPV4•12『线路9』
CCTV9,https://v4-702cae17a28d6e4f0c0002bba021d934.livehwc4.com/play.kankanlive.com/live/1698423397390920.m3u8?sub_m3u8=true&edge_slice=true&user_session_id=17294e1ca3c39692f88722ff53cecd2a$LR•IPV4•12『线路9』
CCTV9,http://[2409:8087:8:21::18]:6610/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226944/1.m3u8?$LR•IPV6•12『线路10』
CCTV9,http://222.223.41.27:8888/hls/9/index.m3u8$LR•IPV4•12『线路11』
CCTV9,https://xykt-fix.github.io/Y77.m3u8$LR•IPV4•12『线路12』
@@ -444,24 +444,23 @@ CGTN阿语,https://0472.org/hls/cgtna.m3u8$LR•IPV4
东南卫视,http://iptv.huuc.edu.cn/hls/dnhd.m3u8$LR•IPV4•18『线路16』
东南卫视,http://153.0.171.163:9901/tsfile/live/0137_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•18『线路17』
东南卫视,http://118.81.195.79:9003/hls/24/index.m3u8$LR•IPV4•18『线路18』
深圳卫视,http://[2409:8087:8:21::18]:6610/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226959/1.m3u8?GuardEncType=2&accountinfo=%7E%7EV2.0%7EGrVNEZREjuNVKiTJo2mtwg%7EtP4-l0lmSfjwLWEfK_el1vH_mv-s1zo4AQJwdedaVwG9xkuFTDg8J26cwOrNJzn20BErrHdLhuZ9EzLUCD3PMW-OMx4MGteHV2vLeW6BqoY%2CEND$LR•IPV6•18『线路1』
深圳卫视,http://120.198.95.220:9901/tsfile/live/1048_1.m3u8?key=txiptv&playlive=1&down=1$LR•IPV4•18『线路2』
深圳卫视,http://120.198.95.220:9901/tsfile/live/1048_1.m3u8?key=txiptv$LR•IPV4•18『线路3』
深圳卫视,http://173.208.212.130:8181/720p/szws.m3u8$LR•IPV4•18『线路4』
深圳卫视,http://192.151.150.154/live/szwshd.m3u8$LR•IPV4•18『线路5』
深圳卫视,http://124.228.160.210:9901/tsfile/live/0126_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•18『线路6』
深圳卫视,http://36.136.38.87:9901/tsfile/live/0126_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•18『线路7』
深圳卫视,http://183.11.239.36:808/hls/45/index.m3u8$LR•IPV4•18『线路8』
深圳卫视,https://sztv-hls.sztv.com.cn/AxeFRth/500/q37Age0.m3u8?sign=671fcd3c133f66cef04a83ae0b8c542b&t=6a59189c$LR•IPV4•18『线路9』
深圳卫视,http://38.75.136.137:98/gslb/dsdqpub/szwshd.m3u8?auth=testpub$LR•IPV4•18『线路10』
深圳卫视,http://23.237.228.134/live6/shenzhen.m3u8$LR•IPV4•18『线路11』
深圳卫视,http://gfr.x3322.net:9901/tsfile/live/1095_1.m3u8$LR•IPV4•18『线路12』
深圳卫视,http://api.kkitv.itv888.cn:8080/hls/iftsd32ykm/index.m3u8$LR•IPV4•18『线路13』
深圳卫视,https://iptv.catvod.com/catvod.php?id=szws$LR•IPV4•18『线路14』
深圳卫视,https://httop.top/ysp-深圳卫视$LR•IPV4•18『线路15』
深圳卫视,http://iptv.huuc.edu.cn/hls/szhd.m3u8$LR•IPV4•18『线路16』
深圳卫视,http://153.0.171.163:9901/tsfile/live/0126_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•18『线路17』
深圳卫视,http://38.64.72.148:80/hls/modn/list/4007/playlist.m3u8$LR•IPV4•18『线路18』
深圳卫视,http://[2409:8087:8:21::18]:6610/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226959/1.m3u8?GuardEncType=2&accountinfo=%7E%7EV2.0%7EGrVNEZREjuNVKiTJo2mtwg%7EtP4-l0lmSfjwLWEfK_el1vH_mv-s1zo4AQJwdedaVwG9xkuFTDg8J26cwOrNJzn20BErrHdLhuZ9EzLUCD3PMW-OMx4MGteHV2vLeW6BqoY%2CEND$LR•IPV6•17『线路1』
深圳卫视,http://120.198.95.220:9901/tsfile/live/1048_1.m3u8?key=txiptv&playlive=1&down=1$LR•IPV4•17『线路2』
深圳卫视,http://120.198.95.220:9901/tsfile/live/1048_1.m3u8?key=txiptv$LR•IPV4•17『线路3』
深圳卫视,http://173.208.212.130:8181/720p/szws.m3u8$LR•IPV4•17『线路4』
深圳卫视,http://192.151.150.154/live/szwshd.m3u8$LR•IPV4•17『线路5』
深圳卫视,http://124.228.160.210:9901/tsfile/live/0126_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•17『线路6』
深圳卫视,http://36.136.38.87:9901/tsfile/live/0126_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•17『线路7』
深圳卫视,http://183.11.239.36:808/hls/45/index.m3u8$LR•IPV4•17『线路8』
深圳卫视,http://38.75.136.137:98/gslb/dsdqpub/szwshd.m3u8?auth=testpub$LR•IPV4•17『线路9』
深圳卫视,http://23.237.228.134/live6/shenzhen.m3u8$LR•IPV4•17『线路10』
深圳卫视,http://gfr.x3322.net:9901/tsfile/live/1095_1.m3u8$LR•IPV4•17『线路11』
深圳卫视,http://api.kkitv.itv888.cn:8080/hls/iftsd32ykm/index.m3u8$LR•IPV4•17『线路12』
深圳卫视,https://iptv.catvod.com/catvod.php?id=szws$LR•IPV4•17『线路13』
深圳卫视,https://httop.top/ysp-深圳卫视$LR•IPV4•17『线路14』
深圳卫视,http://iptv.huuc.edu.cn/hls/szhd.m3u8$LR•IPV4•17『线路15』
深圳卫视,http://153.0.171.163:9901/tsfile/live/0126_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•17『线路16』
深圳卫视,http://38.64.72.148:80/hls/modn/list/4007/playlist.m3u8$LR•IPV4•17『线路17』
广东卫视,http://[2409:8087:8:21::18]:6610/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226961/1.m3u8?GuardEncType=2&accountinfo=%7E%7EV2.0%7E2MGyx659D_aaDPP0qt3NgA%7EtP4-l0lmSfjwLWEfK_el1vH_mv-s1zo4AQJwdedaVwG9xkuFTDg8J26cwOrNJzn20BErrHdLhuZ9EzLUCD3PMW-OMx4MGteHV2vLeW6BqoY%2CEND$LR•IPV6•12『线路1』
广东卫视,http://112.27.235.94:8000/hls/30/index.m3u8$LR•IPV4•12『线路2』
广东卫视,http://38.75.136.137:98/gslb/dsdqpub/gdwshd.m3u8?auth=testpub$LR•IPV4•12『线路3』
@@ -515,19 +514,20 @@ CGTN阿语,https://0472.org/hls/cgtna.m3u8$LR•IPV4
贵州卫视,http://153.0.171.163:9901/tsfile/live/0120_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•16『线路14』
贵州卫视,http://183.207.248.71/gitv/live1/G_GUIZHOU/G_GUIZHOU$LR•IPV4•16『线路15』
贵州卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225728/index.m3u8$LR•IPV4•16『线路16』
河北卫视,http://[2409:8087:8:21::18]:6610/otttv.bj.chinamobile.com/PLTV/88888888/224/3221227014/1.m3u8?GuardEncType=2&accountinfo=%7E%7EV2.0%7ErSGjhI3DMaaAASPrbQJYTg%7EtP4-l0lmSfjwLWEfK_el1vH_mv-s1zo4AQJwdedaVwG9xkuFTDg8J26cwOrNJzn20BErrHdLhuZ9EzLUCD3PMW-OMx4MGteHV2vLeW6BqoY%2CEND$LR•IPV6•13『线路1』
河北卫视,http://101.66.194.63:9901/tsfile/live/0117_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•13『线路2』
河北卫视,http://101.66.199.247:9901/tsfile/live/0117_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•13『线路3』
河北卫视,http://204.12.221.218:8181/3m1080p/hews.m3u8$LR•IPV4•13『线路4』
河北卫视,http://event.pull.hebtv.com/jishi/weishi_tingyun.m3u8$LR•IPV4•13『线路5』
河北卫视,http://183.11.239.36:808/hls/54/index.m3u8$LR•IPV4•13『线路6』
河北卫视,http://23.237.228.134/live8/hebei.m3u8$LR•IPV4•13『线路7』
河北卫视,http://43.251.226.89:8080/play/42.m3u8$LR•IPV4•13『线路8』
河北卫视,http://gfr.x3322.net:9901/tsfile/live/1091_1.m3u8$LR•IPV4•13『线路9』
河北卫视,https://iptv.catvod.com/catvod.php?id=hbws$LR•IPV4•13『线路10』
河北卫视,https://httop.top/ysp-河北卫视$LR•IPV4•13『线路11』
河北卫视,http://iptv.huuc.edu.cn/hls/hebhd.m3u8$LR•IPV4•13『线路12』
河北卫视,http://153.0.171.163:9901/tsfile/live/0117_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•13『线路13』
河北卫视,http://[2409:8087:8:21::18]:6610/otttv.bj.chinamobile.com/PLTV/88888888/224/3221227014/1.m3u8?GuardEncType=2&accountinfo=%7E%7EV2.0%7ErSGjhI3DMaaAASPrbQJYTg%7EtP4-l0lmSfjwLWEfK_el1vH_mv-s1zo4AQJwdedaVwG9xkuFTDg8J26cwOrNJzn20BErrHdLhuZ9EzLUCD3PMW-OMx4MGteHV2vLeW6BqoY%2CEND$LR•IPV6•14『线路1』
河北卫视,http://101.66.194.63:9901/tsfile/live/0117_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•14『线路2』
河北卫视,http://101.66.199.247:9901/tsfile/live/0117_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•14『线路3』
河北卫视,http://204.12.221.218:8181/3m1080p/hews.m3u8$LR•IPV4•14『线路4』
河北卫视,http://event.pull.hebtv.com/jishi/weishi_tingyun.m3u8$LR•IPV4•14『线路5』
河北卫视,http://183.11.239.36:808/hls/54/index.m3u8$LR•IPV4•14『线路6』
河北卫视,https://tv.pull.hebtv.com/jishi/nongminpindao.m3u8?t=1783932137&k=f5f7fa7a3e39ef329f1b86c4f866958c$LR•IPV4•14『线路7』
河北卫视,http://23.237.228.134/live8/hebei.m3u8$LR•IPV4•14『线路8』
河北卫视,http://43.251.226.89:8080/play/42.m3u8$LR•IPV4•14『线路9』
河北卫视,http://gfr.x3322.net:9901/tsfile/live/1091_1.m3u8$LR•IPV4•14『线路10』
河北卫视,https://iptv.catvod.com/catvod.php?id=hbws$LR•IPV4•14『线路11』
河北卫视,https://httop.top/ysp-河北卫视$LR•IPV4•14『线路12』
河北卫视,http://iptv.huuc.edu.cn/hls/hebhd.m3u8$LR•IPV4•14『线路13』
河北卫视,http://153.0.171.163:9901/tsfile/live/0117_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•14『线路14』
河南卫视,http://101.66.195.138:9901/tsfile/live/0139_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•12『线路1』
河南卫视,http://38.75.136.137:98/gslb/dsdqpub/hawshd.m3u8?auth=testpub$LR•IPV4•12『线路2』
河南卫视,http://63.141.230.178:82/gslb/zbdq5.m3u8?id=hawshd$LR•IPV4•12『线路3』
@@ -566,22 +566,21 @@ CGTN阿语,https://0472.org/hls/cgtna.m3u8$LR•IPV4
湖北卫视,http://153.0.171.163:9901/tsfile/live/0132_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•14『线路12』
湖北卫视,http://www.745612.xyz:7788/rtp/235.254.198.72:1564$LR•IPV4•14『线路13』
湖北卫视,http://118.81.195.79:9003/hls/32/index.m3u8$LR•IPV4•14『线路14』
江西卫视,http://[2409:8087:8:21::18]:6610/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226956/1.m3u8?GuardEncType=2&accountinfo=%7E%7EV2.0%7Ei6ZIpVizXlewg-YfGvH8dA%7EtP4-l0lmSfjwLWEfK_el1vH_mv-s1zo4AQJwdedaVwG9xkuFTDg8J26cwOrNJzn20BErrHdLhuZ9EzLUCD3PMW-OMx4MGteHV2vLeW6BqoY%2CEND$LR•IPV6•16『线路1』
江西卫视,http://101.66.199.247:9901/tsfile/live/0138_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•16『线路2』
江西卫视,http://112.123.243.37:50085/tsfile/live/0132_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•16『线路3』
江西卫视,http://124.228.160.210:9901/tsfile/live/0138_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•16『线路4』
江西卫视,http://153.0.171.163:9901/tsfile/live/0138_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•16『线路5』
江西卫视,http://112.27.235.94:8000/hls/44/index.m3u8$LR•IPV4•16『线路6』
江西卫视,https://jsp-tv-live.jxtvcn.com.cn/live-jsp/tv_jxtv6.m3u8?t=1784004704&token=67a59c29-de6e-4407-90c8-39f7e099b3db&d=0a7a8c487c454bc7bb02a60298283c5e$LR•IPV4•16『线路7』
江西卫视,http://38.75.136.137:98/gslb/dsdqpub/jxwshd.m3u8?auth=testpub$LR•IPV4•16『线路8』
江西卫视,http://23.237.228.134/live8/jiangxi.m3u8$LR•IPV4•16『线路9』
江西卫视,http://43.251.226.89:8080/play/43.m3u8$LR•IPV4•16『线路10』
江西卫视,http://api.kkitv.itv888.cn:8080/hls/pv0np60bpin/index.m3u8$LR•IPV4•16『线路11』
江西卫视,https://iptv.catvod.com/catvod.php?id=jxws$LR•IPV4•16『线路12』
江西卫视,https://httop.top/ysp-江西卫视$LR•IPV4•16『线路13』
江西卫视,http://iptv.huuc.edu.cn/hls/jxhd.m3u8$LR•IPV4•16『线路14』
江西卫视,http://mg.hmysapp.cn:177/ckmg/zb.php?id=jxws$LR•IPV4•16『线路15』
江西卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225705/index.m3u8$LR•IPV4•16『线路16』
江西卫视,http://[2409:8087:8:21::18]:6610/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226956/1.m3u8?GuardEncType=2&accountinfo=%7E%7EV2.0%7Ei6ZIpVizXlewg-YfGvH8dA%7EtP4-l0lmSfjwLWEfK_el1vH_mv-s1zo4AQJwdedaVwG9xkuFTDg8J26cwOrNJzn20BErrHdLhuZ9EzLUCD3PMW-OMx4MGteHV2vLeW6BqoY%2CEND$LR•IPV6•15『线路1』
江西卫视,http://101.66.199.247:9901/tsfile/live/0138_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•15『线路2』
江西卫视,http://112.123.243.37:50085/tsfile/live/0132_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•15『线路3』
江西卫视,http://124.228.160.210:9901/tsfile/live/0138_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•15『线路4』
江西卫视,http://153.0.171.163:9901/tsfile/live/0138_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•15『线路5』
江西卫视,http://112.27.235.94:8000/hls/44/index.m3u8$LR•IPV4•15『线路6』
江西卫视,http://38.75.136.137:98/gslb/dsdqpub/jxwshd.m3u8?auth=testpub$LR•IPV4•15『线路7』
江西卫视,http://23.237.228.134/live8/jiangxi.m3u8$LR•IPV4•15『线路8』
江西卫视,http://43.251.226.89:8080/play/43.m3u8$LR•IPV4•15『线路9』
江西卫视,http://api.kkitv.itv888.cn:8080/hls/pv0np60bpin/index.m3u8$LR•IPV4•15『线路10』
江西卫视,https://iptv.catvod.com/catvod.php?id=jxws$LR•IPV4•15『线路11』
江西卫视,https://httop.top/ysp-江西卫视$LR•IPV4•15『线路12』
江西卫视,http://iptv.huuc.edu.cn/hls/jxhd.m3u8$LR•IPV4•15『线路13』
江西卫视,http://mg.hmysapp.cn:177/ckmg/zb.php?id=jxws$LR•IPV4•15『线路14』
江西卫视,http://39.134.115.163:8080/PLTV/88888910/224/3221225705/index.m3u8$LR•IPV4•15『线路15』
吉林卫视,http://[2409:8087:8:21::18]:6610/otttv.bj.chinamobile.com/PLTV/88888888/224/3221227015/1.m3u8?GuardEncType=2&accountinfo=%7E%7EV2.0%7EW5-3AVdwD5KlUpuA4mz7Cg%7EtP4-l0lmSfjwLWEfK_el1vH_mv-s1zo4AQJwdedaVwG9xkuFTDg8J26cwOrNJzn20BErrHdLhuZ9EzLUCD3PMW-OMx4MGteHV2vLeW6BqoY%2CEND$LR•IPV6•17『线路1』
吉林卫视,http://204.12.221.218:8181/3m1080p/jlws.m3u8$LR•IPV4•17『线路2』
吉林卫视,http://38.75.136.137:98/gslb/dsdqpub/jlwshd.m3u8?auth=testpub$LR•IPV4•17『线路3』
@@ -706,23 +705,22 @@ CGTN阿语,https://0472.org/hls/cgtna.m3u8$LR•IPV4
新疆卫视,http://183.207.249.15/PLTV/3/224/3221225523/index.m3u8$LR•IPV4•14『线路12』
新疆卫视,http://223.110.243.136/PLTV/3/224/3221225523/index.m3u8$LR•IPV4•14『线路13』
新疆卫视,http://112.25.48.68/live/program/live/xjws/1300000/mnf.m3u8$LR•IPV4•14『线路14』
云南卫视,http://[2409:8087:8:21::18]:6610/otttv.bj.chinamobile.com/PLTV/88888888/224/3221227028/1.m3u8?GuardEncType=2&accountinfo=%7E%7EV2.0%7EGfQPqRNVeBjTMsZ48qu0SA%7EtP4-l0lmSfjwLWEfK_el1vH_mv-s1zo4AQJwdedaVwG9xkuFTDg8J26cwOrNJzn20BErrHdLhuZ9EzLUCD3PMW-OMx4MGteHV2vLeW6BqoY%2CEND$LR•IPV6•17『线路1』
云南卫视,http://120.198.95.220:9901/tsfile/live/1056_1.m3u8?key=txiptv&playlive=1&down=1$LR•IPV4•17『线路2』
云南卫视,http://38.75.136.137:98/gslb/dsdqpub/ynwshd.m3u8?auth=testpub$LR•IPV4•17『线路3』
云南卫视,http://204.12.221.218:8181/3m1080p/ynws.m3u8$LR•IPV4•17『线路4』
云南卫视,http://112.123.243.37:50085/tsfile/live/0117_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•17『线路5』
云南卫视,http://101.66.194.82:9901/tsfile/live/0119_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•17『线路6』
云南卫视,http://101.66.194.63:9901/tsfile/live/0119_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•17『线路7』
云南卫视,http://36.136.38.87:9901/tsfile/live/0119_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•17『线路8』
云南卫视,http://101.66.195.138:9901/tsfile/live/0119_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•17『线路9』
云南卫视,http://101.66.199.247:9901/tsfile/live/0119_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•17『线路10』
云南卫视,http://153.0.171.163:9901/tsfile/live/0119_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•17『线路11』
云南卫视,http://112.27.235.94:8000/hls/40/index.m3u8$LR•IPV4•17『线路12』
云南卫视,http://p2.ioioz.com/xgplayer.php?id=https://hwapi.yntv.net/ew265l/z1z6s5.m3u8$LR•IPV4•17『线路13』
云南卫视,http://23.237.228.134/live8/yunnan.m3u8$LR•IPV4•17『线路14』
云南卫视,https://iptv.catvod.com/catvod.php?id=ynws$LR•IPV4•17『线路15』
云南卫视,https://httop.top/ysp-云南卫视$LR•IPV4•17『线路16』
云南卫视,https://hwapi.yunshicloud.com/8xughf/e0bx15.m3u8$LR•IPV4•17『线路17』
云南卫视,http://[2409:8087:8:21::18]:6610/otttv.bj.chinamobile.com/PLTV/88888888/224/3221227028/1.m3u8?GuardEncType=2&accountinfo=%7E%7EV2.0%7EGfQPqRNVeBjTMsZ48qu0SA%7EtP4-l0lmSfjwLWEfK_el1vH_mv-s1zo4AQJwdedaVwG9xkuFTDg8J26cwOrNJzn20BErrHdLhuZ9EzLUCD3PMW-OMx4MGteHV2vLeW6BqoY%2CEND$LR•IPV6•16『线路1』
云南卫视,http://120.198.95.220:9901/tsfile/live/1056_1.m3u8?key=txiptv&playlive=1&down=1$LR•IPV4•16『线路2』
云南卫视,http://38.75.136.137:98/gslb/dsdqpub/ynwshd.m3u8?auth=testpub$LR•IPV4•16『线路3』
云南卫视,http://204.12.221.218:8181/3m1080p/ynws.m3u8$LR•IPV4•16『线路4』
云南卫视,http://112.123.243.37:50085/tsfile/live/0117_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•16『线路5』
云南卫视,http://101.66.194.82:9901/tsfile/live/0119_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•16『线路6』
云南卫视,http://101.66.194.63:9901/tsfile/live/0119_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•16『线路7』
云南卫视,http://36.136.38.87:9901/tsfile/live/0119_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•16『线路8』
云南卫视,http://101.66.195.138:9901/tsfile/live/0119_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•16『线路9』
云南卫视,http://101.66.199.247:9901/tsfile/live/0119_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•16『线路10』
云南卫视,http://153.0.171.163:9901/tsfile/live/0119_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•16『线路11』
云南卫视,http://112.27.235.94:8000/hls/40/index.m3u8$LR•IPV4•16『线路12』
云南卫视,http://23.237.228.134/live8/yunnan.m3u8$LR•IPV4•16『线路13』
云南卫视,https://iptv.catvod.com/catvod.php?id=ynws$LR•IPV4•16『线路14』
云南卫视,https://httop.top/ysp-云南卫视$LR•IPV4•16『线路15』
云南卫视,https://hwapi.yunshicloud.com/8xughf/e0bx15.m3u8$LR•IPV4•16『线路16』
西藏卫视,http://[2409:8087:8:21::18]:6610/otttv.bj.chinamobile.com/PLTV/88888888/224/3221227033/1.m3u8?GuardEncType=2&accountinfo=%7E%7EV2.0%7EdeTB7OZ9G_VNJk5C3t96fQ%7EtP4-l0lmSfjwLWEfK_el1vH_mv-s1zo4AQJwdedaVwG9xkuFTDg8J26cwOrNJzn20BErrHdLhuZ9EzLUCD3PMW-OMx4MGteHV2vLeW6BqoY%2CEND$LR•IPV6•12『线路1』
西藏卫视,http://59.39.89.130:60901/tsfile/live/0125_3.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•12『线路2』
西藏卫视,http://198.204.228.26/live/xzws.m3u8$LR•IPV4•12『线路3』
@@ -784,7 +782,7 @@ CGTN阿语,https://0472.org/hls/cgtna.m3u8$LR•IPV4
山西卫视,http://36.136.38.87:9901/tsfile/live/0118_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•15『线路8』
山西卫视,http://101.66.199.247:9901/tsfile/live/0118_1.m3u8?key=txiptv&playlive=0&authid=0$LR•IPV4•15『线路9』
山西卫视,http://153.0.171.163:9901/tsfile/live/0118_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•15『线路10』
山西卫视,https://livehhhttps.sxrtv.com/lsdream/lce1mC4/800/h1thc41.m3u8$LR•IPV4•15『线路11』
山西卫视,https://livehhhttps.sxrtv.com/lsdream/Md571Kv/800/p7iM150.m3u8$LR•IPV4•15『线路11』
山西卫视,http://23.237.228.134/live8/shanxi.m3u8$LR•IPV4•15『线路12』
山西卫视,https://iptv.catvod.com/catvod.php?id=sxiws$LR•IPV4•15『线路13』
山西卫视,https://httop.top/ysp-山西卫视$LR•IPV4•15『线路14』
@@ -950,8 +948,8 @@ NewTV超级体育,http://[2409:8087:1a01:df::7005]:80/ottrrs.hl.chinamobile.com/
NewTV超级体育,http://kkk.jjjj.jiduo.me/api.php?n=tttt&id=0078&tk=a0c4f6cfaba3$LR•IPV4•5『线路3』
NewTV超级体育,http://feiyang.ak47s.top:35455/itv/1000000001000009601.m3u8?cdn=ystenlive$LR•IPV4•5『线路4』
NewTV超级体育,http://kkk.jjjj.jiduo.me/api.php?n=tttt&id=3188&tk=23a9aca1f79f$LR•IPV4•5『线路5』
NewTV动作电影,http://39.134.19.68/dbiptv.sn.chinamobile.com/PLTV/88888888/224/3221226465/index.m3u8$LR•IPV4•2『线路1』
NewTV动作电影,http://live.metshop.top/huya/11602077?cdn=alicdn$LR•IPV4•2『线路2』
NewTV动作电影,http://live.metshop.top/huya/11602077?cdn=alicdn$LR•IPV4•2『线路1』
NewTV动作电影,http://39.134.19.68/dbiptv.sn.chinamobile.com/PLTV/88888888/224/3221226465/index.m3u8$LR•IPV4•2『线路2』
NewTV精品体育,https://epg.pw/stream/f7556eccd4ae06b0c2991fdc7a4f8388496559f728cc82459a8e50346040e226.m3u8$LR•IPV4•6『线路1』
NewTV精品体育,https://epg.pw/stream/866a097a0907c9832440f8df38272dd555abf05200dfbafcc137e214c9b30ca7.m3u8$LR•IPV4•6『线路2』
NewTV精品体育,http://kkk.jjjj.jiduo.me/api.php?n=tttt&id=5739&tk=23a9aca1f79f$LR•IPV4•6『线路3』
@@ -1110,8 +1108,8 @@ NewTV精品体育,http://dl.wifi942.com:66/jsyd/jsyd.php?id=GITV-JS-65$LR•IPV4
滁州公共频道,http://183.167.193.45:1935/live/cztvgg/playlist.m3u8$LR•IPV4
铜陵新闻综合频道,https://ls.qingting.fm/live/21303/64k.m3u8$LR•IPV4•2『线路1』
铜陵新闻综合频道,http://dstpush1.retalltech.com/app/stream1.m3u8$LR•IPV4•2『线路2』
亳州农村,http://220.180.110.101:8083/videos/live/39/13/o4ncrHkSp7q09/o4ncrHkSp7q09.m3u8$LR•IPV4•2『线路1』
亳州农村,http://zbbf2.ahbztv.com/live/418.m3u8$LR•IPV4•2『线路2』
亳州农村,http://zbbf2.ahbztv.com/live/418.m3u8$LR•IPV4•2『线路1』
亳州农村,http://220.180.110.101:8083/videos/live/39/13/o4ncrHkSp7q09/o4ncrHkSp7q09.m3u8$LR•IPV4•2『线路2』
北京,#genre#
北京财经,http://ivi.bupt.edu.cn/hls/btv5.m3u8$LR•IPV4
@@ -1131,19 +1129,19 @@ NewTV精品体育,http://dl.wifi942.com:66/jsyd/jsyd.php?id=GITV-JS-65$LR•IPV4
南宁影视娱乐,http://hls.nntv.cn/nnlive/YSYL_244.m3u8$LR•IPV4
河北,#genre#
邢台综合,http://222.223.119.21:8888/newlive/live/hls/54/live.m3u8$LR•IPV4•2『线路1』
邢台综合,https://jwplay.hebyun.com.cn:443/live/xtsrmtzs/1500k/tzwj_video.m3u8$LR•IPV4•2『线路2』
河北都市,http://121.19.134.246:808/hls/21/index.m3u8$LR•IPV4•2『线路1』
河北都市,http://1.94.31.214/php/hebei.php?id=hbds$LR•IPV4•2『线路2』
河北农民,http://121.19.134.246:808/hls/25/index.m3u8$LR•IPV4•2『线路1』
河北农民,https://ls.qingting.fm/live/1650/64k.m3u8$LR•IPV4•2『线路2』
邢台综合,https://jwplay.hebyun.com.cn:443/live/xtsrmtzs/1500k/tzwj_video.m3u8$LR•IPV4•2『线路1』
邢台综合,http://222.223.119.21:8888/newlive/live/hls/54/live.m3u8$LR•IPV4•2『线路2』
河北都市,http://1.94.31.214/php/hebei.php?id=hbds$LR•IPV4•2『线路1』
河北都市,http://121.19.134.246:808/hls/21/index.m3u8$LR•IPV4•2『线路2』
河北农民,https://ls.qingting.fm/live/1650/64k.m3u8$LR•IPV4•2『线路1』
河北农民,http://121.19.134.246:808/hls/25/index.m3u8$LR•IPV4•2『线路2』
鹿泉一套,http://hblq.chinashadt.com:2036/live/stream:luquan1.stream/playlist.m3u8$LR•IPV4
河北经济,http://121.19.134.246:808/hls/20/index.m3u8$LR•IPV4•2『线路1』
河北经济,http://1.94.31.214/php/hebei.php?id=jjsh$LR•IPV4•2『线路2』
河北影视,http://121.19.134.246:808/hls/22/index.m3u8$LR•IPV4•2『线路1』
河北影视,http://1.94.31.214/php/hebei.php?id=hbys$LR•IPV4•2『线路2』
河北公共,http://121.19.134.246:808/hls/24/index.m3u8$LR•IPV4•2『线路1』
河北公共,http://1.94.31.214/php/hebei.php?id=hbgg$LR•IPV4•2『线路2』
河北经济,http://1.94.31.214/php/hebei.php?id=jjsh$LR•IPV4•2『线路1』
河北经济,http://121.19.134.246:808/hls/20/index.m3u8$LR•IPV4•2『线路2』
河北影视,http://1.94.31.214/php/hebei.php?id=hbys$LR•IPV4•2『线路1』
河北影视,http://121.19.134.246:808/hls/22/index.m3u8$LR•IPV4•2『线路2』
河北公共,http://1.94.31.214/php/hebei.php?id=hbgg$LR•IPV4•2『线路1』
河北公共,http://121.19.134.246:808/hls/24/index.m3u8$LR•IPV4•2『线路2』
鹿泉二套,http://hblq.chinashadt.com:2036/live/stream:luquan2.stream/playlist.m3u8$LR•IPV4
内蒙古,#genre#
@@ -1168,10 +1166,10 @@ NewTV精品体育,http://dl.wifi942.com:66/jsyd/jsyd.php?id=GITV-JS-65$LR•IPV4
江苏教育,http://223.110.245.151/ott.js.chinamobile.com/PLTV/3/224/3221225923/index.m3u8$LR•IPV4
南京十八,http://183.207.248.71/gitv/live1/G_NJSB/G_NJSB$LR•IPV4
江苏体育,http://183.207.248.71/gitv/live1/G_JSTY/G_JSTY$LR•IPV4
南京教科,https://live.nbs.cn/channels/njtv/jkpd/m3u8:500k/live.m3u8$LR•IPV4•4『线路1』
南京教科,http://183.207.248.71/gitv/live1/G_NJJK/G_NJJK$LR•IPV4•4『线路2』
南京教科,http://223.110.245.155/ott.js.chinamobile.com/PLTV/3/224/3221227194/index.m3u8$LR•IPV4•4『线路3』
南京教科,http://nklive.nbs.cn/hls/75b3c462-b831-4de7-a34b-5d3221db2069/index.m3u8$LR•IPV4•4『线路4』
南京教科,http://nklive.nbs.cn/hls/75b3c462-b831-4de7-a34b-5d3221db2069/index.m3u8$LR•IPV4•4『线路1』
南京教科,https://live.nbs.cn/channels/njtv/jkpd/m3u8:500k/live.m3u8$LR•IPV4•4『线路2』
南京教科,http://183.207.248.71/gitv/live1/G_NJJK/G_NJJK$LR•IPV4•4『线路3』
南京教科,http://223.110.245.155/ott.js.chinamobile.com/PLTV/3/224/3221227194/index.m3u8$LR•IPV4•4『线路4』
南京少儿,https://live.nbs.cn/channels/njtv/sepd/m3u8:500k/live.m3u8$LR•IPV4
苏州4k,https://live-auth.51kandianshi.com/szgd/csztv4k_hd.m3u8$LR•IPV4•5『线路1』
苏州4k,http://43.251.226.89:8080/play/927.m3u8$LR•IPV4•5『线路2』
@@ -2994,55 +2992,55 @@ NewTV精品体育,http://dl.wifi942.com:66/jsyd/jsyd.php?id=GITV-JS-65$LR•IPV4
新闻综合,http://111.228.4.117:6789/migu720p.php?id=651632657$LR•IPV4•115『线路68』
新闻综合,https://stream1.freetv.fun/shang-hai-xin-wen-zong-he-8.m3u8$LR•IPV4•115『线路69』
新闻综合,https://stream1.freetv.fun/ipv6-xin-wen-zong-he-10.m3u8$LR•IPV4•115『线路70』
新闻综合,https://stream2.jlntv.cn/baicheng1/sd/live.m3u8$LR•IPV4•115『线路71』
新闻综合,http://live.cztv.cc:85/live/xwpd.m3u8$LR•IPV4•115『线路72』
新闻综合,http://117.156.28.119/270000001111/1110000001/index.m3u8$LR•IPV4•115『线路73』
新闻综合,http://pili-live-hls.hebitv.com/hebi/hebi.m3u8$LR•IPV4•115『线路74』
新闻综合,https://stream2.jlntv.cn/naxw/sd/live.m3u8$LR•IPV4•115『线路75』
新闻综合,http://uni6rtmp.tulix.tv:1935/vbstv/vbsabr.smil/chunklist_w439903609_b1228800.m3u8$LR•IPV4•115『线路76』
新闻综合,http://221.5.213.4:30000/1111.m3u8$LR•IPV4•115『线路77』
新闻综合,https://stream2.jlntv.cn/jilin1/sd/live.m3u8$LR•IPV4•115『线路78』
新闻综合,http://30515.hlsplay.aodianyun.com/lms_30515/tv_channel_239.m3u8$LR•IPV4•115『线路79』
新闻综合,https://stream2.jlntv.cn/sptv/sd/live.m3u8$LR•IPV4•115『线路80』
新闻综合,http://live.ahsz.tv/video/s10001-szzh/index.m3u8$LR•IPV4•115『线路81』
新闻综合,http://guangshui.live.tempsource.cjyun.org/videotmp/s10146-GSXW.m3u8$LR•IPV4•115『线路82』
新闻综合,https://stream2.jlntv.cn/jlyb/sd/live.m3u8$LR•IPV4•115『线路83』
新闻综合,https://stream2.jlntv.cn/sytv/sd/live.m3u8$LR•IPV4•115『线路84』
新闻综合,http://222.179.155.21:1935/ch1.m3u8$LR•IPV4•115『线路85』
新闻综合,http://117.172.215.250:8083/videos/live/35/39/GQVbrgob5CGJM/GQVbrgob5CGJM.m3u8$LR•IPV4•115『线路86』
新闻综合,http://220.180.110.101:8083/videos/live/36/57/hwEHU4UVQ1Iv5/hwEHU4UVQ1Iv5.m3u8$LR•IPV4•115『线路87』
新闻综合,http://live.hnxttv.com:9601/live/xwzh/800K/tzwj_video.m3u8$LR•IPV4•115『线路88』
新闻综合,http://stream.bzcm.net/2/sd/live.m3u8$LR•IPV4•115『线路89』
新闻综合,http://117.156.28.119/270000001111/1110000145/index.m3u8$LR•IPV4•115『线路90』
新闻综合,https://stream2.jlntv.cn/baishan1/sd/live.m3u8$LR•IPV4•115『线路91』
新闻综合,http://live1.wuhubtv.com/channel1/sd/live.m3u8$LR•IPV4•115『线路92』
新闻综合,http://palive.patv123.com:8091/live/xwpd_800K.m3u8$LR•IPV4•115『线路93』
新闻综合,https://stream2.jlntv.cn/liaoyuan1/sd/live.m3u8$LR•IPV4•115『线路94』
新闻综合,http://stream8.jlntv.cn/shulan/sd/live.m3u8?_upt=332db6421699196585$LR•IPV4•115『线路95』
新闻综合,http://stream5.jlntv.cn/hn/sd/live.m3u8$LR•IPV4•115『线路96』
新闻综合,http://pili-live-hls.ybcxjd.com/jdh-live/2108111201035597.m3u8?zsicd$LR•IPV4•115『线路97』
新闻综合,http://live.spccmc.com:90/live/spxwzh.m3u8$LR•IPV4•115『线路98』
新闻综合,http://live.iwcmt.cn:90/live/zhxw.m3u8$LR•IPV4•115『线路99』
新闻综合,http://live.jinchuanrmt.com:90/live/zhxw.m3u8?zsicd$LR•IPV4•115『线路100』
新闻综合,https://play.yunxya.com/channellive/xinwen.m3u8$LR•IPV4•115『线路101』
新闻综合,http://ls.qingting.fm/live/267.m3u8$LR•IPV4•115『线路102』
新闻综合,http://hslive.hsnewsnet.com/lsdream/hve9Wjs/1000/live.m3u8$LR•IPV4•115『线路103』
新闻综合,https://p2.vzan.com/slowlive/596867413819827251/live.m3u8?zbid=1725814272&amp;amp;tpid=1516989100&amp;amp;type=0$LR•IPV4•115『线路104』
新闻综合,http://uzoiczhh.live.sxmty.com/live/hls/0d41f1480c4042d49927858f01fde707/53130407737b417b9a6259b57246bae3.m3u8?zshanxd$LR•IPV4•115『线路105』
新闻综合,https://ls.qingting.fm/live/5043/64k.m3u8$LR•IPV4•115『线路106』
新闻综合,http://liveout.btzx.com.cn/62ds9e/4nxdih.m3u8?fbl=$LR•IPV4•115『线路107』
新闻综合,http://nklive.nbs.cn/hls/d511bc9d-a694-4453-b3a2-4fc842cc97a1/index.m3u8$LR•IPV4•115『线路108』
新闻综合,http://cm-wshls.homecdn.com/live/2aa50.m3u8$LR•IPV4•115『线路109』
新闻综合,http://ls.qingting.fm/live/23797.m3u8$LR•IPV4•115『线路110』
新闻综合,https://play.kankanlive.com/live/1720583434627241.m3u8$LR•IPV4•115『线路111』
新闻综合,https://ls.qingting.fm/live/5022100/64k.m3u8$LR•IPV4•115『线路112』
新闻综合,https://liveout.xntv.tv/a65jur/96iln2.m3u8?zqinghd$LR•IPV4•115『线路113』
新闻综合,http://live.qthnews.org.cn:1935/live/live1/800k/tzwj_video.m3u8$LR•IPV4•115『线路114』
新闻综合,http://stream.hrbtv.net/xwzh/sd/live.m3u8?zheild$LR•IPV4•115『线路115』
新闻综合,http://stream8.jlntv.cn/shulan/sd/live.m3u8?_upt=332db6421699196585$LR•IPV4•115『线路71』
新闻综合,http://stream5.jlntv.cn/hn/sd/live.m3u8$LR•IPV4•115『线路72』
新闻综合,http://pili-live-hls.ybcxjd.com/jdh-live/2108111201035597.m3u8?zsicd$LR•IPV4•115『线路73』
新闻综合,http://live.spccmc.com:90/live/spxwzh.m3u8$LR•IPV4•115『线路74』
新闻综合,http://live.iwcmt.cn:90/live/zhxw.m3u8$LR•IPV4•115『线路75』
新闻综合,http://live.jinchuanrmt.com:90/live/zhxw.m3u8?zsicd$LR•IPV4•115『线路76』
新闻综合,https://play.yunxya.com/channellive/xinwen.m3u8$LR•IPV4•115『线路77』
新闻综合,http://ls.qingting.fm/live/267.m3u8$LR•IPV4•115『线路78』
新闻综合,http://hslive.hsnewsnet.com/lsdream/hve9Wjs/1000/live.m3u8$LR•IPV4•115『线路79』
新闻综合,https://p2.vzan.com/slowlive/596867413819827251/live.m3u8?zbid=1725814272&amp;amp;tpid=1516989100&amp;amp;type=0$LR•IPV4•115『线路80』
新闻综合,http://uzoiczhh.live.sxmty.com/live/hls/0d41f1480c4042d49927858f01fde707/53130407737b417b9a6259b57246bae3.m3u8?zshanxd$LR•IPV4•115『线路81』
新闻综合,https://ls.qingting.fm/live/5043/64k.m3u8$LR•IPV4•115『线路82』
新闻综合,http://liveout.btzx.com.cn/62ds9e/4nxdih.m3u8?fbl=$LR•IPV4•115『线路83』
新闻综合,http://nklive.nbs.cn/hls/d511bc9d-a694-4453-b3a2-4fc842cc97a1/index.m3u8$LR•IPV4•115『线路84』
新闻综合,http://cm-wshls.homecdn.com/live/2aa50.m3u8$LR•IPV4•115『线路85』
新闻综合,http://ls.qingting.fm/live/23797.m3u8$LR•IPV4•115『线路86』
新闻综合,https://play.kankanlive.com/live/1720583434627241.m3u8$LR•IPV4•115『线路87』
新闻综合,https://ls.qingting.fm/live/5022100/64k.m3u8$LR•IPV4•115『线路88』
新闻综合,https://liveout.xntv.tv/a65jur/96iln2.m3u8?zqinghd$LR•IPV4•115『线路89』
新闻综合,http://live.qthnews.org.cn:1935/live/live1/800k/tzwj_video.m3u8$LR•IPV4•115『线路90』
新闻综合,http://stream.hrbtv.net/xwzh/sd/live.m3u8?zheild$LR•IPV4•115『线路91』
新闻综合,https://stream2.jlntv.cn/baicheng1/sd/live.m3u8$LR•IPV4•115『线路92』
新闻综合,http://live.cztv.cc:85/live/xwpd.m3u8$LR•IPV4•115『线路93』
新闻综合,http://117.156.28.119/270000001111/1110000001/index.m3u8$LR•IPV4•115『线路94』
新闻综合,http://pili-live-hls.hebitv.com/hebi/hebi.m3u8$LR•IPV4•115『线路95』
新闻综合,https://stream2.jlntv.cn/naxw/sd/live.m3u8$LR•IPV4•115『线路96』
新闻综合,http://uni6rtmp.tulix.tv:1935/vbstv/vbsabr.smil/chunklist_w439903609_b1228800.m3u8$LR•IPV4•115『线路97』
新闻综合,http://221.5.213.4:30000/1111.m3u8$LR•IPV4•115『线路98』
新闻综合,https://stream2.jlntv.cn/jilin1/sd/live.m3u8$LR•IPV4•115『线路99』
新闻综合,http://30515.hlsplay.aodianyun.com/lms_30515/tv_channel_239.m3u8$LR•IPV4•115『线路100』
新闻综合,https://stream2.jlntv.cn/sptv/sd/live.m3u8$LR•IPV4•115『线路101』
新闻综合,http://live.ahsz.tv/video/s10001-szzh/index.m3u8$LR•IPV4•115『线路102』
新闻综合,http://guangshui.live.tempsource.cjyun.org/videotmp/s10146-GSXW.m3u8$LR•IPV4•115『线路103』
新闻综合,https://stream2.jlntv.cn/jlyb/sd/live.m3u8$LR•IPV4•115『线路104』
新闻综合,https://stream2.jlntv.cn/sytv/sd/live.m3u8$LR•IPV4•115『线路105』
新闻综合,http://222.179.155.21:1935/ch1.m3u8$LR•IPV4•115『线路106』
新闻综合,http://117.172.215.250:8083/videos/live/35/39/GQVbrgob5CGJM/GQVbrgob5CGJM.m3u8$LR•IPV4•115『线路107』
新闻综合,http://220.180.110.101:8083/videos/live/36/57/hwEHU4UVQ1Iv5/hwEHU4UVQ1Iv5.m3u8$LR•IPV4•115『线路108』
新闻综合,http://live.hnxttv.com:9601/live/xwzh/800K/tzwj_video.m3u8$LR•IPV4•115『线路109』
新闻综合,http://stream.bzcm.net/2/sd/live.m3u8$LR•IPV4•115『线路110』
新闻综合,http://117.156.28.119/270000001111/1110000145/index.m3u8$LR•IPV4•115『线路111』
新闻综合,https://stream2.jlntv.cn/baishan1/sd/live.m3u8$LR•IPV4•115『线路112』
新闻综合,http://live1.wuhubtv.com/channel1/sd/live.m3u8$LR•IPV4•115『线路113』
新闻综合,http://palive.patv123.com:8091/live/xwpd_800K.m3u8$LR•IPV4•115『线路114』
新闻综合,https://stream2.jlntv.cn/liaoyuan1/sd/live.m3u8$LR•IPV4•115『线路115』
陕西,#genre#
西安新闻,http://stream2.xiancity.cn/xatv1/playlist.m3u8$LR•IPV4•2『线路1』
西安新闻,http://112.46.105.20:8009/hls/28/index.m3u8$LR•IPV4•2『线路2』
西安新闻,http://112.46.105.20:8009/hls/28/index.m3u8$LR•IPV4•2『线路1』
西安新闻,http://stream2.xiancity.cn/xatv1/playlist.m3u8$LR•IPV4•2『线路2』
山东,#genre#
山东少儿,http://123.129.70.178:9901/tsfile/live/1004_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•16『线路1』
@@ -3179,25 +3177,25 @@ NewTV精品体育,http://dl.wifi942.com:66/jsyd/jsyd.php?id=GITV-JS-65$LR•IPV4
凤凰中文,http://120.198.95.220:9901/tsfile/live/1036_1.m3u8?key=txiptv&playlive=1&down=1$LR•IPV4•8『线路3』
凤凰中文,http://218.206.193.218:8888/hls/66/index.m3u8$LR•IPV4•8『线路4』
凤凰中文,http://120.198.95.220:9901/tsfile/live/1036_1.m3u8?key=txiptv$LR•IPV4•8『线路5』
凤凰中文,http://223.110.245.139/ott.js.chinamobile.com/PLTV/3/224/3221226922/index.m3u8$LR•IPV4•8『线路6』
凤凰中文,http://r.jdshipin.com/cCCzW$LR•IPV4•8『线路7』
凤凰中文,http://cdn6.163189.xyz/163189/fhzw$LR•IPV4•8『线路8』
凤凰中文,http://r.jdshipin.com/cCCzW$LR•IPV4•8『线路6』
凤凰中文,http://cdn6.163189.xyz/163189/fhzw$LR•IPV4•8『线路7』
凤凰中文,http://223.110.245.139/ott.js.chinamobile.com/PLTV/3/224/3221226922/index.m3u8$LR•IPV4•8『线路8』
凤凰资讯,http://api.mg.itv888.cn:8080/hls/11ef1dc70d8/index.m3u8$LR•IPV4•10『线路1』
凤凰资讯,http://zmgd.zyrnet.com:8888/hls/109/index.m3u8$LR•IPV4•10『线路2』
凤凰资讯,http://221.7.175.154:8445/tsfile/live/1021_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•10『线路3』
凤凰资讯,http://120.198.95.220:9901/tsfile/live/1037_1.m3u8?key=txiptv&playlive=1&down=1$LR•IPV4•10『线路4』
凤凰资讯,http://120.198.95.220:9901/tsfile/live/1037_1.m3u8?key=txiptv$LR•IPV4•10『线路5』
凤凰资讯,p3p://167.114.175.6:55331/5fffbf860003807cedf4e1016c3c3ed2$LR•IPV4•10『线路6』
凤凰资讯,http://223.110.245.167/ott.js.chinamobile.com/PLTV/3/224/3221226923/index.m3u8$LR•IPV4•10『线路7』
凤凰资讯,http://r.jdshipin.com/0Rp07$LR•IPV4•10『线路8』
凤凰资讯,http://php.jdshipin.com/TVOD/iptv.php?id=fhzx$LR•IPV4•10『线路9』
凤凰资讯,http://cdn6.163189.xyz/163189/fhzx$LR•IPV4•10『线路10』
凤凰资讯,http://r.jdshipin.com/0Rp07$LR•IPV4•10『线路7』
凤凰资讯,http://php.jdshipin.com/TVOD/iptv.php?id=fhzx$LR•IPV4•10『线路8』
凤凰资讯,http://cdn6.163189.xyz/163189/fhzx$LR•IPV4•10『线路9』
凤凰资讯,http://223.110.245.167/ott.js.chinamobile.com/PLTV/3/224/3221226923/index.m3u8$LR•IPV4•10『线路10』
凤凰香港,http://122.152.202.33/s/81a8a44f/index.m3u8?id=fhhk$LR•IPV4•6『线路1』
凤凰香港,p3p://167.114.175.6:55331/5fe0b82c000cac9774c17f262e43314d$LR•IPV4•6『线路2』
凤凰香港,http://223.110.245.136/PLTV/3/224/3221226975/index.m3u8$LR•IPV4•6『线路3』
凤凰香港,http://r.jdshipin.com/yDoTN$LR•IPV4•6『线路4』
凤凰香港,http://php.jdshipin.com/TVOD/iptv.php?id=fhhk$LR•IPV4•6『线路5』
凤凰香港,http://cdn6.163189.xyz/163189/fhhk$LR•IPV4•6『线路6』
凤凰香港,http://r.jdshipin.com/yDoTN$LR•IPV4•6『线路3』
凤凰香港,http://php.jdshipin.com/TVOD/iptv.php?id=fhhk$LR•IPV4•6『线路4』
凤凰香港,http://cdn6.163189.xyz/163189/fhhk$LR•IPV4•6『线路5』
凤凰香港,http://223.110.245.136/PLTV/3/224/3221226975/index.m3u8$LR•IPV4•6『线路6』
TVB翡翠台,p3p://167.114.175.6:55331/653e4c02000ea0440c8c63fd3e5d709d$LR•IPV4•12『线路1』
TVB翡翠台,p3p://167.114.175.6:55331/66c04cec000a20ac2dbf03c71cf661c9$LR•IPV4•12『线路2』
TVB翡翠台,p3p://108.181.32.169:19673/6533f6560002787f2d01338b57197695$LR•IPV4•12『线路3』
@@ -3247,15 +3245,15 @@ TVBS,http://seb.sason.top/sc/tvbsxw_fhd.m3u8$LR•IPV4•13『线路13』
台视,rtmp://f13h.mine.nu/sat/tv071$LR•IPV4•10『线路6』
台视,p3p://167.114.175.6:55331/612ee2240008f3db8e0578dc59406f9e$LR•IPV4•10『线路7』
台视,p3p://167.114.175.6:55331/6223b571000a13023e78ece5030b5b05$LR•IPV4•10『线路8』
台视,http://162.19.247.76:22222/live/taishi/index.m3u8$LR•IPV4•10『线路9』
台视,http://38.64.72.148/hls/modn/list/4013/chunklist1.m3u8$LR•IPV4•10『线路10』
台视,http://38.64.72.148/hls/modn/list/4013/chunklist1.m3u8$LR•IPV4•10『线路9』
台视,http://162.19.247.76:22222/live/taishi/index.m3u8$LR•IPV4•10『线路10』
民视新闻,http://38.64.72.148:80/hls/modn/list/4012/chunklist0.m3u8$LR•IPV4•4『线路1』
民视新闻,http://38.64.72.148:80/hls/modn/list/4012/chunklist1.m3u8$LR•IPV4•4『线路2』
民视新闻,http://38.64.72.148/hls/modn/list/4012/chunklist0.m3u8$LR•IPV4•4『线路3』
民视新闻,http://38.64.72.148/hls/modn/list/4012/chunklist1.m3u8$LR•IPV4•4『线路4』
耀才财经,https://v3.mediacast.hk/webcast/bshdlive-pc/playlist.m3u8$LR•IPV4•3『线路1』
耀才财经,http://202.69.67.66:443/webcast/bshdlive-mobile/playlist.m3u8$LR•IPV4•3『线路2』
耀才财经,https://v3.mediacast.hk/webcast/bshdlive-pc/chunklist_w99771165.m3u8$LR•IPV4•3『线路3』
耀才财经,https://v3.mediacast.hk/webcast/bshdlive-pc/chunklist_w99771165.m3u8$LR•IPV4•3『线路2』
耀才财经,http://202.69.67.66:443/webcast/bshdlive-mobile/playlist.m3u8$LR•IPV4•3『线路3』
美亚C+,http://ottproxy2.ist.ooo/livehls/MOB-U1-NO/03.m3u8$LR•IPV4•3『线路1』
美亚C+,http://ottproxy2.ist.ooo/livehls/MOB-U1-NO/01.m3u8$LR•IPV4•3『线路2』
美亚C+,http://ottproxy2.ist.ooo/livehls/MOB-U1-NO/02.m3u8$LR•IPV4•3『线路3』
@@ -3560,8 +3558,8 @@ KPop,https://ads.its-newid.net/api/manifest.m3u8?ads.service_id=USAJ3000013FJ&ch
KPop,https://ads.its-newid.net/api/manifest.m3u8?ads.service_id=GB17000088V&channel_id=newid_086&tp=samsung_tvplus$LR•IPV4•5『线路4』
KPop,https://lotus.stingray.com/manifest/ose-317ads-montreal/samsungtvplus/master.m3u8$LR•IPV4•5『线路5』
HOY TV,p3p://167.114.175.6:55331/62184bc3000cd48f11e47b06202b7e18$LR•IPV4•3『线路1』
HOY TV,https://hoytv-live-stream.hoy.tv/ch77/index.m3u8$LR•IPV4•3『线路2』
HOY TV,http://php.jdshipin.com/TVOD/iptv.php?id=hoytv$LR•IPV4•3『线路3』
HOY TV,http://php.jdshipin.com/TVOD/iptv.php?id=hoytv$LR•IPV4•3『线路2』
HOY TV,https://hoytv-live-stream.hoy.tv/ch77/index.m3u8$LR•IPV4•3『线路3』
MOMOTV,rtmp://f13h.mine.nu/sat/tv761$LR•IPV4
大爱1,p3p://167.114.175.6:55331/63ed9fff00076875e972c31c79f4152e$LR•IPV4
大爱2,p3p://167.114.175.6:55331/63eda04a0001f6fae973e6a334696980$LR•IPV4
+33 -35
View File
@@ -2,7 +2,7 @@
#EXTINF:-1 tvg-id="CCTV4K" tvg-name="CCTV4K" group-title="央视频道",CCTV-4K
https://live-play-hls.cctvnews.cctv.com/CCTVChannel/channel_cctv4k_mbd.m3u8?auth_key=1784358000-1-b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c-c0b2f705841d49d821e3075961bb6e84&yid=b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c$LR•IPV4•3『线路1』
#EXTINF:-1 tvg-id="CCTV4K" tvg-name="CCTV4K" group-title="央视频道",CCTV-4K
https://live-play-hls.cctvnews.cctv.com/CCTVChannel/channel_cctv4k_mbd.m3u8?auth_key=1784361600-1-b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c-dbc4b9704792e97da2c65aeed2033e45&yid=b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c$LR•IPV4•3『线路2』
https://live-play-hls.cctvnews.cctv.com/CCTVChannel/channel_cctv4k_mbd.m3u8?auth_key=1784371500-1-b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c-48ffc61db508f8062cc67caddde58d68&yid=b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c$LR•IPV4•3『线路2』
#EXTINF:-1 tvg-id="CCTV4K" tvg-name="CCTV4K" group-title="央视频道",CCTV-4K
http://198.204.240.250:82/live/cctv4k.m3u8$LR•IPV4•3『线路3』
#EXTINF:-1 tvg-id="象山综合" tvg-name="象山综合" group-title="浙江频道",象山综合
@@ -774,11 +774,11 @@ http://218.206.193.218:8888/hls/66/index.m3u8$LR•IPV4•8『线路4』
#EXTINF:-1 tvg-id="凤凰卫视中文台" tvg-name="凤凰卫视中文台" group-title="港澳台",凤凰卫视中文台
http://120.198.95.220:9901/tsfile/live/1036_1.m3u8?key=txiptv$LR•IPV4•8『线路5』
#EXTINF:-1 tvg-id="凤凰卫视中文台" tvg-name="凤凰卫视中文台" group-title="港澳台",凤凰卫视中文台
http://223.110.245.139/ott.js.chinamobile.com/PLTV/3/224/3221226922/index.m3u8$LR•IPV4•8『线路6』
http://r.jdshipin.com/cCCzW$LR•IPV4•8『线路6』
#EXTINF:-1 tvg-id="凤凰卫视中文台" tvg-name="凤凰卫视中文台" group-title="港澳台",凤凰卫视中文台
http://r.jdshipin.com/cCCzW$LR•IPV4•8『线路7』
http://cdn6.163189.xyz/163189/fhzw$LR•IPV4•8『线路7』
#EXTINF:-1 tvg-id="凤凰卫视中文台" tvg-name="凤凰卫视中文台" group-title="港澳台",凤凰卫视中文台
http://cdn6.163189.xyz/163189/fhzw$LR•IPV4•8『线路8』
http://223.110.245.139/ott.js.chinamobile.com/PLTV/3/224/3221226922/index.m3u8$LR•IPV4•8『线路8』
#EXTINF:-1 tvg-id="凤凰卫视资讯台" tvg-name="凤凰卫视资讯台" group-title="港澳台",凤凰卫视资讯台
http://api.mg.itv888.cn:8080/hls/11ef1dc70d8/index.m3u8$LR•IPV4•10『线路1』
#EXTINF:-1 tvg-id="凤凰卫视资讯台" tvg-name="凤凰卫视资讯台" group-title="港澳台",凤凰卫视资讯台
@@ -792,25 +792,25 @@ http://120.198.95.220:9901/tsfile/live/1037_1.m3u8?key=txiptv$LR•IPV4•10『
#EXTINF:-1 tvg-id="凤凰卫视资讯台" tvg-name="凤凰卫视资讯台" group-title="港澳台",凤凰卫视资讯台
p3p://167.114.175.6:55331/5fffbf860003807cedf4e1016c3c3ed2$LR•IPV4•10『线路6』
#EXTINF:-1 tvg-id="凤凰卫视资讯台" tvg-name="凤凰卫视资讯台" group-title="港澳台",凤凰卫视资讯台
http://223.110.245.167/ott.js.chinamobile.com/PLTV/3/224/3221226923/index.m3u8$LR•IPV4•10『线路7』
http://r.jdshipin.com/0Rp07$LR•IPV4•10『线路7』
#EXTINF:-1 tvg-id="凤凰卫视资讯台" tvg-name="凤凰卫视资讯台" group-title="港澳台",凤凰卫视资讯台
http://r.jdshipin.com/0Rp07$LR•IPV4•10『线路8』
http://php.jdshipin.com/TVOD/iptv.php?id=fhzx$LR•IPV4•10『线路8』
#EXTINF:-1 tvg-id="凤凰卫视资讯台" tvg-name="凤凰卫视资讯台" group-title="港澳台",凤凰卫视资讯台
http://php.jdshipin.com/TVOD/iptv.php?id=fhzx$LR•IPV4•10『线路9』
http://cdn6.163189.xyz/163189/fhzx$LR•IPV4•10『线路9』
#EXTINF:-1 tvg-id="凤凰卫视资讯台" tvg-name="凤凰卫视资讯台" group-title="港澳台",凤凰卫视资讯台
http://cdn6.163189.xyz/163189/fhzx$LR•IPV4•10『线路10』
http://223.110.245.167/ott.js.chinamobile.com/PLTV/3/224/3221226923/index.m3u8$LR•IPV4•10『线路10』
#EXTINF:-1 tvg-id="凤凰卫视香港台" tvg-name="凤凰卫视香港台" group-title="港澳台",凤凰卫视香港台
http://122.152.202.33/s/81a8a44f/index.m3u8?id=fhhk$LR•IPV4•6『线路1』
#EXTINF:-1 tvg-id="凤凰卫视香港台" tvg-name="凤凰卫视香港台" group-title="港澳台",凤凰卫视香港台
p3p://167.114.175.6:55331/5fe0b82c000cac9774c17f262e43314d$LR•IPV4•6『线路2』
#EXTINF:-1 tvg-id="凤凰卫视香港台" tvg-name="凤凰卫视香港台" group-title="港澳台",凤凰卫视香港台
http://223.110.245.136/PLTV/3/224/3221226975/index.m3u8$LR•IPV4•6『线路3』
http://r.jdshipin.com/yDoTN$LR•IPV4•6『线路3』
#EXTINF:-1 tvg-id="凤凰卫视香港台" tvg-name="凤凰卫视香港台" group-title="港澳台",凤凰卫视香港台
http://r.jdshipin.com/yDoTN$LR•IPV4•6『线路4』
http://php.jdshipin.com/TVOD/iptv.php?id=fhhk$LR•IPV4•6『线路4』
#EXTINF:-1 tvg-id="凤凰卫视香港台" tvg-name="凤凰卫视香港台" group-title="港澳台",凤凰卫视香港台
http://php.jdshipin.com/TVOD/iptv.php?id=fhhk$LR•IPV4•6『线路5』
http://cdn6.163189.xyz/163189/fhhk$LR•IPV4•6『线路5』
#EXTINF:-1 tvg-id="凤凰卫视香港台" tvg-name="凤凰卫视香港台" group-title="港澳台",凤凰卫视香港台
http://cdn6.163189.xyz/163189/fhhk$LR•IPV4•6『线路6』
http://223.110.245.136/PLTV/3/224/3221226975/index.m3u8$LR•IPV4•6『线路6』
#EXTINF:-1 tvg-id="台视新闻" tvg-name="台视新闻" group-title="港澳台",台视新闻
http://38.64.72.148:80/hls/modn/list/4013/chunklist0.m3u8$LR•IPV4•4『线路1』
#EXTINF:-1 tvg-id="台视新闻" tvg-name="台视新闻" group-title="港澳台",台视新闻
@@ -3010,7 +3010,7 @@ https://ali-m-l.cztv.com/channels/lantian/channel012/1080p.m3u8$LR•IPV4•41
#EXTINF:-1 tvg-id="纪录" tvg-name="纪录" group-title="💓优质个源",纪录
https://ali-m-l.cztv.com/channels/lantian/channel12/720p.m3u8$LR•IPV4•41『线路3』
#EXTINF:-1 tvg-id="纪录" tvg-name="纪录" group-title="💓优质个源",纪录
https://v4-702cae17a28d6e4f0c0002bba021d934.livehwc4.com/play.kankanlive.com/live/1698423397390920.m3u8?sub_m3u8=true&edge_slice=true&user_session_id=db97ec06b982224fd6b00b7bb1f6143c$LR•IPV4•41『线路4』
https://v4-702cae17a28d6e4f0c0002bba021d934.livehwc4.com/play.kankanlive.com/live/1698423397390920.m3u8?sub_m3u8=true&edge_slice=true&user_session_id=17294e1ca3c39692f88722ff53cecd2a$LR•IPV4•41『线路4』
#EXTINF:-1 tvg-id="纪录" tvg-name="纪录" group-title="💓优质个源",纪录
http://free.cnlive.club/channel/n3f497a4c/index.m3u8?q=1752629214236$LR•IPV4•41『线路5』
#EXTINF:-1 tvg-id="纪录" tvg-name="纪录" group-title="💓优质个源",纪录
@@ -3712,7 +3712,7 @@ https://shcm-stream-cf1.stream.264788.xyz/cms001/ch00000090990000001620/index.m3
#EXTINF:-1 tvg-id="CCTV" tvg-name="CCTV" group-title="🌐央视频道",CCTV
https://epg.pw/stream/ac8062ec9484078061d3bef507c15a423ac57ae4144e3fcc4b0a198dd420f911.m3u8$LR•IPV4•90『线路52』
#EXTINF:-1 tvg-id="CCTV" tvg-name="CCTV" group-title="🌐央视频道",CCTV
https://live-play-hls.cctvnews.cctv.com/CCTVChannel/channel_cctv4_mbd.m3u8?auth_key=1784361600-1-b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c-e246d8a5986fffcd5d21d25acc7aca83&yid=b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c$LR•IPV4•90『线路53』
https://live-play-hls.cctvnews.cctv.com/CCTVChannel/channel_cctv4_mbd.m3u8?auth_key=1784371500-1-b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c-bb4241b14453c4f49bd0749a3aab3caf&yid=b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c$LR•IPV4•90『线路53』
#EXTINF:-1 tvg-id="CCTV" tvg-name="CCTV" group-title="🌐央视频道",CCTV
http://183.196.25.171:808/hls/77/index.m3u8$LR•IPV4•90『线路54』
#EXTINF:-1 tvg-id="CCTV" tvg-name="CCTV" group-title="🌐央视频道",CCTV
@@ -3790,9 +3790,9 @@ https://xykt-fix.github.io/Y77.m3u8$LR•IPV4•90『线路90』
#EXTINF:-1 tvg-id="梁家辉" tvg-name="梁家辉" group-title="明星",梁家辉
http://live.metshop.top/huya/11342429?cdn=alicdn$LR•IPV4
#EXTINF:-1 tvg-id="刘德华" tvg-name="刘德华" group-title="明星",刘德华
http://epg.112114.xyz/douyu/2516864$LR•IPV4•2『线路1』
http://live.metshop.top/huya/11342424?cdn=alicdn$LR•IPV4•2『线路1』
#EXTINF:-1 tvg-id="刘德华" tvg-name="刘德华" group-title="明星",刘德华
http://live.metshop.top/huya/11342424?cdn=alicdn$LR•IPV4•2『线路2』
http://epg.112114.xyz/douyu/2516864$LR•IPV4•2『线路2』
#EXTINF:-1 tvg-id="林正英" tvg-name="林正英" group-title="明星",林正英
http://zzy789.xyz/douyu1.php?id=7356023$LR•IPV4•2『线路1』
#EXTINF:-1 tvg-id="林正英" tvg-name="林正英" group-title="明星",林正英
@@ -4722,41 +4722,39 @@ http://ali-m-l.cztv.com/channels/lantian/channel009/1080p.m3u8$LR•IPV4•2『
#EXTINF:-1 tvg-id="中国蓝新闻" tvg-name="中国蓝新闻" group-title="浙江",中国蓝新闻
https://ali-m-l.cztv.com/channels/lantian/channel009/1080p.m3u8?$LR•IPV4•2『线路2』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="广东",深圳卫视
http://[2409:8087:8:21::18]:6610/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226959/1.m3u8?GuardEncType=2&accountinfo=%7E%7EV2.0%7EGrVNEZREjuNVKiTJo2mtwg%7EtP4-l0lmSfjwLWEfK_el1vH_mv-s1zo4AQJwdedaVwG9xkuFTDg8J26cwOrNJzn20BErrHdLhuZ9EzLUCD3PMW-OMx4MGteHV2vLeW6BqoY%2CEND$LR•IPV6•18『线路1』
http://[2409:8087:8:21::18]:6610/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226959/1.m3u8?GuardEncType=2&accountinfo=%7E%7EV2.0%7EGrVNEZREjuNVKiTJo2mtwg%7EtP4-l0lmSfjwLWEfK_el1vH_mv-s1zo4AQJwdedaVwG9xkuFTDg8J26cwOrNJzn20BErrHdLhuZ9EzLUCD3PMW-OMx4MGteHV2vLeW6BqoY%2CEND$LR•IPV6•17『线路1』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="广东",深圳卫视
http://120.198.95.220:9901/tsfile/live/1048_1.m3u8?key=txiptv&playlive=1&down=1$LR•IPV4•18『线路2』
http://120.198.95.220:9901/tsfile/live/1048_1.m3u8?key=txiptv&playlive=1&down=1$LR•IPV4•17『线路2』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="广东",深圳卫视
http://120.198.95.220:9901/tsfile/live/1048_1.m3u8?key=txiptv$LR•IPV4•18『线路3』
http://120.198.95.220:9901/tsfile/live/1048_1.m3u8?key=txiptv$LR•IPV4•17『线路3』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="广东",深圳卫视
http://173.208.212.130:8181/720p/szws.m3u8$LR•IPV4•18『线路4』
http://173.208.212.130:8181/720p/szws.m3u8$LR•IPV4•17『线路4』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="广东",深圳卫视
http://192.151.150.154/live/szwshd.m3u8$LR•IPV4•18『线路5』
http://192.151.150.154/live/szwshd.m3u8$LR•IPV4•17『线路5』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="广东",深圳卫视
http://124.228.160.210:9901/tsfile/live/0126_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•18『线路6』
http://124.228.160.210:9901/tsfile/live/0126_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•17『线路6』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="广东",深圳卫视
http://36.136.38.87:9901/tsfile/live/0126_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•18『线路7』
http://36.136.38.87:9901/tsfile/live/0126_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•17『线路7』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="广东",深圳卫视
http://183.11.239.36:808/hls/45/index.m3u8$LR•IPV4•18『线路8』
http://183.11.239.36:808/hls/45/index.m3u8$LR•IPV4•17『线路8』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="广东",深圳卫视
https://sztv-hls.sztv.com.cn/AxeFRth/500/q37Age0.m3u8?sign=671fcd3c133f66cef04a83ae0b8c542b&t=6a59189c$LR•IPV4•18『线路9』
http://38.75.136.137:98/gslb/dsdqpub/szwshd.m3u8?auth=testpub$LR•IPV4•17『线路9』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="广东",深圳卫视
http://38.75.136.137:98/gslb/dsdqpub/szwshd.m3u8?auth=testpub$LR•IPV4•18『线路10』
http://23.237.228.134/live6/shenzhen.m3u8$LR•IPV4•17『线路10』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="广东",深圳卫视
http://23.237.228.134/live6/shenzhen.m3u8$LR•IPV4•18『线路11』
http://gfr.x3322.net:9901/tsfile/live/1095_1.m3u8$LR•IPV4•17『线路11』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="广东",深圳卫视
http://gfr.x3322.net:9901/tsfile/live/1095_1.m3u8$LR•IPV4•18『线路12』
http://api.kkitv.itv888.cn:8080/hls/iftsd32ykm/index.m3u8$LR•IPV4•17『线路12』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="广东",深圳卫视
http://api.kkitv.itv888.cn:8080/hls/iftsd32ykm/index.m3u8$LR•IPV4•18『线路13』
https://iptv.catvod.com/catvod.php?id=szws$LR•IPV4•17『线路13』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="广东",深圳卫视
https://iptv.catvod.com/catvod.php?id=szws$LR•IPV4•18『线路14』
https://httop.top/ysp-深圳卫视$LR•IPV4•17『线路14』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="广东",深圳卫视
https://httop.top/ysp-深圳卫视$LR•IPV4•18『线路15』
http://iptv.huuc.edu.cn/hls/szhd.m3u8$LR•IPV4•17『线路15』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="广东",深圳卫视
http://iptv.huuc.edu.cn/hls/szhd.m3u8$LR•IPV4•18『线路16』
http://153.0.171.163:9901/tsfile/live/0126_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•17『线路16』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="广东",深圳卫视
http://153.0.171.163:9901/tsfile/live/0126_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•18『线路17』
#EXTINF:-1 tvg-id="深圳卫视" tvg-name="深圳卫视" group-title="广东",深圳卫视
http://38.64.72.148:80/hls/modn/list/4007/playlist.m3u8$LR•IPV4•18『线路18』
http://38.64.72.148:80/hls/modn/list/4007/playlist.m3u8$LR•IPV4•17『线路17』
#EXTINF:-1 tvg-id="汕头经济" tvg-name="汕头经济" group-title="广东",汕头经济
https://stream1.freetv.fun/shan-tou-jing-ji-2.ctv$LR•IPV4•11『线路1』
#EXTINF:-1 tvg-id="汕头经济" tvg-name="汕头经济" group-title="广东",汕头经济
+33 -34
View File
@@ -1,7 +1,7 @@
央视频道,#genre#
CCTV-4K,https://live-play-hls.cctvnews.cctv.com/CCTVChannel/channel_cctv4k_mbd.m3u8?auth_key=1784358000-1-b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c-c0b2f705841d49d821e3075961bb6e84&yid=b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c$LR•IPV4•3『线路1』
CCTV-4K,https://live-play-hls.cctvnews.cctv.com/CCTVChannel/channel_cctv4k_mbd.m3u8?auth_key=1784361600-1-b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c-dbc4b9704792e97da2c65aeed2033e45&yid=b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c$LR•IPV4•3『线路2』
CCTV-4K,https://live-play-hls.cctvnews.cctv.com/CCTVChannel/channel_cctv4k_mbd.m3u8?auth_key=1784371500-1-b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c-48ffc61db508f8062cc67caddde58d68&yid=b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c$LR•IPV4•3『线路2』
CCTV-4K,http://198.204.240.250:82/live/cctv4k.m3u8$LR•IPV4•3『线路3』
浙江频道,#genre#
@@ -433,25 +433,25 @@ Now星影,p3p://167.114.175.6:55331/65bf5e010005226704b84f4f048a4148$LR•IPV4
凤凰卫视中文台,http://120.198.95.220:9901/tsfile/live/1036_1.m3u8?key=txiptv&playlive=1&down=1$LR•IPV4•8『线路3』
凤凰卫视中文台,http://218.206.193.218:8888/hls/66/index.m3u8$LR•IPV4•8『线路4』
凤凰卫视中文台,http://120.198.95.220:9901/tsfile/live/1036_1.m3u8?key=txiptv$LR•IPV4•8『线路5』
凤凰卫视中文台,http://223.110.245.139/ott.js.chinamobile.com/PLTV/3/224/3221226922/index.m3u8$LR•IPV4•8『线路6』
凤凰卫视中文台,http://r.jdshipin.com/cCCzW$LR•IPV4•8『线路7』
凤凰卫视中文台,http://cdn6.163189.xyz/163189/fhzw$LR•IPV4•8『线路8』
凤凰卫视中文台,http://r.jdshipin.com/cCCzW$LR•IPV4•8『线路6』
凤凰卫视中文台,http://cdn6.163189.xyz/163189/fhzw$LR•IPV4•8『线路7』
凤凰卫视中文台,http://223.110.245.139/ott.js.chinamobile.com/PLTV/3/224/3221226922/index.m3u8$LR•IPV4•8『线路8』
凤凰卫视资讯台,http://api.mg.itv888.cn:8080/hls/11ef1dc70d8/index.m3u8$LR•IPV4•10『线路1』
凤凰卫视资讯台,http://zmgd.zyrnet.com:8888/hls/109/index.m3u8$LR•IPV4•10『线路2』
凤凰卫视资讯台,http://221.7.175.154:8445/tsfile/live/1021_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•10『线路3』
凤凰卫视资讯台,http://120.198.95.220:9901/tsfile/live/1037_1.m3u8?key=txiptv&playlive=1&down=1$LR•IPV4•10『线路4』
凤凰卫视资讯台,http://120.198.95.220:9901/tsfile/live/1037_1.m3u8?key=txiptv$LR•IPV4•10『线路5』
凤凰卫视资讯台,p3p://167.114.175.6:55331/5fffbf860003807cedf4e1016c3c3ed2$LR•IPV4•10『线路6』
凤凰卫视资讯台,http://223.110.245.167/ott.js.chinamobile.com/PLTV/3/224/3221226923/index.m3u8$LR•IPV4•10『线路7』
凤凰卫视资讯台,http://r.jdshipin.com/0Rp07$LR•IPV4•10『线路8』
凤凰卫视资讯台,http://php.jdshipin.com/TVOD/iptv.php?id=fhzx$LR•IPV4•10『线路9』
凤凰卫视资讯台,http://cdn6.163189.xyz/163189/fhzx$LR•IPV4•10『线路10』
凤凰卫视资讯台,http://r.jdshipin.com/0Rp07$LR•IPV4•10『线路7』
凤凰卫视资讯台,http://php.jdshipin.com/TVOD/iptv.php?id=fhzx$LR•IPV4•10『线路8』
凤凰卫视资讯台,http://cdn6.163189.xyz/163189/fhzx$LR•IPV4•10『线路9』
凤凰卫视资讯台,http://223.110.245.167/ott.js.chinamobile.com/PLTV/3/224/3221226923/index.m3u8$LR•IPV4•10『线路10』
凤凰卫视香港台,http://122.152.202.33/s/81a8a44f/index.m3u8?id=fhhk$LR•IPV4•6『线路1』
凤凰卫视香港台,p3p://167.114.175.6:55331/5fe0b82c000cac9774c17f262e43314d$LR•IPV4•6『线路2』
凤凰卫视香港台,http://223.110.245.136/PLTV/3/224/3221226975/index.m3u8$LR•IPV4•6『线路3』
凤凰卫视香港台,http://r.jdshipin.com/yDoTN$LR•IPV4•6『线路4』
凤凰卫视香港台,http://php.jdshipin.com/TVOD/iptv.php?id=fhhk$LR•IPV4•6『线路5』
凤凰卫视香港台,http://cdn6.163189.xyz/163189/fhhk$LR•IPV4•6『线路6』
凤凰卫视香港台,http://r.jdshipin.com/yDoTN$LR•IPV4•6『线路3』
凤凰卫视香港台,http://php.jdshipin.com/TVOD/iptv.php?id=fhhk$LR•IPV4•6『线路4』
凤凰卫视香港台,http://cdn6.163189.xyz/163189/fhhk$LR•IPV4•6『线路5』
凤凰卫视香港台,http://223.110.245.136/PLTV/3/224/3221226975/index.m3u8$LR•IPV4•6『线路6』
台视新闻,http://38.64.72.148:80/hls/modn/list/4013/chunklist0.m3u8$LR•IPV4•4『线路1』
台视新闻,http://38.64.72.148:80/hls/modn/list/4013/chunklist1.m3u8$LR•IPV4•4『线路2』
台视新闻,http://38.64.72.148/hls/modn/list/4013/chunklist0.m3u8$LR•IPV4•4『线路3』
@@ -1633,7 +1633,7 @@ XXXXXXXXX粤,http://lxajh.top/tv/douyu.php?id=8912325$LR•IPV4
纪录,https://v4-e6b1c5baf4e240fe63adbf68dda23435.livehwc4.com/play.kankanlive.com/live/1698423397390920.m3u8?sub_m3u8=true&edge_slice=true&user_session_id=8a60541ebe4d355d0da6b086b9f2026d$LR•IPV4•41『线路1』
纪录,https://ali-m-l.cztv.com/channels/lantian/channel012/1080p.m3u8$LR•IPV4•41『线路2』
纪录,https://ali-m-l.cztv.com/channels/lantian/channel12/720p.m3u8$LR•IPV4•41『线路3』
纪录,https://v4-702cae17a28d6e4f0c0002bba021d934.livehwc4.com/play.kankanlive.com/live/1698423397390920.m3u8?sub_m3u8=true&edge_slice=true&user_session_id=db97ec06b982224fd6b00b7bb1f6143c$LR•IPV4•41『线路4』
纪录,https://v4-702cae17a28d6e4f0c0002bba021d934.livehwc4.com/play.kankanlive.com/live/1698423397390920.m3u8?sub_m3u8=true&edge_slice=true&user_session_id=17294e1ca3c39692f88722ff53cecd2a$LR•IPV4•41『线路4』
纪录,http://free.cnlive.club/channel/n3f497a4c/index.m3u8?q=1752629214236$LR•IPV4•41『线路5』
纪录,http://free.cnlive.club/channel/2ae73b1a/index.m3u8?q=1752629214236$LR•IPV4•41『线路6』
纪录,http://free.cnlive.club/channel/nb957a7c/index.m3u8?q=1752629214236$LR•IPV4•41『线路7』
@@ -1998,7 +1998,7 @@ CCTV,https://live-play-hls.cctvnews.cctv.com/CCTVChannel/channel_cctv4_mbd.m3u8?
CCTV,https://jsv-live-play.sfccn.com/live/jsv_3920_fhd.m3u8$LR•IPV4•90『线路50』
CCTV,https://shcm-stream-cf1.stream.264788.xyz/cms001/ch00000090990000001620/index.m3u8?streamid=8a034b40397504e25b3775c772237996&streamkey=01vY5fRxC8VyKg4oq30vfikHXTCAKySLP29l6OG91kQlzDttHgzNLkUw5kivm3PfNsVHJv5FgdsPBYFYI2IWpt7tfRCuFHqLT2pvX67ubMds8jl2DHtvOh0&token=1775754349-4f33f4f84a4abeba-0-91687dc8c9325092efa1d00f330d2710$LR•IPV4•90『线路51』
CCTV,https://epg.pw/stream/ac8062ec9484078061d3bef507c15a423ac57ae4144e3fcc4b0a198dd420f911.m3u8$LR•IPV4•90『线路52』
CCTV,https://live-play-hls.cctvnews.cctv.com/CCTVChannel/channel_cctv4_mbd.m3u8?auth_key=1784361600-1-b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c-e246d8a5986fffcd5d21d25acc7aca83&yid=b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c$LR•IPV4•90『线路53』
CCTV,https://live-play-hls.cctvnews.cctv.com/CCTVChannel/channel_cctv4_mbd.m3u8?auth_key=1784371500-1-b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c-bb4241b14453c4f49bd0749a3aab3caf&yid=b59134a2ead43d7f783f943c8f535e7bb80c5169575b2e8efcd5b3ddea21b41c$LR•IPV4•90『线路53』
CCTV,http://183.196.25.171:808/hls/77/index.m3u8$LR•IPV4•90『线路54』
CCTV,http://183.196.25.171:808/hls/11/index.m3u8$LR•IPV4•90『线路55』
CCTV,http://183.196.25.171:808/hls/93/index.m3u8$LR•IPV4•90『线路56』
@@ -2039,8 +2039,8 @@ CCTV,https://xykt-fix.github.io/Y77.m3u8$LR•IPV4•90『线路90』
明星,#genre#
梁家辉,http://live.metshop.top/huya/11342429?cdn=alicdn$LR•IPV4
刘德华,http://epg.112114.xyz/douyu/2516864$LR•IPV4•2『线路1』
刘德华,http://live.metshop.top/huya/11342424?cdn=alicdn$LR•IPV4•2『线路2』
刘德华,http://live.metshop.top/huya/11342424?cdn=alicdn$LR•IPV4•2『线路1』
刘德华,http://epg.112114.xyz/douyu/2516864$LR•IPV4•2『线路2』
林正英,http://zzy789.xyz/douyu1.php?id=7356023$LR•IPV4•2『线路1』
林正英,http://epg.112114.xyz/douyu/218859$LR•IPV4•2『线路2』
@@ -2523,24 +2523,23 @@ YOUNG,https://s.emisoras.tv:8081/penielkids/index.m3u8$LR•IPV4•3『线路3
中国蓝新闻,https://ali-m-l.cztv.com/channels/lantian/channel009/1080p.m3u8?$LR•IPV4•2『线路2』
广东,#genre#
深圳卫视,http://[2409:8087:8:21::18]:6610/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226959/1.m3u8?GuardEncType=2&accountinfo=%7E%7EV2.0%7EGrVNEZREjuNVKiTJo2mtwg%7EtP4-l0lmSfjwLWEfK_el1vH_mv-s1zo4AQJwdedaVwG9xkuFTDg8J26cwOrNJzn20BErrHdLhuZ9EzLUCD3PMW-OMx4MGteHV2vLeW6BqoY%2CEND$LR•IPV6•18『线路1』
深圳卫视,http://120.198.95.220:9901/tsfile/live/1048_1.m3u8?key=txiptv&playlive=1&down=1$LR•IPV4•18『线路2』
深圳卫视,http://120.198.95.220:9901/tsfile/live/1048_1.m3u8?key=txiptv$LR•IPV4•18『线路3』
深圳卫视,http://173.208.212.130:8181/720p/szws.m3u8$LR•IPV4•18『线路4』
深圳卫视,http://192.151.150.154/live/szwshd.m3u8$LR•IPV4•18『线路5』
深圳卫视,http://124.228.160.210:9901/tsfile/live/0126_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•18『线路6』
深圳卫视,http://36.136.38.87:9901/tsfile/live/0126_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•18『线路7』
深圳卫视,http://183.11.239.36:808/hls/45/index.m3u8$LR•IPV4•18『线路8』
深圳卫视,https://sztv-hls.sztv.com.cn/AxeFRth/500/q37Age0.m3u8?sign=671fcd3c133f66cef04a83ae0b8c542b&t=6a59189c$LR•IPV4•18『线路9』
深圳卫视,http://38.75.136.137:98/gslb/dsdqpub/szwshd.m3u8?auth=testpub$LR•IPV4•18『线路10』
深圳卫视,http://23.237.228.134/live6/shenzhen.m3u8$LR•IPV4•18『线路11』
深圳卫视,http://gfr.x3322.net:9901/tsfile/live/1095_1.m3u8$LR•IPV4•18『线路12』
深圳卫视,http://api.kkitv.itv888.cn:8080/hls/iftsd32ykm/index.m3u8$LR•IPV4•18『线路13』
深圳卫视,https://iptv.catvod.com/catvod.php?id=szws$LR•IPV4•18『线路14』
深圳卫视,https://httop.top/ysp-深圳卫视$LR•IPV4•18『线路15』
深圳卫视,http://iptv.huuc.edu.cn/hls/szhd.m3u8$LR•IPV4•18『线路16』
深圳卫视,http://153.0.171.163:9901/tsfile/live/0126_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•18『线路17』
深圳卫视,http://38.64.72.148:80/hls/modn/list/4007/playlist.m3u8$LR•IPV4•18『线路18』
深圳卫视,http://[2409:8087:8:21::18]:6610/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226959/1.m3u8?GuardEncType=2&accountinfo=%7E%7EV2.0%7EGrVNEZREjuNVKiTJo2mtwg%7EtP4-l0lmSfjwLWEfK_el1vH_mv-s1zo4AQJwdedaVwG9xkuFTDg8J26cwOrNJzn20BErrHdLhuZ9EzLUCD3PMW-OMx4MGteHV2vLeW6BqoY%2CEND$LR•IPV6•17『线路1』
深圳卫视,http://120.198.95.220:9901/tsfile/live/1048_1.m3u8?key=txiptv&playlive=1&down=1$LR•IPV4•17『线路2』
深圳卫视,http://120.198.95.220:9901/tsfile/live/1048_1.m3u8?key=txiptv$LR•IPV4•17『线路3』
深圳卫视,http://173.208.212.130:8181/720p/szws.m3u8$LR•IPV4•17『线路4』
深圳卫视,http://192.151.150.154/live/szwshd.m3u8$LR•IPV4•17『线路5』
深圳卫视,http://124.228.160.210:9901/tsfile/live/0126_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•17『线路6』
深圳卫视,http://36.136.38.87:9901/tsfile/live/0126_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•17『线路7』
深圳卫视,http://183.11.239.36:808/hls/45/index.m3u8$LR•IPV4•17『线路8』
深圳卫视,http://38.75.136.137:98/gslb/dsdqpub/szwshd.m3u8?auth=testpub$LR•IPV4•17『线路9』
深圳卫视,http://23.237.228.134/live6/shenzhen.m3u8$LR•IPV4•17『线路10』
深圳卫视,http://gfr.x3322.net:9901/tsfile/live/1095_1.m3u8$LR•IPV4•17『线路11』
深圳卫视,http://api.kkitv.itv888.cn:8080/hls/iftsd32ykm/index.m3u8$LR•IPV4•17『线路12』
深圳卫视,https://iptv.catvod.com/catvod.php?id=szws$LR•IPV4•17『线路13』
深圳卫视,https://httop.top/ysp-深圳卫视$LR•IPV4•17『线路14』
深圳卫视,http://iptv.huuc.edu.cn/hls/szhd.m3u8$LR•IPV4•17『线路15』
深圳卫视,http://153.0.171.163:9901/tsfile/live/0126_1.m3u8?key=txiptv&playlive=1&authid=0$LR•IPV4•17『线路16』
深圳卫视,http://38.64.72.148:80/hls/modn/list/4007/playlist.m3u8$LR•IPV4•17『线路17』
汕头经济,https://stream1.freetv.fun/shan-tou-jing-ji-2.ctv$LR•IPV4•11『线路1』
汕头经济,https://stream1.freetv.fun/shan-tou-jing-ji-3.ctv$LR•IPV4•11『线路2』
汕头经济,https://stream1.freetv.fun/shan-tou-jing-ji-5.ctv$LR•IPV4•11『线路3』
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
42df056144fa4e08ea39b624be4cd477
012e78d91f15a374e5fe5361042336ac
+47 -55
View File
@@ -6,31 +6,24 @@
"dns": {
"servers": [
{
"type": "https",
"tag": "remote",
"address": "https://8.8.8.8/dns-query",
"strategy": "prefer_ipv4",
"server": "8.8.8.8",
"detour": "select"
},
{
"type": "https",
"tag": "local",
"address": "https://223.5.5.5/dns-query",
"strategy": "prefer_ipv4",
"detour": "direct"
},
{
"tag": "block",
"address": "rcode://success"
"server": "223.5.5.5"
},
{
"type": "fakeip",
"tag": "fakeip",
"address": "fakeip"
"inet4_range": "198.18.0.0/15",
"inet6_range": "fc00::/18"
}
],
"rules": [
{
"outbound": ["any"],
"server": "local"
},
{
"clash_mode": "Global",
"server": "remote"
@@ -38,13 +31,16 @@
{
"clash_mode": "Direct",
"server": "local"
},
{
"query_type": [
"A",
"AAAA"
],
"server": "fakeip",
"rewrite_ttl": 1
}
],
"fakeip": {
"enabled": true,
"inet4_range": "198.18.0.0/15",
"inet6_range": "fc00::/18"
},
"strategy": "prefer_ipv4",
"independent_cache": true,
"reverse_mapping": true
@@ -55,10 +51,7 @@
"tag": "mixed-in",
"listen": "0.0.0.0",
"listen_port": 10172,
"tcp_fast_open":true,
"sniff": false,
"sniff_override_destination": false,
"domain_strategy": "prefer_ipv4",
"tcp_fast_open": true,
"set_system_proxy": false
},
{
@@ -66,20 +59,14 @@
"tag": "socks-in",
"listen": "0.0.0.0",
"listen_port": 10173,
"tcp_fast_open":true,
"sniff": false,
"sniff_override_destination": false,
"domain_strategy": "prefer_ipv4"
"tcp_fast_open": true
},
{
"type": "mixed",
"tag": "mixed-in2",
"listen": "0.0.0.0",
"listen_port": 10174,
"tcp_fast_open":true,
"sniff": false,
"sniff_override_destination": false,
"domain_strategy": "prefer_ipv4",
"tcp_fast_open": true,
"set_system_proxy": false
},
{
@@ -87,10 +74,7 @@
"tag": "mixed-in3",
"listen": "0.0.0.0",
"listen_port": 10175,
"tcp_fast_open":true,
"sniff": false,
"sniff_override_destination": false,
"domain_strategy": "prefer_ipv4",
"tcp_fast_open": true,
"set_system_proxy": false
}
],
@@ -114,18 +98,13 @@
{
"type": "direct",
"tag": "direct"
},
{
"type": "block",
"tag": "block"
},
{
"type": "dns",
"tag": "dns-out"
}
],
"route": {
"rules": [
{
"action": "sniff"
},
{
"type": "logical",
"mode": "or",
@@ -137,23 +116,33 @@
"port": 53
}
],
"outbound": "dns-out"
"action": "hijack-dns"
},
{
"inbound": [
"mixed-in",
"socks-in",
"mixed-in2",
"mixed-in3"
],
"action": "resolve",
"strategy": "prefer_ipv4"
},
{
"ip_is_private": true,
"outbound": "direct"
},
{
"inbound":[
"mixed-in2"
],
"outbound":"select2"
"inbound": [
"mixed-in2"
],
"outbound": "select2"
},
{
"inbound":[
"mixed-in3"
],
"outbound":"select3"
"inbound": [
"mixed-in3"
],
"outbound": "select3"
},
{
"clash_mode": "Direct",
@@ -178,10 +167,14 @@
"protocol": "stun"
}
],
"outbound": "block"
"action": "reject"
}
],
"auto_detect_interface": false
"auto_detect_interface": false,
"default_domain_resolver": {
"server": "local",
"strategy": "prefer_ipv4"
}
},
"experimental": {
"cache_file": {
@@ -197,4 +190,3 @@
}
}
}
+1077 -4599
View File
@@ -1,4766 +1,1244 @@
{
"recommend": "LIST:最新|推薦,官方頻道",
"class": [
"recommend":"LIST:最新|推薦,官方頻道",
"class":[
{
"type_id": "新聞",
"type_name": "新闻"
"type_id":"LIST:王志安 @wangzhian,老高與小茉 @laogao,脑洞乌托邦 @NDWTB,自说自话的总裁 @STBoss,纪实说 @C-Documentary,老肉雜談 @老肉雜談,李永樂老師 @TchLiyongle,滇西小哥 @dianxixiaoge,李子柒 Liziqi @cnliziqi,老饭骨 @LaoFanGu,小高姐的 Magic Ingredients @MagicIngredients,小穎美食 @XiaoYingFood,primitivetechnology9550 @primitivetechnology9550,Mr Beast@MrBeast,Airforceproud95 @Airforceproud95,TheGreatWar @TheGreatWar,Mark Rober @MarkRober,不良林,涌哥侃侃 @ygkkk,悟空的日常",
"type_name":"自媒體"
},
{
"type_id": "战情室",
"type_name": "栏目"
"type_id":"LIST:HDR,Girls HDR,Landscape HDR,Walk HDR",
"type_name":"HDR"
},
{
"type_id": "个人频道",
"type_name": "频道"
"type_id":"LIST:华语音乐,华语MV,点击率最高",
"type_name":"音樂"
},
{
"type_id": "音樂",
"type_name": "音乐"
"type_id":"LIST:综艺,芒果综艺,腾讯综艺,爱奇艺综艺,优酷综艺,卫视综艺",
"type_name":"綜藝"
},
{
"type_id": "短劇",
"type_name": "短剧"
"type_id":"LIST:紀錄片,历史纪录片,自然纪录片,宇宙纪录片",
"type_name":"紀錄片"
},
{
"type_id": "HDR",
"type_name": "HDR"
"type_id":"LIST:新闻 Live,体育直播,赛事直播",
"type_name":"新聞直播"
},
{
"type_id": "4K",
"type_name": "4K"
"type_id":"短劇",
"type_name":"短劇"
},
{
"type_id": "放松",
"type_name": "放松"
"type_id":"LIST:剧集,腾讯剧集,爱奇艺剧集,优酷剧集,芒果剧集,TVB",
"type_name":"劇集"
},
{
"type_id": "時尚",
"type_name": "時尚"
"type_id":"電影",
"type_name":"電影"
},
{
"type_id": "紀錄",
"type_name": "纪录"
"type_id":"體育",
"type_name":"體育"
},
{
"type_id": "劇集",
"type_name": "剧集"
"type_id":"時尚潮流",
"type_name":"時尚潮流"
},
{
"type_id": "電影",
"type_name": "电影"
"type_id":"放松",
"type_name":"放松"
},
{
"type_id": "動畫",
"type_name": "动画"
"type_id":"4K",
"type_name":"4K"
},
{
"type_id": "綜藝",
"type_name": "综艺"
"type_id":"宇宙",
"type_name":"科普知識"
},
{
"type_id": "體育",
"type_name": "体育"
"type_id":"科技",
"type_name":"科技"
},
{
"type_id": "宇宙",
"type_name": "科普"
"type_id":"解說",
"type_name":"解說"
},
{
"type_id": "科技",
"type_name": "科技"
"type_id":"神秘",
"type_name":"神秘"
},
{
"type_id": "解說",
"type_name": "解说"
},
{
"type_id": "神秘",
"type_name": "神秘"
},
{
"type_id": "自媒體",
"type_name": "自媒體"
},
{
"type_id": "熱門",
"type_name": "热门"
},
{
"type_id": "GETTRENDS",
"type_name": "Trends"
"type_id":"动画片",
"type_name":"动画片"
}
],
"filters": {
"熱門": [
"filters":{
"短劇":[
{
"key": "tid",
"name": "LIST",
"value": [
{
"n": "默认",
"v": "PL hottest 默認"
},
{
"n": "热门",
"v": "PL Trending 熱門"
},
{
"n": "动漫",
"v": "PL Popular anime 動漫熱門"
},
{
"n": "漫画",
"v": "PL Popular comics 漫畫熱門"
},
{
"n": "上传",
"v": "PL Recently uploaded 最近上傳"
},
{
"n": "其他",
"v": "PL Popular Other popular ones 其他熱門"
}
"key":"time",
"name":"時間",
"value":[
{"n":"時間全選","v":""},
{"n":"2024","v":"2024"},
{"n":"2023","v":"2023"},
{"n":"2022","v":"2022"},
{"n":"2021","v":"2021"},
{"n":"2020","v":"2020"},
{"n":"2019","v":"2019"},
{"n":"2018","v":"2018"},
{"n":"2017","v":"2017"},
{"n":"2016","v":"2016"},
{"n":"2015","v":"2015"},
{"n":"2014","v":"2014"},
{"n":"2013","v":"2013"},
{"n":"2012","v":"2012"},
{"n":"2011","v":"2011"},
{"n":"2010","v":"2010"},
{"n":"2009","v":"2009"},
{"n":"2008","v":"2008"},
{"n":"2007","v":"2007"},
{"n":"2006","v":"2006"},
{"n":"2005","v":"2005"},
{"n":"2004","v":"2004"},
{"n":"2003","v":"2003"},
{"n":"2002","v":"2002"},
{"n":"2001","v":"2001"},
{"n":"2000","v":"2000"},
{"n":"1999","v":"1999"},
{"n":"1998","v":"1998"},
{"n":"1997","v":"1997"},
{"n":"1996","v":"1996"},
{"n":"1995","v":"1995"},
{"n":"1994","v":"1994"},
{"n":"1993","v":"1993"},
{"n":"1992","v":"1992"},
{"n":"1991","v":"1991"},
{"n":"1990","v":"1990"},
{"n":"1989","v":"1989"},
{"n":"1988","v":"1988"},
{"n":"1987","v":"1987"},
{"n":"1986","v":"1986"},
{"n":"1985","v":"1985"},
{"n":"1984","v":"1984"},
{"n":"1983","v":"1983"},
{"n":"1982","v":"1982"},
{"n":"1981","v":"1981"},
{"n":"1980","v":"1980"},
{"n":"1979","v":"1979"},
{"n":"1978","v":"1978"},
{"n":"1977","v":"1977"},
{"n":"1976","v":"1976"},
{"n":"1975","v":"1975"},
{"n":"1974","v":"1974"},
{"n":"1973","v":"1973"},
{"n":"1972","v":"1972"},
{"n":"1971","v":"1971"},
{"n":"1970","v":"1970"},
{"n":"1969","v":"1969"},
{"n":"1968","v":"1968"},
{"n":"1967","v":"1967"},
{"n":"1966","v":"1966"},
{"n":"1965","v":"1965"},
{"n":"1964","v":"1964"},
{"n":"1963","v":"1963"},
{"n":"1962","v":"1962"},
{"n":"1961","v":"1961"},
{"n":"1960","v":"1960"},
{"n":"1959","v":"1959"},
{"n":"1958","v":"1958"}
]
},
{
"key": "date",
"name": "排序/时间",
"value": [
{
"n": "默认",
"v": "LIST"
},
{
"n": "最新",
"v": "latest"
},
{
"n": "最热",
"v": "hottest"
},
{
"n": "最高",
"v": "favorite"
},
{
"n": "当天",
"v": "day"
},
{
"n": "本周",
"v": "week"
},
{
"n": "本月",
"v": "month"
}
"key":"tid",
"name":"短劇",
"value":[
{"n":"抖音","v":"抖音 短剧"},
{"n":"快手","v":"快手 短剧"},
{"n":"大陆","v":"大陆 短剧"},
{"n":"香港","v":"香港 短剧"},
{"n":"澳門","v":"澳門 短剧"},
{"n":"台湾","v":"台湾 短剧"},
{"n":"新加坡","v":"新加坡 短剧"},
{"n":"馬來西亞","v":"馬來西亞 短剧"},
{"n":"泰國","v":"泰國 短剧"},
{"n":"越南","v":"越南 短剧"},
{"n":"印度","v":"印度 短剧"},
{"n":"韩国","v":"韩国 短剧"},
{"n":"日本","v":"日本 短剧"},
{"n":"欧美","v":"欧美 短剧"},
{"n":"腾讯","v":"腾讯 短剧"},
{"n":"爱奇艺","v":"爱奇艺 短剧"},
{"n":"优酷","v":"优酷 短剧"},
{"n":"芒果","v":"芒果TV 短剧"},
{"n":"搜狐","v":"搜狐 短剧"}
]
},
{
"key":"tid",
"name":"短劇",
"value":[
{"n":"都市","v":"@Urbanshort-TV 都市 短劇"},
{"n":"爱情","v":"爱情 短劇"},
{"n":"复仇","v":"复仇 短劇"},
{"n":"穿越","v":"穿越 短劇"},
{"n":"喜剧","v":"喜剧 短劇"},
{"n":"奇幻","v":"奇幻 短劇"},
{"n":"九酱爱追剧","v":"@NineSauceDramaTV"},
{"n":"百万好剧场","v":"@1-pw5ox"},
{"n":"咖啡追剧","v":"@@coffeedrama605"},
{"n":"斗罗短剧","v":"@DouluoDrama123 斗羅短劇"},
{"n":"嘟嘟剧场","v":"@DUDUJUCHANG"},
{"n":"牛牛短剧","v":"@niuniuduanju"}
]
}
],
"短劇": [
"動畫片":[
{
"key": "time",
"name": "時間",
"value": [
{
"n": "時間全選",
"v": ""
},
{
"n": "2025",
"v": "2025"
},
{
"n": "2024",
"v": "2024"
},
{
"n": "2023",
"v": "2023"
},
{
"n": "2022",
"v": "2022"
},
{
"n": "2021",
"v": "2021"
},
{
"n": "2020",
"v": "2020"
},
{
"n": "2019",
"v": "2019"
},
{
"n": "2018",
"v": "2018"
},
{
"n": "2017",
"v": "2017"
},
{
"n": "2016",
"v": "2016"
},
{
"n": "2015",
"v": "2015"
},
{
"n": "2014",
"v": "2014"
},
{
"n": "2013",
"v": "2013"
},
{
"n": "2012",
"v": "2012"
},
{
"n": "2011",
"v": "2011"
},
{
"n": "2010",
"v": "2010"
},
{
"n": "2009",
"v": "2009"
},
{
"n": "2008",
"v": "2008"
},
{
"n": "2007",
"v": "2007"
},
{
"n": "2006",
"v": "2006"
},
{
"n": "2005",
"v": "2005"
},
{
"n": "2004",
"v": "2004"
},
{
"n": "2003",
"v": "2003"
},
{
"n": "2002",
"v": "2002"
},
{
"n": "2001",
"v": "2001"
},
{
"n": "2000",
"v": "2000"
},
{
"n": "1999",
"v": "1999"
},
{
"n": "1998",
"v": "1998"
},
{
"n": "1997",
"v": "1997"
},
{
"n": "1996",
"v": "1996"
},
{
"n": "1995",
"v": "1995"
},
{
"n": "1994",
"v": "1994"
},
{
"n": "1993",
"v": "1993"
},
{
"n": "1992",
"v": "1992"
},
{
"n": "1991",
"v": "1991"
},
{
"n": "1990",
"v": "1990"
},
{
"n": "1989",
"v": "1989"
},
{
"n": "1988",
"v": "1988"
},
{
"n": "1987",
"v": "1987"
},
{
"n": "1986",
"v": "1986"
},
{
"n": "1985",
"v": "1985"
},
{
"n": "1984",
"v": "1984"
},
{
"n": "1983",
"v": "1983"
},
{
"n": "1982",
"v": "1982"
},
{
"n": "1981",
"v": "1981"
},
{
"n": "1980",
"v": "1980"
},
{
"n": "1979",
"v": "1979"
},
{
"n": "1978",
"v": "1978"
},
{
"n": "1977",
"v": "1977"
},
{
"n": "1976",
"v": "1976"
},
{
"n": "1975",
"v": "1975"
},
{
"n": "1974",
"v": "1974"
},
{
"n": "1973",
"v": "1973"
},
{
"n": "1972",
"v": "1972"
},
{
"n": "1971",
"v": "1971"
},
{
"n": "1970",
"v": "1970"
},
{
"n": "1969",
"v": "1969"
},
{
"n": "1968",
"v": "1968"
},
{
"n": "1967",
"v": "1967"
},
{
"n": "1966",
"v": "1966"
},
{
"n": "1965",
"v": "1965"
},
{
"n": "1964",
"v": "1964"
},
{
"n": "1963",
"v": "1963"
},
{
"n": "1962",
"v": "1962"
},
{
"n": "1961",
"v": "1961"
},
{
"n": "1960",
"v": "1960"
},
{
"n": "1959",
"v": "1959"
},
{
"n": "1958",
"v": "1958"
}
"key":"time",
"name":"時間",
"value":[
{"n":"時間全選","v":""},
{"n":"2024","v":"2024"},
{"n":"2023","v":"2023"},
{"n":"2022","v":"2022"},
{"n":"2021","v":"2021"},
{"n":"2020","v":"2020"},
{"n":"2019","v":"2019"},
{"n":"2018","v":"2018"},
{"n":"2017","v":"2017"},
{"n":"2016","v":"2016"},
{"n":"2015","v":"2015"},
{"n":"2014","v":"2014"},
{"n":"2013","v":"2013"},
{"n":"2012","v":"2012"},
{"n":"2011","v":"2011"},
{"n":"2010","v":"2010"},
{"n":"2009","v":"2009"},
{"n":"2008","v":"2008"},
{"n":"2007","v":"2007"},
{"n":"2006","v":"2006"},
{"n":"2005","v":"2005"},
{"n":"2004","v":"2004"},
{"n":"2003","v":"2003"},
{"n":"2002","v":"2002"},
{"n":"2001","v":"2001"},
{"n":"2000","v":"2000"},
{"n":"1999","v":"1999"},
{"n":"1998","v":"1998"},
{"n":"1997","v":"1997"},
{"n":"1996","v":"1996"},
{"n":"1995","v":"1995"},
{"n":"1994","v":"1994"},
{"n":"1993","v":"1993"},
{"n":"1992","v":"1992"},
{"n":"1991","v":"1991"},
{"n":"1990","v":"1990"},
{"n":"1989","v":"1989"},
{"n":"1988","v":"1988"},
{"n":"1987","v":"1987"},
{"n":"1986","v":"1986"},
{"n":"1985","v":"1985"},
{"n":"1984","v":"1984"},
{"n":"1983","v":"1983"},
{"n":"1982","v":"1982"},
{"n":"1981","v":"1981"},
{"n":"1980","v":"1980"},
{"n":"1979","v":"1979"},
{"n":"1978","v":"1978"},
{"n":"1977","v":"1977"},
{"n":"1976","v":"1976"},
{"n":"1975","v":"1975"},
{"n":"1974","v":"1974"},
{"n":"1973","v":"1973"},
{"n":"1972","v":"1972"},
{"n":"1971","v":"1971"},
{"n":"1970","v":"1970"},
{"n":"1969","v":"1969"},
{"n":"1968","v":"1968"},
{"n":"1967","v":"1967"},
{"n":"1966","v":"1966"},
{"n":"1965","v":"1965"},
{"n":"1964","v":"1964"},
{"n":"1963","v":"1963"},
{"n":"1962","v":"1962"},
{"n":"1961","v":"1961"},
{"n":"1960","v":"1960"},
{"n":"1959","v":"1959"},
{"n":"1958","v":"1958"}
]
},
{
"key": "tid",
"name": "短劇",
"value": [
{
"n": "抖音",
"v": "PL抖音 短剧"
},
{
"n": "快手",
"v": "PL快手 短剧"
},
{
"n": "大陆",
"v": "PL大陆短剧"
},
{
"n": "香港",
"v": "PL香港短剧"
},
{
"n": "澳门",
"v": "PL澳门短剧"
},
{
"n": "台湾",
"v": "PL台湾短剧"
},
{
"n": "新加坡",
"v": "PL新加坡短剧"
},
{
"n": "马来西亚",
"v": "PL马来西亚短剧"
},
{
"n": "泰国",
"v": "PL泰国短剧"
},
{
"n": "越南",
"v": "PL越南短剧"
},
{
"n": "印度",
"v": "PL印度短剧"
},
{
"n": "韩国",
"v": "PL韩国短剧"
},
{
"n": "日本",
"v": "PL日本短剧"
},
{
"n": "欧美",
"v": "PL欧美短剧"
},
{
"n": "腾讯",
"v": "PL腾讯短剧"
},
{
"n": "爱奇艺",
"v": "PL爱奇艺短剧"
},
{
"n": "优酷",
"v": "PL优酷短剧"
},
{
"n": "芒果",
"v": "PL芒果TV短剧"
},
{
"n": "搜狐",
"v": "PL搜狐短剧"
}
"key":"tid",
"name":"中文",
"value":[
{"n":"默认中文国漫","v":"國漫 劇集 3D"},
{"n":"默认","v":"animation"},
{"n":"儿童早教","v":"儿童早教"},
{"n":"儿童歌曲","v":"儿童歌曲"},
{"n":"儿童音乐","v":"儿童音乐"},
{"n":"儿童绘画","v":"儿童绘画"},
{"n":"宝宝巴士","v":"宝宝巴士"},
{"n":"儿歌多多","v":"儿歌多多"},
{"n":"儿童英语启蒙","v":"儿童英语启蒙"},
{"n":"儿童启蒙故事","v":"儿童启蒙故事"},
{"n":"儿童安全教育","v":"儿童安全教育"}
]
},
{
"key": "tid",
"name": "短劇",
"value": [
{
"n": "都市",
"v": "PL都市短剧"
},
{
"n": "爱情",
"v": "PL爱情短剧"
},
{
"n": "复仇",
"v": "PL复仇短劇"
},
{
"n": "霸总",
"v": "PL霸总短劇"
},
{
"n": "萌宝",
"v": "PL萌宝短劇"
},
{
"n": "古装",
"v": "PL古装短劇"
},
{
"n": "穿越",
"v": "PL穿越短劇"
},
{
"n": "喜剧",
"v": "PL喜剧短劇"
},
{
"n": "奇幻",
"v": "PL奇幻短劇"
},
{
"n": "九酱爱追剧",
"v": "PD@NineSauceDramaTV"
},
{
"n": "百万好剧场",
"v": "PD@1-pw5ox"
},
{
"n": "咖啡追剧",
"v": "PD@coffeedrama605"
},
{
"n": "斗罗短剧",
"v": "PD@DouluoDrama123 斗羅短劇"
},
{
"n": "嘟嘟剧场",
"v": "PD@DUDUJUCHANG"
},
{
"n": "牛牛短剧",
"v": "PD@niuniuduanju"
}
]
},
{
"key": "date",
"name": "排序/时间",
"value": [
{
"n": "默认",
"v": ""
},
{
"n": "最新",
"v": "latest"
},
{
"n": "最热",
"v": "hottest"
},
{
"n": "最高",
"v": "favorite"
},
{
"n": "当天",
"v": "day"
},
{
"n": "本周",
"v": "week"
},
{
"n": "本月",
"v": "month"
}
"key":"tid",
"name":"English",
"value":[
{"n":"默认英文国漫","v":"3D Chinese cartoon"},
{"n":"小猪佩奇","v":"@PeppaPigChineseOfficial 小猪佩奇 中文官方 - Peppa Pig"},
{"n":"CoComelon","v":"@CoComelon"},
{"n":"合集","v":"Anime ENG SUB 合集"},
{"n":"国漫社","v":"@Animation 次元 苍穹动漫 PP看动漫 公馆"},
{"n":"国漫工厂","v":"@3DGuoman SUB"},
{"n":"阅文动漫","v":"@yuewenanimation SUB"},
{"n":"哔哩","v":"@madebybilibili 哔哩动漫"},
{"n":"腾讯","v":"@TencentVideoAnimation SUB"},
{"n":"优酷","v":"@youkuanimation 优酷动漫"},
{"n":"爱奇艺","v":"@iQIYIAnime 爱奇艺动漫"}
]
}
],
"動畫": [
"LIST:新闻 Live,体育直播,赛事直播":[
{
"key": "time",
"name": "時間",
"value": [
{
"n": "時間全選",
"v": ""
},
{
"n": "2025",
"v": "2025"
},
{
"n": "2024",
"v": "2024"
},
{
"n": "2023",
"v": "2023"
},
{
"n": "2022",
"v": "2022"
},
{
"n": "2021",
"v": "2021"
},
{
"n": "2020",
"v": "2020"
},
{
"n": "2019",
"v": "2019"
},
{
"n": "2018",
"v": "2018"
},
{
"n": "2017",
"v": "2017"
},
{
"n": "2016",
"v": "2016"
},
{
"n": "2015",
"v": "2015"
},
{
"n": "2014",
"v": "2014"
},
{
"n": "2013",
"v": "2013"
},
{
"n": "2012",
"v": "2012"
},
{
"n": "2011",
"v": "2011"
},
{
"n": "2010",
"v": "2010"
},
{
"n": "2009",
"v": "2009"
},
{
"n": "2008",
"v": "2008"
},
{
"n": "2007",
"v": "2007"
},
{
"n": "2006",
"v": "2006"
},
{
"n": "2005",
"v": "2005"
},
{
"n": "2004",
"v": "2004"
},
{
"n": "2003",
"v": "2003"
},
{
"n": "2002",
"v": "2002"
},
{
"n": "2001",
"v": "2001"
},
{
"n": "2000",
"v": "2000"
},
{
"n": "1999",
"v": "1999"
},
{
"n": "1998",
"v": "1998"
},
{
"n": "1997",
"v": "1997"
},
{
"n": "1996",
"v": "1996"
},
{
"n": "1995",
"v": "1995"
},
{
"n": "1994",
"v": "1994"
},
{
"n": "1993",
"v": "1993"
},
{
"n": "1992",
"v": "1992"
},
{
"n": "1991",
"v": "1991"
},
{
"n": "1990",
"v": "1990"
},
{
"n": "1989",
"v": "1989"
},
{
"n": "1988",
"v": "1988"
},
{
"n": "1987",
"v": "1987"
},
{
"n": "1986",
"v": "1986"
},
{
"n": "1985",
"v": "1985"
},
{
"n": "1984",
"v": "1984"
},
{
"n": "1983",
"v": "1983"
},
{
"n": "1982",
"v": "1982"
},
{
"n": "1981",
"v": "1981"
},
{
"n": "1980",
"v": "1980"
},
{
"n": "1979",
"v": "1979"
},
{
"n": "1978",
"v": "1978"
},
{
"n": "1977",
"v": "1977"
},
{
"n": "1976",
"v": "1976"
},
{
"n": "1975",
"v": "1975"
},
{
"n": "1974",
"v": "1974"
},
{
"n": "1973",
"v": "1973"
},
{
"n": "1972",
"v": "1972"
},
{
"n": "1971",
"v": "1971"
},
{
"n": "1970",
"v": "1970"
},
{
"n": "1969",
"v": "1969"
},
{
"n": "1968",
"v": "1968"
},
{
"n": "1967",
"v": "1967"
},
{
"n": "1966",
"v": "1966"
},
{
"n": "1965",
"v": "1965"
},
{
"n": "1964",
"v": "1964"
},
{
"n": "1963",
"v": "1963"
},
{
"n": "1962",
"v": "1962"
},
{
"n": "1961",
"v": "1961"
},
{
"n": "1960",
"v": "1960"
},
{
"n": "1959",
"v": "1959"
},
{
"n": "1958",
"v": "1958"
}
"key":"tid",
"name":"中文",
"value":[
{"n":"默认","v":"fully YouTube 新聞 Live"},
{"n":"赛事","v":"直播 赛事"},
{"n":"CCTV","v":"直播 CCTV"},
{"n":"港台","v":"直播 港台"}
]
},
{
"key": "tid",
"name": "中文",
"value": [
{
"n": "默认",
"v": "animation"
},
{
"n": "虾仁动画",
"v": "PL虾仁"
},
{
"n": "沙雕动画",
"v": "PL沙雕动画"
},
{
"n": "中文国漫",
"v": "PL國漫3D"
},
{
"n": "儿童早教",
"v": "PL儿童早教"
},
{
"n": "儿童歌曲",
"v": "PL儿童歌曲"
},
{
"n": "儿童音乐",
"v": "PL儿童音乐"
},
{
"n": "儿童绘画",
"v": "PL儿童绘画"
},
{
"n": "宝宝巴士",
"v": "PL宝宝巴士"
},
{
"n": "儿歌多多",
"v": "PL儿歌多多"
},
{
"n": "儿童英语启蒙",
"v": "PL儿童英语启蒙"
},
{
"n": "儿童启蒙故事",
"v": "PL儿童启蒙故事"
},
{
"n": "儿童安全教育",
"v": "PL儿童安全教育"
}
"key":"tid",
"name":"English",
"value":[
{"n":"Live","v":"live"},
{"n":"CNN","v":"live CNN"},
{"n":"BBC","v":"live BBC"},
{"n":"games","v":"live games"},
{"n":"印度電視台","v":"@SETIndia"}
]
},
{
"key": "tid",
"name": "English",
"value": [
{
"n": "默认英文国漫",
"v": "PD'3D Chinese cartoon'"
},
{
"n": "小猪佩奇",
"v": "PD@PeppaPigChineseOfficial 小猪佩奇 中文官方 - Peppa Pig"
},
{
"n": "CoComelon",
"v": "PD@CoComelon"
},
{
"n": "合集",
"v": "'Anime ENG SUB'合集"
},
{
"n": "国漫社",
"v": "PD@Animation"
},
{
"n": "国漫工厂",
"v": "PD@3DGuoman"
},
{
"n": "阅文动漫",
"v": "PD@yuewenanimation"
},
{
"n": "哔哩",
"v": "PD@madebybilibili"
},
{
"n": "腾讯",
"v": "PD@TencentVideoAnimation"
},
{
"n": "优酷",
"v": "PD@youkuanimation"
},
{
"n": "爱奇艺",
"v": "PD@iQIYIAnime"
}
"key":"tid",
"name":"中文",
"value":[
{"n":"默认","v":"News"},
{"n":"时政","v":"时政 新闻"},
{"n":"体育","v":"体育 新闻"},
{"n":"娱乐","v":"娱乐 新闻"},
{"n":"大陆","v":"大陆 新闻"},
{"n":"港台","v":"港台 新闻"}
]
},
{
"key": "date",
"name": "排序/时间",
"value": [
{
"n": "默认",
"v": ""
},
{
"n": "最新",
"v": "latest"
},
{
"n": "最热",
"v": "hottest"
},
{
"n": "最高",
"v": "favorite"
},
{
"n": "当天",
"v": "day"
},
{
"n": "本周",
"v": "week"
},
{
"n": "本月",
"v": "month"
}
"key":"tid",
"name":"English",
"value":[
{"n":"科技與發展","v":"閱兵 奧運會 航母 航空母艦 潛水艇 核武器 坦克 武器 卫星 火箭 輪船 飛機 飛碟"},
{"n":"法治与社会","v":"法治 法制 社会 卖淫 淫秽 污蔑 赌博 毒品 裸聊 诈骗 拐卖 强奸 勒索"},
{"n":"News","v":"News"},
{"n":"CNN","v":"CNN news"},
{"n":"BBC","v":"BBC news"}
]
}
],
"新聞": [
"LIST:剧集,腾讯剧集,爱奇艺剧集,优酷剧集,芒果剧集,TVB":[
{
"key": "tid",
"name": "中文",
"value": [
{
"n": "默认",
"v": "fully YouTube 新聞 Live"
},
{
"n": "赛事",
"v": "直播 赛事"
},
{
"n": "CCTV",
"v": "直播 CCTV"
},
{
"n": "港台",
"v": "直播 港台"
},
{
"n": "CNA",
"v": "@channelnewsasia"
},
{
"n": "鳳凰衛視",
"v": "@phoenixtvhk"
},
{
"n": "CTINEWS",
"v": "直播 中天新闻"
},
{
"n": "TVBSEWS",
"v": "直播 TVBSNEWS"
},
{
"n": "新亚太唐人",
"v": "@NTDAPTV"
},
{
"n": "東森新聞 CH51",
"v": "直播 東森新聞 CH51"
},
{
"n": "三立LIVE新闻",
"v": "直播 三立LIVE新闻 @setnews "
},
{
"n": "台視新聞台HD",
"v": "直播 台視新聞 TTV NEWS"
},
{
"n": "中視新聞 HD",
"v": "直播 Taiwan CTV news HD Live"
}
"key":"time",
"name":"時間",
"value":[
{"n":"時間全選","v":""},
{"n":"2024","v":"2024"},
{"n":"2023","v":"2023"},
{"n":"2022","v":"2022"},
{"n":"2021","v":"2021"},
{"n":"2020","v":"2020"},
{"n":"2019","v":"2019"},
{"n":"2018","v":"2018"},
{"n":"2017","v":"2017"},
{"n":"2016","v":"2016"},
{"n":"2015","v":"2015"},
{"n":"2014","v":"2014"},
{"n":"2013","v":"2013"},
{"n":"2012","v":"2012"},
{"n":"2011","v":"2011"},
{"n":"2010","v":"2010"},
{"n":"2009","v":"2009"},
{"n":"2008","v":"2008"},
{"n":"2007","v":"2007"},
{"n":"2006","v":"2006"},
{"n":"2005","v":"2005"},
{"n":"2004","v":"2004"},
{"n":"2003","v":"2003"},
{"n":"2002","v":"2002"},
{"n":"2001","v":"2001"},
{"n":"2000","v":"2000"},
{"n":"1999","v":"1999"},
{"n":"1998","v":"1998"},
{"n":"1997","v":"1997"},
{"n":"1996","v":"1996"},
{"n":"1995","v":"1995"},
{"n":"1994","v":"1994"},
{"n":"1993","v":"1993"},
{"n":"1992","v":"1992"},
{"n":"1991","v":"1991"},
{"n":"1990","v":"1990"},
{"n":"1989","v":"1989"},
{"n":"1988","v":"1988"},
{"n":"1987","v":"1987"},
{"n":"1986","v":"1986"},
{"n":"1985","v":"1985"},
{"n":"1984","v":"1984"},
{"n":"1983","v":"1983"},
{"n":"1982","v":"1982"},
{"n":"1981","v":"1981"},
{"n":"1980","v":"1980"},
{"n":"1979","v":"1979"},
{"n":"1978","v":"1978"},
{"n":"1977","v":"1977"},
{"n":"1976","v":"1976"},
{"n":"1975","v":"1975"},
{"n":"1974","v":"1974"},
{"n":"1973","v":"1973"},
{"n":"1972","v":"1972"},
{"n":"1971","v":"1971"},
{"n":"1970","v":"1970"},
{"n":"1969","v":"1969"},
{"n":"1968","v":"1968"},
{"n":"1967","v":"1967"},
{"n":"1966","v":"1966"},
{"n":"1965","v":"1965"},
{"n":"1964","v":"1964"},
{"n":"1963","v":"1963"},
{"n":"1962","v":"1962"},
{"n":"1961","v":"1961"},
{"n":"1960","v":"1960"},
{"n":"1959","v":"1959"},
{"n":"1958","v":"1958"}
]
},
{
"key": "tid",
"name": "English",
"value": [
{
"n": "Live",
"v": "live"
},
{
"n": "CNN",
"v": "live CNN"
},
{
"n": "BBC",
"v": "live BBC"
},
{
"n": "games",
"v": "live games"
},
{
"n": "CBS",
"v": "@CBSNews"
},
{
"n": "ABC",
"v": "live ABC NEWS"
},
{
"n": "NBC",
"v": "@NBCNews"
},
{
"n": "LiveNOW from FOX",
"v": "@livenowfox"
},
{
"n": "Sky News",
"v": "@SkyNews"
},
{
"n": "euronews",
"v": "@euronews"
},
{
"n": "GBNews",
"v": "@GBNewsOnline"
},
{
"n": "Al Jazeera English",
"v": "@aljazeeraenglish"
},
{
"n": "ABCNews (Australia)",
"v": "@abcnewsaustralia"
},
{
"n": "FRANCE 24 English",
"v": "live FRANCE 24 English"
},
{
"n": "Reuters",
"v": "live Reuters"
},
{
"n": "印度电视台",
"v": "@SETIndia"
}
"key":"tid",
"name":"中文",
"value":[
{"n":"默認","v":""},
{"n":"華語熱播電視劇官方頻道","v":"華語熱播電視劇官方頻道"},
{"n":"粵劇","v":"粵劇 劇集"},
{"n":"TVB","v":"@TVB"},
{"n":"国剧放映社","v":"国剧放映社"},
{"n":"大陆","v":"大陆 剧集"},
{"n":"腾讯","v":"腾讯 剧集"},
{"n":"爱奇艺","v":"爱奇艺 剧集"},
{"n":"优酷","v":"优酷 剧集"},
{"n":"芒果","v":"芒果TV 剧集"},
{"n":"搜狐","v":"搜狐 剧集"},
{"n":"华数","v":"华数 剧集"},
{"n":"港台","v":"港台 剧集"},
{"n":"美国","v":"美国 Full Episode 完整剧集"},
{"n":"Netflix","v":"Netflix Full Episode 完整剧集"},
{"n":"Disney","v":"disney Full Episode 完整剧集"},
{"n":"Apple","v":"apple Full Episode 完整剧集"},
{"n":"Amazon","v":"amazon Full Episode 完整剧集"},
{"n":"HBO","v":"hbo Full Episode 完整剧集"},
{"n":"韩国","v":"韩国 剧集"},
{"n":"日本","v":"日本 剧集"},
{"n":"英国","v":"英国 Full Episode 完整剧集"}
]
},
{
"key": "tid",
"name": "中文",
"value": [
{
"n": "默认",
"v": "News"
},
{
"n": "News",
"v": "news"
},
{
"n": "时政",
"v": "时政 新闻"
},
{
"n": "体育",
"v": "体育 新闻"
},
{
"n": "娱乐",
"v": "娱乐 新闻"
},
{
"n": "大陆",
"v": "大陆 新闻"
},
{
"n": "HKTVB",
"v": "@tvbnewsofficial"
},
{
"n": "少康戰情室",
"v": "@tvbssituationroom"
},
{
"n": "政经龙凤配",
"v": "@觀點"
},
{
"n": "FOCUS全球新闻",
"v": "@TVBSNEWS FOCUS全球新闻"
},
{
"n": "新闻大白话",
"v": "@TVBSNEWS 新闻大白话"
},
{
"n": "东森新闻",
"v": "关键时刻新闻"
},
{
"n": "港台",
"v": "港台 新闻"
}
]
},
{
"key": "tid",
"name": "English",
"value": [
{
"n": "科技與發展",
"v": "閱兵 奧運會 航母 航空母艦 潛水艇 核武器 坦克 武器 卫星 火箭 輪船 飛機 飛碟"
},
{
"n": "法治与社会",
"v": "法治 法制 社会 卖淫 淫秽 污蔑 赌博 毒品 裸聊 诈骗 拐卖 强奸 勒索"
},
{
"n": "News",
"v": "News"
},
{
"n": "CNN",
"v": "CNN news"
},
{
"n": "BBC",
"v": "BBC news"
}
]
},
{
"key": "date",
"name": "排序/时间",
"value": [
{
"n": "默认",
"v": ""
},
{
"n": "最新",
"v": "latest"
},
{
"n": "最热",
"v": "hottest"
},
{
"n": "最高",
"v": "favorite"
},
{
"n": "当天",
"v": "day"
},
{
"n": "本周",
"v": "week"
},
{
"n": "本月",
"v": "month"
}
"key":"tid",
"name":"English",
"value":[
{"n":"Drama","v":"Full Episode drama"},
{"n":"US","v":"drama Full Episode US"},
{"n":"Netflix","v":"netflix Full Episode drama"},
{"n":"Disney","v":"disney Full Episode drama"},
{"n":"Apple","v":"apple Full Episode drama"},
{"n":"Amazon","v":"amazon Full Episode drama"},
{"n":"HBO","v":"hbo Full Episode drama"},
{"n":"Korea","v":"korea Full Episode drama"},
{"n":"Japan","v":"japan Full Episode drama"},
{"n":"UK","v":"uk Full Episode drama"}
]
}
],
"劇集": [
"電影":[
{
"key": "time",
"name": "時間",
"value": [
{
"n": "時間全選",
"v": ""
},
{
"n": "2025",
"v": "2025"
},
{
"n": "2024",
"v": "2024"
},
{
"n": "2023",
"v": "2023"
},
{
"n": "2022",
"v": "2022"
},
{
"n": "2021",
"v": "2021"
},
{
"n": "2020",
"v": "2020"
},
{
"n": "2019",
"v": "2019"
},
{
"n": "2018",
"v": "2018"
},
{
"n": "2017",
"v": "2017"
},
{
"n": "2016",
"v": "2016"
},
{
"n": "2015",
"v": "2015"
},
{
"n": "2014",
"v": "2014"
},
{
"n": "2013",
"v": "2013"
},
{
"n": "2012",
"v": "2012"
},
{
"n": "2011",
"v": "2011"
},
{
"n": "2010",
"v": "2010"
},
{
"n": "2009",
"v": "2009"
},
{
"n": "2008",
"v": "2008"
},
{
"n": "2007",
"v": "2007"
},
{
"n": "2006",
"v": "2006"
},
{
"n": "2005",
"v": "2005"
},
{
"n": "2004",
"v": "2004"
},
{
"n": "2003",
"v": "2003"
},
{
"n": "2002",
"v": "2002"
},
{
"n": "2001",
"v": "2001"
},
{
"n": "2000",
"v": "2000"
},
{
"n": "1999",
"v": "1999"
},
{
"n": "1998",
"v": "1998"
},
{
"n": "1997",
"v": "1997"
},
{
"n": "1996",
"v": "1996"
},
{
"n": "1995",
"v": "1995"
},
{
"n": "1994",
"v": "1994"
},
{
"n": "1993",
"v": "1993"
},
{
"n": "1992",
"v": "1992"
},
{
"n": "1991",
"v": "1991"
},
{
"n": "1990",
"v": "1990"
},
{
"n": "1989",
"v": "1989"
},
{
"n": "1988",
"v": "1988"
},
{
"n": "1987",
"v": "1987"
},
{
"n": "1986",
"v": "1986"
},
{
"n": "1985",
"v": "1985"
},
{
"n": "1984",
"v": "1984"
},
{
"n": "1983",
"v": "1983"
},
{
"n": "1982",
"v": "1982"
},
{
"n": "1981",
"v": "1981"
},
{
"n": "1980",
"v": "1980"
},
{
"n": "1979",
"v": "1979"
},
{
"n": "1978",
"v": "1978"
},
{
"n": "1977",
"v": "1977"
},
{
"n": "1976",
"v": "1976"
},
{
"n": "1975",
"v": "1975"
},
{
"n": "1974",
"v": "1974"
},
{
"n": "1973",
"v": "1973"
},
{
"n": "1972",
"v": "1972"
},
{
"n": "1971",
"v": "1971"
},
{
"n": "1970",
"v": "1970"
},
{
"n": "1969",
"v": "1969"
},
{
"n": "1968",
"v": "1968"
},
{
"n": "1967",
"v": "1967"
},
{
"n": "1966",
"v": "1966"
},
{
"n": "1965",
"v": "1965"
},
{
"n": "1964",
"v": "1964"
},
{
"n": "1963",
"v": "1963"
},
{
"n": "1962",
"v": "1962"
},
{
"n": "1961",
"v": "1961"
},
{
"n": "1960",
"v": "1960"
},
{
"n": "1959",
"v": "1959"
},
{
"n": "1958",
"v": "1958"
}
"key":"time",
"name":"時間",
"value":[
{"n":"時間全選","v":""},
{"n":"2024","v":"2024"},
{"n":"2023","v":"2023"},
{"n":"2022","v":"2022"},
{"n":"2021","v":"2021"},
{"n":"2020","v":"2020"},
{"n":"2019","v":"2019"},
{"n":"2018","v":"2018"},
{"n":"2017","v":"2017"},
{"n":"2016","v":"2016"},
{"n":"2015","v":"2015"},
{"n":"2014","v":"2014"},
{"n":"2013","v":"2013"},
{"n":"2012","v":"2012"},
{"n":"2011","v":"2011"},
{"n":"2010","v":"2010"},
{"n":"2009","v":"2009"},
{"n":"2008","v":"2008"},
{"n":"2007","v":"2007"},
{"n":"2006","v":"2006"},
{"n":"2005","v":"2005"},
{"n":"2004","v":"2004"},
{"n":"2003","v":"2003"},
{"n":"2002","v":"2002"},
{"n":"2001","v":"2001"},
{"n":"2000","v":"2000"},
{"n":"1999","v":"1999"},
{"n":"1998","v":"1998"},
{"n":"1997","v":"1997"},
{"n":"1996","v":"1996"},
{"n":"1995","v":"1995"},
{"n":"1994","v":"1994"},
{"n":"1993","v":"1993"},
{"n":"1992","v":"1992"},
{"n":"1991","v":"1991"},
{"n":"1990","v":"1990"},
{"n":"1989","v":"1989"},
{"n":"1988","v":"1988"},
{"n":"1987","v":"1987"},
{"n":"1986","v":"1986"},
{"n":"1985","v":"1985"},
{"n":"1984","v":"1984"},
{"n":"1983","v":"1983"},
{"n":"1982","v":"1982"},
{"n":"1981","v":"1981"},
{"n":"1980","v":"1980"},
{"n":"1979","v":"1979"},
{"n":"1978","v":"1978"},
{"n":"1977","v":"1977"},
{"n":"1976","v":"1976"},
{"n":"1975","v":"1975"},
{"n":"1974","v":"1974"},
{"n":"1973","v":"1973"},
{"n":"1972","v":"1972"},
{"n":"1971","v":"1971"},
{"n":"1970","v":"1970"},
{"n":"1969","v":"1969"},
{"n":"1968","v":"1968"},
{"n":"1967","v":"1967"},
{"n":"1966","v":"1966"},
{"n":"1965","v":"1965"},
{"n":"1964","v":"1964"},
{"n":"1963","v":"1963"},
{"n":"1962","v":"1962"},
{"n":"1961","v":"1961"},
{"n":"1960","v":"1960"},
{"n":"1959","v":"1959"},
{"n":"1958","v":"1958"}
]
},
{
"key": "tid",
"name": "中文",
"value": [
{
"n": "默認",
"v": ""
},
{
"n": "華語熱播電視劇官方頻道",
"v": "PL華語熱播電視劇官方頻道"
},
{
"n": "TVB 国语",
"v": "PL TVB Drama 国语剧场"
},
{
"n": "粵劇",
"v": "PL 粵劇 劇集"
},
{
"n": "TVB",
"v": "PL TVB"
},
{
"n": "国剧放映社",
"v": "PL 国剧放映社"
},
{
"n": "大陆",
"v": "PL 大陆 剧集"
},
{
"n": "腾讯",
"v": "PL 腾讯 剧集"
},
{
"n": "爱奇艺",
"v": "PL 爱奇艺 剧集"
},
{
"n": "优酷",
"v": "PL 优酷 剧集"
},
{
"n": "芒果",
"v": "PL 芒果TV 剧集"
},
{
"n": "搜狐",
"v": "PL 搜狐 剧集"
},
{
"n": "华数",
"v": "PL 华数 剧集"
},
{
"n": "港台",
"v": "PL 港台 剧集"
},
{
"n": "美国",
"v": "PL 美国 Full Episode 完整剧集"
},
{
"n": "Netflix",
"v": "PL Netflix Full Episode 完整剧集"
},
{
"n": "Disney",
"v": "PL disney Full Episode 完整剧集"
},
{
"n": "Apple",
"v": "PL apple Full Episode 完整剧集"
},
{
"n": "Amazon",
"v": "PL amazon Full Episode 完整剧集"
},
{
"n": "HBO",
"v": "PL hbo Full Episode 完整剧集"
},
{
"n": "韩国",
"v": "PL 韩国 剧集"
},
{
"n": "日本",
"v": "PL 日本 剧集"
},
{
"n": "英国",
"v": "PL 英国 Full Episode 完整剧集"
}
"key":"tid",
"name":"中文",
"value":[
{"n":"默認","v":""},
{"n":"大陆","v":"大陆 电影"},
{"n":"腾讯","v":"腾讯 电影"},
{"n":"爱奇艺","v":"爱奇艺 电影"},
{"n":"优酷","v":"优酷 电影"},
{"n":"芒果","v":"芒果TV 电影"},
{"n":"搜狐","v":"搜狐 电影"},
{"n":"港台","v":"港台 电影"},
{"n":"美国","v":"美国 电影"},
{"n":"Netflix","v":"netflix Full movie 电影"},
{"n":"Disney","v":"disney Full movie 电影"},
{"n":"Apple","v":"apple Full movie 电影"},
{"n":"Amazon","v":"amazon Full movie 电影"},
{"n":"HBO","v":"hbo Full movie 电影"},
{"n":"韩国","v":"韩国 Full movie 电影"},
{"n":"日本","v":"日本 Full movie 电影"},
{"n":"英国","v":"英国 Full movie 电影"}
]
},
{
"key": "tid",
"name": "English",
"value": [
{
"n": "Drama",
"v": "PL Full Episode drama"
},
{
"n": "US",
"v": "PL drama Full Episode US"
},
{
"n": "Netflix",
"v": "PL netflix Full Episode drama"
},
{
"n": "Disney",
"v": "PL disney Full Episode drama"
},
{
"n": "Apple",
"v": "PL apple Full Episode drama"
},
{
"n": "Amazon",
"v": "PL amazon Full Episode drama"
},
{
"n": "HBO",
"v": "PL hbo Full Episode drama"
},
{
"n": "Korea",
"v": "PL korea Full Episode drama"
},
{
"n": "Japan",
"v": "PL japan Full Episode drama"
},
{
"n": "UK",
"v": "PL uk Full Episode drama"
}
]
},
{
"key": "date",
"name": "排序/时间",
"value": [
{
"n": "默认",
"v": ""
},
{
"n": "最新",
"v": "latest"
},
{
"n": "最热",
"v": "hottest"
},
{
"n": "最高",
"v": "favorite"
},
{
"n": "当天",
"v": "day"
},
{
"n": "本周",
"v": "week"
},
{
"n": "本月",
"v": "month"
}
"key":"tid",
"name":"English",
"value":[
{"n":"movie","v":"youtube movies Full movie"},
{"n":"US","v":"us Full movie movie"},
{"n":"Netflix movie","v":"netflix Full movie movie"},
{"n":"Disney","v":"disney Full movie movie"},
{"n":"Apple","v":"apple Full movie movie"},
{"n":"Amazon","v":"amazon Full movie movie"},
{"n":"HBO","v":"hbo Full movie movie"},
{"n":"Koera","v":"korea Full movie movie"},
{"n":"Japan","v":"japan Full movie movie"},
{"n":"UK","v":"uk Full movie movie"}
]
}
],
"電影": [
"LIST:综艺,芒果综艺,腾讯综艺,爱奇艺综艺,优酷综艺,卫视综艺":[
{
"key": "time",
"name": "時間",
"value": [
{
"n": "時間全選",
"v": ""
},
{
"n": "2025",
"v": "2025"
},
{
"n": "2024",
"v": "2024"
},
{
"n": "2023",
"v": "2023"
},
{
"n": "2022",
"v": "2022"
},
{
"n": "2021",
"v": "2021"
},
{
"n": "2020",
"v": "2020"
},
{
"n": "2019",
"v": "2019"
},
{
"n": "2018",
"v": "2018"
},
{
"n": "2017",
"v": "2017"
},
{
"n": "2016",
"v": "2016"
},
{
"n": "2015",
"v": "2015"
},
{
"n": "2014",
"v": "2014"
},
{
"n": "2013",
"v": "2013"
},
{
"n": "2012",
"v": "2012"
},
{
"n": "2011",
"v": "2011"
},
{
"n": "2010",
"v": "2010"
},
{
"n": "2009",
"v": "2009"
},
{
"n": "2008",
"v": "2008"
},
{
"n": "2007",
"v": "2007"
},
{
"n": "2006",
"v": "2006"
},
{
"n": "2005",
"v": "2005"
},
{
"n": "2004",
"v": "2004"
},
{
"n": "2003",
"v": "2003"
},
{
"n": "2002",
"v": "2002"
},
{
"n": "2001",
"v": "2001"
},
{
"n": "2000",
"v": "2000"
},
{
"n": "1999",
"v": "1999"
},
{
"n": "1998",
"v": "1998"
},
{
"n": "1997",
"v": "1997"
},
{
"n": "1996",
"v": "1996"
},
{
"n": "1995",
"v": "1995"
},
{
"n": "1994",
"v": "1994"
},
{
"n": "1993",
"v": "1993"
},
{
"n": "1992",
"v": "1992"
},
{
"n": "1991",
"v": "1991"
},
{
"n": "1990",
"v": "1990"
},
{
"n": "1989",
"v": "1989"
},
{
"n": "1988",
"v": "1988"
},
{
"n": "1987",
"v": "1987"
},
{
"n": "1986",
"v": "1986"
},
{
"n": "1985",
"v": "1985"
},
{
"n": "1984",
"v": "1984"
},
{
"n": "1983",
"v": "1983"
},
{
"n": "1982",
"v": "1982"
},
{
"n": "1981",
"v": "1981"
},
{
"n": "1980",
"v": "1980"
},
{
"n": "1979",
"v": "1979"
},
{
"n": "1978",
"v": "1978"
},
{
"n": "1977",
"v": "1977"
},
{
"n": "1976",
"v": "1976"
},
{
"n": "1975",
"v": "1975"
},
{
"n": "1974",
"v": "1974"
},
{
"n": "1973",
"v": "1973"
},
{
"n": "1972",
"v": "1972"
},
{
"n": "1971",
"v": "1971"
},
{
"n": "1970",
"v": "1970"
},
{
"n": "1969",
"v": "1969"
},
{
"n": "1968",
"v": "1968"
},
{
"n": "1967",
"v": "1967"
},
{
"n": "1966",
"v": "1966"
},
{
"n": "1965",
"v": "1965"
},
{
"n": "1964",
"v": "1964"
},
{
"n": "1963",
"v": "1963"
},
{
"n": "1962",
"v": "1962"
},
{
"n": "1961",
"v": "1961"
},
{
"n": "1960",
"v": "1960"
},
{
"n": "1959",
"v": "1959"
},
{
"n": "1958",
"v": "1958"
}
"key":"time",
"name":"時間",
"value":[
{"n":"時間全選","v":""},
{"n":"2024","v":"2024"},
{"n":"2023","v":"2023"},
{"n":"2022","v":"2022"},
{"n":"2021","v":"2021"},
{"n":"2020","v":"2020"},
{"n":"2019","v":"2019"},
{"n":"2018","v":"2018"},
{"n":"2017","v":"2017"},
{"n":"2016","v":"2016"},
{"n":"2015","v":"2015"},
{"n":"2014","v":"2014"},
{"n":"2013","v":"2013"},
{"n":"2012","v":"2012"},
{"n":"2011","v":"2011"},
{"n":"2010","v":"2010"},
{"n":"2009","v":"2009"},
{"n":"2008","v":"2008"},
{"n":"2007","v":"2007"},
{"n":"2006","v":"2006"},
{"n":"2005","v":"2005"},
{"n":"2004","v":"2004"},
{"n":"2003","v":"2003"},
{"n":"2002","v":"2002"},
{"n":"2001","v":"2001"},
{"n":"2000","v":"2000"},
{"n":"1999","v":"1999"},
{"n":"1998","v":"1998"},
{"n":"1997","v":"1997"},
{"n":"1996","v":"1996"},
{"n":"1995","v":"1995"},
{"n":"1994","v":"1994"},
{"n":"1993","v":"1993"},
{"n":"1992","v":"1992"},
{"n":"1991","v":"1991"},
{"n":"1990","v":"1990"},
{"n":"1989","v":"1989"},
{"n":"1988","v":"1988"},
{"n":"1987","v":"1987"},
{"n":"1986","v":"1986"},
{"n":"1985","v":"1985"},
{"n":"1984","v":"1984"},
{"n":"1983","v":"1983"},
{"n":"1982","v":"1982"},
{"n":"1981","v":"1981"},
{"n":"1980","v":"1980"},
{"n":"1979","v":"1979"},
{"n":"1978","v":"1978"},
{"n":"1977","v":"1977"},
{"n":"1976","v":"1976"},
{"n":"1975","v":"1975"},
{"n":"1974","v":"1974"},
{"n":"1973","v":"1973"},
{"n":"1972","v":"1972"},
{"n":"1971","v":"1971"},
{"n":"1970","v":"1970"},
{"n":"1969","v":"1969"},
{"n":"1968","v":"1968"},
{"n":"1967","v":"1967"},
{"n":"1966","v":"1966"},
{"n":"1965","v":"1965"},
{"n":"1964","v":"1964"},
{"n":"1963","v":"1963"},
{"n":"1962","v":"1962"},
{"n":"1961","v":"1961"},
{"n":"1960","v":"1960"},
{"n":"1959","v":"1959"},
{"n":"1958","v":"1958"}
]
},
{
"key": "tid",
"name": "中文",
"value": [
{
"n": "默認",
"v": ""
},
{
"n": "大陆",
"v": "PL 大陆 电影"
},
{
"n": "腾讯",
"v": "PL 腾讯 电影"
},
{
"n": "爱奇艺",
"v": "PL 爱奇艺 电影"
},
{
"n": "优酷",
"v": "PL 优酷 电影"
},
{
"n": "芒果",
"v": "PL 芒果TV 电影"
},
{
"n": "搜狐",
"v": "PL 搜狐 电影"
},
{
"n": "港台",
"v": "PL 港台 电影"
},
{
"n": "美国",
"v": "PL 美国 电影"
},
{
"n": "Netflix",
"v": "PL netflix Full movie 电影"
},
{
"n": "Disney",
"v": "PL disney Full movie 电影"
},
{
"n": "Apple",
"v": "PL apple Full movie 电影"
},
{
"n": "Amazon",
"v": "PL amazon Full movie 电影"
},
{
"n": "HBO",
"v": "PL hbo Full movie 电影"
},
{
"n": "韩国",
"v": "PL 韩国 Full movie 电影"
},
{
"n": "日本",
"v": "PL 日本 Full movie 电影"
},
{
"n": "英国",
"v": "PL 英国 Full movie 电影"
}
"key":"tid",
"name":"中文",
"value":[
{"n":"默认","v":"Variety show"},
{"n":"大陆","v":"大陆 综艺"},
{"n":"芒果","v":"芒果 综艺"},
{"n":"腾讯","v":"腾讯 综艺"},
{"n":"爱奇艺","v":"爱奇艺 综艺"},
{"n":"优酷","v":"优酷 综艺"},
{"n":"港台","v":"港台 综艺"},
{"n":"美国","v":"美国 综艺"},
{"n":"Netflix","v":"Netflix 综艺"},
{"n":"韩国","v":"CRAVITY on Variety Shows 韩国 综艺"},
{"n":"日本","v":"日本 综艺"},
{"n":"英国","v":"英国 综艺"}
]
},
{
"key": "tid",
"name": "English",
"value": [
{
"n": "movie",
"v": "PL youtube movies Full movie"
},
{
"n": "US",
"v": "PL us Full movie movie"
},
{
"n": "Netflix movie",
"v": "PL netflix Full movie movie"
},
{
"n": "Disney",
"v": "PL disney Full movie movie"
},
{
"n": "Apple",
"v": "PL apple Full movie movie"
},
{
"n": "Amazon",
"v": "PL amazon Full movie movie"
},
{
"n": "HBO",
"v": "PL hbo Full movie movie"
},
{
"n": "Koera",
"v": "PL korea Full movie movie"
},
{
"n": "Japan",
"v": "PL japan Full movie movie"
},
{
"n": "UK",
"v": "PL uk Full movie movie"
}
"key":"tid",
"name":"English",
"value":[
{"n":"Variety","v":"variety"},
{"n":"Netflix variety","v":"netflix variety"},
{"n":"Korea","v":"korea variety"},
{"n":"Japan","v":"japan variety"},
{"n":"UK","v":"uk variety"}
]
},
{
"key": "date",
"name": "排序/时间",
"value": [
{
"n": "默认",
"v": ""
},
{
"n": "最新",
"v": "latest"
},
{
"n": "最热",
"v": "hottest"
},
{
"n": "最高",
"v": "favorite"
},
{
"n": "当天",
"v": "day"
},
{
"n": "本周",
"v": "week"
},
{
"n": "本月",
"v": "month"
}
"key":"tid",
"name":"小品",
"value":[
{"n":"春晚小品","v":"春晚小品"},
{"n":"开心麻花","v":"开心麻花"},
{"n":"屌丝男士","v":"屌丝男士"},
{"n":"喜剧综艺","v":"喜剧综艺"},
{"n":"单口","v":"单口 相声"},
{"n":"群口","v":"群口 相声"},
{"n":"德云社","v":"德云社"},
{"n":"青曲社","v":"青曲社"},
{"n":"郭德纲","v":"郭德纲"},
{"n":"岳云鹏","v":"岳云鹏"},
{"n":"曹云金","v":"曹云金"},
{"n":"评书","v":"评书"},
{"n":"小曲","v":"小曲"},
{"n":"赵本山","v":"赵本山"},
{"n":"陈佩斯","v":"陈佩斯"},
{"n":"冯巩","v":"冯巩"},
{"n":"宋小宝","v":"宋小宝"},
{"n":"赵丽蓉","v":"赵丽蓉"},
{"n":"潘长江","v":"潘长江"},
{"n":"郭冬临","v":"郭冬临"},
{"n":"严顺开","v":"严顺开"},
{"n":"文松","v":"文松"}
]
}
],
"綜藝": [
"LIST:紀錄片,历史纪录片,自然纪录片,宇宙纪录片":[
{
"key": "time",
"name": "時間",
"value": [
{
"n": "時間全選",
"v": ""
},
{
"n": "2025",
"v": "2025"
},
{
"n": "2024",
"v": "2024"
},
{
"n": "2023",
"v": "2023"
},
{
"n": "2022",
"v": "2022"
},
{
"n": "2021",
"v": "2021"
},
{
"n": "2020",
"v": "2020"
},
{
"n": "2019",
"v": "2019"
},
{
"n": "2018",
"v": "2018"
},
{
"n": "2017",
"v": "2017"
},
{
"n": "2016",
"v": "2016"
},
{
"n": "2015",
"v": "2015"
},
{
"n": "2014",
"v": "2014"
},
{
"n": "2013",
"v": "2013"
},
{
"n": "2012",
"v": "2012"
},
{
"n": "2011",
"v": "2011"
},
{
"n": "2010",
"v": "2010"
},
{
"n": "2009",
"v": "2009"
},
{
"n": "2008",
"v": "2008"
},
{
"n": "2007",
"v": "2007"
},
{
"n": "2006",
"v": "2006"
},
{
"n": "2005",
"v": "2005"
},
{
"n": "2004",
"v": "2004"
},
{
"n": "2003",
"v": "2003"
},
{
"n": "2002",
"v": "2002"
},
{
"n": "2001",
"v": "2001"
},
{
"n": "2000",
"v": "2000"
},
{
"n": "1999",
"v": "1999"
},
{
"n": "1998",
"v": "1998"
},
{
"n": "1997",
"v": "1997"
},
{
"n": "1996",
"v": "1996"
},
{
"n": "1995",
"v": "1995"
},
{
"n": "1994",
"v": "1994"
},
{
"n": "1993",
"v": "1993"
},
{
"n": "1992",
"v": "1992"
},
{
"n": "1991",
"v": "1991"
},
{
"n": "1990",
"v": "1990"
},
{
"n": "1989",
"v": "1989"
},
{
"n": "1988",
"v": "1988"
},
{
"n": "1987",
"v": "1987"
},
{
"n": "1986",
"v": "1986"
},
{
"n": "1985",
"v": "1985"
},
{
"n": "1984",
"v": "1984"
},
{
"n": "1983",
"v": "1983"
},
{
"n": "1982",
"v": "1982"
},
{
"n": "1981",
"v": "1981"
},
{
"n": "1980",
"v": "1980"
},
{
"n": "1979",
"v": "1979"
},
{
"n": "1978",
"v": "1978"
},
{
"n": "1977",
"v": "1977"
},
{
"n": "1976",
"v": "1976"
},
{
"n": "1975",
"v": "1975"
},
{
"n": "1974",
"v": "1974"
},
{
"n": "1973",
"v": "1973"
},
{
"n": "1972",
"v": "1972"
},
{
"n": "1971",
"v": "1971"
},
{
"n": "1970",
"v": "1970"
},
{
"n": "1969",
"v": "1969"
},
{
"n": "1968",
"v": "1968"
},
{
"n": "1967",
"v": "1967"
},
{
"n": "1966",
"v": "1966"
},
{
"n": "1965",
"v": "1965"
},
{
"n": "1964",
"v": "1964"
},
{
"n": "1963",
"v": "1963"
},
{
"n": "1962",
"v": "1962"
},
{
"n": "1961",
"v": "1961"
},
{
"n": "1960",
"v": "1960"
},
{
"n": "1959",
"v": "1959"
},
{
"n": "1958",
"v": "1958"
}
"key":"time",
"name":"時間",
"value":[
{"n":"時間全選","v":""},
{"n":"2024","v":"2024"},
{"n":"2023","v":"2023"},
{"n":"2022","v":"2022"},
{"n":"2021","v":"2021"},
{"n":"2020","v":"2020"},
{"n":"2019","v":"2019"},
{"n":"2018","v":"2018"},
{"n":"2017","v":"2017"},
{"n":"2016","v":"2016"},
{"n":"2015","v":"2015"},
{"n":"2014","v":"2014"},
{"n":"2013","v":"2013"},
{"n":"2012","v":"2012"},
{"n":"2011","v":"2011"},
{"n":"2010","v":"2010"},
{"n":"2009","v":"2009"},
{"n":"2008","v":"2008"},
{"n":"2007","v":"2007"},
{"n":"2006","v":"2006"},
{"n":"2005","v":"2005"},
{"n":"2004","v":"2004"},
{"n":"2003","v":"2003"},
{"n":"2002","v":"2002"},
{"n":"2001","v":"2001"},
{"n":"2000","v":"2000"},
{"n":"1999","v":"1999"},
{"n":"1998","v":"1998"},
{"n":"1997","v":"1997"},
{"n":"1996","v":"1996"},
{"n":"1995","v":"1995"},
{"n":"1994","v":"1994"},
{"n":"1993","v":"1993"},
{"n":"1992","v":"1992"},
{"n":"1991","v":"1991"},
{"n":"1990","v":"1990"},
{"n":"1989","v":"1989"},
{"n":"1988","v":"1988"},
{"n":"1987","v":"1987"},
{"n":"1986","v":"1986"},
{"n":"1985","v":"1985"},
{"n":"1984","v":"1984"},
{"n":"1983","v":"1983"},
{"n":"1982","v":"1982"},
{"n":"1981","v":"1981"},
{"n":"1980","v":"1980"},
{"n":"1979","v":"1979"},
{"n":"1978","v":"1978"},
{"n":"1977","v":"1977"},
{"n":"1976","v":"1976"},
{"n":"1975","v":"1975"},
{"n":"1974","v":"1974"},
{"n":"1973","v":"1973"},
{"n":"1972","v":"1972"},
{"n":"1971","v":"1971"},
{"n":"1970","v":"1970"},
{"n":"1969","v":"1969"},
{"n":"1968","v":"1968"},
{"n":"1967","v":"1967"},
{"n":"1966","v":"1966"},
{"n":"1965","v":"1965"},
{"n":"1964","v":"1964"},
{"n":"1963","v":"1963"},
{"n":"1962","v":"1962"},
{"n":"1961","v":"1961"},
{"n":"1960","v":"1960"},
{"n":"1959","v":"1959"},
{"n":"1958","v":"1958"}
]
},
{
"key": "tid",
"name": "中文",
"value": [
{
"n": "默认",
"v": "Variety show"
},
{
"n": "大陆",
"v": "大陆 综艺"
},
{
"n": "芒果",
"v": "芒果 综艺"
},
{
"n": "腾讯",
"v": "腾讯 综艺"
},
{
"n": "爱奇艺",
"v": "爱奇艺 综艺"
},
{
"n": "优酷",
"v": "优酷 综艺"
},
{
"n": "港台",
"v": "港台 综艺"
},
{
"n": "美国",
"v": "美国 综艺"
},
{
"n": "Netflix",
"v": "Netflix 综艺"
},
{
"n": "韩国",
"v": "CRAVITY on Variety Shows 韩国 综艺"
},
{
"n": "日本",
"v": "日本 综艺"
},
{
"n": "英国",
"v": "英国 综艺"
}
"key":"tid",
"name":"中文",
"value":[
{"n":"地區🎶排序","v":"歷史記錄片 地球記錄片 宇宙記錄片 海洋記錄片 戰爭記錄片 大自然生存記錄片"},
{"n":"默认","v":"documentary"},
{"n":"CCTV纪录片","v":"CCTV 纪录片"},
{"n":"BBC纪录片","v":"BBC 纪录片"},
{"n":"国家地理","v":"国家地理 纪录片"},
{"n":"Netflix纪录片","v":"netflix 纪录片"},
{"n":"BBC","v":"BBC documentary"},
{"n":"National Geographic","v":"National Geographic documentary"},
{"n":"Netflix","v":"netflix documentary"},
{"n":"历史","v":"历史 纪录片"},
{"n":"野性","v":"野性 纪录片"},
{"n":"地球","v":"地球 纪录片"},
{"n":"宇宙","v":"宇宙 纪录片"},
{"n":"海洋","v":"海洋 纪录片"},
{"n":"人文","v":"人文 纪录片"},
{"n":"战争","v":"战争 纪录片"}
]
},
{
"key": "tid",
"name": "English",
"value": [
{
"n": "Variety",
"v": "variety"
},
{
"n": "Netflix variety",
"v": "netflix variety"
},
{
"n": "Korea",
"v": "korea variety"
},
{
"n": "Japan",
"v": "japan variety"
},
{
"n": "UK",
"v": "uk variety"
}
]
},
{
"key": "tid",
"name": "小品",
"value": [
{
"n": "春晚小品",
"v": "春晚小品"
},
{
"n": "开心麻花",
"v": "开心麻花"
},
{
"n": "屌丝男士",
"v": "屌丝男士"
},
{
"n": "喜剧综艺",
"v": "喜剧综艺"
},
{
"n": "单口",
"v": "单口 相声"
},
{
"n": "群口",
"v": "群口 相声"
},
{
"n": "德云社",
"v": "德云社"
},
{
"n": "青曲社",
"v": "青曲社"
},
{
"n": "郭德纲",
"v": "郭德纲"
},
{
"n": "岳云鹏",
"v": "岳云鹏"
},
{
"n": "曹云金",
"v": "曹云金"
},
{
"n": "评书",
"v": "评书"
},
{
"n": "小曲",
"v": "小曲"
},
{
"n": "赵本山",
"v": "赵本山"
},
{
"n": "陈佩斯",
"v": "陈佩斯"
},
{
"n": "冯巩",
"v": "冯巩"
},
{
"n": "宋小宝",
"v": "宋小宝"
},
{
"n": "赵丽蓉",
"v": "赵丽蓉"
},
{
"n": "潘长江",
"v": "潘长江"
},
{
"n": "郭冬临",
"v": "郭冬临"
},
{
"n": "严顺开",
"v": "严顺开"
},
{
"n": "文松",
"v": "文松"
}
]
},
{
"key": "date",
"name": "排序/时间",
"value": [
{
"n": "默认",
"v": ""
},
{
"n": "最新",
"v": "latest"
},
{
"n": "最热",
"v": "hottest"
},
{
"n": "最高",
"v": "favorite"
},
{
"n": "当天",
"v": "day"
},
{
"n": "本周",
"v": "week"
},
{
"n": "本月",
"v": "month"
}
"key":"tid",
"name":"English",
"value":[
{"n":"History","v":"Full history documentary"},
{"n":"WILD","v":"Full wild documentary"},
{"n":"Earch","v":"Full earth documentary"},
{"n":"Universe","v":"Full universe documentary"},
{"n":"Oceans","v":"Full oceans documentary"},
{"n":"Humanism","v":"Full humanism documentary"},
{"n":"Wars","v":"Full war documentary"}
]
}
],
"紀錄": [
"LIST:华语音乐,华语MV,点击率最高":[
{
"key": "time",
"name": "時間",
"value": [
{
"n": "時間全選",
"v": ""
},
{
"n": "2025",
"v": "2025"
},
{
"n": "2024",
"v": "2024"
},
{
"n": "2023",
"v": "2023"
},
{
"n": "2022",
"v": "2022"
},
{
"n": "2021",
"v": "2021"
},
{
"n": "2020",
"v": "2020"
},
{
"n": "2019",
"v": "2019"
},
{
"n": "2018",
"v": "2018"
},
{
"n": "2017",
"v": "2017"
},
{
"n": "2016",
"v": "2016"
},
{
"n": "2015",
"v": "2015"
},
{
"n": "2014",
"v": "2014"
},
{
"n": "2013",
"v": "2013"
},
{
"n": "2012",
"v": "2012"
},
{
"n": "2011",
"v": "2011"
},
{
"n": "2010",
"v": "2010"
},
{
"n": "2009",
"v": "2009"
},
{
"n": "2008",
"v": "2008"
},
{
"n": "2007",
"v": "2007"
},
{
"n": "2006",
"v": "2006"
},
{
"n": "2005",
"v": "2005"
},
{
"n": "2004",
"v": "2004"
},
{
"n": "2003",
"v": "2003"
},
{
"n": "2002",
"v": "2002"
},
{
"n": "2001",
"v": "2001"
},
{
"n": "2000",
"v": "2000"
},
{
"n": "1999",
"v": "1999"
},
{
"n": "1998",
"v": "1998"
},
{
"n": "1997",
"v": "1997"
},
{
"n": "1996",
"v": "1996"
},
{
"n": "1995",
"v": "1995"
},
{
"n": "1994",
"v": "1994"
},
{
"n": "1993",
"v": "1993"
},
{
"n": "1992",
"v": "1992"
},
{
"n": "1991",
"v": "1991"
},
{
"n": "1990",
"v": "1990"
},
{
"n": "1989",
"v": "1989"
},
{
"n": "1988",
"v": "1988"
},
{
"n": "1987",
"v": "1987"
},
{
"n": "1986",
"v": "1986"
},
{
"n": "1985",
"v": "1985"
},
{
"n": "1984",
"v": "1984"
},
{
"n": "1983",
"v": "1983"
},
{
"n": "1982",
"v": "1982"
},
{
"n": "1981",
"v": "1981"
},
{
"n": "1980",
"v": "1980"
},
{
"n": "1979",
"v": "1979"
},
{
"n": "1978",
"v": "1978"
},
{
"n": "1977",
"v": "1977"
},
{
"n": "1976",
"v": "1976"
},
{
"n": "1975",
"v": "1975"
},
{
"n": "1974",
"v": "1974"
},
{
"n": "1973",
"v": "1973"
},
{
"n": "1972",
"v": "1972"
},
{
"n": "1971",
"v": "1971"
},
{
"n": "1970",
"v": "1970"
},
{
"n": "1969",
"v": "1969"
},
{
"n": "1968",
"v": "1968"
},
{
"n": "1967",
"v": "1967"
},
{
"n": "1966",
"v": "1966"
},
{
"n": "1965",
"v": "1965"
},
{
"n": "1964",
"v": "1964"
},
{
"n": "1963",
"v": "1963"
},
{
"n": "1962",
"v": "1962"
},
{
"n": "1961",
"v": "1961"
},
{
"n": "1960",
"v": "1960"
},
{
"n": "1959",
"v": "1959"
},
{
"n": "1958",
"v": "1958"
}
"key":"time",
"name":"時間",
"value":[
{"n":"時間全選","v":""},
{"n":"2024","v":"2024"},
{"n":"2023","v":"2023"},
{"n":"2022","v":"2022"},
{"n":"2021","v":"2021"},
{"n":"2020","v":"2020"},
{"n":"2019","v":"2019"},
{"n":"2018","v":"2018"},
{"n":"2017","v":"2017"},
{"n":"2016","v":"2016"},
{"n":"2015","v":"2015"},
{"n":"2014","v":"2014"},
{"n":"2013","v":"2013"},
{"n":"2012","v":"2012"},
{"n":"2011","v":"2011"},
{"n":"2010","v":"2010"},
{"n":"2009","v":"2009"},
{"n":"2008","v":"2008"},
{"n":"2007","v":"2007"},
{"n":"2006","v":"2006"},
{"n":"2005","v":"2005"},
{"n":"2004","v":"2004"},
{"n":"2003","v":"2003"},
{"n":"2002","v":"2002"},
{"n":"2001","v":"2001"},
{"n":"2000","v":"2000"},
{"n":"1999","v":"1999"},
{"n":"1998","v":"1998"},
{"n":"1997","v":"1997"},
{"n":"1996","v":"1996"},
{"n":"1995","v":"1995"},
{"n":"1994","v":"1994"},
{"n":"1993","v":"1993"},
{"n":"1992","v":"1992"},
{"n":"1991","v":"1991"},
{"n":"1990","v":"1990"},
{"n":"1989","v":"1989"},
{"n":"1988","v":"1988"},
{"n":"1987","v":"1987"},
{"n":"1986","v":"1986"},
{"n":"1985","v":"1985"},
{"n":"1984","v":"1984"},
{"n":"1983","v":"1983"},
{"n":"1982","v":"1982"},
{"n":"1981","v":"1981"},
{"n":"1980","v":"1980"},
{"n":"1979","v":"1979"},
{"n":"1978","v":"1978"},
{"n":"1977","v":"1977"},
{"n":"1976","v":"1976"},
{"n":"1975","v":"1975"},
{"n":"1974","v":"1974"},
{"n":"1973","v":"1973"},
{"n":"1972","v":"1972"},
{"n":"1971","v":"1971"},
{"n":"1970","v":"1970"},
{"n":"1969","v":"1969"},
{"n":"1968","v":"1968"},
{"n":"1967","v":"1967"},
{"n":"1966","v":"1966"},
{"n":"1965","v":"1965"},
{"n":"1964","v":"1964"},
{"n":"1963","v":"1963"},
{"n":"1962","v":"1962"},
{"n":"1961","v":"1961"},
{"n":"1960","v":"1960"},
{"n":"1959","v":"1959"},
{"n":"1958","v":"1958"}
]
},
{
"key": "tid",
"name": "中文",
"value": [
{
"n": "地區🎶排序",
"v": "歷史記錄片 地球記錄片 宇宙記錄片 海洋記錄片 戰爭記錄片 大自然生存記錄片"
},
{
"n": "默认",
"v": "PL documentary"
},
{
"n": "CCTV 纪录片",
"v": "PL CCTV 纪录片"
},
{
"n": "BBC 纪录片",
"v": "PL BBC 纪录片"
},
{
"n": "国家地理",
"v": "PL 国家地理 纪录片"
},
{
"n": "Netflix纪录片",
"v": "PL netflix 纪录片"
},
{
"n": "BBC",
"v": "PL BBC documentary"
},
{
"n": "National Geographic",
"v": "Pl National Geographic documentary"
},
{
"n": "Netflix",
"v": "PL netflix documentary"
},
{
"n": "历史",
"v": "PL 历史 纪录片"
},
{
"n": "野性",
"v": "PL 野性 纪录片"
},
{
"n": "地球",
"v": "PL 地球 纪录片"
},
{
"n": "宇宙",
"v": "PL 宇宙 纪录片"
},
{
"n": "海洋",
"v": "PL 海洋 纪录片"
},
{
"n": "人文",
"v": "PL 人文 纪录片"
},
{
"n": "战争",
"v": "PL 战争 纪录片"
}
"key":"tid",
"name":"地區",
"value":[
{"n":"華語音樂","v":"華語音樂"},
{"n":"華語MV","v":"華語MV"},
{"n":"环球视听","v":"环球视听1980 @RippleOfficialEvent"},
{"n":"YouTube 點閱率最高","v":"YouTube 點閱率最高觀看次數最多華語歌曲"},
{"n":"海外抖音","v":"TikTok 翻唱 抖音 音樂"},
{"n":"粵語","v":"粵語 音樂"},
{"n":"國語","v":"國語 音樂"},
{"n":"大陆","v":"大陆 音乐"},
{"n":"香港","v":"香港 音乐"},
{"n":"台湾","v":"台湾 音乐"},
{"n":"新加坡","v":"新加坡 音乐"},
{"n":"馬來西亞","v":"馬來西亞 音乐"},
{"n":"泰國","v":"泰國 音乐"},
{"n":"越南","v":"越南 音乐"},
{"n":"印度","v":"印度 音乐"},
{"n":"韩国","v":"韩国 音乐"},
{"n":"日本","v":"日本 音乐"},
{"n":"欧美","v":"欧美 音乐"}
]
},
{
"key": "tid",
"name": "English",
"value": [
{
"n": "History",
"v": "PL Full history documentary"
},
{
"n": "WILD",
"v": "PL Full wild documentary"
},
{
"n": "Earch",
"v": "PL Full earth documentary"
},
{
"n": "Universe",
"v": "PL Full universe documentary"
},
{
"n": "Oceans",
"v": "PL Full oceans documentary"
},
{
"n": "Humanism",
"v": "PL Full humanism documentary"
},
{
"n": "Wars",
"v": "PL Full war documentary"
}
"key":"tid",
"name":"愛好",
"value":[
{"n":"舞曲","v":"慢搖 夜店 低音 女聲 "},
{"n":"80-90","v":"80 90 音樂"},
{"n":"人聲","v":"人聲 音樂"},
{"n":"A8製造","v":"A8製造 工體音樂"},
{"n":"硬歌","v":"深水炸彈 音樂"},
{"n":"失傳已久","v":"嗨音雷虎 失傳 嗨音會所 音樂"},
{"n":"重低音DJ","v":"3D 8D 慢搖 重低音 音樂"},
{"n":"車載舞曲","v":"車載慢搖DJ歌曲串燒 深水炸彈DJ歌曲串燒 越南鼓DJ歌曲串燒 音樂"},
{"n":"超級女聲","v":"超級女聲"},
{"n":"tseries","v":"@tseries"}
]
},
{
"key": "date",
"name": "排序/时间",
"value": [
{
"n": "默认",
"v": ""
},
{
"n": "最新",
"v": "latest"
},
{
"n": "最热",
"v": "hottest"
},
{
"n": "最高",
"v": "favorite"
},
{
"n": "当天",
"v": "day"
},
{
"n": "本周",
"v": "week"
},
{
"n": "本月",
"v": "month"
}
"key":"tid",
"name":"歌手",
"value":[
{"n":"邁克爾傑克遜","v":"邁克爾傑克遜 演唱會,巡演 音樂"},
{"n":"張瑋伽","v":"張瑋伽 演唱會 巡演 音樂"},
{"n":"孫露","v":"孫露 演唱會 巡演 音樂"},
{"n":"鳳凰傳奇","v":"鳳凰傳奇 演 巡演 音樂"},
{"n":"龍梅子","v":"龍梅子 演唱會 巡演 音樂"},
{"n":"刀郎","v":"刀郎 演唱會 巡演 音樂"},
{"n":"S.H.E","v":"S.H.E 演唱會 巡演 音樂"},
{"n":"慕容曉曉","v":"慕容曉曉 演唱會 巡演 音樂"},
{"n":"東方紅豔","v":"東方紅豔 演唱會 巡演 音樂"},
{"n":"孟庭葦","v":"孟庭葦 演唱會 巡演 音樂"},
{"n":"斯琴高麗","v":"斯琴高麗 演唱會 巡演 音樂"},
{"n":"程響","v":"程響 演唱會 巡演 音樂"},
{"n":"蔣雪兒","v":"蔣雪兒 演唱會 巡演 音樂"}
]
}
],
"音樂": [
"體育":[
{
"key": "time",
"name": "時間",
"value": [
{
"n": "時間全選",
"v": ""
},
{
"n": "2025",
"v": "2025"
},
{
"n": "2024",
"v": "2024"
},
{
"n": "2023",
"v": "2023"
},
{
"n": "2022",
"v": "2022"
},
{
"n": "2021",
"v": "2021"
},
{
"n": "2020",
"v": "2020"
},
{
"n": "2019",
"v": "2019"
},
{
"n": "2018",
"v": "2018"
},
{
"n": "2017",
"v": "2017"
},
{
"n": "2016",
"v": "2016"
},
{
"n": "2015",
"v": "2015"
},
{
"n": "2014",
"v": "2014"
},
{
"n": "2013",
"v": "2013"
},
{
"n": "2012",
"v": "2012"
},
{
"n": "2011",
"v": "2011"
},
{
"n": "2010",
"v": "2010"
},
{
"n": "2009",
"v": "2009"
},
{
"n": "2008",
"v": "2008"
},
{
"n": "2007",
"v": "2007"
},
{
"n": "2006",
"v": "2006"
},
{
"n": "2005",
"v": "2005"
},
{
"n": "2004",
"v": "2004"
},
{
"n": "2003",
"v": "2003"
},
{
"n": "2002",
"v": "2002"
},
{
"n": "2001",
"v": "2001"
},
{
"n": "2000",
"v": "2000"
},
{
"n": "1999",
"v": "1999"
},
{
"n": "1998",
"v": "1998"
},
{
"n": "1997",
"v": "1997"
},
{
"n": "1996",
"v": "1996"
},
{
"n": "1995",
"v": "1995"
},
{
"n": "1994",
"v": "1994"
},
{
"n": "1993",
"v": "1993"
},
{
"n": "1992",
"v": "1992"
},
{
"n": "1991",
"v": "1991"
},
{
"n": "1990",
"v": "1990"
},
{
"n": "1989",
"v": "1989"
},
{
"n": "1988",
"v": "1988"
},
{
"n": "1987",
"v": "1987"
},
{
"n": "1986",
"v": "1986"
},
{
"n": "1985",
"v": "1985"
},
{
"n": "1984",
"v": "1984"
},
{
"n": "1983",
"v": "1983"
},
{
"n": "1982",
"v": "1982"
},
{
"n": "1981",
"v": "1981"
},
{
"n": "1980",
"v": "1980"
},
{
"n": "1979",
"v": "1979"
},
{
"n": "1978",
"v": "1978"
},
{
"n": "1977",
"v": "1977"
},
{
"n": "1976",
"v": "1976"
},
{
"n": "1975",
"v": "1975"
},
{
"n": "1974",
"v": "1974"
},
{
"n": "1973",
"v": "1973"
},
{
"n": "1972",
"v": "1972"
},
{
"n": "1971",
"v": "1971"
},
{
"n": "1970",
"v": "1970"
},
{
"n": "1969",
"v": "1969"
},
{
"n": "1968",
"v": "1968"
},
{
"n": "1967",
"v": "1967"
},
{
"n": "1966",
"v": "1966"
},
{
"n": "1965",
"v": "1965"
},
{
"n": "1964",
"v": "1964"
},
{
"n": "1963",
"v": "1963"
},
{
"n": "1962",
"v": "1962"
},
{
"n": "1961",
"v": "1961"
},
{
"n": "1960",
"v": "1960"
},
{
"n": "1959",
"v": "1959"
},
{
"n": "1958",
"v": "1958"
}
"key":"time",
"name":"時間",
"value":[
{"n":"時間全選","v":""},
{"n":"2024","v":"2024"},
{"n":"2023","v":"2023"},
{"n":"2022","v":"2022"},
{"n":"2021","v":"2021"},
{"n":"2020","v":"2020"},
{"n":"2019","v":"2019"},
{"n":"2018","v":"2018"},
{"n":"2017","v":"2017"},
{"n":"2016","v":"2016"},
{"n":"2015","v":"2015"},
{"n":"2014","v":"2014"},
{"n":"2013","v":"2013"},
{"n":"2012","v":"2012"},
{"n":"2011","v":"2011"},
{"n":"2010","v":"2010"},
{"n":"2009","v":"2009"},
{"n":"2008","v":"2008"},
{"n":"2007","v":"2007"},
{"n":"2006","v":"2006"},
{"n":"2005","v":"2005"},
{"n":"2004","v":"2004"},
{"n":"2003","v":"2003"},
{"n":"2002","v":"2002"},
{"n":"2001","v":"2001"},
{"n":"2000","v":"2000"},
{"n":"1999","v":"1999"},
{"n":"1998","v":"1998"},
{"n":"1997","v":"1997"},
{"n":"1996","v":"1996"},
{"n":"1995","v":"1995"},
{"n":"1994","v":"1994"},
{"n":"1993","v":"1993"},
{"n":"1992","v":"1992"},
{"n":"1991","v":"1991"},
{"n":"1990","v":"1990"},
{"n":"1989","v":"1989"},
{"n":"1988","v":"1988"},
{"n":"1987","v":"1987"},
{"n":"1986","v":"1986"},
{"n":"1985","v":"1985"},
{"n":"1984","v":"1984"},
{"n":"1983","v":"1983"},
{"n":"1982","v":"1982"},
{"n":"1981","v":"1981"},
{"n":"1980","v":"1980"},
{"n":"1979","v":"1979"},
{"n":"1978","v":"1978"},
{"n":"1977","v":"1977"},
{"n":"1976","v":"1976"},
{"n":"1975","v":"1975"},
{"n":"1974","v":"1974"},
{"n":"1973","v":"1973"},
{"n":"1972","v":"1972"},
{"n":"1971","v":"1971"},
{"n":"1970","v":"1970"},
{"n":"1969","v":"1969"},
{"n":"1968","v":"1968"},
{"n":"1967","v":"1967"},
{"n":"1966","v":"1966"},
{"n":"1965","v":"1965"},
{"n":"1964","v":"1964"},
{"n":"1963","v":"1963"},
{"n":"1962","v":"1962"},
{"n":"1961","v":"1961"},
{"n":"1960","v":"1960"},
{"n":"1959","v":"1959"},
{"n":"1958","v":"1958"}
]
},
{
"key": "tid",
"name": "地區",
"value": [
{
"n": "華語音樂",
"v": "PL 華語音樂"
},
{
"n": "華語MV",
"v": "PL 華語MV"
},
{
"n": "环球视听",
"v": "PL 环球视听"
},
{
"n": "YouTube 點閱率最高",
"v": "點閱率最高華語歌曲"
},
{
"n": "海外抖音",
"v": "PL TikTok 抖音 音樂"
},
{
"n": "粵語",
"v": "PL 粵語 音樂"
},
{
"n": "國語",
"v": "PL 國語 音樂"
},
{
"n": "大陆",
"v": "PL 大陆 音乐"
},
{
"n": "香港",
"v": "PL 香港 音乐"
},
{
"n": "台湾",
"v": "PL 台湾 音乐"
},
{
"n": "新加坡",
"v": "PL 新加坡 音乐"
},
{
"n": "馬來西亞",
"v": "PL 馬來西亞 音乐"
},
{
"n": "泰國",
"v": "PL 泰國 音乐"
},
{
"n": "越南",
"v": "PL 越南 音乐"
},
{
"n": "印度",
"v": "PL 印度 音乐"
},
{
"n": "韩国",
"v": "PL 韩国 音乐"
},
{
"n": "日本",
"v": "PL 日本 音乐"
},
{
"n": "欧美",
"v": "PL 欧美 音乐"
},
{
"n": "时光音乐会 MV",
"v": "时光音乐会MV"
},
{
"n": "中国好声音 MV",
"v": "中国好声音MV"
},
{
"n": "滚石 MV",
"v": "滚石MV"
},
{
"n": "古风 MV",
"v": "古风MV"
},
{
"n": "韩国女团 MV",
"v": "韩国女团MV"
},
{
"n": "欧美",
"v": "欧美 音乐"
},
{
"n": "BillBoard",
"v": "BillBoard"
}
"key":"tid",
"name":"中文",
"value":[
{"n":"默认","v":""},
{"n":"體育直播","v":"体育直播"},
{"n":"體育赛事","v":"体育赛事"},
{"n":"足球比賽","v":"足球賽事"},
{"n":"篮球比賽","v":"篮球賽事"},
{"n":"极限運動","v":"极限運動"},
{"n":"室内運動","v":"室内运动"},
{"n":"户外運動","v":"户外运动"},
{"n":"健身運動","v":"健身運動"}
]
},
{
"key": "tid",
"name": "愛好",
"value": [
{
"n": "合辑",
"v": "合辑"
},
{
"n": "超級女聲",
"v": "超級女聲"
},
{
"n": "whitneyhouston",
"v": "@whitneyhoustonmusic"
},
{
"n": "玛丽.凯丽",
"v": "@MariahCarey"
},
{
"n": "LadyGaga",
"v": "@LadyGaga"
},
{
"n": "G.E.M邓紫棋",
"v": "@gem0816"
},
{
"n": "麦当娜",
"v": "@madonna"
},
{
"n": "Taylor Swift",
"v": "@TaylorSwift"
},
{
"n": "舞曲",
"v": "蹦迪現場 慢搖 夜店 低音 女聲 "
},
{
"n": "80-90",
"v": "80 90 音樂"
},
{
"n": "人聲",
"v": "人聲 音樂"
},
{
"n": "硬歌",
"v": "深水炸弹"
},
{
"n": "A8製造",
"v": "A8製造 工體音樂"
},
{
"n": "中国MTV",
"v": "@ChineseMusicTV"
},
{
"n": "滚石",
"v": "@RockRecordsTaipei"
},
{
"n": "失傳已久",
"v": "嗨音雷虎 失傳 嗨音會所 音樂"
},
{
"n": "重低音 DJ",
"v": "重低音 DJ"
},
{
"n": "車載舞曲",
"v": "車載慢搖"
},
{
"n": "超級女聲",
"v": "超級女聲"
},
{
"n": "tseries",
"v": "@tseries"
},
{
"n": "戲曲",
"v": "秦腔 京剧 越剧 黄梅戏 评剧 豫剧 昆曲 高腔 梆子腔 河北梆子 晋剧 蒲剧 雁剧 上党梆子 武安平调 二人台 吉剧 龙江剧 越调 河南曲剧 山东梆子 淮剧 滑稽戏 婺剧 绍剧 徽剧 闽剧 莆仙戏 梨园戏 高甲戏 赣剧 采茶戏 汉剧 湘剧 祁剧 湖南花鼓戏 粤剧 潮剧 桂剧 彩调 壮剧 川剧 黔剧 滇剧 傣剧 藏剧 皮影戏"
}
"key":"tid",
"name":"English",
"value":[
{"n":"Live","v":"live sports"},
{"n":"Games","v":"live games"},
{"n":"Soccer","v":"live soccer"},
{"n":"NBA","v":"NBA"},
{"n":"Extreme","v":"extreme sports"},
{"n":"InDoor","v":"indoor sports"},
{"n":"OutDoor","v":"outdoor sports"},
{"n":"Workout","v":"workout"}
]
},
{
"key": "tid",
"name": "歌手",
"value": [
{
"n": "邓丽君",
"v": "邓丽君 音乐"
},
{
"n": "林忆莲",
"v": "林忆莲 音樂"
},
{
"n": "陈慧娴",
"v": "陈慧娴音樂"
},
{
"n": "韩宝仪",
"v": "韩宝仪 音樂"
},
{
"n": "张学友",
"v": "张学友 音樂"
},
{
"n": "李宗盛",
"v": "李宗盛 音樂"
},
{
"n": "罗大佑",
"v": "罗大佑 音樂"
},
{
"n": "周杰伦",
"v": "周杰伦 音樂"
},
{
"n": "张玮伽",
"v": "张玮伽 音樂"
},
{
"n": "张惠妹",
"v": "张惠妹 音樂"
},
{
"n": "斯琴高麗",
"v": "斯琴高麗 音樂"
},
{
"n": "林俊杰",
"v": "@jjlin • 音乐"
},
{
"n": "周深",
"v": "周深 音樂"
},
{
"n": "張瑋伽",
"v": "張瑋伽 演唱會 巡演 音樂"
},
{
"n": "孫露",
"v": "孫露 演唱會 巡演 音樂"
},
{
"n": "鳳凰傳奇",
"v": "鳳凰傳奇 演 巡演 音樂"
},
{
"n": "刀郎",
"v": "刀郎 演唱會 巡演 音樂"
},
{
"n": "S.H.E",
"v": "S.H.E 演唱會 巡演 音樂"
},
{
"n": "慕容曉曉",
"v": "慕容曉曉 演唱會 巡演 音樂"
},
{
"n": "東方紅豔",
"v": "東方紅豔 演唱會 巡演 音樂"
},
{
"n": "孟庭葦",
"v": "孟庭葦 演唱會 巡演 音樂"
},
{
"n": "斯琴高麗",
"v": "斯琴高麗 演唱會 巡演 音樂"
},
{
"n": "程響",
"v": "程響 演唱會 巡演 音樂"
},
{
"n": "蔣雪兒",
"v": "蔣雪兒 演唱會 巡演 音樂"
},
{
"n": "迈克尔杰克逊",
"v": "麥可傑克森"
}
]
},
{
"key": "date",
"name": "排序/时间",
"value": [
{
"n": "默认",
"v": ""
},
{
"n": "最新",
"v": "latest"
},
{
"n": "最热",
"v": "hottest"
},
{
"n": "最高",
"v": "favorite"
},
{
"n": "当天",
"v": "day"
},
{
"n": "本周",
"v": "week"
},
{
"n": "本月",
"v": "month"
}
"key":"tid",
"name":"體育",
"value":[
{"n":"女足港場","v":"女足港場 @Hong KongWomensStadium"},
{"n":"全國校運動會","v":"全國大專 校院運動會 全中運 女子組賽事 全國中等 學校運動會"},
{"n":"女中儀隊","v":"北一女中樂儀旗隊永續發展協會 北一女中家長會樂儀旗家長後援會 北一女中儀隊校友隊 台灣 学校运动会 景美女中儀隊 北一女樂儀旗隊 full樂儀隊 "},
{"n":"校園熱舞","v":"full 校園熱舞 開南熱無 開南大學課外活動組 女生熱舞社 南寶熱舞社 寶踐熱舞社 NTDC 熱舞社 STUST"},
{"n":"红星体育官方频道","v":"红星体育官方频道【高清直播】"},
{"n":"中國體育比賽傳奇","v":"中國體育比賽傳奇"},
{"n":"愛爾達體育家族","v":"愛爾達體育家族 ELTA Sports"},
{"n":"公視體育","v":"公視體育"},
{"n":"體育之光","v":"體育之光"},
{"n":"偶然體育賽事","v":"偶然體育賽事"}
]
}
],
"體育": [
"時尚潮流":[
{
"key": "time",
"name": "時",
"value": [
{
"n": "時間全選",
"v": ""
},
{
"n": "2025",
"v": "2025"
},
{
"n": "2024",
"v": "2024"
},
{
"n": "2023",
"v": "2023"
},
{
"n": "2022",
"v": "2022"
},
{
"n": "2021",
"v": "2021"
},
{
"n": "2020",
"v": "2020"
},
{
"n": "2019",
"v": "2019"
},
{
"n": "2018",
"v": "2018"
},
{
"n": "2017",
"v": "2017"
},
{
"n": "2016",
"v": "2016"
},
{
"n": "2015",
"v": "2015"
},
{
"n": "2014",
"v": "2014"
},
{
"n": "2013",
"v": "2013"
},
{
"n": "2012",
"v": "2012"
},
{
"n": "2011",
"v": "2011"
},
{
"n": "2010",
"v": "2010"
},
{
"n": "2009",
"v": "2009"
},
{
"n": "2008",
"v": "2008"
},
{
"n": "2007",
"v": "2007"
},
{
"n": "2006",
"v": "2006"
},
{
"n": "2005",
"v": "2005"
},
{
"n": "2004",
"v": "2004"
},
{
"n": "2003",
"v": "2003"
},
{
"n": "2002",
"v": "2002"
},
{
"n": "2001",
"v": "2001"
},
{
"n": "2000",
"v": "2000"
},
{
"n": "1999",
"v": "1999"
},
{
"n": "1998",
"v": "1998"
},
{
"n": "1997",
"v": "1997"
},
{
"n": "1996",
"v": "1996"
},
{
"n": "1995",
"v": "1995"
},
{
"n": "1994",
"v": "1994"
},
{
"n": "1993",
"v": "1993"
},
{
"n": "1992",
"v": "1992"
},
{
"n": "1991",
"v": "1991"
},
{
"n": "1990",
"v": "1990"
},
{
"n": "1989",
"v": "1989"
},
{
"n": "1988",
"v": "1988"
},
{
"n": "1987",
"v": "1987"
},
{
"n": "1986",
"v": "1986"
},
{
"n": "1985",
"v": "1985"
},
{
"n": "1984",
"v": "1984"
},
{
"n": "1983",
"v": "1983"
},
{
"n": "1982",
"v": "1982"
},
{
"n": "1981",
"v": "1981"
},
{
"n": "1980",
"v": "1980"
},
{
"n": "1979",
"v": "1979"
},
{
"n": "1978",
"v": "1978"
},
{
"n": "1977",
"v": "1977"
},
{
"n": "1976",
"v": "1976"
},
{
"n": "1975",
"v": "1975"
},
{
"n": "1974",
"v": "1974"
},
{
"n": "1973",
"v": "1973"
},
{
"n": "1972",
"v": "1972"
},
{
"n": "1971",
"v": "1971"
},
{
"n": "1970",
"v": "1970"
},
{
"n": "1969",
"v": "1969"
},
{
"n": "1968",
"v": "1968"
},
{
"n": "1967",
"v": "1967"
},
{
"n": "1966",
"v": "1966"
},
{
"n": "1965",
"v": "1965"
},
{
"n": "1964",
"v": "1964"
},
{
"n": "1963",
"v": "1963"
},
{
"n": "1962",
"v": "1962"
},
{
"n": "1961",
"v": "1961"
},
{
"n": "1960",
"v": "1960"
},
{
"n": "1959",
"v": "1959"
},
{
"n": "1958",
"v": "1958"
}
"key":"tid",
"name":"時裝秀",
"value":[
{"n":"街舞","v":"脫衣舞 丁字褲 街舞 太空步 機械舞 舞 裸體舞蹈 霹靂舞 魔性舞蹈 鬼步舞 木偶舞 女性藝術舞蹈"},
{"n":"時尚走秀","v":"T台走秀 lingerie show"},
{"n":"時裝秀","v":"hdr ASM lingerieTV 東京ファッションショー 下着ショー"},
{"n":"潮流秀","v":"FASHION IN UHD"},
{"n":"時裝模特","v":"FASHION Runway"},
{"n":"模特","v":"比基尼 泳裝 頂級車模 空姐 寫真 Car model Stewardess Portrait"},
{"n":"裸体秀","v":"hdr 人體藝術 裸体秀 Nude show"},
{"n":"無限亂鬥","v":"hdr 廟會秀 無限HD 公廟 鋼管舞 脫衣舞 舞女 清純 寫真"}
]
},
{
"key": "tid",
"name": "中文",
"value": [
{
"n": "默认",
"v": ""
},
{
"n": "休育直播",
"v": "體育直播"
},
{
"n": "休育赛事",
"v": "體育赛事"
},
{
"n": "足球比赛",
"v": "足球賽事"
},
{
"n": "篮球比赛",
"v": "篮球賽事"
},
{
"n": "极限运动",
"v": "极限運動"
},
{
"n": "室内运动",
"v": "室内運動"
},
{
"n": "户外运动",
"v": "户外運動"
},
{
"n": "瑜伽健身",
"v": "瑜珈健身"
},
{
"n": "健身运动",
"v": "健身運動"
}
"key":"tid",
"name":"小姐姐",
"value":[
{"n":"小姐姐超清","v":"小姐姐超清"},
{"n":"国内小姐姐","v":"快手模特 抖音模特 国内小姐姐"},
{"n":"韩国小姐姐","v":"韩国小姐姐"},
{"n":"日本小姐姐","v":"日本小姐姐"},
{"n":"俄罗斯小姐姐","v":"俄罗斯小姐姐"},
{"n":"混血小姐姐","v":"混血小姐姐"},
{"n":"越南小姐姐","v":"越南小姐姐"},
{"n":"Al小姐姐","v":"Al美女超清"},
{"n":"抖音热门小姐姐","v":"抖音热门小姐姐"},
{"n":"快手热门美女","v":"快手热门美女"},
{"n":"打碟小姐姐","v":"打碟小姐姐"},
{"n":"冲浪小姐姐","v":"冲浪小姐姐"},
{"n":"蹦迪小姐姐","v":"蹦迪小姐姐"},
{"n":"艺校小姐姐","v":"艺校小姐姐"},
{"n":"环球小姐","v":"环球小姐"},
{"n":"泰国人妖","v":"泰国人妖"},
{"n":"人间胸器","v":"人间胸器"}
]
},
{
"key": "tid",
"name": "English",
"value": [
{
"n": "Live",
"v": "live sports"
},
{
"n": "Games",
"v": "live games"
},
{
"n": "Soccer",
"v": "live soccer"
},
{
"n": "NBA",
"v": "NBA"
},
{
"n": "Extreme",
"v": "extreme sports"
},
{
"n": "InDoor",
"v": "indoor sports"
},
{
"n": "OutDoor",
"v": "outdoor sports"
},
{
"n": "Workout",
"v": "workout"
}
]
},
{
"key": "tid",
"name": "體育",
"value": [
{
"n": "女足港場",
"v": "女足港場 @Hong KongWomensStadium"
},
{
"n": "全國校運動會",
"v": "全國大專 校院運動會 全中運 女子組賽事 全國中等 學校運動會"
},
{
"n": "女中儀隊",
"v": "北一女中樂儀旗隊永續發展協會 北一女中家長會樂儀旗家長後援會 北一女中儀隊校友隊 台灣 学校运动会 景美女中儀隊 北一女樂儀旗隊 full樂儀隊 "
},
{
"n": "校園熱舞",
"v": "full 校園熱舞 開南熱無 開南大學課外活動組 女生熱舞社 南寶熱舞社 寶踐熱舞社 NTDC 熱舞社 STUST"
},
{
"n": "红星体育官方频道",
"v": "红星体育官方频道【高清直播】"
},
{
"n": "中國體育比賽傳奇",
"v": "中國體育比賽傳奇"
},
{
"n": "愛爾達體育家族",
"v": "愛爾達體育家族 ELTA Sports"
},
{
"n": "公視體育",
"v": "公視體育"
},
{
"n": "體育之光",
"v": "體育之光"
},
{
"n": "偶然體育賽事",
"v": "偶然體育賽事"
}
]
},
{
"key": "date",
"name": "排序/时间",
"value": [
{
"n": "默认",
"v": ""
},
{
"n": "最新",
"v": "latest"
},
{
"n": "最热",
"v": "hottest"
},
{
"n": "最高",
"v": "favorite"
},
{
"n": "当天",
"v": "day"
},
{
"n": "本周",
"v": "week"
},
{
"n": "本月",
"v": "month"
}
"key":"tid",
"name":"English",
"value":[
{"n":"sexy Miss","v":"sexy Miss"},
{"n":"Hot sexy Girl","v":"Hot sexy Girl"},
{"n":"Korean Girl","v":"Korean sexy Girl"},
{"n":"Japanese Girl","v":"Japanese sexy Girl"},
{"n":"Russian Girl","v":"Russian sexy Girl"},
{"n":"Vietnamese Girl","v":"Vietnamese sexy Girl"},
{"n":"AI Girl","v":"AI Girl"},
{"n":"TikTok Hot Siste","v":"TikTok Hot sexy Girl"},
{"n":"Cute Girl","v":"sexy Cute Girl"},
{"n":"Girl Dj","v":"sexy Girl Dj"},
{"n":"Girl Surfer","v":"sexy Girl Surfer"},
{"n":"Dance Girl","v":"Dance sexy Girl"},
{"n":"Miss Universe","v":"Miss Universe"},
{"n":"Thai Shemale","v":"Thai Shemale"}
]
}
],
"時尚": [
"解說":[
{
"key": "tid",
"name": "时装秀",
"value": [
{
"n": "街舞",
"v": "街舞"
},
{
"n": "時裝秀",
"v": "hdr ASM lingerieTV 東京ファッションショー 下着ショー"
},
{
"n": "潮流秀",
"v": "FASHION IN UHD"
},
{
"n": "時尚走秀",
"v": "時尚走秀 Fashion show"
},
{
"n": "时装模特",
"v": "FASHION Runway"
},
{
"n": "模特",
"v": "比基尼 泳裝 頂級車模 空姐 寫真 Car model Stewardess Portrait"
},
{
"n": "裸体秀",
"v": "hdr 人體藝術 裸体秀 Nude show"
},
{
"n": "無限亂鬥",
"v": "hdr 廟會秀 無限HD 公廟 鋼管舞 脫衣舞 舞女 清純 寫真"
}
]
},
{
"key": "tid",
"name": "小姐姐",
"value": [
{
"n": "小姐姐超清",
"v": "小姐姐超清"
},
{
"n": "国内小姐姐",
"v": "国内小姐姐"
},
{
"n": "韩国小姐姐",
"v": "韩国小姐姐"
},
{
"n": "日本小姐姐",
"v": "日本小姐姐"
},
{
"n": "俄罗斯小姐姐",
"v": "俄罗斯小姐姐"
},
{
"n": "混血小姐姐",
"v": "混血小姐姐"
},
{
"n": "越南小姐姐",
"v": "越南小姐姐"
},
{
"n": "Al小姐姐",
"v": "Al美女超清"
},
{
"n": "抖音热门小姐姐",
"v": "抖音热门小姐姐"
},
{
"n": "快手热门美女",
"v": "快手热门美女"
},
{
"n": "打碟小姐姐",
"v": "打碟小姐姐"
},
{
"n": "冲浪小姐姐",
"v": "冲浪小姐姐"
},
{
"n": "蹦迪小姐姐",
"v": "蹦迪小姐姐"
},
{
"n": "艺校小姐姐",
"v": "艺校小姐姐"
},
{
"n": "环球小姐",
"v": "环球小姐"
},
{
"n": "泰国人妖",
"v": "泰国人妖"
},
{
"n": "人间胸器",
"v": "人间胸器"
}
]
},
{
"key": "tid",
"name": "English",
"value": [
{
"n": "sexy Miss",
"v": "sexy Miss"
},
{
"n": "Hot sexy Girl",
"v": "Hot sexy Girl"
},
{
"n": "Korean Girl",
"v": "Korean sexy Girl"
},
{
"n": "Japanese Girl",
"v": "Japanese sexy Girl"
},
{
"n": "Russian Girl",
"v": "Russian sexy Girl"
},
{
"n": "Vietnamese Girl",
"v": "Vietnamese sexy Girl"
},
{
"n": "AI Girl",
"v": "AI Girl"
},
{
"n": "TikTok Hot Siste",
"v": "TikTok Hot sexy Girl"
},
{
"n": "Cute Girl",
"v": "sexy Cute Girl"
},
{
"n": "Girl Dj",
"v": "sexy Girl Dj"
},
{
"n": "Girl Surfer",
"v": "sexy Girl Surfer"
},
{
"n": "Dance Girl",
"v": "Dance sexy Girl"
},
{
"n": "Miss Universe",
"v": "Miss Universe"
},
{
"n": "Thai Shemale",
"v": "Thai Shemale"
}
]
},
{
"key": "date",
"name": "排序/时间",
"value": [
{
"n": "默认",
"v": ""
},
{
"n": "最新",
"v": "latest"
},
{
"n": "最热",
"v": "hottest"
},
{
"n": "最高",
"v": "favorite"
},
{
"n": "当天",
"v": "day"
},
{
"n": "本周",
"v": "week"
},
{
"n": "本月",
"v": "month"
}
"key":"tid",
"name":"頻道主",
"value":[
{"n":"宇哥侃故事","v":"@yuge"},
{"n":"零度解说","v":"@lingdujieshuo"}
]
}
],
"解說": [
"LIST:HDR,Girls HDR,Landscape HDR,Walk HDR":[
{
"key": "tid",
"name": "頻道主",
"value": [
{
"n": "宇哥侃故事",
"v": "PL 宇哥侃故事"
},
{
"n": "零度解说",
"v": "PL 零度解说"
}
]
},
{
"key": "date",
"name": "排序/时间",
"value": [
{
"n": "默认",
"v": ""
},
{
"n": "最新",
"v": "latest"
},
{
"n": "最热",
"v": "hottest"
},
{
"n": "最高",
"v": "favorite"
},
{
"n": "当天",
"v": "day"
},
{
"n": "本周",
"v": "week"
},
{
"n": "本月",
"v": "month"
}
"key":"tid",
"name":"風景",
"value":[
{"n":"運動","v":"GoPro 女翼裝飛行 極限自行車運動"},
{"n":"風景","v":"hdr 大自然"},
{"n":"Links TV頻道主","v":"@linksphotograph Links TV hdr"},
{"n":"放鬆","v":"hdr 放鬆"},
{"n":"動物世界","v":"hdr Carnivorous Animals 動物世界"},
{"n":"深海世界","v":"hdr Invertebrate Fish 深海世界"},
{"n":"飛禽走獸","v":"hdr Birds of Prey Columbiform Birds Passerine Birds"},
{"n":"生物世界","v":"hdr Amphibians Reptiles 生物世界"}
]
}
],
"战情室": [
"Full YouTube":[
{
"key": "tid",
"name": "栏目",
"value": [
{
"n": "军情观察室",
"v": "|PL-K7NYq6mtAuw3rO7t2rDUhI3qbS1rLMj"
},
{
"n": "环球大战线",
"v": "|PLwHjhKNud0GiqFBpW5aorjeIVO4mZAn_b"
},
{
"n": "少康战情室",
"v": "|PL64Si-sSRnvZFmksKhDl34-Rgv2NGFbK-"
},
{
"n": "国际直球对决",
"v": "|PLvHT0yeWYIuASUZjoW8OXe4e_UkgP7qDU"
},
{
"n": "全球大视野",
"v": "|PLvHT0yeWYIuDyLVv1yDiIxhtk1ZQ92_RY"
},
{
"n": "前进战略高地",
"v": "|PLvHT0yeWYIuBGUWA2KySjgKdPEUFuM8Dc"
},
{
"n": "全广角",
"v": "|PL7I7pJTFhwdoALXJ4QyPjaCIRNm2qBCpU"
}
"key":"tid",
"name":"頻道主",
"value":[
{"n":"李子柒","v":"李子柒 Liziqi @cnliziqi"},
{"n":"滇西小哥","v":"滇西小哥 @dianxixiaoge"},
{"n":"老高與小茉","v":"老高與小茉 @laogao"},
{"n":"李永樂老師","v":"李永樂老師 @TchLiyongle"}
]
},
{
"key":"tid",
"name":"美食頻道主",
"value":[
{"n":"美食作家王刚","v":"美食作家王刚 @chefwang"},
{"n":"小高姐的 Magic Ingredients","v":"小高姐的 Magic Ingredients @MagicIngredients"},
{"n":"小穎美食","v":"小穎美食 @XiaoYingFood"}
]
},
{
"key":"tid",
"name":"野外頻道主",
"value":[
{"n":"野外求生","v":"primitivetechnology9550 @primitivetechnology9550"}
]
},
{
"key":"tid",
"name":"科普頻道主",
"value":[
{"n":"科普","v":"Mr Beast@MrBeast"},
{"n":"航天大學","v":"Airforceproud95 @Airforceproud95"},
{"n":"世界大戰","v":"TheGreatWar @TheGreatWar"},
{"n":"MarkRober","v":"Mark Rober @MarkRober"}
]
},
{
"key":"tid",
"name":"教材",
"value":[
{"n":"不良林","v":"不良林"},
{"n":"涌哥侃侃","v":"涌哥侃侃 @ygkkk"},
{"n":"悟空的日常","v":"悟空的日常"}
]
}
],
"自媒體": [
"宇宙":[
{
"key": "tid",
"name": "频道主",
"value": [
{
"n": "cctv电视剧",
"v": "UC7Vl0YiY0rDlovqcCFN4yTA"
},
{
"n": "王剑每日观察",
"v": "PD王剑每日观察"
},
{
"n": "红岸视野",
"v": "PD红岸视野"
},
{
"n": "私人局",
"v": "PD私人局"
},
{
"n": "内部看美国",
"v": "PD内部看美国"
},
{
"n": "饭圈人间观察",
"v": "PD饭圈人间观察"
},
{
"n": "孤烟暮蝉",
"v": "PD孤烟暮蝉"
},
{
"n": "老高与小茉",
"v": "PD老高与小茉"
},
{
"n": "海洋探险",
"v": "UCJUIqG9JUcQ5saqXSYTF0gg"
}
]
}
],
"HDR": [
{
"key": "tid",
"name": "風景",
"value": [
{
"n": "運動",
"v": "GoPro 女翼裝飛行 極限自行車運動"
},
{
"n": "風景",
"v": "hdr 大自然"
},
{
"n": "Links TV 頻道主",
"v": "@linksphotograph Links TV hdr"
},
{
"n": "放鬆",
"v": "hdr 放鬆"
},
{
"n": "動物世界",
"v": "hdr 動物世界 Carnivorous Animals"
},
{
"n": "深海世界",
"v": "hdr 深海世界 Invertebrate Fish"
},
{
"n": "飛禽走獸",
"v": "hdr Birds of Prey Columbiform Birds Passerine Birds"
},
{
"n": "生物世界",
"v": "hdr 生物世界 Amphibians Reptiles"
}
]
}
],
"Full YouTube": [
{
"key": "tid",
"name": "頻道主",
"value": [
{
"n": "李子柒",
"v": "李子柒 Liziqi @cnliziqi"
},
{
"n": "滇西小哥",
"v": "滇西小哥 @dianxixiaoge"
},
{
"n": "老高與小茉",
"v": "老高與小茉 @laogao"
},
{
"n": "李永樂老師",
"v": "李永樂老師 @TchLiyongle"
}
"key":"tid",
"name":"科普知識",
"value":[
{"n":"宇宙","v":"光年 黑洞 銀河系 空間站 太空技術"},
{"n":"粒子","v":"空間粒子 宇宙磁場 四維空間 元素 量子 光波 光源 靈魂"},
{"n":"靠蒙","v":"microorganism"}
]
},
{
"key": "tid",
"name": "美食頻道主",
"value": [
{
"n": "美食作家王刚",
"v": "美食作家王刚 @chefwang"
},
{
"n": "小高姐的 Magic Ingredients",
"v": "小高姐的 Magic Ingredients @MagicIngredients"
},
{
"n": "小穎美食",
"v": "小穎美食 @XiaoYingFood"
}
]
},
{
"key": "tid",
"name": "野外頻道主",
"value": [
{
"n": "野外求生",
"v": "@primitivetechnology9550"
}
]
},
{
"key": "tid",
"name": "科普频道主",
"value": [
{
"n": "科普",
"v": "Mr Beast@MrBeast"
},
{
"n": "航天大學",
"v": "Airforceproud95 @Airforceproud95"
},
{
"n": "世界大戰",
"v": "TheGreatWar @TheGreatWar"
},
{
"n": "MarkRober",
"v": "Mark Rober @MarkRober"
}
]
},
{
"key": "tid",
"name": "教材",
"value": [
{
"n": "不良林",
"v": "不良林"
},
{
"n": "涌哥侃侃",
"v": "涌哥侃侃 @ygkkk"
},
{
"n": "悟空的日常",
"v": "悟空的日常"
}
]
},
{
"key": "date",
"name": "排序/时间",
"value": [
{
"n": "默认",
"v": ""
},
{
"n": "最新",
"v": "latest"
},
{
"n": "最热",
"v": "hottest"
},
{
"n": "最高",
"v": "favorite"
},
{
"n": "当天",
"v": "day"
},
{
"n": "本周",
"v": "week"
},
{
"n": "本月",
"v": "month"
}
]
}
],
"宇宙": [
{
"key": "tid",
"name": "科普知識",
"value": [
{
"n": "宇宙",
"v": "光年 黑洞 銀河系 空間站 太空技術"
},
{
"n": "粒子",
"v": "空間粒子 宇宙磁場 四維空間 元素 量子 光波 光源 靈魂"
},
{
"n": "靠蒙",
"v": "microorganism"
}
]
},
{
"key": "tid",
"name": "歷史科普",
"value": [
{
"n": "世界大戰",
"v": "世界大戰 二戰 日侵 八國聯軍"
},
{
"n": "人物",
"v": "古代名人 歷史名人 歷代祖先"
},
{
"n": "生物進化史",
"v": "人類進化 微生物進化 動物進化 地球進化"
},
{
"v": "歷史 History"
}
]
},
{
"key": "date",
"name": "排序/时间",
"value": [
{
"n": "默认",
"v": ""
},
{
"n": "最新",
"v": "latest"
},
{
"n": "最热",
"v": "hottest"
},
{
"n": "最高",
"v": "favorite"
},
{
"n": "当天",
"v": "day"
},
{
"n": "本周",
"v": "week"
},
{
"n": "本月",
"v": "month"
}
"key":"tid",
"name":"歷史科普",
"value":[
{"n":"世界大戰","v":"世界大戰 二戰 日侵 八國聯軍"},
{"n":"人物","v":"古代名人 歷史名人 歷代祖先"},
{"n":"生物進化史","v":"人類進化 微生物進化 動物進化 地球進化"},
{"n":"靠蒙","v":"歷史 History"}
]
}
]
},
"jx": 0,
"parse": 0
}
"jx":0,
"parse":0
}
+4766
View File
@@ -0,0 +1,4766 @@
{
"recommend": "LIST:最新|推薦,官方頻道",
"class": [
{
"type_id": "新聞",
"type_name": "新闻"
},
{
"type_id": "战情室",
"type_name": "栏目"
},
{
"type_id": "个人频道",
"type_name": "频道"
},
{
"type_id": "音樂",
"type_name": "音乐"
},
{
"type_id": "短劇",
"type_name": "短剧"
},
{
"type_id": "HDR",
"type_name": "HDR"
},
{
"type_id": "4K",
"type_name": "4K"
},
{
"type_id": "放松",
"type_name": "放松"
},
{
"type_id": "時尚",
"type_name": "時尚"
},
{
"type_id": "紀錄",
"type_name": "纪录"
},
{
"type_id": "劇集",
"type_name": "剧集"
},
{
"type_id": "電影",
"type_name": "电影"
},
{
"type_id": "動畫",
"type_name": "动画"
},
{
"type_id": "綜藝",
"type_name": "综艺"
},
{
"type_id": "體育",
"type_name": "体育"
},
{
"type_id": "宇宙",
"type_name": "科普"
},
{
"type_id": "科技",
"type_name": "科技"
},
{
"type_id": "解說",
"type_name": "解说"
},
{
"type_id": "神秘",
"type_name": "神秘"
},
{
"type_id": "自媒體",
"type_name": "自媒體"
},
{
"type_id": "熱門",
"type_name": "热门"
},
{
"type_id": "GETTRENDS",
"type_name": "Trends"
}
],
"filters": {
"熱門": [
{
"key": "tid",
"name": "LIST",
"value": [
{
"n": "默认",
"v": "PL hottest 默認"
},
{
"n": "热门",
"v": "PL Trending 熱門"
},
{
"n": "动漫",
"v": "PL Popular anime 動漫熱門"
},
{
"n": "漫画",
"v": "PL Popular comics 漫畫熱門"
},
{
"n": "上传",
"v": "PL Recently uploaded 最近上傳"
},
{
"n": "其他",
"v": "PL Popular Other popular ones 其他熱門"
}
]
},
{
"key": "date",
"name": "排序/时间",
"value": [
{
"n": "默认",
"v": "LIST"
},
{
"n": "最新",
"v": "latest"
},
{
"n": "最热",
"v": "hottest"
},
{
"n": "最高",
"v": "favorite"
},
{
"n": "当天",
"v": "day"
},
{
"n": "本周",
"v": "week"
},
{
"n": "本月",
"v": "month"
}
]
}
],
"短劇": [
{
"key": "time",
"name": "時間",
"value": [
{
"n": "時間全選",
"v": ""
},
{
"n": "2025",
"v": "2025"
},
{
"n": "2024",
"v": "2024"
},
{
"n": "2023",
"v": "2023"
},
{
"n": "2022",
"v": "2022"
},
{
"n": "2021",
"v": "2021"
},
{
"n": "2020",
"v": "2020"
},
{
"n": "2019",
"v": "2019"
},
{
"n": "2018",
"v": "2018"
},
{
"n": "2017",
"v": "2017"
},
{
"n": "2016",
"v": "2016"
},
{
"n": "2015",
"v": "2015"
},
{
"n": "2014",
"v": "2014"
},
{
"n": "2013",
"v": "2013"
},
{
"n": "2012",
"v": "2012"
},
{
"n": "2011",
"v": "2011"
},
{
"n": "2010",
"v": "2010"
},
{
"n": "2009",
"v": "2009"
},
{
"n": "2008",
"v": "2008"
},
{
"n": "2007",
"v": "2007"
},
{
"n": "2006",
"v": "2006"
},
{
"n": "2005",
"v": "2005"
},
{
"n": "2004",
"v": "2004"
},
{
"n": "2003",
"v": "2003"
},
{
"n": "2002",
"v": "2002"
},
{
"n": "2001",
"v": "2001"
},
{
"n": "2000",
"v": "2000"
},
{
"n": "1999",
"v": "1999"
},
{
"n": "1998",
"v": "1998"
},
{
"n": "1997",
"v": "1997"
},
{
"n": "1996",
"v": "1996"
},
{
"n": "1995",
"v": "1995"
},
{
"n": "1994",
"v": "1994"
},
{
"n": "1993",
"v": "1993"
},
{
"n": "1992",
"v": "1992"
},
{
"n": "1991",
"v": "1991"
},
{
"n": "1990",
"v": "1990"
},
{
"n": "1989",
"v": "1989"
},
{
"n": "1988",
"v": "1988"
},
{
"n": "1987",
"v": "1987"
},
{
"n": "1986",
"v": "1986"
},
{
"n": "1985",
"v": "1985"
},
{
"n": "1984",
"v": "1984"
},
{
"n": "1983",
"v": "1983"
},
{
"n": "1982",
"v": "1982"
},
{
"n": "1981",
"v": "1981"
},
{
"n": "1980",
"v": "1980"
},
{
"n": "1979",
"v": "1979"
},
{
"n": "1978",
"v": "1978"
},
{
"n": "1977",
"v": "1977"
},
{
"n": "1976",
"v": "1976"
},
{
"n": "1975",
"v": "1975"
},
{
"n": "1974",
"v": "1974"
},
{
"n": "1973",
"v": "1973"
},
{
"n": "1972",
"v": "1972"
},
{
"n": "1971",
"v": "1971"
},
{
"n": "1970",
"v": "1970"
},
{
"n": "1969",
"v": "1969"
},
{
"n": "1968",
"v": "1968"
},
{
"n": "1967",
"v": "1967"
},
{
"n": "1966",
"v": "1966"
},
{
"n": "1965",
"v": "1965"
},
{
"n": "1964",
"v": "1964"
},
{
"n": "1963",
"v": "1963"
},
{
"n": "1962",
"v": "1962"
},
{
"n": "1961",
"v": "1961"
},
{
"n": "1960",
"v": "1960"
},
{
"n": "1959",
"v": "1959"
},
{
"n": "1958",
"v": "1958"
}
]
},
{
"key": "tid",
"name": "短劇",
"value": [
{
"n": "抖音",
"v": "PL抖音 短剧"
},
{
"n": "快手",
"v": "PL快手 短剧"
},
{
"n": "大陆",
"v": "PL大陆短剧"
},
{
"n": "香港",
"v": "PL香港短剧"
},
{
"n": "澳门",
"v": "PL澳门短剧"
},
{
"n": "台湾",
"v": "PL台湾短剧"
},
{
"n": "新加坡",
"v": "PL新加坡短剧"
},
{
"n": "马来西亚",
"v": "PL马来西亚短剧"
},
{
"n": "泰国",
"v": "PL泰国短剧"
},
{
"n": "越南",
"v": "PL越南短剧"
},
{
"n": "印度",
"v": "PL印度短剧"
},
{
"n": "韩国",
"v": "PL韩国短剧"
},
{
"n": "日本",
"v": "PL日本短剧"
},
{
"n": "欧美",
"v": "PL欧美短剧"
},
{
"n": "腾讯",
"v": "PL腾讯短剧"
},
{
"n": "爱奇艺",
"v": "PL爱奇艺短剧"
},
{
"n": "优酷",
"v": "PL优酷短剧"
},
{
"n": "芒果",
"v": "PL芒果TV短剧"
},
{
"n": "搜狐",
"v": "PL搜狐短剧"
}
]
},
{
"key": "tid",
"name": "短劇",
"value": [
{
"n": "都市",
"v": "PL都市短剧"
},
{
"n": "爱情",
"v": "PL爱情短剧"
},
{
"n": "复仇",
"v": "PL复仇短劇"
},
{
"n": "霸总",
"v": "PL霸总短劇"
},
{
"n": "萌宝",
"v": "PL萌宝短劇"
},
{
"n": "古装",
"v": "PL古装短劇"
},
{
"n": "穿越",
"v": "PL穿越短劇"
},
{
"n": "喜剧",
"v": "PL喜剧短劇"
},
{
"n": "奇幻",
"v": "PL奇幻短劇"
},
{
"n": "九酱爱追剧",
"v": "PD@NineSauceDramaTV"
},
{
"n": "百万好剧场",
"v": "PD@1-pw5ox"
},
{
"n": "咖啡追剧",
"v": "PD@coffeedrama605"
},
{
"n": "斗罗短剧",
"v": "PD@DouluoDrama123 斗羅短劇"
},
{
"n": "嘟嘟剧场",
"v": "PD@DUDUJUCHANG"
},
{
"n": "牛牛短剧",
"v": "PD@niuniuduanju"
}
]
},
{
"key": "date",
"name": "排序/时间",
"value": [
{
"n": "默认",
"v": ""
},
{
"n": "最新",
"v": "latest"
},
{
"n": "最热",
"v": "hottest"
},
{
"n": "最高",
"v": "favorite"
},
{
"n": "当天",
"v": "day"
},
{
"n": "本周",
"v": "week"
},
{
"n": "本月",
"v": "month"
}
]
}
],
"動畫": [
{
"key": "time",
"name": "時間",
"value": [
{
"n": "時間全選",
"v": ""
},
{
"n": "2025",
"v": "2025"
},
{
"n": "2024",
"v": "2024"
},
{
"n": "2023",
"v": "2023"
},
{
"n": "2022",
"v": "2022"
},
{
"n": "2021",
"v": "2021"
},
{
"n": "2020",
"v": "2020"
},
{
"n": "2019",
"v": "2019"
},
{
"n": "2018",
"v": "2018"
},
{
"n": "2017",
"v": "2017"
},
{
"n": "2016",
"v": "2016"
},
{
"n": "2015",
"v": "2015"
},
{
"n": "2014",
"v": "2014"
},
{
"n": "2013",
"v": "2013"
},
{
"n": "2012",
"v": "2012"
},
{
"n": "2011",
"v": "2011"
},
{
"n": "2010",
"v": "2010"
},
{
"n": "2009",
"v": "2009"
},
{
"n": "2008",
"v": "2008"
},
{
"n": "2007",
"v": "2007"
},
{
"n": "2006",
"v": "2006"
},
{
"n": "2005",
"v": "2005"
},
{
"n": "2004",
"v": "2004"
},
{
"n": "2003",
"v": "2003"
},
{
"n": "2002",
"v": "2002"
},
{
"n": "2001",
"v": "2001"
},
{
"n": "2000",
"v": "2000"
},
{
"n": "1999",
"v": "1999"
},
{
"n": "1998",
"v": "1998"
},
{
"n": "1997",
"v": "1997"
},
{
"n": "1996",
"v": "1996"
},
{
"n": "1995",
"v": "1995"
},
{
"n": "1994",
"v": "1994"
},
{
"n": "1993",
"v": "1993"
},
{
"n": "1992",
"v": "1992"
},
{
"n": "1991",
"v": "1991"
},
{
"n": "1990",
"v": "1990"
},
{
"n": "1989",
"v": "1989"
},
{
"n": "1988",
"v": "1988"
},
{
"n": "1987",
"v": "1987"
},
{
"n": "1986",
"v": "1986"
},
{
"n": "1985",
"v": "1985"
},
{
"n": "1984",
"v": "1984"
},
{
"n": "1983",
"v": "1983"
},
{
"n": "1982",
"v": "1982"
},
{
"n": "1981",
"v": "1981"
},
{
"n": "1980",
"v": "1980"
},
{
"n": "1979",
"v": "1979"
},
{
"n": "1978",
"v": "1978"
},
{
"n": "1977",
"v": "1977"
},
{
"n": "1976",
"v": "1976"
},
{
"n": "1975",
"v": "1975"
},
{
"n": "1974",
"v": "1974"
},
{
"n": "1973",
"v": "1973"
},
{
"n": "1972",
"v": "1972"
},
{
"n": "1971",
"v": "1971"
},
{
"n": "1970",
"v": "1970"
},
{
"n": "1969",
"v": "1969"
},
{
"n": "1968",
"v": "1968"
},
{
"n": "1967",
"v": "1967"
},
{
"n": "1966",
"v": "1966"
},
{
"n": "1965",
"v": "1965"
},
{
"n": "1964",
"v": "1964"
},
{
"n": "1963",
"v": "1963"
},
{
"n": "1962",
"v": "1962"
},
{
"n": "1961",
"v": "1961"
},
{
"n": "1960",
"v": "1960"
},
{
"n": "1959",
"v": "1959"
},
{
"n": "1958",
"v": "1958"
}
]
},
{
"key": "tid",
"name": "中文",
"value": [
{
"n": "默认",
"v": "animation"
},
{
"n": "虾仁动画",
"v": "PL虾仁"
},
{
"n": "沙雕动画",
"v": "PL沙雕动画"
},
{
"n": "中文国漫",
"v": "PL國漫3D"
},
{
"n": "儿童早教",
"v": "PL儿童早教"
},
{
"n": "儿童歌曲",
"v": "PL儿童歌曲"
},
{
"n": "儿童音乐",
"v": "PL儿童音乐"
},
{
"n": "儿童绘画",
"v": "PL儿童绘画"
},
{
"n": "宝宝巴士",
"v": "PL宝宝巴士"
},
{
"n": "儿歌多多",
"v": "PL儿歌多多"
},
{
"n": "儿童英语启蒙",
"v": "PL儿童英语启蒙"
},
{
"n": "儿童启蒙故事",
"v": "PL儿童启蒙故事"
},
{
"n": "儿童安全教育",
"v": "PL儿童安全教育"
}
]
},
{
"key": "tid",
"name": "English",
"value": [
{
"n": "默认英文国漫",
"v": "PD'3D Chinese cartoon'"
},
{
"n": "小猪佩奇",
"v": "PD@PeppaPigChineseOfficial 小猪佩奇 中文官方 - Peppa Pig"
},
{
"n": "CoComelon",
"v": "PD@CoComelon"
},
{
"n": "合集",
"v": "'Anime ENG SUB'合集"
},
{
"n": "国漫社",
"v": "PD@Animation"
},
{
"n": "国漫工厂",
"v": "PD@3DGuoman"
},
{
"n": "阅文动漫",
"v": "PD@yuewenanimation"
},
{
"n": "哔哩",
"v": "PD@madebybilibili"
},
{
"n": "腾讯",
"v": "PD@TencentVideoAnimation"
},
{
"n": "优酷",
"v": "PD@youkuanimation"
},
{
"n": "爱奇艺",
"v": "PD@iQIYIAnime"
}
]
},
{
"key": "date",
"name": "排序/时间",
"value": [
{
"n": "默认",
"v": ""
},
{
"n": "最新",
"v": "latest"
},
{
"n": "最热",
"v": "hottest"
},
{
"n": "最高",
"v": "favorite"
},
{
"n": "当天",
"v": "day"
},
{
"n": "本周",
"v": "week"
},
{
"n": "本月",
"v": "month"
}
]
}
],
"新聞": [
{
"key": "tid",
"name": "中文",
"value": [
{
"n": "默认",
"v": "fully YouTube 新聞 Live"
},
{
"n": "赛事",
"v": "直播 赛事"
},
{
"n": "CCTV",
"v": "直播 CCTV"
},
{
"n": "港台",
"v": "直播 港台"
},
{
"n": "CNA",
"v": "@channelnewsasia"
},
{
"n": "鳳凰衛視",
"v": "@phoenixtvhk"
},
{
"n": "CTINEWS",
"v": "直播 中天新闻"
},
{
"n": "TVBSEWS",
"v": "直播 TVBSNEWS"
},
{
"n": "新亚太唐人",
"v": "@NTDAPTV"
},
{
"n": "東森新聞 CH51",
"v": "直播 東森新聞 CH51"
},
{
"n": "三立LIVE新闻",
"v": "直播 三立LIVE新闻 @setnews "
},
{
"n": "台視新聞台HD",
"v": "直播 台視新聞 TTV NEWS"
},
{
"n": "中視新聞 HD",
"v": "直播 Taiwan CTV news HD Live"
}
]
},
{
"key": "tid",
"name": "English",
"value": [
{
"n": "Live",
"v": "live"
},
{
"n": "CNN",
"v": "live CNN"
},
{
"n": "BBC",
"v": "live BBC"
},
{
"n": "games",
"v": "live games"
},
{
"n": "CBS",
"v": "@CBSNews"
},
{
"n": "ABC",
"v": "live ABC NEWS"
},
{
"n": "NBC",
"v": "@NBCNews"
},
{
"n": "LiveNOW from FOX",
"v": "@livenowfox"
},
{
"n": "Sky News",
"v": "@SkyNews"
},
{
"n": "euronews",
"v": "@euronews"
},
{
"n": "GBNews",
"v": "@GBNewsOnline"
},
{
"n": "Al Jazeera English",
"v": "@aljazeeraenglish"
},
{
"n": "ABCNews (Australia)",
"v": "@abcnewsaustralia"
},
{
"n": "FRANCE 24 English",
"v": "live FRANCE 24 English"
},
{
"n": "Reuters",
"v": "live Reuters"
},
{
"n": "印度电视台",
"v": "@SETIndia"
}
]
},
{
"key": "tid",
"name": "中文",
"value": [
{
"n": "默认",
"v": "News"
},
{
"n": "News",
"v": "news"
},
{
"n": "时政",
"v": "时政 新闻"
},
{
"n": "体育",
"v": "体育 新闻"
},
{
"n": "娱乐",
"v": "娱乐 新闻"
},
{
"n": "大陆",
"v": "大陆 新闻"
},
{
"n": "HKTVB",
"v": "@tvbnewsofficial"
},
{
"n": "少康戰情室",
"v": "@tvbssituationroom"
},
{
"n": "政经龙凤配",
"v": "@觀點"
},
{
"n": "FOCUS全球新闻",
"v": "@TVBSNEWS FOCUS全球新闻"
},
{
"n": "新闻大白话",
"v": "@TVBSNEWS 新闻大白话"
},
{
"n": "东森新闻",
"v": "关键时刻新闻"
},
{
"n": "港台",
"v": "港台 新闻"
}
]
},
{
"key": "tid",
"name": "English",
"value": [
{
"n": "科技與發展",
"v": "閱兵 奧運會 航母 航空母艦 潛水艇 核武器 坦克 武器 卫星 火箭 輪船 飛機 飛碟"
},
{
"n": "法治与社会",
"v": "法治 法制 社会 卖淫 淫秽 污蔑 赌博 毒品 裸聊 诈骗 拐卖 强奸 勒索"
},
{
"n": "News",
"v": "News"
},
{
"n": "CNN",
"v": "CNN news"
},
{
"n": "BBC",
"v": "BBC news"
}
]
},
{
"key": "date",
"name": "排序/时间",
"value": [
{
"n": "默认",
"v": ""
},
{
"n": "最新",
"v": "latest"
},
{
"n": "最热",
"v": "hottest"
},
{
"n": "最高",
"v": "favorite"
},
{
"n": "当天",
"v": "day"
},
{
"n": "本周",
"v": "week"
},
{
"n": "本月",
"v": "month"
}
]
}
],
"劇集": [
{
"key": "time",
"name": "時間",
"value": [
{
"n": "時間全選",
"v": ""
},
{
"n": "2025",
"v": "2025"
},
{
"n": "2024",
"v": "2024"
},
{
"n": "2023",
"v": "2023"
},
{
"n": "2022",
"v": "2022"
},
{
"n": "2021",
"v": "2021"
},
{
"n": "2020",
"v": "2020"
},
{
"n": "2019",
"v": "2019"
},
{
"n": "2018",
"v": "2018"
},
{
"n": "2017",
"v": "2017"
},
{
"n": "2016",
"v": "2016"
},
{
"n": "2015",
"v": "2015"
},
{
"n": "2014",
"v": "2014"
},
{
"n": "2013",
"v": "2013"
},
{
"n": "2012",
"v": "2012"
},
{
"n": "2011",
"v": "2011"
},
{
"n": "2010",
"v": "2010"
},
{
"n": "2009",
"v": "2009"
},
{
"n": "2008",
"v": "2008"
},
{
"n": "2007",
"v": "2007"
},
{
"n": "2006",
"v": "2006"
},
{
"n": "2005",
"v": "2005"
},
{
"n": "2004",
"v": "2004"
},
{
"n": "2003",
"v": "2003"
},
{
"n": "2002",
"v": "2002"
},
{
"n": "2001",
"v": "2001"
},
{
"n": "2000",
"v": "2000"
},
{
"n": "1999",
"v": "1999"
},
{
"n": "1998",
"v": "1998"
},
{
"n": "1997",
"v": "1997"
},
{
"n": "1996",
"v": "1996"
},
{
"n": "1995",
"v": "1995"
},
{
"n": "1994",
"v": "1994"
},
{
"n": "1993",
"v": "1993"
},
{
"n": "1992",
"v": "1992"
},
{
"n": "1991",
"v": "1991"
},
{
"n": "1990",
"v": "1990"
},
{
"n": "1989",
"v": "1989"
},
{
"n": "1988",
"v": "1988"
},
{
"n": "1987",
"v": "1987"
},
{
"n": "1986",
"v": "1986"
},
{
"n": "1985",
"v": "1985"
},
{
"n": "1984",
"v": "1984"
},
{
"n": "1983",
"v": "1983"
},
{
"n": "1982",
"v": "1982"
},
{
"n": "1981",
"v": "1981"
},
{
"n": "1980",
"v": "1980"
},
{
"n": "1979",
"v": "1979"
},
{
"n": "1978",
"v": "1978"
},
{
"n": "1977",
"v": "1977"
},
{
"n": "1976",
"v": "1976"
},
{
"n": "1975",
"v": "1975"
},
{
"n": "1974",
"v": "1974"
},
{
"n": "1973",
"v": "1973"
},
{
"n": "1972",
"v": "1972"
},
{
"n": "1971",
"v": "1971"
},
{
"n": "1970",
"v": "1970"
},
{
"n": "1969",
"v": "1969"
},
{
"n": "1968",
"v": "1968"
},
{
"n": "1967",
"v": "1967"
},
{
"n": "1966",
"v": "1966"
},
{
"n": "1965",
"v": "1965"
},
{
"n": "1964",
"v": "1964"
},
{
"n": "1963",
"v": "1963"
},
{
"n": "1962",
"v": "1962"
},
{
"n": "1961",
"v": "1961"
},
{
"n": "1960",
"v": "1960"
},
{
"n": "1959",
"v": "1959"
},
{
"n": "1958",
"v": "1958"
}
]
},
{
"key": "tid",
"name": "中文",
"value": [
{
"n": "默認",
"v": ""
},
{
"n": "華語熱播電視劇官方頻道",
"v": "PL華語熱播電視劇官方頻道"
},
{
"n": "TVB 国语",
"v": "PL TVB Drama 国语剧场"
},
{
"n": "粵劇",
"v": "PL 粵劇 劇集"
},
{
"n": "TVB",
"v": "PL TVB"
},
{
"n": "国剧放映社",
"v": "PL 国剧放映社"
},
{
"n": "大陆",
"v": "PL 大陆 剧集"
},
{
"n": "腾讯",
"v": "PL 腾讯 剧集"
},
{
"n": "爱奇艺",
"v": "PL 爱奇艺 剧集"
},
{
"n": "优酷",
"v": "PL 优酷 剧集"
},
{
"n": "芒果",
"v": "PL 芒果TV 剧集"
},
{
"n": "搜狐",
"v": "PL 搜狐 剧集"
},
{
"n": "华数",
"v": "PL 华数 剧集"
},
{
"n": "港台",
"v": "PL 港台 剧集"
},
{
"n": "美国",
"v": "PL 美国 Full Episode 完整剧集"
},
{
"n": "Netflix",
"v": "PL Netflix Full Episode 完整剧集"
},
{
"n": "Disney",
"v": "PL disney Full Episode 完整剧集"
},
{
"n": "Apple",
"v": "PL apple Full Episode 完整剧集"
},
{
"n": "Amazon",
"v": "PL amazon Full Episode 完整剧集"
},
{
"n": "HBO",
"v": "PL hbo Full Episode 完整剧集"
},
{
"n": "韩国",
"v": "PL 韩国 剧集"
},
{
"n": "日本",
"v": "PL 日本 剧集"
},
{
"n": "英国",
"v": "PL 英国 Full Episode 完整剧集"
}
]
},
{
"key": "tid",
"name": "English",
"value": [
{
"n": "Drama",
"v": "PL Full Episode drama"
},
{
"n": "US",
"v": "PL drama Full Episode US"
},
{
"n": "Netflix",
"v": "PL netflix Full Episode drama"
},
{
"n": "Disney",
"v": "PL disney Full Episode drama"
},
{
"n": "Apple",
"v": "PL apple Full Episode drama"
},
{
"n": "Amazon",
"v": "PL amazon Full Episode drama"
},
{
"n": "HBO",
"v": "PL hbo Full Episode drama"
},
{
"n": "Korea",
"v": "PL korea Full Episode drama"
},
{
"n": "Japan",
"v": "PL japan Full Episode drama"
},
{
"n": "UK",
"v": "PL uk Full Episode drama"
}
]
},
{
"key": "date",
"name": "排序/时间",
"value": [
{
"n": "默认",
"v": ""
},
{
"n": "最新",
"v": "latest"
},
{
"n": "最热",
"v": "hottest"
},
{
"n": "最高",
"v": "favorite"
},
{
"n": "当天",
"v": "day"
},
{
"n": "本周",
"v": "week"
},
{
"n": "本月",
"v": "month"
}
]
}
],
"電影": [
{
"key": "time",
"name": "時間",
"value": [
{
"n": "時間全選",
"v": ""
},
{
"n": "2025",
"v": "2025"
},
{
"n": "2024",
"v": "2024"
},
{
"n": "2023",
"v": "2023"
},
{
"n": "2022",
"v": "2022"
},
{
"n": "2021",
"v": "2021"
},
{
"n": "2020",
"v": "2020"
},
{
"n": "2019",
"v": "2019"
},
{
"n": "2018",
"v": "2018"
},
{
"n": "2017",
"v": "2017"
},
{
"n": "2016",
"v": "2016"
},
{
"n": "2015",
"v": "2015"
},
{
"n": "2014",
"v": "2014"
},
{
"n": "2013",
"v": "2013"
},
{
"n": "2012",
"v": "2012"
},
{
"n": "2011",
"v": "2011"
},
{
"n": "2010",
"v": "2010"
},
{
"n": "2009",
"v": "2009"
},
{
"n": "2008",
"v": "2008"
},
{
"n": "2007",
"v": "2007"
},
{
"n": "2006",
"v": "2006"
},
{
"n": "2005",
"v": "2005"
},
{
"n": "2004",
"v": "2004"
},
{
"n": "2003",
"v": "2003"
},
{
"n": "2002",
"v": "2002"
},
{
"n": "2001",
"v": "2001"
},
{
"n": "2000",
"v": "2000"
},
{
"n": "1999",
"v": "1999"
},
{
"n": "1998",
"v": "1998"
},
{
"n": "1997",
"v": "1997"
},
{
"n": "1996",
"v": "1996"
},
{
"n": "1995",
"v": "1995"
},
{
"n": "1994",
"v": "1994"
},
{
"n": "1993",
"v": "1993"
},
{
"n": "1992",
"v": "1992"
},
{
"n": "1991",
"v": "1991"
},
{
"n": "1990",
"v": "1990"
},
{
"n": "1989",
"v": "1989"
},
{
"n": "1988",
"v": "1988"
},
{
"n": "1987",
"v": "1987"
},
{
"n": "1986",
"v": "1986"
},
{
"n": "1985",
"v": "1985"
},
{
"n": "1984",
"v": "1984"
},
{
"n": "1983",
"v": "1983"
},
{
"n": "1982",
"v": "1982"
},
{
"n": "1981",
"v": "1981"
},
{
"n": "1980",
"v": "1980"
},
{
"n": "1979",
"v": "1979"
},
{
"n": "1978",
"v": "1978"
},
{
"n": "1977",
"v": "1977"
},
{
"n": "1976",
"v": "1976"
},
{
"n": "1975",
"v": "1975"
},
{
"n": "1974",
"v": "1974"
},
{
"n": "1973",
"v": "1973"
},
{
"n": "1972",
"v": "1972"
},
{
"n": "1971",
"v": "1971"
},
{
"n": "1970",
"v": "1970"
},
{
"n": "1969",
"v": "1969"
},
{
"n": "1968",
"v": "1968"
},
{
"n": "1967",
"v": "1967"
},
{
"n": "1966",
"v": "1966"
},
{
"n": "1965",
"v": "1965"
},
{
"n": "1964",
"v": "1964"
},
{
"n": "1963",
"v": "1963"
},
{
"n": "1962",
"v": "1962"
},
{
"n": "1961",
"v": "1961"
},
{
"n": "1960",
"v": "1960"
},
{
"n": "1959",
"v": "1959"
},
{
"n": "1958",
"v": "1958"
}
]
},
{
"key": "tid",
"name": "中文",
"value": [
{
"n": "默認",
"v": ""
},
{
"n": "大陆",
"v": "PL 大陆 电影"
},
{
"n": "腾讯",
"v": "PL 腾讯 电影"
},
{
"n": "爱奇艺",
"v": "PL 爱奇艺 电影"
},
{
"n": "优酷",
"v": "PL 优酷 电影"
},
{
"n": "芒果",
"v": "PL 芒果TV 电影"
},
{
"n": "搜狐",
"v": "PL 搜狐 电影"
},
{
"n": "港台",
"v": "PL 港台 电影"
},
{
"n": "美国",
"v": "PL 美国 电影"
},
{
"n": "Netflix",
"v": "PL netflix Full movie 电影"
},
{
"n": "Disney",
"v": "PL disney Full movie 电影"
},
{
"n": "Apple",
"v": "PL apple Full movie 电影"
},
{
"n": "Amazon",
"v": "PL amazon Full movie 电影"
},
{
"n": "HBO",
"v": "PL hbo Full movie 电影"
},
{
"n": "韩国",
"v": "PL 韩国 Full movie 电影"
},
{
"n": "日本",
"v": "PL 日本 Full movie 电影"
},
{
"n": "英国",
"v": "PL 英国 Full movie 电影"
}
]
},
{
"key": "tid",
"name": "English",
"value": [
{
"n": "movie",
"v": "PL youtube movies Full movie"
},
{
"n": "US",
"v": "PL us Full movie movie"
},
{
"n": "Netflix movie",
"v": "PL netflix Full movie movie"
},
{
"n": "Disney",
"v": "PL disney Full movie movie"
},
{
"n": "Apple",
"v": "PL apple Full movie movie"
},
{
"n": "Amazon",
"v": "PL amazon Full movie movie"
},
{
"n": "HBO",
"v": "PL hbo Full movie movie"
},
{
"n": "Koera",
"v": "PL korea Full movie movie"
},
{
"n": "Japan",
"v": "PL japan Full movie movie"
},
{
"n": "UK",
"v": "PL uk Full movie movie"
}
]
},
{
"key": "date",
"name": "排序/时间",
"value": [
{
"n": "默认",
"v": ""
},
{
"n": "最新",
"v": "latest"
},
{
"n": "最热",
"v": "hottest"
},
{
"n": "最高",
"v": "favorite"
},
{
"n": "当天",
"v": "day"
},
{
"n": "本周",
"v": "week"
},
{
"n": "本月",
"v": "month"
}
]
}
],
"綜藝": [
{
"key": "time",
"name": "時間",
"value": [
{
"n": "時間全選",
"v": ""
},
{
"n": "2025",
"v": "2025"
},
{
"n": "2024",
"v": "2024"
},
{
"n": "2023",
"v": "2023"
},
{
"n": "2022",
"v": "2022"
},
{
"n": "2021",
"v": "2021"
},
{
"n": "2020",
"v": "2020"
},
{
"n": "2019",
"v": "2019"
},
{
"n": "2018",
"v": "2018"
},
{
"n": "2017",
"v": "2017"
},
{
"n": "2016",
"v": "2016"
},
{
"n": "2015",
"v": "2015"
},
{
"n": "2014",
"v": "2014"
},
{
"n": "2013",
"v": "2013"
},
{
"n": "2012",
"v": "2012"
},
{
"n": "2011",
"v": "2011"
},
{
"n": "2010",
"v": "2010"
},
{
"n": "2009",
"v": "2009"
},
{
"n": "2008",
"v": "2008"
},
{
"n": "2007",
"v": "2007"
},
{
"n": "2006",
"v": "2006"
},
{
"n": "2005",
"v": "2005"
},
{
"n": "2004",
"v": "2004"
},
{
"n": "2003",
"v": "2003"
},
{
"n": "2002",
"v": "2002"
},
{
"n": "2001",
"v": "2001"
},
{
"n": "2000",
"v": "2000"
},
{
"n": "1999",
"v": "1999"
},
{
"n": "1998",
"v": "1998"
},
{
"n": "1997",
"v": "1997"
},
{
"n": "1996",
"v": "1996"
},
{
"n": "1995",
"v": "1995"
},
{
"n": "1994",
"v": "1994"
},
{
"n": "1993",
"v": "1993"
},
{
"n": "1992",
"v": "1992"
},
{
"n": "1991",
"v": "1991"
},
{
"n": "1990",
"v": "1990"
},
{
"n": "1989",
"v": "1989"
},
{
"n": "1988",
"v": "1988"
},
{
"n": "1987",
"v": "1987"
},
{
"n": "1986",
"v": "1986"
},
{
"n": "1985",
"v": "1985"
},
{
"n": "1984",
"v": "1984"
},
{
"n": "1983",
"v": "1983"
},
{
"n": "1982",
"v": "1982"
},
{
"n": "1981",
"v": "1981"
},
{
"n": "1980",
"v": "1980"
},
{
"n": "1979",
"v": "1979"
},
{
"n": "1978",
"v": "1978"
},
{
"n": "1977",
"v": "1977"
},
{
"n": "1976",
"v": "1976"
},
{
"n": "1975",
"v": "1975"
},
{
"n": "1974",
"v": "1974"
},
{
"n": "1973",
"v": "1973"
},
{
"n": "1972",
"v": "1972"
},
{
"n": "1971",
"v": "1971"
},
{
"n": "1970",
"v": "1970"
},
{
"n": "1969",
"v": "1969"
},
{
"n": "1968",
"v": "1968"
},
{
"n": "1967",
"v": "1967"
},
{
"n": "1966",
"v": "1966"
},
{
"n": "1965",
"v": "1965"
},
{
"n": "1964",
"v": "1964"
},
{
"n": "1963",
"v": "1963"
},
{
"n": "1962",
"v": "1962"
},
{
"n": "1961",
"v": "1961"
},
{
"n": "1960",
"v": "1960"
},
{
"n": "1959",
"v": "1959"
},
{
"n": "1958",
"v": "1958"
}
]
},
{
"key": "tid",
"name": "中文",
"value": [
{
"n": "默认",
"v": "Variety show"
},
{
"n": "大陆",
"v": "大陆 综艺"
},
{
"n": "芒果",
"v": "芒果 综艺"
},
{
"n": "腾讯",
"v": "腾讯 综艺"
},
{
"n": "爱奇艺",
"v": "爱奇艺 综艺"
},
{
"n": "优酷",
"v": "优酷 综艺"
},
{
"n": "港台",
"v": "港台 综艺"
},
{
"n": "美国",
"v": "美国 综艺"
},
{
"n": "Netflix",
"v": "Netflix 综艺"
},
{
"n": "韩国",
"v": "CRAVITY on Variety Shows 韩国 综艺"
},
{
"n": "日本",
"v": "日本 综艺"
},
{
"n": "英国",
"v": "英国 综艺"
}
]
},
{
"key": "tid",
"name": "English",
"value": [
{
"n": "Variety",
"v": "variety"
},
{
"n": "Netflix variety",
"v": "netflix variety"
},
{
"n": "Korea",
"v": "korea variety"
},
{
"n": "Japan",
"v": "japan variety"
},
{
"n": "UK",
"v": "uk variety"
}
]
},
{
"key": "tid",
"name": "小品",
"value": [
{
"n": "春晚小品",
"v": "春晚小品"
},
{
"n": "开心麻花",
"v": "开心麻花"
},
{
"n": "屌丝男士",
"v": "屌丝男士"
},
{
"n": "喜剧综艺",
"v": "喜剧综艺"
},
{
"n": "单口",
"v": "单口 相声"
},
{
"n": "群口",
"v": "群口 相声"
},
{
"n": "德云社",
"v": "德云社"
},
{
"n": "青曲社",
"v": "青曲社"
},
{
"n": "郭德纲",
"v": "郭德纲"
},
{
"n": "岳云鹏",
"v": "岳云鹏"
},
{
"n": "曹云金",
"v": "曹云金"
},
{
"n": "评书",
"v": "评书"
},
{
"n": "小曲",
"v": "小曲"
},
{
"n": "赵本山",
"v": "赵本山"
},
{
"n": "陈佩斯",
"v": "陈佩斯"
},
{
"n": "冯巩",
"v": "冯巩"
},
{
"n": "宋小宝",
"v": "宋小宝"
},
{
"n": "赵丽蓉",
"v": "赵丽蓉"
},
{
"n": "潘长江",
"v": "潘长江"
},
{
"n": "郭冬临",
"v": "郭冬临"
},
{
"n": "严顺开",
"v": "严顺开"
},
{
"n": "文松",
"v": "文松"
}
]
},
{
"key": "date",
"name": "排序/时间",
"value": [
{
"n": "默认",
"v": ""
},
{
"n": "最新",
"v": "latest"
},
{
"n": "最热",
"v": "hottest"
},
{
"n": "最高",
"v": "favorite"
},
{
"n": "当天",
"v": "day"
},
{
"n": "本周",
"v": "week"
},
{
"n": "本月",
"v": "month"
}
]
}
],
"紀錄": [
{
"key": "time",
"name": "時間",
"value": [
{
"n": "時間全選",
"v": ""
},
{
"n": "2025",
"v": "2025"
},
{
"n": "2024",
"v": "2024"
},
{
"n": "2023",
"v": "2023"
},
{
"n": "2022",
"v": "2022"
},
{
"n": "2021",
"v": "2021"
},
{
"n": "2020",
"v": "2020"
},
{
"n": "2019",
"v": "2019"
},
{
"n": "2018",
"v": "2018"
},
{
"n": "2017",
"v": "2017"
},
{
"n": "2016",
"v": "2016"
},
{
"n": "2015",
"v": "2015"
},
{
"n": "2014",
"v": "2014"
},
{
"n": "2013",
"v": "2013"
},
{
"n": "2012",
"v": "2012"
},
{
"n": "2011",
"v": "2011"
},
{
"n": "2010",
"v": "2010"
},
{
"n": "2009",
"v": "2009"
},
{
"n": "2008",
"v": "2008"
},
{
"n": "2007",
"v": "2007"
},
{
"n": "2006",
"v": "2006"
},
{
"n": "2005",
"v": "2005"
},
{
"n": "2004",
"v": "2004"
},
{
"n": "2003",
"v": "2003"
},
{
"n": "2002",
"v": "2002"
},
{
"n": "2001",
"v": "2001"
},
{
"n": "2000",
"v": "2000"
},
{
"n": "1999",
"v": "1999"
},
{
"n": "1998",
"v": "1998"
},
{
"n": "1997",
"v": "1997"
},
{
"n": "1996",
"v": "1996"
},
{
"n": "1995",
"v": "1995"
},
{
"n": "1994",
"v": "1994"
},
{
"n": "1993",
"v": "1993"
},
{
"n": "1992",
"v": "1992"
},
{
"n": "1991",
"v": "1991"
},
{
"n": "1990",
"v": "1990"
},
{
"n": "1989",
"v": "1989"
},
{
"n": "1988",
"v": "1988"
},
{
"n": "1987",
"v": "1987"
},
{
"n": "1986",
"v": "1986"
},
{
"n": "1985",
"v": "1985"
},
{
"n": "1984",
"v": "1984"
},
{
"n": "1983",
"v": "1983"
},
{
"n": "1982",
"v": "1982"
},
{
"n": "1981",
"v": "1981"
},
{
"n": "1980",
"v": "1980"
},
{
"n": "1979",
"v": "1979"
},
{
"n": "1978",
"v": "1978"
},
{
"n": "1977",
"v": "1977"
},
{
"n": "1976",
"v": "1976"
},
{
"n": "1975",
"v": "1975"
},
{
"n": "1974",
"v": "1974"
},
{
"n": "1973",
"v": "1973"
},
{
"n": "1972",
"v": "1972"
},
{
"n": "1971",
"v": "1971"
},
{
"n": "1970",
"v": "1970"
},
{
"n": "1969",
"v": "1969"
},
{
"n": "1968",
"v": "1968"
},
{
"n": "1967",
"v": "1967"
},
{
"n": "1966",
"v": "1966"
},
{
"n": "1965",
"v": "1965"
},
{
"n": "1964",
"v": "1964"
},
{
"n": "1963",
"v": "1963"
},
{
"n": "1962",
"v": "1962"
},
{
"n": "1961",
"v": "1961"
},
{
"n": "1960",
"v": "1960"
},
{
"n": "1959",
"v": "1959"
},
{
"n": "1958",
"v": "1958"
}
]
},
{
"key": "tid",
"name": "中文",
"value": [
{
"n": "地區🎶排序",
"v": "歷史記錄片 地球記錄片 宇宙記錄片 海洋記錄片 戰爭記錄片 大自然生存記錄片"
},
{
"n": "默认",
"v": "PL documentary"
},
{
"n": "CCTV 纪录片",
"v": "PL CCTV 纪录片"
},
{
"n": "BBC 纪录片",
"v": "PL BBC 纪录片"
},
{
"n": "国家地理",
"v": "PL 国家地理 纪录片"
},
{
"n": "Netflix纪录片",
"v": "PL netflix 纪录片"
},
{
"n": "BBC",
"v": "PL BBC documentary"
},
{
"n": "National Geographic",
"v": "Pl National Geographic documentary"
},
{
"n": "Netflix",
"v": "PL netflix documentary"
},
{
"n": "历史",
"v": "PL 历史 纪录片"
},
{
"n": "野性",
"v": "PL 野性 纪录片"
},
{
"n": "地球",
"v": "PL 地球 纪录片"
},
{
"n": "宇宙",
"v": "PL 宇宙 纪录片"
},
{
"n": "海洋",
"v": "PL 海洋 纪录片"
},
{
"n": "人文",
"v": "PL 人文 纪录片"
},
{
"n": "战争",
"v": "PL 战争 纪录片"
}
]
},
{
"key": "tid",
"name": "English",
"value": [
{
"n": "History",
"v": "PL Full history documentary"
},
{
"n": "WILD",
"v": "PL Full wild documentary"
},
{
"n": "Earch",
"v": "PL Full earth documentary"
},
{
"n": "Universe",
"v": "PL Full universe documentary"
},
{
"n": "Oceans",
"v": "PL Full oceans documentary"
},
{
"n": "Humanism",
"v": "PL Full humanism documentary"
},
{
"n": "Wars",
"v": "PL Full war documentary"
}
]
},
{
"key": "date",
"name": "排序/时间",
"value": [
{
"n": "默认",
"v": ""
},
{
"n": "最新",
"v": "latest"
},
{
"n": "最热",
"v": "hottest"
},
{
"n": "最高",
"v": "favorite"
},
{
"n": "当天",
"v": "day"
},
{
"n": "本周",
"v": "week"
},
{
"n": "本月",
"v": "month"
}
]
}
],
"音樂": [
{
"key": "time",
"name": "時間",
"value": [
{
"n": "時間全選",
"v": ""
},
{
"n": "2025",
"v": "2025"
},
{
"n": "2024",
"v": "2024"
},
{
"n": "2023",
"v": "2023"
},
{
"n": "2022",
"v": "2022"
},
{
"n": "2021",
"v": "2021"
},
{
"n": "2020",
"v": "2020"
},
{
"n": "2019",
"v": "2019"
},
{
"n": "2018",
"v": "2018"
},
{
"n": "2017",
"v": "2017"
},
{
"n": "2016",
"v": "2016"
},
{
"n": "2015",
"v": "2015"
},
{
"n": "2014",
"v": "2014"
},
{
"n": "2013",
"v": "2013"
},
{
"n": "2012",
"v": "2012"
},
{
"n": "2011",
"v": "2011"
},
{
"n": "2010",
"v": "2010"
},
{
"n": "2009",
"v": "2009"
},
{
"n": "2008",
"v": "2008"
},
{
"n": "2007",
"v": "2007"
},
{
"n": "2006",
"v": "2006"
},
{
"n": "2005",
"v": "2005"
},
{
"n": "2004",
"v": "2004"
},
{
"n": "2003",
"v": "2003"
},
{
"n": "2002",
"v": "2002"
},
{
"n": "2001",
"v": "2001"
},
{
"n": "2000",
"v": "2000"
},
{
"n": "1999",
"v": "1999"
},
{
"n": "1998",
"v": "1998"
},
{
"n": "1997",
"v": "1997"
},
{
"n": "1996",
"v": "1996"
},
{
"n": "1995",
"v": "1995"
},
{
"n": "1994",
"v": "1994"
},
{
"n": "1993",
"v": "1993"
},
{
"n": "1992",
"v": "1992"
},
{
"n": "1991",
"v": "1991"
},
{
"n": "1990",
"v": "1990"
},
{
"n": "1989",
"v": "1989"
},
{
"n": "1988",
"v": "1988"
},
{
"n": "1987",
"v": "1987"
},
{
"n": "1986",
"v": "1986"
},
{
"n": "1985",
"v": "1985"
},
{
"n": "1984",
"v": "1984"
},
{
"n": "1983",
"v": "1983"
},
{
"n": "1982",
"v": "1982"
},
{
"n": "1981",
"v": "1981"
},
{
"n": "1980",
"v": "1980"
},
{
"n": "1979",
"v": "1979"
},
{
"n": "1978",
"v": "1978"
},
{
"n": "1977",
"v": "1977"
},
{
"n": "1976",
"v": "1976"
},
{
"n": "1975",
"v": "1975"
},
{
"n": "1974",
"v": "1974"
},
{
"n": "1973",
"v": "1973"
},
{
"n": "1972",
"v": "1972"
},
{
"n": "1971",
"v": "1971"
},
{
"n": "1970",
"v": "1970"
},
{
"n": "1969",
"v": "1969"
},
{
"n": "1968",
"v": "1968"
},
{
"n": "1967",
"v": "1967"
},
{
"n": "1966",
"v": "1966"
},
{
"n": "1965",
"v": "1965"
},
{
"n": "1964",
"v": "1964"
},
{
"n": "1963",
"v": "1963"
},
{
"n": "1962",
"v": "1962"
},
{
"n": "1961",
"v": "1961"
},
{
"n": "1960",
"v": "1960"
},
{
"n": "1959",
"v": "1959"
},
{
"n": "1958",
"v": "1958"
}
]
},
{
"key": "tid",
"name": "地區",
"value": [
{
"n": "華語音樂",
"v": "PL 華語音樂"
},
{
"n": "華語MV",
"v": "PL 華語MV"
},
{
"n": "环球视听",
"v": "PL 环球视听"
},
{
"n": "YouTube 點閱率最高",
"v": "點閱率最高華語歌曲"
},
{
"n": "海外抖音",
"v": "PL TikTok 抖音 音樂"
},
{
"n": "粵語",
"v": "PL 粵語 音樂"
},
{
"n": "國語",
"v": "PL 國語 音樂"
},
{
"n": "大陆",
"v": "PL 大陆 音乐"
},
{
"n": "香港",
"v": "PL 香港 音乐"
},
{
"n": "台湾",
"v": "PL 台湾 音乐"
},
{
"n": "新加坡",
"v": "PL 新加坡 音乐"
},
{
"n": "馬來西亞",
"v": "PL 馬來西亞 音乐"
},
{
"n": "泰國",
"v": "PL 泰國 音乐"
},
{
"n": "越南",
"v": "PL 越南 音乐"
},
{
"n": "印度",
"v": "PL 印度 音乐"
},
{
"n": "韩国",
"v": "PL 韩国 音乐"
},
{
"n": "日本",
"v": "PL 日本 音乐"
},
{
"n": "欧美",
"v": "PL 欧美 音乐"
},
{
"n": "时光音乐会 MV",
"v": "时光音乐会MV"
},
{
"n": "中国好声音 MV",
"v": "中国好声音MV"
},
{
"n": "滚石 MV",
"v": "滚石MV"
},
{
"n": "古风 MV",
"v": "古风MV"
},
{
"n": "韩国女团 MV",
"v": "韩国女团MV"
},
{
"n": "欧美",
"v": "欧美 音乐"
},
{
"n": "BillBoard",
"v": "BillBoard"
}
]
},
{
"key": "tid",
"name": "愛好",
"value": [
{
"n": "合辑",
"v": "合辑"
},
{
"n": "超級女聲",
"v": "超級女聲"
},
{
"n": "whitneyhouston",
"v": "@whitneyhoustonmusic"
},
{
"n": "玛丽.凯丽",
"v": "@MariahCarey"
},
{
"n": "LadyGaga",
"v": "@LadyGaga"
},
{
"n": "G.E.M邓紫棋",
"v": "@gem0816"
},
{
"n": "麦当娜",
"v": "@madonna"
},
{
"n": "Taylor Swift",
"v": "@TaylorSwift"
},
{
"n": "舞曲",
"v": "蹦迪現場 慢搖 夜店 低音 女聲 "
},
{
"n": "80-90",
"v": "80 90 音樂"
},
{
"n": "人聲",
"v": "人聲 音樂"
},
{
"n": "硬歌",
"v": "深水炸弹"
},
{
"n": "A8製造",
"v": "A8製造 工體音樂"
},
{
"n": "中国MTV",
"v": "@ChineseMusicTV"
},
{
"n": "滚石",
"v": "@RockRecordsTaipei"
},
{
"n": "失傳已久",
"v": "嗨音雷虎 失傳 嗨音會所 音樂"
},
{
"n": "重低音 DJ",
"v": "重低音 DJ"
},
{
"n": "車載舞曲",
"v": "車載慢搖"
},
{
"n": "超級女聲",
"v": "超級女聲"
},
{
"n": "tseries",
"v": "@tseries"
},
{
"n": "戲曲",
"v": "秦腔 京剧 越剧 黄梅戏 评剧 豫剧 昆曲 高腔 梆子腔 河北梆子 晋剧 蒲剧 雁剧 上党梆子 武安平调 二人台 吉剧 龙江剧 越调 河南曲剧 山东梆子 淮剧 滑稽戏 婺剧 绍剧 徽剧 闽剧 莆仙戏 梨园戏 高甲戏 赣剧 采茶戏 汉剧 湘剧 祁剧 湖南花鼓戏 粤剧 潮剧 桂剧 彩调 壮剧 川剧 黔剧 滇剧 傣剧 藏剧 皮影戏"
}
]
},
{
"key": "tid",
"name": "歌手",
"value": [
{
"n": "邓丽君",
"v": "邓丽君 音乐"
},
{
"n": "林忆莲",
"v": "林忆莲 音樂"
},
{
"n": "陈慧娴",
"v": "陈慧娴音樂"
},
{
"n": "韩宝仪",
"v": "韩宝仪 音樂"
},
{
"n": "张学友",
"v": "张学友 音樂"
},
{
"n": "李宗盛",
"v": "李宗盛 音樂"
},
{
"n": "罗大佑",
"v": "罗大佑 音樂"
},
{
"n": "周杰伦",
"v": "周杰伦 音樂"
},
{
"n": "张玮伽",
"v": "张玮伽 音樂"
},
{
"n": "张惠妹",
"v": "张惠妹 音樂"
},
{
"n": "斯琴高麗",
"v": "斯琴高麗 音樂"
},
{
"n": "林俊杰",
"v": "@jjlin • 音乐"
},
{
"n": "周深",
"v": "周深 音樂"
},
{
"n": "張瑋伽",
"v": "張瑋伽 演唱會 巡演 音樂"
},
{
"n": "孫露",
"v": "孫露 演唱會 巡演 音樂"
},
{
"n": "鳳凰傳奇",
"v": "鳳凰傳奇 演 巡演 音樂"
},
{
"n": "刀郎",
"v": "刀郎 演唱會 巡演 音樂"
},
{
"n": "S.H.E",
"v": "S.H.E 演唱會 巡演 音樂"
},
{
"n": "慕容曉曉",
"v": "慕容曉曉 演唱會 巡演 音樂"
},
{
"n": "東方紅豔",
"v": "東方紅豔 演唱會 巡演 音樂"
},
{
"n": "孟庭葦",
"v": "孟庭葦 演唱會 巡演 音樂"
},
{
"n": "斯琴高麗",
"v": "斯琴高麗 演唱會 巡演 音樂"
},
{
"n": "程響",
"v": "程響 演唱會 巡演 音樂"
},
{
"n": "蔣雪兒",
"v": "蔣雪兒 演唱會 巡演 音樂"
},
{
"n": "迈克尔杰克逊",
"v": "麥可傑克森"
}
]
},
{
"key": "date",
"name": "排序/时间",
"value": [
{
"n": "默认",
"v": ""
},
{
"n": "最新",
"v": "latest"
},
{
"n": "最热",
"v": "hottest"
},
{
"n": "最高",
"v": "favorite"
},
{
"n": "当天",
"v": "day"
},
{
"n": "本周",
"v": "week"
},
{
"n": "本月",
"v": "month"
}
]
}
],
"體育": [
{
"key": "time",
"name": "時間",
"value": [
{
"n": "時間全選",
"v": ""
},
{
"n": "2025",
"v": "2025"
},
{
"n": "2024",
"v": "2024"
},
{
"n": "2023",
"v": "2023"
},
{
"n": "2022",
"v": "2022"
},
{
"n": "2021",
"v": "2021"
},
{
"n": "2020",
"v": "2020"
},
{
"n": "2019",
"v": "2019"
},
{
"n": "2018",
"v": "2018"
},
{
"n": "2017",
"v": "2017"
},
{
"n": "2016",
"v": "2016"
},
{
"n": "2015",
"v": "2015"
},
{
"n": "2014",
"v": "2014"
},
{
"n": "2013",
"v": "2013"
},
{
"n": "2012",
"v": "2012"
},
{
"n": "2011",
"v": "2011"
},
{
"n": "2010",
"v": "2010"
},
{
"n": "2009",
"v": "2009"
},
{
"n": "2008",
"v": "2008"
},
{
"n": "2007",
"v": "2007"
},
{
"n": "2006",
"v": "2006"
},
{
"n": "2005",
"v": "2005"
},
{
"n": "2004",
"v": "2004"
},
{
"n": "2003",
"v": "2003"
},
{
"n": "2002",
"v": "2002"
},
{
"n": "2001",
"v": "2001"
},
{
"n": "2000",
"v": "2000"
},
{
"n": "1999",
"v": "1999"
},
{
"n": "1998",
"v": "1998"
},
{
"n": "1997",
"v": "1997"
},
{
"n": "1996",
"v": "1996"
},
{
"n": "1995",
"v": "1995"
},
{
"n": "1994",
"v": "1994"
},
{
"n": "1993",
"v": "1993"
},
{
"n": "1992",
"v": "1992"
},
{
"n": "1991",
"v": "1991"
},
{
"n": "1990",
"v": "1990"
},
{
"n": "1989",
"v": "1989"
},
{
"n": "1988",
"v": "1988"
},
{
"n": "1987",
"v": "1987"
},
{
"n": "1986",
"v": "1986"
},
{
"n": "1985",
"v": "1985"
},
{
"n": "1984",
"v": "1984"
},
{
"n": "1983",
"v": "1983"
},
{
"n": "1982",
"v": "1982"
},
{
"n": "1981",
"v": "1981"
},
{
"n": "1980",
"v": "1980"
},
{
"n": "1979",
"v": "1979"
},
{
"n": "1978",
"v": "1978"
},
{
"n": "1977",
"v": "1977"
},
{
"n": "1976",
"v": "1976"
},
{
"n": "1975",
"v": "1975"
},
{
"n": "1974",
"v": "1974"
},
{
"n": "1973",
"v": "1973"
},
{
"n": "1972",
"v": "1972"
},
{
"n": "1971",
"v": "1971"
},
{
"n": "1970",
"v": "1970"
},
{
"n": "1969",
"v": "1969"
},
{
"n": "1968",
"v": "1968"
},
{
"n": "1967",
"v": "1967"
},
{
"n": "1966",
"v": "1966"
},
{
"n": "1965",
"v": "1965"
},
{
"n": "1964",
"v": "1964"
},
{
"n": "1963",
"v": "1963"
},
{
"n": "1962",
"v": "1962"
},
{
"n": "1961",
"v": "1961"
},
{
"n": "1960",
"v": "1960"
},
{
"n": "1959",
"v": "1959"
},
{
"n": "1958",
"v": "1958"
}
]
},
{
"key": "tid",
"name": "中文",
"value": [
{
"n": "默认",
"v": ""
},
{
"n": "休育直播",
"v": "體育直播"
},
{
"n": "休育赛事",
"v": "體育赛事"
},
{
"n": "足球比赛",
"v": "足球賽事"
},
{
"n": "篮球比赛",
"v": "篮球賽事"
},
{
"n": "极限运动",
"v": "极限運動"
},
{
"n": "室内运动",
"v": "室内運動"
},
{
"n": "户外运动",
"v": "户外運動"
},
{
"n": "瑜伽健身",
"v": "瑜珈健身"
},
{
"n": "健身运动",
"v": "健身運動"
}
]
},
{
"key": "tid",
"name": "English",
"value": [
{
"n": "Live",
"v": "live sports"
},
{
"n": "Games",
"v": "live games"
},
{
"n": "Soccer",
"v": "live soccer"
},
{
"n": "NBA",
"v": "NBA"
},
{
"n": "Extreme",
"v": "extreme sports"
},
{
"n": "InDoor",
"v": "indoor sports"
},
{
"n": "OutDoor",
"v": "outdoor sports"
},
{
"n": "Workout",
"v": "workout"
}
]
},
{
"key": "tid",
"name": "體育",
"value": [
{
"n": "女足港場",
"v": "女足港場 @Hong KongWomensStadium"
},
{
"n": "全國校運動會",
"v": "全國大專 校院運動會 全中運 女子組賽事 全國中等 學校運動會"
},
{
"n": "女中儀隊",
"v": "北一女中樂儀旗隊永續發展協會 北一女中家長會樂儀旗家長後援會 北一女中儀隊校友隊 台灣 学校运动会 景美女中儀隊 北一女樂儀旗隊 full樂儀隊 "
},
{
"n": "校園熱舞",
"v": "full 校園熱舞 開南熱無 開南大學課外活動組 女生熱舞社 南寶熱舞社 寶踐熱舞社 NTDC 熱舞社 STUST"
},
{
"n": "红星体育官方频道",
"v": "红星体育官方频道【高清直播】"
},
{
"n": "中國體育比賽傳奇",
"v": "中國體育比賽傳奇"
},
{
"n": "愛爾達體育家族",
"v": "愛爾達體育家族 ELTA Sports"
},
{
"n": "公視體育",
"v": "公視體育"
},
{
"n": "體育之光",
"v": "體育之光"
},
{
"n": "偶然體育賽事",
"v": "偶然體育賽事"
}
]
},
{
"key": "date",
"name": "排序/时间",
"value": [
{
"n": "默认",
"v": ""
},
{
"n": "最新",
"v": "latest"
},
{
"n": "最热",
"v": "hottest"
},
{
"n": "最高",
"v": "favorite"
},
{
"n": "当天",
"v": "day"
},
{
"n": "本周",
"v": "week"
},
{
"n": "本月",
"v": "month"
}
]
}
],
"時尚": [
{
"key": "tid",
"name": "时装秀",
"value": [
{
"n": "街舞",
"v": "街舞"
},
{
"n": "時裝秀",
"v": "hdr ASM lingerieTV 東京ファッションショー 下着ショー"
},
{
"n": "潮流秀",
"v": "FASHION IN UHD"
},
{
"n": "時尚走秀",
"v": "時尚走秀 Fashion show"
},
{
"n": "时装模特",
"v": "FASHION Runway"
},
{
"n": "模特",
"v": "比基尼 泳裝 頂級車模 空姐 寫真 Car model Stewardess Portrait"
},
{
"n": "裸体秀",
"v": "hdr 人體藝術 裸体秀 Nude show"
},
{
"n": "無限亂鬥",
"v": "hdr 廟會秀 無限HD 公廟 鋼管舞 脫衣舞 舞女 清純 寫真"
}
]
},
{
"key": "tid",
"name": "小姐姐",
"value": [
{
"n": "小姐姐超清",
"v": "小姐姐超清"
},
{
"n": "国内小姐姐",
"v": "国内小姐姐"
},
{
"n": "韩国小姐姐",
"v": "韩国小姐姐"
},
{
"n": "日本小姐姐",
"v": "日本小姐姐"
},
{
"n": "俄罗斯小姐姐",
"v": "俄罗斯小姐姐"
},
{
"n": "混血小姐姐",
"v": "混血小姐姐"
},
{
"n": "越南小姐姐",
"v": "越南小姐姐"
},
{
"n": "Al小姐姐",
"v": "Al美女超清"
},
{
"n": "抖音热门小姐姐",
"v": "抖音热门小姐姐"
},
{
"n": "快手热门美女",
"v": "快手热门美女"
},
{
"n": "打碟小姐姐",
"v": "打碟小姐姐"
},
{
"n": "冲浪小姐姐",
"v": "冲浪小姐姐"
},
{
"n": "蹦迪小姐姐",
"v": "蹦迪小姐姐"
},
{
"n": "艺校小姐姐",
"v": "艺校小姐姐"
},
{
"n": "环球小姐",
"v": "环球小姐"
},
{
"n": "泰国人妖",
"v": "泰国人妖"
},
{
"n": "人间胸器",
"v": "人间胸器"
}
]
},
{
"key": "tid",
"name": "English",
"value": [
{
"n": "sexy Miss",
"v": "sexy Miss"
},
{
"n": "Hot sexy Girl",
"v": "Hot sexy Girl"
},
{
"n": "Korean Girl",
"v": "Korean sexy Girl"
},
{
"n": "Japanese Girl",
"v": "Japanese sexy Girl"
},
{
"n": "Russian Girl",
"v": "Russian sexy Girl"
},
{
"n": "Vietnamese Girl",
"v": "Vietnamese sexy Girl"
},
{
"n": "AI Girl",
"v": "AI Girl"
},
{
"n": "TikTok Hot Siste",
"v": "TikTok Hot sexy Girl"
},
{
"n": "Cute Girl",
"v": "sexy Cute Girl"
},
{
"n": "Girl Dj",
"v": "sexy Girl Dj"
},
{
"n": "Girl Surfer",
"v": "sexy Girl Surfer"
},
{
"n": "Dance Girl",
"v": "Dance sexy Girl"
},
{
"n": "Miss Universe",
"v": "Miss Universe"
},
{
"n": "Thai Shemale",
"v": "Thai Shemale"
}
]
},
{
"key": "date",
"name": "排序/时间",
"value": [
{
"n": "默认",
"v": ""
},
{
"n": "最新",
"v": "latest"
},
{
"n": "最热",
"v": "hottest"
},
{
"n": "最高",
"v": "favorite"
},
{
"n": "当天",
"v": "day"
},
{
"n": "本周",
"v": "week"
},
{
"n": "本月",
"v": "month"
}
]
}
],
"解說": [
{
"key": "tid",
"name": "頻道主",
"value": [
{
"n": "宇哥侃故事",
"v": "PL 宇哥侃故事"
},
{
"n": "零度解说",
"v": "PL 零度解说"
}
]
},
{
"key": "date",
"name": "排序/时间",
"value": [
{
"n": "默认",
"v": ""
},
{
"n": "最新",
"v": "latest"
},
{
"n": "最热",
"v": "hottest"
},
{
"n": "最高",
"v": "favorite"
},
{
"n": "当天",
"v": "day"
},
{
"n": "本周",
"v": "week"
},
{
"n": "本月",
"v": "month"
}
]
}
],
"战情室": [
{
"key": "tid",
"name": "栏目",
"value": [
{
"n": "军情观察室",
"v": "|PL-K7NYq6mtAuw3rO7t2rDUhI3qbS1rLMj"
},
{
"n": "环球大战线",
"v": "|PLwHjhKNud0GiqFBpW5aorjeIVO4mZAn_b"
},
{
"n": "少康战情室",
"v": "|PL64Si-sSRnvZFmksKhDl34-Rgv2NGFbK-"
},
{
"n": "国际直球对决",
"v": "|PLvHT0yeWYIuASUZjoW8OXe4e_UkgP7qDU"
},
{
"n": "全球大视野",
"v": "|PLvHT0yeWYIuDyLVv1yDiIxhtk1ZQ92_RY"
},
{
"n": "前进战略高地",
"v": "|PLvHT0yeWYIuBGUWA2KySjgKdPEUFuM8Dc"
},
{
"n": "全广角",
"v": "|PL7I7pJTFhwdoALXJ4QyPjaCIRNm2qBCpU"
}
]
}
],
"自媒體": [
{
"key": "tid",
"name": "频道主",
"value": [
{
"n": "cctv电视剧",
"v": "UC7Vl0YiY0rDlovqcCFN4yTA"
},
{
"n": "王剑每日观察",
"v": "PD王剑每日观察"
},
{
"n": "红岸视野",
"v": "PD红岸视野"
},
{
"n": "私人局",
"v": "PD私人局"
},
{
"n": "内部看美国",
"v": "PD内部看美国"
},
{
"n": "饭圈人间观察",
"v": "PD饭圈人间观察"
},
{
"n": "孤烟暮蝉",
"v": "PD孤烟暮蝉"
},
{
"n": "老高与小茉",
"v": "PD老高与小茉"
},
{
"n": "海洋探险",
"v": "UCJUIqG9JUcQ5saqXSYTF0gg"
}
]
}
],
"HDR": [
{
"key": "tid",
"name": "風景",
"value": [
{
"n": "運動",
"v": "GoPro 女翼裝飛行 極限自行車運動"
},
{
"n": "風景",
"v": "hdr 大自然"
},
{
"n": "Links TV 頻道主",
"v": "@linksphotograph Links TV hdr"
},
{
"n": "放鬆",
"v": "hdr 放鬆"
},
{
"n": "動物世界",
"v": "hdr 動物世界 Carnivorous Animals"
},
{
"n": "深海世界",
"v": "hdr 深海世界 Invertebrate Fish"
},
{
"n": "飛禽走獸",
"v": "hdr Birds of Prey Columbiform Birds Passerine Birds"
},
{
"n": "生物世界",
"v": "hdr 生物世界 Amphibians Reptiles"
}
]
}
],
"Full YouTube": [
{
"key": "tid",
"name": "頻道主",
"value": [
{
"n": "李子柒",
"v": "李子柒 Liziqi @cnliziqi"
},
{
"n": "滇西小哥",
"v": "滇西小哥 @dianxixiaoge"
},
{
"n": "老高與小茉",
"v": "老高與小茉 @laogao"
},
{
"n": "李永樂老師",
"v": "李永樂老師 @TchLiyongle"
}
]
},
{
"key": "tid",
"name": "美食頻道主",
"value": [
{
"n": "美食作家王刚",
"v": "美食作家王刚 @chefwang"
},
{
"n": "小高姐的 Magic Ingredients",
"v": "小高姐的 Magic Ingredients @MagicIngredients"
},
{
"n": "小穎美食",
"v": "小穎美食 @XiaoYingFood"
}
]
},
{
"key": "tid",
"name": "野外頻道主",
"value": [
{
"n": "野外求生",
"v": "@primitivetechnology9550"
}
]
},
{
"key": "tid",
"name": "科普频道主",
"value": [
{
"n": "科普",
"v": "Mr Beast@MrBeast"
},
{
"n": "航天大學",
"v": "Airforceproud95 @Airforceproud95"
},
{
"n": "世界大戰",
"v": "TheGreatWar @TheGreatWar"
},
{
"n": "MarkRober",
"v": "Mark Rober @MarkRober"
}
]
},
{
"key": "tid",
"name": "教材",
"value": [
{
"n": "不良林",
"v": "不良林"
},
{
"n": "涌哥侃侃",
"v": "涌哥侃侃 @ygkkk"
},
{
"n": "悟空的日常",
"v": "悟空的日常"
}
]
},
{
"key": "date",
"name": "排序/时间",
"value": [
{
"n": "默认",
"v": ""
},
{
"n": "最新",
"v": "latest"
},
{
"n": "最热",
"v": "hottest"
},
{
"n": "最高",
"v": "favorite"
},
{
"n": "当天",
"v": "day"
},
{
"n": "本周",
"v": "week"
},
{
"n": "本月",
"v": "month"
}
]
}
],
"宇宙": [
{
"key": "tid",
"name": "科普知識",
"value": [
{
"n": "宇宙",
"v": "光年 黑洞 銀河系 空間站 太空技術"
},
{
"n": "粒子",
"v": "空間粒子 宇宙磁場 四維空間 元素 量子 光波 光源 靈魂"
},
{
"n": "靠蒙",
"v": "microorganism"
}
]
},
{
"key": "tid",
"name": "歷史科普",
"value": [
{
"n": "世界大戰",
"v": "世界大戰 二戰 日侵 八國聯軍"
},
{
"n": "人物",
"v": "古代名人 歷史名人 歷代祖先"
},
{
"n": "生物進化史",
"v": "人類進化 微生物進化 動物進化 地球進化"
},
{
"v": "歷史 History"
}
]
},
{
"key": "date",
"name": "排序/时间",
"value": [
{
"n": "默认",
"v": ""
},
{
"n": "最新",
"v": "latest"
},
{
"n": "最热",
"v": "hottest"
},
{
"n": "最高",
"v": "favorite"
},
{
"n": "当天",
"v": "day"
},
{
"n": "本周",
"v": "week"
},
{
"n": "本月",
"v": "month"
}
]
}
]
},
"jx": 0,
"parse": 0
}
BIN
View File
Binary file not shown.
+1 -1
View File
@@ -1 +1 @@
2bcfe51e523f1b2c0cd7834db0dea613
c3e1076058635dd37ca90220add97dc1
+3228
View File
@@ -0,0 +1,3228 @@
#coding=utf-8
#!/usr/bin/python
import re
import os
import sys
import json
import html
import time
from urllib.parse import quote, unquote, parse_qs, urlencode, urlparse, urlunparse, urljoin
import requests
from base.spider import Spider
sys.path.append('..')
# ---------- 日志路径 ----------
# DEBUG_LOG = '/storage/emulated/0/源码/ytb_debug.log'
def _ensure_log_dir():
try:
log_dir = os.path.dirname(DEBUG_LOG)
if log_dir and not os.path.exists(log_dir):
os.makedirs(log_dir, exist_ok=True)
except:
pass
_ensure_log_dir()
def debug_log(message, data=None):
try:
log_dir = os.path.dirname(DEBUG_LOG)
if log_dir and not os.path.exists(log_dir):
os.makedirs(log_dir, exist_ok=True)
line = f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] {message}"
if data is not None:
if isinstance(data, (dict, list)):
line += ' ' + json.dumps(data, ensure_ascii=False, default=str)
else:
line += ' ' + str(data)
with open(DEBUG_LOG, 'a', encoding='utf-8') as f:
f.write(line + '\n')
except Exception:
pass
# ==================== 从 youtube.json 加载分类和过滤器 ====================
YOUTUBE_CLASSES = [
{"type_name": "推荐", "type_id": "YouTube 直播 24小時"},
{"type_id": "YouTube 新聞 Live", "type_name": "新闻"},
{"type_id": "劇集", "type_name": "剧集"},
{"type_id": "電影", "type_name": "电影"},
{"type_id": "动画片", "type_name": "动画片"},
{"type_id": "綜藝", "type_name": "综艺"},
{"type_id": "短劇", "type_name": "短剧"},
{"type_id": "紀錄片", "type_name": "纪录片"},
{"type_id": "體育", "type_name": "体育"},
{"type_id": "音樂", "type_name": "音乐"},
{"type_id": "放松", "type_name": "放松"},
{"type_id": "時尚潮流", "type_name": "时尚潮流"},
{"type_id": "宇宙", "type_name": "科普"},
{"type_id": "科技", "type_name": "科技"},
{"type_id": "解說", "type_name": "解说"},
{"type_id": "神秘", "type_name": "神秘"},
{"type_id": "4K", "type_name": "4K"},
{"type_id": "16K HDR", "type_name": "16K HDR"},
{"type_id": "LIST:自媒體 We Media,零度解说 @lingdujieshuo,老高與小茉 @laogao,李子柒 Liziqi @cnliziqi,康1+1 @user-mr5bh4bk8z,不良林,涌哥侃侃 @ygkkk,悟空的日常,Learn English with EnglishClass101.com,Speak English With Vanessa,Tangerine Academy,听笙阁 @tingshengge,李永樂老師 @TchLiyongle,滇西小哥 @dianxixiaoge,脑洞乌托邦 @NDWTB,自说自话的总裁 @STBoss,老肉雜談 @老肉雜談,老饭骨 @LaoFanGu,小高姐的 Magic Ingredients @MagicIngredients,小穎美食 @XiaoYingFood,primitivetechnology9550 @primitivetechnology9550,Mr Beast@MrBeast,Airforceproud95 @Airforceproud95,TheGreatWar @TheGreatWar,Mark Rober @MarkRober", "type_name": "自媒体"}
]
CATEGORY_FILTERS = {
"YouTube 直播 24小時": [
{
"key": "tid",
"name": "中文",
"value": [
{"n": "默认", "v": "鳳凰衛視 @phoenixtv 中天新闻不斷電直播"},
{"n": "鳳凰衛視", "v": "大事發生看鳳凰 鳳凰 鳳凰衛視 @phoenixtv"},
{"n": "中天新闻", "v": "直播 中天新闻"}
]
}
],
"短劇": [
{
"key": "time",
"name": "時間",
"value": [
{"n": "時間全選", "v": ""},
{"n": "2025", "v": "2025"},
{"n": "2024", "v": "2024"},
{"n": "2023", "v": "2023"},
{"n": "2022", "v": "2022"},
{"n": "2021", "v": "2021"},
{"n": "2020", "v": "2020"},
{"n": "2019", "v": "2019"},
{"n": "2018", "v": "2018"},
{"n": "2017", "v": "2017"},
{"n": "2016", "v": "2016"},
{"n": "2015", "v": "2015"},
{"n": "2014", "v": "2014"},
{"n": "2013", "v": "2013"},
{"n": "2012", "v": "2012"},
{"n": "2011", "v": "2011"},
{"n": "2010", "v": "2010"},
{"n": "2009", "v": "2009"},
{"n": "2008", "v": "2008"},
{"n": "2007", "v": "2007"},
{"n": "2006", "v": "2006"},
{"n": "2005", "v": "2005"},
{"n": "2004", "v": "2004"},
{"n": "2003", "v": "2003"},
{"n": "2002", "v": "2002"},
{"n": "2001", "v": "2001"},
{"n": "2000", "v": "2000"},
{"n": "1999", "v": "1999"},
{"n": "1998", "v": "1998"},
{"n": "1997", "v": "1997"},
{"n": "1996", "v": "1996"},
{"n": "1995", "v": "1995"},
{"n": "1994", "v": "1994"},
{"n": "1993", "v": "1993"},
{"n": "1992", "v": "1992"},
{"n": "1991", "v": "1991"},
{"n": "1990", "v": "1990"},
{"n": "1989", "v": "1989"},
{"n": "1988", "v": "1988"},
{"n": "1987", "v": "1987"},
{"n": "1986", "v": "1986"},
{"n": "1985", "v": "1985"},
{"n": "1984", "v": "1984"},
{"n": "1983", "v": "1983"},
{"n": "1982", "v": "1982"},
{"n": "1981", "v": "1981"},
{"n": "1980", "v": "1980"},
{"n": "1979", "v": "1979"},
{"n": "1978", "v": "1978"},
{"n": "1977", "v": "1977"},
{"n": "1976", "v": "1976"},
{"n": "1975", "v": "1975"},
{"n": "1974", "v": "1974"},
{"n": "1973", "v": "1973"},
{"n": "1972", "v": "1972"},
{"n": "1971", "v": "1971"},
{"n": "1970", "v": "1970"},
{"n": "1969", "v": "1969"},
{"n": "1968", "v": "1968"},
{"n": "1967", "v": "1967"},
{"n": "1966", "v": "1966"},
{"n": "1965", "v": "1965"},
{"n": "1964", "v": "1964"},
{"n": "1963", "v": "1963"},
{"n": "1962", "v": "1962"},
{"n": "1961", "v": "1961"},
{"n": "1960", "v": "1960"},
{"n": "1959", "v": "1959"},
{"n": "1958", "v": "1958"}
]
},
{
"key": "tid",
"name": "短劇",
"value": [
{"n": "抖音", "v": "抖音 短剧"},
{"n": "快手", "v": "快手 短剧"},
{"n": "大陆", "v": "大陆 短剧"},
{"n": "香港", "v": "香港 短剧"},
{"n": "澳門", "v": "澳門 短剧"},
{"n": "台湾", "v": "台湾 短剧"},
{"n": "新加坡", "v": "新加坡 短剧"},
{"n": "馬來西亞", "v": "馬來西亞 短剧"},
{"n": "泰國", "v": "泰國 短剧"},
{"n": "越南", "v": "越南 短剧"},
{"n": "印度", "v": "印度 短剧"},
{"n": "韩国", "v": "韩国 短剧"},
{"n": "日本", "v": "日本 短剧"},
{"n": "欧美", "v": "欧美 短剧"},
{"n": "腾讯", "v": "腾讯 短剧"},
{"n": "爱奇艺", "v": "爱奇艺 短剧"},
{"n": "优酷", "v": "优酷 短剧"},
{"n": "芒果", "v": "芒果TV 短剧"},
{"n": "搜狐", "v": "搜狐 短剧"}
]
},
{
"key": "tid",
"name": "短劇",
"value": [
{"n": "都市", "v": "@Urbanshort-TV 都市 短劇"},
{"n": "爱情", "v": "爱情 短劇"},
{"n": "复仇", "v": "复仇 短劇"},
{"n": "霸总", "v": "霸总 短劇"},
{"n": "萌宝", "v": "萌宝 短劇"},
{"n": "古装", "v": "古装 短劇"},
{"n": "穿越", "v": "穿越 短劇"},
{"n": "喜剧", "v": "喜剧 短劇"},
{"n": "奇幻", "v": "奇幻 短劇"},
{"n": "九酱爱追剧", "v": "@NineSauceDramaTV"},
{"n": "百万好剧场", "v": "@1-pw5ox"},
{"n": "咖啡追剧", "v": "@@coffeedrama605"},
{"n": "斗罗短剧", "v": "@DouluoDrama123 斗羅短劇"},
{"n": "嘟嘟剧场", "v": "@DUDUJUCHANG"},
{"n": "牛牛短剧", "v": "@niuniuduanju"}
]
}
],
"动画片": [
{
"key": "time",
"name": "時間",
"value": [
{"n": "時間全選", "v": ""},
{"n": "2024", "v": "2024"},
{"n": "2023", "v": "2023"},
{"n": "2022", "v": "2022"},
{"n": "2021", "v": "2021"},
{"n": "2020", "v": "2020"},
{"n": "2019", "v": "2019"},
{"n": "2018", "v": "2018"},
{"n": "2017", "v": "2017"},
{"n": "2016", "v": "2016"},
{"n": "2015", "v": "2015"},
{"n": "2014", "v": "2014"},
{"n": "2013", "v": "2013"},
{"n": "2012", "v": "2012"},
{"n": "2011", "v": "2011"},
{"n": "2010", "v": "2010"},
{"n": "2009", "v": "2009"},
{"n": "2008", "v": "2008"},
{"n": "2007", "v": "2007"},
{"n": "2006", "v": "2006"},
{"n": "2005", "v": "2005"},
{"n": "2004", "v": "2004"},
{"n": "2003", "v": "2003"},
{"n": "2002", "v": "2002"},
{"n": "2001", "v": "2001"},
{"n": "2000", "v": "2000"},
{"n": "1999", "v": "1999"},
{"n": "1998", "v": "1998"},
{"n": "1997", "v": "1997"},
{"n": "1996", "v": "1996"},
{"n": "1995", "v": "1995"},
{"n": "1994", "v": "1994"},
{"n": "1993", "v": "1993"},
{"n": "1992", "v": "1992"},
{"n": "1991", "v": "1991"},
{"n": "1990", "v": "1990"},
{"n": "1989", "v": "1989"},
{"n": "1988", "v": "1988"},
{"n": "1987", "v": "1987"},
{"n": "1986", "v": "1986"},
{"n": "1985", "v": "1985"},
{"n": "1984", "v": "1984"},
{"n": "1983", "v": "1983"},
{"n": "1982", "v": "1982"},
{"n": "1981", "v": "1981"},
{"n": "1980", "v": "1980"},
{"n": "1979", "v": "1979"},
{"n": "1978", "v": "1978"},
{"n": "1977", "v": "1977"},
{"n": "1976", "v": "1976"},
{"n": "1975", "v": "1975"},
{"n": "1974", "v": "1974"},
{"n": "1973", "v": "1973"},
{"n": "1972", "v": "1972"},
{"n": "1971", "v": "1971"},
{"n": "1970", "v": "1970"},
{"n": "1969", "v": "1969"},
{"n": "1968", "v": "1968"},
{"n": "1967", "v": "1967"},
{"n": "1966", "v": "1966"},
{"n": "1965", "v": "1965"},
{"n": "1964", "v": "1964"},
{"n": "1963", "v": "1963"},
{"n": "1962", "v": "1962"},
{"n": "1961", "v": "1961"},
{"n": "1960", "v": "1960"},
{"n": "1959", "v": "1959"},
{"n": "1958", "v": "1958"}
]
},
{
"key": "tid",
"name": "中文",
"value": [
{"n": "默认中文国漫", "v": "國漫 劇集 3D"},
{"n": "默认", "v": "animation"},
{"n": "儿童早教", "v": "儿童早教"},
{"n": "儿童歌曲", "v": "儿童歌曲"},
{"n": "儿童音乐", "v": "儿童音乐"},
{"n": "儿童绘画", "v": "儿童绘画"},
{"n": "宝宝巴士", "v": "宝宝巴士"},
{"n": "儿歌多多", "v": "儿歌多多"},
{"n": "儿童英语启蒙", "v": "儿童英语启蒙"},
{"n": "儿童启蒙故事", "v": "儿童启蒙故事"},
{"n": "儿童安全教育", "v": "儿童安全教育"}
]
},
{
"key": "tid",
"name": "English",
"value": [
{"n": "默认英文国漫", "v": "3D Chinese cartoon"},
{"n": "小猪佩奇", "v": "@PeppaPigChineseOfficial 小猪佩奇 中文官方 - Peppa Pig"},
{"n": "CoComelon", "v": "@CoComelon"},
{"n": "合集", "v": "Anime ENG SUB 合集"},
{"n": "国漫社", "v": "@Animation 次元 苍穹动漫 PP看动漫 公馆"},
{"n": "国漫工厂", "v": "@3DGuoman SUB"},
{"n": "阅文动漫", "v": "@yuewenanimation SUB"},
{"n": "哔哩", "v": "@madebybilibili 哔哩动漫"},
{"n": "腾讯", "v": "@TencentVideoAnimation SUB"},
{"n": "优酷", "v": "@youkuanimation 优酷动漫"},
{"n": "爱奇艺", "v": "@iQIYIAnime 爱奇艺动漫"}
]
}
],
"YouTube 新聞 Live": [
{
"key": "tid",
"name": "中文",
"value": [
{"n": "默认", "v": "中天新闻24小時 大事發生看鳳凰 鳳凰 鳳凰衛視 @phoenixtv 三立LIVE新闻 台視新聞 東森新聞 TVBSNEWS"},
{"n": "鳳凰衛視", "v": "大事發生看鳳凰 鳳凰 鳳凰衛視 @phoenixtv"},
{"n": "中天新闻", "v": "直播 中天新闻"},
{"n": "TVBSEWS", "v": "直播 TVBSNEWS"},
{"n": "東森新聞 CH51", "v": "直播 東森新聞 CH51"},
{"n": "三立LIVE新闻", "v": "直播 三立LIVE新闻 @setnews "},
{"n": "台視新聞台HD", "v": "直播 台視新聞 TTV NEWS"},
{"n": "中視新聞 HD", "v": "直播 Taiwan CTV news HD Live"},
{"n": "港台", "v": "直播 港台"},
{"n": "赛事", "v": "直播 赛事"},
{"n": "CCTV", "v": "直播 CCTV"},
{"n": "CNA", "v": "@channelnewsasia"}
]
},
{
"key": "tid",
"name": "English",
"value": [
{"n": "Live", "v": "live"},
{"n": "CNN", "v": "live CNN"},
{"n": "BBC", "v": "live BBC"},
{"n": "CBS", "v": "@CBSNews"},
{"n": "ABC", "v": "live ABC NEWS"},
{"n": "NBC", "v": "@NBCNews"},
{"n": "LiveNOW from FOX", "v": "@livenowfox"},
{"n": "Sky News", "v": "@SkyNews"},
{"n": "euronews", "v": "@euronews"},
{"n": "GBNews", "v": "@GBNewsOnline"},
{"n": "Al Jazeera English", "v": "@aljazeeraenglish"},
{"n": "ABCNews (Australia)", "v": "@abcnewsaustralia"},
{"n": "FRANCE 24 English", "v": "live FRANCE 24 English"},
{"n": "Reuters", "v": "live Reuters"}
]
},
{
"key": "tid",
"name": "中文",
"value": [
{"n": "默认", "v": "News"},
{"n": "News", "v": "news"},
{"n": "时政", "v": "时政 新闻"},
{"n": "体育", "v": "体育 新闻"},
{"n": "大陆", "v": "大陆 新闻"},
{"n": "HKTVB", "v": "@tvbnewsofficial"},
{"n": "少康戰情室", "v": " @tvbssituationroom"},
{"n": "政经龙凤配", "v": " @觀點"},
{"n": "FOCUS全球新闻", "v": " @TVBSNEWS FOCUS全球新闻"},
{"n": "新闻大白话", "v": " @TVBSNEWS 新闻大白话"},
{"n": "东森新闻", "v": "关键时刻新闻"},
{"n": "港台", "v": "港台 新闻"}
]
},
{
"key": "tid",
"name": "English",
"value": [
{"n": "科技與發展", "v": "閱兵 奧運會 航母 航空母艦 潛水艇 核武器 坦克 武器 卫星 火箭 輪船 飛機 飛碟"},
{"n": "法治与社会", "v": "法治 法制 社会 卖淫 淫秽 污蔑 赌博 毒品 裸聊 诈骗 拐卖 强奸 勒索"},
{"n": "News", "v": "News"},
{"n": "CNN", "v": "CNN news"},
{"n": "BBC", "v": "BBC news"}
]
}
],
"劇集": [
{
"key": "time",
"name": "時間",
"value": [
{"n": "時間全選", "v": ""},
{"n": "2024", "v": "2024"},
{"n": "2023", "v": "2023"},
{"n": "2022", "v": "2022"},
{"n": "2021", "v": "2021"},
{"n": "2020", "v": "2020"},
{"n": "2019", "v": "2019"},
{"n": "2018", "v": "2018"},
{"n": "2017", "v": "2017"},
{"n": "2016", "v": "2016"},
{"n": "2015", "v": "2015"},
{"n": "2014", "v": "2014"},
{"n": "2013", "v": "2013"},
{"n": "2012", "v": "2012"},
{"n": "2011", "v": "2011"},
{"n": "2010", "v": "2010"},
{"n": "2009", "v": "2009"},
{"n": "2008", "v": "2008"},
{"n": "2007", "v": "2007"},
{"n": "2006", "v": "2006"},
{"n": "2005", "v": "2005"},
{"n": "2004", "v": "2004"},
{"n": "2003", "v": "2003"},
{"n": "2002", "v": "2002"},
{"n": "2001", "v": "2001"},
{"n": "2000", "v": "2000"},
{"n": "1999", "v": "1999"},
{"n": "1998", "v": "1998"},
{"n": "1997", "v": "1997"},
{"n": "1996", "v": "1996"},
{"n": "1995", "v": "1995"},
{"n": "1994", "v": "1994"},
{"n": "1993", "v": "1993"},
{"n": "1992", "v": "1992"},
{"n": "1991", "v": "1991"},
{"n": "1990", "v": "1990"},
{"n": "1989", "v": "1989"},
{"n": "1988", "v": "1988"},
{"n": "1987", "v": "1987"},
{"n": "1986", "v": "1986"},
{"n": "1985", "v": "1985"},
{"n": "1984", "v": "1984"},
{"n": "1983", "v": "1983"},
{"n": "1982", "v": "1982"},
{"n": "1981", "v": "1981"},
{"n": "1980", "v": "1980"},
{"n": "1979", "v": "1979"},
{"n": "1978", "v": "1978"},
{"n": "1977", "v": "1977"},
{"n": "1976", "v": "1976"},
{"n": "1975", "v": "1975"},
{"n": "1974", "v": "1974"},
{"n": "1973", "v": "1973"},
{"n": "1972", "v": "1972"},
{"n": "1971", "v": "1971"},
{"n": "1970", "v": "1970"},
{"n": "1969", "v": "1969"},
{"n": "1968", "v": "1968"},
{"n": "1967", "v": "1967"},
{"n": "1966", "v": "1966"},
{"n": "1965", "v": "1965"},
{"n": "1964", "v": "1964"},
{"n": "1963", "v": "1963"},
{"n": "1962", "v": "1962"},
{"n": "1961", "v": "1961"},
{"n": "1960", "v": "1960"},
{"n": "1959", "v": "1959"},
{"n": "1958", "v": "1958"}
]
},
{
"key": "tid",
"name": "中文",
"value": [
{"n": "默認", "v": ""},
{"n": "華語熱播電視劇官方頻道", "v": "華語熱播電視劇官方頻道"},
{"n": "TVB国语", "v": "TVB Drama 国语剧场"},
{"n": "粵劇", "v": "粵劇 劇集"},
{"n": "TVB", "v": "@TVB"},
{"n": "国剧放映社", "v": "国剧放映社"},
{"n": "大陆", "v": "大陆 剧集"},
{"n": "腾讯", "v": "腾讯 剧集"},
{"n": "爱奇艺", "v": "爱奇艺 剧集"},
{"n": "优酷", "v": "优酷 剧集"},
{"n": "芒果", "v": "芒果TV 剧集"},
{"n": "搜狐", "v": "搜狐 剧集"},
{"n": "华数", "v": "华数 剧集"},
{"n": "港台", "v": "港台 剧集"},
{"n": "美国", "v": "美国 Full Episode 完整剧集"},
{"n": "Netflix", "v": "Netflix Full Episode 完整剧集"},
{"n": "Disney", "v": "disney Full Episode 完整剧集"},
{"n": "Apple", "v": "apple Full Episode 完整剧集"},
{"n": "Amazon", "v": "amazon Full Episode 完整剧集"},
{"n": "HBO", "v": "hbo Full Episode 完整剧集"},
{"n": "韩国", "v": "韩国 剧集"},
{"n": "日本", "v": "日本 剧集"},
{"n": "英国", "v": "英国 Full Episode 完整剧集"}
]
},
{
"key": "tid",
"name": "English",
"value": [
{"n": "Drama", "v": "Full Episode drama"},
{"n": "US", "v": "drama Full Episode US"},
{"n": "Netflix", "v": "netflix Full Episode drama"},
{"n": "Disney", "v": "disney Full Episode drama"},
{"n": "Apple", "v": "apple Full Episode drama"},
{"n": "Amazon", "v": "amazon Full Episode drama"},
{"n": "HBO", "v": "hbo Full Episode drama"},
{"n": "Korea", "v": "korea Full Episode drama"},
{"n": "Japan", "v": "japan Full Episode drama"},
{"n": "UK", "v": "uk Full Episode drama"}
]
}
],
"電影": [
{
"key": "time",
"name": "時間",
"value": [
{"n": "時間全選", "v": ""},
{"n": "2026", "v": "2026"},
{"n": "2025", "v": "2025"},
{"n": "2024", "v": "2024"},
{"n": "2023", "v": "2023"},
{"n": "2022", "v": "2022"},
{"n": "2021", "v": "2021"},
{"n": "2020", "v": "2020"},
{"n": "2019", "v": "2019"},
{"n": "2018", "v": "2018"},
{"n": "2017", "v": "2017"},
{"n": "2016", "v": "2016"},
{"n": "2015", "v": "2015"},
{"n": "2014", "v": "2014"},
{"n": "2013", "v": "2013"},
{"n": "2012", "v": "2012"},
{"n": "2011", "v": "2011"},
{"n": "2010", "v": "2010"},
{"n": "2009", "v": "2009"},
{"n": "2008", "v": "2008"},
{"n": "2007", "v": "2007"},
{"n": "2006", "v": "2006"},
{"n": "2005", "v": "2005"},
{"n": "2004", "v": "2004"},
{"n": "2003", "v": "2003"},
{"n": "2002", "v": "2002"},
{"n": "2001", "v": "2001"},
{"n": "2000", "v": "2000"},
{"n": "1999", "v": "1999"},
{"n": "1998", "v": "1998"},
{"n": "1997", "v": "1997"},
{"n": "1996", "v": "1996"},
{"n": "1995", "v": "1995"},
{"n": "1994", "v": "1994"},
{"n": "1993", "v": "1993"},
{"n": "1992", "v": "1992"},
{"n": "1991", "v": "1991"},
{"n": "1990", "v": "1990"},
{"n": "1989", "v": "1989"},
{"n": "1988", "v": "1988"},
{"n": "1987", "v": "1987"},
{"n": "1986", "v": "1986"},
{"n": "1985", "v": "1985"},
{"n": "1984", "v": "1984"},
{"n": "1983", "v": "1983"},
{"n": "1982", "v": "1982"},
{"n": "1981", "v": "1981"},
{"n": "1980", "v": "1980"},
{"n": "1979", "v": "1979"},
{"n": "1978", "v": "1978"},
{"n": "1977", "v": "1977"},
{"n": "1976", "v": "1976"},
{"n": "1975", "v": "1975"},
{"n": "1974", "v": "1974"},
{"n": "1973", "v": "1973"},
{"n": "1972", "v": "1972"},
{"n": "1971", "v": "1971"},
{"n": "1970", "v": "1970"},
{"n": "1969", "v": "1969"},
{"n": "1968", "v": "1968"},
{"n": "1967", "v": "1967"},
{"n": "1966", "v": "1966"},
{"n": "1965", "v": "1965"},
{"n": "1964", "v": "1964"},
{"n": "1963", "v": "1963"},
{"n": "1962", "v": "1962"},
{"n": "1961", "v": "1961"},
{"n": "1960", "v": "1960"},
{"n": "1959", "v": "1959"},
{"n": "1958", "v": "1958"}
]
},
{
"key": "tid",
"name": "中文",
"value": [
{"n": "默認", "v": ""},
{"n": "大陆", "v": "大陆 电影"},
{"n": "腾讯", "v": "腾讯 电影"},
{"n": "爱奇艺", "v": "爱奇艺 电影"},
{"n": "优酷", "v": "优酷 电影"},
{"n": "芒果", "v": "芒果TV 电影"},
{"n": "搜狐", "v": "搜狐 电影"},
{"n": "港台", "v": "港台 电影"},
{"n": "美国", "v": "美国 电影"},
{"n": "Netflix", "v": "netflix Full movie 电影"},
{"n": "Disney", "v": "disney Full movie 电影"},
{"n": "Apple", "v": "apple Full movie 电影"},
{"n": "Amazon", "v": "amazon Full movie 电影"},
{"n": "HBO", "v": "hbo Full movie 电影"},
{"n": "韩国", "v": "韩国 Full movie 电影"},
{"n": "日本", "v": "日本 Full movie 电影"},
{"n": "英国", "v": "英国 Full movie 电影"}
]
},
{
"key": "tid",
"name": "English",
"value": [
{"n": "movie", "v": "youtube movies Full movie"},
{"n": "US", "v": "us Full movie movie"},
{"n": "Netflix movie", "v": "netflix Full movie movie"},
{"n": "Disney", "v": "disney Full movie movie"},
{"n": "Apple", "v": "apple Full movie movie"},
{"n": "Amazon", "v": "amazon Full movie movie"},
{"n": "HBO", "v": "hbo Full movie movie"},
{"n": "Koera", "v": "korea Full movie movie"},
{"n": "Japan", "v": "japan Full movie movie"},
{"n": "UK", "v": "uk Full movie movie"}
]
}
],
"綜藝": [
{
"key": "time",
"name": "時間",
"value": [
{"n": "時間全選", "v": ""},
{"n": "2024", "v": "2024"},
{"n": "2023", "v": "2023"},
{"n": "2022", "v": "2022"},
{"n": "2021", "v": "2021"},
{"n": "2020", "v": "2020"},
{"n": "2019", "v": "2019"},
{"n": "2018", "v": "2018"},
{"n": "2017", "v": "2017"},
{"n": "2016", "v": "2016"},
{"n": "2015", "v": "2015"},
{"n": "2014", "v": "2014"},
{"n": "2013", "v": "2013"},
{"n": "2012", "v": "2012"},
{"n": "2011", "v": "2011"},
{"n": "2010", "v": "2010"},
{"n": "2009", "v": "2009"},
{"n": "2008", "v": "2008"},
{"n": "2007", "v": "2007"},
{"n": "2006", "v": "2006"},
{"n": "2005", "v": "2005"},
{"n": "2004", "v": "2004"},
{"n": "2003", "v": "2003"},
{"n": "2002", "v": "2002"},
{"n": "2001", "v": "2001"},
{"n": "2000", "v": "2000"},
{"n": "1999", "v": "1999"},
{"n": "1998", "v": "1998"},
{"n": "1997", "v": "1997"},
{"n": "1996", "v": "1996"},
{"n": "1995", "v": "1995"},
{"n": "1994", "v": "1994"},
{"n": "1993", "v": "1993"},
{"n": "1992", "v": "1992"},
{"n": "1991", "v": "1991"},
{"n": "1990", "v": "1990"},
{"n": "1989", "v": "1989"},
{"n": "1988", "v": "1988"},
{"n": "1987", "v": "1987"},
{"n": "1986", "v": "1986"},
{"n": "1985", "v": "1985"},
{"n": "1984", "v": "1984"},
{"n": "1983", "v": "1983"},
{"n": "1982", "v": "1982"},
{"n": "1981", "v": "1981"},
{"n": "1980", "v": "1980"},
{"n": "1979", "v": "1979"},
{"n": "1978", "v": "1978"},
{"n": "1977", "v": "1977"},
{"n": "1976", "v": "1976"},
{"n": "1975", "v": "1975"},
{"n": "1974", "v": "1974"},
{"n": "1973", "v": "1973"},
{"n": "1972", "v": "1972"},
{"n": "1971", "v": "1971"},
{"n": "1970", "v": "1970"},
{"n": "1969", "v": "1969"},
{"n": "1968", "v": "1968"},
{"n": "1967", "v": "1967"},
{"n": "1966", "v": "1966"},
{"n": "1965", "v": "1965"},
{"n": "1964", "v": "1964"},
{"n": "1963", "v": "1963"},
{"n": "1962", "v": "1962"},
{"n": "1961", "v": "1961"},
{"n": "1960", "v": "1960"},
{"n": "1959", "v": "1959"},
{"n": "1958", "v": "1958"}
]
},
{
"key": "tid",
"name": "中文",
"value": [
{"n": "默认", "v": "Variety show"},
{"n": "大陆", "v": "大陆 综艺"},
{"n": "芒果", "v": "芒果 综艺"},
{"n": "腾讯", "v": "腾讯 综艺"},
{"n": "爱奇艺", "v": "爱奇艺 综艺"},
{"n": "优酷", "v": "优酷 综艺"},
{"n": "港台", "v": "港台 综艺"},
{"n": "美国", "v": "美国 综艺"},
{"n": "Netflix", "v": "Netflix 综艺"},
{"n": "韩国", "v": "CRAVITY on Variety Shows 韩国 综艺"},
{"n": "日本", "v": "日本 综艺"},
{"n": "英国", "v": "英国 综艺"}
]
},
{
"key": "tid",
"name": "English",
"value": [
{"n": "Variety", "v": "variety"},
{"n": "Netflix variety", "v": "netflix variety"},
{"n": "Korea", "v": "korea variety"},
{"n": "Japan", "v": "japan variety"},
{"n": "UK", "v": "uk variety"}
]
},
{
"key": "tid",
"name": "小品",
"value": [
{"n": "春晚小品", "v": "春晚小品"},
{"n": "开心麻花", "v": "开心麻花"},
{"n": "屌丝男士", "v": "屌丝男士"},
{"n": "喜剧综艺", "v": "喜剧综艺"},
{"n": "单口", "v": "单口 相声"},
{"n": "群口", "v": "群口 相声"},
{"n": "德云社", "v": "德云社"},
{"n": "青曲社", "v": "青曲社"},
{"n": "郭德纲", "v": "郭德纲"},
{"n": "岳云鹏", "v": "岳云鹏"},
{"n": "曹云金", "v": "曹云金"},
{"n": "评书", "v": "评书"},
{"n": "小曲", "v": "小曲"},
{"n": "赵本山", "v": "赵本山"},
{"n": "陈佩斯", "v": "陈佩斯"},
{"n": "冯巩", "v": "冯巩"},
{"n": "宋小宝", "v": "宋小宝"},
{"n": "赵丽蓉", "v": "赵丽蓉"},
{"n": "潘长江", "v": "潘长江"},
{"n": "郭冬临", "v": "郭冬临"},
{"n": "严顺开", "v": "严顺开"},
{"n": "文松", "v": "文松"}
]
}
],
"紀錄片": [
{
"key": "time",
"name": "時間",
"value": [
{"n": "時間全選", "v": ""},
{"n": "2024", "v": "2024"},
{"n": "2023", "v": "2023"},
{"n": "2022", "v": "2022"},
{"n": "2021", "v": "2021"},
{"n": "2020", "v": "2020"},
{"n": "2019", "v": "2019"},
{"n": "2018", "v": "2018"},
{"n": "2017", "v": "2017"},
{"n": "2016", "v": "2016"},
{"n": "2015", "v": "2015"},
{"n": "2014", "v": "2014"},
{"n": "2013", "v": "2013"},
{"n": "2012", "v": "2012"},
{"n": "2011", "v": "2011"},
{"n": "2010", "v": "2010"},
{"n": "2009", "v": "2009"},
{"n": "2008", "v": "2008"},
{"n": "2007", "v": "2007"},
{"n": "2006", "v": "2006"},
{"n": "2005", "v": "2005"},
{"n": "2004", "v": "2004"},
{"n": "2003", "v": "2003"},
{"n": "2002", "v": "2002"},
{"n": "2001", "v": "2001"},
{"n": "2000", "v": "2000"},
{"n": "1999", "v": "1999"},
{"n": "1998", "v": "1998"},
{"n": "1997", "v": "1997"},
{"n": "1996", "v": "1996"},
{"n": "1995", "v": "1995"},
{"n": "1994", "v": "1994"},
{"n": "1993", "v": "1993"},
{"n": "1992", "v": "1992"},
{"n": "1991", "v": "1991"},
{"n": "1990", "v": "1990"},
{"n": "1989", "v": "1989"},
{"n": "1988", "v": "1988"},
{"n": "1987", "v": "1987"},
{"n": "1986", "v": "1986"},
{"n": "1985", "v": "1985"},
{"n": "1984", "v": "1984"},
{"n": "1983", "v": "1983"},
{"n": "1982", "v": "1982"},
{"n": "1981", "v": "1981"},
{"n": "1980", "v": "1980"},
{"n": "1979", "v": "1979"},
{"n": "1978", "v": "1978"},
{"n": "1977", "v": "1977"},
{"n": "1976", "v": "1976"},
{"n": "1975", "v": "1975"},
{"n": "1974", "v": "1974"},
{"n": "1973", "v": "1973"},
{"n": "1972", "v": "1972"},
{"n": "1971", "v": "1971"},
{"n": "1970", "v": "1970"},
{"n": "1969", "v": "1969"},
{"n": "1968", "v": "1968"},
{"n": "1967", "v": "1967"},
{"n": "1966", "v": "1966"},
{"n": "1965", "v": "1965"},
{"n": "1964", "v": "1964"},
{"n": "1963", "v": "1963"},
{"n": "1962", "v": "1962"},
{"n": "1961", "v": "1961"},
{"n": "1960", "v": "1960"},
{"n": "1959", "v": "1959"},
{"n": "1958", "v": "1958"}
]
},
{
"key": "tid",
"name": "中文",
"value": [
{"n": "地區🎶排序", "v": "歷史記錄片 地球記錄片 宇宙記錄片 海洋記錄片 戰爭記錄片 大自然生存記錄片"},
{"n": "默认", "v": "documentary"},
{"n": "BBC纪录片", "v": "BBC 纪录片"},
{"n": "国家地理", "v": "国家地理 纪录片"},
{"n": "Netflix纪录片", "v": "netflix 纪录片"},
{"n": "BBC", "v": "BBC documentary"},
{"n": "National Geographic", "v": "National Geographic documentary"},
{"n": "Netflix", "v": "netflix documentary"},
{"n": "历史", "v": "历史 纪录片"},
{"n": "野性", "v": "野性 纪录片"},
{"n": "地球", "v": "地球 纪录片"},
{"n": "宇宙", "v": "宇宙 纪录片"},
{"n": "海洋", "v": "海洋 纪录片"},
{"n": "人文", "v": "人文 纪录片"},
{"n": "战争", "v": "战争 纪录片"}
]
},
{
"key": "tid",
"name": "English",
"value": [
{"n": "History", "v": "Full history documentary"},
{"n": "WILD", "v": "Full wild documentary"},
{"n": "Earch", "v": "Full earth documentary"},
{"n": "Universe", "v": "Full universe documentary"},
{"n": "Oceans", "v": "Full oceans documentary"},
{"n": "Humanism", "v": "Full humanism documentary"},
{"n": "Wars", "v": "Full war documentary"}
]
}
],
"音樂": [
{
"key": "time",
"name": "時間",
"value": [
{"n": "時間全選", "v": ""},
{"n": "2024", "v": "2024"},
{"n": "2023", "v": "2023"},
{"n": "2022", "v": "2022"},
{"n": "2021", "v": "2021"},
{"n": "2020", "v": "2020"},
{"n": "2019", "v": "2019"},
{"n": "2018", "v": "2018"},
{"n": "2017", "v": "2017"},
{"n": "2016", "v": "2016"},
{"n": "2015", "v": "2015"},
{"n": "2014", "v": "2014"},
{"n": "2013", "v": "2013"},
{"n": "2012", "v": "2012"},
{"n": "2011", "v": "2011"},
{"n": "2010", "v": "2010"},
{"n": "2009", "v": "2009"},
{"n": "2008", "v": "2008"},
{"n": "2007", "v": "2007"},
{"n": "2006", "v": "2006"},
{"n": "2005", "v": "2005"},
{"n": "2004", "v": "2004"},
{"n": "2003", "v": "2003"},
{"n": "2002", "v": "2002"},
{"n": "2001", "v": "2001"},
{"n": "2000", "v": "2000"},
{"n": "1999", "v": "1999"},
{"n": "1998", "v": "1998"},
{"n": "1997", "v": "1997"},
{"n": "1996", "v": "1996"},
{"n": "1995", "v": "1995"},
{"n": "1994", "v": "1994"},
{"n": "1993", "v": "1993"},
{"n": "1992", "v": "1992"},
{"n": "1991", "v": "1991"},
{"n": "1990", "v": "1990"},
{"n": "1989", "v": "1989"},
{"n": "1988", "v": "1988"},
{"n": "1987", "v": "1987"},
{"n": "1986", "v": "1986"},
{"n": "1985", "v": "1985"},
{"n": "1984", "v": "1984"},
{"n": "1983", "v": "1983"},
{"n": "1982", "v": "1982"},
{"n": "1981", "v": "1981"},
{"n": "1980", "v": "1980"},
{"n": "1979", "v": "1979"},
{"n": "1978", "v": "1978"},
{"n": "1977", "v": "1977"},
{"n": "1976", "v": "1976"},
{"n": "1975", "v": "1975"},
{"n": "1974", "v": "1974"},
{"n": "1973", "v": "1973"},
{"n": "1972", "v": "1972"},
{"n": "1971", "v": "1971"},
{"n": "1970", "v": "1970"},
{"n": "1969", "v": "1969"},
{"n": "1968", "v": "1968"},
{"n": "1967", "v": "1967"},
{"n": "1966", "v": "1966"},
{"n": "1965", "v": "1965"},
{"n": "1964", "v": "1964"},
{"n": "1963", "v": "1963"},
{"n": "1962", "v": "1962"},
{"n": "1961", "v": "1961"},
{"n": "1960", "v": "1960"},
{"n": "1959", "v": "1959"},
{"n": "1958", "v": "1958"}
]
},
{
"key": "tid",
"name": "地區",
"value": [
{"n": "華語音樂", "v": "華語音樂"},
{"n": "華語MV", "v": "華語MV"},
{"n": "环球视听", "v": "环球视听1980 @RippleOfficialEvent"},
{"n": "YouTube 點閱率最高", "v": "YouTube 點閱率最高觀看次數最多華語歌曲"},
{"n": "海外抖音", "v": "TikTok 翻唱 抖音 音樂"},
{"n": "粵語", "v": "粵語 音樂"},
{"n": "國語", "v": "國語 音樂"},
{"n": "大陆", "v": "大陆 音乐"},
{"n": "香港", "v": "香港 音乐"},
{"n": "台湾", "v": "台湾 音乐"},
{"n": "新加坡", "v": "新加坡 音乐"},
{"n": "馬來西亞", "v": "馬來西亞 音乐"},
{"n": "泰國", "v": "泰國 音乐"},
{"n": "印度", "v": "印度 音乐"},
{"n": "韩国", "v": "韩国 音乐"},
{"n": "日本", "v": "日本 音乐"},
{"n": "欧美", "v": "欧美 音乐"},
{"n": "时光音乐会MV", "v": "时光音乐会MV"},
{"n": "中国好声音MV", "v": "中国好声音MV"},
{"n": "滚石MV", "v": "滚石MV"},
{"n": "古风MV", "v": "古风MV"},
{"n": "韩国女团MV", "v": "韩国女团MV"},
{"n": "欧美", "v": "欧美 音乐"},
{"n": "BillBoard", "v": "BillBoard"}
]
},
{
"key": "tid",
"name": "愛好",
"value": [
{"n": "合辑", "v": "合辑"},
{"n": "超級女聲", "v": "超級女聲"},
{"n": "whitneyhouston", "v": "@whitneyhoustonmusic"},
{"n": "玛丽.凯丽", "v": "@MariahCarey"},
{"n": "LadyGaga", "v": "@LadyGaga"},
{"n": "G.E.M邓紫棋", "v": "@gem0816"},
{"n": "麦当娜", "v": "@madonna"},
{"n": "Taylor Swift", "v": "@TaylorSwift"},
{"n": "舞曲", "v": "蹦迪現場 慢搖 夜店 低音 女聲 "},
{"n": "80-90", "v": "80 90 音樂"},
{"n": "人聲", "v": "人聲 音樂"},
{"n": "A8製造", "v": "A8製造 工體音樂"},
{"n": "中国MTV", "v": "@ChineseMusicTV"},
{"n": "滚石", "v": "@RockRecordsTaipei"},
{"n": "失傳已久", "v": "嗨音雷虎 失傳 嗨音會所 音樂"},
{"n": "重低音DJ", "v": "3D 8D 慢搖 重低音 音樂"},
{"n": "車載舞曲", "v": "車載慢搖DJ歌曲串燒 深水炸彈DJ歌曲串燒 越南鼓DJ歌曲串燒 音樂"},
{"n": "超級女聲", "v": "超級女聲"},
{"n": "tseries", "v": "@tseries"},
{"n": "戲曲", "v": "秦腔 京剧 越剧 黄梅戏 评剧 豫剧 昆曲 高腔 梆子腔 河北梆子 晋剧 蒲剧 雁剧 上党梆子 武安平调 二人台 吉剧 龙江剧 越调 河南曲剧 山东梆子 淮剧 滑稽戏 婺剧 绍剧 徽剧 闽剧 莆仙戏 梨园戏 高甲戏 赣剧 采茶戏 汉剧 湘剧 祁剧 湖南花鼓戏 粤剧 潮剧 桂剧 彩调 壮剧 川剧 黔剧 滇剧 傣剧 藏剧 皮影戏"}
]
},
{
"key": "tid",
"name": "歌手",
"value": [
{"n": "邓丽君", "v": "邓丽君 音乐🎶"},
{"n": "林忆莲", "v": "林忆莲 音樂🎶"},
{"n": "陈慧娴", "v": "陈慧娴音樂🎶"},
{"n": "韩宝仪", "v": "韩宝仪 音樂🎶"},
{"n": "张学友", "v": "张学友 音樂🎶"},
{"n": "李宗盛", "v": "李宗盛 音樂🎶"},
{"n": "罗大佑", "v": "罗大佑 音樂🎶"},
{"n": "周杰伦", "v": "周杰伦 音樂🎶"},
{"n": "张惠妹", "v": "张惠妹 音樂🎶"},
{"n": "斯琴高麗", "v": "斯琴高麗 音樂🎶"},
{"n": "林俊杰", "v": "@jjlin • 音乐🎶"},
{"n": "周深", "v": "周深 音樂🎶"},
{"n": "張瑋伽", "v": "張瑋伽 演唱會 巡演 音樂"},
{"n": "孫露", "v": "孫露 演唱會 巡演 音樂"},
{"n": "鳳凰傳奇", "v": "鳳凰傳奇 演 巡演 音樂"},
{"n": "刀郎", "v": "刀郎 演唱會 巡演 音樂"},
{"n": "S.H.E", "v": "S.H.E 演唱會 巡演 音樂"},
{"n": "慕容曉曉", "v": "慕容曉曉 演唱會 巡演 音樂"},
{"n": "東方紅豔", "v": "東方紅豔 演唱會 巡演 音樂"},
{"n": "孟庭葦", "v": "孟庭葦 演唱會 巡演 音樂"},
{"n": "斯琴高麗", "v": "斯琴高麗 演唱會 巡演 音樂"},
{"n": "程響", "v": "程響 演唱會 巡演 音樂"},
{"n": "蔣雪兒", "v": "蔣雪兒 演唱會 巡演 音樂"}
]
}
],
"體育": [
{
"key": "time",
"name": "時間",
"value": [
{"n": "時間全選", "v": ""},
{"n": "2024", "v": "2024"},
{"n": "2023", "v": "2023"},
{"n": "2022", "v": "2022"},
{"n": "2021", "v": "2021"},
{"n": "2020", "v": "2020"},
{"n": "2019", "v": "2019"},
{"n": "2018", "v": "2018"},
{"n": "2017", "v": "2017"},
{"n": "2016", "v": "2016"},
{"n": "2015", "v": "2015"},
{"n": "2014", "v": "2014"},
{"n": "2013", "v": "2013"},
{"n": "2012", "v": "2012"},
{"n": "2011", "v": "2011"},
{"n": "2010", "v": "2010"},
{"n": "2009", "v": "2009"},
{"n": "2008", "v": "2008"},
{"n": "2007", "v": "2007"},
{"n": "2006", "v": "2006"},
{"n": "2005", "v": "2005"},
{"n": "2004", "v": "2004"},
{"n": "2003", "v": "2003"},
{"n": "2002", "v": "2002"},
{"n": "2001", "v": "2001"},
{"n": "2000", "v": "2000"},
{"n": "1999", "v": "1999"},
{"n": "1998", "v": "1998"},
{"n": "1997", "v": "1997"},
{"n": "1996", "v": "1996"},
{"n": "1995", "v": "1995"},
{"n": "1994", "v": "1994"},
{"n": "1993", "v": "1993"},
{"n": "1992", "v": "1992"},
{"n": "1991", "v": "1991"},
{"n": "1990", "v": "1990"},
{"n": "1989", "v": "1989"},
{"n": "1988", "v": "1988"},
{"n": "1987", "v": "1987"},
{"n": "1986", "v": "1986"},
{"n": "1985", "v": "1985"},
{"n": "1984", "v": "1984"},
{"n": "1983", "v": "1983"},
{"n": "1982", "v": "1982"},
{"n": "1981", "v": "1981"},
{"n": "1980", "v": "1980"},
{"n": "1979", "v": "1979"},
{"n": "1978", "v": "1978"},
{"n": "1977", "v": "1977"},
{"n": "1976", "v": "1976"},
{"n": "1975", "v": "1975"},
{"n": "1974", "v": "1974"},
{"n": "1973", "v": "1973"},
{"n": "1972", "v": "1972"},
{"n": "1971", "v": "1971"},
{"n": "1970", "v": "1970"},
{"n": "1969", "v": "1969"},
{"n": "1968", "v": "1968"},
{"n": "1967", "v": "1967"},
{"n": "1966", "v": "1966"},
{"n": "1965", "v": "1965"},
{"n": "1964", "v": "1964"},
{"n": "1963", "v": "1963"},
{"n": "1962", "v": "1962"},
{"n": "1961", "v": "1961"},
{"n": "1960", "v": "1960"},
{"n": "1959", "v": "1959"},
{"n": "1958", "v": "1958"}
]
},
{
"key": "tid",
"name": "中文",
"value": [
{"n": "默认", "v": ""},
{"n": "體育直播", "v": "体育直播"},
{"n": "體育赛事", "v": "体育赛事"},
{"n": "足球比賽", "v": "足球賽事"},
{"n": "篮球比賽", "v": "篮球賽事"},
{"n": "极限運動", "v": "极限運動"},
{"n": "室内運動", "v": "室内运动"},
{"n": "户外運動", "v": "户外运动"},
{"n": "瑜伽健身", "v": "@kundalyoghealthylifestyle4566"},
{"n": "健身運動", "v": "健身運動"}
]
},
{
"key": "tid",
"name": "English",
"value": [
{"n": "Live", "v": "live sports"},
{"n": "Games", "v": "live games"},
{"n": "Soccer", "v": "live soccer"},
{"n": "NBA", "v": "NBA"},
{"n": "Extreme", "v": "extreme sports"},
{"n": "InDoor", "v": "indoor sports"},
{"n": "OutDoor", "v": "outdoor sports"},
{"n": "Workout", "v": "workout"}
]
},
{
"key": "tid",
"name": "體育",
"value": [
{"n": "女足港場", "v": "女足港場 @Hong KongWomensStadium"},
{"n": "全國校運動會", "v": "全國大專 校院運動會 全中運 女子組賽事 全國中等 學校運動會"},
{"n": "女中儀隊", "v": "北一女中樂儀旗隊永續發展協會 北一女中家長會樂儀旗家長後援會 北一女中儀隊校友隊 台灣 学校运动会 景美女中儀隊 北一女樂儀旗隊 full樂儀隊 "},
{"n": "校園熱舞", "v": "full 校園熱舞 開南熱無 開南大學課外活動組 女生熱舞社 南寶熱舞社 寶踐熱舞社 NTDC 熱舞社 STUST"},
{"n": "红星体育官方频道", "v": "红星体育官方频道【高清直播】"},
{"n": "中國體育比賽傳奇", "v": "中國體育比赛傳奇"},
{"n": "愛爾達體育家族", "v": "愛爾達體育家族 ELTA Sports"},
{"n": "公視體育", "v": "公視體育"},
{"n": "體育之光", "v": "體育之光"},
{"n": "偶然體育賽事", "v": "偶然體育賽事"}
]
}
],
"時尚潮流": [
{
"key": "tid",
"name": "時裝秀",
"value": [
{"n": "街舞", "v": "脫衣舞 丁字褲 街舞 太空步 機械舞 舞 裸體舞蹈 霹靂舞 魔性舞蹈 鬼步舞 木偶舞 女性藝術舞蹈"},
{"n": "時尚走秀", "v": "T台走秀 lingerie show"},
{"n": "時裝秀", "v": "hdr ASM lingerieTV 東京ファッションショー 下着ショー"},
{"n": "潮流秀", "v": "FASHION IN UHD"},
{"n": "時裝模特", "v": "FASHION Runway"},
{"n": "模特", "v": "比基尼 泳裝 頂級車模 空姐 寫真 Car model Stewardess Portrait"},
{"n": "裸体秀", "v": "hdr 人體藝術 裸体秀 Nude show"},
{"n": "無限亂鬥", "v": "hdr 廟會秀 無限HD 公廟 鋼管舞 脫衣舞 舞女 清純 寫真"}
]
},
{
"key": "tid",
"name": "小姐姐",
"value": [
{"n": "小姐姐超清", "v": "小姐姐超清"},
{"n": "国内小姐姐", "v": "快手模特 抖音模特 国内小姐姐"},
{"n": "韩国小姐姐", "v": "韩国小姐姐"},
{"n": "日本小姐姐", "v": "日本小姐姐"},
{"n": "俄罗斯小姐姐", "v": "俄罗斯小姐姐"},
{"n": "混血小姐姐", "v": "混血小姐姐"},
{"n": "越南小姐姐", "v": "越南小姐姐"},
{"n": "Al小姐姐", "v": "Al美女超清"},
{"n": "抖音热门小姐姐", "v": "抖音热门小姐姐"},
{"n": "快手热门美女", "v": "快手热门美女"},
{"n": "打碟小姐姐", "v": "打碟小姐姐"},
{"n": "冲浪小姐姐", "v": "冲浪小姐姐"},
{"n": "蹦迪小姐姐", "v": "蹦迪小姐姐"},
{"n": "艺校小姐姐", "v": "艺校小姐姐"},
{"n": "环球小姐", "v": "环球小姐"},
{"n": "泰国人妖", "v": "泰国人妖"},
{"n": "人间胸器", "v": "人间胸器"}
]
},
{
"key": "tid",
"name": "English",
"value": [
{"n": "sexy Miss", "v": "sexy Miss"},
{"n": "Hot sexy Girl", "v": "Hot sexy Girl"},
{"n": "Korean Girl", "v": "Korean sexy Girl"},
{"n": "Japanese Girl", "v": "Japanese sexy Girl"},
{"n": "Russian Girl", "v": "Russian sexy Girl"},
{"n": "Vietnamese Girl", "v": "Vietnamese sexy Girl"},
{"n": "AI Girl", "v": "AI Girl"},
{"n": "TikTok Hot Siste", "v": "TikTok Hot sexy Girl"},
{"n": "Cute Girl", "v": "sexy Cute Girl"},
{"n": "Girl Dj", "v": "sexy Girl Dj"},
{"n": "Girl Surfer", "v": "sexy Girl Surfer"},
{"n": "Dance Girl", "v": "Dance sexy Girl"},
{"n": "Miss Universe", "v": "Miss Universe"},
{"n": "Thai Shemale", "v": "Thai Shemale"}
]
}
],
"解說": [
{
"key": "tid",
"name": "頻道主",
"value": [
{"n": "宇哥侃故事", "v": "@yuge"},
{"n": "零度解说", "v": "@lingdujieshuo"}
]
}
],
"16K HDR": [
{
"key": "tid",
"name": "風景",
"value": [
{"n": "運動", "v": "GoPro 女翼裝飛行 極限自行車運動"},
{"n": "風景", "v": "hdr 大自然"},
{"n": "Links TV頻道主", "v": "@linksphotograph Links TV hdr"},
{"n": "放鬆", "v": "hdr 放鬆"},
{"n": "動物世界", "v": "hdr Carnivorous Animals 動物世界"},
{"n": "深海世界", "v": "hdr Invertebrate Fish 深海世界"},
{"n": "飛禽走獸", "v": "hdr Birds of Prey Columbiform Birds Passerine Birds"},
{"n": "生物世界", "v": "hdr Amphibians Reptiles 生物世界"}
]
}
],
"Full YouTube": [
{
"key": "tid",
"name": "頻道主",
"value": [
{"n": "李子柒", "v": "李子柒 Liziqi @cnliziqi"},
{"n": "滇西小哥", "v": "滇西小哥 @dianxixiaoge"},
{"n": "老高與小茉", "v": "老高與小茉 @laogao"},
{"n": "李永樂老師", "v": "李永樂老師 @TchLiyongle"}
]
},
{
"key": "tid",
"name": "美食頻道主",
"value": [
{"n": "美食作家王刚", "v": "美食作家王刚 @chefwang"},
{"n": "小高姐的 Magic Ingredients", "v": "小高姐的 Magic Ingredients @MagicIngredients"},
{"n": "小穎美食", "v": "小穎美食 @XiaoYingFood"}
]
},
{
"key": "tid",
"name": "野外頻道主",
"value": [
{"n": "野外求生", "v": "primitivetechnology9550 @primitivetechnology9550"}
]
},
{
"key": "tid",
"name": "科普頻道主",
"value": [
{"n": "科普", "v": "Mr Beast@MrBeast"},
{"n": "航天大學", "v": "Airforceproud95 @Airforceproud95"},
{"n": "世界大戰", "v": "TheGreatWar @TheGreatWar"},
{"n": "MarkRober", "v": "Mark Rober @MarkRober"}
]
},
{
"key": "tid",
"name": "教材",
"value": [
{"n": "不良林", "v": "不良林"},
{"n": "涌哥侃侃", "v": "涌哥侃侃 @ygkkk"},
{"n": "悟空的日常", "v": "悟空的日常"}
]
}
],
"宇宙": [
{
"key": "tid",
"name": "科普知識",
"value": [
{"n": "宇宙", "v": "光年 黑洞 銀河系 空間站 太空技術"},
{"n": "粒子", "v": "空間粒子 宇宙磁場 四維空間 元素 量子 光波 光源 靈魂"},
{"n": "靠蒙", "v": "microorganism"}
]
},
{
"key": "tid",
"name": "歷史科普",
"value": [
{"n": "世界大戰", "v": "世界大戰 二戰 日侵 八國聯軍"},
{"n": "人物", "v": "古代名人 歷史名人 歷代祖先"},
{"n": "生物進化史", "v": "人類進化 微生物進化 動物進化 地球進化"},
{"n": "靠蒙", "v": "歷史 History"}
]
}
]
}
CATEGORY_QUERY = {}
CATEGORY_ALIASES = {}
try:
YOUTUBE_CLASSES
except NameError:
YOUTUBE_CLASSES = []
try:
CATEGORY_FILTERS
except NameError:
CATEGORY_FILTERS = {}
# ==================== 核心提取类(合并优化) ====================
class YouTubeLite:
"""普通视频提取,合并 0712 优化:快速 API、编码优先级、SDR/HDR 识别"""
def __init__(self, session, headers=None, config=None):
self.session = session
self.headers = headers or {}
self.config = config or {}
self.player_cache = {}
self.extract_cache = {}
self.sig_plan_cache = {}
self.extract_cache_ttl = int(self.config.get('extract_cache_ttl') or 300)
def extract(self, url_or_id):
video_id = self.extract_video_id(url_or_id)
cached = self.extract_cache.get(video_id)
now = time.time()
if cached and cached.get('expires', 0) > now:
debug_log('extract cache hit', {'video_id': video_id, 'ttl': int(cached.get('expires', 0) - now)})
return cached.get('data')
watch_url = f"https://www.youtube.com/watch?v={video_id}"
debug_log('extract start', {'input': url_or_id, 'video_id': video_id})
page_resp = self._get(watch_url)
page = page_resp.text
debug_log('watch page', {'status': page_resp.status_code, 'length': len(page)})
ytcfg = self._extract_ytcfg(page) or {}
player_response = self._extract_initial_player_response(page) or {}
player_url = self._extract_player_url(page)
api_key = ytcfg.get('INNERTUBE_API_KEY') or self._search(r'"INNERTUBE_API_KEY":"([^"]+)"', page)
visitor_data = self._extract_visitor_data(ytcfg, player_response)
sts = None
debug_log('page parsed', {'has_ytcfg': bool(ytcfg), 'has_initial_pr': bool(player_response), 'initial_status': (player_response.get('playabilityStatus') or {}).get('status'), 'initial_has_streaming': bool(player_response.get('streamingData')), 'has_api_key': bool(api_key), 'has_visitor': bool(visitor_data), 'sts': sts, 'player_url': player_url})
context = ytcfg.get('INNERTUBE_CONTEXT') or {
'client': {'clientName': 'WEB', 'clientVersion': '2.20240310.01.00', 'hl': 'en', 'gl': 'US'}
}
responses = [player_response] if player_response else []
if api_key:
api_responses = self._call_player_api(video_id, api_key, context, watch_url, visitor_data, sts)
if not isinstance(api_responses, list):
api_responses = [api_responses] if api_responses else []
responses.extend([x for x in api_responses if x])
debug_log('player api result', {'responses': len(api_responses), 'has_streaming': [bool((x or {}).get('streamingData')) for x in api_responses]})
player_response = next((x for x in responses if (x.get('playabilityStatus') or {}).get('status') == 'OK'), player_response)
status = (player_response.get('playabilityStatus') or {}).get('status')
streaming = player_response.get('streamingData') or {}
if status and status not in ('OK', 'LIVE_STREAM_OFFLINE') and not streaming:
reason = (player_response.get('playabilityStatus') or {}).get('reason') or status
raise Exception(f'YouTube 不可播放: {reason}')
details = player_response.get('videoDetails') or {}
raw_formats = []
seen_raw = set()
source_counts = []
for response in responses:
response_streaming = (response or {}).get('streamingData') or {}
source_raw = (response_streaming.get('formats') or []) + (response_streaming.get('adaptiveFormats') or [])
source_counts.append({'formats': len(response_streaming.get('formats') or []), 'adaptive': len(response_streaming.get('adaptiveFormats') or [])})
for raw in source_raw:
key = (raw.get('itag'), raw.get('url') or raw.get('signatureCipher') or raw.get('cipher') or raw.get('mimeType'))
if key not in seen_raw:
seen_raw.add(key)
raw = raw.copy()
raw['_client_name'] = (response or {}).get('_client_name')
raw['_client_ua'] = (response or {}).get('_client_ua')
raw_formats.append(raw)
debug_log('raw formats', {'sources': source_counts, 'total': len(raw_formats), 'sample_keys': sorted(list(raw_formats[0].keys())) if raw_formats else []})
formats = []
cipher_count = 0
for raw in raw_formats:
if raw.get('signatureCipher') or raw.get('cipher'):
cipher_count += 1
item = self._normalize_format(raw, player_url)
if item and item.get('url'):
formats.append(item)
debug_log('normalized formats', {'count': len(formats), 'cipher_count': cipher_count, 'progressive': len([x for x in formats if x.get('vcodec') != 'none' and x.get('acodec') != 'none'])})
if not formats:
raise Exception('未获取到可用播放地址')
data = {
'id': video_id,
'title': details.get('title') or video_id,
'duration': int(details.get('lengthSeconds') or 0),
'formats': formats,
}
self.extract_cache[video_id] = {'data': data, 'expires': time.time() + self.extract_cache_ttl}
return data
@staticmethod
def extract_video_id(text):
text = str(text or '').strip()
for pattern in [
r'(?:v=|/v/|/embed/|/shorts/|youtu\.be/)([0-9A-Za-z_-]{11})',
r'^([0-9A-Za-z_-]{11})$',
]:
m = re.search(pattern, text)
if m:
return m.group(1)
raise Exception('无法识别 YouTube 视频 ID')
def _client_name_id(self, client_name):
return {
'WEB': 1,
'MWEB': 2,
'ANDROID': 3,
'IOS': 5,
'TVHTML5': 7,
'ANDROID_VR': 28,
'WEB_EMBEDDED_PLAYER': 56,
'WEB_REMIX': 67,
}.get(client_name, 1)
def _extract_visitor_data(self, ytcfg, player_response):
return (
self.config.get('visitor_data')
or ytcfg.get('VISITOR_DATA')
or (((ytcfg.get('INNERTUBE_CONTEXT') or {}).get('client') or {}).get('visitorData'))
or ((player_response.get('responseContext') or {}).get('visitorData'))
)
def _extract_signature_timestamp(self, video_id, player_url, ytcfg=None):
try:
code = self._get_player_code(player_url)
sts = self._search(r'(?:signatureTimestamp|sts)\s*:\s*(\d{5})', code)
return int(sts) if sts else None
except Exception as e:
debug_log('sts extract error', repr(e))
return None
def _get_po_token(self, client_name, context='gvs'):
tokens = self.config.get('po_token') or self.config.get('po_tokens') or {}
if isinstance(tokens, str):
return tokens
if isinstance(tokens, dict):
return tokens.get(f'{client_name}.{context}') or tokens.get(client_name) or tokens.get(context)
return None
def _video_codec_priority(self, item):
mime = (item.get('mimeType') or '').lower()
codecs = (item.get('codecs') or '').lower()
if 'vp9.2' in mime or 'vp09.02' in codecs:
return 4
if 'vp9' in mime or 'vp09' in codecs:
return 3
if 'avc' in codecs or 'h264' in codecs:
return 2
if 'av01' in codecs:
return 1
return 0
def _is_hdr_video(self, item):
mime = (item.get('mimeType') or '').lower()
codecs = (item.get('codecs') or '').lower()
color = item.get('colorInfo') or {}
return 'vp9.2' in mime or 'vp09.02' in codecs or bool(color.get('hdrMetadataInfo'))
def _is_risky_best_video(self, item):
codecs = (item.get('codecs') or '').lower()
return 'av01' in codecs
def choose_playable(self, formats, quality=None):
all_videos = [x for x in formats if x.get('vcodec') != 'none' and x.get('acodec') == 'none']
candidates = all_videos[:]
if quality == '4k':
candidates = [x for x in candidates if int(x.get('height') or 0) >= 2160]
elif quality == '2k':
candidates = [x for x in candidates if 1440 <= int(x.get('height') or 0) < 2160]
elif quality == '1080p':
candidates = [x for x in candidates if 1000 <= int(x.get('height') or 0) < 1440]
elif quality == 'best':
safe_candidates = [x for x in candidates if not self._is_risky_best_video(x)]
if safe_candidates:
candidates = safe_candidates
else:
candidates = [x for x in candidates if int(x.get('height') or 0) >= 1080]
if not candidates and quality == 'best':
candidates = all_videos
if not candidates:
return None
candidates.sort(key=lambda x: (
self._video_codec_priority(x),
int(x.get('height') or 0),
int(x.get('bitrate') or 0)
), reverse=True)
selected = candidates[0]
debug_log('video selected fast', {
'quality': quality,
'itag': selected.get('itag'),
'height': selected.get('height'),
'mime': selected.get('mimeType'),
'codec_priority': self._video_codec_priority(selected),
'candidates': len(candidates),
'probe_skipped': True,
})
return selected
def choose_video_tracks(self, formats, quality=None):
videos = [x for x in formats if x.get('vcodec') != 'none' and x.get('acodec') == 'none']
cap = 2160 if quality in ('best', '4k') else 1440 if quality == '2k' else 1080
videos = [x for x in videos if int(x.get('height') or 0) <= cap] or videos
vp9 = [x for x in videos if self._video_codec_priority(x) >= 3]
if vp9:
videos = vp9
sdr = [x for x in videos if not self._is_hdr_video(x)]
hdr = [x for x in videos if self._is_hdr_video(x)]
sort_key = lambda x: (int(x.get('height') or 0), int(x.get('bitrate') or 0))
sdr.sort(key=sort_key, reverse=True)
hdr.sort(key=sort_key, reverse=True)
tracks = []
if sdr:
item = sdr[0].copy()
item['track_name'] = 'SDR'
item['is_hdr'] = False
tracks.append(item)
if hdr:
item = hdr[0].copy()
item['track_name'] = 'HDR'
item['is_hdr'] = True
tracks.append(item)
if not tracks:
item = self.choose_playable(formats, quality)
if item:
item = item.copy()
item['track_name'] = 'HDR' if self._is_hdr_video(item) else 'SDR'
item['is_hdr'] = self._is_hdr_video(item)
tracks.append(item)
debug_log('video tracks selected', [{'name': x.get('track_name'), 'itag': x.get('itag'), 'height': x.get('height'), 'codecs': x.get('codecs')} for x in tracks])
return tracks
def choose_audio(self, formats):
candidates = [x for x in formats if x.get('acodec') != 'none' and x.get('vcodec') == 'none']
if not candidates:
return None
candidates.sort(key=lambda x: (1 if x.get('ext') == 'mp4' else 0, int(x.get('bitrate') or 0)), reverse=True)
selected = candidates[0]
debug_log('audio selected fast', {
'itag': selected.get('itag'),
'mime': selected.get('mimeType'),
'bitrate': selected.get('bitrate'),
'probe_skipped': True,
})
return selected
def _probe_format(self, item):
try:
headers = self.headers.copy()
headers.update(item.get('headers') or {})
headers['Range'] = 'bytes=0-1'
r = self.session.get(item.get('url'), headers=headers, stream=True, timeout=10)
if r.url and r.url != item.get('url'):
item['url'] = r.url
item['redirected'] = True
debug_log('probe redirected url', self._url_summary(r.url))
status_code = r.status_code
r.close()
return status_code in (200, 206), status_code
except Exception as e:
return False, repr(e)
def choose_best_video_audio(self, formats):
videos = [x for x in formats if x.get('vcodec') != 'none' and x.get('acodec') == 'none']
audios = [x for x in formats if x.get('acodec') != 'none' and x.get('vcodec') == 'none']
videos.sort(key=lambda x: (int(x.get('height') or 0), int(x.get('bitrate') or 0)), reverse=True)
audios.sort(key=lambda x: int(x.get('bitrate') or 0), reverse=True)
return (videos[0] if videos else None), (audios[0] if audios else None)
def _url_summary(self, media_url):
parsed = urlparse(media_url or '')
query = parse_qs(parsed.query)
keys = ['itag', 'mime', 'c', 'expire', 'ip', 'mip', 'source', 'requiressl', 'gir', 'clen', 'dur', 'n', 'pot', 'sig', 'lsig', 'cms_redirect']
return {
'host': parsed.netloc,
'path': parsed.path,
'len': len(media_url or ''),
'params': {k: bool(query.get(k)) if k in ('pot', 'sig', 'lsig', 'cms_redirect') else (query.get(k, [''])[0][:80]) for k in keys if k in query}
}
def _get(self, url, **kwargs):
headers = self.headers.copy()
headers.update(kwargs.pop('headers', {}) or {})
r = self.session.get(url, headers=headers, timeout=kwargs.pop('timeout', 15), **kwargs)
r.raise_for_status()
return r
def _post_json(self, url, payload, headers=None):
h = self.headers.copy()
h.update({'Content-Type': 'application/json', 'Origin': 'https://www.youtube.com'})
if headers:
h.update({k: v for k, v in headers.items() if v})
r = self.session.post(url, json=payload, headers=h, timeout=15)
r.raise_for_status()
return r.json()
def _call_player_api(self, video_id, api_key, context, referer, visitor_data=None, sts=None):
clients = [
{'client': {'clientName': 'ANDROID_VR', 'clientVersion': '1.65.10', 'deviceMake': 'Oculus', 'deviceModel': 'Quest 3', 'androidSdkVersion': 32, 'userAgent': 'com.google.android.apps.youtube.vr.oculus/1.65.10 (Linux; U; Android 12L; eureka-user Build/SQ3A.220605.009.A1) gzip', 'osName': 'Android', 'osVersion': '12L', 'hl': 'en', 'gl': 'US'}},
{'client': {'clientName': 'ANDROID', 'clientVersion': '21.02.35', 'androidSdkVersion': 30, 'userAgent': 'com.google.android.youtube/21.02.35 (Linux; U; Android 11) gzip', 'osName': 'Android', 'osVersion': '11', 'hl': 'en', 'gl': 'US'}},
{'client': {'clientName': 'IOS', 'clientVersion': '21.02.3', 'deviceMake': 'Apple', 'deviceModel': 'iPhone16,2', 'userAgent': 'com.google.ios.youtube/21.02.3 (iPhone16,2; U; CPU iOS 18_3_2 like Mac OS X;)', 'osName': 'iPhone', 'osVersion': '18.3.2.22D82', 'hl': 'en', 'gl': 'US'}},
context,
{'client': {'clientName': 'MWEB', 'clientVersion': '2.20260115.01.00', 'userAgent': 'Mozilla/5.0 (iPad; CPU OS 16_7_10 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.6 Mobile/15E148 Safari/604.1,gzip(gfe)', 'hl': 'en', 'gl': 'US'}},
]
results = []
fallback = None
for ctx in clients:
client_name = (ctx.get('client') or {}).get('clientName')
try:
url = f'https://www.youtube.com/youtubei/v1/player?key={api_key}&prettyPrint=false'
payload = {
'context': ctx,
'videoId': video_id,
'playbackContext': {'contentPlaybackContext': {'html5Preference': 'HTML5_PREF_WANTS', **({'signatureTimestamp': sts} if sts else {})}},
'contentCheckOk': True,
'racyCheckOk': True,
}
client = ctx.get('client') or {}
headers = {
'Referer': referer,
'X-YouTube-Client-Name': str(self._client_name_id(client.get('clientName'))),
'X-YouTube-Client-Version': client.get('clientVersion') or '',
}
if visitor_data:
headers['X-Goog-Visitor-Id'] = visitor_data
client_ua = client.get('userAgent')
if client_ua:
headers['User-Agent'] = client_ua
data = self._post_json(url, payload, headers=headers)
status = (data.get('playabilityStatus') or {}).get('status')
streaming = data.get('streamingData') or {}
formats = streaming.get('formats') or []
adaptive = streaming.get('adaptiveFormats') or []
direct_video = [x for x in adaptive if (x.get('url') or x.get('signatureCipher') or x.get('cipher')) and str(x.get('mimeType') or '').startswith('video/')]
direct_any = [x for x in formats + adaptive if x.get('url') or x.get('signatureCipher') or x.get('cipher')]
has_streaming = bool(streaming)
debug_log('player api client', {'client': client_name, 'status': status, 'has_streaming': has_streaming, 'formats': len(formats), 'adaptive': len(adaptive), 'direct_any': len(direct_any), 'direct_video': len(direct_video)})
if has_streaming:
data['_client_name'] = client_name
data['_client_ua'] = client_ua
results.append(data)
if client_name == 'ANDROID_VR' and direct_video:
debug_log('player api fast return', {'client': client_name, 'direct_video': len(direct_video)})
return results
if has_streaming and fallback is None:
fallback = data
elif fallback is None:
fallback = data
except Exception as e:
debug_log('player api client error', {'client': client_name, 'error': repr(e)})
continue
return results or ([fallback] if fallback else [])
def _normalize_format(self, fmt, player_url):
media_url = fmt.get('url')
if not media_url:
cipher = fmt.get('signatureCipher') or fmt.get('cipher')
if cipher:
media_url = self._decrypt_signature_cipher(cipher, player_url)
if not media_url:
return None
media_url = self._decrypt_nsig(media_url, player_url)
client_name = fmt.get('_client_name')
po_token = self._get_po_token(client_name, 'gvs') if client_name else None
if po_token:
sep = '&' if '?' in media_url else '?'
media_url = f'{media_url}{sep}pot={quote(po_token)}'
mime = fmt.get('mimeType') or ''
ext = 'mp4' if 'mp4' in mime else 'webm' if 'webm' in mime else 'unknown'
codecs = self._search(r'codecs="([^"]+)"', mime) or ''
has_audio = mime.startswith('audio/') or any(x in codecs for x in ('mp4a', 'opus', 'vorbis'))
has_video = mime.startswith('video/') or any(x in codecs for x in ('avc', 'vp9', 'av01', 'h264'))
headers = (fmt.get('http_headers') or {}).copy()
if fmt.get('_client_ua'):
headers['User-Agent'] = fmt.get('_client_ua')
return {
'itag': fmt.get('itag'),
'url': media_url,
'mimeType': mime,
'client': fmt.get('_client_name'),
'ext': ext,
'width': fmt.get('width') or 0,
'height': fmt.get('height') or 0,
'fps': fmt.get('fps') or 0,
'bitrate': fmt.get('bitrate') or fmt.get('averageBitrate') or 0,
'contentLength': fmt.get('contentLength'),
'initRange': fmt.get('initRange') or {},
'indexRange': fmt.get('indexRange') or {},
'codecs': codecs,
'quality': fmt.get('qualityLabel') or fmt.get('quality'),
'colorInfo': fmt.get('colorInfo') or {},
'vcodec': codecs if has_video else 'none',
'acodec': codecs if has_audio else 'none',
'headers': headers,
}
def _decrypt_signature_cipher(self, cipher, player_url):
data = parse_qs(cipher)
media_url = unquote(data.get('url', [''])[0])
sig = unquote(data.get('s', [''])[0])
sp = data.get('sp', ['sig'])[0]
if not media_url:
return ''
if sig:
decoded = self._decrypt_sig(sig, player_url)
debug_log('signature cipher', {'sp': sp, 'sig_len': len(sig), 'decoded_changed': decoded != sig, 'has_player': bool(player_url)})
sep = '&' if '?' in media_url else '?'
media_url = f'{media_url}{sep}{sp}={quote(decoded)}'
return media_url
def _decrypt_sig(self, sig, player_url):
cache_key = player_url or ''
if cache_key in self.sig_plan_cache:
plan = self.sig_plan_cache.get(cache_key)
debug_log('sig plan cache', {'has_plan': bool(plan), 'plan': plan[:8] if plan else None})
else:
code = self._get_player_code(player_url)
plan = self._extract_sig_plan(code)
self.sig_plan_cache[cache_key] = plan
debug_log('sig plan', {'code_len': len(code), 'has_plan': bool(plan), 'plan': plan[:8] if plan else None})
if not plan:
return sig
arr = list(sig)
for op, arg in plan:
if op == 'reverse':
arr.reverse()
elif op in ('slice', 'splice'):
arr = arr[int(arg):]
elif op == 'swap' and arr:
j = int(arg) % len(arr)
arr[0], arr[j] = arr[j], arr[0]
return ''.join(arr)
def _decrypt_nsig(self, media_url, player_url):
try:
parsed = urlparse(media_url)
query = parse_qs(parsed.query)
n_value = query.get('n', [None])[0]
if not n_value:
return media_url
path_match = re.search(r'/n/([^/]+)', parsed.path)
if path_match and path_match.group(1) != n_value:
new_path = parsed.path.replace(f"/n/{path_match.group(1)}", f"/n/{n_value}", 1)
fixed = urlunparse(parsed._replace(path=new_path))
debug_log('n path synced', {'old': path_match.group(1), 'new_len': len(n_value), 'changed': fixed != media_url})
return fixed
debug_log('n present', {'n_len': len(n_value), 'has_path_n': bool(path_match)})
return media_url
except Exception as e:
debug_log('n sync error', repr(e))
return media_url
def _get_player_code(self, player_url):
if not player_url:
return ''
if player_url in self.player_cache:
return self.player_cache[player_url]
if player_url.startswith('//'):
player_url = 'https:' + player_url
elif player_url.startswith('/'):
player_url = 'https://www.youtube.com' + player_url
try:
code = self._get(player_url).text
except Exception:
code = ''
self.player_cache[player_url] = code
return code
def _extract_sig_plan(self, code):
if not code:
return None
name = None
for pattern in [
r'\.sig\|\|([a-zA-Z0-9_$]+)\(',
r'"signature",\s*([a-zA-Z0-9_$]+)\(',
r'([a-zA-Z0-9_$]+)=function\(a\)\{a=a\.split\(""\);',
]:
m = re.search(pattern, code)
if m:
name = m.group(1)
break
if not name:
return None
body = self._extract_js_function_body(code, name)
if not body:
return None
helper = self._search(r'([a-zA-Z0-9_$]+)\.[a-zA-Z0-9_$]+\(a,\d+\)', body)
helper_map = self._extract_helper_object(code, helper) if helper else {}
plan = []
for part in body.split(';'):
if 'reverse()' in part:
plan.append(('reverse', 0))
continue
m = re.search(r'\.slice\((\d+)\)', part)
if m:
plan.append(('slice', int(m.group(1))))
continue
m = re.search(r'\.splice\(0,(\d+)\)', part)
if m:
plan.append(('splice', int(m.group(1))))
continue
m = re.search(r'([a-zA-Z0-9_$]+)\.([a-zA-Z0-9_$]+)\(a,(\d+)\)', part)
if m and m.group(1) == helper:
op = helper_map.get(m.group(2))
if op:
plan.append((op, int(m.group(3))))
return plan or None
def _extract_helper_object(self, code, name):
if not name:
return {}
m = re.search(r'var\s+' + re.escape(name) + r'=\{(.+?)\};', code, re.S) or re.search(re.escape(name) + r'=\{(.+?)\};', code, re.S)
if not m:
return {}
result = {}
for method, body in re.findall(r'([a-zA-Z0-9_$]+):function\([a-z,]+\)\{(.*?)\}', m.group(1)):
if '.reverse(' in body:
result[method] = 'reverse'
elif '.splice(' in body:
result[method] = 'splice'
elif '.slice(' in body:
result[method] = 'slice'
elif 'a[0]' in body and 'length' in body:
result[method] = 'swap'
return result
def _extract_n_function(self, code):
if not code:
return None
name = None
for pattern in [
r'\.get\("n"\)\)&&\(b=([a-zA-Z0-9_$]+)(?:\[(\d+)\])?\(b\)',
r'\.get\("n"\)\)&&\(b=([a-zA-Z0-9_$]+)\(b\)',
r'([a-zA-Z0-9_$]+)=function\(a\)\{var b=a\.split\(""\)',
r'function\s+([a-zA-Z0-9_$]+)\(a\)\{var b=a\.split\(""\)',
r'([a-zA-Z0-9_$]+)=function\(a\)\{a=a\.split\(""\)',
]:
m = re.search(pattern, code)
if m:
name = m.group(1)
break
if not name:
return None
body = self._extract_js_function_body(code, name)
debug_log('n function', {'name': name, 'body_len': len(body)})
if not body:
return None
def transform(value):
arr = list(value)
for part in body.split(';'):
if 'reverse()' in part:
arr.reverse()
m = re.search(r'\.slice\((\d+)\)', part)
if m:
arr = arr[int(m.group(1)):]
m = re.search(r'\.splice\(0,(\d+)\)', part)
if m:
arr = arr[int(m.group(1)):]
return ''.join(arr) or value
return transform
def _extract_js_function_body(self, code, name):
starts = []
for pattern in [
r'function\s+' + re.escape(name) + r'\s*\([^)]*\)\s*\{',
re.escape(name) + r'\s*=\s*function\s*\([^)]*\)\s*\{',
r'var\s+' + re.escape(name) + r'\s*=\s*function\s*\([^)]*\)\s*\{',
]:
m = re.search(pattern, code)
if m:
starts.append(m.end() - 1)
if not starts:
return ''
start = starts[0]
depth = 0
in_str = None
escape = False
for i in range(start, len(code)):
ch = code[i]
if escape:
escape = False
continue
if ch == '\\':
escape = True
continue
if in_str:
if ch == in_str:
in_str = None
continue
if ch in ('"', "'", '`'):
in_str = ch
continue
if ch == '{':
depth += 1
elif ch == '}':
depth -= 1
if depth == 0:
return code[start + 1:i]
return ''
def _extract_ytcfg(self, text):
m = re.search(r'ytcfg\.set\s*\(\s*({.+?})\s*\)\s*;', text, re.S)
if not m:
return None
try:
return json.loads(m.group(1))
except Exception:
return None
def _extract_initial_player_response(self, text):
return self._extract_json_after(text, 'ytInitialPlayerResponse')
def _extract_json_after(self, text, marker):
pos = text.find(marker)
if pos < 0:
return None
start = text.find('{', pos)
if start < 0:
return None
depth = 0
in_str = None
escape = False
for i in range(start, len(text)):
ch = text[i]
if escape:
escape = False
continue
if ch == '\\':
escape = True
continue
if in_str:
if ch == in_str:
in_str = None
continue
if ch == '"':
in_str = ch
continue
if ch == '{':
depth += 1
elif ch == '}':
depth -= 1
if depth == 0:
try:
return json.loads(text[start:i + 1])
except Exception:
return None
return None
def _extract_player_url(self, text):
for pattern in [
r'"jsUrl":"([^"]+)"',
r'"PLAYER_JS_URL":"([^"]+)"',
r'(/s/player/[^"\\]+/base\.js)',
]:
m = re.search(pattern, text)
if m:
return m.group(1).replace('\\/', '/')
return ''
@staticmethod
def _search(pattern, text, default=None):
m = re.search(pattern, text or '', re.S)
return m.group(1) if m else default
# ==================== 直播提取类 ====================
class YouTubeLiveLite:
"""直播提取(原 youtubelive.py"""
def __init__(self, session, headers=None, config=None):
self.session = session
self.headers = headers or {}
self.config = config or {}
self.cache = {}
self.cache_ttl = int(self.config.get('live_cache_ttl') or 45)
def extract_video_id(self, text):
text = str(text or '').strip()
for pattern in [
r'(?:v=|/v/|/embed/|/shorts/|youtu\.be/)([0-9A-Za-z_-]{11})',
r'^([0-9A-Za-z_-]{11})$',
]:
match = re.search(pattern, text)
if match:
return match.group(1)
raise Exception('无法识别 YouTube 视频 ID')
def extract_live(self, url_or_id):
video_id = self.extract_video_id(url_or_id)
now = time.time()
cached = self.cache.get(video_id)
if cached and cached.get('expires', 0) > now:
debug_log('live cache hit', {'video_id': video_id, 'ttl': int(cached.get('expires', 0) - now)})
return cached.get('data')
watch_url = f'https://www.youtube.com/watch?v={video_id}'
debug_log('live extract start', {'input': url_or_id, 'video_id': video_id})
response = self._get(watch_url)
page = response.text
player_response = self._extract_initial_player_response(page) or {}
ytcfg = self._extract_ytcfg(page) or {}
api_key = ytcfg.get('INNERTUBE_API_KEY') or self._search(r'"INNERTUBE_API_KEY":"([^"]+)"', page)
visitor_data = self._extract_visitor_data(ytcfg, player_response)
status_obj = player_response.get('playabilityStatus') or {}
streaming = player_response.get('streamingData') or {}
details = player_response.get('videoDetails') or {}
debug_log('live page parsed', {
'status': status_obj.get('status'),
'reason': status_obj.get('reason'),
'is_live': details.get('isLiveContent'),
'has_hls': bool(streaming.get('hlsManifestUrl')),
'has_api_key': bool(api_key),
'has_visitor': bool(visitor_data),
})
page_hls_url = streaming.get('hlsManifestUrl') or ''
hls_source = 'page' if page_hls_url else ''
api_data = None
if api_key:
api_data = self._call_player_api(video_id, api_key, ytcfg, watch_url, visitor_data)
if api_data:
api_streaming = api_data.get('streamingData') or {}
api_details = api_data.get('videoDetails') or {}
api_hls_url = api_streaming.get('hlsManifestUrl') or ''
if api_hls_url:
streaming = api_streaming
hls_source = api_data.get('_client_name') or 'api'
elif not page_hls_url and api_streaming:
streaming = api_streaming
hls_source = api_data.get('_client_name') or 'api_no_hls'
if api_details:
details = api_details
status_obj = api_data.get('playabilityStatus') or status_obj
if not (streaming.get('hlsManifestUrl') or '') and page_hls_url:
streaming = dict(streaming or {})
streaming['hlsManifestUrl'] = page_hls_url
hls_source = 'page_fallback'
hls_url = streaming.get('hlsManifestUrl') or ''
is_live = bool(details.get('isLiveContent') or hls_url)
status = status_obj.get('status') or ''
reason = status_obj.get('reason') or ''
title = details.get('title') or video_id
data = {
'id': video_id,
'title': title,
'is_live': is_live,
'status': status,
'reason': reason,
'hls_url': hls_url,
'duration': int(details.get('lengthSeconds') or 0),
}
debug_log('live extract result', {
'video_id': video_id,
'status': status,
'is_live': is_live,
'has_hls': bool(hls_url),
'hls_source': hls_source,
'duration': data.get('duration'),
})
self.cache[video_id] = {'data': data, 'expires': time.time() + self.cache_ttl}
return data
def _get(self, url, **kwargs):
headers = self.headers.copy()
headers.update(kwargs.pop('headers', {}) or {})
response = self.session.get(url, headers=headers, timeout=kwargs.pop('timeout', 15), **kwargs)
response.raise_for_status()
return response
def _post_json(self, url, payload, headers=None):
final_headers = self.headers.copy()
final_headers.update({'Content-Type': 'application/json', 'Origin': 'https://www.youtube.com'})
if headers:
final_headers.update({k: v for k, v in headers.items() if v})
response = self.session.post(url, json=payload, headers=final_headers, timeout=15)
response.raise_for_status()
return response.json()
def _call_player_api(self, video_id, api_key, ytcfg, referer, visitor_data=None):
context = ytcfg.get('INNERTUBE_CONTEXT') or {
'client': {'clientName': 'WEB', 'clientVersion': '2.20240310.01.00', 'hl': 'en', 'gl': 'US'}
}
clients = [
{'client': {'clientName': 'ANDROID', 'clientVersion': '21.02.35', 'androidSdkVersion': 30, 'userAgent': 'com.google.android.youtube/21.02.35 (Linux; U; Android 11) gzip', 'osName': 'Android', 'osVersion': '11', 'hl': 'en', 'gl': 'US'}},
{'client': {'clientName': 'IOS', 'clientVersion': '21.02.3', 'deviceMake': 'Apple', 'deviceModel': 'iPhone16,2', 'userAgent': 'com.google.ios.youtube/21.02.3 (iPhone16,2; U; CPU iOS 18_3_2 like Mac OS X;)', 'osName': 'iPhone', 'osVersion': '18.3.2.22D82', 'hl': 'en', 'gl': 'US'}},
{'client': {'clientName': 'MWEB', 'clientVersion': '2.20260115.01.00', 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1', 'hl': 'en', 'gl': 'US'}},
context,
]
for ctx in clients:
client = ctx.get('client') or {}
client_name = client.get('clientName') or 'WEB'
try:
url = f'https://www.youtube.com/youtubei/v1/player?key={quote(api_key)}&prettyPrint=false'
headers = {
'Referer': referer,
'X-YouTube-Client-Name': str(self._client_name_id(client_name)),
'X-YouTube-Client-Version': client.get('clientVersion') or '',
}
if visitor_data:
headers['X-Goog-Visitor-Id'] = visitor_data
if client.get('userAgent'):
headers['User-Agent'] = client.get('userAgent')
payload = {
'context': ctx,
'videoId': video_id,
'contentCheckOk': True,
'racyCheckOk': True,
}
data = self._post_json(url, payload, headers=headers)
streaming = data.get('streamingData') or {}
status = (data.get('playabilityStatus') or {}).get('status')
debug_log('live api client', {
'client': client_name,
'status': status,
'has_hls': bool(streaming.get('hlsManifestUrl')),
'has_streaming': bool(streaming),
})
if streaming.get('hlsManifestUrl'):
data['_client_name'] = client_name
return data
except Exception as e:
debug_log('live api client error', {'client': client_name, 'error': repr(e)})
return None
def _extract_visitor_data(self, ytcfg, player_response):
return (
self.config.get('visitor_data')
or ytcfg.get('VISITOR_DATA')
or (((ytcfg.get('INNERTUBE_CONTEXT') or {}).get('client') or {}).get('visitorData'))
or ((player_response.get('responseContext') or {}).get('visitorData'))
)
def _extract_ytcfg(self, text):
m = re.search(r'ytcfg\.set\s*\(\s*({.+?})\s*\)\s*;', text, re.S)
if not m:
return None
try:
return json.loads(m.group(1))
except Exception:
return None
def _extract_initial_player_response(self, text):
return self._extract_json_after(text, 'ytInitialPlayerResponse')
def _extract_json_after(self, text, marker):
pos = text.find(marker)
if pos < 0:
return None
start = text.find('{', pos)
if start < 0:
return None
depth = 0
in_str = None
escape = False
for i in range(start, len(text)):
ch = text[i]
if escape:
escape = False
continue
if ch == '\\':
escape = True
continue
if in_str:
if ch == in_str:
in_str = None
continue
if ch == '"':
in_str = ch
continue
if ch == '{':
depth += 1
elif ch == '}':
depth -= 1
if depth == 0:
try:
return json.loads(text[start:i + 1])
except Exception:
return None
return None
@staticmethod
def _search(pattern, text, default=None):
m = re.search(pattern, text or '', re.S)
return m.group(1) if m else default
def _client_name_id(self, client_name):
return {
'WEB': 1,
'MWEB': 2,
'ANDROID': 3,
'IOS': 5,
'TVHTML5': 7,
'ANDROID_VR': 28,
'WEB_EMBEDDED_PLAYER': 56,
'WEB_REMIX': 67,
}.get(client_name, 1)
# ==================== 主 Spider 类 ====================
class Spider(Spider):
def getName(self):
return 'YouTube 视频+直播(优化版)'
def init(self, extend):
try:
self.extendDict = json.loads(extend) if extend else {}
except Exception:
self.extendDict = {}
self.session = requests.Session()
# 确保 requests 在没有指定代理时,信任环境变量中的系统代理配置
self.session.trust_env = True
# ----- 1. 代理配置:三级回退逻辑 -----
self.proxy_str = None
proxy = self.extendDict.get('proxy')
if proxy:
# 第一级:优先使用 ext 传入的代理
if isinstance(proxy, str):
if not proxy.startswith('http://') and not proxy.startswith('https://'):
proxy = 'http://' + proxy
self.session.proxies = {'http': proxy, 'https': proxy}
self.proxy_str = proxy.replace('http://', '').replace('https://', '')
debug_log('使用 ext 传入代理', {'proxy': proxy})
elif isinstance(proxy, dict):
proxies = {}
for k, v in proxy.items():
if k in ('http', 'https') and v:
if not v.startswith('http://') and not v.startswith('https://'):
v = 'http://' + v
proxies[k] = v
if proxies:
self.session.proxies = proxies
self.proxy_str = (proxies.get('https') or proxies.get('http') or '').replace('http://', '').replace('https://', '')
debug_log('使用 ext 传入的字典代理', proxies)
else:
self._auto_detect_proxy()
else:
self._auto_detect_proxy()
else:
# 第二级/第三级:如果不写/没传入,进入自动探测回退流程
self._auto_detect_proxy()
# ---------------------------------------------------------
# ----- 2. 加载自定义分类与过滤器配置 -----
self.yt_classes = YOUTUBE_CLASSES
self.yt_filters = CATEGORY_FILTERS
if 'json' in self.extendDict and self.extendDict['json']:
try:
config_url = self.extendDict['json']
if config_url.startswith('./'):
import os
config_path = os.path.join(os.path.dirname(__file__), config_url[2:])
with open(config_path, 'r', encoding='utf-8') as f:
custom_config = json.load(f)
else:
# 使用当前确定好的代理去请求 JSON
r = self.session.get(config_url, timeout=10)
custom_config = r.json()
if 'class' in custom_config:
self.yt_classes = custom_config['class']
if 'filters' in custom_config:
self.yt_filters = custom_config['filters']
except Exception as e:
debug_log("加载外部 JSON 配置文件失败", repr(e))
self.header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
'Referer': 'https://www.youtube.com/'
}
self.session.headers.update(self.header)
# 初始化两个提取器
self.yt_video = YouTubeLite(self.session, self.header, self.extendDict)
self.yt_live = YouTubeLiveLite(self.session, self.header, self.extendDict)
self.search_page_cache = {} # 视频搜索缓存
self.live_search_cache = {} # 直播搜索缓存
self.hls_url_cache = {} # 直播 HLS 代理缓存
self.hls_proxy_enabled = self.extendDict.get('hls_proxy', True) is not False
self._hls_key_seq = 0
self.direct_segments = str(self.extendDict.get('seg') or 'proxy').lower() == 'direct'
def _auto_detect_proxy(self):
"""代理逻辑 2 & 3:探测内置列表,若都不行则清空,回退使用系统/全局代理"""
proxy_list = [
"http://127.0.0.1:2080",
"http://127.0.0.1:7890",
"http://127.0.0.1:10809",
"http://127.0.0.1:10172",
"http://127.0.0.1:20172",
"http://127.0.0.1:7891",
"http://127.0.0.1:10808",
"http://127.0.0.1:1087",
"http://127.0.0.1:3128",
"http://127.0.0.1:1080",
"http://127.0.0.1:8080",
"http://127.0.0.1:9090"
]
# 第二级:探测内置列表
for p in proxy_list:
try:
test_proxies = {'http': p, 'https': p}
# 设置较短超时时间,快速失败
r = requests.get('https://www.youtube.com', proxies=test_proxies, timeout=2)
if r.status_code < 400:
self.session.proxies = test_proxies
self.proxy_str = p.replace('http://', '').replace('https://', '')
debug_log('内置代理探测成功,使用内置', {'proxy': p})
return
except Exception:
continue
# 第三级:如果所有预设都失败,清空 proxies 字典,回退到全局/系统代理
self.session.proxies = {}
self.proxy_str = ''
debug_log('所有内置代理均不可用,清空设置,回退使用系统/全局代理')
def homeContent(self, filter):
result = {'class': self.yt_classes}
if filter:
video_filters = {}
for c in self.yt_classes:
cid = c['type_id']
if cid in self.yt_filters:
video_filters[cid] = self.yt_filters[cid]
result['filters'] = video_filters
return result
def homeVideoContent(self):
return {'list': []}
def categoryContent(self, cid, page, filter, ext):
page = int(page or 1)
filters = ext if isinstance(ext, dict) else {}
if self._is_live_category(cid):
keyword = self._build_live_keyword(cid, filters)
videos, has_more = self._search_live_page(keyword, page)
else:
keyword = self._build_video_keyword(cid, filters)
videos, has_more = self._search_video_page(keyword, page)
return {
'list': videos,
'page': page,
'pagecount': page + 1 if has_more else page,
'limit': len(videos),
'total': len(videos)
}
def searchContent(self, key, quick, pg=1):
page = int(pg or 1)
keyword = str(key or '').strip()
videos_v, _ = self._search_video_page(keyword, page)
live_keyword = f'{keyword} live' if 'live' not in keyword.lower() and '直播' not in keyword else keyword
videos_l, _ = self._search_live_page(live_keyword, page)
seen = set()
merged = []
for v in videos_v + videos_l:
if v['vod_id'] not in seen:
seen.add(v['vod_id'])
merged.append(v)
return {
'list': merged[:30],
'page': page,
'pagecount': page + 1,
'limit': len(merged),
'total': len(merged)
}
# ---------- 画质名称辅助 ----------
def _get_quality_label(self, height):
if height >= 2160:
return '4K'
elif height >= 1440:
return '2K'
elif height >= 1080:
return '1080P'
elif height >= 720:
return '720P'
elif height >= 480:
return '480P'
elif height >= 360:
return '360P'
else:
return f'{height}P'
# ---------- 解析 HLS 主播放列表(直播多画质) ----------
def _parse_hls_master(self, master_url):
"""返回 list of dict: {height, width, bandwidth, url}"""
try:
r = self.session.get(master_url, headers=self.header, timeout=10)
r.raise_for_status()
lines = r.text.splitlines()
variants = []
i = 0
while i < len(lines):
line = lines[i].strip()
if line.startswith('#EXT-X-STREAM-INF'):
bandwidth = re.search(r'BANDWIDTH=(\d+)', line)
resolution = re.search(r'RESOLUTION=(\d+)x(\d+)', line)
height = int(resolution.group(2)) if resolution else 0
width = int(resolution.group(1)) if resolution else 0
bw = int(bandwidth.group(1)) if bandwidth else 0
if i + 1 < len(lines):
url_line = lines[i+1].strip()
if not url_line.startswith('#'):
full_url = urljoin(master_url, url_line)
variants.append({
'height': height,
'width': width,
'bandwidth': bw,
'url': full_url
})
i += 2
else:
i += 1
variants.sort(key=lambda x: x['height'], reverse=True)
return variants
except Exception as e:
debug_log('parse hls master error', {'master_url': master_url, 'error': repr(e)})
return []
# ---------- detailContent(方案A:按高度分 SDR/HDR ----------
def detailContent(self, did):
video_id = did[0]
# 检测是否为直播
try:
live_data = self.yt_live.extract_live(video_id)
is_live = live_data.get('is_live') or bool(live_data.get('hls_url'))
title = live_data.get('title') or video_id
status = '直播中' if is_live else '未开播'
except Exception as e:
debug_log('detail live check failed', {'video_id': video_id, 'error': repr(e)})
is_live = False
title = self._get_video_title(video_id) or video_id
status = '视频'
play_sources = []
play_urls = []
if is_live:
hls_url = live_data.get('hls_url')
if hls_url:
variants = self._parse_hls_master(hls_url)
if variants:
for v in variants:
height = v['height']
label = self._get_quality_label(height)
cache_key = f'live_{video_id}_{height}'
self.setCache(cache_key, {'url': v['url'], 'expires': time.time() + 300})
play_sources.append(label)
play_urls.append(f'{label}${video_id}@live_{height}')
else:
play_sources.append('直播')
play_urls.append(f'直播${video_id}@live')
else:
play_sources.append('直播')
play_urls.append(f'直播${video_id}@live')
else:
# ---- 点播:方案A ----
try:
data = self.yt_video.extract(video_id)
formats = data.get('formats', [])
# 只取视频流
video_streams = [f for f in formats if f.get('vcodec') != 'none' and f.get('acodec') == 'none']
# 按高度分组
height_groups = {}
for f in video_streams:
h = int(f.get('height', 0))
if h <= 0:
continue
height_groups.setdefault(h, []).append(f)
# 对每个高度,按码率排序取最佳,并区分 SDR/HDR
for h in sorted(height_groups.keys(), reverse=True):
items = height_groups[h]
# 选 SDR 和 HDR 中码率最高的各一个
sdr_items = [x for x in items if not self.yt_video._is_hdr_video(x)]
hdr_items = [x for x in items if self.yt_video._is_hdr_video(x)]
sdr_item = max(sdr_items, key=lambda x: int(x.get('bitrate') or 0)) if sdr_items else None
hdr_item = max(hdr_items, key=lambda x: int(x.get('bitrate') or 0)) if hdr_items else None
label_base = self._get_quality_label(h)
if sdr_item:
name = f'{label_base} SDR'
play_sources.append(name)
play_urls.append(f'{name}${video_id}@{h}_sdr')
if hdr_item:
name = f'{label_base} HDR'
play_sources.append(name)
play_urls.append(f'{name}${video_id}@{h}_hdr')
# 若两者都无(理论上不会),忽略
# 如果没有生成任何线路,回退
if not play_sources:
raise Exception('No video streams found')
except Exception as e:
debug_log('detail get formats error', {'video_id': video_id, 'error': repr(e)})
play_sources.append('最高画质')
play_urls.append(f'最高画质${video_id}@best')
# 获取相关推荐
related = []
try:
r = self.session.get(f'https://www.youtube.com/watch?v={video_id}', timeout=10)
related = self._extract_videos_fixed(r.text, 20)
except Exception:
pass
if related:
related_urls = []
for v in related:
if v.get('vod_id') != video_id:
related_urls.append(f"{self._safe_title(v['vod_name'])}${v['vod_id']}@best")
if related_urls:
play_sources.append('相关推荐')
play_urls.append('#'.join(related_urls))
vod = {
'vod_id': video_id,
'vod_name': title,
'vod_pic': f'http://127.0.0.1:9978/proxy?do=py&type=image&vid={video_id}',
'vod_remarks': status,
'vod_play_from': '$$$'.join(play_sources),
'vod_play_url': '$$$'.join(play_urls)
}
return {'list': [vod]}
# ---------- playerContent ----------
def playerContent(self, flag, pid, vipFlags):
raw_pid = pid.split('$')[-1]
if '@' in raw_pid:
video_id, quality_or_type = raw_pid.rsplit('@', 1)
else:
video_id, quality_or_type = raw_pid, 'best'
# 直播处理
if quality_or_type == 'live':
return self._play_live(video_id)
elif quality_or_type.startswith('live_'):
height_str = quality_or_type.split('_')[1]
if height_str.isdigit():
return self._play_live_by_height(video_id, int(height_str))
else:
return self._play_live(video_id)
else:
# 点播:解析高度和类型
if quality_or_type.endswith('_sdr') or quality_or_type.endswith('_hdr'):
parts = quality_or_type.rsplit('_', 1)
if len(parts) == 2 and parts[1] in ('sdr', 'hdr'):
height_str, hdr_flag = parts
if height_str.isdigit():
return self._play_video_by_height_and_type(video_id, int(height_str), hdr_flag)
# 兼容旧格式(纯高度或 best 等)
if quality_or_type.isdigit():
return self._play_video_by_height_and_type(video_id, int(quality_or_type), 'sdr') # 默认 SDR
else:
quality = quality_or_type if quality_or_type in ('best', '4k', '2k', '1080p') else 'best'
return self._play_video(video_id, quality)
# ---------- 按高度和 SDR/HDR 类型播放点播 ----------
def _play_video_by_height_and_type(self, video_id, target_height, hdr_type):
try:
data = self.yt_video.extract(video_id)
formats = data.get('formats', [])
video_streams = [f for f in formats if f.get('vcodec') != 'none' and f.get('acodec') == 'none']
# 按高度筛选(>= target_height 中取最小,若无则取最大)
candidates = [f for f in video_streams if int(f.get('height', 0)) >= target_height]
if not candidates:
candidates = video_streams
# 再按 HDR 类型筛选
is_hdr_wanted = (hdr_type == 'hdr')
candidates = [f for f in candidates if self.yt_video._is_hdr_video(f) == is_hdr_wanted]
if not candidates:
# 若无匹配,则取该类型中任意一个(或回退到无类型)
candidates = [f for f in video_streams if self.yt_video._is_hdr_video(f) == is_hdr_wanted]
if not candidates:
candidates = video_streams # 最终回退
# 选码率最高的
selected_video = max(candidates, key=lambda x: int(x.get('bitrate') or 0))
audio = self.yt_video.choose_audio(formats)
if audio:
cache_key = f'yt_{video_id}_{target_height}_{hdr_type}'
self.setCache(cache_key, {
'video_tracks': [selected_video],
'video_url': selected_video['url'],
'audio_url': audio['url'],
'video_item': selected_video,
'audio_item': audio,
'duration': data.get('duration') or 0,
'expires': time.time() + 300,
})
return {
'parse': 0,
'jx': 0,
'url': f'http://127.0.0.1:9978/proxy?do=py&type=mpd&vid={video_id}&quality={target_height}_{hdr_type}',
'format': 'application/dash+xml'
}
else:
headers = self.header.copy()
headers.update(selected_video.get('headers') or {})
return {'parse': 0, 'jx': 0, 'url': selected_video['url'], 'header': headers}
except Exception as e:
debug_log('_play_video_by_height_and_type error', {'video_id': video_id, 'height': target_height, 'type': hdr_type, 'error': repr(e)})
return {'parse': 1, 'url': f'https://www.youtube.com/embed/{video_id}?autoplay=1', 'header': json.dumps(self.header)}
def _play_live_by_height(self, video_id, target_height):
cache_key = f'live_{video_id}_{target_height}'
cached = self.getCache(cache_key)
if cached and cached.get('url'):
variant_url = cached['url']
if self.hls_proxy_enabled:
play_url = self._cache_hls_url(variant_url, video_id, 'master')
else:
play_url = variant_url
return {
'parse': 0,
'jx': 0,
'url': play_url,
'header': self.header,
'format': 'application/x-mpegURL'
}
else:
return self._play_live(video_id)
def _is_live_category(self, cid):
cid_lower = cid.lower()
return 'live' in cid_lower or '直播' in cid_lower
def _build_live_keyword(self, cid, filters=None):
terms = [cid]
if isinstance(filters, dict):
for value in filters.values():
term = self._normalize_filter_term(value)
if term:
terms.append(term)
keyword = ' '.join([x for x in terms if x]).strip()
if 'live' not in keyword.lower() and '直播' not in keyword:
keyword = f'{keyword} live'
return keyword
def _build_video_keyword(self, cid, filters=None):
if cid.startswith('LIST:'):
raw = cid[5:].strip()
channels = [ch.strip() for ch in raw.split(',') if ch.strip()]
terms = []
for ch in channels:
if ch.startswith('@'):
terms.append(f'channel:{ch}')
else:
terms.append(f'"{ch}"')
keyword = ' OR '.join(terms) if terms else ''
else:
keyword = cid
if isinstance(filters, dict):
for value in filters.values():
term = self._normalize_filter_term(value)
if term:
keyword += ' ' + term
return keyword.strip()
def _normalize_filter_term(self, value):
if isinstance(value, (list, tuple)):
return ' '.join([self._normalize_filter_term(item) for item in value if item])
if isinstance(value, dict):
return ' '.join([self._normalize_filter_term(item) for item in value.values() if item])
return re.sub(r'\s+', ' ', str(value or '')).strip()[:180]
def _search_cache_key(self, key):
return re.sub(r'\s+', ' ', str(key or '')).strip().lower()
def _search_video_page(self, key, page=1):
page = max(1, int(page or 1))
cache_key = self._search_cache_key(key)
session = self.search_page_cache.get(cache_key)
if page == 1 or not session:
session = self._fetch_search_first_page(key)
self.search_page_cache[cache_key] = session
while len(session.get('pages', [])) < page and session.get('next'):
data = self._fetch_search_continuation(session)
videos = self._extract_videos_from_api(data, 30)
session.setdefault('pages', []).append(videos)
session['next'] = self._extract_continuation_token(data)
pages = session.get('pages', [])
videos = pages[page - 1] if len(pages) >= page else []
has_more = bool(session.get('next')) or len(pages) > page
return videos, has_more
def _search_live_page(self, key, page=1):
page = max(1, int(page or 1))
cache_key = f'live_{self._search_cache_key(key)}'
session = self.live_search_cache.get(cache_key)
if page == 1 or not session:
session = self._fetch_live_search_first_page(key)
self.live_search_cache[cache_key] = session
while len(session.get('pages', [])) < page and session.get('next'):
data = self._fetch_search_continuation(session)
videos = self._extract_live_videos_from_api(data, 30)
session.setdefault('pages', []).append(videos)
session['next'] = self._extract_continuation_token(data)
pages = session.get('pages', [])
videos = pages[page - 1] if len(pages) >= page else []
has_more = bool(session.get('next')) or len(pages) > page
return videos, has_more
def _fetch_live_search_first_page(self, key):
search_url = f'https://www.youtube.com/results?search_query={quote(str(key or ""))}&sp=EgJAAQ%253D%253D'
r = self.session.get(search_url, timeout=10)
html_str = r.text
data = self.yt_video._extract_json_after(html_str, 'ytInitialData') or {}
ytcfg = self.yt_video._extract_ytcfg(html_str) or {}
api_key = ytcfg.get('INNERTUBE_API_KEY') or self.yt_video._search(r'"INNERTUBE_API_KEY":"([^"]+)"', html_str)
context = ytcfg.get('INNERTUBE_CONTEXT') or {'client': {'clientName': 'WEB', 'clientVersion': '2.20240310.01.00', 'hl': 'zh-CN', 'gl': 'US'}}
client = context.get('client') or {}
return {
'key': key,
'api_key': api_key,
'context': context,
'client_name': client.get('clientName') or 'WEB',
'client_version': client.get('clientVersion') or '2.20240310.01.00',
'referer': search_url,
'pages': [self._extract_live_videos_from_api(data, 30)],
'next': self._extract_continuation_token(data),
}
def _fetch_search_first_page(self, key):
search_url = f'https://www.youtube.com/results?search_query={quote(str(key or ""))}'
r = self.session.get(search_url, timeout=10)
html_str = r.text
data = self.yt_video._extract_json_after(html_str, 'ytInitialData') or {}
ytcfg = self.yt_video._extract_ytcfg(html_str) or {}
api_key = ytcfg.get('INNERTUBE_API_KEY') or self.yt_video._search(r'"INNERTUBE_API_KEY":"([^"]+)"', html_str)
context = ytcfg.get('INNERTUBE_CONTEXT') or {'client': {'clientName': 'WEB', 'clientVersion': '2.20240310.01.00', 'hl': 'zh-CN', 'gl': 'US'}}
client = context.get('client') or {}
return {
'key': key,
'api_key': api_key,
'context': context,
'client_name': client.get('clientName') or 'WEB',
'client_version': client.get('clientVersion') or '2.20240310.01.00',
'referer': search_url,
'pages': [self._extract_videos_from_api(data, 30)],
'next': self._extract_continuation_token(data),
}
def _fetch_search_continuation(self, session):
token = session.get('next')
api_key = session.get('api_key')
if not token or not api_key:
return {}
url = f'https://www.youtube.com/youtubei/v1/search?key={quote(api_key)}'
headers = self.header.copy()
headers.update({
'Content-Type': 'application/json',
'Origin': 'https://www.youtube.com',
'Referer': session.get('referer') or 'https://www.youtube.com/',
'X-YouTube-Client-Name': str(self.yt_video._client_name_id(session.get('client_name'))),
'X-YouTube-Client-Version': session.get('client_version') or '2.20240310.01.00',
})
payload = {'context': session.get('context') or {}, 'continuation': token}
r = self.session.post(url, json=payload, headers=headers, timeout=10)
r.raise_for_status()
return r.json()
def _extract_continuation_token(self, data):
tokens = []
def scan(obj):
if isinstance(obj, dict):
endpoint = obj.get('continuationEndpoint') or {}
token = endpoint.get('continuationCommand', {}).get('token')
if token:
tokens.append(token)
renderer = obj.get('continuationItemRenderer') or {}
token = renderer.get('continuationEndpoint', {}).get('continuationCommand', {}).get('token')
if token:
tokens.append(token)
for value in obj.values():
scan(value)
elif isinstance(obj, list):
for value in obj:
scan(value)
scan(data)
return tokens[0] if tokens else ''
def _extract_videos_from_api(self, data, limit=30):
videos = []
seen = set()
def scan(obj):
if len(videos) >= limit:
return
if isinstance(obj, dict):
for key in ('videoRenderer', 'compactVideoRenderer', 'gridVideoRenderer'):
if key in obj:
item = self._parse_renderer(obj[key], is_live=False)
if item and item['vod_id'] not in seen:
seen.add(item['vod_id'])
videos.append(item)
for value in obj.values():
scan(value)
elif isinstance(obj, list):
for value in obj:
scan(value)
scan(data)
return videos[:limit]
def _extract_live_videos_from_api(self, data, limit=30):
videos = []
seen = set()
def scan(obj):
if len(videos) >= limit:
return
if isinstance(obj, dict):
for key in ('videoRenderer', 'compactVideoRenderer', 'gridVideoRenderer'):
if key in obj:
item = self._parse_renderer(obj[key], is_live=True)
if item and item['vod_id'] not in seen:
seen.add(item['vod_id'])
videos.append(item)
for value in obj.values():
scan(value)
elif isinstance(obj, list):
for value in obj:
scan(value)
scan(data)
return videos[:limit]
def _parse_renderer(self, renderer, is_live=False):
try:
vid = renderer.get('videoId')
if not vid:
nav = renderer.get('navigationEndpoint') or {}
vid = (nav.get('watchEndpoint') or {}).get('videoId')
if not vid:
return None
title_obj = renderer.get('title') or renderer.get('headline') or {}
title = title_obj.get('simpleText') or ''.join([x.get('text', '') for x in title_obj.get('runs', [])]) or 'YouTube Video'
dur = (renderer.get('lengthText') or {}).get('simpleText') or ''
if is_live:
remarks = '直播'
else:
remarks = dur if dur else '视频'
return {
'vod_id': vid,
'vod_name': html.unescape(title),
'vod_pic': f'http://127.0.0.1:9978/proxy?do=py&type=image&vid={vid}',
'vod_remarks': remarks
}
except Exception:
return None
def _extract_videos_fixed(self, html_str, limit=30):
data = None
match = re.search(r'var ytInitialData = (\{.*?\});', html_str)
if match:
try:
data = json.loads(match.group(1))
except Exception:
data = None
if not data:
return []
return self._extract_videos_from_api(data, limit)
def _get_video_title(self, vid):
try:
r = self.session.get(f'https://www.youtube.com/oembed?url=https://www.youtube.com/watch?v={vid}&format=json', timeout=5)
return r.json().get('title') or vid
except Exception:
return vid
def _safe_title(self, title):
if not title:
return 'video'
return re.sub(r'[#$@%&!?*|\\/:<>]', ' ', title)[:60]
def _play_live(self, video_id):
try:
data = self.yt_live.extract_live(video_id)
hls_url = data.get('hls_url') or ''
if not hls_url:
status = data.get('status') or 'NO_HLS'
reason = data.get('reason') or '未获取到直播 HLS 地址'
debug_log('_play_live no hls', {'video_id': video_id, 'status': status, 'reason': reason})
raise Exception(reason)
if self.extendDict.get('hls_probe'):
self._probe_hls(video_id, hls_url)
play_url = hls_url
if self.hls_proxy_enabled:
play_url = self._cache_hls_url(hls_url, video_id, 'master')
debug_log('return live hls', {'video_id': video_id, 'url_len': len(hls_url), 'status': data.get('status'), 'proxy': self.hls_proxy_enabled})
return {
'parse': 0,
'jx': 0,
'url': play_url,
'header': self.header,
'format': 'application/x-mpegURL'
}
except Exception as e:
debug_log('_play_live error', {'video_id': video_id, 'error': repr(e)})
return {'parse': 1, 'jx': 1, 'url': f'https://www.youtube.com/embed/{video_id}?autoplay=1'}
def _play_video(self, video_id, quality):
try:
data = self.yt_video.extract(video_id)
playable = self.yt_video.choose_playable(data['formats'], quality)
if playable:
audio = self.yt_video.choose_audio(data['formats'])
debug_log('selected playable', {'itag': playable.get('itag'), 'client': playable.get('client'), 'mime': playable.get('mimeType'), 'height': playable.get('height'), 'has_n': 'n=' in playable.get('url', ''), 'redirected': bool(playable.get('redirected')), 'ua': (playable.get('headers') or {}).get('User-Agent', '')[:60], 'url_len': len(playable.get('url', ''))})
debug_log('selected audio', {'itag': audio.get('itag') if audio else None, 'client': audio.get('client') if audio else None, 'mime': audio.get('mimeType') if audio else None, 'bitrate': audio.get('bitrate') if audio else None})
if audio:
cache_key = f'yt_{video_id}_{quality}'
self.setCache(cache_key, {
'video_url': playable['url'],
'audio_url': audio['url'],
'video_item': playable,
'audio_item': audio,
'duration': data.get('duration') or 0,
'expires': time.time() + 300,
})
return {'parse': 0, 'jx': 0, 'url': f'http://127.0.0.1:9978/proxy?do=py&type=mpd&vid={video_id}&quality={quality}', 'format': 'application/dash+xml'}
debug_log('return direct url', self.yt_video._url_summary(playable.get('url')))
headers = self.header.copy()
headers.update(playable.get('headers') or {})
return {'parse': 0, 'jx': 0, 'url': playable['url'], 'header': headers}
raise Exception(f'没有可直接播放的 {quality} 视频流格式')
except Exception as e:
debug_log('_play_video error', repr(e))
return {'parse': 1, 'url': f'https://www.youtube.com/embed/{video_id}?autoplay=1', 'header': json.dumps(self.header)}
# ------------------ HLS 代理(原 youtubelive ------------------
def _probe_hls(self, video_id, hls_url):
try:
response = self.session.get(hls_url, headers=self.header, timeout=10)
full_text = response.text or ''
text = full_text[:5000]
lines = [line.strip() for line in full_text.splitlines() if line.strip()][:12]
variant_url = self._pick_variant_playlist(hls_url, full_text)
debug_log('hls master probe', {
'video_id': video_id,
'status': response.status_code,
'content_type': response.headers.get('content-type'),
'length': len(response.text or ''),
'has_extm3u': text.startswith('#EXTM3U'),
'has_stream_inf': '#EXT-X-STREAM-INF' in text,
'has_media_sequence': '#EXT-X-MEDIA-SEQUENCE' in text,
'variant': bool(variant_url),
'sample': lines,
})
if variant_url:
child = self.session.get(variant_url, headers=self.header, timeout=10)
child_text = child.text[:5000] if child.text else ''
child_lines = [line.strip() for line in child_text.splitlines() if line.strip()][:12]
debug_log('hls variant probe', {
'video_id': video_id,
'status': child.status_code,
'content_type': child.headers.get('content-type'),
'length': len(child.text or ''),
'has_extm3u': child_text.startswith('#EXTM3U'),
'has_media_sequence': '#EXT-X-MEDIA-SEQUENCE' in child_text,
'has_segments': bool(re.search(r'^[^#].+', child_text, re.M)),
'sample': child_lines,
})
except Exception as e:
debug_log('hls probe error', {'video_id': video_id, 'error': repr(e)})
def _pick_variant_playlist(self, base_url, text):
lines = [line.strip() for line in (text or '').splitlines()]
best_score = -1
best_url = ''
for index, line in enumerate(lines):
if not line.startswith('#EXT-X-STREAM-INF'):
continue
score = 0
bandwidth = re.search(r'BANDWIDTH=(\d+)', line)
resolution = re.search(r'RESOLUTION=(\d+)x(\d+)', line)
if bandwidth:
score += int(bandwidth.group(1))
if resolution:
score += int(resolution.group(1)) * int(resolution.group(2))
for next_line in lines[index + 1:]:
if not next_line or next_line.startswith('#'):
continue
if score > best_score:
best_score = score
best_url = urljoin(base_url, next_line)
break
return best_url
HLS_TTL = {'master': 6 * 3600, 'playlist': 6 * 3600, 'media': 120, 'media_retry': 120}
def _hls_ttl(self, kind):
return self.HLS_TTL.get(kind, 180)
def _prune_hls_cache(self):
now = time.time()
expired = [k for k, v in self.hls_url_cache.items() if v.get('expires', 0) < now]
for k in expired:
self.hls_url_cache.pop(k, None)
def _cache_hls_url(self, target_url, video_id='', kind='media'):
self._prune_hls_cache()
self._hls_key_seq += 1
key = f'{int(time.time() * 1000)}_{self._hls_key_seq}'
self.hls_url_cache[key] = {
'url': target_url,
'video_id': video_id,
'kind': kind,
'expires': time.time() + self._hls_ttl(kind),
}
return f'http://127.0.0.1:9978/proxy?do=py&type=hls&key={quote(key)}'
def _hls_headers(self, target_url, kind=None):
if kind == 'media_retry':
return {
'User-Agent': 'com.google.android.youtube/21.02.35 (Linux; U; Android 11) gzip',
'Accept': '*/*',
}
headers = self.header.copy()
headers['Accept'] = '*/*'
if kind in ('master', 'playlist'):
headers['Origin'] = 'https://www.youtube.com'
headers['Referer'] = 'https://www.youtube.com/'
elif kind == 'media':
headers['User-Agent'] = 'com.google.android.youtube/21.02.35 (Linux; U; Android 11) gzip'
headers.pop('Origin', None)
headers.pop('Referer', None)
return headers
def _rewrite_m3u8(self, text, base_url, video_id=''):
output = []
for line in (text or '').splitlines():
stripped = line.strip()
if not stripped:
output.append(line)
continue
if stripped.startswith('#'):
output.append(self._rewrite_m3u8_tag(line, base_url, video_id))
continue
absolute = urljoin(base_url, stripped)
kind = 'playlist' if stripped.endswith('.m3u8') or '/hls_playlist/' in stripped else 'media'
output.append(self._cache_hls_url(absolute, video_id, kind))
return '\n'.join(output) + '\n'
def _rewrite_m3u8_tag(self, line, base_url, video_id=''):
def replace_uri(match):
raw_url = match.group(1)
absolute = urljoin(base_url, raw_url)
proxied = self._cache_hls_url(absolute, video_id, 'media')
return f'URI="{proxied}"'
return re.sub(r'URI="([^"]+)"', replace_uri, line)
# 本地代理
def localProxy(self, params):
if params.get('do') != 'py':
return None
typ = params.get('type')
if typ == 'mpd':
return self._proxy_mpd(params)
if typ == 'media':
return self._proxy_media(params)
if typ == 'single':
return self._proxy_single(params)
if typ == 'image':
return self._proxy_image(params)
if typ == 'hls':
return self._proxy_hls(params)
return None
def _proxy_image(self, params):
vid = params.get('vid')
if not vid:
return [400, 'text/plain', '缺少 video id']
quality = params.get('quality', 'hqdefault')
img_url = f'https://i.ytimg.com/vi/{vid}/{quality}.jpg'
try:
r = self.session.get(img_url, timeout=10)
if r.status_code == 200:
content_type = r.headers.get('content-type', 'image/jpeg')
return [200, content_type, r.content, {'Cache-Control': 'max-age=86400'}]
else:
return [404, 'text/plain', f'图片不存在 ({r.status_code})']
except Exception as e:
return [500, 'text/plain', f'代理图片失败: {str(e)}']
def _proxy_single(self, params):
vid = params.get('vid')
data = self.getCache(f'yt_single_{vid}') if vid else None
if not data:
return [404, 'text/plain', '播放缓存已过期或不存在']
target_url = data.get('url')
if not target_url:
return [404, 'text/plain', '播放地址不存在']
headers = (data.get('headers') or self.header).copy()
range_header = params.get('range') or params.get('Range')
if range_header:
headers['Range'] = range_header
try:
r = self.session.get(target_url, headers=headers, stream=True, timeout=30)
content_type = r.headers.get('content-type', 'video/mp4')
resp_headers = {
'Content-Type': content_type,
'Accept-Ranges': 'bytes',
'Cache-Control': 'no-cache',
}
if r.headers.get('content-range'):
resp_headers['Content-Range'] = r.headers.get('content-range')
if r.headers.get('content-length'):
resp_headers['Content-Length'] = r.headers.get('content-length')
return [r.status_code, content_type, r.content, resp_headers]
except Exception as e:
return [500, 'text/plain', f'代理播放失败: {str(e)}']
def _proxy_mpd(self, params):
vid = params.get('vid')
quality = params.get('quality') or '1080p'
data = self.getCache(f'yt_{vid}_{quality}') if vid else None
if not data:
return [404, 'text/plain', '视频缓存已过期或不存在']
video_url = data.get('video_url')
audio_url = data.get('audio_url')
duration = data.get('duration') or 'PT0S'
video_item = data.get('video_item') or {}
audio_item = data.get('audio_item') or {}
media_base = f'http://127.0.0.1:9978/proxy?do=py&type=media&vid={vid}&quality={quality}'
duration_pt = f"PT{int(duration or 0)}S"
video_mime = (video_item.get('mimeType') or 'video/webm').split(';')[0]
audio_mime = (audio_item.get('mimeType') or 'audio/mp4').split(';')[0]
video_init = video_item.get('initRange') or {}
video_index = video_item.get('indexRange') or {}
audio_init = audio_item.get('initRange') or {}
audio_index = audio_item.get('indexRange') or {}
mpd = f'''<?xml version="1.0" encoding="UTF-8"?>
<MPD xmlns="urn:mpeg:dash:schema:mpd:2011" type="static" mediaPresentationDuration="{duration_pt}" minBufferTime="PT1.5S" profiles="urn:mpeg:dash:profile:isoff-on-demand:2011">
<Period id="1" start="PT0S">
<AdaptationSet mimeType="{html.escape(video_mime)}" startWithSAP="1" segmentAlignment="true" scanType="progressive">
<Representation id="v{video_item.get('itag', 1)}" bandwidth="{video_item.get('bitrate', 1000000)}" codecs="{html.escape(video_item.get('codecs') or '')}" height="{video_item.get('height', 0)}" width="{video_item.get('width', 0)}">
<BaseURL>{html.escape(media_base + '&track=video')}</BaseURL>
<SegmentBase indexRange="{video_index.get('start', '0')}-{video_index.get('end', '0')}"><Initialization range="{video_init.get('start', '0')}-{video_init.get('end', '0')}"/></SegmentBase>
</Representation>
</AdaptationSet>
'''
if audio_url:
mpd += f''' <AdaptationSet mimeType="{html.escape(audio_mime)}" startWithSAP="1" segmentAlignment="true" lang="und">
<Representation id="a{audio_item.get('itag', 1)}" bandwidth="{audio_item.get('bitrate', 128000)}" codecs="{html.escape(audio_item.get('codecs') or '')}" audioSamplingRate="44100">
<BaseURL>{html.escape(media_base + '&track=audio')}</BaseURL>
<SegmentBase indexRange="{audio_index.get('start', '0')}-{audio_index.get('end', '0')}"><Initialization range="{audio_init.get('start', '0')}-{audio_init.get('end', '0')}"/></SegmentBase>
</Representation>
</AdaptationSet>
'''
mpd += ' </Period>\n</MPD>'
return [200, 'application/dash+xml', mpd]
def _proxy_media(self, params):
vid = params.get('vid')
quality = params.get('quality') or '1080p'
track = params.get('track')
data = self.getCache(f'yt_{vid}_{quality}') if vid else None
if not data or track not in ('video', 'audio'):
return [404, 'text/plain', '媒体不存在']
target_url = data.get('video_url') if track == 'video' else data.get('audio_url')
if not target_url:
return [404, 'text/plain', f'{track} 流不存在']
media_item = data.get('video_item') if track == 'video' else data.get('audio_item')
headers = self.header.copy()
headers.update((media_item or {}).get('headers') or {})
range_header = params.get('range') or params.get('Range')
if range_header:
headers['Range'] = range_header
try:
r = self.session.get(target_url, headers=headers, stream=True, timeout=30)
content_type = r.headers.get('content-type', 'application/octet-stream')
resp_headers = {'Content-Type': content_type, 'Accept-Ranges': 'bytes', 'Cache-Control': 'no-cache'}
if r.headers.get('content-range'):
resp_headers['Content-Range'] = r.headers.get('content-range')
if r.headers.get('content-length'):
resp_headers['Content-Length'] = r.headers.get('content-length')
return [r.status_code, content_type, r.content, resp_headers]
except Exception as e:
return [500, 'text/plain', f'代理媒体失败: {str(e)}']
def _proxy_hls(self, params):
key = params.get('key') or ''
item = self.hls_url_cache.get(key)
if not item or item.get('expires', 0) < time.time():
debug_log('hls proxy missing', {'key': key})
return [404, 'text/plain', 'HLS 缓存已过期']
item['expires'] = time.time() + self._hls_ttl(item.get('kind'))
target_url = item.get('url') or ''
try:
headers = self._hls_headers(target_url, item.get('kind'))
response = self.session.get(target_url, headers=headers, stream=True, timeout=15)
retried = False
if item.get('kind') == 'media' and response.status_code == 403:
retry_headers = self._hls_headers(target_url, 'media_retry')
response.close()
retried = True
response = self.session.get(target_url, headers=retry_headers, stream=True, timeout=15)
content_type = response.headers.get('content-type') or ''
is_m3u8 = item.get('kind') in ('master', 'playlist') or 'mpegurl' in content_type.lower() or target_url.split('?')[0].endswith('.m3u8')
debug_log('hls proxy response', {
'key': key,
'kind': item.get('kind'),
'status': response.status_code,
'content_type': content_type,
'is_m3u8': is_m3u8,
'url_len': len(target_url),
'path_tail': target_url.split('?')[0][-80:],
'retried': retried,
})
if is_m3u8:
text = response.text
rewritten = self._rewrite_m3u8(text, target_url, item.get('video_id') or '')
return [response.status_code, 'application/vnd.apple.mpegurl', rewritten, {'Content-Type': 'application/vnd.apple.mpegurl', 'Cache-Control': 'no-cache'}]
resp_headers = {'Content-Type': content_type or 'application/octet-stream', 'Cache-Control': 'no-cache'}
if response.headers.get('content-length'):
resp_headers['Content-Length'] = response.headers.get('content-length')
return [response.status_code, content_type or 'application/octet-stream', response.content, resp_headers]
except Exception as e:
debug_log('hls proxy error', {'key': key, 'error': repr(e)})
return [500, 'text/plain', f'HLS 代理失败: {str(e)}']
def destroy(self):
try:
self.session.close()
except Exception:
pass
+795
View File
@@ -0,0 +1,795 @@
# -*- coding: utf-8 -*-
"""
YouTube 台湾新闻直播爬虫(最终修复版) - 扩展频道与动态配置
- 支持从 JSON 或 TXT(M3U风格)加载频道列表
- 支持 proxy 数组自动探测
- 保留分组信息 (group-title)
- 强制使用已配置代理请求 M3U8/TS
- 修复 TXT 分组识别
"""
import re
import sys
import json
import html
import time
import base64
import os
import requests
from urllib.parse import quote, unquote, urljoin
from base.spider import Spider
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
sys.path.append('..')
# DEBUG_LOG = '/sdcard/Download/yt_tw_news_debug.log'
def debug_log(message, data=None):
try:
line = f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] {message}"
if data is not None:
if isinstance(data, (dict, list)):
line += ' ' + json.dumps(data, ensure_ascii=False, default=str)
else:
line += ' ' + str(data)
with open(DEBUG_LOG, 'a', encoding='utf-8') as f:
f.write(line + '\n')
except Exception:
pass
# ==================== YouTubeLiveLite(原版不变) ====================
class YouTubeLiveLite:
def __init__(self, session, headers=None, config=None):
self.session = session
self.headers = headers or {}
self.config = config or {}
self.cache = {}
self.cache_ttl = int(self.config.get('live_cache_ttl') or 45)
@staticmethod
def extract_video_id(text):
text = str(text or '').strip()
for pattern in [
r'(?:v=|/v/|/embed/|/shorts/|youtu\.be/)([0-9A-Za-z_-]{11})',
r'^([0-9A-Za-z_-]{11})$',
]:
match = re.search(pattern, text)
if match:
return match.group(1)
raise Exception('无法识别 YouTube 视频 ID')
def extract_live(self, url_or_id):
video_id = self.extract_video_id(url_or_id)
now = time.time()
cached = self.cache.get(video_id)
if cached and cached.get('expires', 0) > now:
debug_log('live cache hit', {'video_id': video_id, 'ttl': int(cached.get('expires', 0) - now)})
return cached.get('data')
watch_url = f'https://www.youtube.com/watch?v={video_id}'
debug_log('live extract start', {'input': url_or_id, 'video_id': video_id})
response = self._get(watch_url)
page = response.text
player_response = self._extract_initial_player_response(page) or {}
ytcfg = self._extract_ytcfg(page) or {}
api_key = ytcfg.get('INNERTUBE_API_KEY') or self._search(r'"INNERTUBE_API_KEY":"([^"]+)"', page)
visitor_data = self._extract_visitor_data(ytcfg, player_response)
status_obj = player_response.get('playabilityStatus') or {}
streaming = player_response.get('streamingData') or {}
details = player_response.get('videoDetails') or {}
debug_log('live page parsed', {
'status': status_obj.get('status'),
'reason': status_obj.get('reason'),
'is_live': details.get('isLiveContent'),
'has_hls': bool(streaming.get('hlsManifestUrl')),
'has_api_key': bool(api_key),
'has_visitor': bool(visitor_data),
})
page_hls_url = streaming.get('hlsManifestUrl') or ''
hls_source = 'page' if page_hls_url else ''
api_data = None
if api_key:
api_data = self._call_player_api(video_id, api_key, ytcfg, watch_url, visitor_data)
if api_data:
api_streaming = api_data.get('streamingData') or {}
api_details = api_data.get('videoDetails') or {}
api_hls_url = api_streaming.get('hlsManifestUrl') or ''
if api_hls_url:
streaming = api_streaming
hls_source = api_data.get('_client_name') or 'api'
elif not page_hls_url and api_streaming:
streaming = api_streaming
hls_source = api_data.get('_client_name') or 'api_no_hls'
if api_details:
details = api_details
status_obj = api_data.get('playabilityStatus') or status_obj
if not (streaming.get('hlsManifestUrl') or '') and page_hls_url:
streaming = dict(streaming or {})
streaming['hlsManifestUrl'] = page_hls_url
hls_source = 'page_fallback'
hls_url = streaming.get('hlsManifestUrl') or ''
is_live = bool(details.get('isLiveContent') or hls_url)
status = status_obj.get('status') or ''
reason = status_obj.get('reason') or ''
title = details.get('title') or video_id
data = {
'id': video_id,
'title': title,
'is_live': is_live,
'status': status,
'reason': reason,
'hls_url': hls_url,
'duration': int(details.get('lengthSeconds') or 0),
}
debug_log('live extract result', {
'video_id': video_id,
'status': status,
'is_live': is_live,
'has_hls': bool(hls_url),
'hls_source': hls_source,
'duration': data.get('duration'),
})
self.cache[video_id] = {'data': data, 'expires': time.time() + self.cache_ttl}
return data
def _get(self, url, **kwargs):
headers = self.headers.copy()
headers.update(kwargs.pop('headers', {}) or {})
response = self.session.get(url, headers=headers, timeout=kwargs.pop('timeout', 30), **kwargs)
response.raise_for_status()
return response
def _post_json(self, url, payload, headers=None):
final_headers = self.headers.copy()
final_headers.update({'Content-Type': 'application/json', 'Origin': 'https://www.youtube.com'})
if headers:
final_headers.update({k: v for k, v in headers.items() if v})
response = self.session.post(url, json=payload, headers=final_headers, timeout=30)
response.raise_for_status()
return response.json()
def _call_player_api(self, video_id, api_key, ytcfg, referer, visitor_data=None):
context = ytcfg.get('INNERTUBE_CONTEXT') or {
'client': {'clientName': 'WEB', 'clientVersion': '2.20240310.01.00', 'hl': 'en', 'gl': 'US'}
}
clients = [
{'client': {'clientName': 'ANDROID', 'clientVersion': '21.02.35', 'androidSdkVersion': 30, 'userAgent': 'com.google.android.youtube/21.02.35 (Linux; U; Android 11) gzip', 'osName': 'Android', 'osVersion': '11', 'hl': 'en', 'gl': 'US'}},
{'client': {'clientName': 'IOS', 'clientVersion': '21.02.3', 'deviceMake': 'Apple', 'deviceModel': 'iPhone16,2', 'userAgent': 'com.google.ios.youtube/21.02.3 (iPhone16,2; U; CPU iOS 18_3_2 like Mac OS X;)', 'osName': 'iPhone', 'osVersion': '18.3.2.22D82', 'hl': 'en', 'gl': 'US'}},
{'client': {'clientName': 'MWEB', 'clientVersion': '2.20260115.01.00', 'userAgent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1', 'hl': 'en', 'gl': 'US'}},
context,
]
for ctx in clients:
client = ctx.get('client') or {}
client_name = client.get('clientName') or 'WEB'
try:
url = f'https://www.youtube.com/youtubei/v1/player?key={quote(api_key)}&prettyPrint=false'
headers = {
'Referer': referer,
'X-YouTube-Client-Name': str(self._client_name_id(client_name)),
'X-YouTube-Client-Version': client.get('clientVersion') or '',
}
if visitor_data:
headers['X-Goog-Visitor-Id'] = visitor_data
if client.get('userAgent'):
headers['User-Agent'] = client.get('userAgent')
payload = {
'context': ctx,
'videoId': video_id,
'contentCheckOk': True,
'racyCheckOk': True,
}
data = self._post_json(url, payload, headers=headers)
streaming = data.get('streamingData') or {}
status = (data.get('playabilityStatus') or {}).get('status')
debug_log('live api client', {
'client': client_name,
'status': status,
'has_hls': bool(streaming.get('hlsManifestUrl')),
'has_streaming': bool(streaming),
})
if streaming.get('hlsManifestUrl'):
data['_client_name'] = client_name
return data
except Exception as e:
debug_log('live api client error', {'client': client_name, 'error': repr(e)})
return None
def _extract_visitor_data(self, ytcfg, player_response):
return (
self.config.get('visitor_data')
or ytcfg.get('VISITOR_DATA')
or (((ytcfg.get('INNERTUBE_CONTEXT') or {}).get('client') or {}).get('visitorData'))
or ((player_response.get('responseContext') or {}).get('visitorData'))
)
def _extract_ytcfg(self, text):
match = re.search(r'ytcfg\.set\s*\(\s*({.+?})\s*\)\s*;', text or '', re.S)
if not match:
return None
try:
return json.loads(match.group(1))
except Exception:
return None
def _extract_initial_player_response(self, text):
return self._extract_json_after(text, 'ytInitialPlayerResponse')
def _extract_json_after(self, text, marker):
pos = (text or '').find(marker)
if pos < 0:
return None
start = text.find('{', pos)
if start < 0:
return None
depth = 0
in_str = None
escape = False
for index in range(start, len(text)):
char = text[index]
if escape:
escape = False
continue
if char == '\\':
escape = True
continue
if in_str:
if char == in_str:
in_str = None
continue
if char in ('"', "'"):
in_str = char
continue
if char == '{':
depth += 1
elif char == '}':
depth -= 1
if depth == 0:
try:
return json.loads(text[start:index + 1])
except Exception:
return None
return None
@staticmethod
def _search(pattern, text, default=None):
match = re.search(pattern, text or '', re.S)
return match.group(1) if match else default
def _client_name_id(self, client_name):
return {
'WEB': 1,
'MWEB': 2,
'ANDROID': 3,
'IOS': 5,
'TVHTML5': 7,
'ANDROID_VR': 28,
'WEB_EMBEDDED_PLAYER': 56,
'WEB_REMIX': 67,
}.get(client_name, 1)
# ==================== 频道定义(默认) ====================
DEFAULT_CHANNELS = [
{"id": "CTI", "name": "中天新聞", "url": "https://m.youtube.com/@中天電視CtiTv/streams/1"},
{"id": "TVBS", "name": "TVBS新聞", "url": "https://m.youtube.com/@TVBSNEWS01/streams/1"},
{"id": "EBC", "name": "東森新聞", "url": "https://m.youtube.com/@newsebc/streams/1"},
{"id": "FTV", "name": "民視新聞", "url": "https://m.youtube.com/@FTV_News/streams/1"},
]
# ==================== Spider 类 ====================
class Spider(Spider):
def getName(self):
return "YouTube台湾新闻直播"
def init(self, extend):
try:
self.extendDict = json.loads(extend) if extend else {}
except:
self.extendDict = {}
# 创建 Session 并配置重试策略
self.session = requests.Session()
retry = Retry(total=2, backoff_factor=0.5, status_forcelist=[429, 500, 502, 503, 504])
adapter = HTTPAdapter(max_retries=retry, pool_connections=5, pool_maxsize=10)
self.session.mount('http://', adapter)
self.session.mount('https://', adapter)
# 请求头
self.session.headers.update({
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Accept-Language': 'zh-TW,zh;q=0.9,en;q=0.8',
'Referer': 'https://www.youtube.com/'
})
# ----- 代理配置:支持数组自动探测 -----
self.proxy_str = None
self._proxy_configured = False # 标记是否使用了有效代理
proxy_val = self.extendDict.get('proxy')
if proxy_val is not None:
if isinstance(proxy_val, list):
found = False
for p in proxy_val:
p_norm = self._normalize_proxy_url(p)
if p_norm:
test_proxies = {'http': p_norm, 'https': p_norm}
try:
r = requests.get('https://www.youtube.com', proxies=test_proxies, timeout=2)
if r.status_code < 400:
self.session.proxies = test_proxies
self.proxy_str = p_norm.replace('http://', '').replace('https://', '')
self._proxy_configured = True
debug_log('使用用户列表代理', {'proxy': p_norm})
found = True
break
except Exception:
continue
if not found:
self.session.proxies = {}
self.proxy_str = ''
self._proxy_configured = False
debug_log('用户列表代理均不可用,回退系统代理')
elif isinstance(proxy_val, str):
p_norm = self._normalize_proxy_url(proxy_val)
if p_norm:
self.session.proxies = {'http': p_norm, 'https': p_norm}
self.proxy_str = p_norm.replace('http://', '').replace('https://', '')
self._proxy_configured = True
debug_log('使用 ext 传入代理(字符串)', {'proxy': p_norm})
else:
self._auto_detect_proxy()
elif isinstance(proxy_val, dict):
proxies = {}
for k, v in proxy_val.items():
if k in ('http', 'https') and v:
v = self._normalize_proxy_url(v)
if v:
proxies[k] = v
if proxies:
self.session.proxies = proxies
self.proxy_str = (proxies.get('https') or proxies.get('http') or '').replace('http://', '').replace('https://', '')
self._proxy_configured = True
debug_log('使用 ext 传入的字典代理', proxies)
else:
self._auto_detect_proxy()
else:
self._auto_detect_proxy()
else:
self._auto_detect_proxy()
# 初始化 YouTube 提取器
self.yt = YouTubeLiveLite(self.session, self.session.headers, {})
# 缓存
self.video_cache = {}
self.fail_cache = {}
self.m3u8_cache = {}
self.video_ttl = 300
self.m3u8_ttl = 15
self.fail_ttl = 120
# ----- 频道列表加载:支持 JSON 或 TXT(本地/远程) -----
self.channels = DEFAULT_CHANNELS.copy()
custom = self.extendDict.get('channels')
if custom:
loaded = False
if isinstance(custom, list):
if all(isinstance(c, dict) and 'id' in c and 'name' in c and 'url' in c for c in custom):
self.channels = custom
loaded = True
debug_log("使用自定义频道列表(直接传入JSON列表)", {"count": len(self.channels)})
else:
debug_log("自定义频道列表格式无效,使用默认列表")
elif isinstance(custom, str):
# ---------- 远程 URL ----------
if custom.startswith('http://') or custom.startswith('https://'):
try:
resp = self.session.get(custom, timeout=10)
if resp.status_code == 200:
# 强制使用 UTF-8 解码
try:
txt_data = resp.content.decode('utf-8')
except UnicodeDecodeError:
txt_data = resp.content.decode('utf-8', errors='ignore')
# 先尝试 JSON
try:
data = json.loads(txt_data)
if isinstance(data, list) and all(isinstance(c, dict) and 'id' in c and 'name' in c and 'url' in c for c in data):
self.channels = data
loaded = True
debug_log("从远程 URL 加载频道列表(JSON)", {"url": custom, "count": len(self.channels)})
else:
debug_log("远程 JSON 数据格式无效,尝试 TXT 解析", {"url": custom})
except Exception as e:
debug_log("远程 JSON 解析失败,尝试 TXT 解析", {"url": custom, "error": repr(e)})
# 如果 JSON 未成功加载,尝试 TXT
if not loaded:
try:
channels, group = self._parse_txt_channels(txt_data)
if channels:
self.channels = channels
loaded = True
self._current_group = group
debug_log("从远程 URL 加载频道列表(TXT", {"url": custom, "count": len(self.channels), "group": group})
else:
debug_log("远程 TXT 解析失败,无有效频道", {"url": custom})
except Exception as e2:
debug_log("远程 TXT 解析异常", {"url": custom, "error": repr(e2)})
else:
debug_log("远程请求失败", {"url": custom, "status": resp.status_code})
except Exception as e:
debug_log("远程加载失败", {"url": custom, "error": repr(e)})
# ---------- 本地文件 ----------
else:
script_dir = os.path.dirname(os.path.abspath(__file__))
if custom.startswith('./'):
file_path = os.path.join(script_dir, custom[2:])
else:
file_path = custom
if file_path.lower().endswith('.txt'):
try:
with open(file_path, 'r', encoding='utf-8') as f:
txt_content = f.read()
channels, group = self._parse_txt_channels(txt_content)
if channels:
self.channels = channels
loaded = True
self._current_group = group
debug_log("从本地 TXT 文件加载频道列表", {"path": file_path, "count": len(self.channels), "group": group})
else:
debug_log("TXT 文件内容无效", {"path": file_path})
except Exception as e:
debug_log("读取本地 TXT 失败", {"path": file_path, "error": repr(e)})
else:
# JSON 文件
try:
with open(file_path, 'r', encoding='utf-8') as f:
data = json.load(f)
if isinstance(data, list) and all(isinstance(c, dict) and 'id' in c and 'name' in c and 'url' in c for c in data):
self.channels = data
loaded = True
debug_log("从本地 JSON 文件加载频道列表", {"path": file_path, "count": len(self.channels)})
else:
debug_log("JSON 文件内容格式无效", {"path": file_path})
except Exception as e:
debug_log("读取本地 JSON 失败", {"path": file_path, "error": repr(e)})
else:
debug_log("channels 字段类型不支持,使用默认列表")
if not loaded:
debug_log("使用默认频道列表", {"count": len(self.channels)})
else:
debug_log("未配置 channels,使用默认列表", {"count": len(self.channels)})
debug_log("Spider init", {"channels": len(self.channels)})
def _parse_txt_channels(self, content):
"""解析 TXT 格式(M3U风格),正确识别 #genre# 分组"""
lines = content.splitlines()
channels = []
current_group = "油管直播" # 默认组名
seen = set()
for line in lines:
line = line.strip()
if not line:
continue
# 检测分组行:格式为 "分组名,#genre#"
if '#genre#' in line:
parts = line.split(',')
if len(parts) >= 1:
group_name = parts[0].strip()
# 如果开头有 #,去掉
if group_name.startswith('#'):
group_name = group_name[1:].strip()
if group_name:
current_group = group_name
continue
# 跳过其他 # 开头的注释行(但不是 #genre#)
if line.startswith('#'):
continue
# 解析节目行:名称,URL
if ',' in line:
parts = line.split(',', 1)
name = parts[0].strip()
url = parts[1].strip()
if not url or not name:
continue
try:
video_id = YouTubeLiveLite.extract_video_id(url)
except:
# 无法提取ID,生成唯一ID
video_id = f"unknown_{abs(hash(url))}"
# 保证id唯一
base_id = video_id
if base_id in seen:
idx = 1
while f"{base_id}_{idx}" in seen:
idx += 1
video_id = f"{base_id}_{idx}"
seen.add(video_id)
channels.append({
'id': video_id,
'name': name,
'url': url,
'group': current_group
})
return channels, current_group
def _normalize_proxy_url(self, url):
if not url:
return ''
url = url.strip()
if not re.match(r'^[a-zA-Z]+://', url):
url = 'http://' + url
return url
def _auto_detect_proxy(self):
"""内置代理列表探测"""
proxy_list = [
"http://127.0.0.1:2080",
"http://127.0.0.1:7890",
"http://127.0.0.1:10809",
"http://127.0.0.1:20172",
"http://127.0.0.1:10172",
"http://127.0.0.1:7891",
"http://127.0.0.1:10808",
"http://127.0.0.1:1087",
"http://127.0.0.1:3128",
"http://127.0.0.1:1080",
"http://127.0.0.1:8080",
"http://127.0.0.1:9090"
]
for p in proxy_list:
try:
test_proxies = {'http': p, 'https': p}
r = requests.get('https://www.youtube.com', proxies=test_proxies, timeout=2)
if r.status_code < 400:
self.session.proxies = test_proxies
self.proxy_str = p.replace('http://', '').replace('https://', '')
self._proxy_configured = True
debug_log('内置代理探测成功', {'proxy': p})
return
except Exception:
continue
self.session.proxies = {}
self.proxy_str = ''
self._proxy_configured = False
debug_log('所有内置代理不可用,回退到系统/全局代理')
def destroy(self):
if self.session:
self.session.close()
debug_log("Spider destroyed")
def liveContent(self, url):
lines = ['#EXTM3U']
for ch in self.channels:
proxy_url = f"http://127.0.0.1:9978/proxy?do=py&type=youtube_live&channel={ch['id']}"
# 安全处理显示名称中的特殊字符
name = ch["name"].replace('"', '\\"').replace(',', '\\,')
group_attr = f' group-title="{ch.get("group", "油管直播")}"' if ch.get("group") else ''
lines.append(f'#EXTINF:-1 tvg-id="{ch["id"]}" tvg-name="{name}"{group_attr},{name}')
lines.append(proxy_url)
return '\n'.join(lines)
def localProxy(self, params):
t = params.get('type')
if t == 'youtube_live':
return self._handle_live(params)
elif t == 'ts':
return self._handle_ts(params)
return [404, "text/plain", "未知请求"]
def _handle_live(self, params):
channel_id = params.get('channel')
if not channel_id:
return self._error_response("缺少频道ID")
now = time.time()
if channel_id in self.fail_cache and self.fail_cache[channel_id] > now:
debug_log("Skip failed channel (cache)", {"channel": channel_id})
return self._error_response("该频道暂时无法获取直播流")
cached_m3u8 = self.m3u8_cache.get(channel_id)
if cached_m3u8 and cached_m3u8.get('expires', 0) > now:
debug_log("M3U8 cache hit", {"channel": channel_id})
return [200, "application/vnd.apple.mpegurl", cached_m3u8['content']]
video_info = self.video_cache.get(channel_id)
if not video_info or video_info.get('expires', 0) <= now:
debug_log("Refreshing video info", {"channel": channel_id})
info = self._get_live_video_info(channel_id)
if not info:
self.fail_cache[channel_id] = now + self.fail_ttl
return self._error_response("无法获取直播视频")
self.video_cache[channel_id] = {
'video_id': info['video_id'],
'hls_url': info['hls_url'],
'expires': now + self.video_ttl
}
self.fail_cache.pop(channel_id, None)
video_info = self.video_cache[channel_id]
m3u8_content = self._fetch_and_rewrite_m3u8(video_info['hls_url'], channel_id)
if not m3u8_content:
self.fail_cache[channel_id] = now + self.fail_ttl
return self._error_response("获取 M3U8 失败")
self.m3u8_cache[channel_id] = {
'content': m3u8_content,
'expires': now + self.m3u8_ttl
}
return [200, "application/vnd.apple.mpegurl", m3u8_content]
def _handle_ts(self, params):
b64_url = params.get('url', '')
if not b64_url:
return self._error_response("缺少 TS URL")
try:
ts_url = self._b64_decode(b64_url)
except:
return self._error_response("TS URL 解码失败")
try:
# 强制使用已配置的代理(如果有)
resp = self.session.get(ts_url, headers={
'User-Agent': 'com.google.android.youtube/21.02.35 (Linux; U; Android 11) gzip',
'Accept': '*/*',
'Referer': 'https://www.youtube.com/',
}, timeout=30)
if resp.status_code != 200:
return self._error_response(f"TS 请求失败 {resp.status_code}")
return [200, "video/MP2T", resp.content, {
'Content-Type': 'video/MP2T',
'Content-Length': str(len(resp.content)),
'Cache-Control': 'no-cache'
}]
except Exception as e:
debug_log("TS proxy error", {"url": ts_url, "error": repr(e)})
return self._error_response(f"TS 代理异常: {str(e)}")
def _get_live_video_info(self, channel_id):
ch = next((c for c in self.channels if c['id'] == channel_id), None)
if not ch:
return None
url = ch['url']
if 'watch?v=' in url or 'youtu.be/' in url:
try:
video_id = YouTubeLiveLite.extract_video_id(url)
except Exception as e:
debug_log("提取视频ID失败", {"url": url, "error": repr(e)})
return None
try:
data = self.yt.extract_live(video_id)
if data.get('is_live') and data.get('hls_url'):
debug_log("直接视频链接 - 获取直播成功", {"video_id": video_id})
return {'video_id': video_id, 'hls_url': data['hls_url']}
else:
debug_log("直接视频链接 - 非直播或无HLS", {"video_id": video_id, "is_live": data.get('is_live')})
return None
except Exception as e:
debug_log("直接视频链接 - extract_live失败", {"video_id": video_id, "error": repr(e)})
return None
try:
resp = self.session.get(url, timeout=30)
resp.raise_for_status()
html_text = resp.text
except Exception as e:
debug_log("获取频道页失败", {"url": url, "error": repr(e)})
return None
video_ids = re.findall(r'watch\?v=([a-zA-Z0-9_-]{11})', html_text)
if not video_ids:
debug_log("频道页未找到视频ID", {"url": url})
return None
seen = set()
for vid in video_ids:
if vid in seen:
continue
seen.add(vid)
try:
data = self.yt.extract_live(vid)
if data.get('is_live') and data.get('hls_url'):
debug_log("频道页找到直播视频", {"video_id": vid, "hls_url": data['hls_url'][:80]})
return {'video_id': vid, 'hls_url': data['hls_url']}
except Exception as e:
debug_log("频道页 - extract_live失败", {"video_id": vid, "error": repr(e)})
continue
debug_log("频道页未找到直播视频", {"url": url})
return None
def _fetch_and_rewrite_m3u8(self, hls_url, channel_id):
try:
# 强制使用已配置的代理(session 已包含代理设置)
resp = self.session.get(hls_url, headers={
'User-Agent': 'com.google.android.youtube/21.02.35 (Linux; U; Android 11) gzip',
'Referer': 'https://www.youtube.com/',
}, timeout=30)
resp.raise_for_status()
text = resp.text
except Exception as e:
debug_log("Failed to fetch master m3u8", {"url": hls_url, "error": repr(e)})
return None
if '#EXT-X-STREAM-INF' in text:
variant_url = self._pick_best_variant(hls_url, text)
if not variant_url:
debug_log("No variant found", {"master": hls_url})
return None
try:
resp = self.session.get(variant_url, headers={
'User-Agent': 'com.google.android.youtube/21.02.35 (Linux; U; Android 11) gzip',
'Referer': 'https://www.youtube.com/',
}, timeout=30)
resp.raise_for_status()
text = resp.text
except Exception as e:
debug_log("Failed to fetch variant m3u8", {"url": variant_url, "error": repr(e)})
return None
rewritten = []
for line in text.splitlines():
if line.startswith('#'):
rewritten.append(line)
else:
ts_url = urljoin(hls_url, line.strip())
encoded = self._b64_encode(ts_url)
proxy_ts = f"http://127.0.0.1:9978/proxy?do=py&type=ts&url={encoded}&channel={channel_id}"
rewritten.append(proxy_ts)
return '\n'.join(rewritten) + '\n'
def _pick_best_variant(self, base_url, text):
lines = text.splitlines()
best_score = -1
best_url = ''
for i, line in enumerate(lines):
if not line.startswith('#EXT-X-STREAM-INF'):
continue
bandwidth = re.search(r'BANDWIDTH=(\d+)', line)
resolution = re.search(r'RESOLUTION=(\d+)x(\d+)', line)
score = 0
if bandwidth:
score += int(bandwidth.group(1))
if resolution:
score += int(resolution.group(1)) * int(resolution.group(2))
for j in range(i + 1, len(lines)):
if not lines[j].strip() or lines[j].startswith('#'):
continue
if score > best_score:
best_score = score
best_url = urljoin(base_url, lines[j].strip())
break
return best_url
def _b64_encode(self, s):
return base64.urlsafe_b64encode(s.encode()).decode().rstrip('=')
def _b64_decode(self, s):
padding = 4 - (len(s) % 4)
if padding != 4:
s += '=' * padding
return base64.urlsafe_b64decode(s).decode()
def _error_response(self, msg):
error_m3u8 = f"""#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-TARGETDURATION:10
#EXTINF:10.0,
error.ts
#EXT-X-ENDLIST
# {msg}
"""
return [500, "application/vnd.apple.mpegurl", error_m3u8]