Compare commits

...

328 Commits

Author SHA1 Message Date
buvta
27773be1c7 v2.6.9 2020-12-08 18:26:05 +08:00
buvta
fadb50a28b film调整areas刷新策略 2020-12-08 18:14:21 +08:00
buvta
518a9c3492 播放视频开始时重置片头片尾输入框数据 2020-12-08 17:36:33 +08:00
buvta
d5eb4dc49f film搜索不加载工具栏开关 2020-12-08 16:48:27 +08:00
buvta
e76bee574f film避免列表模式下加载图片 2020-12-08 16:46:02 +08:00
buvta
b7779a3e6f 疑似el-select弹窗bug,临时性修补 2020-12-08 15:45:25 +08:00
buvta
4cb5b48985 收起工具栏时重置列表 2020-12-08 15:37:21 +08:00
buvta
b2128113ba 调整工具栏refreshFilteredList触发方式 2020-12-08 15:24:36 +08:00
buvta
58d0ae6da1 工具栏"语言"替换为"排序" 2020-12-08 13:03:58 +08:00
buvta
2bd821f59d 调整工具栏打开方式 2020-12-08 12:20:12 +08:00
haiyangcui
8d002225fd 添加'过滤器'按钮,控制过滤选项按钮组的显示 2020-12-07 16:47:45 +01:00
haiyangcui
0243c2f0fe Fix: 切换类型时,总是调用refreshFilteredList 2020-12-07 16:28:30 +01:00
buvta
b8edd7f440 Revert "fix:海报模式切换分类时偶尔空白页"
This reverts commit 1df6726a3b.
2020-12-07 20:22:22 +08:00
buvta
4683aecf7b fix:上层弹窗被过滤工具栏遮蔽 2020-12-07 20:22:22 +08:00
buvta
16d38ba2b4 调整相应样式 2020-12-07 19:43:36 +08:00
buvta
fe7fe06d48 film添加过滤工具栏 2020-12-07 19:43:36 +08:00
buvta
c1220ef752 手动设置跳过片头片尾时间长度 2020-12-07 07:01:22 +08:00
buvta
f0c221a863 修复福利屏蔽 2020-12-06 18:40:18 +08:00
buvta
1df6726a3b fix:海报模式切换分类时偶尔空白页 2020-12-06 18:29:45 +08:00
buvta
1a9e939f9c 更新直播源 2020-12-06 15:53:55 +08:00
buvta
39cb188604 调整iptv分组命名规则 2020-12-06 15:53:13 +08:00
buvta
aba4d12302 确保不会意外引入代理 2020-12-05 23:54:29 +08:00
buvta
17c77fd48a 禁止xgplayer显示重播 2020-12-05 23:48:24 +08:00
buvta
1cfc12ec19 fix:确保不会跳过多集 2020-12-05 23:46:03 +08:00
buvta
b0aa1dc28a 视频多集时可通过快捷键设置跳过片头片尾,保存在相应的历史记录中 2020-12-05 19:10:05 +08:00
haiyangcui
0c12b394a7 视频列表页,支持按地区过滤数据 2020-12-04 14:06:30 +01:00
haiyangcui
9e468bc82e 在类型框内显示视频数信息 2020-12-04 13:48:31 +01:00
haiyangcui
973a15b593 统一downloadEvent函数 2020-12-02 15:19:50 +01:00
Hunlongyu
253c1e7723 分享的网址改为 gitee, 国内用户打开更快 2020-12-02 10:21:54 +08:00
Hunlongyu
7b44051190 更新官网截图,, 修改部分描述 2020-12-02 10:19:12 +08:00
Hunlongyu
a25ac77ebc 更新 README 2020-12-02 10:02:42 +08:00
haiyangcui
d187167fbe 解决换源时视频类型不正常更新的问题 2020-12-01 16:01:47 +01:00
haiyangcui
b34347cf43 添加视频数信息 2020-12-01 13:20:50 +01:00
haiyangcui
829d9447a4 删除重复和不可用的源站 2020-12-01 13:07:11 +01:00
haiyangcui
39067c6a35 缓存视频列表信息 2020-12-01 00:24:38 +01:00
haiyangcui
6dbb64a4f2 重构 2020-11-30 23:58:12 +01:00
haiyangcui
f8041290d2 无需定义getPage函数 2020-11-30 23:49:56 +01:00
haiyangcui
f772ac2e9d 从搜索界面返回时,无需再重新加载数据 2020-11-30 17:13:10 +01:00
haiyangcui
ef485ef64a 删除无用代码 2020-11-30 16:48:43 +01:00
haiyangcui
b164d5e83e Revert "降级xgplayer回2.13.1,新版居然不支持缓冲了."
This reverts commit 8cd2b920c8.
2020-11-30 15:48:13 +01:00
haiyangcui
8a5800df93 v2.6.8 2020-11-30 12:37:40 +01:00
haiyangcui
8cd2b920c8 降级xgplayer回2.13.1,新版居然不支持缓冲了. 2020-11-30 11:37:13 +01:00
haiyangcui
5b4cb43aa5 如果源站返回多个视频列表的话, 仅获取m3u8列表 2020-11-30 11:21:55 +01:00
haiyangcui
de1472e668 升级依赖 2020-11-30 10:56:24 +01:00
haiyangcui
0f846b996b 设置播放器默认预加载300秒 2020-11-29 20:11:23 +01:00
cuiocean
2bd5e31a28 Merge pull request #362 from Hunlongyu/dependabot/npm_and_yarn/highlight.js-9.18.5
Bump highlight.js from 9.18.1 to 9.18.5
2020-11-29 20:04:32 +01:00
haiyangcui
9d8dc9ecb1 删除不工作的cctv蓝光源 2020-11-29 16:53:24 +01:00
haiyangcui
2a073e4092 v2.6.7 2020-11-29 16:26:37 +01:00
haiyangcui
b1daa73afe 更新推荐 2020-11-29 16:23:15 +01:00
haiyangcui
18940ff9f7 Revert "更新视频源,删除无效源,添加需要解析的腾讯,搜狐视频等源"
This reverts commit 76d4d68401.
2020-11-29 13:27:20 +01:00
haiyangcui
76d4d68401 更新视频源,删除无效源,添加需要解析的腾讯,搜狐视频等源 2020-11-28 13:00:29 +01:00
haiyangcui
f91200e609 非m3u8视频,使用在线解析网站播放 2020-11-28 12:46:10 +01:00
haiyangcui
b64f500710 Download函数内解析m3u8List,改进downloadEvent函数 2020-11-28 12:30:43 +01:00
haiyangcui
cf1cfe9f77 支持某些源返回json数据不包含rss层 2020-11-28 11:47:48 +01:00
Hunlongyu
da4fe162f6 Merge branch 'master' of https://github.com/Hunlongyu/ZY-Player into master 2020-11-28 09:44:37 +08:00
Hunlongyu
d949c52020 代码优化 2020-11-28 09:44:32 +08:00
buvta
1ce9e0525b Merge branch 'master' into master 2020-11-25 23:38:06 +08:00
dependabot[bot]
4ebf82eae0 Bump highlight.js from 9.18.1 to 9.18.5
Bumps [highlight.js](https://github.com/highlightjs/highlight.js) from 9.18.1 to 9.18.5.
- [Release notes](https://github.com/highlightjs/highlight.js/releases)
- [Changelog](https://github.com/highlightjs/highlight.js/blob/9.18.5/CHANGES.md)
- [Commits](https://github.com/highlightjs/highlight.js/compare/9.18.1...9.18.5)

Signed-off-by: dependabot[bot] <support@github.com>
2020-11-25 06:15:54 +00:00
buvta
e0b1a5332d iptv优化 2020-11-24 22:27:49 +08:00
buvta
3ecb4302ba iptv优化 2020-11-24 16:46:29 +08:00
buvta
5c39db8ca6 iptv恢复"播放",避免行点击时误操作 2020-11-23 16:34:53 +08:00
buvta
4f45045d18 精简模式alt+m切换进入退出 2020-11-23 16:34:53 +08:00
buvta
b7733179f2 导入直播源时允许网址带参数 2020-11-23 16:34:53 +08:00
haiyangcui
e1f7044ae0 数据更新后,刷新页面 2020-11-22 20:57:27 +01:00
buvta
93e76db444 恢复记录mini窗口状态
This reverts commit bedd1339df.
2020-11-22 23:48:50 +08:00
buvta
6eaa281e4a 直播主窗口隐藏退出mini图标 2020-11-22 23:31:30 +08:00
buvta
490d34e1fb 移除iptvSearch数据库 2020-11-22 22:39:42 +08:00
buvta
0d0d6bd90f iptv移除iptvSearch 2020-11-22 22:35:48 +08:00
buvta
ecdc96d2f3 Play样式相应调整 2020-11-22 22:35:48 +08:00
buvta
234f6dd069 Play频道搜索用el-input替代 2020-11-22 22:35:38 +08:00
haiyangcui
f80fe7ecf1 添加退出精简模式按钮 2020-11-22 14:37:30 +01:00
haiyangcui
6876721567 进入精简模式,无需设置大小位置,直接调用getCssFullscreen即可 2020-11-22 12:41:22 +01:00
haiyangcui
bedd1339df Revert "记录mini窗口大小" 2020-11-22 12:09:36 +01:00
hunlongyu
0a3a7a4d57 Merge branch 'master' of https://github.com/Hunlongyu/ZY-Player 2020-11-22 16:38:49 +08:00
hunlongyu
786e23f5a2 删除冗余代码 2020-11-22 16:38:43 +08:00
buvta
418f14bcc1 调整Ctrl+0描述(弹窗容不下) 2020-11-22 11:20:00 +08:00
buvta
a9e4a34e4f 精简模式添加快捷键Ctrl+0用于恢复默认 2020-11-22 10:56:30 +08:00
buvta
fede7e4ef2 Revert "mini模式,大小直接设置为当前窗口大小,无需记录到数据库中"
This reverts commit f92af48a4e.
2020-11-22 10:41:19 +08:00
buvta
956ebbf8b8 调整Play页面channelList加载策略 2020-11-22 10:32:26 +08:00
haiyangcui
014dac0b64 排序源站,把可用的放上面 2020-11-21 23:37:05 +01:00
haiyangcui
5fc1020e79 升级所有依赖到最新版 2020-11-21 22:48:44 +01:00
haiyangcui
aca487f796 升级依赖 2020-11-21 22:41:09 +01:00
haiyangcui
429eb4aac0 移动getChannelList到if里,避免不必要的开销 2020-11-21 22:27:26 +01:00
haiyangcui
e032f86d3d 切换视图时,无需更新页面和改变infiniteId 2020-11-21 22:16:06 +01:00
haiyangcui
f92af48a4e mini模式,大小直接设置为当前窗口大小,无需记录到数据库中 2020-11-21 19:07:05 +01:00
haiyangcui
eff69db063 infiniteId会在classClick里更新 2020-11-21 18:52:33 +01:00
haiyangcui
a5c8d20635 更新麻花资源的api链接 2020-11-21 18:39:33 +01:00
haiyangcui
da22abd25d 避免不必要的资源访问 2020-11-21 18:38:53 +01:00
haiyangcui
2dd91f78c9 牛牛资源已失效,删除 2020-11-21 18:38:51 +01:00
buvta
a8b0e7e6a8 fix:直播时上下切换频道时的bug 2020-11-21 23:20:17 +08:00
buvta
39edb9ce35 v2.6.6 2020-11-21 16:44:50 +08:00
buvta
3323a56671 fix:置顶图标联动 2020-11-21 16:22:06 +08:00
buvta
4dc88469e8 调整iptv操作列表头,两种显示模式 2020-11-21 15:55:08 +08:00
buvta
b04201f803 Play将win常量提取出来,避免重复获取 2020-11-21 15:52:51 +08:00
buvta
f34da7ff85 Play支持按拼音首字母搜索频道 2020-11-21 13:38:03 +08:00
buvta
b8f010c4f5 调整Play初始化 2020-11-21 13:20:39 +08:00
buvta
f876b863e7 直播换源时可隐藏频道 2020-11-21 13:20:29 +08:00
buvta
384ae10475 iptv移到设置界面,播放界面不加载视频时自动弹出频道列表 2020-11-20 22:50:57 +08:00
buvta
647c540f0b 直播时隐藏历史及播放速率按钮 2020-11-20 22:30:33 +08:00
buvta
87d01da241 精简模式停止时回到主窗口 2020-11-20 22:30:33 +08:00
buvta
641bdf00d3 保存音量 2020-11-20 22:30:33 +08:00
buvta
31510624c1 Update feature.md 2020-11-20 21:14:45 +08:00
buvta
d5c4e296c3 Update bug.md 2020-11-20 21:13:59 +08:00
buvta
f55065472d 调整IPTV批处理时的按钮标签 2020-11-20 15:05:39 +08:00
buvta
525da05c5f iptv导入json时bug修复 2020-11-20 15:00:00 +08:00
buvta
de8c51918f 再次调整 2020-11-20 13:59:18 +08:00
buvta
17229eb6b4 fix:初次切换到Play播放频道时channelList为空 2020-11-20 13:45:17 +08:00
buvta
d4530eef89 iptv导入json时合并而非覆盖 2020-11-20 12:52:13 +08:00
buvta
cb68da5a22 Play调整下代码 2020-11-20 12:06:44 +08:00
buvta
c21f6538f3 iptv改为以channelList为主,导入不再丢失配置
仅在生成channelList时使用iptv数据库,平时清空
导入导出格式为m3u时使用iptvList,json使用channelList
2020-11-20 12:05:20 +08:00
buvta
729dab765c 清理多余的mini窗口代码 2020-11-20 12:02:21 +08:00
buvta
8521de2844 Merge pull request #353 from Hunlongyu/mergeChannelDev
频道合并及播放页面的频道列表及精简模式
2020-11-19 21:31:35 +08:00
buvta
6ec7dffd59 窗口合二为一,更完美的精简模式,按Esc键退出 2020-11-19 18:13:44 +08:00
buvta
51fccb699a Play频道搜索样式调整 2020-11-19 18:13:44 +08:00
buvta
525d6af888 Play支持频道搜索 2020-11-19 18:13:44 +08:00
buvta
5a17d1b991 播放页面支持频道分组(外置) 2020-11-19 18:13:44 +08:00
buvta
edef20d171 fix:源管理清空时亦可添加 2020-11-19 18:13:44 +08:00
buvta
e912804fcc IPTV播放添加prefer 2020-11-19 18:13:44 +08:00
buvta
3165345839 Play做相应调整以使用channelList代替iptvList 2020-11-19 18:13:44 +08:00
buvta
7133c8982a 调整iptv拖拽仅在"不可展开"即批处理模式可用 2020-11-19 18:13:44 +08:00
buvta
26c1ba1e62 解决懒加载带来的bug 2020-11-19 18:13:44 +08:00
buvta
4e83e365a6 移除对iptvList.length的依赖 2020-11-19 18:13:44 +08:00
buvta
03775b091d 调整shift多选时获取首尾位置的方法 2020-11-19 18:13:43 +08:00
buvta
9147a8e1fb Revert "改动syncTableData以便删除可用"
This reverts commit 25d65866ae.
2020-11-19 18:13:43 +08:00
buvta
0d84e20326 支持手动合并 2020-11-19 18:13:43 +08:00
buvta
d421a5cfe4 bug修复 2020-11-19 18:13:43 +08:00
buvta
46fc5a0942 频道合并bug待修复 2020-11-19 18:13:43 +08:00
buvta
60aac3944e 进一步完善合并功能,注释部分及联动待实现 2020-11-19 18:13:43 +08:00
buvta
4683223a68 数据库调整,新增channelList,根据iptvList自动生成 2020-11-19 18:13:43 +08:00
buvta
86856397f6 IPTV实现自动合并懒加载,其它待调整以适应合并 2020-11-19 18:13:43 +08:00
haiyangcui
09e6af6f18 删除无用的extraResources文件夹 2020-11-16 14:30:15 +01:00
haiyangcui
18db5a1eb0 实体化HlsJsPlayer,而非更底层一点的Hls 2020-11-15 16:05:08 +01:00
haiyangcui
d116f08550 更新"更新推荐"提示语 2020-11-15 15:18:07 +01:00
haiyangcui
7441341658 删除记录,成功的话结果很明显,无需消息提醒 2020-11-15 09:48:10 +01:00
haiyangcui
9b71355803 Recommendations都是cuiocean一个人在维护,故将该资源转移到独立的repository里,避免继续污染本repo的commit信息 2020-11-15 09:30:41 +01:00
buvta
aba07ea20b 添加issue模版 2020-11-15 15:07:19 +08:00
buvta
790ea92180 issue模版 2020-11-15 14:57:54 +08:00
haiyangcui
1dc683e332 再次解决恢复窗口不继续播放视频的问题 2020-11-14 20:23:37 +01:00
haiyangcui
82df96e4d0 解决恢复窗口视频不恢复播放的问题 2020-11-14 20:07:46 +01:00
haiyangcui
bb1e31a270 默认video触发touchend事件后视频切换播放/暂停状态,通过closeVideoTouch关闭 2020-11-14 18:09:51 +01:00
haiyangcui
1d8d9ae72f 改变高亮颜色,以适应不同主题 2020-11-14 15:59:10 +01:00
haiyangcui
6dfe3bea95 统一viewMode为列表时的值为table 2020-11-14 15:59:03 +01:00
haiyangcui
6fcb6ad16c 搜索结果支持海报和列表两种模式 2020-11-14 15:58:52 +01:00
haiyangcui
c692ed2100 显示引入使用的依赖,否则编译有警告 2020-11-14 15:58:43 +01:00
hunlongyu
26bcdd4101 🗃 修复download为空时下载出错 2020-11-14 12:46:44 +08:00
buvta
5104f9a85d v2.6.4.1 2020-11-14 11:47:36 +08:00
hunlongyu
d61ee76e58 Merge branch 'master' of https://github.com/Hunlongyu/ZY-Player 2020-11-13 21:33:13 +08:00
hunlongyu
b1a683a8db 🗑 修复 developer 报错 2020-11-13 21:33:07 +08:00
buvta
5d0dc1bed7 补上落下的async 2020-11-13 21:26:03 +08:00
buvta
3481a5346e 取消时等待数据库更新再刷新代理 2020-11-13 21:05:49 +08:00
buvta
c957fe33e2 取消时更新代理 2020-11-13 21:00:57 +08:00
buvta
51aa21e551 稍微调整 2020-11-13 20:55:11 +08:00
buvta
a887968458 设置增加代理,功能实现 2020-11-13 20:36:33 +08:00
Hunlongyu
380d31c0d3 🌿 新增代理设置界面 ( 功能未完成 ) 2020-11-13 16:28:11 +08:00
Hunlongyu
46b5f82348 Merge branch 'master' of https://github.com/Hunlongyu/ZY-Player into master 2020-11-13 13:52:45 +08:00
Hunlongyu
675622e9ee npm yarn 2020-11-13 13:52:36 +08:00
haiyangcui
9a67821984 移除无用log 2020-11-12 23:35:21 +01:00
haiyangcui
e457574755 开启airplay选项 2020-11-12 22:58:45 +01:00
haiyangcui
50f5154628 Merge branch 'master' of https://github.com/Hunlongyu/ZY-Player 2020-11-12 17:35:43 +01:00
haiyangcui
9da7ffc451 Revert "移除"搜索所有资源"开关,搜索变总是搜索所有资源", 解决推荐排序不工作的问题 2020-11-12 17:35:31 +01:00
buvta
35adae51cc 调整"正在直播"样式 2020-11-12 23:52:47 +08:00
haiyangcui
fe75edd738 v2.6.4 2020-11-12 10:51:29 +01:00
haiyangcui
362dccb167 固定"备注"宽度,"最近更新"列宽度自适应 2020-11-12 10:45:54 +01:00
buvta
08e95611ea 修复频道当前源被包含的bug 2020-11-12 12:09:58 +08:00
buvta
739b3fe30f 调整iptvList加载时机,清除残余代码 2020-11-12 11:37:50 +08:00
buvta
3ba2dc9993 表格列样式调整 2020-11-12 11:26:18 +08:00
buvta
6543d8baf0 推荐页相应调整 2020-11-12 08:34:40 +08:00
buvta
a1c9c657e3 film搜索框样式优化终结版,弹框样式统一为popper 2020-11-12 08:27:19 +08:00
haiyangcui
9306adb60e '全部'改名为'全站' 2020-11-11 21:42:40 +01:00
haiyangcui
682c706618 Revert "film页面el-table引入电影追剧模式" 2020-11-11 21:40:51 +01:00
haiyangcui
02c04c3d46 再次改进搜索框的样式 2020-11-11 17:09:17 +01:00
haiyangcui
17c78522bb 播放页面出现的列表页面,都实现v-on-clickaway 2020-11-11 16:30:22 +01:00
hunlongyu
7af6c73084 ⏱ 修改下拉菜单三角箭头的样式 2020-11-11 22:46:26 +08:00
hunlongyu
d31e0daca9 Merge branch 'master' of https://github.com/Hunlongyu/ZY-Player 2020-11-11 21:41:46 +08:00
hunlongyu
9a7534ba57 ⏲ 移除 child_process 依赖, 使用 node 自带模块 2020-11-11 21:41:39 +08:00
buvta
a73e679b72 Revert "改进搜索框的样式"
This reverts commit b72886fbe6.
2020-11-11 21:36:31 +08:00
buvta
4f6c248345 Revert "引入需要的bootstrap-vue依赖"
This reverts commit 59a89e280b.
2020-11-11 21:36:28 +08:00
hunlongyu
68a0226759 🕰 修改 Film 表格模式样式 2020-11-11 21:26:55 +08:00
haiyangcui
e72af95c75 更新源列表,把检测后不可用的放到最下部 2020-11-11 12:54:04 +01:00
buvta
559e85785f film页面el-table引入电影追剧模式 2020-11-11 13:04:55 +08:00
Hunlongyu
2bf69fb0b9 修复 Play 组件无法弹出侧边栏的BUG 2020-11-11 11:10:48 +08:00
buvta
c082986e09 精简模式引入mode 2020-11-11 08:29:56 +08:00
buvta
05d71a62aa 搜索结果过滤器重置时只给选定列添加 2020-11-11 08:29:12 +08:00
buvta
bb537d789d 解决菜单更新bug 2020-11-11 07:11:30 +08:00
buvta
11baacc778 直播支持精简模式 2020-11-11 07:11:30 +08:00
buvta
9dbc0e00dc 支持频道换源 2020-11-11 07:11:30 +08:00
buvta
23e5c569b1 调整Play直播时播放器下方菜单,支持使用第三方播放器 2020-11-11 07:11:30 +08:00
haiyangcui
59a89e280b 引入需要的bootstrap-vue依赖 2020-11-10 20:39:33 +01:00
haiyangcui
b72886fbe6 改进搜索框的样式 2020-11-10 20:16:06 +01:00
haiyangcui
75bac6582c 简化el-select样式定义 2020-11-10 15:20:48 +01:00
Hunlongyu
7cc7e4e0e6 移除赞助, 移除多余排序文字 2020-11-10 17:15:30 +08:00
buvta
b1707f88d6 Merge pull request #345 from Hunlongyu/buvta
分组搜索
2020-11-10 16:56:39 +08:00
buvta
9ca946eb66 搜索默认设置调整为全部 2020-11-10 15:48:14 +08:00
buvta
76ed091c78 取消IPTV检测时的播放限制 2020-11-10 14:34:14 +08:00
buvta
5965c55773 搜索结果过滤器遵守限制 2020-11-10 14:33:04 +08:00
buvta
6631b8f568 避免后台还在运行的搜索被添加到新搜索中 2020-11-10 13:30:18 +08:00
buvta
b7bb5f85a3 搜索结果不能同时用多个过滤器 2020-11-10 13:03:48 +08:00
buvta
c8795e2aa9 优化分组搜索 2020-11-10 12:21:32 +08:00
buvta
2d7f012180 加搜索按钮 2020-11-10 12:21:32 +08:00
buvta
95ae729df8 Play页面换源由“所有”替换为同组资源站 2020-11-10 12:21:32 +08:00
buvta
40218521ac Film重构搜索以支持分组搜索 2020-11-10 12:21:28 +08:00
buvta
f4396cb69f 调整搜索配置 2020-11-10 12:15:30 +08:00
buvta
2dfbc8a8a2 调整搜索框样式 2020-11-10 12:12:58 +08:00
buvta
f94e8f0bec 改写Film.vue搜索框,预备支持分组搜索 2020-11-10 12:12:55 +08:00
haiyangcui
a9011abdf0 加入Waterfall元素的null check 2020-11-09 18:31:19 +01:00
haiyangcui
843a8dd1fc 移除"搜索所有资源"开关,搜索变总是搜索所有资源 2020-11-09 18:26:07 +01:00
haiyangcui
9b5aae095e Revert "搜索结果加过滤器", 搜索后默认按源站排序 2020-11-09 14:59:49 +01:00
buvta
24e890d1ab 统一操作列风格 2020-11-09 08:19:40 +08:00
buvta
959f515f55 iptv初始化数据加isActive 2020-11-09 08:06:16 +08:00
haiyangcui
f97d63cf68 更新animationEffect为fadein 2020-11-08 22:27:57 +01:00
buvta
c2f3a60198 搜索结果加过滤器 2020-11-09 00:17:08 +08:00
haiyangcui
9128f407ce 获取豆瓣评分时,移除空格 2020-11-08 12:31:00 +01:00
haiyangcui
c5c6e5e34f 修复推荐数据 2020-11-08 12:29:15 +01:00
haiyangcui
b12cdf25d5 改进排序 2020-11-08 12:28:12 +01:00
haiyangcui
7c08627e6f 支持搜索结果排序 2020-11-08 12:18:42 +01:00
haiyangcui
68c3687da3 getSites时无需再设置isActive 2020-11-08 11:35:58 +01:00
haiyangcui
00d6f2d218 更新默认源站数据 2020-11-08 11:33:23 +01:00
buvta
a918713bf7 Merge pull request #343 from Hunlongyu/buvta
增加代理及直播源检测功能
2020-11-08 18:03:52 +08:00
buvta
ae7aaec623 统一editSites状态开关数据类型为Boolean 2020-11-08 18:02:08 +08:00
buvta
81476e0f20 Merge remote-tracking branch 'co/master' 2020-11-08 17:56:48 +08:00
haiyangcui
4136b0f3ce 代理功能,作者:buvta 2020-11-08 00:13:08 +01:00
haiyangcui
c3a4cf5cc5 IPTV检测功能,作者:buvta 2020-11-07 23:55:44 +01:00
haiyangcui
d2263f3f76 添加推荐 2020-11-07 23:18:04 +01:00
haiyangcui
71df73fbd3 推荐页面排序功能 2020-11-07 23:16:00 +01:00
haiyangcui
ba6f3df9b1 升级依赖 2020-11-07 19:56:38 +01:00
haiyangcui
35c205fd86 刷新历史页面瀑布流,改进自适应 2020-11-07 19:29:40 +01:00
haiyangcui
30796af5f8 收藏页面,海报添加观看进度信息 2020-11-07 19:25:49 +01:00
haiyangcui
fde5dbb89d 改进历史视图 2020-11-07 19:14:06 +01:00
buvta
df3b43d8ac 进一步完善shift多选 2020-11-08 01:07:09 +08:00
buvta
8f94a5604d 批处理多选时支持shift快捷键 2020-11-08 00:35:05 +08:00
buvta
c6a39591d5 批量检测时增加进度提示 2020-11-08 00:28:07 +08:00
buvta
051d6b7701 修复导入直播源时的错误 2020-11-08 00:28:02 +08:00
buvta
51ba1d87ad 批量检测时继续限制删除功能 2020-11-08 00:26:45 +08:00
buvta
9af55df310 支持导入同名频道 2020-11-07 21:39:10 +08:00
buvta
d82251fb02 批量删除时重置ID及过滤器 2020-11-07 21:39:10 +08:00
buvta
4d192a4c3a 调整源状态开关列 2020-11-07 21:39:10 +08:00
buvta
1f25219cdc 批量检测时未检查过的优先 2020-11-07 21:39:10 +08:00
buvta
25d65866ae 改动syncTableData以便删除可用 2020-11-07 21:39:10 +08:00
buvta
11559ca164 资源站及直播源编辑页面"清空"替换为批量删除 2020-11-07 21:39:10 +08:00
buvta
6c82178604 完善直播源批量检测时的功能限制 2020-11-07 21:39:10 +08:00
buvta
029d1d9b49 完善源批量检测的功能限制 2020-11-07 21:39:10 +08:00
buvta
c10f7b98d9 去除多余的editSites属性 2020-11-07 21:39:10 +08:00
buvta
48d4b369a8 修正直播源检测出错时返回结果 2020-11-07 21:39:10 +08:00
buvta
42d2b5c20f 添加直播源检测功能 2020-11-07 21:39:09 +08:00
buvta
ccbafaae39 增加代理功能,默认使用系统代理设置 2020-11-07 21:39:09 +08:00
haiyangcui
fb3b908fe8 继续播放时,隐藏进度条,无需检查是否全屏 2020-11-07 21:39:09 +08:00
haiyangcui
4c4cc6d81b 当全屏暂停再继续播放时,隐藏进度条 2020-11-07 21:39:09 +08:00
haiyangcui
9ccfefaafb 历史页面,改进进度展示 2020-11-07 21:39:09 +08:00
haiyangcui
15a38f1b9c 支持历史视图模式 2020-11-07 21:39:09 +08:00
haiyangcui
967657e0ac 修正拼写 2020-11-07 21:39:09 +08:00
Hunlongyu
cd08e9e14b 🥀 新增任务栏显示播放进度 2020-11-07 21:39:09 +08:00
Hunlongyu
7e5bd534ef 🌿 修改样式 2020-11-07 21:39:09 +08:00
Hunlongyu
dce2e36ef0 🍀 修复瀑布流不自动自适应 2020-11-07 21:39:09 +08:00
haiyangcui
8a72b30f79 切换源的时候无需隐藏再显示类型列表 2020-11-07 21:39:09 +08:00
haiyangcui
bbe0d157f4 改进代码 2020-11-07 21:39:09 +08:00
haiyangcui
f44f8ea6cf 统一样式,el-select选择或划过的背景色也用背景色之一 2020-11-07 21:39:09 +08:00
haiyangcui
cd6f9f1f53 删除zy-checkbox的css样式定义 2020-11-07 21:39:09 +08:00
haiyangcui
74d084cb7b zy-table已经被el-table取代,删除无用的样式 2020-11-07 21:39:09 +08:00
haiyangcui
e60962a0f5 删除无用的console输出 2020-11-07 21:39:09 +08:00
haiyangcui
459a54382f el-select实现源站列表和分类列表 2020-11-07 21:39:09 +08:00
haiyangcui
e08a90d87a 修正Recommendation的拼写 2020-11-07 21:39:09 +08:00
haiyangcui
c676159cc7 继续播放时,隐藏进度条,无需检查是否全屏 2020-11-07 12:39:12 +01:00
haiyangcui
0fc8e54d26 当全屏暂停再继续播放时,隐藏进度条 2020-11-07 12:35:35 +01:00
haiyangcui
fe858a0cd9 历史页面,改进进度展示 2020-11-07 12:29:34 +01:00
haiyangcui
2238ddd109 支持历史视图模式 2020-11-07 11:29:03 +01:00
Hunlongyu
cc1c100075 Merge branch 'master' of https://github.com/Hunlongyu/ZY-Player into master 2020-11-06 17:38:48 +08:00
Hunlongyu
81ba6de6cb 🥀 新增任务栏显示播放进度 2020-11-06 17:38:42 +08:00
haiyangcui
28baca56c4 修正拼写 2020-11-06 10:29:50 +01:00
Hunlongyu
3493831729 🌿 修改样式 2020-11-06 10:09:25 +08:00
Hunlongyu
42fce7d137 🍀 修复瀑布流不自动自适应 2020-11-06 10:02:01 +08:00
haiyangcui
c7a4b389e1 切换源的时候无需隐藏再显示类型列表 2020-11-05 23:47:57 +01:00
haiyangcui
5f47789a1a 改进代码 2020-11-05 22:57:29 +01:00
haiyangcui
7591c30b59 统一样式,el-select选择或划过的背景色也用背景色之一 2020-11-05 22:40:53 +01:00
haiyangcui
dd43c18491 删除zy-checkbox的css样式定义 2020-11-05 22:23:07 +01:00
haiyangcui
6949eb16d6 zy-table已经被el-table取代,删除无用的样式 2020-11-05 22:20:53 +01:00
haiyangcui
4a369a755e 删除无用的console输出 2020-11-05 22:15:05 +01:00
haiyangcui
e1b1742424 el-select实现源站列表和分类列表 2020-11-05 22:14:42 +01:00
haiyangcui
de31c4c0bb 修正Recommendation的拼写 2020-11-05 21:28:21 +01:00
cuiocean
c85910edd0 Merge pull request #342 from buvta/forPR
部分功能优化
2020-11-05 21:06:51 +01:00
buvta
b8d78bab10 改动film源站列表加载方式 2020-11-06 00:45:46 +08:00
buvta
9eed5ce0b7 源检测并发执行 2020-11-05 22:08:49 +08:00
buvta
4b11cab4bf axios增加配置 2020-11-05 22:07:38 +08:00
buvta
6ffbc2a63c 优化Film加载提示 2020-11-05 21:19:14 +08:00
haiyangcui
c6f4917cdc 改进瀑布流的样式及鼠标划过的效果 2020-11-05 12:44:30 +01:00
haiyangcui
fe37b32a0f 鼠标移动到卡片上时,添加上移动画效果 2020-11-05 12:38:38 +01:00
Hunlongyu
7fb295d34c 升级依赖 2020-11-05 18:03:31 +08:00
haiyangcui
e8c5c0ec72 改进瀑布流设置,更好的适应宽度 2020-11-04 14:52:47 +01:00
haiyangcui
64dc9c98d2 v2.6.3 2020-11-04 12:13:05 +01:00
haiyangcui
ca36841f5d 打开换源页面时,记录当前时间,换源时使用该时间。否则,如果换源失败,this.xg.currentTime 会被重置为0 2020-11-04 12:11:49 +01:00
haiyangcui
59d33d201c 如果时间进度已经设定,无需读取历史数据 2020-11-04 09:43:20 +01:00
haiyangcui
bf3b6d4088 再次解决换源时间进度问题 2020-11-04 09:06:48 +01:00
haiyangcui
bf2567bfde 修复推荐里豆瓣评分2 2020-11-03 22:56:55 +01:00
haiyangcui
3499fb5937 修复推荐里错误的评分 2020-11-03 22:49:13 +01:00
haiyangcui
dec12c77d0 添加两个新源,牛牛和百度云 2020-11-03 22:11:58 +01:00
haiyangcui
17be5d45f1 v2.6.2 2020-11-03 17:16:51 +01:00
haiyangcui
f493fcd24e 屏蔽福利片checkbox可以直接关联setting.excludeR18Films 2020-11-03 17:06:05 +01:00
haiyangcui
d040bc01fc 更新收藏导出时的提示 2020-11-03 16:45:38 +01:00
haiyangcui
6644c97811 导入收藏时,deep copy当前的list,否则列表会在没有排序好之前就被展示 2020-11-03 16:39:00 +01:00
haiyangcui
68960ab5bb 改进star的导入导出时的排序问题 2020-11-03 16:34:12 +01:00
haiyangcui
46de044214 统一海报视图 2020-11-03 15:46:48 +01:00
haiyangcui
0cbf9ca7fb 改进推荐页面排序问题 2020-11-03 15:41:15 +01:00
haiyangcui
6fa40af9bd 更新推荐 2020-11-03 15:23:38 +01:00
haiyangcui
7343f1824a 集中豆瓣评分和豆瓣链接获取功能到tools中 2020-11-03 14:57:07 +01:00
haiyangcui
3df0665950 改进过滤关键词 2020-11-03 14:13:26 +01:00
haiyangcui
022b1b28ad 改进Film页面刷新的逻辑,避免不必要的刷新 2020-11-03 13:56:41 +01:00
haiyangcui
55d1740354 移动"屏蔽福利片"到源编辑页面 2020-11-03 12:58:34 +01:00
haiyangcui
9d71991103 如果开启屏蔽福利片选项,也过滤搜索结果 2020-11-02 22:08:38 +01:00
haiyangcui
361e24ecad 引入vue-clickaway 2020-11-02 21:28:29 +01:00
haiyangcui
53f80d2cce 点击换源后,不需要关闭换源窗口.用户可以等待新源确定工作后自行关闭 2020-11-02 21:09:53 +01:00
haiyangcui
880dd9ff35 重新解决换源时间进度问题,发现记录this.video.info.time的话,视频会卡一下 2020-11-02 18:03:47 +01:00
haiyangcui
42c89120da 如果没有任何收藏有更新时,发消息提醒用户'未查询到任何更新' 2020-11-02 17:54:43 +01:00
haiyangcui
d990aa92b0 记录当前播放时间this.video.info.time, 解决换源时时间进度定位问题 2020-11-02 16:23:05 +01:00
haiyangcui
e117564ecb 在style.css里统一定义el-select的样式 2020-11-02 12:11:45 +01:00
haiyangcui
99592e3fcb 改进el-select样式,设置不同主题下的背景色等 2020-11-02 11:21:33 +01:00
Hunlongyu
adc8fd4329 🍁 修复因为分类异常, 导致资源加载不出来. 2020-11-02 13:44:10 +08:00
haiyangcui
579caddaeb 更新推荐 2020-11-01 23:29:49 +01:00
haiyangcui
1d5344f292 更新推荐 2020-11-01 23:19:32 +01:00
haiyangcui
22dc74ea3a 更新推荐 2020-11-01 23:15:39 +01:00
haiyangcui
72d7c91540 更新推荐 2020-11-01 22:38:46 +01:00
haiyangcui
ef874d1831 v2.6.1 2020-11-01 18:36:08 +01:00
haiyangcui
bb9a8ca65d 获取其他源时,排除当前源 2020-11-01 18:03:33 +01:00
haiyangcui
747abf3b26 设置密码对话框的宽度 2020-11-01 17:41:20 +01:00
haiyangcui
1078cf3c63 修复自动更新功能 2020-11-01 17:29:57 +01:00
haiyangcui
22b877b0fb 定义不同的waterfall的ref 2020-11-01 17:24:29 +01:00
haiyangcui
34e6b8bd08 更新推荐 2020-11-01 14:02:11 +01:00
haiyangcui
4d039e9a63 更新推荐后刷新分类过滤数据 2020-11-01 14:01:48 +01:00
haiyangcui
16f3954959 删除无用的style 2020-11-01 12:17:20 +01:00
haiyangcui
17845e6ab4 改进换源功能,在新源中打开当前剧集和时间进度 2020-11-01 12:07:54 +01:00
66 changed files with 12546 additions and 15885 deletions

28
.github/ISSUE_TEMPLATE/bug.md vendored Normal file
View File

@@ -0,0 +1,28 @@
---
name: 报告Bug(请先查看常见问题及搜索issue列表中有无你要提的问题)
about: 创建报告以帮助我们改进
title: '(未回答的问题请删除)'
labels: bug
assignees: ''
---
**描述错误**
清楚简洁地说明错误是什么。
**重现**
重现行为的步骤
**预期行为**
对您期望发生的事情的简洁明了的描述。
**截图**
如果适用,请添加屏幕截图以帮助解释您的问题(直接把图片拖到编辑框即可添加图片)。
**环境:**
-操作系统及版本:[例如Windows 10 64位 18362.156]
-软件安装包及版本:[例如Windows 64位绿色版 1.0.0]
**其他内容**
在此处添加有关该问题的任何其他上下文。

17
.github/ISSUE_TEMPLATE/feature.md vendored Normal file
View File

@@ -0,0 +1,17 @@
---
name: 功能请求(请先查看常见问题及搜索issue列表中有无你要提的问题)
about: 为这个项目提出一个想法
title: 例如添加xxx功能、优化xxx功能未回答的问题请删除
labels: enhancement
assignees: ''
---
**描述您想要的解决方案**
简洁明了地描述您要发生的事情。
**描述您考虑过的替代方案**
对您考虑过的所有替代解决方案或功能的简洁明了的描述。
**其他内容**
在此处添加有关功能请求的任何其他上下文或屏幕截图(直接把图片拖到编辑框即可添加图片)。

19
.github/ISSUE_TEMPLATE/help.md vendored Normal file
View File

@@ -0,0 +1,19 @@
---
name: 需要帮助
about: "其它问题"
labels: help wanted
---
### 版本、安装方式、系统
1. 你在使用什么版本的
2. 你通过什么方式安装
3. 你所使用的操作系统
### 描述问题:
<!-- 在下方描述问题 -->

View File

@@ -29,6 +29,7 @@
### ✨特性
- 🍕 全平台支持. Windows, Mac, Linux
- 🍥 支持 IPTV, 卫视直播
- 🍔 视频源支持自定义, 支持导入, 导出
- 🍟 支持海报模式和列表模式浏览资源
- 🌭 播放历史, 自动跳转历史进度
@@ -45,6 +46,17 @@
- 🍉 [蓝奏云 -- 快速下载](https://www.lanzoux.com/b04s6a3re) 密码:95px
- 🍒 适用于32位操作系统的x86软件,在蓝奏云网盘里, 后缀名: ZY Player * 32位.exe
### 🎠 平台
| 平台 | 链接 |
| :------------------------------------ | :---------------------------------------------------------- |
| 🖥️ 电脑端 ( Windows & Mac & Linux ) | [ZY Player](https://github.com/Hunlongyu/ZY-Player) |
| 📱 手机端 ( Android & IOS ) | [ZY Player APP](https://github.com/Hunlongyu/ZY-Player-APP) |
| 📺 电视端 ( Android & Mac ) ( 进行中 ) | [ZY Player TV](https://github.com/cuiocean/ZY-Player-TV) |
| 🌐 浏览器 ( Web ) | [ZY Player Web](https://github.com/Hunlongyu/ZY-Player-Web) |
### 🚀 快捷键
播放窗口 和 Mini窗口
@@ -80,13 +92,8 @@
### 🍭 开发者
| [Hunlongyu](https://github.com/Hunlongyu) | [cuiocean](https://github.com/cuiocean) |
| :----------------------------------------------------------: | :----------------------------------------------------------: |
| <img width="120" src="https://avatars2.githubusercontent.com/u/15273630?s=460&u=48cf3299e2a842c0252233d8be42ef4c5d792138&v=4"/> | <img width="120" src="https://avatars0.githubusercontent.com/u/5760235?s=460&u=9d969dd8d83f069ce7ebd60516770c93ac07a330&v=4" /> |
| 💻 🎨 🐛 | 💻 🐛 |
| [Hunlongyu](https://github.com/Hunlongyu) | [cuiocean](https://github.com/cuiocean) | [buvta](https://github.com/buvta) |
| :----------------------------------------------------------: | :----------------------------------------------------------: | :----------------------------------------------------------: |
| <img width="120" src="https://avatars2.githubusercontent.com/u/15273630?s=460&u=48cf3299e2a842c0252233d8be42ef4c5d792138&v=4"/> | <img width="120" src="https://avatars0.githubusercontent.com/u/5760235?s=460&u=9d969dd8d83f069ce7ebd60516770c93ac07a330&v=4" /> | <img width="120" src="https://avatars3.githubusercontent.com/u/12312540?s=400&v=4" /> |
| 💻 🎨 🐛 | 💻 🐛 | 💻 🐛 |
### 🧧 赞助
[![LATOPAY](https://latopay.com/w/lt-bg-2062.png)](https://latopay.com/@Hunlongyu)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 73 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 224 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 944 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 927 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 691 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 152 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 206 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 1.1 MiB

View File

@@ -89,7 +89,7 @@
<div class="section-title">
<h2>软件特色</h2>
<p>经过三个大版本更迭, 软件功能丰富, 操作简单.</p>
<p>软件功能丰富, 操作简单.</p>
</div>
<div class="row no-gutters">
@@ -99,7 +99,7 @@
<div class="col-md-6 icon-box" data-aos="fade-up">
<i class="bx bx-receipt"></i>
<h4>浏览</h4>
<p>浏览全网热门视频, 支持切换视频源. 详细的电影分类.支持搜索电影名和演员名称. </p>
<p>浏览全网热门视频, 支持切换视频源. 详细的电影分类. </p>
</div>
<div class="col-md-6 icon-box" data-aos="fade-up" data-aos-delay="100">
<i class="icofont-play-alt-3"></i>
@@ -124,7 +124,7 @@
<div class="col-md-6 icon-box" data-aos="fade-up" data-aos-delay="500">
<i class="icofont-cubes"></i>
<h4>其他</h4>
<p>多主题, 多语言, 自动更新</p>
<p>多主题, 自动更新</p>
</div>
</div>
</div>
@@ -146,14 +146,14 @@
</div>
<div class="owl-carousel gallery-carousel" data-aos="fade-up">
<a href="assets/img/gallery/001.png" class="venobox" data-gall="gallery-carousel"><img src="assets/img/gallery/001.png" alt=""></a>
<a href="assets/img/gallery/002.png" class="venobox" data-gall="gallery-carousel"><img src="assets/img/gallery/002.png" alt=""></a>
<a href="assets/img/gallery/003.png" class="venobox" data-gall="gallery-carousel"><img src="assets/img/gallery/003.png" alt=""></a>
<a href="assets/img/gallery/004.png" class="venobox" data-gall="gallery-carousel"><img src="assets/img/gallery/004.png" alt=""></a>
<a href="assets/img/gallery/005.png" class="venobox" data-gall="gallery-carousel"><img src="assets/img/gallery/005.png" alt=""></a>
<a href="assets/img/gallery/006.png" class="venobox" data-gall="gallery-carousel"><img src="assets/img/gallery/006.png" alt=""></a>
<a href="assets/img/gallery/007.png" class="venobox" data-gall="gallery-carousel"><img src="assets/img/gallery/007.png" alt=""></a>
<a href="assets/img/gallery/008.png" class="venobox" data-gall="gallery-carousel"><img src="assets/img/gallery/008.png" alt=""></a>
<a href="assets/img/gallery/01.png" class="venobox" data-gall="gallery-carousel"><img src="assets/img/gallery/01.png" alt=""></a>
<a href="assets/img/gallery/02.png" class="venobox" data-gall="gallery-carousel"><img src="assets/img/gallery/02.png" alt=""></a>
<a href="assets/img/gallery/03.png" class="venobox" data-gall="gallery-carousel"><img src="assets/img/gallery/03.png" alt=""></a>
<a href="assets/img/gallery/04.png" class="venobox" data-gall="gallery-carousel"><img src="assets/img/gallery/04.png" alt=""></a>
<a href="assets/img/gallery/05.png" class="venobox" data-gall="gallery-carousel"><img src="assets/img/gallery/05.png" alt=""></a>
<a href="assets/img/gallery/06.png" class="venobox" data-gall="gallery-carousel"><img src="assets/img/gallery/06.png" alt=""></a>
<a href="assets/img/gallery/07.png" class="venobox" data-gall="gallery-carousel"><img src="assets/img/gallery/07.png" alt=""></a>
<a href="assets/img/gallery/08.png" class="venobox" data-gall="gallery-carousel"><img src="assets/img/gallery/08.png" alt=""></a>
</div>
</div>
@@ -193,7 +193,7 @@
<i class="bx bx-help-circle icon-help"></i> <a data-toggle="collapse" href="#accordion-list-3" class="collapsed">跨平台<i class="bx bx-chevron-down icon-show"></i><i class="bx bx-chevron-up icon-close"></i></a>
<div id="accordion-list-3" class="collapse" data-parent=".accordion-list">
<p>
目前支持 Windows, Mac, Linux 桌面系统. 暂不支持手机端或者电视端. 未来会考虑实现全平台.
目前支持 Windows, Mac, Linux, Android, IOS, TV, Web 全平台.
</p>
</div>
</li>

View File

@@ -1,571 +0,0 @@
#EXTM3U
#EXTINF:-1,CCTV1-1080P
http://keonline.shanghai.liveplay.qq.com/live/program/live/cctv1hd/4000000/mnf.m3u8
#EXTINF:-1,CCTV-1HD
http://keonline.shanghai.liveplay.qq.com/live/program/live/cctv1hd/2300000/mnf.m3u8
#EXTINF:-1,CCTV1 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225924/1.m3u8
#EXTINF:-1,CCTV1 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226154/1.m3u8
#EXTINF:-1,CCTV1 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226155/1.m3u8
#EXTINF:-1,CCTV1 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226226/1.m3u8
#EXTINF:-1,CCTV1 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226346/1.m3u8
#EXTINF:-1,CCTV1 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226431/1.m3u8
#EXTINF:-1,CCTV2 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226230/1.m3u8
#EXTINF:-1,CCTV2 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226371/1.m3u8
#EXTINF:-1,CCTV2 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226472/1.m3u8
#EXTINF:-1,CCTV3 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226471/1.m3u8
#EXTINF:-1,CCTV4 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226314/1.m3u8
#EXTINF:-1,CCTV4 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226335/1.m3u8
#EXTINF:-1,CCTV4 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226470/1.m3u8
#EXTINF:-1,CCTV5 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226469/1.m3u8
#EXTINF:-1,CCTV5+ HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226225/1.m3u8
#EXTINF:-1,CCTV5+ CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226349/1.m3u8
#EXTINF:-1,CCTV5+ CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226458/1.m3u8
#EXTINF:-1,CCTV6 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226468/1.m3u8
#EXTINF:-1,CCTV7 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226234/1.m3u8
#EXTINF:-1,CCTV7 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226467/1.m3u8
#EXTINF:-1,CCTV8 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226485/1.m3u8
#EXTINF:-1,CCTV9 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226236/1.m3u8
#EXTINF:-1,CCTV9 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226465/1.m3u8
#EXTINF:-1,CCTV10 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226227/1.m3u8
#EXTINF:-1,CCTV10 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226464/1.m3u8
#EXTINF:-1,CCTV11 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226334/1.m3u8
#EXTINF:-1,CCTV11 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226315/1.m3u8
#EXTINF:-1,CCTV11 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226463/1.m3u8
#EXTINF:-1,CCTV12 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226228/1.m3u8
#EXTINF:-1,CCTV12 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226462/1.m3u8
#EXTINF:-1,CCTV13 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226316/1.m3u8
#EXTINF:-1,CCTV14 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226229/1.m3u8
#EXTINF:-1,CCTV14 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226461/1.m3u8
#EXTINF:-1,CCTV15 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226460/1.m3u8
#EXTINF:-1,CCTV15 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226317/1.m3u8
#EXTINF:-1,CCTV15 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226333/1.m3u8
#EXTINF:-1,CCTV17 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226318/1.m3u8
#EXTINF:-1,CCTV17 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226459/1.m3u8
#EXTINF:-1,CCTV-4K
http://112.17.40.12/PLTV/88888888/224/3221226758/1.m3u8
#EXTINF:-1,CCTV-4K
http://112.17.40.140/PLTV/88888888/224/3221226758/index.m3u8
#EXTINF:-1,CCTV-4K
http://39.134.176.148/PLTV/88888888/224/3221226758/index.m3u8
#EXTINF:-1,CCTV-4K
http://117.148.187.83/PLTV/88888888/224/3221226758/index.m3u8
#EXTINF:-1,北京卫视1080P
http://keonline.shanghai.liveplay.qq.com/live/program/live/bjwshd/4000000/mnf.m3u8
#EXTINF:-1,江苏卫视1080P
http://keonline.shanghai.liveplay.qq.com/live/program/live/jswshd/4000000/mnf.m3u8
#EXTINF:-1,浙江卫视1080P
http://keonline.shanghai.liveplay.qq.com/live/program/live/zjwshd/4000000/mnf.m3u8
#EXTINF:-1,深圳卫视1080P
http://keonline.shanghai.liveplay.qq.com/live/program/live/szwshd/4000000/mnf.m3u8
#EXTINF:-1,山东卫视1080P
http://keonline.shanghai.liveplay.qq.com/live/program/live/sdwshd/4000000/mnf.m3u8
#EXTINF:-1,湖北卫视1080P
http://keonline.shanghai.liveplay.qq.com/live/program/live/hbwshd/4000000/mnf.m3u8
#EXTINF:-1,广东卫视1080P
http://keonline.shanghai.liveplay.qq.com/live/program/live/gdwshd/4000000/mnf.m3u8
#EXTINF:-1,东方卫视1080P
http://keonline.shanghai.liveplay.qq.com/live/program/live/hddfws/4000000/mnf.m3u8
#EXTINF:-1,黑龙江卫视1080P
http://keonline.shanghai.liveplay.qq.com/live/program/live/hljwshd/4000000/mnf.m3u8
#EXTINF:-1,五星体育1080P
http://keonline.shanghai.liveplay.qq.com/live/program/live/ssty/4000000/mnf.m3u8
#EXTINF:-1,北京卫视高清
http://keonline.shanghai.liveplay.qq.com/live/program/live/bjwshd/1300000/mnf.m3u8
#EXTINF:-1,东方卫视高清
http://keonline.shanghai.liveplay.qq.com/live/program/live/hddfws/1300000/mnf.m3u8
#EXTINF:-1,浙江卫视高清
http://keonline.shanghai.liveplay.qq.com/live/program/live/zjwshd/1300000/mnf.m3u8
#EXTINF:-1,湖北卫视高清
http://keonline.shanghai.liveplay.qq.com/live/program/live/hbwshd/1300000/mnf.m3u8
#EXTINF:-1,湖南卫视高清
http://keonline.shanghai.liveplay.qq.com/live/program/live/hnwshd/1300000/mnf.m3u8
#EXTINF:-1,山东卫视高清
http://keonline.shanghai.liveplay.qq.com/live/program/live/sdwshd/1300000/mnf.m3u8
#EXTINF:-1,江苏卫视高清
http://keonline.shanghai.liveplay.qq.com/live/program/live/jswshd/1300000/mnf.m3u8
#EXTINF:-1,深圳卫视高清
http://keonline.shanghai.liveplay.qq.com/live/program/live/szwshd/1300000/mnf.m3u8
#EXTINF:-1,广东卫视高清
http://keonline.shanghai.liveplay.qq.com/live/program/live/gdwshd/1300000/mnf.m3u8
#EXTINF:-1,黑龙江卫视高清
http://keonline.shanghai.liveplay.qq.com/live/program/live/hljwshd/1300000/mnf.m3u8
#EXTINF:-1,湖南卫视HD
http://keonline.shanghai.liveplay.qq.com/live/program/live/hnwshd/2300000/mnf.m3u8
#EXTINF:-1,北京卫视HD
http://keonline.shanghai.liveplay.qq.com/live/program/live/bjwshd/2300000/mnf.m3u8
#EXTINF:-1,江苏卫视HD
http://keonline.shanghai.liveplay.qq.com/live/program/live/jswshd/2300000/mnf.m3u8
#EXTINF:-1,浙江卫视HD
http://keonline.shanghai.liveplay.qq.com/live/program/live/zjwshd/2300000/mnf.m3u8
#EXTINF:-1,深圳卫视HD
http://keonline.shanghai.liveplay.qq.com/live/program/live/szwshd/2300000/mnf.m3u8
#EXTINF:-1,山东卫视HD
http://keonline.shanghai.liveplay.qq.com/live/program/live/sdwshd/2300000/mnf.m3u8
#EXTINF:-1,湖北卫视HD
http://keonline.shanghai.liveplay.qq.com/live/program/live/hbwshd/2300000/mnf.m3u8
#EXTINF:-1,广东卫视HD
http://keonline.shanghai.liveplay.qq.com/live/program/live/gdwshd/2300000/mnf.m3u8
#EXTINF:-1,黑龙江卫视HD
http://keonline.shanghai.liveplay.qq.com/live/program/live/hljwshd/2300000/mnf.m3u8
#EXTINF:-1,五星体育HD
http://keonline.shanghai.liveplay.qq.com/live/program/live/ssty/2300000/mnf.m3u8
#EXTINF:-1,中国教育1 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226494/1.m3u8
#EXTINF:-1,东南卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226406/1.m3u8
#EXTINF:-1,东南卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226496/1.m3u8
#EXTINF:-1,东方卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226237/1.m3u8
#EXTINF:-1,东方卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226364/1.m3u8
#EXTINF:-1,东方卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226505/1.m3u8
#EXTINF:-1,北京卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226224/1.m3u8
#EXTINF:-1,北京卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226367/1.m3u8
#EXTINF:-1,北京卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226441/1.m3u8
#EXTINF:-1,天津卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226246/1.m3u8
#EXTINF:-1,天津卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226502/1.m3u8
#EXTINF:-1,安徽卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226223/1.m3u8
#EXTINF:-1,安徽卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226499/1.m3u8
#EXTINF:-1,山东卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225894/1.m3u8
#EXTINF:-1,山东卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226244/1.m3u8
#EXTINF:-1,山东卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226308/1.m3u8
#EXTINF:-1,山东卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226501/1.m3u8
#EXTINF:-1,广东卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225878/1.m3u8
#EXTINF:-1,广东卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226238/1.m3u8
#EXTINF:-1,广东卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226508/1.m3u8
#EXTINF:-1,江苏卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226242/1.m3u8
#EXTINF:-1,江苏卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226366/1.m3u8
#EXTINF:-1,江苏卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226506/1.m3u8
#EXTINF:-1,江西卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226243/1.m3u8
#EXTINF:-1,河北卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226507/1.m3u8
#EXTINF:-1,浙江卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226247/1.m3u8
#EXTINF:-1,浙江卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226365/1.m3u8
#EXTINF:-1,浙江卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226504/1.m3u8
#EXTINF:-1,深圳卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225897/1.m3u8
#EXTINF:-1,深圳卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226245/1.m3u8
#EXTINF:-1,深圳卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226495/1.m3u8
#EXTINF:-1,湖北卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226240/1.m3u8
#EXTINF:-1,湖北卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226310/1.m3u8
#EXTINF:-1,湖北卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226503/1.m3u8
#EXTINF:-1,湖南卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226241/1.m3u8
#EXTINF:-1,湖南卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226509/1.m3u8
#EXTINF:-1,贵州卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226497/1.m3u8
#EXTINF:-1,辽宁卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226500/1.m3u8
#EXTINF:-1,黑龙江卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226239/1.m3u8
#EXTINF:-1,黑龙江卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226498/1.m3u8
#EXTINF:-1,北京冬奥纪实 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226438/1.m3u8
#EXTINF:-1,北京影视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226486/1.m3u8
#EXTINF:-1,北京文艺 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226440/1.m3u8
#EXTINF:-1,北京新闻 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226437/1.m3u8
#EXTINF:-1,安徽卫视
http://keonline.shanghai.liveplay.qq.com/live/program/live/ahws/1300000/mnf.m3u8
#EXTINF:-1,兵团卫视
http://keonline.shanghai.liveplay.qq.com/live/program/live/btws/1300000/mnf.m3u8
#EXTINF:-1,甘肃卫视
http://keonline.shanghai.liveplay.qq.com/live/program/live/gsws/1300000/mnf.m3u8
#EXTINF:-1,陕西卫视
http://keonline.shanghai.liveplay.qq.com/live/program/live/sxws/1300000/mnf.m3u8
#EXTINF:-1,山西卫视
http://keonline.shanghai.liveplay.qq.com/live/program/live/shanxiws/1300000/mnf.m3u8
#EXTINF:-1,吉林卫视
http://keonline.shanghai.liveplay.qq.com/live/program/live/jlws/1300000/mnf.m3u8
#EXTINF:-1,河北卫视
http://keonline.shanghai.liveplay.qq.com/live/program/live/hbws/1300000/mnf.m3u8
#EXTINF:-1,四川卫视
http://keonline.shanghai.liveplay.qq.com/live/program/live/scws/1300000/mnf.m3u8
#EXTINF:-1,贵州卫视
http://keonline.shanghai.liveplay.qq.com/live/program/live/gzws/1300000/mnf.m3u8
#EXTINF:-1,云南卫视
http://keonline.shanghai.liveplay.qq.com/live/program/live/ynws/1300000/mnf.m3u8
#EXTINF:-1,辽宁卫视
http://keonline.shanghai.liveplay.qq.com/live/program/live/lnws/1300000/mnf.m3u8
#EXTINF:-1,旅游卫视
http://keonline.shanghai.liveplay.qq.com/live/program/live/lyws/1300000/mnf.m3u8
#EXTINF:-1,东南卫视
http://keonline.shanghai.liveplay.qq.com/live/program/live/dnws/1300000/mnf.m3u8
#EXTINF:-1,重庆卫视
http://keonline.shanghai.liveplay.qq.com/live/program/live/cqws/1300000/mnf.m3u8
#EXTINF:-1,广西卫视
http://keonline.shanghai.liveplay.qq.com/live/program/live/gxws/1300000/mnf.m3u8
#EXTINF:-1,青海卫视
http://keonline.shanghai.liveplay.qq.com/live/program/live/qhws/1300000/mnf.m3u8
#EXTINF:-1,江西卫视
http://keonline.shanghai.liveplay.qq.com/live/program/live/jxws/1300000/mnf.m3u8
#EXTINF:-1,内蒙古卫视
http://keonline.shanghai.liveplay.qq.com/live/program/live/nmgws/1300000/mnf.m3u8
#EXTINF:-1,天津卫视
http://112.17.40.140/PLTV/88888888/224/3221226412/index.m3u8
#EXTINF:-1,河北卫视超清1
http://223.110.245.149/ott.js.chinamobile.com/PLTV/3/224/3221225840/index.m3u8
#EXTINF:-1,湖南卫视
http://112.17.40.140/PLTV/88888888/224/3221226553/index.m3u8
#EXTINF:-1,浙江卫视
http://223.110.243.173/PLTV/3/224/3221227215/index.m3u8
#EXTINF:-1,江苏卫视
http://112.17.40.140/PLTV/88888888/224/3221226414/index.m3u8
#EXTINF:-1,东南卫视
http://117.169.124.37:6610/ysten-businessmobile/live/dongnanstv/yst.m3u8
#EXTINF:-1,湖北卫视
http://223.110.243.171/PLTV/3/224/3221227211/index.m3u8
#EXTINF:-1,广东卫视
http://112.17.40.140/PLTV/88888888/224/3221226225/index.m3u8
#EXTINF:-1,深圳卫视
http://223.110.243.171/PLTV/3/224/3221227217/index.m3u8
#EXTINF:-1,辽宁卫视
http://223.110.245.145/ott.js.chinamobile.com/PLTV/3/224/3221227410/index.m3u8
#EXTINF:-1,龙江卫视
http://112.17.40.140/PLTV/88888888/224/3221226555/index.m3u8
#EXTINF:-1,江西卫视
http://112.17.40.140/PLTV/88888888/224/3221226557/index.m3u8
#EXTINF:-1,四川卫视
http://ott.fj.chinamobile.com/PLTV/88888888/224/3221227006/1.m3u8
#EXTINF:-1,重庆卫视
http://ott.fj.chinamobile.com/PLTV/88888888/224/3221225949/1.m3u8
#EXTINF:-1,重庆卫视
http://ivi.bupt.edu.cn/hls/cqhd.m3u8
#EXTINF:-1,河南卫视超清2
http://223.110.245.157/ott.js.chinamobile.com/PLTV/3/224/3221225815/index.m3u8
#EXTINF:-1,贵州卫视超清2
http://223.110.245.149/ott.js.chinamobile.com/PLTV/3/224/3221225787/index.m3u8
#EXTINF:-1,海南卫视
http://112.50.243.8/PLTV/88888888/224/3221225855/1.m3u8
#EXTINF:-1,云南卫视超清1
http://223.110.245.159/ott.js.chinamobile.com/PLTV/3/224/3221225838/index.m3u8
#EXTINF:-1,宁夏卫视超清1
http://223.110.245.151/ott.js.chinamobile.com/PLTV/3/224/3221225842/index.m3u8
#EXTINF:-1,内蒙卫视超清1
http://223.110.245.161/ott.js.chinamobile.com/PLTV/3/224/3221225836/index.m3u8
#EXTINF:-1,广西卫视
http://112.50.243.8/PLTV/88888888/224/3221225836/1.m3u8
#EXTINF:-1,五星体育HD
http://keonline.shanghai.liveplay.qq.com/live/program/live/ssty/1300000/mnf.m3u8
#EXTINF:-1,北京卡酷少儿 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226558/1.m3u8
#EXTINF:-1,法治天地HD
http://keonline.shanghai.liveplay.qq.com/live/program/live/fztd/1300000/mnf.m3u8
#EXTINF:-1,欢笑剧场HD
http://keonline.shanghai.liveplay.qq.com/live/program/live/hxjc/1300000/mnf.m3u8
#EXTINF:-1,都市剧场HD
http://keonline.shanghai.liveplay.qq.com/live/program/live/dsjc/1300000/mnf.m3u8
#EXTINF:-1,七彩戏剧HD
http://keonline.shanghai.liveplay.qq.com/live/program/live/qcxj/1300000/mnf.m3u8
#EXTINF:-1,动漫秀场HD
http://keonline.shanghai.liveplay.qq.com/live/program/live/dmxc/1300000/mnf.m3u8
#EXTINF:-1,劲爆体育HD
http://keonline.shanghai.liveplay.qq.com/live/program/live/jbty/1300000/mnf.m3u8
#EXTINF:-1,极速汽车
http://keonline.shanghai.liveplay.qq.com/live/program/live/jsqc/1300000/mnf.m3u8
#EXTINF:-1,游戏风云
http://keonline.shanghai.liveplay.qq.com/live/program/live/yxfy/1300000/mnf.m3u8
#EXTINF:-1,金鹰卡通
http://keonline.shanghai.liveplay.qq.com/live/program/live/jykt/1300000/mnf.m3u8
#EXTINF:-1,炫动卡通
http://keonline.shanghai.liveplay.qq.com/live/program/live/xdkt/1300000/mnf.m3u8
#EXTINF:-1,嘉佳卡通
http://keonline.shanghai.liveplay.qq.com/live/program/live/jjkt/1300000/mnf.m3u8
#EXTINF:-1,星尚
http://keonline.shanghai.liveplay.qq.com/live/program/live/shss/1300000/mnf.m3u8
#EXTINF:-1,上海纪实
http://keonline.shanghai.liveplay.qq.com/live/program/live/jspd/1300000/mnf.m3u8
#EXTINF:-1,上海新闻
http://keonline.shanghai.liveplay.qq.com/live/program/live/xwzh/1300000/mnf.m3u8
#EXTINF:-1,上海娱乐
http://keonline.shanghai.liveplay.qq.com/live/program/live/ylpd/1300000/mnf.m3u8
#EXTINF:-1,上海电视剧
http://keonline.shanghai.liveplay.qq.com/live/program/live/dsjpd/1300000/mnf.m3u8
#EXTINF:-1,上海ICS外语频道
http://keonline.shanghai.liveplay.qq.com/live/program/live/wypd/1300000/mnf.m3u8
#EXTINF:-1,上海艺术人文
http://keonline.shanghai.liveplay.qq.com/live/program/live/ysrw/1300000/mnf.m3u8
#EXTINF:-1,东方财经浦东
http://keonline.shanghai.liveplay.qq.com/live/program/live/dfcj/1300000/mnf.m3u8
#EXTINF:-1,第一财经
http://keonline.shanghai.liveplay.qq.com/live/program/live/dycj/1300000/mnf.m3u8
#EXTINF:-1,直播1-1080P
http://keonline.shanghai.liveplay.qq.com/live/program/live/hdnba1/4000000/mnf.m3u8
#EXTINF:-1,直播2-1080P
http://keonline.shanghai.liveplay.qq.com/live/program/live/hdnba2/4000000/mnf.m3u8
#EXTINF:-1,直播3-1080P
http://keonline.shanghai.liveplay.qq.com/live/program/live/hdnba3/4000000/mnf.m3u8
#EXTINF:-1,直播4-1080P
http://keonline.shanghai.liveplay.qq.com/live/program/live/hdnba4/4000000/mnf.m3u8
#EXTINF:-1,直播5-1080P
http://keonline.shanghai.liveplay.qq.com/live/program/live/hdnba5/4000000/mnf.m3u8
#EXTINF:-1,直播6-1080P
http://keonline.shanghai.liveplay.qq.com/live/program/live/hdnba6/4000000/mnf.m3u8
#EXTINF:-1,直播7-1080P
http://keonline.shanghai.liveplay.qq.com/live/program/live/hdnba7/4000000/mnf.m3u8
#EXTINF:-1,纯享4K源码1
http://112.50.243.8/PLTV/88888888/224/3221226825/1.m3u8
#EXTINF:-1,百事4K频道
http://112.17.40.145/PLTV/88888888/224/3221226718/index.m3u8
#EXTINF:-1,凤凰资讯
http://112.17.40.140/PLTV/88888888/224/3221226491/index.m3u8
#EXTINF:-1,凤凰资讯
http://117.169.124.37:6610/ysten-businessmobile/live/fhzixun/1.m3u8
#EXTINF:-1,凤凰中文
http://117.169.124.37:6610/ysten-businessmobile/live/fhchinese/1.m3u8
#EXTINF:-1,凤凰中文
http://117.169.120.138:8080/live/fhchinese/index.m3u8
#EXTINF:-1,高清影视1台
http://112.50.243.8/PLTV/88888888/224/3221226736/1.m3u8
#EXTINF:-1,高清影视2台
http://112.50.243.8/PLTV/88888888/224/3221225881/1.m3u8
#EXTINF:-1,高清影视3台
http://112.50.243.8/PLTV/88888888/224/3221226708/1.m3u8
#EXTINF:-1,高清影视4台
http://112.50.243.8/PLTV/88888888/224/3221226712/1.m3u8
#EXTINF:-1,高清影视5台
http://112.50.243.8/PLTV/88888888/224/3221225893/1.m3u8
#EXTINF:-1,高清影视6台
http://112.50.243.8/PLTV/88888888/224/3221226692/1.m3u8
#EXTINF:-1,高清影视7台
http://112.50.243.8/PLTV/88888888/224/3221226754/1.m3u8
#EXTINF:-1,高清影视8台
http://112.17.40.145/PLTV/88888888/224/3221226608/index.m3u8
#EXTINF:-1,高清影视9台
http://112.17.40.145/PLTV/88888888/224/3221226606/index.m3u8
#EXTINF:-1,高清影视10台
http://112.17.40.145/PLTV/88888888/224/3221226360/index.m3u8
#EXTINF:-1,高清动画11台
http://112.50.243.8/PLTV/88888888/224/3221226732/1.m3u8
#EXTINF:-1,高清动画12台
http://112.50.243.8/PLTV/88888888/224/3221226741/1.m3u8
#EXTINF:-1,高清动漫13台
http://112.50.243.8/PLTV/88888888/224/3221226743/1.m3u8
#EXTINF:-1,高清影视14台
http://ivi.bupt.edu.cn/hls/chchd.m3u8
#EXTINF:-1,北京纪实高清
http://112.50.243.8/PLTV/88888888/224/3221225944/1.m3u8
#EXTINF:-1,峨眉电影高清
http://scgctvshow.sctv.com/hdlive/emei/1.m3u8
#EXTINF:-1,欢笑剧场高清
http://112.50.243.8/PLTV/88888888/224/3221226729/1.m3u8
#EXTINF:-1,纪实频道高清
http://112.50.243.8/PLTV/88888888/224/3221225946/1.m3u8
#EXTINF:-1,极速汽车高清
http://112.50.243.8/PLTV/88888888/224/3221226140/1.m3u8
#EXTINF:-1,动漫秀场高清
http://112.50.243.8/PLTV/88888888/224/3221226141/1.m3u8
#EXTINF:-1,求索纪录
http://112.17.40.145/PLTV/88888888/224/3221226610/index.m3u8
#EXTINF:-1,求索科学
http://125.210.152.18:9090/live/QSKX_1200.m3u8
#EXTINF:-1,求索动物
http://125.210.152.18:9090/live/QSDW_1200.m3u8
#EXTINF:-1,求索生活
http://125.210.152.18:9090/live/QSSH_1200.m3u8
#EXTINF:-1,日本天気预报
http://movie.mcas.jp/mcas/wn1_2/master.m3u8
#EXTINF:-1,奥林匹克高清
http://ott-live.olympicchannel.com/out/u/OC1_2.m3u8?fluxustv.m3u8
#EXTINF:-1,奥铃匹克高清
http://ott-live.olympicchannel.com/out/u/OC1_1.m3u8?fluxustv.m3u8
#EXTINF:-1,爱青春
http://112.17.40.140/hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221230130/index.m3u8
#EXTINF:-1,爱家庭
http://112.17.40.140/hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221230118/index.m3u8
#EXTINF:-1,爱探索
http://112.17.40.140/hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221230112/index.m3u8
#EXTINF:-1,爱科学
http://112.17.40.140/hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221230106/index.m3u8
#EXTINF:-1,爱猎奇
http://112.17.40.140/hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221230097/index.m3u8
#EXTINF:-1,爱谍战
http://112.17.40.140/hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221230092/index.m3u8
#EXTINF:-1,爱娱乐
http://112.17.40.140/hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221230077/index.m3u8
#EXTINF:-1,爱旅行
http://112.17.40.140/hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221230052/index.m3u8
#EXTINF:-1,爱怀旧
http://112.17.40.140/hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221230049/index.m3u8
#EXTINF:-1,爱体育
http://112.17.40.140/hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221230034/index.m3u8
#EXTINF:-1,爱赛车
http://112.17.40.140/hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221230032/index.m3u8
#EXTINF:-1,北京少儿
http://ivi.bupt.edu.cn/hls/btv10.m3u8
#EXTINF:-1,动漫电影
http://112.17.40.140/PLTV/88888888/224/3221226178/index.m3u8
#EXTINF:-1,重庆少儿
http://219.153.252.50/PLTV/88888888/224/3221225646/1.m3u8
#EXTINF:-1,嘉佳卡通
http://112.17.40.140/PLTV/88888888/224/3221226461/index.m3u8
#EXTINF:-1,耀才财经
http://202.69.67.66:443/webcast/bshdlive-mobile/playlist.m3u8
#EXTINF:-1,亚旅卫视
http://hls.jingchangkan.tv/jingchangkan/156722438_0HaM/index.m3u8
#EXTINF:-1,信吉电视
http://220.130.241.203:1935/sjtv/livestream_360p/playlist.m3u8
#EXTINF:-1,唯心電視
http://mobile.ccdntech.com/transcoder/_definst_/vod164_Live/live/chunklist_w1177047531.m3u8
#EXTINF:-1,百事通台
http://112.17.40.145/PLTV/88888888/224/3221226596/index.m3u8
#EXTINF:-1,HBO2台
http://161.0.157.5/PLTV/88888888/224/3221227026/03.m3u8fluxustv.m3u8
#EXTINF:-1,点掌财经
http://cclive2.aniu.tv/live/anzb.m3u8
#EXTINF:-1,日本NHK华语
https://nhkw-zh-hlscomp.akamaized.net/ixxemlzk1vqvy44o/playlist.m3u8
#EXTINF:-1,日本NHK英语
https://nhkwlive-ojp.akamaized.net/hls/live/2003459/nhkwlive-ojp/index_1M.m3u8
#EXTINF:-1,日本Japan News 24
http://www.news24.jp/livestream/index.m3u8
#EXTINF:-1,日本JapanetChannelDX
http://bcsecurelivehls-i.akamaihd.net/hls/live/265320/5043843989001/140130JTDX/index_1200.m3u8
#EXTINF:-1,日本QVC
http://cdn-live1.qvc.jp/iPhone/800/800.m3u8
#EXTINF:-1,韩国EBS 第一频道
http://ebsonairios.ebs.co.kr/groundwavetablet500k/tablet500k/playlist.m3u8
#EXTINF:-1,韩国EBS 少儿频道
http://ebsonairios.ebs.co.kr/ebsutablet500k/tablet500k/playlist.m3u8
#EXTINF:-1,韩国KCTV
http://119.77.96.184:1935/chn21/chn21/chunklist_w252131137.m3u8
#EXTINF:-1,朝鲜中央台
http://119.77.96.184:1935/chn05/chn05/chunklist_w644291506.m3u8
#EXTINF:-1,韩国KTV 韩国电视
http://218.38.152.31:1935/klive/klive.stream/playlist.m3u8
#EXTINF:-1,韩国EBS 儿童频道
http://ebsonairios.ebs.co.kr/ebsutablet500k/_definst_/tablet500k/chunklist_w1965791004.m3u8
#EXTINF:-1,韩国阿里郎WORLDworld
http://amdlive.ctnd.com.edgesuite.net/arirang_1ch/smil:arirang_1ch.smil/playlist.m3u8
#EXTINF:-1,韩国阿里郎WORLD
http://amdlive.ctnd.com.edgesuite.net/arirang_1ch/smil:arirang_1ch/master.m3u8
#EXTINF:-1,KOREA YTN Science
http://slive.sciencetv.kr:1935/science/yslive_20140419_1/playlist.m3u8
#EXTINF:-1,Luxury World
http://nano.teleservice.su:8080/hls/luxury.m3u8
#EXTINF:-1,韩国BBS佛教广播
http://bbstv.clouducs.com:1935/bbstv-live/livestream/chunklist_w1403706733.m3u8
#EXTINF:-1,CPAC
http://bcoveliveios-i.akamaihd.net/hls/live/248519/1242843915001_1/master.m3u8
#EXTINF:-1,中国环球
http://live.cgtn.com/1000/prog_index.m3u8
#EXTINF:-1,狗狗宠物
http://video.blivenyc.com/broadcast/prod/2061/22/file-3192k.m3u8
#EXTINF:-1,法国时尚
http://lb.streaming.sk/fashiontv/stream/chunklist_w1702070444.m3u8
#EXTINF:-1,亚洲新闻
http://d2e1asnsl7br7b.cloudfront.net/7782e205e72f43aeb4a48ec97f66ebbe/index_4.m3u8
#EXTINF:-1,越南人民报
http://vietcago.net/vstv/thnd.m3u8
#EXTINF:-1,印度音乐电视
http://104.237.60.234/live/gabruutv.m3u8?dsjtv.m3u8
#EXTINF:-1,法国第五世界台
http://v3plusinfo247hls-i.akamaihd.net/hls/live/218877-b/v3plusinfo247hls/v3plusinfo247hls_1_1.m3u8
#EXTINF:-1,俄罗斯HD时尚频道
http://95.67.47.115/hls/hdfashion_ua_hi/index.m3u8
#EXTINF:-1,乌克兰M2 音乐频道
http://live.m2.tv/hls3/stream.m3u8
#EXTINF:-1,西班牙中国环球
http://livees.cgtn.com/1000e/prog_index.m3u8
#EXTINF:-1,意大利意大利电台
http://radioitaliatv-lh.akamaihd.net/i/radioitaliatv_1@329645/index_720x480_av-p.m3u8
#EXTINF:-1,意大利V2 音乐频道
http://de1se01.v2beat.live/playlist.m3u8
#EXTINF:-1,墨西哥墨西哥电视
http://bcoveliveios-i.akamaihd.net/hls/live/201661/57828478001/milenio_center_512k@51752.m3u8
#EXTINF:-1,音乐20TV
http://m2otv-lh.akamaihd.net/i/m2oTv_1@186074/index_600_av-p.m3u8
#EXTINF:-1,当红MTV
http://unilivemtveu-lh.akamaihd.net/i/mtvno_1@346424/index_3500_av-b.m3u8
#EXTINF:-1,酷酷频道
http://edge1.tikilive.com:1935/unrestricted_tikilive/25947/amlst:NWKlw6jwyXpz/chunklist_w981409619_b1105254.m3u8?fluxustv.m3u8
#EXTINF:-1,红牛电视
http://rbmn-live.akamaized.net/hls/live/590964/BoRB-AT/master_1660.m3u8
#EXTINF:-1,NBC电视
http://161.0.157.51/PLTV/88888888/224/3221227040/index.m3u8?fluxustv.m3u8
#EXTINF:-1,Jewelry电视
http://wowzaprod134-i.akamaihd.net/hls/live/577814/ccddaf02/playlist.m3u8
#EXTINF:-1,Darcizzle电视
http://30a-tv.com/darcizzle.m3u8
#EXTINF:-1,CBS新闻
http://cbsnewshd-lh.akamaihd.net/i/CBSNHD_7@199302/master.m3u8
#EXTINF:-1,美国Deutsche Welle
http://dwstream4-lh.akamaihd.net/i/dwstream4_live@131329/master.m3u8
#EXTINF:-1,美国360 North
http://wowzaprod3-i.akamaihd.net/hls/live/252236/2147483647_360north_247/playlist.m3u8
#EXTINF:-1,美国Fox News Talk Radio
http://fnurtmp-f.akamaihd.net/i/FNRADIO_1@92141/master.m3u8
#EXTINF:-1,日本cgntv
http://cgntv-glive.ofsdelivery.net/live/_definst_/cgntv_jp/playlist.m3u8
#EXTINF:-1,日本Japanet Channel DX
http://bcsecurelivehls-i.akamaihd.net/hls/live/265320/5043843989001/140130JTDX/index_600.m3u8

View File

@@ -1,723 +0,0 @@
#EXTM3U
#EXTINF:-1 ,====== =北京移动= ======
http://0/0.m3u8
#EXTINF:-1 ,咪咕4K
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226399/1.m3u8
#EXTINF:-1 ,咪咕4K
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226400/1.m3u8
#EXTINF:-1 ,北京IPTV4K超清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226550/1.m3u8
#EXTINF:-1 ,北京IPTV淘BABY CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226554/1.m3u8
#EXTINF:-1 ,北京IPTV淘剧场 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226553/1.m3u8
#EXTINF:-1 ,北京IPTV淘娱乐 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226551/1.m3u8
#EXTINF:-1 ,北京IPTV淘电影 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226552/1.m3u8
#EXTINF:-1 ,北京IPTV萌宠TV CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226555/1.m3u8
#EXTINF:-1 ,老伙计-laoguy.com
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226555/1.m3u8
#EXTINF:-1 ,大健康 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226556/1.m3u8
#EXTINF:-1 ,凤凰中文 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225942/1.m3u8
#EXTINF:-1 ,凤凰中文 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225948/1.m3u8
#EXTINF:-1 ,凤凰资讯 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225949/1.m3u8
#EXTINF:-1 ,CCTV1 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225924/1.m3u8
#EXTINF:-1 ,CCTV1 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226154/1.m3u8
#EXTINF:-1 ,CCTV1 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226155/1.m3u8
#EXTINF:-1 ,CCTV1 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226226/1.m3u8
#EXTINF:-1 ,CCTV1 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226346/1.m3u8
#EXTINF:-1 ,CCTV1 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226431/1.m3u8
#EXTINF:-1 ,CCTV2 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226230/1.m3u8
#EXTINF:-1 ,CCTV2 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226371/1.m3u8
#EXTINF:-1 ,CCTV2 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226472/1.m3u8
#EXTINF:-1 ,CCTV3 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226471/1.m3u8
#EXTINF:-1 ,CCTV4 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226314/1.m3u8
#EXTINF:-1 ,CCTV4 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226335/1.m3u8
#EXTINF:-1 ,CCTV4 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226470/1.m3u8
#EXTINF:-1 ,CCTV5 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226469/1.m3u8
#EXTINF:-1 ,CCTV5+ HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226225/1.m3u8
#EXTINF:-1 ,CCTV5+ CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226349/1.m3u8
#EXTINF:-1 ,CCTV5+ CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226458/1.m3u8
#EXTINF:-1 ,CCTV6 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226468/1.m3u8
#EXTINF:-1 ,CCTV7 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226234/1.m3u8
#EXTINF:-1 ,CCTV7 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226467/1.m3u8
#EXTINF:-1 ,CCTV8 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226485/1.m3u8
#EXTINF:-1 ,CCTV9 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226236/1.m3u8
#EXTINF:-1 ,CCTV9 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226465/1.m3u8
#EXTINF:-1 ,CCTV10 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226227/1.m3u8
#EXTINF:-1 ,CCTV10 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226464/1.m3u8
#EXTINF:-1 ,CCTV11 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226334/1.m3u8
#EXTINF:-1 ,CCTV11 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226315/1.m3u8
#EXTINF:-1 ,CCTV11 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226463/1.m3u8
#EXTINF:-1 ,CCTV12 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226228/1.m3u8
#EXTINF:-1 ,CCTV12 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226462/1.m3u8
#EXTINF:-1 ,CCTV13 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226316/1.m3u8
#EXTINF:-1 ,CCTV14 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226229/1.m3u8
#EXTINF:-1 ,CCTV14 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226461/1.m3u8
#EXTINF:-1 ,CCTV15 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226460/1.m3u8
#EXTINF:-1 ,CCTV15 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226317/1.m3u8
#EXTINF:-1 ,CCTV15 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226333/1.m3u8
#EXTINF:-1 ,CCTV17 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226318/1.m3u8
#EXTINF:-1 ,CCTV17 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226459/1.m3u8
#EXTINF:-1 ,中国教育1 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226494/1.m3u8
#EXTINF:-1 ,东南卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226406/1.m3u8
#EXTINF:-1 ,东南卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226496/1.m3u8
#EXTINF:-1 ,东方卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226237/1.m3u8
#EXTINF:-1 ,东方卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226364/1.m3u8
#EXTINF:-1 ,东方卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226505/1.m3u8
#EXTINF:-1 ,北京卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226224/1.m3u8
#EXTINF:-1 ,北京卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226367/1.m3u8
#EXTINF:-1 ,北京卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226441/1.m3u8
#EXTINF:-1 ,天津卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226246/1.m3u8
#EXTINF:-1 ,天津卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226502/1.m3u8
#EXTINF:-1 ,安徽卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226223/1.m3u8
#EXTINF:-1 ,安徽卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226499/1.m3u8
#EXTINF:-1 ,山东卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225894/1.m3u8
#EXTINF:-1 ,山东卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226244/1.m3u8
#EXTINF:-1 ,山东卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226308/1.m3u8
#EXTINF:-1 ,山东卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226501/1.m3u8
#EXTINF:-1 ,广东卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225878/1.m3u8
#EXTINF:-1 ,广东卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226238/1.m3u8
#EXTINF:-1 ,广东卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226508/1.m3u8
#EXTINF:-1 ,江苏卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226242/1.m3u8
#EXTINF:-1 ,江苏卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226366/1.m3u8
#EXTINF:-1 ,江苏卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226506/1.m3u8
#EXTINF:-1 ,江西卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226243/1.m3u8
#EXTINF:-1 ,河北卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226507/1.m3u8
#EXTINF:-1 ,浙江卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226247/1.m3u8
#EXTINF:-1 ,浙江卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226365/1.m3u8
#EXTINF:-1 ,浙江卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226504/1.m3u8
#EXTINF:-1 ,深圳卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225897/1.m3u8
#EXTINF:-1 ,深圳卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226245/1.m3u8
#EXTINF:-1 ,深圳卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226495/1.m3u8
#EXTINF:-1 ,湖北卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226240/1.m3u8
#EXTINF:-1 ,湖北卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226310/1.m3u8
#EXTINF:-1 ,湖北卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226503/1.m3u8
#EXTINF:-1 ,湖南卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226241/1.m3u8
#EXTINF:-1 ,湖南卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226509/1.m3u8
#EXTINF:-1 ,贵州卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226497/1.m3u8
#EXTINF:-1 ,辽宁卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226500/1.m3u8
#EXTINF:-1 ,黑龙江卫视 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226239/1.m3u8
#EXTINF:-1 ,黑龙江卫视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226498/1.m3u8
#EXTINF:-1 ,北京冬奥纪实 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226438/1.m3u8
#EXTINF:-1 ,北京影视 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226486/1.m3u8
#EXTINF:-1 ,北京文艺 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226440/1.m3u8
#EXTINF:-1 ,北京新闻 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226437/1.m3u8
#EXTINF:-1 ,北京卡酷少儿 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226558/1.m3u8
#EXTINF:-1 ,湖南快乐垂钓 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226549/1.m3u8
#EXTINF:-1 ,湖南茶频道 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226548/1.m3u8
#EXTINF:-1 ,黑莓动画 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225914/1.m3u8
#EXTINF:-1 ,黑莓动画 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226289/1.m3u8
#EXTINF:-1 ,黑莓电影 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225927/1.m3u8
#EXTINF:-1 ,黑莓电影 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226292/1.m3u8
#EXTINF:-1 ,黑莓电竞 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225931/1.m3u8
#EXTINF:-1 ,黑莓电竞 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226250/1.m3u8
#EXTINF:-1 ,黑莓电竞 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226262/1.m3u8
#EXTINF:-1 ,黑莓电竞 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226307/1.m3u8
#EXTINF:-1 ,NewTV中国功夫 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225951/1.m3u8
#EXTINF:-1 ,NewTV中国功夫 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226298/1.m3u8
#EXTINF:-1 ,NewTV中国功夫 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226321/1.m3u8
#EXTINF:-1 ,NewTV怡伴健康 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225919/1.m3u8
#EXTINF:-1 ,NewTV怡伴健康 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226306/1.m3u8
#EXTINF:-1 ,NewTV怡伴健康 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226327/1.m3u8
#EXTINF:-1 ,NewTV军事评论 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225926/1.m3u8
#EXTINF:-1 ,NewTV军事评论 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226303/1.m3u8
#EXTINF:-1 ,NewTV军事评论 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226326/1.m3u8
#EXTINF:-1 ,NewTV军旅剧场 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225923/1.m3u8
#EXTINF:-1 ,NewTV军旅剧场 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226301/1.m3u8
#EXTINF:-1 ,NewTV军旅剧场 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226324/1.m3u8
#EXTINF:-1 ,NewTV农业致富 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225930/1.m3u8
#EXTINF:-1 ,NewTV农业致富 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226304/1.m3u8
#EXTINF:-1 ,NewTV动作电影 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225915/1.m3u8
#EXTINF:-1 ,NewTV动作电影 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226288/1.m3u8
#EXTINF:-1 ,NewTV动作电影 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226329/1.m3u8
#EXTINF:-1 ,NewTV古装剧场 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225916/1.m3u8
#EXTINF:-1 ,NewTV古装剧场 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226300/1.m3u8
#EXTINF:-1 ,NewTV古装剧场 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226323/1.m3u8
#EXTINF:-1 ,NewTV家庭剧场 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225918/1.m3u8
#EXTINF:-1 ,NewTV家庭剧场 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226290/1.m3u8
#EXTINF:-1 ,NewTV家庭剧场 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226330/1.m3u8
#EXTINF:-1 ,NewTV惊悚悬疑 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225921/1.m3u8
#EXTINF:-1 ,NewTV惊悚悬疑 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226294/1.m3u8
#EXTINF:-1 ,NewTV惊悚悬疑 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226423/1.m3u8
#EXTINF:-1 ,NewTV明星大片 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225929/1.m3u8
#EXTINF:-1 ,NewTV明星大片 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226295/1.m3u8
#EXTINF:-1 ,NewTV明星大片 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226425/1.m3u8
#EXTINF:-1 ,NewTV武搏世界 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226171/1.m3u8
#EXTINF:-1 ,NewTV武搏世界 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226297/1.m3u8
#EXTINF:-1 ,NewTV武搏世界 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226320/1.m3u8
#EXTINF:-1 ,NewTV海外剧场 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225917/1.m3u8
#EXTINF:-1 ,NewTV海外剧场 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226302/1.m3u8
#EXTINF:-1 ,NewTV海外剧场 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226325/1.m3u8
#EXTINF:-1 ,NewTV潮妈辣婆 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225957/1.m3u8
#EXTINF:-1 ,NewTV潮妈辣婆 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226286/1.m3u8
#EXTINF:-1 ,NewTV炫舞未来 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226248/1.m3u8
#EXTINF:-1 ,NewTV爱情喜剧 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225913/1.m3u8
#EXTINF:-1 ,NewTV爱情喜剧 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226299/1.m3u8
#EXTINF:-1 ,NewTV爱情喜剧 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226322/1.m3u8
#EXTINF:-1 ,NewTV精品体育 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226287/1.m3u8
#EXTINF:-1 ,NewTV精品体育 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226328/1.m3u8
#EXTINF:-1 ,NewTV精品体育 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225922/1.m3u8
#EXTINF:-1 ,NewTV精品大剧 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225925/1.m3u8
#EXTINF:-1 ,NewTV精品大剧 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226291/1.m3u8
#EXTINF:-1 ,NewTV精品大剧 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226331/1.m3u8
#EXTINF:-1 ,NewTV精品纪录 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226293/1.m3u8
#EXTINF:-1 ,NewTV精品纪录 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226332/1.m3u8
#EXTINF:-1 ,NewTV超级体育 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226157/1.m3u8
#EXTINF:-1 ,NewTV超级体育 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226158/1.m3u8
#EXTINF:-1 ,NewTV超级体育 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226232/1.m3u8
#EXTINF:-1 ,NewTV超级体育 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226348/1.m3u8
#EXTINF:-1 ,NewTV超级电影 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226133/1.m3u8
#EXTINF:-1 ,NewTV超级电影 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226233/1.m3u8
#EXTINF:-1 ,NewTV超级电影 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226369/1.m3u8
#EXTINF:-1 ,NewTV超级电视剧 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225864/1.m3u8
#EXTINF:-1 ,NewTV超级电视剧 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226253/1.m3u8
#EXTINF:-1 ,NewTV超级电视剧 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226368/1.m3u8
#EXTINF:-1 ,NewTV超级综艺 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226127/1.m3u8
#EXTINF:-1 ,NewTV超级综艺 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226231/1.m3u8
#EXTINF:-1 ,NewTV超级综艺 CQ
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226370/1.m3u8
#EXTINF:-1 ,NewTV金牌综艺 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225920/1.m3u8
#EXTINF:-1 ,NewTV金牌综艺 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226296/1.m3u8
#EXTINF:-1 ,NewTV金牌综艺 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226347/1.m3u8
#EXTINF:-1 ,咪咕视频 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226374/1.m3u8
#EXTINF:-1 ,咪咕视频 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226375/1.m3u8
#EXTINF:-1 ,咪咕视频 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226377/1.m3u8
#EXTINF:-1 ,咪咕视频 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226378/1.m3u8
#EXTINF:-1 ,咪咕视频 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226379/1.m3u8
#EXTINF:-1 ,咪咕视频 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226380/1.m3u8
#EXTINF:-1 ,咪咕视频 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226381/1.m3u8
#EXTINF:-1 ,咪咕视频 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226382/1.m3u8
#EXTINF:-1 ,咪咕视频 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226394/1.m3u8
#EXTINF:-1 ,咪咕视频 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226395/1.m3u8
#EXTINF:-1 ,咪咕视频 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226396/1.m3u8
#EXTINF:-1 ,咪咕视频 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226397/1.m3u8
#EXTINF:-1 ,咪咕视频 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226398/1.m3u8
#EXTINF:-1 ,咪咕视频 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226393/1.m3u8
#EXTINF:-1 ,咪咕视频 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226392/1.m3u8
#EXTINF:-1 ,咪咕视频 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226391/1.m3u8
#EXTINF:-1 ,咪咕视频 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226390/1.m3u8
#EXTINF:-1 ,咪咕视频 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226372/1.m3u8
#EXTINF:-1 ,咪咕视频 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226373/1.m3u8
#EXTINF:-1 ,咪咕视频 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226376/1.m3u8
#EXTINF:-1 ,咪咕视频 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226383/1.m3u8
#EXTINF:-1 ,咪咕视频 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226384/1.m3u8
#EXTINF:-1 ,北京家有购物 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226429/1.m3u8
#EXTINF:-1 ,山西优购物 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226386/1.m3u8
#EXTINF:-1 ,中视购物 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226547/1.m3u8
#EXTINF:-1 ,央广购物 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226319/1.m3u8
#EXTINF:-1 ,央广购物 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226363/1.m3u8
#EXTINF:-1 ,江苏好享购物 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226312/1.m3u8
#EXTINF:-1 ,江苏好享购物 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226344/1.m3u8
#EXTINF:-1 ,湖南快乐购 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226341/1.m3u8
#EXTINF:-1 ,江西风尚购物 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225911/1.m3u8
#EXTINF:-1 ,江西风尚购物 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226305/1.m3u8
#EXTINF:-1 ,江西风尚购物 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226342/1.m3u8
#EXTINF:-1 ,江苏好享购物 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226313/1.m3u8
#EXTINF:-1 ,5GO美妆个护 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226387/1.m3u8
#EXTINF:-1 ,5GO美妆个护 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226389/1.m3u8
#EXTINF:-1 ,5GO服饰内衣 HD
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226388/1.m3u8
#EXTINF:-1 ,CCTV1 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226432/1.m3u8
#EXTINF:-1 ,CCTV1 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226338/1.m3u8
#EXTINF:-1 ,CCTV2 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225934/1.m3u8
#EXTINF:-1 ,CCTV2 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226457/1.m3u8
#EXTINF:-1 ,CCTV3 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226456/1.m3u8
#EXTINF:-1 ,CCTV4 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226156/1.m3u8
#EXTINF:-1 ,CCTV4 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226455/1.m3u8
#EXTINF:-1 ,CCTV5 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226454/1.m3u8
#EXTINF:-1 ,CCTV5 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226256/1.m3u8
#EXTINF:-1 ,CCTV5 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226257/1.m3u8
#EXTINF:-1 ,CCTV5 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226258/1.m3u8
#EXTINF:-1 ,CCTV5 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226259/1.m3u8
#EXTINF:-1 ,CCTV5 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226260/1.m3u8
#EXTINF:-1 ,CCTV5 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226261/1.m3u8
#EXTINF:-1 ,CCTV5 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226340/1.m3u8
#EXTINF:-1 ,CCTV5+ 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225938/1.m3u8
#EXTINF:-1 ,CCTV6 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226453/1.m3u8
#EXTINF:-1 ,CCTV7 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225863/1.m3u8
#EXTINF:-1 ,CCTV7 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226452/1.m3u8
#EXTINF:-1 ,CCTV8 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226451/1.m3u8
#EXTINF:-1 ,CCTV9 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226450/1.m3u8
#EXTINF:-1 ,CCTV9 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225865/1.m3u8
#EXTINF:-1 ,CCTV10 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225868/1.m3u8
#EXTINF:-1 ,CCTV10 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226449/1.m3u8
#EXTINF:-1 ,CCTV11 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225869/1.m3u8
#EXTINF:-1 ,CCTV11 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226448/1.m3u8
#EXTINF:-1 ,CCTV12 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225870/1.m3u8
#EXTINF:-1 ,CCTV12 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226447/1.m3u8
#EXTINF:-1 ,CCTV13 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226446/1.m3u8
#EXTINF:-1 ,CCTV13 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226159/1.m3u8
#EXTINF:-1 ,CCTV13 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226339/1.m3u8
#EXTINF:-1 ,CCTV14 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225872/1.m3u8
#EXTINF:-1 ,CCTV14 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226445/1.m3u8
#EXTINF:-1 ,CCTV14 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225928/1.m3u8
#EXTINF:-1 ,CCTV15 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225940/1.m3u8
#EXTINF:-1 ,CCTV15 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226444/1.m3u8
#EXTINF:-1 ,CCTV17 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226442/1.m3u8
#EXTINF:-1 ,CGTN 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226404/1.m3u8
#EXTINF:-1 ,CGTN 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225867/1.m3u8
#EXTINF:-1 ,CGTN 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226443/1.m3u8
#EXTINF:-1 ,CGTN纪录 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226403/1.m3u8
#EXTINF:-1 ,CGTN纪录 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225866/1.m3u8
#EXTINF:-1 ,中国教育1 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226417/1.m3u8
#EXTINF:-1 ,中国教育1 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226538/1.m3u8
#EXTINF:-1 ,中国教育1 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225905/1.m3u8
#EXTINF:-1 ,中国教育2 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226537/1.m3u8
#EXTINF:-1 ,中国教育4 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226362/1.m3u8
#EXTINF:-1 ,中国教育4 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226557/1.m3u8
#EXTINF:-1 ,东南卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226517/1.m3u8
#EXTINF:-1 ,东南卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225876/1.m3u8
#EXTINF:-1 ,东方卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226519/1.m3u8
#EXTINF:-1 ,东方卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226161/1.m3u8
#EXTINF:-1 ,云南卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226424/1.m3u8
#EXTINF:-1 ,云南卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225902/1.m3u8
#EXTINF:-1 ,云南卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226543/1.m3u8
#EXTINF:-1 ,内蒙古卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226415/1.m3u8
#EXTINF:-1 ,内蒙古卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226530/1.m3u8
#EXTINF:-1 ,内蒙古卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225891/1.m3u8
#EXTINF:-1 ,北京卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226436/1.m3u8
#EXTINF:-1 ,北京卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226160/1.m3u8
#EXTINF:-1 ,厦门卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226542/1.m3u8
#EXTINF:-1 ,吉林卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226426/1.m3u8
#EXTINF:-1 ,吉林卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226533/1.m3u8
#EXTINF:-1 ,吉林卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225886/1.m3u8
#EXTINF:-1 ,四川卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226407/1.m3u8
#EXTINF:-1 ,四川卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225898/1.m3u8
#EXTINF:-1 ,四川卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226523/1.m3u8
#EXTINF:-1 ,天津卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226489/1.m3u8
#EXTINF:-1 ,天津卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225899/1.m3u8
#EXTINF:-1 ,宁夏卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226413/1.m3u8
#EXTINF:-1 ,宁夏卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226528/1.m3u8
#EXTINF:-1 ,宁夏卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225892/1.m3u8
#EXTINF:-1 ,安徽卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225873/1.m3u8
#EXTINF:-1 ,安徽卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226490/1.m3u8
#EXTINF:-1 ,山东卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226487/1.m3u8
#EXTINF:-1 ,山西卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226410/1.m3u8
#EXTINF:-1 ,山西卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225895/1.m3u8
#EXTINF:-1 ,山西卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226531/1.m3u8
#EXTINF:-1 ,广东卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226535/1.m3u8
#EXTINF:-1 ,广西卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226408/1.m3u8
#EXTINF:-1 ,广西卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225879/1.m3u8
#EXTINF:-1 ,广西卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226534/1.m3u8
#EXTINF:-1 ,新疆卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226422/1.m3u8
#EXTINF:-1 ,新疆卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225901/1.m3u8
#EXTINF:-1 ,新疆卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226546/1.m3u8
#EXTINF:-1 ,江苏卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226491/1.m3u8
#EXTINF:-1 ,江苏卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225887/1.m3u8
#EXTINF:-1 ,江西卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226522/1.m3u8
#EXTINF:-1 ,江西卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225888/1.m3u8
#EXTINF:-1 ,河北卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226409/1.m3u8
#EXTINF:-1 ,河北卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225881/1.m3u8
#EXTINF:-1 ,河北卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226536/1.m3u8
#EXTINF:-1 ,河南卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225882/1.m3u8
#EXTINF:-1 ,河南卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226525/1.m3u8
#EXTINF:-1 ,浙江卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226492/1.m3u8
#EXTINF:-1 ,浙江卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225903/1.m3u8
#EXTINF:-1 ,海南卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226427/1.m3u8
#EXTINF:-1 ,海南卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225890/1.m3u8
#EXTINF:-1 ,湖北卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226520/1.m3u8
#EXTINF:-1 ,湖北卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225884/1.m3u8
#EXTINF:-1 ,湖南卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226493/1.m3u8
#EXTINF:-1 ,湖南卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226162/1.m3u8
#EXTINF:-1 ,甘肃卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226414/1.m3u8
#EXTINF:-1 ,甘肃卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225877/1.m3u8
#EXTINF:-1 ,甘肃卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226545/1.m3u8
#EXTINF:-1 ,西藏卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226428/1.m3u8
#EXTINF:-1 ,西藏卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225900/1.m3u8
#EXTINF:-1 ,西藏卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226527/1.m3u8
#EXTINF:-1 ,贵州卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226405/1.m3u8
#EXTINF:-1 ,贵州卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225880/1.m3u8
#EXTINF:-1 ,贵州卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226521/1.m3u8
#EXTINF:-1 ,辽宁卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226488/1.m3u8
#EXTINF:-1 ,辽宁卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226336/1.m3u8
#EXTINF:-1 ,辽宁卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225889/1.m3u8
#EXTINF:-1 ,重庆卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225904/1.m3u8
#EXTINF:-1 ,重庆卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226337/1.m3u8
#EXTINF:-1 ,重庆卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226518/1.m3u8
#EXTINF:-1 ,陕西卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226411/1.m3u8
#EXTINF:-1 ,陕西卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225896/1.m3u8
#EXTINF:-1 ,陕西卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226532/1.m3u8
#EXTINF:-1 ,青海卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226412/1.m3u8
#EXTINF:-1 ,青海卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225893/1.m3u8
#EXTINF:-1 ,青海卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226529/1.m3u8
#EXTINF:-1 ,黑龙江卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226524/1.m3u8
#EXTINF:-1 ,黑龙江卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225883/1.m3u8
#EXTINF:-1 ,山东教育卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226419/1.m3u8
#EXTINF:-1 ,山东教育卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225908/1.m3u8
#EXTINF:-1 ,山东教育卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226526/1.m3u8
#EXTINF:-1 ,广东南方卫视地面 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226540/1.m3u8
#EXTINF:-1 ,新疆兵团卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226541/1.m3u8
#EXTINF:-1 ,海南三沙卫视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226544/1.m3u8
#EXTINF:-1 ,北京卡酷少儿 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225907/1.m3u8
#EXTINF:-1 ,北京卡酷少儿 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226511/1.m3u8
#EXTINF:-1 ,北京国际 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226510/1.m3u8
#EXTINF:-1 ,北京影视 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226433/1.m3u8
#EXTINF:-1 ,北京文艺 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226435/1.m3u8
#EXTINF:-1 ,北京新闻 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226512/1.m3u8
#EXTINF:-1 ,北京生活 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226514/1.m3u8
#EXTINF:-1 ,北京科教 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226434/1.m3u8
#EXTINF:-1 ,北京财经 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226516/1.m3u8
#EXTINF:-1 ,北京青年 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226513/1.m3u8
#EXTINF:-1 ,上海哈哈炫动 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226421/1.m3u8
#EXTINF:-1 ,上海哈哈炫动 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225909/1.m3u8
#EXTINF:-1 ,广东嘉佳卡通 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226539/1.m3u8
#EXTINF:-1 ,江苏优漫卡通 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226420/1.m3u8
#EXTINF:-1 ,江苏优漫卡通 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225910/1.m3u8
#EXTINF:-1 ,湖南金鹰卡通 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225906/1.m3u8
#EXTINF:-1 ,CCTV中视购物 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226385/1.m3u8
#EXTINF:-1 ,北京家有购物 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225912/1.m3u8
#EXTINF:-1 ,北京家有购物 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226343/1.m3u8
#EXTINF:-1 ,聚鲨环球精选 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226311/1.m3u8
#EXTINF:-1 ,聚鲨环球精选 标清
http://221.179.217.9/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226345/1.m3u8

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,816 +0,0 @@
#EXTM3U
#EXTINF:-1 logo="" group-title="" ,CCTV-1
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226226/1.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-1
http://112.50.243.8/PLTV/88888888/224/3221225922/1.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-1
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/8380729188125675257/1.m3u8?stbId=005301FF001589101611549359B92C46&channel-id=shvoolive&Contentid=8380729188125675257&mos=jbjhhzstsl&livemode=1&proto=7&version=1.0&owaccmark=8380729188125675257&owchid=shvoolive&owsid=9810361579531242552&AuthInfo=2TOfGIahP4HrGWrHbpJXVOhAZZf%2B%2BRvFCOimr7PCGr9K%2B8TGA2jGwhx%2FP%2B9zbDc6lyCFd7nUPkjV5yhX4M591q%2Bjz%2FVPZBSXzMBonFGRPep2MwYhKpmBifYKbDBIkjbE
#EXTINF:-1 logo="" group-title="" ,CCTV-2
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226230/1.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-2
http://112.50.243.8/PLTV/88888888/224/3221225923/1.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-2
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/9059700522149664924/1.m3u8?stbId=005301FF00158910000000212621A0DD&channel-id=shvoolive&Contentid=9059700522149664924&mos=jbjhhzstsl&livemode=1&proto=7&version=1.0&owaccmark=9059700522149664924&owchid=shvoolive&owsid=9176631579531299298&AuthInfo=2TOfGIahP4HrGWrHbpJXVOJq5SVvpOdgyIf7tzyuJqdYhL2umVWk4VA%2BiWro6vS%2FGYbJQ4PkF2oGSeOSrHR8kErWftutbDOGxkGeSWuC8HvRlxrsJs3srD2VEDgCtlA%2B
#EXTINF:-1 logo="" group-title="" ,CCTV-3
http://117.169.124.36:6610/ysten-businessmobile/live/cctv-3/1.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-3
http://223.110.241.130:6610/gitv/live1/G_CCTV-3-HQ/.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-3
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/7583927553614607925/1.m3u8?stbId=005301FF001589101611549359B9531C&channel-id=shvoolive&Contentid=7583927553614607925&mos=jbjhhzstsl&livemode=1&proto=7&version=1.0&owaccmark=7583927553614607925&owchid=shvoolive&owsid=4975061579531175360&AuthInfo=2TOfGIahP4HrGWrHbpJXVMtGfw%2Bi1RmSk6DRVWhSYHpPQhuPB3gB9HD2kYmj6h2ghYJH%2BZemKqNLOjvtazNyyelvyYAlIu0Li8OHrMDUf9T6xYM6NbVkTDG8Dli2hoZV
#EXTINF:-1 logo="" group-title="" ,CCTV-4
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226314/1.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-4
http://112.50.243.8/PLTV/88888888/224/3221225802/1.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-4
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/1000000002000031664/1.m3u8?channel-id=ystenlive&Contentid=1000000002000031664&livemode=1&stbId=00000250001B50800001B401420BC069&userToken=&usergroup=&version=1.0&owaccmark=1000000002000031664&owchid=ystenlive&owsid=4493204828580187354&AuthInfo=zmDeINsczUw%2bXOm6icTIplPJYM0PdJZ7nyJeCqAhmgD4h2W12vkSCe%2bw8qoQi5%2fj1BMuqFcEHMRAJlgQD47XRVqqHN3O4Si9Wv7MjAX%2b8AK0eHLMDmPByGK0oSB43DB7
#EXTINF:-1 logo="" group-title="" ,CCTV-5
http://223.110.241.130:6610/gitv/live1/G_CCTV-5-HQ/G_CCTV-5-HQ/
#EXTINF:-1 logo="" group-title="" ,CCTV-5
http://112.17.40.145/PLTV/88888888/224/3221226687/index.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-5
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/8134369599538150431/1.m3u8?stbId=005301FF001589101611549359B91F12&channel-id=shvoolive&Contentid=8134369599538150431&mos=jbjhhzstsl&livemode=1&proto=7&version=1.0&owaccmark=8134369599538150431&owchid=shvoolive&owsid=9856681579531396965&AuthInfo=2TOfGIahP4HrGWrHbpJXVHgbCHVZZF5UUv019%2FSsh88KJM1EuxjKGjHOptOCA%2B9qy7SUSUSlFcfpzdjGKbaNwXQPpC5RWUW%2BWPXxlyqlAmmp3eZqD0kAJRbC1HQjeP48
#EXTINF:-1 logo="" group-title="" ,CCTV-5+
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226225/1.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-5+
http://117.169.124.46:6410/ysten-businessmobile/live/hdcctv05plus/1.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-5+
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/1000000001000020505/1.m3u8?stbId=005301FF001589101611549359B92F26&channel-id=ystenlive&Contentid=1000000001000020505&mos=jbjhhzstsl&livemode=1&version=1.0&owaccmark=1000000001000020505&owchid=ystenlive&owsid=3007521579531929012&AuthInfo=2TOfGIahP4HrGWrHbpJXVPo6e%2BHF%2BrVo6xQQtyKDSuqu3lLj0NrV6tPDBIsVEpn3e3h8FJNoRfXgk2fJ%2B8A%2BC9FKxw7DogGmhnFazyXoBZJZPx01aV9Q%2Bs%2B%2FVnd4tZOQ
#EXTINF:-1 logo="" group-title="" ,CCTV-6
http://223.110.243.139/PLTV/3/224/3221225548/index.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-6
http://117.169.124.36:6610/ysten-businessmobile/live/cctv-6/1.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-6
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/6705015643145867202/1.m3u8?stbId=005301FF00158910000000212621A501&channel-id=shvoolive&Contentid=6705015643145867202&mos=jbjhhzstsl&livemode=1&proto=7&version=1.0&owaccmark=6705015643145867202&owchid=shvoolive&owsid=7641431579531463387&AuthInfo=2TOfGIahP4HrGWrHbpJXVGtyhHJPIcRRegoBYBxkr5gU2nvM3aYRu9pk6g1cfGsxitbm7ri6Y%2BkjLjny72IEdjBnss%2Faslq1wPHTyGHeHFYaAuxUDnXfdynLgAo%2FAhgd
#EXTINF:-1 logo="" group-title="" ,CCTV-7
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226234/1.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-7
http://112.50.243.8/PLTV/88888888/224/3221225927/1.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-7
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/9021776916726275968/1.m3u8?stbId=005303FF00010060000100E400EDD522&channel-id=shvoolive&Contentid=9021776916726275968&mos=jbjhhzstsl&livemode=1&proto=7&version=1.0&owaccmark=9021776916726275968&owchid=shvoolive&owsid=1117721579531499433&AuthInfo=dIshjDc3shv8ei%2BWF5V%2F4V6lf0HKCsUdpGR8CeY5ZvwycVHGQkBt0T4Mgr0s8ldsXtd9fDrW5osGZSl1tYFcN4xKXGPanSFGs4GR6kXBOyjKyNYEmAQ7njzvrMpDpEoy
#EXTINF:-1 logo="" group-title="" ,CCTV-8
http://117.169.124.36:6610/ysten-businessmobile/live/cctv-8/1.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-8
http://223.110.247.161:6610/cntv/live1/HD-2500k-1080P-cctv8/HD-2500k-1080P-cctv8
#EXTINF:-1 logo="" group-title="" ,CCTV-8
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/6718199708332952607/1.m3u8?stbId=005303FF00010060000100E400EDD522&channel-id=shvoolive&Contentid=6718199708332952607&mos=jbjhhzstsl&livemode=1&proto=7&version=1.0&owaccmark=6718199708332952607&owchid=shvoolive&owsid=5415971579531545952&AuthInfo=dIshjDc3shv8ei%2BWF5V%2F4V6lf0HKCsUdpGR8CeY5ZvwhPD49%2ByoYvwp35mAdL%2Fiv3IhMa6%2BWOwlWxbCOH9ParUjWZpISKyxZZPoQtekRP1dMl%2BCp9T%2BIEdj1ckDKKfLV
#EXTINF:-1 logo="" group-title="" ,CCTV-9
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226236/1.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-9
http://112.50.243.8/PLTV/88888888/224/3221225820/1.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-9
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/1000000001000014583/1.m3u8?stbId=005303FF00010060000100E400EDD522&channel-id=ystenlive&Contentid=1000000001000014583&mos=jbjhhzstsl&livemode=1&version=1.0&owaccmark=1000000001000014583&owchid=ystenlive&owsid=7167961579531601678&AuthInfo=dIshjDc3shv8ei%2BWF5V%2F4V6lf0HKCsUdpGR8CeY5Zvyu3lLj0NrV6tPDBIsVEpn34sImpRHeOmdxmKUDLs1%2BcZ4JMWbvuFdY7IsuWCFdW392C%2BvFQjyH4LwQq4yRWFvT
#EXTINF:-1 logo="" group-title="" ,CCTV-10
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226227/1.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-10
http://ott.fj.chinamobile.com/PLTV/88888888/224/3221225814/1.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-10
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/5505774374187257095/1.m3u8?stbId=005301FF001589101611549359B928C9&channel-id=shvoolive&Contentid=5505774374187257095&mos=jbjhhzstsl&livemode=1&proto=7&version=1.0&owaccmark=5505774374187257095&owchid=shvoolive&owsid=1848841579531638041&AuthInfo=2TOfGIahP4HrGWrHbpJXVO9dhnpYCD6yZADsu%2BE3e1z0TmJ04Et2oauQoqLXutIbfy6yerDX1KNDnX4OGB2ZvZf3QlZMt7Oj%2B5HhHlpl0nNoTgXky6K2iYWb1eX3xCek
#EXTINF:-1 logo="" group-title="" ,CCTV-11
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226315/1.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-11
http://ott.fj.chinamobile.com/PLTV/88888888/224/3221225815/1.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-11
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/1000000002000019789/1.m3u8?stbId=005301FF001589101611549359B96031&channel-id=ystenlive&Contentid=1000000002000019789&mos=jbjhhzstsl&livemode=1&version=1.0&owaccmark=1000000002000019789&owchid=ystenlive&owsid=5070431579531812673&AuthInfo=2TOfGIahP4HrGWrHbpJXVDOD3a2KOxiKxQ3OD0iK1ACjKNizoRlMOkuvsTe1URoeoCCSRcfgLDg%2FiG7BT3%2BNlEIMer5%2BuzAqyByddFhoQVMoMRKerLoSM5qM9Az%2Bea7u
#EXTINF:-1 logo="" group-title="" ,CCTV-12
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226228/1.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-12
http://112.50.243.8/PLTV/88888888/224/3221225816/1.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-12
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/6417486185316863297/1.m3u8?stbId=005301FF001589101611549359B92F26&channel-id=shvoolive&Contentid=6417486185316863297&mos=jbjhhzstsl&livemode=1&proto=7&version=1.0&owaccmark=6417486185316863297&owchid=shvoolive&owsid=9153671579531878340&AuthInfo=2TOfGIahP4HrGWrHbpJXVPo6e%2BHF%2BrVo6xQQtyKDSurAX3PB%2FnVIr3xix20cl8xPdgGi1rpRM1DYWZnyEDgQSmvEeryqwyIWUPNfICRzKqmuU3YFsCIaBI4jHMacn12g
#EXTINF:-1 logo="" group-title="" ,CCTV-13
http://223.110.241.130:6610/gitv/live1/G_CCTV-13-HQ/.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-13
http://223.110.247.161:6610/gitv/live1/G_CCTV-13-HQ/1.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-14
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226229/1.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-14
http://117.148.187.37/PLTV/88888888/224/3221226126/index.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-14
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/5554452538079056392/1.m3u8?stbId=005301FF001589101611549359B92F26&channel-id=shvoolive&Contentid=5554452538079056392&mos=jbjhhzstsl&livemode=1&proto=7&version=1.0&owaccmark=5554452538079056392&owchid=shvoolive&owsid=1386521579531934459&AuthInfo=2TOfGIahP4HrGWrHbpJXVPo6e%2BHF%2BrVo6xQQtyKDSuraKH2KM768ZNQcj3PAdtOdSSlj5RtbM3onnzvUC8Txgj%2BRYROAJoRcjfZ4YOPHclFuVVM2CqA1FqqLFpU5t7y%2B
#EXTINF:-1 logo="" group-title="" ,CCTV-15
http://111.13.111.167/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226333/1.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-15
http://ott.fj.chinamobile.com/PLTV/88888888/224/3221225818/1.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-15
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/1000000002000008163/1.m3u8?stbId=005301FF00158910000000212621B0EF&channel-id=ystenlive&Contentid=1000000002000008163&mos=jbjhhzstsl&livemode=1&version=1.0&owaccmark=1000000002000008163&owchid=ystenlive&owsid=8159411579531758075&AuthInfo=2TOfGIahP4HrGWrHbpJXVCfBjPWQNL5VnKaoeN%2FnWIWjKNizoRlMOkuvsTe1URoev67GfI1oIH4w2vVjbaVRzv3Enx1RBixVDhCnZtdnlMixFs9te0%2Bpvr2OpfN5d0VT
#EXTINF:-1 logo="" group-title="" ,CCTV-17
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226318/1.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-17
http://ott.fj.chinamobile.com/PLTV/88888888/224/3221226990/1.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-17
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/1000000005000056836/1.m3u8?stbId=005301FF001589101611549359B9325E&channel-id=ystenlive&Contentid=1000000005000056836&mos=jbjhhzstsl&livemode=1&version=1.0&owaccmark=1000000005000056836&owchid=ystenlive&owsid=9164551579532003738&AuthInfo=2TOfGIahP4HrGWrHbpJXVGO0L8hMYc%2BQSE26r5BPa9COQyZOTKfJypXfULnzEX8ov4wHfTVtjr5%2BH1gBPIHFdZVbPTqDjqKmcARryOXhfL7mPOk1Na7QiYpdWHg0hz19
#EXTINF:-1 logo="" group-title="" ,CCTV-4K
http://112.17.40.12/PLTV/88888888/224/3221226758/1.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-4K
http://112.17.40.140/PLTV/88888888/224/3221226758/index.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-4K
http://39.134.176.148/PLTV/88888888/224/3221226758/index.m3u8
#EXTINF:-1 logo="" group-title="" ,CCTV-4K
http://117.148.187.83/PLTV/88888888/224/3221226758/index.m3u8
#EXTINF:-1 logo="" group-title="" ,纯享4K源码1
http://112.50.243.8/PLTV/88888888/224/3221226825/1.m3u8
#EXTINF:-1 logo="" group-title="" ,纯享4K源码2
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn/000000001000/1000000004000011651/index.m3u8?channel-id=ystenlive&Contentid=1000000004000011651&livemode=1&authCode=3a&stbId=8A3603DD004735200000049573C4E39B&version=1.0&owaccmark=1000000004000011651&owchid=ystenlive&owsid=6721581571186720581&AuthInfo=QejU%2ByFkapDLEHjn7Vi7Bsh98cz5RjIeOqbMi0Qqlame2O8Id%2BgCUUdS4cJUD1ieqKIx8wFJ0pPdF5P8MGRzRrjFLuuRCIZ2D2ha%2Fr9iiM%2BAnSOfyc4s5zWrjzUdrEbf
#EXTINF:-1 logo="" group-title="" ,百事4K频道
http://112.17.40.145/PLTV/88888888/224/3221226718/index.m3u8
#EXTINF:-1 logo="" group-title="" ,凤凰资讯
http://112.17.40.140/PLTV/88888888/224/3221226491/index.m3u8
#EXTINF:-1 logo="" group-title="" ,凤凰资讯
http://117.169.124.37:6610/ysten-businessmobile/live/fhzixun/1.m3u8
#EXTINF:-1 logo="" group-title="" ,凤凰中文
http://117.169.124.37:6610/ysten-businessmobile/live/fhchinese/1.m3u8
#EXTINF:-1 logo="" group-title="" ,凤凰中文
http://117.169.120.138:8080/live/fhchinese/index.m3u8
#EXTINF:-1 logo="" group-title="" ,北京卫视
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226224/1.m3u8
#EXTINF:-1 logo="" group-title="" ,北京卫视
http://111.40.205.87/PLTV/88888888/224/3221225728/index.m3u8
#EXTINF:-1 logo="" group-title="" ,天津卫视
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226246/1.m3u8
#EXTINF:-1 logo="" group-title="" ,天津卫视
http://112.17.40.140/PLTV/88888888/224/3221226412/index.m3u8
#EXTINF:-1 logo="" group-title="" ,河北卫视超清1
http://223.110.245.149/ott.js.chinamobile.com/PLTV/3/224/3221225840/index.m3u8
#EXTINF:-1 logo="" group-title="" ,河北卫视超清2
http://223.110.247.161:6610/gitv/live1/G_HEBEI/G_HEBEI
#EXTINF:-1 logo="" group-title="" ,东方卫视
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226237/1.m3u8
#EXTINF:-1 logo="" group-title="" ,东方卫视
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/1000000001000005866/1.m3u8?stbId=005301FF001589101611549359B9656A&channel-id=ystenlive&Contentid=1000000001000005866&mos=jbjhhzstsl&livemode=1&version=1.0&owaccmark=1000000001000005866&owchid=ystenlive&owsid=6312751579529792174&AuthInfo=2TOfGIahP4HrGWrHbpJXVB51rvh1oS437liFJd26gOOu3lLj0NrV6tPDBIsVEpn3OZnoLrZwa8b70lofXkPptSAmb4xhM2tKBJ0VUyBQsWCEzNrIVXcTeS%2F12UFJevdi
#EXTINF:-1 logo="" group-title="" ,湖南卫视
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226241/1.m3u8
#EXTINF:-1 logo="" group-title="" ,湖南卫视
http://112.17.40.140/PLTV/88888888/224/3221226553/index.m3u8
#EXTINF:-1 logo="" group-title="" ,浙江卫视
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226247/1.m3u8
#EXTINF:-1 logo="" group-title="" ,浙江卫视
http://223.110.243.173/PLTV/3/224/3221227215/index.m3u8
#EXTINF:-1 logo="" group-title="" ,江苏卫视
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226242/1.m3u8
#EXTINF:-1 logo="" group-title="" ,江苏卫视
http://112.17.40.140/PLTV/88888888/224/3221226414/index.m3u8
#EXTINF:-1 logo="" group-title="" ,东南卫视
http://117.169.124.37:6610/ysten-businessmobile/live/dongnanstv/yst.m3u8
#EXTINF:-1 logo="" group-title="" ,东南卫视
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/1000000002000009263/1.m3u8?channel-id=ystenlive&Contentid=1000000002000009263&livemode=1&stbId=005203FF000360100001001A34C0CD33&userToken=bd8bb70bdb2b54bd84b587dffa024f7621vv&usergroup=g21077200000&version=1.0&owaccmark=1000000002000009263&owchid=ystenlive&owsid=1106497909461310172&AuthInfo=yOLXJswzZFfV3FvB8MhHuElKGJKLbU5H0jB3qAhfSE5oj7lZFbEKIj3xJcvQPkjhM1XYZKCRYYY%2ff447%2bzETLijqfFgMTSA9x9T2lf3pyhagZIF%2fdE1lc49i65lODYA%2f
#EXTINF:-1 logo="" group-title="" ,山东卫视
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226308/1.m3u8
#EXTINF:-1 logo="" group-title="" ,山东卫视
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/1000000001000012807/1.m3u8?channel-id=ystenlive&Contentid=1000000001000012807&livemode=1&stbId=005203FF000360100001001A34C0CD33&userToken=bd8bb70bdb2b54bd84b587dffa024f7621vv&usergroup=g21077200000&version=1.0&owaccmark=1000000001000012807&owchid=ystenlive&owsid=1106497909461291586&AuthInfo=yOLXJswzZFfV3FvB8MhHuElKGJKLbU5H0jB3qAhfSE7AORAoVDZDWbFnJ0sXJEaR3cBsIsjm7UHdGO3a4NjD1C4TiYtYt%2by66pvMI%2bkz57DAkgjzetftIzpJRR8RWa0K
#EXTINF:-1 logo="" group-title="" ,湖北卫视
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226310/1.m3u8
#EXTINF:-1 logo="" group-title="" ,湖北卫视
http://223.110.243.171/PLTV/3/224/3221227211/index.m3u8
#EXTINF:-1 logo="" group-title="" ,安徽卫视
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226223/1.m3u8
#EXTINF:-1 logo="" group-title="" ,安徽卫视
http://223.110.247.161:6610/gitv/live1/G_ANHUI-CQ/G_ANHUI-CQ
#EXTINF:-1 logo="" group-title="" ,广东卫视
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226238/1.m3u8
#EXTINF:-1 logo="" group-title="" ,广东卫视
http://112.17.40.140/PLTV/88888888/224/3221226225/index.m3u8
#EXTINF:-1 logo="" group-title="" ,深圳卫视
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226245/1.m3u8
#EXTINF:-1 logo="" group-title="" ,深圳卫视
http://223.110.243.171/PLTV/3/224/3221227217/index.m3u8
#EXTINF:-1 logo="" group-title="" ,辽宁卫视
http://ott.fj.chinamobile.com/PLTV/88888888/224/3221225947/1.m3u8
#EXTINF:-1 logo="" group-title="" ,辽宁卫视
http://223.110.245.145/ott.js.chinamobile.com/PLTV/3/224/3221227410/index.m3u8
#EXTINF:-1 logo="" group-title="" ,龙江卫视
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226239/1.m3u8
#EXTINF:-1 logo="" group-title="" ,龙江卫视
http://112.17.40.140/PLTV/88888888/224/3221226555/index.m3u8
#EXTINF:-1 logo="" group-title="" ,吉林卫视
http://116.199.5.52:8114/00000000/index.m3u8?&Fsv_ctype=LIVES&Fsv_otype=1&FvSeid=5abd1660af1babb4&Fsv_filetype=1&Fsv_ctype=LIVES&Fsv_cid=0&Fsv_chan_hls_se_idx=25&Fsv_rate_id=0&Fsv_SV_PARAM1=0&Fsv_ShiftEnable=0&Fsv_ShiftTsp=0&Provider_id=&Pcontent_id=&Fsv_CMSID=&Fsv_otype=1
#EXTINF:-1 logo="" group-title="" ,吉林卫视
http://223.110.247.161:6610/gitv/live1/G_JILIN/G_JILIN
#EXTINF:-1 logo="" group-title="" ,江西卫视
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226243/1.m3u8
#EXTINF:-1 logo="" group-title="" ,江西卫视
http://112.17.40.140/PLTV/88888888/224/3221226557/index.m3u8
#EXTINF:-1 logo="" group-title="" ,四川卫视
http://ott.fj.chinamobile.com/PLTV/88888888/224/3221227006/1.m3u8
#EXTINF:-1 logo="" group-title="" ,四川卫视
http://223.110.247.161:6610/gitv/live1/SCWS/SCWS
#EXTINF:-1 logo="" group-title="" ,重庆卫视
http://ott.fj.chinamobile.com/PLTV/88888888/224/3221225949/1.m3u8
#EXTINF:-1 logo="" group-title="" ,重庆卫视
http://ivi.bupt.edu.cn/hls/cqhd.m3u8
#EXTINF:-1 logo="" group-title="" ,厦门卫视
http://ott.fj.chinamobile.com/PLTV/88888888/224/3221226781/1.m3u8
#EXTINF:-1 logo="" group-title="" ,厦门卫视
http://223.110.247.161:6610/gitv/live1/G_XIAMEN/G_XIAMEN
#EXTINF:-1 logo="" group-title="" ,河南卫视
http://116.199.5.52:8114/00000000/index.m3u8?&Fsv_ctype=LIVES&Fsv_otype=1&FvSeid=5abd1660af1babb4&Fsv_filetype=1&Fsv_ctype=LIVES&Fsv_cid=0&Fsv_chan_hls_se_idx=19&Fsv_rate_id=0&Fsv_SV_PARAM1=0&Fsv_ShiftEnable=0&Fsv_ShiftTsp=0&Provider_id=&Pcontent_id=&Fsv_CMSID=&Fsv_otype=1
#EXTINF:-1 logo="" group-title="" ,河南卫视超清2
http://223.110.245.157/ott.js.chinamobile.com/PLTV/3/224/3221225815/index.m3u8
#EXTINF:-1 logo="" group-title="" ,贵州卫视
http://116.199.5.52:8114/00000000/index.m3u8?&Fsv_ctype=LIVES&Fsv_otype=1&FvSeid=5abd1660af1babb4&Fsv_filetype=1&Fsv_ctype=LIVES&Fsv_cid=0&Fsv_chan_hls_se_idx=41&Fsv_rate_id=0&Fsv_SV_PARAM1=0&Fsv_ShiftEnable=0&Fsv_ShiftTsp=0&Provider_id=&Pcontent_id=&Fsv_CMSID=&Fsv_otype=1
#EXTINF:-1 logo="" group-title="" ,贵州卫视超清2
http://223.110.245.149/ott.js.chinamobile.com/PLTV/3/224/3221225787/index.m3u8
#EXTINF:-1 logo="" group-title="" ,海南卫视超清1
http://hnhbxww.com/live.php?http://mlive1.91kds.cn/b9/hitv.m3u8?id=lywshd
#EXTINF:-1 logo="" group-title="" ,海南卫视
http://112.50.243.8/PLTV/88888888/224/3221225855/1.m3u8
#EXTINF:-1 logo="" group-title="" ,甘肃卫视超清1
http://116.199.5.52:8114/00000000/index.m3u8?&Fsv_ctype=LIVES&Fsv_otype=1&FvSeid=5abd1660af1babb4&Fsv_filetype=1&Fsv_ctype=LIVES&Fsv_cid=0&Fsv_chan_hls_se_idx=142&Fsv_rate_id=0&Fsv_SV_PARAM1=0&Fsv_ShiftEnable=0&Fsv_ShiftTsp=0&Provider_id=&Pcontent_id=&Fsv_CMSID=&Fsv_otype=1
#EXTINF:-1 logo="" group-title="" ,甘肃卫视
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225877/1.m3u8
#EXTINF:-1 logo="" group-title="" ,青海卫视超清1
http://116.199.5.52:8114/00000000/index.m3u8?&Fsv_ctype=LIVES&Fsv_otype=1&FvSeid=5abd1660af1babb4&Fsv_filetype=1&Fsv_ctype=LIVES&Fsv_cid=0&Fsv_chan_hls_se_idx=206&Fsv_rate_id=0&Fsv_SV_PARAM1=0&Fsv_ShiftEnable=0&Fsv_ShiftTsp=0&Provider_id=&Pcontent_id=&Fsv_CMSID=&Fsv_otype=1
#EXTINF:-1 logo="" group-title="" ,青海卫视
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225893/1.m3u8
#EXTINF:-1 logo="" group-title="" ,云南卫视超清1
http://223.110.245.159/ott.js.chinamobile.com/PLTV/3/224/3221225838/index.m3u8
#EXTINF:-1 logo="" group-title="" ,云南卫视
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225902/1.m3u8
#EXTINF:-1 logo="" group-title="" ,陕西卫视
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225896/1.m3u8
#EXTINF:-1 logo="" group-title="" ,陕西卫视
http://223.110.247.161:6610/gitv/live1/G_SHANXI/G_SHANXI
#EXTINF:-1 logo="" group-title="" ,宁夏卫视超清1
http://223.110.245.151/ott.js.chinamobile.com/PLTV/3/224/3221225842/index.m3u8
#EXTINF:-1 logo="" group-title="" ,宁夏卫视
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225892/1.m3u8
#EXTINF:-1 logo="" group-title="" ,内蒙卫视超清1
http://223.110.245.161/ott.js.chinamobile.com/PLTV/3/224/3221225836/index.m3u8
#EXTINF:-1 logo="" group-title="" ,内蒙卫视
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225891/1.m3u8
#EXTINF:-1 logo="" group-title="" ,西藏卫视
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225900/1.m3u8
#EXTINF:-1 logo="" group-title="" ,西藏卫视
http://223.110.247.161:6610/gitv/live1/G_XIZANG/G_XIZANG
#EXTINF:-1 logo="" group-title="" ,山西卫视
http://223.110.247.161:6610/gitv/live1/SXWS/SXWS
#EXTINF:-1 logo="" group-title="" ,山西卫视
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225895/1.m3u8
#EXTINF:-1 logo="" group-title="" ,广西卫视
http://112.50.243.8/PLTV/88888888/224/3221225836/1.m3u8
#EXTINF:-1 logo="" group-title="" ,广西卫视
http://223.110.247.161:6610/gitv/live1/GXWS/GXWS
#EXTINF:-1 logo="" group-title="" ,新疆卫视
http://223.110.247.161:6610/gitv/live1/G_XINJIANG/G_XINJIANG
#EXTINF:-1 logo="" group-title="" ,新疆卫视
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225901/1.m3u8
#EXTINF:-1 logo="" group-title="" ,南方卫视高清
http://223.110.247.161:6610/gitv/live1/G_NANFANG/G_NANFANG
#EXTINF:-1 logo="" group-title="" ,兵团卫视高清
http://223.110.247.161:6610/gitv/live1/G_BINGTUAN/G_BINGTUAN
#EXTINF:-1 logo="" group-title="" ,延边卫视高清
http://223.110.247.161:6610/gitv/live1/G_YANBIAN/G_YANBIAN
#EXTINF:-1 logo="" group-title="" ,农林卫视高清
http://223.110.247.161:6610/gitv/live1/G_NONGLIN/G_NONGLIN
#EXTINF:-1 logo="" group-title="" ,康巴卫视高清
http://223.110.247.161:6610/gitv/live1/G_KANGBA/G_KANGBA
#EXTINF:-1 logo="" group-title="" ,安多卫视高清
http://223.110.247.161:6610/gitv/live1/G_ANDUO/G_ANDUO
#EXTINF:-1 logo="" group-title="" ,高清影视1台
http://112.50.243.8/PLTV/88888888/224/3221226736/1.m3u8
#EXTINF:-1 logo="" group-title="" ,高清影视2台
http://112.50.243.8/PLTV/88888888/224/3221225881/1.m3u8
#EXTINF:-1 logo="" group-title="" ,高清影视3台
http://112.50.243.8/PLTV/88888888/224/3221226708/1.m3u8
#EXTINF:-1 logo="" group-title="" ,高清影视4台
http://112.50.243.8/PLTV/88888888/224/3221226712/1.m3u8
#EXTINF:-1 logo="" group-title="" ,高清影视5台
http://112.50.243.8/PLTV/88888888/224/3221225893/1.m3u8
#EXTINF:-1 logo="" group-title="" ,高清影视6台
http://112.50.243.8/PLTV/88888888/224/3221226692/1.m3u8
#EXTINF:-1 logo="" group-title="" ,高清影视7台
http://112.50.243.8/PLTV/88888888/224/3221226754/1.m3u8
#EXTINF:-1 logo="" group-title="" ,高清影视8台
http://112.17.40.145/PLTV/88888888/224/3221226608/index.m3u8
#EXTINF:-1 logo="" group-title="" ,高清影视9台
http://112.17.40.145/PLTV/88888888/224/3221226606/index.m3u8
#EXTINF:-1 logo="" group-title="" ,高清影视10台
http://112.17.40.145/PLTV/88888888/224/3221226360/index.m3u8
#EXTINF:-1 logo="" group-title="" ,高清动画11台
http://112.50.243.8/PLTV/88888888/224/3221226732/1.m3u8
#EXTINF:-1 logo="" group-title="" ,高清动画12台
http://112.50.243.8/PLTV/88888888/224/3221226741/1.m3u8
#EXTINF:-1 logo="" group-title="" ,高清动漫13台
http://112.50.243.8/PLTV/88888888/224/3221226743/1.m3u8
#EXTINF:-1 logo="" group-title="" ,高清影视14台
http://ivi.bupt.edu.cn/hls/chchd.m3u8
#EXTINF:-1 logo="" group-title="" ,东方影视高清
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/5000000010000032212/index.m3u8?channel-id=bestzb&Contentid=5000000010000032212&livemode=1&authCode=3a&stbId=005301FF00158910000000212621B1F2&version=1.0&owaccmark=5000000010000032212&owchid=bestzb&owsid=2093431579530013084&AuthInfo=2TOfGIahP4HrGWrHbpJXVC70y2PVjmhUubUspsIcpqbPt3njBIzWc%2Fam35vTsnvWPWGkzpZH3A16MnnNHKq3GxKdDnIii87ggbdt%2FwooaevY4cuAtO0vMGGwXuHO%2Biok
#EXTINF:-1 logo="" group-title="" ,纪实人文高清
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/1000000001000010606/1.m3u8?stbId=005301FF001589101611549359B92C46&channel-id=ystenlive&Contentid=1000000001000010606&mos=jbjhhzstsl&livemode=1&version=1.0&owaccmark=1000000001000010606&owchid=ystenlive&owsid=5474771579530255373&AuthInfo=2TOfGIahP4HrGWrHbpJXVOhAZZf%2B%2BRvFCOimr7PCGr%2Bu3lLj0NrV6tPDBIsVEpn3QZdNn969VxaznG4qedKIxPvWqo6nkyvxK0SnJLSEP%2FF4Wxm5gCchMH9VO%2BhWyofF
#EXTINF:-1 logo="" group-title="" ,上海外语高清
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/5000000010000030951/index.m3u8?channel-id=bestzb&Contentid=5000000010000030951&livemode=1&authCode=3a&stbId=005303FF0002189018212C1875540E0E&version=1.0&owaccmark=5000000010000030951&owchid=bestzb&owsid=5275181579530295306&AuthInfo=%2FcylGCbqLdFJuk2wbal8%2B%2FwyUq8npJ58oVaJUzBhF9PPt3njBIzWc%2Fam35vTsnvW6JhDYuiodydLTeMKHTm0L2zYfQnHdO1Iw0VU34c0CqRBZ788c%2Fr%2FVjoxJ5D0QVcG
#EXTINF:-1 logo="" group-title="" ,第一财经高清
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/5000000010000027146/index.m3u8?channel-id=bestzb&Contentid=5000000010000027146&livemode=1&authCode=3a&stbId=005301FF00158910000000212621B272&version=1.0&owaccmark=5000000010000027146&owchid=bestzb&owsid=2047321579530436324&AuthInfo=2TOfGIahP4HrGWrHbpJXVGQxu5HMK%2BIheH%2BppAJUFQfPt3njBIzWc%2Fam35vTsnvW%2Bh72VHwN1p1HFLVpAXsbYI0I2J%2FhJvUENkmrKWvJBWHflOM1WROOndOSHiRR8ilK
#EXTINF:-1 logo="" group-title="" ,冬奥纪实高清
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/1000000001000001910/1.m3u8?stbId=005301FF001589101611549359B93B82&channel-id=ystenlive&Contentid=1000000001000001910&mos=jbjhhzstsl&livemode=1&version=1.0&owaccmark=1000000001000001910&owchid=ystenlive&owsid=6204131579532167784&AuthInfo=2TOfGIahP4HrGWrHbpJXVB3TJIR2vriLvDYSdNB63hOu3lLj0NrV6tPDBIsVEpn3tQTMvk8FXaCJplQYdE%2FaRS95e%2BAlAk4PMAmwzVuVNoUAyrBQjkJ2X3eTsBSYe8ta
#EXTINF:-1 logo="" group-title="" ,北京纪实高清
http://112.50.243.8/PLTV/88888888/224/3221225944/1.m3u8
#EXTINF:-1 logo="" group-title="" ,五星体育高清
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/5000000010000017540/index.m3u8?channel-id=bestzb&Contentid=5000000010000017540&livemode=1&stbId=004003FF0017301364008422F151297C&userToken=22da83031e59d012e61af366ad30871e02vv&usergroup=g02020000000&version=1.0&owaccmark=5000000010000017540&owchid=bestzb&owsid=4493204831455228383&AuthInfo=N%2biD7%2bHgi9LcszGFRGa51uAqiHNpkS5d0%2fEIXqMyy8J6GNpZ%2bE47AWi696WsOzmj7u8gynrDaeemmd3KgHvW7jm8s%2fkPykV1GmMdpMkc7doBK82U9CVAXx34x1%2fYjl4A
#EXTINF:-1 logo="" group-title="" ,生活时尚高清
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/8538616372715313491/index.m3u8?channel-id=bestzb&Contentid=8538616372715313491&livemode=1&authCode=3a&stbId=005301FF001589101611549359B95001&version=1.0&owaccmark=8538616372715313491&owchid=bestzb&owsid=9384351579529030195&AuthInfo=2TOfGIahP4HrGWrHbpJXVMf9GKsKSOxo3z9oMCSFNzfvIfeh1IeRuYy1UKStuEqgLEq69vAaIVm8yJ1Bv9Ubfc12nlc%2FSga%2FjQ8%2F3mwUrQxWfqFwePA0JQWqj9IZCH10
#EXTINF:-1 logo="" group-title="" ,五星体育高清
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/4612233678249154892/index.m3u8?channel-id=bestzb&Contentid=4612233678249154892&livemode=1&authCode=3a&stbId=005301FF001589101611549359B95001&version=1.0&owaccmark=4612233678249154892&owchid=bestzb&owsid=1779721579529023740&AuthInfo=2TOfGIahP4HrGWrHbpJXVMf9GKsKSOxo3z9oMCSFNzd9hkuYOs2VB84It64D80NJi4eXOKW3GuNNz9Fm%2FKg8xywLT7mM729fPyVIkI9Esx1ZNxN%2F6BsKFZl0vwsL8fqK
#EXTINF:-1 logo="" group-title="" ,上海都市高清
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/6789517052815334336/index.m3u8?channel-id=bestzb&Contentid=6789517052815334336&livemode=1&authCode=3a&stbId=005301FF001589101611549359B94488&version=1.0&owaccmark=6789517052815334336&owchid=bestzb&owsid=3529791579529328057&AuthInfo=2TOfGIahP4HrGWrHbpJXVG%2BEERpEQIU%2FdtpJfuYgRAZD6434P427oxBuLbFRCJn4JFqerLYeYbaWyhUzdTsyRsJkPPbC14Prjj67uIG3APHUBp7pkUo1m6jlajTP1QwT
#EXTINF:-1 logo="" group-title="" ,风尚音乐高清
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/5529729098703832176/z.m3u8?authCode=07110409322147352675&stbId=005301FF001589101611549359B92801&Contentid=5529729098703832176&mos=jbjhhzstsl&livemode=1&channel-id=wasusyt&version=1.0&owaccmark=5529729098703832176&owchid=wasusyt&owsid=3246571579530794909&AuthInfo=2TOfGIahP4HrGWrHbpJXVM8tIjUabzvkQw3IFgi64wePjBmkxCliyfsNixolB3vk0fJDbsUHwM4ZMkLD2%2FuFtJVT%2FBKMSil0ujuXkiQNzBbZ5U6pNSIVxD4YjUWtTd0X
#EXTINF:-1 logo="" group-title="" ,精品剧场高清
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/8230197131234717902/z.m3u8?authCode=07110409322147352675&stbId=005303FF000218901813C88F26C4CD9A&Contentid=8230197131234717902&mos=jbjhhzstsl&livemode=1&channel-id=wasusyt&version=1.0&owaccmark=8230197131234717902&owchid=wasusyt&owsid=7188071579532237669&AuthInfo=%2FcylGCbqLdFJuk2wbal8%2B0%2FXYYDGLpWdBEstTIR1PqI%2FOctjqHm7uarF9hdI%2FegylabK%2B2Kjwr6YmfYB%2B0U4%2FVMlD9%2BUH6H5BTAiFyR%2BGJWsoX2Ruwovu0ZMFHxX6702
#EXTINF:-1 logo="" group-title="" ,亚洲影院高清
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/5841816227539527643/z.m3u8?authCode=07110409322147352675&stbId=005301FF001589101611549359B93B82&Contentid=5841816227539527643&mos=jbjhhzstsl&livemode=1&channel-id=wasusyt&version=1.0&owaccmark=5841816227539527643&owchid=wasusyt&owsid=1431411579532174401&AuthInfo=2TOfGIahP4HrGWrHbpJXVB3TJIR2vriLvDYSdNB63hPyA9qk2%2BTKLoJATlqPnb0MXm7l%2FiHeo2whk7VLomWH7w5GNiHxzOX6JECr7x0TLTmTY895HMYgWz4jiaElB1nN
#EXTINF:-1 logo="" group-title="" ,上海都市高清
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/6789517052815334336/index.m3u8?channel-id=bestzb&Contentid=6789517052815334336&livemode=1&stbId=004003FF0041848666008422F155939C&userToken=22da83031e59d012e61af366ad30871e02vv&usergroup=g02020000000&version=1.0&owaccmark=6789517052815334336&owchid=bestzb&owsid=4493204831455331826&AuthInfo=zI7Ouajzmvoo0pGb64%2fbgLE2RFvrprmD90MrWZVi%2bL3HPQnDcXoFLI6SzbzVwjU3sNLudmh14A4CtBNHjWANkrrgGz1D3dYfcKudsIt%2bpr%2fjXiUqpuQHmAckVE8okPuA
#EXTINF:-1 logo="" group-title="" ,上海ICS高清
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/6032059665143203976/index.m3u8?channel-id=bestzb&Contentid=6032059665143203976&livemode=1&authCode=3a&stbId=8A3603DD004735200000049573C4E39B&version=1.0&owaccmark=6032059665143203976&owchid=bestzb&owsid=8862091567733940095&AuthInfo=QejU%2ByFkapDLEHjn7Vi7Bsh98cz5RjIeOqbMi0QqlalAzdP65EW1KAjwws9eqr8onRppCkq5lhXK46o%2BFK3dV%2BCK3fxe9S11%2B88%2FynrqkhlXX%2BzVbd%2F5J%2FreUEsqODX5
#EXTINF:-1 logo="" group-title="" ,生活时尚高清
http://121.18.168.149/cache.ott.ystenlive.itv.cmvideo.cn:80/000000001000/8538616372715313491/index.m3u8?channel-id=bestzb&Contentid=8538616372715313491&livemode=1&authCode=3a&stbId=8A3603DD004735200000049573C4E39B&version=1.0&owaccmark=8538616372715313491&owchid=bestzb&owsid=5457861567734659356&AuthInfo=QejU%2ByFkapDLEHjn7Vi7Bsh98cz5RjIeOqbMi0QqlakS%2FOYtRGR5wcGJDIS9OeTlipH2OO8alDz%2F1TUrW3QAaMFdRScr5Z2333r7naICD73KmBnoU9%2B3A5Ot%2BJeysO4p
#EXTINF:-1 logo="" group-title="" ,峨眉电影高清
http://scgctvshow.sctv.com/hdlive/emei/1.m3u8
#EXTINF:-1 logo="" group-title="" ,欢笑剧场高清
http://112.50.243.8/PLTV/88888888/224/3221226729/1.m3u8
#EXTINF:-1 logo="" group-title="" ,纪实频道高清
http://112.50.243.8/PLTV/88888888/224/3221225946/1.m3u8
#EXTINF:-1 logo="" group-title="" ,极速汽车高清
http://112.50.243.8/PLTV/88888888/224/3221226140/1.m3u8
#EXTINF:-1 logo="" group-title="" ,动漫秀场高清
http://112.50.243.8/PLTV/88888888/224/3221226141/1.m3u8
#EXTINF:-1 logo="" group-title="" ,黑莓动画高清
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225914/1.m3u8
#EXTINF:-1 logo="" group-title="" ,黑莓电竞高清
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225931/1.m3u8
#EXTINF:-1 logo="" group-title="" ,黑莓电影高清
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225927/1.m3u8
#EXTINF:-1 logo="" group-title="" ,求索纪录
http://112.17.40.145/PLTV/88888888/224/3221226610/index.m3u8
#EXTINF:-1 logo="" group-title="" ,求索科学
http://125.210.152.18:9090/live/QSKX_1200.m3u8
#EXTINF:-1 logo="" group-title="" ,求索动物
http://125.210.152.18:9090/live/QSDW_1200.m3u8
#EXTINF:-1 logo="" group-title="" ,求索生活
http://125.210.152.18:9090/live/QSSH_1200.m3u8
#EXTINF:-1 logo="" group-title="" ,日本天気预报
http://movie.mcas.jp/mcas/wn1_2/master.m3u8
#EXTINF:-1 logo="" group-title="" ,中国教育1台
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225905/1.m3u8
#EXTINF:-1 logo="" group-title="" ,中国教育2台
http://cctvalih5ca.v.myalicdn.com/cstv/cetv2_2/index.m3u8
#EXTINF:-1 logo="" group-title="" ,中国教育3台
http://cctvalih5ca.v.myalicdn.com/cstv/cetv3_2/index.m3u8
#EXTINF:-1 logo="" group-title="" ,中国教育4台
http://cctvalih5ca.v.myalicdn.com/cstv/cetv4_2/index.m3u8
#EXTINF:-1 logo="" group-title="" ,山东教育
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225908/1.m3u8
#EXTINF:-1 logo="" group-title="" ,奥林匹克高清
http://ott-live.olympicchannel.com/out/u/OC1_2.m3u8?fluxustv.m3u8
#EXTINF:-1 logo="" group-title="" ,奥铃匹克高清
http://ott-live.olympicchannel.com/out/u/OC1_1.m3u8?fluxustv.m3u8
#EXTINF:-1 logo="" group-title="" ,超级电影
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226233/1.m3u8
#EXTINF:-1 logo="" group-title="" ,超级综艺
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226231/1.m3u8
#EXTINF:-1 logo="" group-title="" ,超级体育
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226232/1.m3u8
#EXTINF:-1 logo="" group-title="" ,超级剧集
http://111.13.111.167/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225864/1.m3u8
#EXTINF:-1 logo="" group-title="" ,中国功夫
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226298/1.m3u8
#EXTINF:-1 logo="" group-title="" ,金牌综艺
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226296/1.m3u8
#EXTINF:-1 logo="" group-title="" ,农业致富
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226304/1.m3u8
#EXTINF:-1 logo="" group-title="" ,潮妈辣婆
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226286/1.m3u8
#EXTINF:-1 logo="" group-title="" ,炫舞未来
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226248/1.m3u8
#EXTINF:-1 logo="" group-title="" ,明星大片
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226295/1.m3u8
#EXTINF:-1 logo="" group-title="" ,自由搏击
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226297/1.m3u8
#EXTINF:-1 logo="" group-title="" ,海外综合
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226302/1.m3u8
#EXTINF:-1 logo="" group-title="" ,惊梀悬疑
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226294/1.m3u8
#EXTINF:-1 logo="" group-title="" ,爱情喜剧
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226299/1.m3u8
#EXTINF:-1 logo="" group-title="" ,精品记录
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226293/1.m3u8
#EXTINF:-1 logo="" group-title="" ,精品体育
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226328/1.m3u8
#EXTINF:-1 logo="" group-title="" ,精品大剧
http://111.13.111.167/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226331/1.m3u8
#EXTINF:-1 logo="" group-title="" ,古装剧场
http://111.13.111.167/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226323/1.m3u8
#EXTINF:-1 logo="" group-title="" ,军旅剧场
http://111.13.111.167/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226324/1.m3u8
#EXTINF:-1 logo="" group-title="" ,军事评论
http://111.13.111.167/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226326/1.m3u8
#EXTINF:-1 logo="" group-title="" ,健康有约
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225919/1.m3u8
#EXTINF:-1 logo="" group-title="" ,家庭剧场
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225918/1.m3u8
#EXTINF:-1 logo="" group-title="" ,动作电影
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221226288/1.m3u8
#EXTINF:-1 logo="" group-title="" ,爱电竞
http://101.71.255.229:6610/zjhs/2/10110/index.m3u8?virtualDomain=zjhs.live_hls.zte.com
#EXTINF:-1 logo="" group-title="" ,爱动漫
http://101.71.255.229:6610/zjhs/2/10107/index.m3u8?virtualDomain=zjhs.live_hls.zte.com
#EXTINF:-1 logo="" group-title="" ,爱都市
http://101.71.255.229:6610/zjhs/2/10111/index.m3u8?virtualDomain=zjhs.live_hls.zte.com
#EXTINF:-1 logo="" group-title="" ,爱江湖
http://101.71.255.229:6610/zjhs/2/10114/index.m3u8?virtualDomain=zjhs.live_hls.zte.com
#EXTINF:-1 logo="" group-title="" ,爱解密
http://101.71.255.229:6610/zjhs/2/10109/index.m3u8?virtualDomain=zjhs.live_hls.zte.com
#EXTINF:-1 logo="" group-title="" ,爱经典
http://101.71.255.229:6610/zjhs/2/10106/index.m3u8?virtualDomain=zjhs.live_hls.zte.com
#EXTINF:-1 logo="" group-title="" ,爱军武
http://101.71.255.229:6610/zjhs/2/10119/index.m3u8?virtualDomain=zjhs.live_hls.zte.com
#EXTINF:-1 logo="" group-title="" ,爱科幻
http://101.71.255.229:6610/zjhs/2/10113/index.m3u8?virtualDomain=zjhs.live_hls.zte.com
#EXTINF:-1 logo="" group-title="" ,爱历史
http://101.71.255.229:6610/zjhs/2/10120/index.m3u8?virtualDomain=zjhs.live_hls.zte.com
#EXTINF:-1 logo="" group-title="" ,爱美食
http://101.71.255.229:6610/zjhs/2/10108/index.m3u8?virtualDomain=zjhs.live_hls.zte.com
#EXTINF:-1 logo="" group-title="" ,爱奇谈
http://101.71.255.229:6610/zjhs/2/10103/index.m3u8?virtualDomain=zjhs.live_hls.zte.com
#EXTINF:-1 logo="" group-title="" ,爱时尚
http://101.71.255.229:6610/zjhs/2/10118/index.m3u8?virtualDomain=zjhs.live_hls.zte.com
#EXTINF:-1 logo="" group-title="" ,爱世界
http://101.71.255.229:6610/zjhs/2/10121/index.m3u8?virtualDomain=zjhs.live_hls.zte.com
#EXTINF:-1 logo="" group-title="" ,爱玩具
http://101.71.255.229:6610/zjhs/2/10117/index.m3u8?virtualDomain=zjhs.live_hls.zte.com
#EXTINF:-1 logo="" group-title="" ,爱喜剧
http://101.71.255.229:6610/zjhs/2/10105/index.m3u8?virtualDomain=zjhs.live_hls.zte.com
#EXTINF:-1 logo="" group-title="" ,爱悬疑
http://101.71.255.229:6610/zjhs/2/10104/index.m3u8?virtualDomain=zjhs.live_hls.zte.com
#EXTINF:-1 logo="" group-title="" ,爱幼教
http://101.71.255.229:6610/zjhs/2/10112/index.m3u8?virtualDomain=zjhs.live_hls.zte.com
#EXTINF:-1 logo="" group-title="" ,爱院线
http://101.71.255.229:6610/zjhs/2/10116/index.m3u8?virtualDomain=zjhs.live_hls.zte.com
#EXTINF:-1 logo="" group-title="" ,爱青春
http://112.17.40.140/hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221230130/index.m3u8
#EXTINF:-1 logo="" group-title="" ,爱家庭
http://112.17.40.140/hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221230118/index.m3u8
#EXTINF:-1 logo="" group-title="" ,爱探索
http://112.17.40.140/hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221230112/index.m3u8
#EXTINF:-1 logo="" group-title="" ,爱科学
http://112.17.40.140/hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221230106/index.m3u8
#EXTINF:-1 logo="" group-title="" ,爱猎奇
http://112.17.40.140/hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221230097/index.m3u8
#EXTINF:-1 logo="" group-title="" ,爱谍战
http://112.17.40.140/hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221230092/index.m3u8
#EXTINF:-1 logo="" group-title="" ,爱娱乐
http://112.17.40.140/hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221230077/index.m3u8
#EXTINF:-1 logo="" group-title="" ,爱旅行
http://112.17.40.140/hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221230052/index.m3u8
#EXTINF:-1 logo="" group-title="" ,爱怀旧
http://112.17.40.140/hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221230049/index.m3u8
#EXTINF:-1 logo="" group-title="" ,爱体育
http://112.17.40.140/hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221230034/index.m3u8
#EXTINF:-1 logo="" group-title="" ,爱赛车
http://112.17.40.140/hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221230032/index.m3u8
#EXTINF:-1 logo="" group-title="" ,爱浪漫
http://112.17.40.140/hwltc.tv.cdn.zj.chinamobile.com/PLTV/88888888/224/3221230005/index.m3u8?fmt=ts2hls
#EXTINF:-1 logo="" group-title="" ,票房大片
http://101.72.196.41/r/baiducdnct.inter.iqiyi.com/tslive/c16_lb_heibangdianying_1080p_t10/c16_lb_heibangdianying_1080p_t10.m3u8
#EXTINF:-1 logo="" group-title="" ,惊悚午夜
http://101.72.196.41/r/baiducdnct.inter.iqiyi.com/tslive/c16_lb_jingnawuyechang_1080p_t10/c16_lb_jingnawuyechang_1080p_t10.m3u8
#EXTINF:-1 logo="" group-title="" ,动画电影
http://101.72.196.41/r/baiducdnct.inter.iqiyi.com/tslive/c16_lb_donghuadianying_1080p_t10/c16_lb_donghuadianying_1080p_t10.m3u8
#EXTINF:-1 logo="" group-title="" ,怀旧剧场
http://101.72.196.41/r/baiducdnct.inter.iqiyi.com/tslive/c16_lb_huaijiujuchang_1080p_t10/c16_lb_huaijiujuchang_1080p_t10.m3u8
#EXTINF:-1 logo="" group-title="" ,温情影院
http://101.72.196.41/r/baiducdnct.inter.iqiyi.com/tslive/c15_lb_chenglong_1080p_t10/c15_lb_chenglong_1080p_t10.m3u8
#EXTINF:-1 logo="" group-title="" ,周末影院
http://101.72.196.41/r/baiducdnct.inter.iqiyi.com/tslive/c16_lb_fengxiaogang_1080p_t10/c16_lb_fengxiaogang_1080p_t10.m3u8
#EXTINF:-1 logo="" group-title="" ,经典重温
http://101.72.196.41/r/baiducdnct.inter.iqiyi.com/tslive/c16_lb_jingdianjuchang_1080p_t10/c16_lb_jingdianjuchang_1080p_t10.m3u8
#EXTINF:-1 logo="" group-title="" ,谍战剧场
http://101.72.196.41/r/baiducdnct.inter.iqiyi.com/tslive/c16_lb_diezhanjuchang_1080p_t10/c16_lb_diezhanjuchang_1080p_t10.m3u8
#EXTINF:-1 logo="" group-title="" ,军旅剧场
http://101.72.196.41/r/baiducdnct.inter.iqiyi.com/tslive/c16_lb_junlvjuchang_1080p_t10/c16_lb_junlvjuchang_1080p_t10.m3u8
#EXTINF:-1 logo="" group-title="" ,青春剧场
http://101.72.196.41/r/baiducdnct.inter.iqiyi.com/tslive/c15_lb_weizhangzhe_1080p_t10/c15_lb_weizhangzhe_1080p_t10.m3u8
#EXTINF:-1 logo="" group-title="" ,抗战剧场
http://101.72.196.41/r/baiducdnct.inter.iqiyi.com/tslive/c15_lb_kangzhanjuchang_1080p_t10/c15_lb_kangzhanjuchang_1080p_t10.m3u8
#EXTINF:-1 logo="" group-title="" ,侦探柯南
http://jvc.flashapp.cn/baiducdnct.inter.iqiyi.com/tslive/c20_lb_mingzhentankenan_720p_t10/c20_lb_mingzhentankenan_720p_t10.m3u8
#EXTINF:-1 logo="" group-title="" ,喜羊灰狼
http://101.72.196.41/r/baiducdnct.inter.iqiyi.com/tslive/c15_lb_xiyangyang_1080p_t10/c15_lb_xiyangyang_1080p_t10.m3u8
#EXTINF:-1 logo="" group-title="" ,儿子爸爸
http://101.72.196.41/r/baiducdnct.inter.iqiyi.com/tslive/c16_lb_datouerzi_1080p_t10/c16_lb_datouerzi_1080p_t10.m3u8
#EXTINF:-1 logo="" group-title="" ,儿歌大全
http://101.72.196.41/r/baiducdnct.inter.iqiyi.com/tslive/c15_lb_ergedaquan_1080p_t10/c15_lb_ergedaquan_1080p_t10.m3u8
#EXTINF:-1 logo="" group-title="" ,北京少儿
http://ivi.bupt.edu.cn/hls/btv10.m3u8
#EXTINF:-1 logo="" group-title="" ,动漫电影
http://112.17.40.140/PLTV/88888888/224/3221226178/index.m3u8
#EXTINF:-1 logo="" group-title="" ,云南少儿
http://edge2.yntv.cn/channels/yntv/ynse/flv:sd/live
#EXTINF:-1 logo="" group-title="" ,重庆少儿
http://219.153.252.50/PLTV/88888888/224/3221225646/1.m3u8
#EXTINF:-1 logo="" group-title="" ,嘉佳卡通
http://112.17.40.140/PLTV/88888888/224/3221226461/index.m3u8
#EXTINF:-1 logo="" group-title="" ,金鹰卡通
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225906/1.m3u8
#EXTINF:-1 logo="" group-title="" ,哈哈卡通
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225909/1.m3u8
#EXTINF:-1 logo="" group-title="" ,优漫卡通
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225910/1.m3u8
#EXTINF:-1 logo="" group-title="" ,卡酷少儿
http://111.13.111.242/otttv.bj.chinamobile.com/PLTV/88888888/224/3221225907/1.m3u8
#EXTINF:-1 logo="" group-title="" ,企鹅辅导一年级
http://live-edu.wasu.tv/live/QiEFuDao-lv1.m3u8
#EXTINF:-1 logo="" group-title="" ,企鹅辅导二年级
http://live-edu.wasu.tv/live/QiEFuDao-lv2.m3u8
#EXTINF:-1 logo="" group-title="" ,企鹅辅导三年级
http://live-edu.wasu.tv/live/QiEFuDao-lv3.m3u8
#EXTINF:-1 logo="" group-title="" ,企鹅辅导四年级
http://live-edu.wasu.tv/live/QiEFuDao-lv4.m3u8
#EXTINF:-1 logo="" group-title="" ,企鹅辅导五年级
http://live-edu.wasu.tv/live/QiEFuDao-lv5.m3u8
#EXTINF:-1 logo="" group-title="" ,企鹅辅导六年级
http://live-edu.wasu.tv/live/QiEFuDao-lv6.m3u8
#EXTINF:-1 logo="" group-title="" ,企鹅辅导初一
http://live-edu.wasu.tv/live/QiEFuDao-lv7.m3u8
#EXTINF:-1 logo="" group-title="" ,企鹅辅导初二
http://live-edu.wasu.tv/live/QiEFuDao-lv8.m3u8
#EXTINF:-1 logo="" group-title="" ,企鹅辅导初三
http://live-edu.wasu.tv/live/QiEFuDao-lv9.m3u8
#EXTINF:-1 logo="" group-title="" ,企鹅辅导高一
http://live-edu.wasu.tv/live/QiEFuDao-lv10.m3u8
#EXTINF:-1 logo="" group-title="" ,八大精彩台
http://hdtv.ub1818.com/ublive/index_1.m3u8
#EXTINF:-1 logo="" group-title="" ,民视第一台
http://hdtv.ub1818.com/ublive/index_2.m3u8
#EXTINF:-1 logo="" group-title="" ,民视台湾台
http://hdtv.ub1818.com/ublive/index_3.m3u8
#EXTINF:-1 logo="" group-title="" ,民视HD
http://hdtv.ub1818.com/ublive/index_4.m3u8
#EXTINF:-1 logo="" group-title="" ,TvbsHD
http://hdtv.ub1818.com/ublive/index_5.m3u8
#EXTINF:-1 logo="" group-title="" ,非凡新闻HD
http://hdtv.ub1818.com/ublive/index_8.m3u8
#EXTINF:-1 logo="" group-title="" ,中视新闻HD
http://hdtv.ub1818.com/ublive/index_9.m3u8
#EXTINF:-1 logo="" group-title="" ,华视新闻资讯HD
http://hdtv.ub1818.com/ublive/index_10.m3u8
#EXTINF:-1 logo="" group-title="" ,FTV综艺
http://hdtv.ub1818.com/ublive/index_11.m3u8
#EXTINF:-1 logo="" group-title="" ,八大综合台
http://hdtv.ub1818.com/ublive/index_12.m3u8
#EXTINF:-1 logo="" group-title="" ,ELTA娱乐
http://hdtv.ub1818.com/ublive/index_13.m3u8
#EXTINF:-1 logo="" group-title="" ,亮社
http://hdtv.ub1818.com/ublive/index_14.m3u8
#EXTINF:-1 logo="" group-title="" ,华视CTS
http://hdtv.ub1818.com/ublive/index_15.m3u8
#EXTINF:-1 logo="" group-title="" ,公视戏剧
http://hdtv.ub1818.com/ublive/index_16.m3u8
#EXTINF:-1 logo="" group-title="" ,动漫
http://hdtv.ub1818.com/ublive/index_17.m3u8
#EXTINF:-1 logo="" group-title="" ,靖洋卡通台
http://hdtv.ub1818.com/ublive/index_18.m3u8
#EXTINF:-1 logo="" group-title="" ,靖天综合台
http://hdtv.ub1818.com/ublive/index_19.m3u8
#EXTINF:-1 logo="" group-title="" ,靖天日本台
http://hdtv.ub1818.com/ublive/index_20.m3u8
#EXTINF:-1 logo="" group-title="" ,靖天卡通台
http://hdtv.ub1818.com/ublive/index_21.m3u8
#EXTINF:-1 logo="" group-title="" ,靖天戏剧台
http://hdtv.ub1818.com/ublive/index_22.m3u8
#EXTINF:-1 logo="" group-title="" ,靖天电影台
http://hdtv.ub1818.com/ublive/index_23.m3u8
#EXTINF:-1 logo="" group-title="" ,靖天音乐台
http://hdtv.ub1818.com/ublive/index_24.m3u8
#EXTINF:-1 logo="" group-title="" ,靖天国际台
http://hdtv.ub1818.com/ublive/index_25.m3u8
#EXTINF:-1 logo="" group-title="" ,靖天映画
http://hdtv.ub1818.com/ublive/index_26.m3u8
#EXTINF:-1 logo="" group-title="" ,台湾采昌
http://hdtv.ub1818.com/ublive/index_27.m3u8
#EXTINF:-1 logo="" group-title="" ,台湾影迷电影
http://hdtv.ub1818.com/ublive/index_28.m3u8
#EXTINF:-1 logo="" group-title="" ,台湾CNEX
http://hdtv.ub1818.com/ublive/index_29.m3u8
#EXTINF:-1 logo="" group-title="" ,台湾AMC电影
http://hdtv.ub1818.com/ublive/index_30.m3u8
#EXTINF:-1 logo="" group-title="" ,靖天资讯台
http://hdtv.ub1818.com/ublive/index_31.m3u8
#EXTINF:-1 logo="" group-title="" ,靖天欢乐台
http://hdtv.ub1818.com/ublive/index_32.m3u8
#EXTINF:-1 logo="" group-title="" ,靖洋戏剧台
http://hdtv.ub1818.com/ublive/index_33.m3u8
#EXTINF:-1 logo="" group-title="" ,台湾音乐
http://hdtv.ub1818.com/ublive/index_34.m3u8
#EXTINF:-1 logo="" group-title="" ,韩国娱乐台
http://hdtv.ub1818.com/ublive/index_35.m3u8
#EXTINF:-1 logo="" group-title="" ,旅游频道
http://hdtv.ub1818.com/ublive/index_36.m3u8
#EXTINF:-1 logo="" group-title="" ,户外频道
http://hdtv.ub1818.com/ublive/index_37.m3u8
#EXTINF:-1 logo="" group-title="" ,台视财经HD
http://hdtv.ub1818.com/ublive/index_38.m3u8
#EXTINF:-1 logo="" group-title="" ,TRACE体育
http://hdtv.ub1818.com/ublive/index_39.m3u8
#EXTINF:-1 logo="" group-title="" ,TVB明珠
http://116.199.5.52:8114/00000000/index.m3u8?&Fsv_ctype=LIVES&Fsv_otype=1&FvSeid=5abd1660af1babb4&Pcontent_id=&Provider_id=&Fsv_chan_hls_se_idx=12
#EXTINF:-1 logo="" group-title="" ,香港卫视
http://zhibo.hkstv.tv/livestream/mutfysrq.flv
#EXTINF:-1 logo="" group-title="" ,翡翠明珠
http://116.199.5.52:8114/00000000/index.m3u8?&Fsv_ctype=LIVES&Fsv_otype=1&FvSeid=5abd1660af1babb4&Fsv_filetype=1&Fsv_ctype=LIVES&Fsv_cid=0&Fsv_chan_hls_se_idx=12&Fsv_rate_id=0&Fsv_SV_PARAM1=0&Fsv_ShiftEnable=0&Fsv_ShiftTsp=0&Provider_id=&Pcontent_id=&Fsv_CMSID=&Fsv_otype=1
#EXTINF:-1 logo="" group-title="" ,翡翠综合
http://116.199.5.52:8114/00000000/index.m3u8?&Fsv_ctype=LIVES&Fsv_otype=1&FvSeid=5abd1660af1babb4&Fsv_filetype=1&Fsv_ctype=LIVES&Fsv_cid=0&Fsv_chan_hls_se_idx=188&Fsv_rate_id=0&Fsv_SV_PARAM1=0&Fsv_ShiftEnable=0&Fsv_ShiftTsp=0&Provider_id=&Pcontent_id=&Fsv&_res_tag_=video
#EXTINF:-1 logo="" group-title="" ,耀才财经
http://202.69.67.66:443/webcast/bshdlive-mobile/playlist.m3u8
#EXTINF:-1 logo="" group-title="" ,亚旅卫视
http://hls.jingchangkan.tv/jingchangkan/156722438_0HaM/index.m3u8
#EXTINF:-1 logo="" group-title="" ,赛马频道
http://tvbilive11-i.akamaihd.net/hls/live/494672/CH88/CH88-01.m3u8
#EXTINF:-1 logo="" group-title="" ,東森新聞
http://104.250.154.42:8080/ZZ_dongsenxinwen/ZZ_dongsenxinwen.m3u8
#EXTINF:-1 logo="" group-title="" ,東森電影
http://104.250.154.42:8080/ZZ_dongsendianying/ZZ_dongsendianying.m3u8
#EXTINF:-1 logo="" group-title="" ,東森洋片
http://192.154.103.75:8080/ZZ_dongsenyangpian/ZZ_dongsenyangpian.m3u8
#EXTINF:-1 logo="" group-title="" ,東森洋片
http://104.250.154.42:8080/ZZ_dongsenyangpian/ZZ_dongsenyangpian.m3u8
#EXTINF:-1 logo="" group-title="" ,中天新闻
http://104.250.154.42:8080/ZZ_zhongtiannews/ZZ_zhongtiannews.m3u8
#EXTINF:-1 logo="" group-title="" ,中天综合
http://104.250.154.42:8080/ZZ_zhongtianzonghe/ZZ_zhongtianzonghe.m3u8
#EXTINF:-1 logo="" group-title="" ,中天綜合
http://192.154.103.75:8080//ZZ_zhongtianzonghe/ZZ_zhongtianzonghe.m3u8
#EXTINF:-1 logo="" group-title="" ,中天娱乐
http://192.154.103.75:8080//ZZ_zhongtianyule/ZZ_zhongtianyule.m3u8
#EXTINF:-1 logo="" group-title="" ,中天娱乐
http://104.250.154.42:8080/ZZ_zhongtianyule/ZZ_zhongtianyule.m3u8
#EXTINF:-1 logo="" group-title="" ,中視综合
http://192.154.103.75:8080//ZZ_zhongshi/ZZ_zhongshi.m3u8
#EXTINF:-1 logo="" group-title="" ,中视综合
http://104.250.154.42:8080/ZZ_zhongshi/ZZ_zhongshi.m3u8
#EXTINF:-1 logo="" group-title="" ,华视综合
http://104.250.154.42:8080/ZZ_huashi/ZZ_huashi.m3u8
#EXTINF:-1 logo="" group-title="" ,华视综合
http://192.154.103.75:8080//ZZ_huashi/ZZ_huashi.m3u8
#EXTINF:-1 logo="" group-title="" ,年代新聞
http://192.154.103.75:8080/ZZ_niandaixinwen/ZZ_niandianxinwen.m3u8
#EXTINF:-1 logo="" group-title="" ,年代新闻
http://104.250.154.42:8080/ZZ_niandaixinwen/ZZ_niandianxinwen.m3u8
#EXTINF:-1 logo="" group-title="" ,八大綜合
http://192.154.103.75:8080//ZZ_zhongtianyazhou/ZZ_zhongtianyazhou.m3u8
#EXTINF:-1 logo="" group-title="" ,八大综合
http://104.250.154.42:8080/ZZ_zhongtianyazhou/ZZ_zhongtianyazhou.m3u8
#EXTINF:-1 logo="" group-title="" ,信吉电视
http://220.130.241.203:1935/sjtv/livestream_360p/playlist.m3u8
#EXTINF:-1 logo="" group-title="" ,人間衛視
http://54.64.23.79:1935/live/vod/playlist.m3u8
#EXTINF:-1 logo="" group-title="" ,唯心電視
http://mobile.ccdntech.com/transcoder/_definst_/vod164_Live/live/chunklist_w1177047531.m3u8
#EXTINF:-1 logo="" group-title="" ,卫视卡视
http://iliketot.dyndns.tv/c8233976dbba4a06a101780907447375.m3u8?&wmsAuthSign=c2VydmVyX3RpbWU9MTAvMjIvMjAxNyAxOjM2OjExIEFNJmhhc2hfdmFsdWU9T1lvZDZ5TjFaWk53M3J4OWZOTWtFUT09JnZhbGlkbWludXRlcz0yJmlkPW1jZ2x5bWFyfDc2MXxpcHR2aGVyb3wxNTA4NjM2MTcxfDIyMy4yMDUuMTIyLjE2Nw
#EXTINF:-1 logo="" group-title="" ,国家地理
http://104.250.154.42:8080/ZZ_hbo/ZZ_hbo.m3u8
#EXTINF:-1 logo="" group-title="" ,百事通台
http://112.17.40.145/PLTV/88888888/224/3221226596/index.m3u8
#EXTINF:-1 logo="" group-title="" ,MTV音乐
http://116.199.5.52:8114/00000000/index.m3u8?&Fsv_ctype=LIVES&Fsv_otype=1&FvSeid=5abd1660af1babb4&Fsv_filetype=1&Fsv_ctype=LIVES&Fsv_cid=0&Fsv_chan_hls_se_idx=202&Fsv_rate_id=0&Fsv_SV_PARAM1=0&Fsv_ShiftEnable=0&Fsv_ShiftTsp=0&Provider_id=&Pcontent_id=&Fsv_CMSID=&Fsv_otype=1
#EXTINF:-1 logo="" group-title="" ,HBO2台
http://161.0.157.5/PLTV/88888888/224/3221227026/03.m3u8fluxustv.m3u8
#EXTINF:-1 logo="" group-title="" ,动物星球
http://104.250.154.42:8080/ZZ_dongwuxingqiu/ZZ_dongwuxingqiu.m3u8
#EXTINF:-1 logo="" group-title="" ,歐美影院
http://101.71.255.229:6610/zjhs/2/10037/z.m3u8?ZTEUPSTREAM=1&IASHttpSessionId=SLB4328320190321203540013412&m3u8_level=2&ztecid=10037&virtualDomain=zjhs.live_hls.zte.com&ispcode=3&tid=Q894B3E8EEZ3T19UG09L8B03GSWB&ts=1553493266
#EXTINF:-1 logo="" group-title="" ,亞洲影院
http://101.71.255.229:6610/zjhs/2/10052/z.m3u8?ZTEUPSTREAM=1&IASHttpSessionId=SLB4328320190321203540013412&m3u8_level=2&ztecid=10052&virtualDomain=zjhs.live_hls.zte.com&ispcode=3&tid=C3V7K4ET1VFDUJY6C1IASRV55G66&ts=1553493153
#EXTINF:-1 logo="" group-title="" ,华纳电视
http://104.250.154.42:8080/ZZ_huanadianying/ZZ_huanadianying.m3u8
#EXTINF:-1 logo="" group-title="" ,福克斯动作
http://104.250.154.42:8080/ZZ_foxaction/ZZ_foxaction.m3u8
#EXTINF:-1 logo="" group-title="" ,福克斯动作
http://192.154.103.75:8080/ZZ_foxaction/ZZ_foxaction.m3u8
#EXTINF:-1 logo="" group-title="" ,大众影视
http://39.134.52.206/wh7f454c46tw2522585283_-1736190513/hwottcdn.ln.chinamobile.com/PLTV/88888890/224/3221226752/index.m3u8?icpid=88888890&RTS=1575014274&from=1&ocs=2_39.134.52.206_80&hms_devid=835&vqe=3
#EXTINF:-1 logo="" group-title="" ,点掌财经
http://cclive2.aniu.tv/live/anzb.m3u8
#EXTINF:-1 logo="" group-title="" ,澳门卫视
http://stream.mastvnet.com/MSTV/SD/live.m3u8
#EXTINF:-1 logo="" group-title="" ,澳亚卫视
http://stream.mastvnet.com/MSTV/playlist.m3u8
#EXTINF:-1 logo="" group-title="" ,日本NHK华语
https://nhkw-zh-hlscomp.akamaized.net/ixxemlzk1vqvy44o/playlist.m3u8
#EXTINF:-1 logo="" group-title="" ,日本NHK英语
https://nhkwlive-ojp.akamaized.net/hls/live/2003459/nhkwlive-ojp/index_1M.m3u8
#EXTINF:-1 logo="" group-title="" ,日本Japan News 24
http://www.news24.jp/livestream/index.m3u8
#EXTINF:-1 logo="" group-title="" ,日本JapanetChannelDX
http://bcsecurelivehls-i.akamaihd.net/hls/live/265320/5043843989001/140130JTDX/index_1200.m3u8
#EXTINF:-1 logo="" group-title="" ,日本QVC
http://cdn-live1.qvc.jp/iPhone/800/800.m3u8
#EXTINF:-1 logo="" group-title="" ,韩国EBS 第一频道
http://ebsonairios.ebs.co.kr/groundwavetablet500k/tablet500k/playlist.m3u8
#EXTINF:-1 logo="" group-title="" ,韩国EBS 少儿频道
http://ebsonairios.ebs.co.kr/ebsutablet500k/tablet500k/playlist.m3u8
#EXTINF:-1 logo="" group-title="" ,韩国KCTV
http://119.77.96.184:1935/chn21/chn21/chunklist_w252131137.m3u8
#EXTINF:-1 logo="" group-title="" ,韩国UBC SBS
http://59.25.202.81:1935/live/UBCstream/chunklist_w1495115977.m3u8
#EXTINF:-1 logo="" group-title="" ,朝鲜中央台
http://119.77.96.184:1935/chn05/chn05/chunklist_w644291506.m3u8
#EXTINF:-1 logo="" group-title="" ,韩国KTV 韩国电视
http://218.38.152.31:1935/klive/klive.stream/playlist.m3u8
#EXTINF:-1 logo="" group-title="" ,韩国EBS 儿童频道
http://ebsonairios.ebs.co.kr/ebsutablet500k/_definst_/tablet500k/chunklist_w1965791004.m3u8
#EXTINF:-1 logo="" group-title="" ,韩国YTN 联合新闻
http://ytnmmd.mmdlive.lldns.net/ytnmmd/9484b70302db4786886ae40308bf45a1/chunklist_b2592000.m3u8
#EXTINF:-1 logo="" group-title="" ,韩国阿里郎WORLDworld
http://amdlive.ctnd.com.edgesuite.net/arirang_1ch/smil:arirang_1ch.smil/playlist.m3u8
#EXTINF:-1 logo="" group-title="" ,韩国阿里郎WORLD
http://amdlive.ctnd.com.edgesuite.net/arirang_1ch/smil:arirang_1ch/master.m3u8
#EXTINF:-1 logo="" group-title="" ,韩国MBC MAX
http://63.237.48.3/ios/MBC_MAX/MBC_MAX.m3u8
#EXTINF:-1 logo="" group-title="" ,KOREA YTN Science
http://slive.sciencetv.kr:1935/science/yslive_20140419_1/playlist.m3u8
#EXTINF:-1 logo="" group-title="" ,Luxury World
http://nano.teleservice.su:8080/hls/luxury.m3u8
#EXTINF:-1 logo="" group-title="" ,韩国BBS佛教广播
http://bbstv.clouducs.com:1935/bbstv-live/livestream/chunklist_w1403706733.m3u8
#EXTINF:-1 logo="" group-title="" ,CPAC
http://bcoveliveios-i.akamaihd.net/hls/live/248519/1242843915001_1/master.m3u8
#EXTINF:-1 logo="" group-title="" ,CGTN 记录频道
http://live.cgtn.com/1000d/prog_index.m3u8
#EXTINF:-1 logo="" group-title="" ,中国环球
http://live.cgtn.com/1000/prog_index.m3u8
#EXTINF:-1 logo="" group-title="" ,狗狗宠物
http://video.blivenyc.com/broadcast/prod/2061/22/file-3192k.m3u8
#EXTINF:-1 logo="" group-title="" ,法国时尚
http://lb.streaming.sk/fashiontv/stream/chunklist_w1702070444.m3u8
#EXTINF:-1 logo="" group-title="" ,亚洲新闻
http://d2e1asnsl7br7b.cloudfront.net/7782e205e72f43aeb4a48ec97f66ebbe/index_4.m3u8
#EXTINF:-1 logo="" group-title="" ,朝阳频道
http://d11h6a6nhl9kj9.cloudfront.net/hls/suriactv/master02.m3u8
#EXTINF:-1 logo="" group-title="" ,越南人民报
http://27.118.16.98:1935/live/truyenhinhnhandan720/chunklist_w2006762604.m3u8
#EXTINF:-1 logo="" group-title="" ,越南人民报
http://vietcago.net/vstv/thnd.m3u8
#EXTINF:-1 logo="" group-title="" ,印度音乐电视
http://104.237.60.234/live/gabruutv.m3u8?dsjtv.m3u8
#EXTINF:-1 logo="" group-title="" ,法国中国环球
http://live.cgtn.com/1000f/prog_index.m3u8
#EXTINF:-1 logo="" group-title="" ,法国第五世界台
http://v3plusinfo247hls-i.akamaihd.net/hls/live/218877-b/v3plusinfo247hls/v3plusinfo247hls_1_1.m3u8
#EXTINF:-1 logo="" group-title="" ,阿拉伯中国环球
http://live.cgtn.com/1000a/prog_index.m3u8
#EXTINF:-1 logo="" group-title="" ,俄罗斯中国环球
http://live.cgtn.com/1000r/prog_index.m3u8
#EXTINF:-1 logo="" group-title="" ,俄罗斯HD时尚频道
http://95.67.47.115/hls/hdfashion_ua_hi/index.m3u8
#EXTINF:-1 logo="" group-title="" ,乌克兰M2 音乐频道
http://live.m2.tv/hls3/stream.m3u8
#EXTINF:-1 logo="" group-title="" ,西班牙中国环球
http://livees.cgtn.com/1000e/prog_index.m3u8
#EXTINF:-1 logo="" group-title="" ,意大利Rai高清
http://b2everyrai-lh.akamaihd.net/i/raigulp_1@66350/master.m3u8
#EXTINF:-1 logo="" group-title="" ,意大利Rai 少儿
http://b2everyrai-lh.akamaihd.net/i/raiyoyo_1@191405/master.m3u8
#EXTINF:-1 logo="" group-title="" ,意大利Rai 电影
http://b2everyrai-lh.akamaihd.net/i/raimovie_1@67348/master.m3u8
#EXTINF:-1 logo="" group-title="" ,意大利意大利电台
http://radioitaliatv-lh.akamaihd.net/i/radioitaliatv_1@329645/index_720x480_av-p.m3u8
#EXTINF:-1 logo="" group-title="" ,意大利V2 音乐频道
http://de1se01.v2beat.live/playlist.m3u8
#EXTINF:-1 logo="" group-title="" ,墨西哥墨西哥电视
http://bcoveliveios-i.akamaihd.net/hls/live/201661/57828478001/milenio_center_512k@51752.m3u8
#EXTINF:-1 logo="" group-title="" ,音乐20TV
http://m2otv-lh.akamaihd.net/i/m2oTv_1@186074/index_600_av-p.m3u8
#EXTINF:-1 logo="" group-title="" ,当红MTV
http://unilivemtveu-lh.akamaihd.net/i/mtvno_1@346424/index_3500_av-b.m3u8
#EXTINF:-1 logo="" group-title="" ,WSVI-TV
http://dcunilive30-lh.akamaihd.net/i/dclive_1@534251/master.m3u8?fluxustv.m3u8
#EXTINF:-1 logo="" group-title="" ,酷酷频道
http://edge1.tikilive.com:1935/unrestricted_tikilive/25947/amlst:NWKlw6jwyXpz/chunklist_w981409619_b1105254.m3u8?fluxustv.m3u8
#EXTINF:-1 logo="" group-title="" ,红牛电视
http://rbmn-live.akamaized.net/hls/live/590964/BoRB-AT/master_1660.m3u8
#EXTINF:-1 logo="" group-title="" ,NBC电视
http://161.0.157.51/PLTV/88888888/224/3221227040/index.m3u8?fluxustv.m3u8
#EXTINF:-1 logo="" group-title="" ,Jewelry电视
http://wowzaprod134-i.akamaihd.net/hls/live/577814/ccddaf02/playlist.m3u8
#EXTINF:-1 logo="" group-title="" ,Darcizzle电视
http://30a-tv.com/darcizzle.m3u8
#EXTINF:-1 logo="" group-title="" ,CBS新闻
http://cbsnewshd-lh.akamaihd.net/i/CBSNHD_7@199302/master.m3u8
#EXTINF:-1 logo="" group-title="" ,美国Deutsche Welle
http://dwstream4-lh.akamaihd.net/i/dwstream4_live@131329/master.m3u8
#EXTINF:-1 logo="" group-title="" ,美国360 North
http://wowzaprod3-i.akamaihd.net/hls/live/252236/2147483647_360north_247/playlist.m3u8
#EXTINF:-1 logo="" group-title="" ,美国Fox News Talk Radio
http://fnurtmp-f.akamaihd.net/i/FNRADIO_1@92141/master.m3u8
#EXTINF:-1 logo="" group-title="" ,日本NHK台
http://nhkwtvglobal-i.akamaihd.net/hls/live/263941/nhkwtvglobal/index_600.m3u8
#EXTINF:-1 logo="" group-title="" ,日本cgntv
http://cgntv-glive.ofsdelivery.net/live/_definst_/cgntv_jp/playlist.m3u8
#EXTINF:-1 logo="" group-title="" ,日本映画
http://192.240.127.34:1935/live/cs19.stream/playlist.m3u8
#EXTINF:-1 logo="" group-title="" ,日本Japanet Channel DX
http://bcsecurelivehls-i.akamaihd.net/hls/live/265320/5043843989001/140130JTDX/index_600.m3u8

View File

@@ -1,6 +1,6 @@
{
"name": "zy",
"version": "2.6.0",
"version": "2.6.9",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
@@ -17,52 +17,58 @@
},
"main": "background.js",
"dependencies": {
"axios": "^0.20.0",
"axios": "^0.21.0",
"cheerio": "^1.0.0-rc.3",
"child_process": "^1.0.2",
"core-js": "^3.6.5",
"core-js": "^3.8.0",
"cors": "^2.8.5",
"dexie": "^3.0.2",
"dexie": "^3.0.3",
"electron-localshortcut": "^3.2.1",
"electron-proxy-agent": "^1.2.0",
"electron-updater": "^4.3.5",
"element-ui": "^2.13.2",
"element-ui": "^2.14.1",
"express": "^4.17.1",
"fast-xml-parser": "^3.17.4",
"html2canvas": "^1.0.0-rc.7",
"iptv-playlist-parser": "^0.5.0",
"m3u": "0.0.2",
"m3u8-parser": "^4.5.0",
"memcached": "^2.2.2",
"modern-normalize": "^1.0.0",
"mousetrap": "^1.6.5",
"pinyin-match": "^1.1.1",
"qrcode.vue": "^1.7.0",
"randomstring": "^1.1.5",
"session": "^0.1.0",
"sortablejs": "^1.12.0",
"v-fit-columns": "^0.2.0",
"vue": "^2.6.12",
"vue-clickaway": "^2.2.2",
"vue-infinite-loading": "^2.4.5",
"vue-waterfall-plugin": "^1.1.0",
"vuedraggable": "^2.24.2",
"vuex": "^3.5.1",
"xgplayer": "^2.13.0",
"vuedraggable": "^2.24.3",
"vuex": "^3.6.0",
"xgplayer": "^2.13.2",
"xgplayer-hls.js": "^2.2.5"
},
"devDependencies": {
"@vue/cli-plugin-babel": "~4.4.0",
"@vue/cli-plugin-eslint": "~4.4.0",
"@vue/cli-plugin-vuex": "~4.4.0",
"@vue/cli-service": "~4.4.0",
"@vue/cli-plugin-babel": "~4.5.9",
"@vue/cli-plugin-eslint": "~4.5.9",
"@vue/cli-plugin-vuex": "~4.5.9",
"@vue/cli-service": "~4.5.9",
"@vue/eslint-config-standard": "^5.1.2",
"babel-eslint": "^10.1.0",
"babel-plugin-component": "^1.1.1",
"electron": "^10.1.4",
"electron-devtools-installer": "^3.1.0",
"eslint": "^6.7.2",
"eslint-plugin-import": "^2.20.2",
"electron": "^11.0.3",
"electron-devtools-installer": "^3.1.1",
"eslint": "^7.14.0",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^4.2.1",
"eslint-plugin-standard": "^4.0.0",
"eslint-plugin-vue": "^6.2.2",
"sass": "^1.26.5",
"sass-loader": "^8.0.2",
"vue-cli-plugin-electron-builder": "2.0.0-rc.4",
"eslint-plugin-standard": "^4.1.0",
"eslint-plugin-vue": "^7.1.0",
"sass": "^1.29.0",
"sass-loader": "^10.1.0",
"vue-cli-plugin-electron-builder": "2.0.0-rc.5",
"vue-template-compiler": "^2.6.12"
}
}

View File

@@ -5,12 +5,12 @@
<Frame />
<Film v-show="view === 'Film'" />
<Play v-show="view === 'Play'" />
<IPTV v-show="view === 'IPTV'" />
<Star v-show="view === 'Star'" />
<History v-show="view === 'History'" />
<Setting v-show="view === 'Setting'" />
<IPTV v-show="view === 'IPTV'" />
<EditSites v-if="view === 'EditSites'"/>
<Recommandation v-show="view === 'Recommandation'" />
<Recommendation v-show="view === 'Recommendation'" />
</div>
<transition name="slide">
<Detail v-if="detail.show"/>
@@ -45,8 +45,8 @@ export default {
editSites () {
return this.$store.getters.getEditSites
},
recommandation () {
return this.$store.getters.recommandation
recommendation () {
return this.$store.getters.recommendation
}
},
watch: {

View File

@@ -95,94 +95,6 @@
text-indent: 10px;
}
}
.zy-highlighted{
color: var(--highlight-color);
}
// table
.zy-table{
display: flex;
flex-direction: column;
height: 100%;
font-size: 15px;
.tHeader{
display: flex;
align-items: center;
justify-content: space-between;
height: 50px;
min-height: 50px;
width: 100%;
border-bottom: 1px solid;
.btn{
user-select: none;
margin-left: 15px;
margin-right: 15px;
cursor: pointer;
font-size: 14px;
}
}
.tBody{
flex: 1;
border-bottom: 1px solid;
overflow: auto;
.el-table__row td{
border: none;
}
.el-table::before{
height: 0px;
}
ul{
list-style: none;
padding: 0;
margin: 0;
li{
display: flex;
justify-content: flex-start;
align-items: center;
flex-direction: row;
height: 50px;
border-bottom: 1px solid;
cursor: pointer;
span{
display: flex;
font-size: 13px;
height: 50px;
line-height: 50px;
overflow: hidden;
margin-right: 5px;
&.name{
flex: 1;
min-width: 100px;
overflow: hidden;
margin-left: 10px;
}
&.type{
width: 10%;
}
&.time{
width: 10%;
}
&.last{
width: 10%;
}
&.site{
width: 10%;
}
&.note{
width: 10%;
}
&.info{
width: 10%;
}
&.operate{
.btn{
width: 40px;
}
}
}
}
}
}
}
// scroll
.zy-scroll{
&::-webkit-scrollbar{
@@ -211,7 +123,7 @@
border-radius: 5px;
display: flex;
flex-direction: column;
.listpage-header{
.listpage-header, .toolbar{
height: 60px;
width: 100%;
display: flex;
@@ -231,12 +143,67 @@
cursor: pointer;
}
}
.el-autocomplete{
.el-input-group__prepend{
border: none;
.el-select{
width: 100px;
.el-input, .el-input__inner{
width: 100%;
border: none;
}
}
}
.el-input .el-input__inner{
width: 200px;
}
.el-input-group__append{
border: none;
}
}
.is-loading:before {
background-color: none !important;
}
.el-input{
font-size: 1rem;
width: 200px;
}
.popper {
font-size: 1rem;;
border: none;
li {
font-size: 1rem;
border: none;
}
.el-select-dropdown__item.selected.hover{ //是上游的bug吗临时性修补
background-color: transparent;
}
}
> span{
.el-input-number{
width:120px;
.el-input{
width: 100px;
}
.el-input__inner{
padding-left: 5px;
padding-right: 5px;
width: 88px;
}
.el-input-number__increase, .el-input-number__decrease {
background-color: inherit;
border: none;
}
}
}
}
.el-divider{
.el-divider--horizontal{
margin: 12px 0;
}
}
.toolbar{
z-index: 5;
}
.listpage-body{
height: calc(100% - 60px);
@@ -283,6 +250,9 @@
position: absolute;
}
}
.disableExpand div.el-table__expand-icon{
display: none;
}
.el-input{
width: 200px;
}
@@ -306,6 +276,12 @@
.card{
border-radius: 6px;
overflow: hidden;
position: relative;
cursor: pointer;
transition: 0.2s;
&:hover {
top: -3px;
}
.img{
position: relative;
min-height: 40px;
@@ -328,6 +304,32 @@
text-align: center;
transform: rotate(45deg);
}
.site{
position: absolute;
top: 0%;
left: 0%;
width: 100%;
background-color: #111111aa;
color:#2f90b9;
height: 30px;
line-height: 30px;
font-size: 14px;
font-weight: bolder;
text-align: center;
}
.progress{
position: absolute;
bottom: 10%;
left: 0%;
width: 40%;
background-color: #111111aa;
color: #f8df70;
height: 30px;
line-height: 30px;
font-size: 14px;
font-weight: bolder;
text-align: left;
}
.update{
position: absolute;
top: 5%;
@@ -373,7 +375,6 @@
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
cursor: pointer;
}
.info{
display: flex;
@@ -391,119 +392,6 @@
}
}
// PictureView
.pictureView{
.body{
height: calc(100% - 40px);
display: flex;
position: relative;
overflow-y: auto;
&::-webkit-scrollbar{
width: 5px;
height: 1px;
}
&::-webkit-scrollbar-thumb {
border-radius: 10px;
position: absolute;
}
&::-webkit-scrollbar-track {
border-radius: 10px;
position: absolute;
}
.body-box{
height: 100%;
width: 100%;
}
.show-img{
height: 100%;
width: 100%;
padding: 10px;
.card{
border-radius: 6px;
overflow: hidden;
.img{
position: relative;
min-height: 40px;
img{
width: 100%;
height: auto;
cursor: pointer;
}
.rate{
position: absolute;
top: 5%;
right: -40%;
width: 100%;
background-color: #2f90b9;
color: #cdcdcd;
height: 30px;
line-height: 30px;
font-size: 14px;
text-align: center;
transform: rotate(45deg);
}
.update{
position: absolute;
top: 5%;
left: -40%;
width: 100%;
background-color: #68b88e;
color: #cdcdcd;
height: 30px;
line-height: 30px;
font-size: 14px;
text-align: center;
transform: rotate(-45deg);
}
.operate{
display: none;
position: absolute;
left: 0;
bottom: 0;
background-color: #111111aa;
width: 100%;
font-size: 13px;
.operate-wrap{
display: flex;
justify-content: space-between;
.o-play, .o-star, .o-share{
cursor: pointer;
display: inline-block;
width: 80px;
height: 36px;
text-align: center;
line-height: 36px;
color: #cdcdcd;
&:hover{
background-color: #111;
}
}
}
}
}
.name{
font-size: 16px;
padding: 10px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
cursor: pointer;
}
.info{
display: flex;
justify-content: space-between;
font-size: 12px;
padding: 10px;
}
&:hover{
.operate{
display: block;
}
}
}
}
}
}
// loading
.zy-loading{
width: 100%;
@@ -548,4 +436,4 @@
box-shadow: 0em -3em 0 0, 2em -2em 0 -1em, 3em 0 0 -1em, 2em 2em 0 -1em, 0 3em 0 -1em, -2em 2em 0 0, -3em 0em 0 0, -2em -2em 0 0.2em;
}
}
}
}

View File

@@ -1,6 +1,6 @@
:root{
// general
--highlight-color: #38dd77;
--highlight-color:#1677b3;
// light
--l-c-0: #823aa0;
--l-c-1: #823aa011;

View File

@@ -41,40 +41,6 @@
color: var(--d-fc-1);
}
}
.zy-checkbox{
color: var(--d-fc-1);
transition: all 0.3s cubic-bezier(.25,.8,.25,1);
}
.zy-table{
color: var(--d-fc-2);
.tHeader{
border-bottom-color: var(--d-c-3);
.btn{
&:hover{
color: var(--d-fc-3)
}
}
}
.tBody{
border-bottom-color: var(--d-c-3);
ul{
li{
border-bottom-color: var(--d-c-2);
transition: all 0.3s cubic-bezier(.25,.8,.25,1);
&:hover{
box-shadow: var(--d-bsc);
background-color: var(--d-bgc-2);
color: #fff;
}
span{
&.btn:hover{
color: var(--d-fc-3)
}
}
}
}
}
}
.zy-scroll{
&:hover{
&::-webkit-scrollbar-thumb {
@@ -173,6 +139,13 @@
.play{
background-color: var(--d-bgc-1);
box-shadow: var(--d-bsc);
.el-input{
input{
background-color: var(--d-bgc-1);
border: 1px solid var(--d-bgc-1);
color: var(--d-fc-2);
}
}
.title{
color: var(--d-fc-1);
.right {
@@ -241,6 +214,14 @@
}
}
}
.list-channels{
.btn{
color: var(--d-fc-1);
&:hover{
text-decoration:underline;
}
}
}
.list-history{
li{
.title{
@@ -338,32 +319,50 @@
// Page of list using table and picture
.listpage{
color: var(--d-fc-2);
.listpage-header{
border-bottom-color: var(--d-c-3);
.btn{
&:hover{
color: var(--d-fc-3)
}
.listpage-header, .toolbar{
border-bottom-color: var(--d-c-3);
.btn{
&:hover{
color: var(--d-fc-3)
}
.el-button{
background-color: var(--d-bgc-2);
}
.el-button{
background-color: var(--d-bgc-2);
color: var(--d-fc-2);
&:hover{
color: var(--d-fc-3)
}
}
.el-input{
input{
background-color: var(--d-bgc-1);
border: 1px solid var(--d-bgc-1);
color: var(--d-fc-2);
}
}
.el-input-group__prepend{
background-color: var(--d-bgc-1);
}
.popper {
color: var(--d-fc-1);
background-color: var(--d-bgc-1);
box-shadow: var(--d-bsc);
li {
color: var(--d-fc-1);
background-color: var(--d-bgc-1);
&:hover{
color: var(--d-fc-3)
}
}
.el-input{
input{
background-color: var(--d-bgc-1);
border: 1px solid var(--d-bgc-1);
color: var(--d-fc-2);
background-color: var(--d-bgc-2);
}
}
}
.popper__arrow, .popper__arrow::after{
border-bottom-color: var(--d-bgc-1);
}
}
.listpage-body{
color: var(--d-fc-1);
background-color: var(--d-bgc-1);
&:hover{
color: var(--d-fc-1);
background-color: var(--d-bgc-1);
&:hover{
&::-webkit-scrollbar-thumb {
box-shadow: var(--d-bsc-scroll);
background: var(--d-c-5);
@@ -373,8 +372,8 @@
background: var(--d-bgc-1);
}
}
/* 设置el-table的样式*/
.show-table{
/* 设置el-table的样式*/
.el-table{
color: var(--d-fc-1);
background-color: var(--d-bgc-1);

View File

@@ -24,6 +24,8 @@
}
}
.vs-input{
color: var(--g-fc-1);
background-color: var(--g-bgc-1);
input{
color: var(--g-fc-1);
&::-webkit-input-placeholder{
@@ -37,38 +39,6 @@
background-color: var(--g-bgc-1);
input{
color: var(--g-fc-1);
background-color: var(--g-bgc-1);
}
}
.zy-checkbox{
color: var(--g-fc-1);
}
.zy-table{
color: var(--g-fc-2);
.tHeader{
border-bottom-color: var(--g-c-3);
.btn{
&:hover{
color: var(--g-fc-3)
}
}
}
.tBody{
border-bottom-color: var(--g-c-3);
ul{
li{
border-bottom-color: var(--g-c-2);
transition: all 0.3s cubic-bezier(.25,.8,.25,1);
&:hover{
box-shadow: var(--g-bsc-hover);
}
span{
&.btn:hover{
color: var(--g-fc-3)
}
}
}
}
}
}
.zy-scroll{
@@ -169,6 +139,13 @@
.play{
background-color: var(--g-bgc-1);
box-shadow: var(--g-bsc);
.el-input{
input{
background-color: var(--g-bgc-1);
border: 1px solid var(--g-bgc-1);
color: var(--g-fc-2);
}
}
.title{
color: var(--g-fc-1);
.right {
@@ -237,6 +214,14 @@
}
}
}
.list-channels{
.btn{
color: var(--g-fc-1);
&:hover{
text-decoration:underline;
}
}
}
.list-history{
li{
.title{
@@ -330,30 +315,49 @@
background-color: var(--g-bgc-1);
box-shadow: var(--g-bsc);
}
// Page of list using table and picture
.listpage{
color: var(--g-fc-2);
.listpage-header{
border-bottom-color: var(--g-c-3);
.btn{
&:hover{
color: var(--g-fc-3)
}
.listpage-header, .toolbar{
border-bottom-color: var(--g-c-3);
.btn{
&:hover{
color: var(--g-fc-3)
}
.el-button{
background-color: var(--g-bgc-2);
}
.el-button{
background-color: var(--g-bgc-2);
color: var(--g-fc-2);
&:hover{
color: var(--g-fc-3)
}
}
.el-input{
input{
background-color: var(--g-bgc-1);
border: 1px solid var(--g-bgc-1);
color: var(--g-fc-2);
}
}
.el-input-group__prepend{
background-color: var(--g-bgc-1);
}
.popper {
color: var(--g-fc-1);
background-color: var(--g-bgc-1);
box-shadow: var(--g-bsc);
li {
color: var(--g-fc-1);
background-color: var(--g-bgc-1);
&:hover{
color: var(--g-fc-3)
}
}
.el-input{
input{
background-color: var(--g-bgc-1);
border: 1px solid var(--g-bgc-1);
color: var(--g-fc-2);
background-color: var(--g-bgc-2);
}
}
}
.popper__arrow, .popper__arrow::after{
border-bottom-color: var(--g-bgc-1);
}
}
.listpage-body{
color: var(--g-fc-1);
@@ -368,8 +372,8 @@
background: var(--g-bgc-1);
}
}
/* 设置el-table的样式*/
.show-table{
/* 设置el-table的样式*/
.el-table{
color: var(--g-fc-1);
background-color: var(--g-bgc-1);

View File

@@ -24,6 +24,8 @@
}
}
.vs-input{
color: var(--l-fc-1);
background-color: var(--l-bgc-1);
input{
color: var(--l-fc-1);
&::-webkit-input-placeholder{
@@ -37,38 +39,6 @@
background-color: var(--l-bgc-1);
input{
color: var(--l-fc-1);
background-color: var(--l-bgc-1);
}
}
.zy-checkbox{
color: var(--l-fc-1);
}
.zy-table{
color: var(--l-fc-2);
.tHeader{
border-bottom-color: var(--l-c-3);
.btn{
&:hover{
color: var(--l-fc-3)
}
}
}
.tBody{
border-bottom-color: var(--l-c-3);
ul{
li{
border-bottom-color: var(--l-c-2);
transition: all 0.3s cubic-bezier(.25,.8,.25,1);
&:hover{
box-shadow: var(--l-bsc-hover);
}
span{
&.btn:hover{
color: var(--l-fc-3)
}
}
}
}
}
}
.zy-scroll{
@@ -169,6 +139,13 @@
.play{
background-color: var(--l-bgc-1);
box-shadow: var(--l-bsc);
.el-input{
input{
background-color: var(--l-bgc-1);
border: 1px solid var(--l-bgc-1);
color: var(--l-fc-2);
}
}
.title{
color: var(--l-fc-1);
.right {
@@ -237,6 +214,14 @@
}
}
}
.list-channels{
.btn{
color: var(--l-fc-1);
&:hover{
text-decoration:underline;
}
}
}
.list-history{
li{
.title{
@@ -330,30 +315,49 @@
background-color: var(--l-bgc-1);
box-shadow: var(--l-bsc);
}
// Page of list using table and picture
.listpage{
color: var(--l-fc-2);
.listpage-header{
border-bottom-color: var(--l-c-3);
.btn{
&:hover{
color: var(--l-fc-3)
}
.listpage-header, .toolbar{
border-bottom-color: var(--l-c-3);
.btn{
&:hover{
color: var(--l-fc-3)
}
.el-button{
background-color: var(--l-bgc-2);
}
.el-button{
background-color: var(--l-bgc-2);
color: var(--l-fc-2);
&:hover{
color: var(--l-fc-3)
}
}
.el-input{
input{
background-color: var(--l-bgc-1);
border: 1px solid var(--l-bgc-1);
color: var(--l-fc-2);
}
}
.el-input-group__prepend{
background-color: var(--l-bgc-1);
}
.popper {
color: var(--l-fc-1);
background-color: var(--l-bgc-1);
box-shadow: var(--l-bsc);
li {
color: var(--l-fc-1);
background-color: var(--l-bgc-1);
&:hover{
color: var(--l-fc-3)
}
}
.el-input{
input{
background-color: var(--l-bgc-1);
border: 1px solid var(--l-bgc-1);
color: var(--l-fc-2);
background-color: var(--l-bgc-2);
}
}
}
.popper__arrow, .popper__arrow::after{
border-bottom-color: var(--l-bgc-1);
}
}
.listpage-body{
color: var(--l-fc-1);
@@ -368,8 +372,8 @@
background: var(--l-bgc-1);
}
}
/* 设置el-table的样式*/
.show-table{
/* 设置el-table的样式*/
.el-table{
color: var(--l-fc-1);
background-color: var(--l-bgc-1);

View File

@@ -24,6 +24,8 @@
}
}
.vs-input{
color: var(--p-fc-1);
background-color: var(--p-bgc-1);
input{
color: var(--p-fc-1);
&::-webkit-input-placeholder{
@@ -39,37 +41,6 @@
color: var(--p-fc-1);
}
}
.zy-checkbox{
color: var(--p-fc-1);
}
.zy-table{
color: var(--p-fc-2);
.tHeader{
border-bottom-color: var(--p-c-3);
.btn{
&:hover{
color: var(--p-fc-3)
}
}
}
.tBody{
border-bottom-color: var(--p-c-3);
ul{
li{
border-bottom-color: var(--p-c-2);
transition: all 0.3s cubic-bezier(.25,.8,.25,1);
&:hover{
box-shadow: var(--p-bsc-hover);
}
span{
&.btn:hover{
color: var(--p-fc-3)
}
}
}
}
}
}
.zy-scroll{
&:hover{
&::-webkit-scrollbar-thumb {
@@ -168,6 +139,13 @@
.play{
background-color: var(--p-bgc-1);
box-shadow: var(--p-bsc);
.el-input{
input{
background-color: var(--p-bgc-1);
border: 1px solid var(--p-bgc-1);
color: var(--p-fc-2);
}
}
.title{
color: var(--p-fc-1);
.right {
@@ -236,6 +214,14 @@
}
}
}
.list-channels{
.btn{
color: var(--p-fc-1);
&:hover{
text-decoration:underline;
}
}
}
.list-history{
li{
.title{
@@ -329,30 +315,49 @@
background-color: var(--p-bgc-1);
box-shadow: var(--p-bsc);
}
// Page of list using table and picture
.listpage{
color: var(--p-fc-2);
.listpage-header{
border-bottom-color: var(--p-c-3);
.btn{
&:hover{
color: var(--p-fc-3)
}
.listpage-header, .toolbar{
border-bottom-color: var(--p-c-3);
.btn{
&:hover{
color: var(--p-fc-3)
}
.el-button{
background-color: var(--p-bgc-2);
}
.el-button{
background-color: var(--p-bgc-2);
color: var(--p-fc-2);
&:hover{
color: var(--p-fc-3)
}
}
.el-input{
input{
background-color: var(--p-bgc-1);
border: 1px solid var(--p-bgc-1);
color: var(--p-fc-2);
}
}
.el-input-group__prepend{
background-color: var(--p-bgc-1);
}
.popper {
color: var(--p-fc-1);
background-color: var(--p-bgc-1);
box-shadow: var(--p-bsc);
li {
color: var(--p-fc-1);
background-color: var(--p-bgc-1);
&:hover{
color: var(--p-fc-3)
}
}
.el-input{
input{
background-color: var(--p-bgc-1);
border: 1px solid var(--p-bgc-1);
color: var(--p-fc-2);
background-color: var(--p-bgc-2);
}
}
}
.popper__arrow, .popper__arrow::after{
border-bottom-color: var(--p-bgc-1);
}
}
.listpage-body{
color: var(--p-fc-1);
@@ -367,8 +372,8 @@
background: var(--p-bgc-1);
}
}
/* 设置el-table的样式*/
.show-table{
/* 设置el-table的样式*/
.el-table{
color: var(--p-fc-1);
background-color: var(--p-bgc-1);

View File

@@ -1,7 +1,7 @@
'use strict'
import './lib/site/server'
import { app, protocol, BrowserWindow, globalShortcut, ipcMain } from 'electron'
import { app, protocol, BrowserWindow, globalShortcut } from 'electron'
import { createProtocol } from 'vue-cli-plugin-electron-builder/lib'
import installExtension, { VUEJS_DEVTOOLS } from 'electron-devtools-installer'
import { initUpdater } from './lib/update/update'
@@ -11,7 +11,6 @@ app.commandLine.appendSwitch('disable-features', 'OutOfBlinkCors') // 允许跨
// app.commandLine.appendSwitch('--ignore-certificate-errors', 'true') // 忽略证书相关错误
let win
let mini
protocol.registerSchemesAsPrivileged([{ scheme: 'app', privileges: { secure: true, standard: true } }])
@@ -43,35 +42,6 @@ function createWindow () {
})
}
function createMini () {
mini = new BrowserWindow({
width: 550,
miniWidth: 860,
height: 340,
miniHeight: 180,
frame: false,
resizable: true,
webPreferences: {
sandbox: false,
webSecurity: false,
enableRemoteModule: true,
nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION
}
})
if (process.env.WEBPACK_DEV_SERVER_URL) {
mini.loadURL(process.env.WEBPACK_DEV_SERVER_URL + 'mini')
if (!process.env.IS_TEST) mini.webContents.openDevTools()
} else {
createProtocol('app')
mini.loadURL('app://./mini.html')
}
mini.on('closed', () => {
mini = null
})
}
if (process.platform === 'darwin') {
app.dock.show()
}
@@ -91,17 +61,6 @@ app.on('activate', () => {
}
})
ipcMain.on('mini', () => {
createMini()
win.hide()
})
ipcMain.on('win', () => {
mini.destroy()
win.show()
win.webContents.send('miniClosed')
})
const gotTheLock = app.requestSingleInstanceLock()
if (!gotTheLock) {
app.quit()
@@ -125,9 +84,6 @@ if (!gotTheLock) {
if (win) {
win.isFocused() ? win.blur() : win.focus()
}
if (mini) {
mini.isFocused() ? mini.blur() : mini.focus()
}
})
})
}

View File

@@ -14,20 +14,13 @@
</g>
</svg>
</span>
<span :class="[view === 'Recommandation' ? 'active ': ''] + 'zy-svg'" @click="changeView('Recommandation')">
<span :class="[view === 'Recommendation' ? 'active ': ''] + 'zy-svg'" @click="changeView('Recommendation')">
<svg role="img" xmlns="http://www.w3.org/2000/svg" width="48px" height="48px" viewBox="0 0 24 24" aria-labelledby="thumbUpIconTitle" stroke="#2329D6" stroke-width="1" stroke-linecap="square" stroke-linejoin="miter" fill="none" color="#2329D6">
<title id="thumbUpIconTitle">影视推荐</title>
<path d="M8,8.73984815 C8,8.26242561 8.17078432,7.80075162 8.4814868,7.43826541 L13.2723931,1.84887469 C13.7000127,1.34998522 14.4122932,1.20614658 15,1.5 C15.5737957,1.78689785 15.849314,2.45205792 15.6464466,3.06066017 L14,8 L18.6035746,8 C18.7235578,8 18.8432976,8.01079693 18.9613454,8.03226018 C20.0480981,8.22985158 20.7689058,9.27101818 20.5713144,10.3577709 L19.2985871,17.3577709 C19.1256814,18.3087523 18.2974196,19 17.3308473,19 L10,19 C8.8954305,19 8,18.1045695 8,17 L8,8.73984815 Z"/>
<path d="M4,18 L4,9"/>
</svg>
</span>
<span :class="[view === 'IPTV' ? 'active ': ''] + 'zy-svg'" @click="changeView('IPTV')">
<svg role="img" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-labelledby="tvIconTitle">
<title id="tvIconTitle">电视直播</title>
<polygon points="20 8 20 20 4 20 4 8"></polygon>
<polyline stroke-linejoin="round" points="8 4 12 7.917 16 4"></polyline>
</svg>
</span>
<span :class="[view === 'Play' ? 'active ': ''] + 'zy-svg'" @click="changeView('Play')">
<svg role="img" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-labelledby="playIconTitle">
<title id="playIconTitle">播放</title>

View File

@@ -128,19 +128,6 @@ export default {
close () {
this.detail.show = false
},
m3u8Parse (e) {
const dd = e.dl.dd
const type = Object.prototype.toString.call(dd)
if (type === '[object Array]') {
for (const i of dd) {
if (i._flag.indexOf('m3u8') >= 0) {
this.m3u8List = i._t.split('#')
}
}
} else {
this.m3u8List = dd._t.split('#')
}
},
async playEvent (n) {
if (!this.playOnline) {
const db = await history.find({ site: this.detail.key, ids: this.detail.info.id })
@@ -149,12 +136,14 @@ export default {
} else {
this.video = { key: this.detail.key, info: { id: this.detail.info.id, name: this.detail.info.name, index: n, site: this.detail.site } }
}
this.video.detail = this.info
this.view = 'Play'
this.detail.show = false
} else {
const db = await history.find({ site: this.detail.key, ids: this.detail.info.id })
if (db) {
db.index = n
db.detail = this.info
history.update(db.id, db)
} else {
const doc = {
@@ -164,7 +153,8 @@ export default {
type: this.detail.info.type,
year: this.detail.info.year,
index: n,
time: ''
time: '',
detail: this.info
}
history.add(doc)
}
@@ -221,30 +211,29 @@ export default {
}
},
downloadEvent () {
zy.download(this.detail.key, this.info.id).then(res => {
if (res && res.dl && res.dl.dd) {
const text = res.dl.dd._t
if (text) {
const list = text.split('#')
let downloadUrl = res.name + '\n'
for (const i of list) {
const url = encodeURI(i.split('$')[1])
downloadUrl += (url + '\n')
}
clipboard.writeText(downloadUrl)
this.$message.success('『MP4』格式的链接已复制, 快去下载吧!')
} else {
this.$message.warning('没有查询到下载链接.')
}
} else {
const list = [...this.m3u8List]
let downloadUrl = this.detail.info.name + '\n'
const key = this.detail.key
const id = this.info.id
zy.download(key, id).then(res => {
if (res && res.m3u8List) {
const list = res.m3u8List.split('#')
let downloadUrl = ''
for (const i of list) {
const url = encodeURI(i.split('$')[1])
downloadUrl += (url + '\n')
}
clipboard.writeText(downloadUrl)
this.$message.success('『M3U8』格式的链接已复制, 快去下载吧!')
this.$message.success('『MP4』格式的链接已复制, 快去下载吧!')
} else {
zy.detail(key, id).then(res => {
const list = [...res.m3u8List]
let downloadUrl = ''
for (const i of list) {
const url = encodeURI(i.split('$')[1])
downloadUrl += (url + '\n')
}
clipboard.writeText(downloadUrl)
this.$message.success('『M3U8』格式的链接已复制, 快去下载吧!')
})
}
})
},
@@ -256,25 +245,9 @@ export default {
}
},
doubanLinkEvent () {
const open = require('open')
const axios = require('axios')
const cheerio = require('cheerio')
const name = this.detail.info.name.trim()
// 豆瓣搜索链接
var doubanSearchLink = 'https://www.douban.com/search?q=' + name
var link = doubanSearchLink
axios.get(doubanSearchLink).then(res => {
const $ = cheerio.load(res.data)
// 比较第一和第二豆瓣搜索结果, 如果名字相符, 就打开该链接,否则打开搜索页面
var nameInDouban = $($('div.result')[0]).find('div>div>h3>a').first()
if (name.replace(/\s/g, '') === nameInDouban.text().replace(/\s/g, '')) {
link = nameInDouban.attr('href')
} else {
nameInDouban = $($('div.result')[1]).find('div>div>h3>a').first()
if (name.replace(/\s/g, '') === nameInDouban.text().replace(/\s/g, '')) {
link = nameInDouban.attr('href')
}
}
zy.doubanLink(name).then(link => {
const open = require('open')
open(link)
})
},
@@ -290,7 +263,7 @@ export default {
if (res) {
this.info = res
this.$set(this.info, 'rate', '')
this.m3u8Parse(res)
this.m3u8List = res.m3u8List
this.getDoubanRate()
this.loading = false
}

View File

@@ -2,24 +2,26 @@
<div class="listpage" id="sites">
<div class="listpage-header" v-show="!enableBatchEdit">
<el-switch v-model="enableBatchEdit" active-text="批处理分组">></el-switch>
<el-checkbox v-model="setting.excludeR18Films" @change="excludeR18FilmsChangeEvent">屏蔽福利片</el-checkbox>
<el-button @click="addSite" icon="el-icon-document-add">新增</el-button>
<el-button @click="exportSites" icon="el-icon-upload2" >导出</el-button>
<el-button @click="importSites" icon="el-icon-download">导入</el-button>
<el-button @click="checkAllSite" icon="el-icon-refresh" :loading="checkAllSiteLoading">检测</el-button>
<el-button @click="removeAllSites" icon="el-icon-delete-solid">清空</el-button>
<el-button @click="checkAllSite" icon="el-icon-refresh" :loading="checkAllSitesLoading">检测{{ this.checkAllSitesLoading ? this.checkProgress + '/' + this.sites.length : '' }}</el-button>
<el-button @click="resetSitesEvent" icon="el-icon-refresh-left">重置</el-button>
</div>
<div class="listpage-header" v-show="enableBatchEdit">
<el-switch v-model="enableBatchEdit" active-text="批处理分组"></el-switch>
<el-input placeholder="新组名" v-model="batchGroupName"></el-input>
<el-switch v-model="batchIsActive" :active-value="1" :inactive-value="0" active-text="自选源"></el-switch>
<el-switch v-model="batchIsActive" active-text="启用"></el-switch>
<el-button type="primary" icon="el-icon-edit" @click.stop="saveBatchEdit">保存</el-button>
<el-button @click="removeSelectedSites" icon="el-icon-delete-solid">删除</el-button>
</div>
<div class="listpage-body" id="sites-body">
<div class="show-table" id="sites-table">
<el-table size="mini" fit height="100%" row-key="id"
ref="editSitesTable"
:data="sites"
@select="selectionCellClick"
@selection-change="handleSelectionChange"
@sort-change="handleSortChange">
<el-table-column
@@ -32,13 +34,14 @@
</el-table-column>
<el-table-column
prop="isActive"
label="自选源">
width="120"
:filters = "[{text:'启用', value: true}, {text:'停用', value: false}]"
:filter-method="(value, row) => value === row.isActive"
label="启用">
<template slot-scope="scope">
<el-switch
v-model="scope.row.isActive"
:active-value="1"
:inactive-value="0"
@change='isActiveChangeEvent'>
@click.native.stop='isActiveChangeEvent(scope.row)'>
</el-switch>
</template>
</el-table-column>
@@ -46,11 +49,8 @@
prop="group"
label="分组"
:filters="getFilters"
:filter-method="filterHandle"
:filter-method="(value, row) => value === row.group"
filter-placement="bottom-end">
<template slot-scope="scope">
<el-button type="text">{{scope.row.group}}</el-button>
</template>
</el-table-column>
<el-table-column
label="状态"
@@ -58,21 +58,23 @@
:sort-by="['status']"
width="120">
<template slot-scope="scope">
<span v-show="scope.row.status === ''">
<span v-if="scope.row.status === ' '">
<i class="el-icon-loading"></i>
检测中...
</span>
<span v-show="scope.row.status !== ''">{{scope.row.status}}</span>
<span v-else>{{scope.row.status}}</span>
</template>
</el-table-column>
<el-table-column
label="操作"
header-align="center"
align="right">
align="right"
:width="sites.every(site => site.status) && !checkAllSitesLoading ? 200 : 150">
<template slot-scope="scope">
<el-button size="mini" @click.stop="moveToTopEvent(scope.row)" type="text">置顶</el-button>
<el-button size="mini" @click.stop="editSite(scope.row)" type="text">编辑</el-button>
<el-button size="mini" @click.stop="checkSimpleSite(scope.row)" type="text">检测</el-button>
<!-- 检测时先强制批量检测一遍,如果不强制直接单个检测时第一次不会显示“检测中” -->
<el-button size="mini" v-if="sites.every(site => site.status)" v-show="!checkAllSitesLoading" @click.stop="checkSingleSite(scope.row)" type="text">检测</el-button>
<el-button size="mini" @click.stop="removeEvent(scope.row)" type="text">删除</el-button>
</template>
</el-table-column>
@@ -111,7 +113,7 @@
</template>
<script>
import { mapMutations } from 'vuex'
import { sites } from '../lib/dexie'
import { sites, setting } from '../lib/dexie'
import zy from '../lib/site/tools'
import { remote } from 'electron'
import { sites as defaultSites } from '../lib/dexie/initData'
@@ -132,7 +134,7 @@ export default {
api: '',
download: '',
group: '',
isActive: 1
isActive: true
},
siteGroup: [],
rules: {
@@ -141,18 +143,19 @@ export default {
],
api: [
{ required: true, message: 'API地址不能为空', trigger: 'blur' }
],
download: [
{ required: false, trigger: 'blur' }
]
},
enableBatchEdit: false,
batchGroupName: '',
batchIsActive: 1,
batchIsActive: true,
shiftDown: false,
selectionBegin: '',
selectionEnd: '',
multipleSelection: [],
tableKey: 1,
checkAllSiteLoading: false,
editeOldkey: ''
checkAllSitesLoading: false,
checkProgress: 0,
stopFlag: false,
editOldkey: ''
}
},
computed: {
@@ -164,14 +167,6 @@ export default {
this.SET_SETTING(val)
}
},
editSites: {
get () {
return this.$store.getters.getEditSites
},
set (val) {
this.SET_EDITSITES(val)
}
},
getFilters () {
const groups = [...new Set(this.sites.map(site => site.group))]
var filters = []
@@ -185,15 +180,48 @@ export default {
return filters
}
},
watch: {
enableBatchEdit () {
if (this.checkAllSitesLoading) {
this.$message.info('正在检测, 请勿操作.')
this.enableBatchEdit = false
}
}
},
methods: {
...mapMutations(['SET_SETTING', 'SET_EDITSITES']),
filterHandle (value, row) {
return row.group === value
...mapMutations(['SET_SETTING']),
excludeR18FilmsChangeEvent () {
setting.find().then(res => {
res.excludeR18Films = this.setting.excludeR18Films
setting.update(res)
})
},
selectionCellClick (selection, row) {
if (this.shiftDown && this.selectionBegin !== '' && selection.includes(row)) {
this.selectionEnd = row.id
const start = this.sites.findIndex(e => e.id === Math.min(this.selectionBegin, this.selectionEnd))
const end = this.sites.findIndex(e => e.id === Math.max(this.selectionBegin, this.selectionEnd))
const selections = this.sites.slice(start, end + 1)
this.$nextTick(() => {
selections.forEach(e => this.$refs.editSitesTable.toggleRowSelection(e, true))
})
this.selectionBegin = this.selectionEnd = ''
return
}
if (selection.includes(row)) {
this.selectionBegin = row.id
} else {
this.selectionBegin = ''
}
},
handleSelectionChange (rows) {
this.multipleSelection = rows
},
handleSortChange (column, prop, order) {
if (this.checkAllSitesLoading) {
this.$message.info('正在检测, 请勿操作.')
return false
}
this.updateDatabase(this.sites)
},
saveBatchEdit () {
@@ -208,13 +236,7 @@ export default {
getSites () {
sites.all().then(res => {
this.sites = res
this.editSites = {
sites: res
}
})
for (const i of this.sites) {
delete i.status
}
},
getSitesGroup () {
const arr = []
@@ -226,6 +248,10 @@ export default {
this.siteGroup = arr
},
addSite () {
if (this.checkAllSitesLoading) {
this.$message.info('正在检测, 请勿操作.')
return false
}
this.getSitesGroup()
this.dialogType = 'new'
this.dialogVisible = true
@@ -235,26 +261,26 @@ export default {
api: '',
download: '',
group: '',
isActive: 1
isActive: true
}
},
editSite (siteInfo) {
this.getSitesGroup()
if (this.checkAllSiteLoading) {
if (this.checkAllSitesLoading) {
this.$message.info('正在检测, 请勿操作.')
return false
}
this.getSitesGroup()
this.dialogType = 'edit'
this.dialogVisible = true
this.siteInfo = siteInfo
this.editeOldkey = siteInfo.key
this.editOldkey = siteInfo.key
},
closeDialog () {
this.dialogVisible = false
this.getSites()
},
removeEvent (e) {
if (this.checkAllSiteLoading) {
if (this.checkAllSitesLoading) {
this.$message.info('正在检测, 请勿操作.')
return false
}
@@ -264,19 +290,8 @@ export default {
this.$message.warning('删除源失败, 错误信息: ' + err)
})
},
listUpdatedEvent () {
sites.clear().then(res1 => {
// 重新排序
var id = 1
this.sites.forEach(element => {
element.id = id
sites.add(element)
id += 1
})
})
},
checkSiteKey (e) {
if (this.dialogType === 'edit' && this.editeOldkey === this.siteInfo.key) {
if (this.dialogType === 'edit' && this.editOldkey === this.siteInfo.key) {
return true
} else {
for (const i of this.sites) {
@@ -299,7 +314,7 @@ export default {
var randomstring = require('randomstring')
var doc = {
key: this.dialogType === 'edit' ? this.siteInfo.key : this.siteInfo.key ? this.siteInfo.key : randomstring.generate(6),
id: this.dialogType === 'edit' ? this.siteInfo.id : this.sites[this.sites.length - 1].id + 1,
id: this.dialogType === 'edit' ? this.siteInfo.id : this.sites.length ? this.sites[this.sites.length - 1].id + 1 : 1,
name: this.siteInfo.name,
api: this.siteInfo.api,
download: this.siteInfo.download,
@@ -319,7 +334,7 @@ export default {
this.dialogVisible = false
this.getSites()
})
this.editeOldkey = ''
this.editOldkey = ''
},
exportSites () {
this.getSites()
@@ -342,6 +357,10 @@ export default {
})
},
importSites () {
if (this.checkAllSitesLoading) {
this.$message.info('正在检测, 请勿操作.')
return false
}
const options = {
filters: [
{ name: 'JSON file', extensions: ['json'] },
@@ -359,7 +378,7 @@ export default {
if (ele.api && this.sites.filter(x => x.key === ele.key).length === 0 && this.sites.filter(x => x.name === ele.name && x.api === ele.api).length === 0) {
// 不含该key 同时也不含名字和url一样的
if (ele.isActive === undefined) {
ele.isActive = 1
ele.isActive = true
}
if (ele.group === undefined) {
ele.group = '导入'
@@ -376,11 +395,16 @@ export default {
})
},
resetSitesEvent () {
this.stopFlag = true
if (this.checkAllSitesLoading) {
this.$message.info('部分检测还未完全终止, 请稍等...')
return
}
sites.clear().then(sites.bulkAdd(defaultSites).then(this.getSites()))
this.$message.success('重置源成功')
},
moveToTopEvent (i) {
if (this.checkAllSiteLoading) {
if (this.checkAllSitesLoading) {
this.$message.info('正在检测, 请勿操作.')
return false
}
@@ -393,7 +417,8 @@ export default {
}
},
isActiveChangeEvent (row) {
this.updateDatabase()
sites.remove(row.id)
sites.add(row)
},
resetId (inArray) {
var id = 1
@@ -414,10 +439,18 @@ export default {
sites.bulkAdd(this.sites).then(this.getSites())
})
},
removeAllSites () {
sites.clear().then(this.getSites())
removeSelectedSites () {
this.multipleSelection.forEach(e => sites.remove(e.id))
this.$refs.editSitesTable.clearFilter()
this.getSites()
this.updateDatabase()
this.enableBatchEdit = false
},
rowDrop () {
if (this.checkAllSitesLoading) {
this.$message.info('正在检测, 请勿操作.')
return false
}
const tbody = document.getElementById('sites-table').querySelector('.el-table__body-wrapper tbody')
var _this = this
Sortable.create(tbody, {
@@ -429,39 +462,40 @@ export default {
})
},
async checkAllSite () {
this.checkAllSiteLoading = true
for (const i of this.sites) {
i.status = ''
this.tableKey = Math.random()
const flag = await zy.check(i.key)
if (flag) {
i.status = '可用'
} else {
i.status = '失效'
i.isActive = 0
}
this.tableKey = Math.random()
}
this.checkAllSiteLoading = false
this.updateDatabase()
this.checkAllSitesLoading = true
this.stopFlag = false
this.checkProgress = 0
const uncheckedList = this.sites.filter(e => e.status === undefined || e.status === ' ') // 未检测过的优先
const other = this.sites.filter(e => !uncheckedList.includes(e))
await Promise.all(uncheckedList.map(site => this.checkSingleSite(site)))
await Promise.all(other.map(site => this.checkSingleSite(site))).then(res => {
this.checkAllSitesLoading = false
this.getSites()
})
},
async checkSimpleSite (row) {
this.checkAllSiteLoading = true
async checkSingleSite (row) {
row.status = ' '
if (this.stopFlag) {
this.checkProgress += 1
return row.status
}
const flag = await zy.check(row.key)
this.checkProgress += 1
if (flag) {
row.status = '可用'
} else {
row.status = '失效'
row.isActive = 0
row.isActive = false
}
this.updateDatabase()
this.tableKey = Math.random()
this.checkAllSiteLoading = false
sites.remove(row.id)
sites.add(row)
return row.status
}
},
mounted () {
this.rowDrop()
this.checkAllSiteLoading = false
addEventListener('keydown', code => { if (code.keyCode === 16) this.shiftDown = true })
addEventListener('keyup', code => { if (code.keyCode === 16) this.shiftDown = false })
},
created () {
this.getSites()

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
<template>
<div class="frame">
<span class="top" @click="frameClickEvent('top')" title="置顶">
<svg t="1595919317571" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1188" style="width:10px;height:14px"><path d="M43.072 974.72l380.864-301.952 151.936 161.6c0 0 63.424 17.28 67.328-30.72l-3.904-163.584 225.088-259.648 98.048-5.696c0 0 76.928-15.488 21.184-82.752l-275.072-276.928c0 0-74.944-9.6-69.248 59.584l0 75.008L383.552 367.104 225.856 376.64c0 0-57.728 19.2-36.608 69.248l148.16 146.176L43.072 974.72 43.072 974.72z" p-id="1189" :fill="isAlwaysOnTop ? '#555555' : '#ffffff'"></path></svg>
<svg t="1595919317571" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1188" style="width:10px;height:14px"><path d="M43.072 974.72l380.864-301.952 151.936 161.6c0 0 63.424 17.28 67.328-30.72l-3.904-163.584 225.088-259.648 98.048-5.696c0 0 76.928-15.488 21.184-82.752l-275.072-276.928c0 0-74.944-9.6-69.248 59.584l0 75.008L383.552 367.104 225.856 376.64c0 0-57.728 19.2-36.608 69.248l148.16 146.176L43.072 974.72 43.072 974.72z" p-id="1189" :fill="appState.windowIsOnTop ? '#555555' : '#ffffff'"></path></svg>
</span>
<span class="min" @click="frameClickEvent('min')" title="最小化">
<svg t="1595917239849" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1155" style="width:8px;height:14px"><path d="M0 479.936C0 444.64 28.448 416 64.064 416L959.936 416C995.328 416 1024 444.736 1024 479.936L1024 544.064C1024 579.392 995.552 608 959.936 608L64.064 608C28.672 608 0 579.264 0 544.064L0 479.936Z" p-id="1156" fill="#ffffff"></path></svg>
@@ -18,10 +18,14 @@
const { remote } = require('electron')
export default {
name: 'frame',
data () {
const win = remote.getCurrentWindow()
return {
isAlwaysOnTop: win.isAlwaysOnTop()
computed: {
appState: {
get () {
return this.$store.getters.getAppState
},
set (val) {
this.SET_APPSTATE(val)
}
}
},
methods: {
@@ -37,8 +41,8 @@ export default {
win.destroy()
}
if (e === 'top') {
this.isAlwaysOnTop = !this.isAlwaysOnTop
win.setAlwaysOnTop(this.isAlwaysOnTop)
this.appState.windowIsOnTop = !this.appState.windowIsOnTop
win.setAlwaysOnTop(this.appState.windowIsOnTop)
}
}
}

View File

@@ -1,12 +1,13 @@
<template>
<div class="listpage" id="history">
<div class="listpage-header" id="history-header">
<el-switch v-model="viewMode" active-text="海报" active-value="picture" inactive-text="列表" inactive-value="table" @change="updateViewMode"></el-switch>
<el-button @click.stop="exportHistory" icon="el-icon-upload2">导出</el-button>
<el-button @click.stop="importHistory" icon="el-icon-download">导入</el-button>
<el-button @click.stop="clearAllHistory" icon="el-icon-delete-solid">清空</el-button>
</div>
<div class="listpage-body" id="history-body">
<div class="show-table" id="history-table" >
<div class="show-table" id="history-table" v-show="viewMode === 'table'">
<el-table size="mini" fit height="100%" :data="history" row-key="id" @row-click="detailEvent">
<el-table-column
prop="name"
@@ -22,35 +23,87 @@
</el-table-column>
<el-table-column
prop="index"
width="120"
width="180"
label="观看至">
<template slot-scope="scope">
<span>{{ scope.row.index + 1 }}</span>
<span v-if="scope.row.detail && scope.row.detail.m3u8List && scope.row.detail.m3u8List.length > 1">
{{ scope.row.index + 1 }}({{scope.row.detail.m3u8List.length}})
</span>
</template>
</el-table-column>
<el-table-column v-if="history.some(e => e.time)"
width="150"
label="时间进度">
<template slot-scope="scope">
<span v-if="scope.row.time && scope.row.duration">{{fmtMSS(scope.row.time.toFixed(0))}}/{{fmtMSS(scope.row.duration.toFixed(0))}}</span>
</template>
</el-table-column>
<el-table-column
label="操作"
header-align="right"
width="200"
header-align="center"
align="right">
<template slot-scope="scope">
<el-button @click.stop="playEvent(scope.row)" type="text">播放</el-button>
<el-button @click.stop="shareEvent(scope.row)" type="text">分享</el-button>
<el-button @click.stop="downloadEvent(scope.row)" type="text">下载</el-button>
<el-button @click.stop="removeHistoryItem(scope.row)" type="text">删除</el-button>
<el-button @click.stop="deleteEvent(scope.row)" type="text">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="show-picture" id="star-picture" v-show="viewMode === 'picture'">
<Waterfall ref="historyWaterfall" :list="history" :gutter="20" :width="240"
:breakpoints="{
1200: { //当屏幕宽度小于等于1200
rowPerView: 4,
},
800: { //当屏幕宽度小于等于800
rowPerView: 3,
},
500: { //当屏幕宽度小于等于500
rowPerView: 2,
}
}"
animationDuration="0.5s"
backgroundColor="rgba(0, 0, 0, 0)">
<template slot="item" slot-scope="props">
<div class="card">
<div class="img">
<img v-if="props.data.detail && props.data.detail.pic" style="width: 100%" :src="props.data.detail.pic" alt="" @load="$refs.historyWaterfall.refresh()" @click="detailEvent(props.data)">
<div class="operate">
<div class="operate-wrap">
<span class="o-play" @click="playEvent(props.data)">播放</span>
<span class="o-share" @click="shareEvent(props.data)">分享</span>
<span class="o-star" @click="downloadEvent(props.data)">下载</span>
<span class="o-star" @click="deleteEvent(props.data)">删除</span>
</div>
</div>
</div>
<div class="name" @click="detailEvent(props.data)">{{props.data.name}}</div>
<div class="info">
<span v-if="props.data.time && props.data.duration">
{{fmtMSS(props.data.time.toFixed(0))}}/{{fmtMSS(props.data.duration.toFixed(0))}}
</span>
<span v-if="props.data.detail && props.data.detail.m3u8List !== undefined && props.data.detail.m3u8List.length > 1">
{{ props.data.index + 1 }}({{props.data.detail.m3u8List.length}})
</span>
</div>
</div>
</template>
</Waterfall>
</div>
</div>
</div>
</template>
<script>
import { mapMutations } from 'vuex'
import { history, sites } from '../lib/dexie'
import { history, sites, setting } from '../lib/dexie'
import zy from '../lib/site/tools'
import Sortable from 'sortablejs'
import { remote } from 'electron'
import fs from 'fs'
import Waterfall from 'vue-waterfall-plugin'
const { clipboard } = require('electron')
export default {
@@ -58,9 +111,13 @@ export default {
data () {
return {
history: [],
sites: []
sites: [],
viewMode: setting.historyViewMode
}
},
components: {
Waterfall
},
computed: {
view: {
get () {
@@ -99,10 +156,16 @@ export default {
view () {
this.getAllhistory()
this.getAllsites()
if (this.$refs.historyWaterfall) {
this.$refs.historyWaterfall.refresh()
}
}
},
methods: {
...mapMutations(['SET_VIEW', 'SET_DETAIL', 'SET_VIDEO', 'SET_SHARE']),
fmtMSS (s) {
return (s - (s %= 60)) / 60 + (s > 9 ? ':' : ':0') + s
},
detailEvent (e) {
this.detail = {
show: true,
@@ -120,6 +183,9 @@ export default {
} else {
this.video = { key: e.site, info: { id: e.ids, name: e.name, index: 0 } }
}
zy.detail(e.site, e.ids).then(detailRes => {
this.video.detail = detailRes
})
this.view = 'Play'
},
shareEvent (e) {
@@ -130,36 +196,21 @@ export default {
}
},
downloadEvent (e) {
zy.download(e.site, e.ids).then(res => {
if (res && res.dl && res.dl.dd) {
const text = res.dl.dd._t
if (text) {
const list = text.split('#')
let downloadUrl = ''
for (const i of list) {
const url = encodeURI(i.split('$')[1])
downloadUrl += (url + '\n')
}
clipboard.writeText(downloadUrl)
this.$message.success('『MP4』格式的链接已复制, 快去下载吧!')
} else {
this.$message.warning('没有查询到下载链接.')
const key = e.site
const id = e.ids
zy.download(key, id).then(res => {
if (res && res.m3u8List) {
const list = res.m3u8List.split('#')
let downloadUrl = ''
for (const i of list) {
const url = encodeURI(i.split('$')[1])
downloadUrl += (url + '\n')
}
clipboard.writeText(downloadUrl)
this.$message.success('『MP4』格式的链接已复制, 快去下载吧!')
} else {
var m3u8List = {}
zy.detail(e.site, e.ids).then(res => {
const dd = res.dl.dd
const type = Object.prototype.toString.call(dd)
if (type === '[object Array]') {
for (const i of dd) {
if (i._flag.indexOf('m3u8') >= 0) {
m3u8List = i._t.split('#')
}
}
} else {
m3u8List = dd._t.split('#')
}
const list = [...m3u8List]
zy.detail(key, id).then(res => {
const list = [...res.m3u8List]
let downloadUrl = ''
for (const i of list) {
const url = encodeURI(i.split('$')[1])
@@ -230,7 +281,7 @@ export default {
return site.name
}
},
removeHistoryItem (e) {
deleteEvent (e) {
history.remove(e.id).then(res => {
this.getAllhistory()
}).catch(err => {
@@ -257,13 +308,34 @@ export default {
_this.updateDatabase(_this.history)
}
})
},
getViewMode () {
setting.find().then(res => {
this.viewMode = res.historyViewMode
})
},
updateViewMode () {
setting.find().then(res => {
res.historyViewMode = this.viewMode
setting.update(res)
})
}
},
mounted () {
this.rowDrop()
window.addEventListener('resize', () => {
if (this.$refs.historyWaterfall && this.view === 'History') {
this.$refs.historyWaterfall.resize()
this.$refs.historyWaterfall.refresh()
setTimeout(() => {
this.$refs.historyWaterfall.refresh()
}, 500)
}
}, false)
},
created () {
this.getAllhistory()
this.getViewMode()
}
}
</script>

View File

@@ -1,16 +1,19 @@
<template>
<div class="listpage" id="iptv">
<div class="listpage-header" id="iptv-header" v-show="!enableBatchEdit">
<el-switch v-model="enableBatchEdit" active-text="批处理分组"></el-switch>
<el-switch v-model="enableBatchEdit" active-text="批处理及频道调整"></el-switch>
<el-button @click.stop="exportChannels" icon="el-icon-upload2" >导出</el-button>
<el-button @click.stop="importChannels" icon="el-icon-download">导入</el-button>
<el-button @click.stop="removeAllChannels" icon="el-icon-delete-solid">清空</el-button>
<el-button @click="checkAllChannels" icon="el-icon-refresh" :loading="checkAllChannelsLoading">检测{{ this.checkAllChannelsLoading ? this.checkProgress + '/' + this.iptvList.length : '' }}</el-button>
<el-button @click.stop="resetChannelsEvent" icon="el-icon-refresh-left">重置</el-button>
</div>
<div class="listpage-header" id="iptv-header" v-show="enableBatchEdit">
<el-switch v-model="enableBatchEdit" active-text="批处理分组"></el-switch>
<el-input placeholder="新组名" v-model="batchGroupName"></el-input>
<el-button type="primary" icon="el-icon-edit" @click.stop="saveBatchEdit">保存</el-button>
<el-switch v-model="enableBatchEdit" active-text="批处理及频道调整"></el-switch>
<el-input placeholder="新组名/新频道名" v-model="inputContent"></el-input>
<el-switch v-model="batchIsActive" active-text="启用"></el-switch>
<el-button type="primary" icon="el-icon-edit" @click.stop="saveBatchEdit">保存分组与开关状态</el-button>
<el-button type="primary" icon="el-icon-film" @click.stop="mergeChannel">{{ this.multipleSelection.length === 1 ? '频道重命名' : '频道合并' }}</el-button>
<el-button @click.stop="removeSelectedChannels" icon="el-icon-delete-solid">删除</el-button>
</div>
<div class="listpage-body" id="iptv-table">
<div class="show-table" id="iptv-table">
@@ -18,9 +21,13 @@
ref="iptvTable"
size="mini" fit height="100%" row-key="id"
:data="filteredTableData"
@row-click="playEvent"
lazy
:load="(row, treeNode, resolve) => resolve(row.channels)"
:tree-props="{hasChildren: 'hasChildren'}"
@expand-change="expandChange"
@select="selectionCellClick"
@selection-change="handleSelectionChange"
@sort-change="handleSortChange">>
@sort-change="handleSortChange">
<el-table-column
type="selection"
v-if="enableBatchEdit">
@@ -28,6 +35,7 @@
<el-table-column
default-sort="ascending"
prop="name"
:class-name="enableBatchEdit ? 'disableExpand' : ''"
label="频道名">
<template #header>
<el-input
@@ -39,27 +47,56 @@
</template>
</el-table-column>
<el-table-column
sort-by="['group', 'name']"
prop="isActive"
width="120"
align="center"
:filters = "[{text:'启用', value: true}, {text:'停用', value: false}]"
:filter-method="(value, row) => value === row.isActive"
label="启用">
<template slot-scope="scope">
<el-switch
v-model="scope.row.isActive"
@click.native.stop='isActiveChangeEvent(scope.row)'>
</el-switch>
</template>
</el-table-column>
<el-table-column
sortable
:sort-method="sortByGroup"
:sort-method="(a , b) => sortByLocaleCompare(a.group, b.group)"
prop="group"
label="分组"
:filters="getFilters"
:filter-method="filterHandle"
:filter-method="(value, row) => value === row.group"
filter-placement="bottom-end">
<template slot-scope="scope">
<el-button type="text">{{scope.row.group}}</el-button>
</template>
</el-table-column>
<el-table-column
label="状态"
sortable
:sort-by="['status']"
width="120">
<template slot-scope="scope">
<span v-if="scope.row.status === ' '">
<i class="el-icon-loading"></i>
检测中...
</span>
<span v-else>{{scope.row.status}}</span>
</template>
</el-table-column>
<el-table-column
label="操作"
header-align="right"
align="right">
align="right"
:width="200">
<template #header>
<span>总频道数:{{ iptvList.length }}</span>
<span>{{ enableBatchEdit ? `频道总数:${channelList.length}` : `资源总数:${iptvList.length}` }}</span>
</template>
<template slot-scope="scope">
<el-button @click.stop="moveToTopEvent(scope.row)" type="text">置顶</el-button>
<el-button @click.stop="moveToTopEvent(scope.row)" type="text" v-if="scope.row.channels">置顶</el-button>
<el-button @click.stop="playEvent(scope.row)" type="text">播放</el-button>
<!-- 检测时先强制批量检测一遍,如果不强制直接单个检测时第一次不会显示“检测中”-->
<el-button size="mini" v-if="iptvList.every(channel => channel.status)" v-show="!checkAllChannelsLoading" @click.stop="checkChannel(scope.row)" type="text">检测</el-button>
<el-button @click.stop="removeEvent(scope.row)" type="text">删除</el-button>
</template>
</el-table-column>
@@ -70,8 +107,9 @@
</template>
<script>
import { mapMutations } from 'vuex'
import { iptv, iptvSearch } from '../lib/dexie'
import { iptv as defaultSites } from '../lib/dexie/initData'
import { iptv, channelList } from '../lib/dexie'
import { iptv as defaultChannels } from '../lib/dexie/initData'
import zy from '../lib/site/tools'
import { remote } from 'electron'
import fs from 'fs'
import Sortable from 'sortablejs'
@@ -80,14 +118,20 @@ export default {
data () {
return {
iptvList: [],
channelList: [],
searchTxt: '',
searchRecordList: [],
enableBatchEdit: false,
batchGroupName: '',
inputContent: '',
batchIsActive: true,
shiftDown: false,
selectionBegin: '',
selectionEnd: '',
multipleSelection: [],
show: {
search: false
}
expandedRows: [],
checkAllChannelsLoading: false,
checkProgress: 0,
stopFlag: false,
sortableTable: ''
}
},
computed: {
@@ -112,13 +156,13 @@ export default {
},
filteredTableData () {
if (this.searchTxt) {
return this.iptvList.filter(x => x.name.toLowerCase().includes(this.searchTxt.toLowerCase()))
return this.channelList.filter(x => x.name.toLowerCase().includes(this.searchTxt.toLowerCase()))
} else {
return this.iptvList
return this.channelList
}
},
getFilters () {
const groups = [...new Set(this.iptvList.map(iptv => iptv.group))]
const groups = [...new Set(this.channelList.map(iptv => iptv.group))]
var filters = []
groups.forEach(g => {
var doc = {
@@ -132,38 +176,100 @@ export default {
},
watch: {
view () {
if (this.view === 'IPTV') {
this.getChannels()
if (this.view === 'IPTV' && !this.checkAllChannelsLoading) {
this.getChannelList()
}
},
searchTxt () {
enableBatchEdit () {
if (this.checkAllChannelsLoading) {
this.$message.info('正在检测, 请勿操作.')
this.enableBatchEdit = false
return
}
if (this.enableBatchEdit) {
this.$nextTick(() => {
this.expandedRows.forEach(e => this.$refs.iptvTable.toggleRowExpansion(e, false))
})
this.rowDrop()
} else {
this.sortableTable.destroy()
}
}
},
methods: {
...mapMutations(['SET_VIEW', 'SET_DETAIL', 'SET_VIDEO', 'SET_SHARE']),
sortByGroup (a, b) {
return a.group.localeCompare(b.group, 'zh')
sortByLocaleCompare (a, b) {
return a.localeCompare(b, 'zh')
},
selectionCellClick (selection, row) {
if (this.shiftDown && this.selectionBegin !== '' && selection.includes(row)) {
this.selectionEnd = row.id
const start = this.channelList.findIndex(e => e.id === Math.min(this.selectionBegin, this.selectionEnd))
const end = this.channelList.findIndex(e => e.id === Math.max(this.selectionBegin, this.selectionEnd))
const selections = this.channelList.slice(start, end + 1) // 多选时强制不让展开
this.$nextTick(() => {
selections.forEach(e => this.$refs.iptvTable.toggleRowSelection(e, true))
})
this.selectionBegin = this.selectionEnd = ''
return
}
if (selection.includes(row)) {
this.selectionBegin = row.id
} else {
this.selectionBegin = ''
}
},
expandChange (row, expanded) {
const index = this.expandedRows.indexOf(row)
if (expanded && index === -1) {
this.expandedRows.push(row)
} else if (!expanded && index !== -1) {
this.expandedRows.splice(index, 1)
}
},
handleSelectionChange (rows) {
this.multipleSelection = rows
},
handleSortChange (column, prop, order) {
this.updateDatabase()
},
saveBatchEdit () {
if (this.multipleSelection && this.batchGroupName) {
this.multipleSelection.forEach(ele => {
ele.group = this.batchGroupName
})
if (this.checkAllChannelsLoading) {
this.$message.info('正在检测, 请勿操作.')
return
}
this.updateDatabase()
},
playEvent (e) {
this.video = { iptv: { name: e.name, url: e.url } }
this.view = 'Play'
saveBatchEdit () {
this.multipleSelection.forEach(ele => {
if (this.inputContent) {
ele.group = this.inputContent
}
ele.isActive = this.batchIsActive
})
this.updateDatabase()
},
filterHandle (value, row) {
return row.group === value
mergeChannel () {
if (this.inputContent && this.multipleSelection.length) {
var channels = []
const id = this.multipleSelection[0].id
this.multipleSelection.forEach(ele => {
channels = channels.concat(ele.channels)
channels.forEach(e => { e.channelID = id })
channelList.remove(ele.id)
})
const mergeChannel = { id: id, name: this.inputContent, isActive: channels.some(c => c.isActive), group: this.determineGroup(this.inputContent), hasChildren: channels.length > 1, channels: channels }
channelList.add(mergeChannel)
this.getChannelList()
this.updateDatabase()
}
},
playEvent (e) {
if (e.url) {
this.video = { iptv: e }
} else {
const prefer = e.prefer ? e.channels.find(c => c.id === e.prefer) : e.channels.filter(c => c.isActive)[0]
if (!prefer) return
this.video = { iptv: prefer }
}
this.view = 'Play'
},
containsearchTxt (i) {
if (this.searchTxt) {
@@ -172,25 +278,30 @@ export default {
return true
}
},
removeEvent (e) {
iptv.remove(e.id).then(res => {
this.getChannels()
}).catch(err => {
removeEvent (row) {
if (this.checkAllChannelsLoading) {
this.$message.info('正在检测, 请勿操作.')
return false
}
try {
if (row.url) { // tree树形控件节点一旦展开就不再重新加载节点数据
const ele = this.channelList.find(e => e.id === row.channelID)
ele.channels.splice(ele.channels.findIndex(e => e.id === row.id), 1)
channelList.remove(row.channelID)
if (ele.channels.length) {
if (ele.channels.length === 1) ele.hasChildren = false
channelList.add(ele)
this.$set(this.$refs.iptvTable.store.states.lazyTreeNodeMap, ele.id, ele.channels)
}
} else {
channelList.remove(row.id)
}
this.getChannelList()
} catch (err) {
this.$message.warning('删除频道失败, 错误信息: ' + err)
})
}
},
listUpdatedEvent () {
iptv.clear().then(res1 => {
// 重新排序
var id = 1
this.iptvList.forEach(element => {
element.id = id
iptv.add(element)
id += 1
})
})
},
exportChannels () {
exportChannels () { // 导出导入m3u为iptvListjson为channelList
const options = {
filters: [
{ name: 'm3u file', extensions: ['m3u'] },
@@ -207,7 +318,7 @@ export default {
fs.writeFileSync(result.filePath, writer.toString())
this.$message.success('已保存成功')
} else {
const arr = [...this.iptvList]
const arr = [...this.channelList] // 要保存channelList必须选json
const str = JSON.stringify(arr, null, 2)
fs.writeFileSync(result.filePath, str)
this.$message.success('已保存成功')
@@ -218,6 +329,10 @@ export default {
})
},
importChannels () {
if (this.checkAllChannelsLoading) {
this.$message.info('正在检测, 请勿操作.')
return false
}
const options = {
filters: [
{ name: 'm3u file', extensions: ['m3u', 'm3u8'] },
@@ -227,63 +342,64 @@ export default {
}
remote.dialog.showOpenDialog(options).then(result => {
if (!result.canceled) {
var docs = this.iptvList
var id = docs.length
result.filePaths.forEach(file => {
if (file.endsWith('m3u') || file.endsWith('m3u8')) {
const docs = []
const URL = require('url')
let id = this.channelList.length ? this.channelList.slice(-1)[0].id + 1 : 1
const parser = require('iptv-playlist-parser')
const playlist = fs.readFileSync(file, { encoding: 'utf-8' })
const result = parser.parse(playlist)
result.items.forEach(ele => {
if (ele.name && ele.url && ele.url.endsWith('.m3u8')) {
var doc = {
id: id,
name: ele.name,
url: ele.url,
group: this.determineGroup(ele.name)
const urls = ele.url.split('#').filter(e => e.startsWith('http')) // 网址带#时自动分割
urls.forEach(url => {
if (ele.name && url && new URL.URL(url).pathname.endsWith('.m3u8')) { // 网址可能带参数
var doc = {
id: id,
name: ele.name,
url: url,
isActive: true
}
id += 1
docs.push(doc)
}
id += 1
docs.push(doc)
}
})
})
// 获取url不重复的列表
const uniqueList = [...new Map(docs.map(item => [item.url, item])).values()]
iptv.clear().then(res => {
iptv.bulkAdd(uniqueList).then(e => { // 支持导入同名频道,群里反馈
this.updateChannelList()
})
})
} else {
// Import Json file
var str = fs.readFileSync(file)
const json = JSON.parse(str)
json.forEach(ele => {
if (ele.name && ele.url && ele.url.endsWith('.m3u8')) {
var doc = {
id: id,
name: ele.name,
url: ele.url,
group: this.determineGroup(ele.name)
}
id += 1
docs.push(doc)
const importedList = JSON.parse(fs.readFileSync(file))
importedList.forEach(ele => {
const commonEle = this.channelList.find(e => e.name === ele.name)
if (commonEle) {
const urls = commonEle.channels.map(c => c.url)
const channels = ele.channels.filter(e => !urls.includes(e.url))
commonEle.channels = commonEle.channels.concat(channels)
} else {
ele.id = this.channelList.length ? this.channelList.slice(-1)[0].id + 1 : 1
this.channelList.push(ele)
}
})
this.updateDatabase()
}
})
// 获取name不重复的列表
const uniqueList = [...new Map(docs.map(item => [item.name, item])).values()]
iptv.clear().then(res => {
iptv.bulkAdd(uniqueList).then(e => {
this.getChannels()
this.$message.success('导入成功')
})
})
this.$message.success('导入成功')
}
})
},
determineGroup (name) {
if (name.toLowerCase().includes('cctv') && (name.includes('蓝光') || name.includes('高清'))) {
return '央视高清'
} else if (name.toLowerCase().includes('cctv')) {
if (name.toLowerCase().includes('cctv') || name.toLowerCase().includes('cgtn')) {
return '央视'
} else if (name.includes('香港') || name.includes('澳门') || name.includes('台湾') || name.includes('凤凰') || name.includes('翡翠')) {
return '港澳台'
} else if (name.includes('卫视')) {
return '卫视'
} else if (name.includes('香港') || name.includes('澳门') || name.includes('台湾') || name.includes('凤凰')) {
return '港澳台'
} else if (name.includes('高清') || name.includes('蓝光') || name.includes('1080P')) {
return '高清'
} else {
@@ -291,85 +407,229 @@ export default {
}
},
resetChannelsEvent () {
this.resetChannels(defaultSites)
this.stopFlag = true
if (this.checkAllChannelsLoading) {
this.$message.info('部分检测还未完全终止, 请稍等...')
return
}
this.channelList = []
this.iptvList = []
iptv.clear().then(iptv.bulkAdd(defaultChannels).then(this.updateChannelList()))
},
resetChannels (newSites) {
this.resetId(newSites)
iptv.clear().then(iptv.bulkAdd(newSites).then(this.getChannels()))
removeSelectedChannels () {
this.multipleSelection.forEach(e => channelList.remove(e.id))
this.$refs.iptvTable.clearFilter()
this.getChannelList()
this.updateDatabase()
this.enableBatchEdit = false
},
removeAllChannels () {
iptv.clear().then(res => {
this.getChannels()
})
},
getChannels () {
updateChannelList () {
iptv.all().then(res => {
this.iptvList = res
})
},
getSearchRecordList () {
iptvSearch.all().then(res => {
this.searchRecordList = res.reverse()
})
},
clearSearch () {
iptvSearch.clear().then(res => {
this.getSearchRecordList()
})
},
searchEvent (wd) {
this.searchTxt = wd
this.show.search = false
if (wd) {
iptvSearch.find({ keywords: wd }).then(res => {
if (!res) {
iptvSearch.add({ keywords: wd })
res = res.filter(o => !this.iptvList.find(e => o.url === e.url))
const resClone = JSON.parse(JSON.stringify(res))
const uniqueChannelName = {}
for (var i = 0; i < resClone.length; i++) {
var channelName = resClone[i].name.trim().replace(/[- ]?(1080p|蓝光|超清|高清|标清|hd|cq|4k)(\d{1,2})?$/i, '')
if (channelName.match(/cctv/i)) channelName = channelName.replace('-', '')
if (Object.keys(uniqueChannelName).some(name => channelName.match(new RegExp(`${name}(1080p|4k|(?!\\d))`, 'i')))) continue // 避免重复
const matchRule = new RegExp(`${channelName}(1080p|4k|(?!\\d))`, 'i')
for (var j = i; j < resClone.length; j++) {
if (resClone[j].name.match(/cctv/i)) {
resClone[j].name = resClone[j].name.replace('-', '')
}
if (matchRule.test(resClone[j].name)) {
if (uniqueChannelName[channelName]) {
!uniqueChannelName[channelName].includes(res[j]) && uniqueChannelName[channelName].push(res[j])
} else {
uniqueChannelName[channelName] = [res[j]]
}
}
}
}
res.forEach(ele => {
if (ele.isActive === undefined) {
ele.isActive = true
}
this.getSearchRecordList()
})
Object.keys(uniqueChannelName).forEach(k => {
const ele = this.channelList.find(e => e.name === k)
if (ele) {
ele.channels = ele.channels.concat(uniqueChannelName[k])
delete uniqueChannelName[k]
}
})
if (Object.keys(uniqueChannelName).length) {
let id = this.channelList.length ? this.channelList.slice(-1)[0].id + 1 : 1
const channelList = Object.keys(uniqueChannelName).map(e => { return { id: id++, name: e, isActive: uniqueChannelName[e].some(c => c.isActive), group: this.determineGroup(e), hasChildren: uniqueChannelName[e].length > 1, channels: uniqueChannelName[e] } })
this.channelList = this.channelList.concat(channelList)
}
this.updateDatabase()
iptv.clear() // iptv默认清空状态
})
},
async getChannelList () {
await channelList.all().then(res => {
this.channelList = res
this.getIptvList()
})
},
getIptvList () {
this.iptvList = this.channelList.reduce((result, item) => { item.channels.forEach(e => { e.channelID = item.id }); return result.concat(item.channels) }, [])
},
moveToTopEvent (row) {
if (this.checkAllChannelsLoading) {
this.$message.info('正在检测, 请勿操作.')
return false
}
// this.channelList.sort(function (x, y) { return (x.name === i.name && x.url === i.url) ? -1 : (y.name === i.name && y.url === i.url) ? 1 : 0 })
if (row.channels) {
this.channelList.splice(this.channelList.findIndex(e => e.id === row.id), 1)
this.channelList.unshift(row)
this.updateDatabase()
}
},
moveToTopEvent (i) {
this.iptvList.sort(function (x, y) { return (x.name === i.name && x.url === i.url) ? -1 : (y.name === i.name && y.url === i.url) ? 1 : 0 })
this.updateDatabase()
},
syncTableData () {
if (this.$refs.iptvTable.tableData && this.$refs.iptvTable.tableData.length === this.iptvList.length) {
this.iptvList = this.$refs.iptvTable.tableData
if (this.$refs.iptvTable.tableData && this.$refs.iptvTable.tableData.length === this.channelList.length) {
this.channelList = this.$refs.iptvTable.tableData
}
},
updateDatabase () {
this.syncTableData()
iptv.clear().then(res => {
this.resetId(this.iptvList)
iptv.bulkAdd(this.iptvList)
Object.values(this.$refs.iptvTable.store.states.treeData).forEach(e => { e.loaded = false })
channelList.clear().then(res => {
this.resetId(this.channelList)
channelList.bulkAdd(this.channelList)
this.getChannelList()
})
},
resetId (inArray) {
resetId (channelList) {
var id = 1
inArray.forEach(ele => {
channelList.forEach(ele => {
ele.id = id
id += 1
ele.channels.forEach(e => {
e.channelID = ele.id
const embedChannelID = ele.id + '_'
const prefer = ele.prefer ? ele.channels.find(e => e.id === ele.prefer) : ''
ele.channels.forEach((e, index) => { e.id = embedChannelID + index }) // 为避免混杂给内置iptv重起id
if (prefer) ele.prefer = prefer.id
})
if (ele.channels.length === 1) {
ele.hasChildren = false
} else {
ele.hasChildren = true
}
})
},
rowDrop () {
if (this.checkAllChannelsLoading) {
this.$message.info('正在检测, 请勿操作.')
return false
}
const tbody = document.getElementById('iptv-table').querySelector('.el-table__body-wrapper tbody')
const _this = this
Sortable.create(tbody, {
this.sortableTable = new Sortable(tbody, {
filter: '.el-table__row--level-1', // 禁止children拖动
onEnd ({ newIndex, oldIndex }) {
const currRow = _this.iptvList.splice(oldIndex, 1)[0]
_this.iptvList.splice(newIndex, 0, currRow)
const currRow = _this.channelList.splice(oldIndex, 1)[0]
_this.channelList.splice(newIndex, 0, currRow)
_this.updateDatabase()
}
})
},
isActiveChangeEvent (row) {
if (row.url) {
const ele = this.channelList.find(e => e.id === row.channelID)
ele.isActive = ele.channels.some(e => e.isActive)
channelList.remove(row.channelID)
channelList.add(ele)
} else {
if (row.channels.length === 1) row.channels[0].isActive = row.isActive
channelList.remove(row.id)
channelList.add(row)
}
},
async checkAllChannels () {
this.checkAllChannelsLoading = true
this.stopFlag = false
this.checkProgress = 0
this.channelList.filter(e => e.channels.length).forEach(e => { e.status = ' '; e.hasCheckedNum = 0 })
const uncheckedList = this.iptvList.filter(e => e.status === undefined || e.status === ' ') // 未检测过的优先
const other = this.iptvList.filter(e => !uncheckedList.includes(e))
await this.checkChannelsBySite(uncheckedList)
await this.checkChannelsBySite(other).then(res => {
this.checkAllChannelsLoading = false
this.getChannelList()
})
},
async checkChannelsBySite (channels) {
var siteList = {}
channels.forEach(channel => {
const site = channel.url.split('/')[2]
if (siteList[site]) {
siteList[site].push(channel)
} else {
siteList[site] = [channel]
}
})
await Promise.all(Object.values(siteList).map(site => this.checkSingleSite(site)))
},
async checkSingleSite (channelArray) {
for (const c of channelArray) {
if (this.stopFlag) return false
await this.checkSingleChannel(c)
}
},
async checkSingleChannel (channel) {
if (this.setting.allowPassWhenIptvCheck && !channel.isActive) {
this.checkProgress += 1
return
}
channel.status = ' '
const ele = this.channelList.find(e => e.id === channel.channelID)
if (this.stopFlag) {
this.checkProgress += 1
return channel.status
}
const flag = await zy.checkChannel(channel.url)
this.checkProgress += 1
ele.hasCheckedNum++
if (flag) {
channel.status = '可用'
} else {
channel.status = '失效'
channel.isActive = false
if (this.setting.autocleanWhenIptvCheck) {
ele.channels.splice(ele.channels.findIndex(e => e.id === channel.id), 1)
ele.hasCheckedNum--
}
}
if (ele.hasCheckedNum === ele.channels.length) {
ele.status = ele.channels.some(channel => channel.status === '可用') ? '可用' : '失效'
if (ele.status === '失效') ele.isActive = false
channelList.remove(channel.channelID)
if (ele.channels.length === 1) ele.hasChildren = false
if (ele.channels.length) channelList.add(ele)
}
return channel.status
},
async checkChannel (row) {
if (row.channels) {
row.status = ' '
row.hasCheckedNum = 0
row.channels.forEach(e => this.checkSingleChannel(e))
} else {
this.checkSingleChannel(row)
}
}
},
mounted () {
this.rowDrop()
addEventListener('keydown', code => { if (code.keyCode === 16) this.shiftDown = true })
addEventListener('keyup', code => { if (code.keyCode === 16) this.shiftDown = false })
},
created () {
this.getChannels()
this.getSearchRecordList()
async created () {
await this.getChannelList()
if (!this.channelList.length) this.resetChannelsEvent()
}
}
</script>

File diff suppressed because it is too large Load Diff

View File

@@ -1,9 +1,9 @@
<template>
<div class="listpage" id="recommandataions">
<div class="listpage-header" id="recommandataions-header">
<el-switch v-model="viewMode" active-text="海报" active-value="picture" inactive-text="列表" inactive-value="list" @change="updateViewMode"></el-switch>
<el-button type="text">视频数{{ recommandations.length }}</el-button>
<el-select size="mini" v-model="selectedAreas" multiple collapse-tags style="margin-left: 20px;" placeholder="地区">
<div class="listpage" id="recommendataions">
<div class="listpage-header" id="recommendataions-header">
<el-switch v-model="viewMode" active-text="海报" active-value="picture" inactive-text="列表" inactive-value="table" @change="updateViewMode"></el-switch>
<el-button type="text">视频数{{ recommendations.length }}</el-button>
<el-select v-model="selectedAreas" size="small" multiple collapse-tags placeholder="地区" popper-class="popper" :popper-append-to-body="false">
<el-option
v-for="item in areas"
:key="item"
@@ -11,7 +11,7 @@
:value="item">
</el-option>
</el-select>
<el-select size="mini" v-model="selectedTypes" multiple collapse-tags style="margin-left: 20px;" placeholder="类型">
<el-select v-model="selectedTypes" size="small" multiple collapse-tags placeholder="类型" popper-class="popper" :popper-append-to-body="false">
<el-option
v-for="item in types"
:key="item"
@@ -19,13 +19,21 @@
:value="item">
</el-option>
</el-select>
<el-select v-model="sortKeyword" size="small" placeholder="排序" popper-class="popper" :popper-append-to-body="false">
<el-option
v-for="item in sortKeywords"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
<el-button :loading="loading" @click.stop="updateEvent" icon="el-icon-refresh">更新推荐</el-button>
</div>
<div class="listpage-body" id="recommandataions-body" >
<div class="show-table" id="star-table" v-show="viewMode === 'list'">
<div class="listpage-body" id="recommendataions-body" >
<div class="show-table" id="star-table" v-show="viewMode === 'table'">
<el-table size="mini" fit height="100%" row-key="id"
ref="recommandataionsTable"
:data="filteredRecommandations"
ref="recommendataionsTable"
:data="filteredRecommendations"
@row-click="detailEvent">
<el-table-column
prop="name"
@@ -47,20 +55,21 @@
width="100"
align="center">
</el-table-column>
<el-table-column v-if="filteredRecommandations.some(e => e.detail.note)"
prop="detail.note"
width="120"
label="备注">
</el-table-column>
<el-table-column v-if="filteredRecommandations.some(e => e.rate)"
<el-table-column v-if="filteredRecommendations.some(e => e.rate)"
prop="rate"
width="120"
align="center"
width="100"
label="豆瓣评分">
</el-table-column>
<el-table-column v-if="filteredRecommendations.some(e => e.detail.note)"
prop="detail.note"
label="备注">
</el-table-column>
<el-table-column
label="操作"
header-align="right"
align="right">
header-align="center"
align="right"
width="200">
<template slot-scope="scope">
<el-button @click.stop="playEvent(scope.row)" type="text">播放</el-button>
<el-button @click.stop="shareEvent(scope.row)" type="text">分享</el-button>
@@ -71,9 +80,19 @@
</el-table>
</div>
<div class="show-picture" id="star-picture" v-show="viewMode === 'picture'">
<Waterfall ref="waterfall" :list="filteredRecommandations" :gutter="20" :width="240"
:breakpoints="{ 1200: { rowPerView: 4 } }"
animationEffect="fadeInUp"
<Waterfall ref="recommendataionsWaterfall" :list="filteredRecommendations" :gutter="20" :width="240"
:breakpoints="{
1200: { //1200
rowPerView: 4,
},
800: { //800
rowPerView: 3,
},
500: { //500
rowPerView: 2,
}
}"
animationDuration="0.5s"
backgroundColor="rgba(0, 0, 0, 0)">
<template slot="item" slot-scope="props">
<div class="card">
@@ -81,7 +100,7 @@
<div class="rate" v-if="props.data.rate && props.data.rate !== '暂无评分'">
<span>{{props.data.rate}}</span>
</div>
<img style="width: 100%" :src="props.data.detail.pic" alt="" @load="$refs.waterfall.refresh()" @click="detailEvent(props.data)">
<img style="width: 100%" :src="props.data.detail.pic" alt="" @load="$refs.recommendataionsWaterfall.refresh()" @click="detailEvent(props.data)">
<div class="operate">
<div class="operate-wrap">
<span class="o-play" @click="playEvent(props.data)">播放</span>
@@ -107,22 +126,24 @@
</template>
<script>
import { mapMutations } from 'vuex'
import { history, recommandation, setting } from '../lib/dexie'
import { history, recommendation, setting } from '../lib/dexie'
import zy from '../lib/site/tools'
import Waterfall from 'vue-waterfall-plugin'
const { clipboard } = require('electron')
export default {
name: 'recommandations',
name: 'recommendations',
data () {
return {
recommandations: [],
recommendations: [],
sites: [],
viewMode: 'picture',
loading: false,
types: [],
selectedTypes: [],
areas: [],
selectedAreas: []
selectedAreas: [],
sortKeyword: '',
sortKeywords: ['上映', '评分', '默认']
}
},
components: {
@@ -161,17 +182,40 @@ export default {
this.SET_SHARE(val)
}
},
filteredRecommandations () {
var filteredData = this.recommandations.filter(x => (this.selectedAreas.length === 0) || this.selectedAreas.includes(x.detail.area))
filteredRecommendations () {
var filteredData = this.recommendations.filter(x => (this.selectedAreas.length === 0) || this.selectedAreas.includes(x.detail.area))
filteredData = filteredData.filter(x => (this.selectedTypes.length === 0) || this.selectedTypes.includes(x.detail.type))
return filteredData
}
},
watch: {
view () {
if (this.view === 'Recommandation') {
this.getRecommandations()
this.$refs.waterfall.refresh()
if (this.view === 'Recommendation') {
this.getRecommendations()
if (this.$refs.recommendataionsWaterfall) {
this.$refs.recommendataionsWaterfall.refresh()
}
}
},
sortKeyword () {
switch (this.sortKeyword) {
case '上映':
this.recommendations = this.recommendations.sort(function (a, b) {
return b.detail.year - a.detail.year
})
break
case '评分':
this.recommendations.sort(function (a, b) {
return b.rate - a.rate
})
break
case '默认':
this.recommendations.sort(function (a, b) {
return b.id - a.id
})
break
default:
break
}
}
},
@@ -188,40 +232,40 @@ export default {
}
},
updateEvent () {
const url = 'https://raw.githubusercontent.com/Hunlongyu/ZY-Player/master/src/lib/dexie/iniData/Recommandations.json'
const url = 'https://raw.githubusercontent.com/cuiocean/ZY-Player-Resources/main/Recommendations/Recommendations.json'
this.loading = true
const axios = require('axios')
axios.get(url).then(res => {
if (res.status === 200) {
if (res.data.length > 0) {
this.recommandations = res.data
this.recommandations.sort(function (a, b) {
return b.detail.year - a.detail.year
})
recommandation.clear().then(recommandation.bulkAdd(this.recommandations))
this.$message.success('更新推荐成功')
this.recommendations = res.data
recommendation.clear().then(recommendation.bulkAdd(this.recommendations))
this.getFilterData()
this.$message.success('更新推荐成功. 仅根据作者cuiocean个人喜好推荐,不喜请无视.')
}
}
this.loading = false
}).catch(error => {
this.loading = false
this.$message.error('更新推荐失败. ' + error)
this.$message.warning('最新的推荐数据保存在Github上,请考虑使用代理或者等待下一版本内置数据更新.')
})
},
async playEvent (e) {
const db = await history.find({ site: e.key, ids: e.ids })
if (db) {
this.video = { key: e.key, info: { id: db.ids, name: db.name, index: db.index } }
this.video = { key: e.key, info: { id: db.ids, name: db.name, index: db.index }, detail: db.detail }
} else {
this.video = { key: e.key, info: { id: e.ids, name: e.name, index: 0 } }
this.video = { key: e.key, info: { id: e.ids, name: e.name, index: 0 }, detail: e.detail }
}
this.view = 'Play'
},
deleteEvent (e) {
recommandation.remove(e.id).then(res => {
recommendation.remove(e.id).then(res => {
if (res) {
this.$message.warning('删除失败')
} else {
this.$message.success('删除成功')
}
this.getRecommandations()
this.getRecommendations()
})
},
shareEvent (e) {
@@ -232,36 +276,21 @@ export default {
}
},
downloadEvent (e) {
zy.download(e.key, e.ids).then(res => {
if (res && res.dl && res.dl.dd) {
const text = res.dl.dd._t
if (text) {
const list = text.split('#')
let downloadUrl = ''
for (const i of list) {
const url = encodeURI(i.split('$')[1])
downloadUrl += (url + '\n')
}
clipboard.writeText(downloadUrl)
this.$message.success('『MP4』格式的链接已复制, 快去下载吧!')
} else {
this.$message.warning('没有查询到下载链接.')
const key = e.key
const id = e.ids
zy.download(key, id).then(res => {
if (res && res.m3u8List) {
const list = res.m3u8List.split('#')
let downloadUrl = ''
for (const i of list) {
const url = encodeURI(i.split('$')[1])
downloadUrl += (url + '\n')
}
clipboard.writeText(downloadUrl)
this.$message.success('『MP4』格式的链接已复制, 快去下载吧!')
} else {
var m3u8List = {}
zy.detail(e.key, e.ids).then(res => {
const dd = res.dl.dd
const type = Object.prototype.toString.call(dd)
if (type === '[object Array]') {
for (const i of dd) {
if (i._flag.indexOf('m3u8') >= 0) {
m3u8List = i._t.split('#')
}
}
} else {
m3u8List = dd._t.split('#')
}
const list = [...m3u8List]
zy.detail(key, id).then(res => {
const list = [...res.m3u8List]
let downloadUrl = ''
for (const i of list) {
const url = encodeURI(i.split('$')[1])
@@ -273,34 +302,44 @@ export default {
}
})
},
getRecommandations () {
recommandation.all().then(res => {
this.recommandations = res
this.recommandations.sort(function (a, b) {
return b.detail.year - a.detail.year
getRecommendations () {
recommendation.all().then(res => {
this.recommendations = res.sort(function (a, b) {
return b.id - a.id
})
this.getFilterData()
})
},
getFilterData () {
this.types = [...new Set(this.recommandations.map(ele => ele.detail.type))].filter(x => x)
this.areas = [...new Set(this.recommandations.map(ele => ele.detail.area))].filter(x => x)
this.types = [...new Set(this.recommendations.map(ele => ele.detail.type))].filter(x => x)
this.areas = [...new Set(this.recommendations.map(ele => ele.detail.area))].filter(x => x)
},
getViewMode () {
setting.find().then(res => {
this.viewMode = res.recommandationViewMode
this.viewMode = res.recommendationViewMode
})
},
updateViewMode () {
setting.find().then(res => {
res.recommandationViewMode = this.viewMode
res.recommendationViewMode = this.viewMode
setting.update(res)
})
}
},
created () {
this.getRecommandations()
this.getRecommendations()
this.getViewMode()
},
mounted () {
window.addEventListener('resize', () => {
if (this.$refs.recommendataionsWaterfall && this.view === 'Recommendation') {
this.$refs.recommendataionsWaterfall.resize()
this.$refs.recommendataionsWaterfall.refresh()
setTimeout(() => {
this.$refs.recommendataionsWaterfall.refresh()
}, 500)
}
}, false)
}
}
</script>

View File

@@ -56,12 +56,6 @@
/右方向键:<input style="width:50px" type="number" v-model = "d.forwardTimeInSec" @change="updateSettingEvent">
</div>
</div>
<div class='search'>
<div class="title">搜索</div>
<div class="zy-input" @click="toggleSearchAllSites">
<input type="checkbox" v-model = "d.searchAllSites" @change="updateSettingEvent"> 搜索所有资源
</div>
</div>
<div class='site'>
<div class="title">第三方播放</div>
<div class="site-box">
@@ -78,6 +72,20 @@
</div>
</div>
</div>
<div class="site">
<div class="title">直播源管理</div>
<div class="site-box">
<div class="zy-select">
<div class="vs-placeholder vs-noAfter" @click="view = 'IPTV'">编辑直播源</div>
</div>
<div class="zy-input">
<input type="checkbox" v-model = "d.allowPassWhenIptvCheck" @change="updateSettingEvent"> 检测时自动跳过停用源
</div>
<div class="zy-input">
<input type="checkbox" v-model = "d.autocleanWhenIptvCheck" @change="updateSettingEvent"> 检测时自动清理无效源
</div>
</div>
</div>
<div class="site">
<div class="title">源管理</div>
<div class="site-box">
@@ -87,9 +95,21 @@
<div class="zy-input" @click="toggleExcludeRootClasses">
<input type="checkbox" v-model = "d.excludeRootClasses" @change="updateSettingEvent"> 屏蔽主分类
</div>
<div class="zy-input" @click="toggleExcludeR18Films">
<input type="checkbox" v-model = "d.excludeR18Films" @change="updateSettingEvent"> 屏蔽福利片
</div>
</div>
</div>
<div class="site">
<div class="title">网络</div>
<div class="site-box">
<div class="zy-select" @mouseleave="show.proxy = false">
<div class="vs-placeholder" @click="show.proxy = true">代理设置</div>
<div class="vs-options" v-if="show.proxy">
<ul class="zy-scroll">
<li :class="d.proxy.type === 'none' ? 'active' : ''" @click="changeProxyType('none')">不使用代理</li>
<!-- <li :class="d.proxy.type === 'system' ? 'active' : ''" @click="changeProxyType('system')">使用系统代理</li> -->
<li :class="d.proxy.type === 'manual' ? 'active' : ''" @click="changeProxyType('manual')">手动指定代理</li>
</ul>
</div>
</div>
</div>
</div>
<div class="theme">
@@ -138,7 +158,7 @@
</div>
</div>
<div> <!-- 输入密码页面 -->
<el-dialog :visible.sync="show.checkPasswordDialog" v-if='show.checkPasswordDialog' :append-to-body="true" @close="closeDialog">
<el-dialog :visible.sync="show.checkPasswordDialog" v-if='show.checkPasswordDialog' :append-to-body="true" @close="closeDialog" width="300px">
<el-form label-width="75px" label-position="left">
<el-form-item label="当前密码" prop='name'>
<el-input v-model="inputPassword" placeholder="请输入您的当前密码" />
@@ -151,7 +171,7 @@
</el-dialog>
</div>
<div> <!-- 修改密码页面 -->
<el-dialog :visible.sync="show.changePasswordDialog" v-if='show.changePasswordDialog' :append-to-body="true" @close="closeDialog">
<el-dialog :visible.sync="show.changePasswordDialog" v-if='show.changePasswordDialog' :append-to-body="true" @close="closeDialog" width="300px">
<el-form label-width="75px" label-position="left">
<el-form-item label="新密码" prop='name'>
<el-input v-model="inputPassword" placeholder="请输入您的新密码" />
@@ -163,6 +183,33 @@
</span>
</el-dialog>
</div>
<div> <!-- 代理设置界面 -->
<el-dialog :visible.sync="show.proxyDialog" :append-to-body="true" @close="closeDialog" width="400px">
<el-form label-width="50px" label-position="left" size="small">
<el-form-item label="协议: " prop='scheme'>
<el-col :span="15">
<el-select v-model="proxy.scheme" placeholder="请选择协议类型">
<el-option label="http" value="http"></el-option>
<el-option label="socks5" value="socks5"></el-option>
</el-select>
</el-col>
</el-form-item>
<el-form-item label="地址: " prop='url'>
<el-col :span="15">
<el-input v-model="proxy.url" placeholder="地址" />
</el-col>
<el-col class="line" :span="2" style="text-align: center;">:</el-col>
<el-col :span="7">
<el-input v-model="proxy.port" placeholder="端口" width="80px" />
</el-col>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="closeDialog">取消</el-button>
<el-button type="primary" @click="proxyConfirm">确定</el-button>
</span>
</el-dialog>
</div>
</div>
</template>
<script>
@@ -172,12 +219,12 @@ import { setting, sites, shortcut } from '../lib/dexie'
import { sites as defaultSites } from '../lib/dexie/initData'
import { shell, clipboard, remote, ipcRenderer } from 'electron'
import db from '../lib/dexie/dexie'
import zy from '../lib/site/tools'
export default {
name: 'setting',
data () {
return {
pkg: pkg,
sitesList: [],
shortcutList: [],
show: {
site: false,
@@ -185,12 +232,20 @@ export default {
view: false,
editPlayerPath: false,
checkPasswordDialog: false,
changePasswordDialog: false
changePasswordDialog: false,
proxy: false,
proxyDialog: false
},
d: { },
latestVersion: pkg.version,
inputPassword: '',
action: ''
action: '',
proxy: {
type: '',
scheme: '',
url: '',
port: ''
}
}
},
computed: {
@@ -209,18 +264,10 @@ export default {
set (val) {
this.SET_SETTING(val)
}
},
editSites: {
get () {
return this.$store.getters.getEditSites
},
set (val) {
this.SET_EDITSITES(val)
}
}
},
methods: {
...mapMutations(['SET_SETTING', 'SET_VIEW', 'SET_EDITSITES']),
...mapMutations(['SET_SETTING', 'SET_VIEW']),
linkOpen (e) {
shell.openExternal(e)
},
@@ -235,11 +282,6 @@ export default {
if (res.length <= 0) {
this.$message.warning('检测到视频源未能正常加载, 即将重置源.')
sites.clear().then(sites.bulkAdd(defaultSites).then(this.getSites()))
} else {
this.sitesList = res
this.editSites = {
sites: res
}
}
})
},
@@ -266,10 +308,6 @@ export default {
this.setting = this.d
setting.update(this.d)
},
toggleSearchAllSites () {
this.d.searchAllSites = !this.d.searchAllSites
this.updateSettingEvent()
},
toggleExcludeR18Films () {
this.d.excludeR18Films = !this.d.excludeR18Films
this.updateSettingEvent()
@@ -317,9 +355,16 @@ export default {
this.view = 'EditSites'
}
},
closeDialog () {
async closeDialog () {
this.show.checkPasswordDialog = false
this.show.changePasswordDialog = false
if (this.show.proxyDialog) {
this.show.proxyDialog = false
this.setting.proxy.type = 'none'
await this.updateSettingEvent()
this.$message.info('取消使用代理')
zy.proxy()
}
this.inputPassword = ''
},
checkPasswordEvent () {
@@ -375,6 +420,27 @@ export default {
})
})
},
async changeProxyType (e) {
this.d.proxy.type = e
if (e === 'manual') {
this.show.proxyDialog = true
this.proxy.scheme = this.setting.proxy.scheme
this.proxy.url = this.setting.proxy.url
this.proxy.port = this.setting.proxy.port
}
await this.updateSettingEvent()
this.show.proxy = false
zy.proxy()
},
async proxyConfirm () {
this.d.proxy.scheme = this.proxy.scheme
this.d.proxy.url = this.proxy.url
this.d.proxy.port = this.proxy.port
await this.updateSettingEvent()
this.show.proxyDialog = false
zy.proxy()
this.$message.info('开始使用代理')
},
clearDBEvent () {
if (this.d.password) {
this.action = 'CleanDB'
@@ -403,7 +469,7 @@ export default {
getLatestVersion () {
ipcRenderer.send('checkForUpdate')
ipcRenderer.on('update-available', (e, info) => {
this.d.latestVersion = info.version
this.latestVersion = info.version
})
ipcRenderer.on('update-error', () => {
this.$message.warning = '更新出错.'
@@ -481,11 +547,6 @@ export default {
}
}
}
.search{
width: 100%;
padding: 20px;
margin-top: 20px;
}
.site{
width: 100%;
padding: 20px;

View File

@@ -1,5 +1,5 @@
<template>
<div class="share" id="share" @click="shareClickEvent">
<div class="share" id="share" @click="shareClickEvent" v-on-clickaway="shareClickEvent">
<div class="left">
<img :src="pic" alt="" @load="picLoadEvent">
</div>
@@ -22,6 +22,7 @@ import { mapMutations } from 'vuex'
import QrcodeVue from 'qrcode.vue'
import html2canvas from 'html2canvas'
import zy from '../lib/site/tools'
import { directive as onClickaway } from 'vue-clickaway'
const { clipboard, nativeImage } = require('electron')
export default {
name: 'share',
@@ -56,6 +57,9 @@ export default {
deep: true
}
},
directives: {
onClickaway: onClickaway
},
methods: {
...mapMutations(['SET_SHARE']),
shareClickEvent () {
@@ -70,20 +74,9 @@ export default {
zy.detail(this.share.key, id).then(res => {
if (res) {
this.pic = res.pic
var m3u8List = {}
const dd = res.dl.dd
const type = Object.prototype.toString.call(dd)
if (type === '[object Array]') {
for (const i of dd) {
if (i._flag.indexOf('m3u8') >= 0) {
m3u8List = i._t.split('#')
}
}
} else {
m3u8List = dd._t.split('#')
}
var m3u8List = res.m3u8List
const url = m3u8List[1]
this.link = 'http://zyplayer.fun/player/player.html?url=' + url + '&title=' + this.share.info.name
this.link = 'http://hunlongyu.gitee.io/zy-player-web?url=' + url + '&name=' + this.share.info.name
}
this.loading = false
})

View File

@@ -1,14 +1,14 @@
<template>
<div class="listpage" id="star">
<div class="listpage-header" id="star-header">
<el-switch v-model="viewMode" active-text="海报" active-value="picture" inactive-text="列表" inactive-value="list" @change="updateViewMode"></el-switch>
<el-switch v-model="viewMode" active-text="海报" active-value="picture" inactive-text="列表" inactive-value="table" @change="updateViewMode"></el-switch>
<el-button @click.stop="exportFavoritesEvent" icon="el-icon-upload2">导出</el-button>
<el-button @click.stop="importFavoritesEvent" icon="el-icon-download">导入</el-button>
<el-button @click.stop="clearFavoritesEvent" icon="el-icon-delete-solid">清空</el-button>
<el-button @click.stop="updateAllEvent" icon="el-icon-refresh">同步所有收藏</el-button>
</div>
<div class="listpage-body" id="star-body">
<div class="show-table" id="star-table" v-show="viewMode === 'list'">
<div class="show-table" id="star-table" v-show="viewMode === 'table'">
<el-table size="mini" fit height="100%" row-key="id"
ref="starTable"
:data="list"
@@ -17,7 +17,7 @@
@sort-change="handleSortChange">
<el-table-column
sortable
:sort-method="sortByName"
:sort-method="(a , b) => sortByLocaleCompare(a.name, b.name)"
prop="name"
label="片名">
</el-table-column>
@@ -30,9 +30,8 @@
</template>
</el-table-column>
<el-table-column
:sort-by="['detail.type', 'name']"
sortable
:sort-method="sortByType"
:sort-method="(a , b) => sortByLocaleCompare(a.detail.type, b.detail.type)"
prop="detail.type"
label="类型"
width="100">
@@ -42,17 +41,19 @@
:sort-by="['detail.year', 'name']"
prop="detail.year"
label="上映"
width="100"
align="center">
width="100">
</el-table-column>
<el-table-column v-if="list.some(e => e.detail.note)"
prop="detail.note"
width="120"
label="备注">
</el-table-column>
<el-table-column v-if="list.some(e => e.rate)"
<el-table-column v-if="list.some(e => e.rate && e.rate !== '暂无评分')"
sortable
sort-by="rate"
prop="rate"
width="120"
align="center"
label="豆瓣评分">
</el-table-column>
<el-table-column v-if="list.some(e => e.index >= 0)"
@@ -65,8 +66,9 @@
</el-table-column>
<el-table-column
label="操作"
header-align="right"
align="right">
header-align="center"
align="right"
width="200">
<template slot-scope="scope">
<el-button @click.stop="playEvent(scope.row)" type="text">播放</el-button>
<el-button @click.stop="shareEvent(scope.row)" type="text">分享</el-button>
@@ -77,9 +79,19 @@
</el-table>
</div>
<div class="show-picture" id="star-picture" v-show="viewMode === 'picture'">
<Waterfall ref="waterfall" :list="list" :gutter="20" :width="240"
:breakpoints="{ 1200: { rowPerView: 4 } }"
animationEffect="fadeInUp"
<Waterfall ref="starWaterfall" :list="list" :gutter="20" :width="240"
:breakpoints="{
1200: { //当屏幕宽度小于等于1200
rowPerView: 4,
},
800: { //当屏幕宽度小于等于800
rowPerView: 3,
},
500: { //当屏幕宽度小于等于500
rowPerView: 2,
}
}"
animationEffect="fadeIn"
backgroundColor="rgba(0, 0, 0, 0)">
<template slot="item" slot-scope="props">
<div class="card">
@@ -90,7 +102,12 @@
<div class="update" v-if="props.data.hasUpdate">
<span>有更新</span>
</div>
<img style="width: 100%" :src="props.data.detail.pic" alt="" @load="$refs.waterfall.refresh()" @click="detailEvent(props.data)">
<div class="progress" v-if="props.data.index && props.data.detail && props.data.detail.m3u8List !== undefined && props.data.detail.m3u8List.length > 1">
<span>
看至第{{ props.data.index + 1 }}集
</span>
</div>
<img style="width: 100%" :src="props.data.detail.pic" alt="" @load="$refs.starWaterfall.refresh()" @click="detailEvent(props.data)">
<div class="operate">
<div class="operate-wrap">
<span class="o-play" @click="playEvent(props.data)">播放</span>
@@ -102,6 +119,7 @@
</div>
<div class="name" @click="detailEvent(props.data)">{{props.data.name}}</div>
<div class="info">
<span>{{props.data.detail.area}}</span>
<span>{{props.data.detail.year}}</span>
<span>{{props.data.detail.note}}</span>
<span>{{props.data.detail.type}}</span>
@@ -128,7 +146,8 @@ export default {
return {
list: [],
sites: [],
viewMode: 'picture'
viewMode: 'picture',
numNoUpdate: 0
}
},
components: {
@@ -173,6 +192,16 @@ export default {
if (this.view === 'Star') {
this.getAllsites()
this.getFavorites()
if (this.$refs.starWaterfall) {
this.$refs.starWaterfall.refresh()
}
}
},
numNoUpdate () {
// 如果所有收藏都没有更新的话
if (this.numNoUpdate === this.list.length) {
this.numNoUpdate = 0
this.$message.warning('未查询到任何更新')
}
}
},
@@ -181,11 +210,8 @@ export default {
handleSortChange (column, prop, order) {
this.updateDatabase()
},
sortByName (a, b) {
return a.name.localeCompare(b.name, 'zh')
},
sortByType (a, b) {
return a.type.localeCompare(b.type)
sortByLocaleCompare (a, b) {
return a.localeCompare(b, 'zh')
},
detailEvent (e) {
this.detail = {
@@ -202,9 +228,9 @@ export default {
},
async playEvent (e) {
if (e.index) {
this.video = { key: e.key, info: { id: e.ids, name: e.name, index: e.index } }
this.video = { key: e.key, info: { id: e.ids, name: e.name, index: e.index }, detail: e.detail }
} else {
this.video = { key: e.key, info: { id: e.ids, name: e.name, index: 0 } }
this.video = { key: e.key, info: { id: e.ids, name: e.name, index: 0 }, detail: e.detail }
}
if (e.hasUpdate) {
this.clearHasUpdateFlag(e)
@@ -215,8 +241,6 @@ export default {
star.remove(e.id).then(res => {
if (res) {
this.$message.warning('删除失败')
} else {
this.$message.success('删除成功')
}
this.getFavorites()
})
@@ -253,11 +277,12 @@ export default {
index: e.index
}
star.get(e.id).then(resStar => {
var msg = ''
if (e.detail.last !== detailRes.last) {
if (!e.hasUpdate && e.detail.last !== detailRes.last) {
doc.hasUpdate = true
msg = `同步"${e.name}"成功, 检查到更新。`
var msg = `同步"${e.name}"成功, 检查到更新。`
this.$message.success(msg)
} else {
this.numNoUpdate += 1
}
star.update(e.id, doc)
this.getFavorites()
@@ -268,41 +293,27 @@ export default {
})
},
updateAllEvent () {
this.numNoUpdate = 0
this.list.forEach(e => {
this.updateEvent(e)
})
},
downloadEvent (e) {
zy.download(e.key, e.ids).then(res => {
if (res && res.dl && res.dl.dd) {
const text = res.dl.dd._t
if (text) {
const list = text.split('#')
let downloadUrl = ''
for (const i of list) {
const url = encodeURI(i.split('$')[1])
downloadUrl += (url + '\n')
}
clipboard.writeText(downloadUrl)
this.$message.success('『MP4』格式的链接已复制, 快去下载吧!')
} else {
this.$message.warning('没有查询到下载链接.')
const key = e.key
const id = e.id
zy.download(key, id).then(res => {
if (res && res.m3u8List) {
const list = res.m3u8List.split('#')
let downloadUrl = ''
for (const i of list) {
const url = encodeURI(i.split('$')[1])
downloadUrl += (url + '\n')
}
clipboard.writeText(downloadUrl)
this.$message.success('『MP4』格式的链接已复制, 快去下载吧!')
} else {
var m3u8List = {}
zy.detail(e.key, e.ids).then(res => {
const dd = res.dl.dd
const type = Object.prototype.toString.call(dd)
if (type === '[object Array]') {
for (const i of dd) {
if (i._flag.indexOf('m3u8') >= 0) {
m3u8List = i._t.split('#')
}
}
} else {
m3u8List = dd._t.split('#')
}
const list = [...m3u8List]
zy.detail(key, id).then(res => {
const list = [...res.m3u8List]
let downloadUrl = ''
for (const i of list) {
const url = encodeURI(i.split('$')[1])
@@ -333,7 +344,9 @@ export default {
},
getFavorites () {
star.all().then(res => {
this.list = res.reverse()
this.list = res.sort(function (a, b) {
return b.id - a.id
})
})
},
getAllsites () {
@@ -354,7 +367,7 @@ export default {
remote.dialog.showSaveDialog(options).then(result => {
if (!result.canceled) {
fs.writeFileSync(result.filePath, str)
this.$message.success('已保存成功')
this.$message.success('导出收藏成功')
}
}).catch(err => {
this.$message.error(err)
@@ -371,14 +384,16 @@ export default {
}
remote.dialog.showOpenDialog(options).then(result => {
if (!result.canceled) {
var starList = this.list
var starList = Array.from(this.list)
var id = this.list.length + 1
result.filePaths.forEach(file => {
var str = fs.readFileSync(file)
const json = JSON.parse(str)
json.forEach(ele => {
const starExists = starList.includes(x => x.key === ele.key && x.ids === ele.ids)
json.reverse().forEach(ele => {
const starExists = starList.some(x => x.key === ele.key && x.ids === ele.ids)
if (!starExists) {
var doc = {
id: id,
key: ele.key,
ids: ele.ids,
site: ele.site === undefined ? ele.site = this.sites.find(x => x.key === ele.key) : ele.site,
@@ -397,6 +412,7 @@ export default {
note: ele.note
} : ele.detail
}
id += 1
starList.push(doc)
}
})
@@ -454,12 +470,21 @@ export default {
})
}
},
mounted () {
this.rowDrop()
},
created () {
this.getFavorites()
this.getViewMode()
},
mounted () {
this.rowDrop()
window.addEventListener('resize', () => {
if (this.$refs.starWaterfall && this.view === 'Star') {
this.$refs.starWaterfall.resize()
this.$refs.starWaterfall.refresh()
setTimeout(() => {
this.$refs.starWaterfall.refresh()
}, 500)
}
}, false)
}
}
</script>

View File

@@ -10,7 +10,7 @@ import Share from './Share'
import History from './History'
import EditSites from './EditSites'
import IPTV from './IPTV'
import Recommandation from './Recommandation'
import Recommendation from './Recommendation'
export default {
registerComponents () {
Vue.component('Aside', Aside)
@@ -24,6 +24,6 @@ export default {
Vue.component('History', History)
Vue.component('EditSites', EditSites)
Vue.component('IPTV', IPTV)
Vue.component('Recommandation', Recommandation)
Vue.component('Recommendation', Recommendation)
}
}

View File

@@ -0,0 +1,25 @@
import db from './dexie'
const { channelList } = db
export default {
async all () {
return await channelList.toArray()
},
async clear () {
return await channelList.clear()
},
async add (doc) {
return await channelList.add(doc)
},
async bulkAdd (doc) {
return await channelList.bulkAdd(doc)
},
async find (doc) {
return await channelList.get(doc)
},
async update (id, docs) {
return await channelList.update(id, docs)
},
async remove (id) {
return await channelList.delete(id)
}
}

View File

@@ -1,19 +1,19 @@
import Dexie from 'dexie'
import { setting, sites, localKey, iptv, recommandations } from './initData'
import { setting, sites, localKey, iptv, recommendations } from './initData'
const db = new Dexie('zy')
db.version(4).stores({
search: '++id, keywords',
iptvSearch: '++id, keywords',
setting: 'id, theme, site, shortcut, view, externalPlayer, searchAllSites, excludeRootClasses, excludeR18Films, forwardTimeInSec, starViewMode, recommandationViewMode, password',
setting: 'id, theme, site, shortcut, view, volume, externalPlayer, searchGroup, excludeRootClasses, excludeR18Films, forwardTimeInSec, starViewMode, recommandationViewMode, searchViewMode, password, proxy, allowPassWhenIptvCheck, autocleanWhenIptvCheck',
shortcut: 'name, key, desc',
star: '++id, [key+ids], site, name, detail, index, rate, hasUpdate',
recommandation: '++id, [key+ids], site, name, detail, index, rate, hasUpdate',
recommendation: '++id, [key+ids], site, name, detail, index, rate, hasUpdate',
sites: '++id, key, name, api, download, isActive, group',
history: '++id, [site+ids], name, type, year, index, time',
mini: 'id, site, ids, name, index, time',
iptv: '++id, name, url, group'
history: '++id, [site+ids], name, type, year, index, time, duration, detail',
mini: 'id, bounds',
iptv: '++id, name, url, isActive',
channelList: '++id, name, prefer, channels, group, isActive'
})
db.on('populate', () => {
@@ -21,7 +21,7 @@ db.on('populate', () => {
db.sites.bulkAdd(sites)
db.shortcut.bulkAdd(localKey)
db.iptv.bulkAdd(iptv)
db.recommandation.bulkAdd(recommandations)
db.recommendation.bulkAdd(recommendations)
})
db.open()

View File

@@ -5,9 +5,9 @@ import shortcut from './shortcut'
import star from './star'
import sites from './sites'
import search from './search'
import iptvSearch from './iptvSearch'
import iptv from './iptv'
import recommandation from './recommandation'
import channelList from './channelList'
import recommendation from './recommendation'
export {
history,
@@ -17,7 +17,7 @@ export {
star,
sites,
iptv,
channelList,
search,
iptvSearch,
recommandation
recommendation
}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,162 @@
[
{
"id": 1,
"key": "mahuazy",
"name": "麻花资源",
"api": "http://www.mhapi123.com/inc/ldg_api.php",
"download": "",
"group": "默认",
"isActive": true,
"status": "可用"
},
{
"id": 2,
"key": "1886zy",
"name": "1886 资源",
"api": "http://cj.1886zy.co/inc/api.php",
"download": "",
"group": "默认",
"isActive": true,
"status": "可用"
},
{
"id": 3,
"key": "123ku",
"name": "123 资源",
"api": "http://cj.123ku2.com:12315/inc/api.php",
"download": "",
"group": "默认",
"isActive": true,
"status": "可用"
},
{
"id": 4,
"key": "subo988",
"name": "速播资源站",
"api": "https://www.subo988.com/inc/api.php",
"download": "",
"group": "默认",
"isActive": true,
"status": "可用"
},
{
"id": 5,
"key": "88zyw",
"name": "88 影视资源站",
"api": "http://www.88zyw.net/inc/api.php",
"download": "",
"group": "默认",
"isActive": true,
"status": "可用"
},
{
"key": "zuidazy",
"id": 6,
"name": "最大资源网",
"api": "http://www.zdziyuan.com/inc/ldg_sea.php",
"download": "http://www.zdziyuan.com/inc/apidown.php",
"group": "默认",
"isActive": true,
"status": "可用"
},
{
"key": "mbo",
"id": 7,
"name": "秒播资源",
"api": "http://caiji.mb77.vip/inc/seacmsapi.php",
"download": "",
"group": "默认",
"isActive": true,
"status": "可用"
},
{
"id": 8,
"key": "apibdzy",
"name": "百度云资源",
"api": "https://api.apibdzy.com/api.php/provide/vod/at/xml",
"download": "",
"group": "默认",
"isActive": true,
"status": "可用"
},
{
"id": 9,
"key": "okzy",
"name": "OK 资源网",
"api": "http://cj.okzy.tv/inc/api.php",
"download": "http://cj.okzy.tv/inc/apidown.php",
"group": "默认",
"isActive": true,
"status": "可用"
},
{
"id": 10,
"key": "kuyunzy",
"name": "酷云资源",
"api": "http://caiji.kuyun98.com/inc/ldg_api.php",
"download": "http://caiji.kuyun98.com/inc/apidown.php",
"group": "默认",
"isActive": true,
"status": "可用"
},
{
"id": 11,
"key": "kubozy",
"name": "酷播资源",
"api": "http://api.kbzyapi.com/inc/api.php",
"download": "",
"group": "默认",
"isActive": true,
"status": "可用"
},
{
"id": 12,
"key": "yongjiuzy",
"name": "永久资源",
"api": "http://cj.yongjiuzyw.com/inc/api.php",
"download": "",
"group": "默认",
"isActive": true,
"status": "可用"
},
{
"id": 13,
"key": "rrzy",
"name": "人人资源",
"api": "https://www.rrzyw.cc/api.php/provide/vod/from/rrm3u8/at/xml/",
"download": "",
"group": "默认",
"isActive": true,
"status": "可用"
},
{
"id": 14,
"key": "bbkdj",
"name": "步步高顶尖资源网",
"api": "http://api.bbkdj.com/api",
"download": "",
"group": "默认",
"isActive": true,
"status": "可用"
},
{
"id": 15,
"key": "zuixinzy",
"name": "最新资源",
"api": "http://api.zuixinapi.com/inc/api.php",
"download": "",
"group": "默认",
"isActive": true,
"status": "可用"
},
{
"id": 16,
"key": "209zy",
"name": "209 资源",
"api": "http://cj.1156zy.com/inc/api.php",
"download": "",
"group": "默认",
"isActive": true,
"status": "可用"
}
]

View File

@@ -5,241 +5,23 @@ const setting = [
shortcut: true,
view: 'picture',
externalPlayer: '',
searchAllSites: true,
searchGroup: '全站',
excludeRootClasses: true,
excludeR18Films: true,
forwardTimeInSec: 5,
starViewMode: 'picture',
recommandationViewMode: 'picture',
password: ''
}
]
const sites = [
{
id: 1,
key: 'okzy',
name: 'OK 资源网',
api: 'http://cj.okzy.tv/inc/api.php',
download: 'http://cj.okzy.tv/inc/apidown.php',
isActive: 1,
group: '默认'
},
{
id: 2,
key: 'zuidazy',
name: '最大资源网',
api: 'http://www.zdziyuan.com/inc/api.php',
download: 'http://www.zdziyuan.com/inc/apidown.php',
isActive: 1,
group: '默认'
},
{
id: 3,
key: 'doubanzy',
name: '豆瓣电影资源',
api: 'http://v.1988cj.com/inc/api.php',
download: 'http://v.1988cj.com/inc/apidown.php',
isActive: 1,
group: '默认'
},
{
id: 4,
key: '135zy',
name: '135 资源网',
api: 'http://cj.zycjw1.com/inc/api.php',
download: 'http://cj.zycjw1.com/inc/apidown.php',
isActive: 1,
group: '默认'
},
{
id: 5,
key: 'kuyunzy',
name: '酷云资源',
api: 'http://caiji.kuyun98.com/inc/ldg_api.php',
download: 'http://caiji.kuyun98.com/inc/apidown.php',
isActive: 1,
group: '默认'
},
{
id: 6,
key: 'mgtvzy',
name: '芒果 TV 资源网',
api: 'https://api.shijiapi.com/api.php/provide/vod/at/xml/',
download: '',
isActive: 1,
group: '默认'
},
{
id: 7,
key: 'subo988',
name: '速播资源站',
api: 'https://www.subo988.com/inc/api.php',
download: '',
isActive: 1,
group: '默认'
},
{
id: 8,
key: '209zy',
name: '209 资源',
api: 'http://cj.1156zy.com/inc/api.php',
download: '',
isActive: 1,
group: '默认'
},
{
id: 9,
key: 'zuixinzy',
name: '最新资源',
api: 'http://api.zuixinapi.com/inc/api.php',
download: '',
isActive: 1,
group: '默认'
},
{
id: 10,
key: 'kubozy',
name: '酷播资源',
api: 'http://api.kbzyapi.com/inc/api.php',
download: '',
isActive: 1,
group: '默认'
},
{
id: 11,
key: 'yongjiuzy',
name: '永久资源',
api: 'http://cj.yongjiuzyw.com/inc/api.php',
download: '',
isActive: 1,
group: '默认'
},
{
id: 12,
key: '123ku',
name: '123 资源',
api: 'http://cj.123ku2.com:12315/inc/api.php',
download: '',
isActive: 1,
group: '默认'
},
{
id: 13,
key: '88zyw',
name: '88 影视资源站',
api: 'http://www.88zyw.net/inc/api.php',
download: '',
isActive: 1,
group: '默认'
},
{
id: 14,
key: 'wolongzy',
name: '卧龙资源',
api: 'http://cj.wlzy.tv/inc/api_mac.php',
download: '',
isActive: 1,
group: '默认'
},
{
id: 15,
key: 'mahuazy',
name: '麻花资源',
api: 'https://www.mhapi123.com/inc/api.php',
download: '',
isActive: 1,
group: '默认'
},
{
id: 16,
key: 'kkzy',
name: '快快资源',
api: 'https://api.kkzy.tv/inc/api.php',
download: '',
isActive: 1,
group: '默认'
},
{
id: 17,
key: '158zy',
name: '壹伍捌资源网',
api: 'http://cj.158zyz.net:158/inc/api.php',
download: '',
isActive: 1,
group: '默认'
},
{
id: 18,
key: 'rrzy',
name: '人人资源',
api: 'https://www.rrzyw.cc/api.php/provide/vod/from/rrm3u8/at/xml/',
download: '',
isActive: 1,
group: '默认'
},
{
id: 19,
key: 'mokazy',
name: '魔卡资源网',
api: 'https://cj.heiyap.com/api.php/provide/vod/at/xml/',
download: '',
isActive: 1,
group: '默认'
},
{
id: 20,
key: 'kyzy',
name: '快影资源站',
api: 'https://www.kyzy.tv/api.php/kyyun/vod/at/xml/',
download: '',
isActive: 1,
group: '默认'
},
{
id: 21,
key: 'solezy',
name: '搜乐资源网',
api: 'https://www.caijizy.vip/api.php/provide/vod/at/xml/',
download: '',
isActive: 1,
group: '默认'
},
{
id: 22,
key: 'bbkdj',
name: '步步高顶尖资源网',
api: 'http://api.bbkdj.com/api',
download: '',
isActive: 1,
group: '默认'
},
{
id: 23,
key: '1886zy',
name: '1886 资源',
api: 'http://cj.1886zy.co/inc/api.php',
download: '',
isActive: 1,
group: '默认'
},
{
id: 24,
key: 'mbo',
name: '秒播资源',
api: 'http://caiji.mb77.vip/inc/api.php',
download: '',
isActive: 1,
group: '默认'
},
{
id: 25,
key: '605zy',
name: '605资源',
api: 'http://www.605zy.net/inc/seacmsapi.php',
download: '',
isActive: 1,
group: '默认'
recommendationViewMode: 'picture',
historyViewMode: 'picture',
searchViewMode: 'picture',
password: '',
proxy: {
type: 'none',
scheme: '',
url: '',
port: ''
},
allowPassWhenIptvCheck: true,
autocleanWhenIptvCheck: false
}
]
@@ -286,7 +68,7 @@ const localKey = [
},
{
name: 'escape',
desc: '退出全屏',
desc: '退出全屏/精简模式',
key: 'esc'
},
{
@@ -309,6 +91,21 @@ const localKey = [
desc: '跳到视频结束位置',
key: 'end'
},
{
name: 'startPosition',
desc: '标记片头',
key: 'ctrl+home'
},
{
name: 'endPosition',
desc: '标记片尾',
key: 'ctrl+end'
},
{
name: 'clearPosition',
desc: '清除标记',
key: 'ctrl+del'
},
{
name: 'opacityUp',
desc: '透明度调高',
@@ -333,6 +130,11 @@ const localKey = [
name: 'mini',
desc: '进入或退出mini模式',
key: 'alt+m'
},
{
name: 'resetMini',
desc: '重置mini窗口',
key: 'ctrl+0'
}
]
@@ -344,13 +146,14 @@ const getSite = (key) => {
}
}
const sites = require('./iniData/Sites.json')
const iptv = require('./iniData/Iptv.json')
const recommandations = require('./iniData/Recommandations.json')
const recommendations = require('./iniData/Recommendations.json')
export {
setting,
sites,
iptv,
recommandations,
recommendations,
localKey,
getSite
}

View File

@@ -1,22 +0,0 @@
import db from './dexie'
const { iptvSearch } = db
export default {
async add (doc) {
return await iptvSearch.add(doc)
},
async find (doc) {
return await iptvSearch.get(doc)
},
async update (id, docs) {
return await iptvSearch.update(id, docs)
},
async all () {
return await iptvSearch.toArray()
},
async remove (id) {
return await iptvSearch.delete(id)
},
async clear () {
return await iptvSearch.clear()
}
}

View File

@@ -1,28 +0,0 @@
import db from './dexie'
const { recommandation } = db
export default {
async add (doc) {
return await recommandation.add(doc)
},
async bulkAdd (doc) {
return await recommandation.bulkAdd(doc)
},
async find (doc) {
return await recommandation.where(doc).first()
},
async update (id, docs) {
return await recommandation.update(id, docs)
},
async all () {
return await recommandation.toArray()
},
async remove (id) {
return await recommandation.delete(id)
},
async get (id) {
return await recommandation.get(id)
},
async clear () {
return await recommandation.clear()
}
}

View File

@@ -0,0 +1,28 @@
import db from './dexie'
const { recommendation } = db
export default {
async add (doc) {
return await recommendation.add(doc)
},
async bulkAdd (doc) {
return await recommendation.bulkAdd(doc)
},
async find (doc) {
return await recommendation.where(doc).first()
},
async update (id, docs) {
return await recommendation.update(id, docs)
},
async all () {
return await recommendation.toArray()
},
async remove (id) {
return await recommendation.delete(id)
},
async get (id) {
return await recommendation.get(id)
},
async clear () {
return await recommendation.clear()
}
}

View File

@@ -1,11 +1,13 @@
import Vue from 'vue'
import { Message, Button, Table, TableColumn, Tag, Input, Dialog, Form, FormItem, Switch, Select, Option } from 'element-ui'
import { Message, Button, Table, TableColumn, Tag, Input, InputNumber, Dialog, Form, FormItem, Switch, Select, Option, Checkbox, Autocomplete, Col, Tree, Divider } from 'element-ui'
import Plugin from 'v-fit-columns'
Vue.use(Button)
Vue.use(Col)
Vue.use(Table)
Vue.use(TableColumn)
Vue.use(Tag)
Vue.use(Input)
Vue.use(InputNumber)
Vue.use(Dialog)
Vue.use(Form)
Vue.use(FormItem)
@@ -13,4 +15,8 @@ Vue.use(Switch)
Vue.use(Plugin)
Vue.use(Select)
Vue.use(Option)
Vue.use(Checkbox)
Vue.use(Autocomplete)
Vue.use(Tree)
Vue.use(Divider)
Vue.prototype.$message = Message

View File

@@ -1,7 +1,63 @@
import { sites } from '../dexie'
import { sites, setting } from '../dexie'
import axios from 'axios'
import parser from 'fast-xml-parser'
import cheerio from 'cheerio'
import { Parser as M3u8Parser } from 'm3u8-parser'
// axios使用系统代理 https://evandontje.com/2020/04/02/automatic-system-proxy-configuration-for-electron-applications/
// xgplayer使用chromium代理设置浏览器又默认使用系统代理 https://www.chromium.org/developers/design-documents/network-settings
// 要在设置中添加代理设置可参考https://stackoverflow.com/questions/37393248/how-connect-to-proxy-in-electron-webview
var http = require('http')
var https = require('http')
const { remote } = require('electron')
var win = remote.getCurrentWindow()
var session = win.webContents.session
var ElectronProxyAgent = require('electron-proxy-agent')
// 请求超时时限
axios.defaults.timeout = 10000 // 可能使用代理,增长超时
// 重试次数共请求3次
axios.defaults.retry = 2
// 请求的间隙
axios.defaults.retryDelay = 1000
// 添加响应拦截器
axios.interceptors.response.use(function (response) {
// 对响应数据做些事
if (response.status && response.status === 200 && response.request.responseURL.includes('api.php') && !response.data.startsWith('<?xml')) {
}
return response
}, function (err) { // 请求错误时做些事
// 请求超时的之后,抛出 err.code = ECONNABORTED的错误..错误信息是 timeout of xxx ms exceeded
if (err.code === 'ECONNABORTED' && err.message.indexOf('timeout') !== -1) {
var config = err.config
config.__retryCount = config.__retryCount || 0
if (config.__retryCount >= config.retry) {
err.message = '多次请求均超时'
return Promise.reject(err)
}
config.__retryCount += 1
var backoff = new Promise(function (resolve) {
setTimeout(function () {
resolve()
}, config.retryDelay || 1)
})
return backoff.then(function () {
return axios(config)
})
} else {
if (err && !err.response) {
err.message = '连接服务器失败!'
}
return Promise.reject(err)
}
})
const zy = {
xmlConfig: { // XML 转 JSON 配置
@@ -36,9 +92,10 @@ const zy = {
axios.post(url).then(res => {
const data = res.data
const json = parser.parse(data, this.xmlConfig)
const jsondata = json.rss === undefined ? json : json.rss
const arr = []
if (json.rss.class) {
for (const i of json.rss.class.ty) {
if (jsondata.class) {
for (const i of jsondata.class.ty) {
const j = {
tid: i._id,
name: i._t
@@ -48,10 +105,10 @@ const zy = {
}
const doc = {
class: arr,
page: json.rss.list._page,
pagecount: json.rss.list._pagecount,
pagesize: json.rss.list._pagesize,
recordcount: json.rss.list._recordcount
page: jsondata.list._page,
pagecount: jsondata.list._pagecount,
pagesize: jsondata.list._pagesize,
recordcount: jsondata.list._recordcount
}
resolve(doc)
}).catch(err => {
@@ -80,7 +137,8 @@ const zy = {
axios.post(url).then(async res => {
const data = res.data
const json = parser.parse(data, this.xmlConfig)
const videoList = json.rss.list.video
const jsondata = json.rss === undefined ? json : json.rss
const videoList = jsondata.list.video
resolve(videoList)
}).catch(err => {
reject(err)
@@ -107,11 +165,12 @@ const zy = {
axios.post(url).then(async res => {
const data = res.data
const json = parser.parse(data, this.xmlConfig)
const jsondata = json.rss === undefined ? json : json.rss
const pg = {
page: json.rss.list._page,
pagecount: json.rss.list._pagecount,
pagesize: json.rss.list._pagesize,
recordcount: json.rss.list._recordcount
page: jsondata.list._page,
pagecount: jsondata.list._pagecount,
pagesize: jsondata.list._pagesize,
recordcount: jsondata.list._recordcount
}
resolve(pg)
}).catch(err => {
@@ -135,8 +194,9 @@ const zy = {
axios.post(url, { timeout: 3000 }).then(res => {
const data = res.data
const json = parser.parse(data, this.xmlConfig)
if (json && json.rss && json.rss.list) {
const videoList = json.rss.list.video
const jsondata = json.rss === undefined ? json : json.rss
if (json && jsondata && jsondata.list) {
const videoList = jsondata.list.video
resolve(videoList)
}
}).catch(err => {
@@ -160,7 +220,23 @@ const zy = {
axios.post(url).then(res => {
const data = res.data
const json = parser.parse(data, this.xmlConfig)
const videoList = json.rss.list.video
const jsondata = json.rss === undefined ? json : json.rss
const videoList = jsondata.list.video
// Parse m3u8List
var m3u8List = []
const dd = videoList.dl.dd
const type = Object.prototype.toString.call(dd)
if (type === '[object Array]') {
for (const i of dd) {
// 如果含有多个视频列表的话, 仅获取m3u8列表
if (i._flag.includes('m3u8')) {
m3u8List = i._t.split('#')
}
}
} else {
m3u8List = dd._t.split('#')
}
videoList.m3u8List = m3u8List
resolve(videoList)
}).catch(err => {
reject(err)
@@ -180,12 +256,25 @@ const zy = {
return new Promise((resolve, reject) => {
this.getSite(key).then(res => {
const site = res
const url = `${site.download}?ac=videolist&ids=${id}&ct=1`
if (url) {
if (site.download) {
const url = `${site.download}?ac=videolist&ids=${id}&ct=1`
axios.post(url).then(res => {
const data = res.data
const json = parser.parse(data, this.xmlConfig)
const videoList = json.rss.list.video
const jsondata = json.rss === undefined ? json : json.rss
const videoList = jsondata.list.video
// Parse m3u8List
var m3u8List = []
const dd = videoList.dl.dd
const type = Object.prototype.toString.call(dd)
if (type === '[object Array]') {
for (const i of dd) {
m3u8List = i._t.split('#')
}
} else {
m3u8List = dd._t.split('#')
}
videoList.m3u8List = m3u8List
resolve(videoList)
}).catch(err => {
reject(err)
@@ -214,11 +303,34 @@ const zy = {
}
},
/**
* 获取豆瓣评分
* @param {*} name 视频名称
* @returns 豆瓣评分
* 检查直播源
* @param {*} channel 直播频道 url
* @returns boolean
*/
doubanRate (name) {
async checkChannel (channel) {
return new Promise((resolve, reject) => {
axios.get(channel).then(res => {
const manifest = res.data
var parser = new M3u8Parser()
parser.push(manifest)
parser.end()
var parsedManifest = parser.manifest
if (parsedManifest.segments.length) {
resolve(true)
} else {
resolve(false)
}
}).catch(e => {
resolve(false)
})
})
},
/**
* 获取豆瓣页面链接
* @param {*} name 视频名称
* @returns 豆瓣页面链接,如果没有搜到该视频,返回搜索页面链接
*/
doubanLink (name) {
return new Promise((resolve, reject) => {
// 豆瓣搜索链接
var nameToSearch = name.replace(/\s/g, '')
@@ -229,36 +341,75 @@ const zy = {
var link = ''
var linkInDouban = $($('div.result')[0]).find('div>div>h3>a').first()
var nameInDouban = linkInDouban.text().replace(/\s/g, '')
if (nameToSearch.includes(nameInDouban) || nameInDouban.includes(nameToSearch)) {
if (nameToSearch === nameInDouban) {
link = linkInDouban.attr('href')
} else {
linkInDouban = $($('div.result')[1]).find('div>div>h3>a').first()
nameInDouban = linkInDouban.text().replace(/\s/g, '')
if (nameToSearch.includes(nameInDouban) || nameInDouban.includes(nameToSearch)) {
if (nameToSearch === nameInDouban) {
link = linkInDouban.attr('href')
}
}
// 如果找到链接,就打开该链接获取评分
if (link) {
resolve(link)
} else {
// 如果没找到符合的链接,返回搜索页面
resolve(doubanSearchLink)
}
}).catch(err => {
reject(err)
})
})
},
/**
* 获取豆瓣评分
* @param {*} name 视频名称
* @returns 豆瓣评分
*/
doubanRate (name) {
return new Promise((resolve, reject) => {
var nameToSearch = name.replace(/\s/g, '')
this.doubanLink(nameToSearch).then(link => {
if (link.includes('https://www.douban.com/search')) {
resolve('暂无评分')
} else {
axios.get(link).then(response => {
const parsedHtml = cheerio.load(response.data)
var rating = parsedHtml('body').find('#interest_sectl').first().find('strong').first()
if (rating.text()) {
resolve(rating.text())
resolve(rating.text().replace(/\s/g, ''))
} else {
resolve('暂无评分')
}
}).catch(err => {
reject(err)
})
} else {
resolve('暂无评分')
}
}).catch(err => {
reject(err)
})
})
},
async proxy () {
return new Promise((resolve, reject) => {
setting.find().then(db => {
if (db && db.proxy && db.proxy.type === 'manual') {
if (db.proxy.scheme && db.proxy.url && db.proxy.port) {
const proxyURL = db.proxy.scheme + '://' + db.proxy.url.trim() + ':' + db.proxy.port.trim()
session.setProxy({ proxyRules: proxyURL })
http.globalAgent = https.globalAgent = new ElectronProxyAgent(session)
}
} else {
session.setProxy({ proxyRules: 'direct://' })
http.globalAgent = https.globalAgent = new ElectronProxyAgent(session)
}
// 不要删了,留着测试用
// axios.get('https://api.my-ip.io/ip').then(res => console.log(res))
})
})
}
}
zy.proxy()
export default zy

View File

@@ -1,527 +0,0 @@
<template>
<div class="mini">
<div class="header">
<div class="left">
<span class="title">
<span v-if="m3u8Arr.length > 1"> {{(video.index + 1)}} </span>{{name}}
</span>
<span class="zy-svg" @click="prevEvent" v-show="video.index > 0">
<svg role="img" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-labelledby="backIconTitle">
<title id="backIconTitle">上一集</title>
<path d="M14 14.74L21 19V5l-7 4.26V5L2 12l12 7v-4.26z"></path>
</svg>
</span>
<span class="zy-svg" @click="nextEvent" v-show="video.index < (m3u8Arr.length - 1)">
<svg role="img" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" aria-labelledby="forwardIconTitle">
<title id="forwardIconTitle">下一集</title>
<path d="M10 14.74L3 19V5l7 4.26V5l12 7-12 7v-4.26z"></path>
</svg>
</span>
<span class="opacity" v-show="opacity !== 100">透明度: {{opacity}}</span>
<span class="rate" v-show="rate !== 1">播放速率: {{rate}}</span>
<span class="progress" v-show="progress > 0">播放进度: {{progress}}%</span>
</div>
<div class="right">
<span class="topping" @click="frameClickEvent('top')" title="置顶">
<svg t="1595919317571" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1188" style="width:10px;height:14px"><path d="M43.072 974.72l380.864-301.952 151.936 161.6c0 0 63.424 17.28 67.328-30.72l-3.904-163.584 225.088-259.648 98.048-5.696c0 0 76.928-15.488 21.184-82.752l-275.072-276.928c0 0-74.944-9.6-69.248 59.584l0 75.008L383.552 367.104 225.856 376.64c0 0-57.728 19.2-36.608 69.248l148.16 146.176L43.072 974.72 43.072 974.72z" p-id="1189" :fill="isAlwaysOnTop ? '#555555' : '#ffffff'"></path></svg>
</span>
<span class="min" @click="frameClickEvent('min')" title="最小化">
<svg t="1595917239849" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1155" style="width:8px;height:14px"><path d="M0 479.936C0 444.64 28.448 416 64.064 416L959.936 416C995.328 416 1024 444.736 1024 479.936L1024 544.064C1024 579.392 995.552 608 959.936 608L64.064 608C28.672 608 0 579.264 0 544.064L0 479.936Z" p-id="1156" fill="#ffffff"></path></svg>
</span>
<span class="max" @click="frameClickEvent('max')" title="最大化">
<svg t="1595917343956" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1540" style="width:8px;height:14px"><path d="M416 416 64.064 416C28.448 416 0 444.64 0 479.936L0 544.064C0 579.264 28.672 608 64.064 608L416 608 416 959.936C416 995.552 444.64 1024 479.936 1024L544.064 1024C579.264 1024 608 995.328 608 959.936L608 608 959.936 608C995.552 608 1024 579.36 1024 544.064L1024 479.936C1024 444.736 995.328 416 959.936 416L608 416 608 64.064C608 28.448 579.36 0 544.064 0L479.936 0C444.736 0 416 28.672 416 64.064L416 416Z" p-id="1541" fill="#ffffff"></path></svg>
</span>
<span class="close" @click="frameClickEvent('close')" title="退出精简模式">
<svg t="1595917372551" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1685" style="width:8px;height:14px"><path d="M511.968 376.224 796.096 92.096C833.536 54.624 894.4 54.624 931.84 92.096 969.312 129.568 969.312 190.4 931.84 227.872L647.744 512 931.84 796.096C969.312 833.568 969.312 894.4 931.84 931.872 894.4 969.344 833.536 969.344 796.096 931.872L511.968 647.744 227.84 931.872C190.4 969.344 129.536 969.344 92.096 931.872 54.624 894.4 54.624 833.568 92.096 796.096L376.224 512 92.096 227.872C54.624 190.4 54.624 129.568 92.096 92.096 129.536 54.624 190.4 54.624 227.84 92.096L511.968 376.224Z" p-id="1686" fill="#ffffff"></path></svg>
</span>
</div>
</div>
<div class="footer">
<div id="xg"></div>
</div>
</div>
</template>
<script>
import zy from '../lib/site/tools'
import { history, setting, shortcut, mini } from '../lib/dexie'
import mt from 'mousetrap'
import 'xgplayer'
import Hls from 'xgplayer-hls.js'
const { remote, ipcRenderer } = require('electron')
const VIDEO_DETAIL_CACHE = {}
export default {
name: 'mini',
data () {
const win = remote.getCurrentWindow()
return {
xg: null,
config: {
id: 'xg',
url: '',
lang: 'zh-cn',
width: '100%',
height: '100%',
autoplay: false,
videoInit: true,
screenShot: true,
keyShortcut: 'off',
crossOrigin: true,
cssFullscreen: true,
defaultPlaybackRate: 1,
playbackRate: [0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 3, 4, 5],
controls: false
},
opacity: 100,
name: '',
video: {},
detail: {},
m3u8Arr: [],
rate: 1,
progress: 0,
isAlwaysOnTop: win.isAlwaysOnTop()
}
},
methods: {
frameClickEvent (e) {
const win = remote.getCurrentWindow()
if (e === 'min') {
win.minimize()
}
if (e === 'max') {
win.isMaximized() ? win.unmaximize() : win.maximize()
}
if (e === 'close') {
ipcRenderer.send('win')
return false
}
if (e === 'top') {
this.isAlwaysOnTop = !this.isAlwaysOnTop
win.setAlwaysOnTop(this.isAlwaysOnTop)
}
},
opacityChange (val) {
const win = remote.getCurrentWindow()
const num = val / 100
win.setOpacity(num)
return false
},
getUrls () {
mini.find().then(res => {
this.video = res
this.fetchM3u8List(res).then(m3u8Arr => {
this.m3u8Arr = m3u8Arr
this.xg.src = m3u8Arr[res.index]
if (res.time !== 0 || res.time !== '') {
this.xg.play()
this.xg.once('playing', () => {
this.xg.currentTime = res.time
})
} else {
this.xg.play()
}
this.videoPlaying()
this.xg.once('ended', () => {
if (m3u8Arr.length > 1 && (m3u8Arr.length - 1 > res.index)) {
this.video.time = 0
this.video.index++
this.xg.src = m3u8Arr[this.video.index]
this.xg.play()
}
})
})
})
},
fetchM3u8List (info) {
return new Promise((resolve) => {
const cacheKey = info.site + '@' + info.ids
if (VIDEO_DETAIL_CACHE[cacheKey]) {
this.name = VIDEO_DETAIL_CACHE[cacheKey].name
resolve(VIDEO_DETAIL_CACHE[cacheKey].list)
return
}
zy.detail(info.site, info.ids).then(res => {
this.name = res.name
const dd = res.dl.dd
const type = Object.prototype.toString.call(dd)
let m3u8Txt = []
if (type === '[object Array]') {
for (const i of dd) {
if (i._t.indexOf('m3u8') >= 0) {
m3u8Txt = i._t.split('#')
}
}
} else {
m3u8Txt = dd._t.split('#')
}
const m3u8Arr = []
for (const i of m3u8Txt) {
const j = i.split('$')
if (j.length > 1) {
for (let m = 0; m < j.length; m++) {
if (j[m].indexOf('m3u8') >= 0) {
m3u8Arr.push(j[m])
}
}
} else {
m3u8Arr.push(j[0])
}
}
VIDEO_DETAIL_CACHE[cacheKey] = {
list: m3u8Arr,
name: res.name
}
resolve(m3u8Arr)
})
})
},
async videoPlaying () {
const db = await history.find({ site: this.video.site, ids: this.video.ids })
if (db) {
db.index = this.video.index
history.update(db.id, db)
} else {
const doc = {
site: this.video.site,
ids: this.video.ids,
name: this.video.name,
index: this.video.index,
time: 0
}
history.add(doc)
}
this.timerEvent()
},
timerEvent () {
this.timer = setInterval(async () => {
const endTime = this.xg.duration
const currentTime = this.xg.currentTime
const progress = (currentTime / endTime) * 100
this.progress = progress.toFixed(2)
const db = await history.find({ site: this.video.site, ids: this.video.ids })
if (db) {
const v = db
v.time = this.xg.currentTime
v.index = this.video.index
const id = v.id
delete v.id
history.update(id, v)
}
}, 10000)
},
async prevEvent () {
if (this.video.index === 0) {
this.$message.info('已是第一集.')
return false
}
const db = await history.find({ site: this.video.site, ids: this.video.ids })
if (db) {
const v = db
const id = v.id
v.index--
delete v.id
history.update(id, v).then(e => {
this.xg.src = this.m3u8Arr[v.index]
this.video.index--
})
}
},
async nextEvent () {
if (this.video.index >= this.m3u8Arr.length - 1) {
this.$message.info('已是最后一集.')
return false
}
const db = await history.find({ site: this.video.site, ids: this.video.ids })
if (db) {
const v = db
v.index++
const id = v.id
delete v.id
history.update(id, v).then(e => {
this.xg.src = this.m3u8Arr[v.index]
this.video.index++
})
}
},
playbackRateEvent (e) {
let rate = this.xg.playbackRate
if (rate > 0.25) {
rate = rate + e
this.xg.playbackRate = rate
}
},
mtEvent () {
setting.find().then(res => {
if (res.shortcut) {
shortcut.all().then(res => {
for (const i of res) {
mt.bind(i.key, () => {
this.shortcutEvent(i.name)
})
}
})
}
})
},
shortcutEvent (e) {
if (e === 'playAndPause') {
if (this.xg) {
if (this.xg.paused) {
this.xg.play()
} else {
this.xg.pause()
}
}
return false
}
if (e === 'forward') {
if (this.xg && !this.xg.paused) {
this.xg.currentTime += 5
}
return false
}
if (e === 'back') {
if (this.xg && !this.xg.paused) {
this.xg.currentTime -= 5
}
return false
}
if (e === 'volumeUp') {
if (this.xg && this.xg.volume < 0.9) {
this.xg.volume += 0.1
}
return false
}
if (e === 'volumeDown') {
if (this.xg && this.xg.volume > 0.2) {
this.xg.volume -= 0.1
}
return false
}
if (e === 'mute') {
if (this.xg) {
this.xg.volume = 0
}
return false
}
if (e === 'top') {
const win = remote.getCurrentWindow()
if (win.isAlwaysOnTop()) {
win.setAlwaysOnTop(false)
} else {
win.setAlwaysOnTop(true)
}
return false
}
if (e === 'fullscreen') {
if (this.xg.fullscreen) {
this.xg.exitFullscreen()
} else {
this.xg.getFullscreen(this.xg.root)
}
return false
}
if (e === 'escape') {
if (this.xg.fullscreen) {
this.xg.exitFullscreen()
this.xg.exitCssFullscreen()
}
return false
}
if (e === 'next') {
this.nextEvent()
return false
}
if (e === 'prev') {
this.prevEvent()
return false
}
if (e === 'home') {
if (this.xg && !this.xg.paused) {
this.xg.currentTime = 0
}
return false
}
if (e === 'end') {
if (this.xg && !this.xg.paused) {
const endTime = this.xg.duration
this.xg.currentTime = endTime
}
return false
}
if (e === 'opacityUp') {
const win = remote.getCurrentWindow()
if (this.opacity >= 10) {
this.opacity -= 5
const num = this.opacity / 100
win.setOpacity(num)
}
return false
}
if (e === 'opacityDown') {
const win = remote.getCurrentWindow()
if (this.opacity <= 95) {
this.opacity += 5
const num = this.opacity / 100
win.setOpacity(num)
}
return false
}
if (e === 'playbackRateUp') {
if (this.xg && !this.xg.paused) {
const rate = this.xg.playbackRate
this.xg.playbackRate = rate + 0.25
this.rate = this.xg.playbackRate
}
return false
}
if (e === 'playbackRateDown') {
if (this.xg && !this.xg.paused) {
const rate = this.xg.playbackRate
if (rate > 0.25) {
this.xg.playbackRate = rate - 0.25
this.rate = this.xg.playbackRate
}
}
return false
}
if (e === 'mini') {
ipcRenderer.send('win')
return false
}
}
},
mounted () {
this.xg = new Hls(this.config)
this.mtEvent()
this.getUrls()
},
beforeDestroy () {
clearInterval(this.timer)
}
}
</script>
<style lang="scss">
html,body{
padding: 1px;
margin: 0;
height: 100%;
width: 100%;
overflow: hidden;
background-color: #000;
}
.mini{
-webkit-app-region: drag;
box-sizing: border-box;
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: flex-start;
flex-direction: column;
.header{
width: 100%;
height: 30px;
min-height: 30px;
display: flex;
justify-content: space-between;
align-items: center;
user-select: none;
.zy-svg{
-webkit-app-region: no-drag;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
svg{
width: 24px;
height: 24px;
stroke: #888;
stroke-width: 1;
stroke-linecap: round;
stroke-linejoin: round;
fill: none;
}
}
.left{
display: flex;
justify-content: flex-start;
align-items: center;
height: 100%;
flex: 1;
.title, .opacity, .rate, .progress{
color: #888;
font-size: 12px;
margin: 0 10px;
}
}
.right{
width: 100px;
height: 100%;
display: flex;
justify-content: flex-end;
align-items: center;
span{
-webkit-app-region: no-drag;
display: flex;
align-items: center;
justify-content: center;
width: 15px;
height: 15px;
text-align: center;
line-height: 15px;
border-radius: 50%;
margin-right: 10px;
cursor: pointer;
opacity: 0.4;
&.topping{
background-color: #f3bab7;
}
&.min{
background-color: #32dc36;
}
&.max{
background-color: #ffbe2a;
}
&.close{
background-color: #ff5f56;
}
&:hover{
animation: heartbeat 3s ease-in-out infinite both;
}
@keyframes heartbeat {
from {
transform: scale(1);
transform-origin: center center;
animation-timing-function: ease-out;
}
10% {
opacity: 1;
transform: scale(0.91);
animation-timing-function: ease-in;
}
17% {
transform: scale(0.98);
animation-timing-function: ease-out;
}
33% {
transform: scale(0.87);
animation-timing-function: ease-in;
}
45% {
transform: scale(1);
animation-timing-function: ease-out;
}
}
}
}
}
.footer{
width: 100%;
flex: 1;
.xgplayer-start{
-webkit-app-region: no-drag;
}
}
}
</style>

View File

@@ -1,10 +0,0 @@
import Vue from 'vue'
import Mini from './Mini'
import 'modern-normalize'
import '../lib/element/index'
Vue.config.productionTip = false
new Vue({
render: h => h(Mini)
}).$mount('#app')

View File

@@ -26,8 +26,8 @@ export default new Vuex.Store({
key: '',
info: {}
},
editSites: {
sites: []
appState: {
windowIsOnTop: false
}
},
getters: {
@@ -46,8 +46,8 @@ export default new Vuex.Store({
getVideo: state => {
return state.video
},
getEditSites: state => {
return state.editSites
getAppState: state => {
return state.appState
}
},
mutations: {
@@ -66,8 +66,8 @@ export default new Vuex.Store({
SET_VIDEO: (state, payload) => {
state.video = payload
},
SET_EDITSITES: (state, payload) => {
state.editSites = payload
SET_APPSTATE: (state, payload) => {
state.appState = payload
}
}
})

View File

@@ -1,7 +1,6 @@
module.exports = {
pages: {
index: 'src/main.js',
mini: 'src/mini/main.js'
index: 'src/main.js'
},
pluginOptions: {
electronBuilder: {

1909
yarn.lock

File diff suppressed because it is too large Load Diff