Add files via upload

This commit is contained in:
yigedashu
2026-02-03 14:55:43 +08:00
committed by GitHub
parent 93dccbf489
commit cb12329990
15 changed files with 6186 additions and 720 deletions
+238
View File
@@ -0,0 +1,238 @@
20260202
新增爱玩音乐
新增团夕高清电视直播点播
20260201
新增快手直播
新增剧王短剧
新增甜圈短剧
新增盒马短剧
新增韩剧影视
新增几个动漫
精简优化js和py示例
20260131
更新荐片
优化网盘播放
ISO播不了暂时移除4K指南
20260130
新增一个直播源
更新KTV数据库
新增YouTube直播
新增几个解析接口
新增Ytube
20260128
优化TG支持自定义
优化盘搜,取最快返回数据
更改我的百度,我的UC,我的夸克,我的阿里,我的天翼视频排序方式为文件名升序
20260127
新增go代理HEAD探测
go代理兼容夸克特殊视频
20260126
新增网盘注册
优化夸克网盘支持播放ISO原盘
新增4K指南,很多是夸克原盘超过10G,没会员播不了测不了
调整商店栏目位置,打开商店一眼就到当前接口版本和最新接口版本
20260125
新增看球源直播
新增说球源直播➕回放
新增人人4K网盘源
新增急救教学
优化看球
优化网盘多线程并发解析,增强稳定性
20260124
新增一堆APP源,移除失效APP源,优化模版
20260122
移除Java代理引擎
优化默认线程块配置
新增go代理自定义DNS设置
新增商店更新中查看使用说明
新增商店更新中查看更新日志
修复线程配置对话框适配电视界面
优化我的天翼,未登录时直接弹出登录对话框
盘他已兼容安卓6但是盘他里面的网盘视频请使用ijk播放核心播放器,高版本请忽略
新增UC、夸克、百度、阿里网盘手动清理缓存目录tv_temp_saved
新增UC、夸克、百度、阿里网盘根据自定义保留时间自动清理缓存目录tv_temp_saved,默认1天
20260121
移除失效的两个app源
更新商店ok影视下载地址
经过测试天翼需要继续开启多线程
20260120
go代理优化内存池,性能大幅提升
go代理解锁队列深度限制,性能大幅提升
根据设备内存动态限制线程和块自定义组合,防止电视爆炸
修复java代理端口占用时不会自动切端口
天翼多线程容易被锁速,改为直连
20260119
新增热播
盘它兼容安卓6
20260118
新增自定义挂载阿里分享
优化盘他,移动兼容性
盘搜支持配置中心自定义域名
20260117
优化移动盘
优化哔哩影视
20260116
新增星影直播
新增自定义挂载夸克分享
新增自定义挂载优囍分享
新增自定义挂载百度分享
修复哔哩影视,部分视频解析失败
20260115
修复听书集数
优化跨社低版本兼容性
优化阿里
20260114
优化盘搜
优化听书搜索
修跨社导航菜单
更换立播域名
修复BUG,提升稳定性
新增我的夸克推荐栏目,实现可以目录结构显示自定义任意分享链接
20260112
完善哔哩哔哩
移除失效源
20260111
新增网盘源多域名优选解析
新增两APP
20260110
针对多个网盘线路采用多线程并发处理
20260109
新增玩偶,木偶,蜡笔,至臻,多多
新增盘搜配置中心自定义主域名,注意主域名有效时仅展示主域名资源!
移除天堂
移除seedhub
20260108
修复斗鱼
移除二进制本地加载
修复模拟器凯速登录输入框显示
修复盘搜api地址错误
降低jsoup到1.15.3,增强低版本兼容性
移除Apache 工具类commons等库,使用本地工具类
20260105
优化TG搜
优化盘搜
移除天翼代理播放
20260105
新增听书
移除linux二进制
20260103
新增戏曲
新增蜻蜓FM
新增我的夸克
新增我的阿里
新增我的天懿
修复降低api导致的cookie保存错误
修复降低api导致的凯速上传下载失败
20260102
重构低版本兼容代码
修复混淆导致的错误
修复高API导致的崩溃
20260101
修复百度扫码登录
增强低版本兼容
新增我的百度
移除百度,甜圈短剧API已失效
20251230
修复缓存引起的问题
修复荐片,哔哩,配置中心,商店,配置文件解析
修复斗鱼
20251230
新增我的优囍
更新go代理支持多线程文件下载
修复凯速兼容安卓6
20251227
新增阿里云盘支持
聚合短剧移除碎片平台,新增软鸭
新增瓜子
20251225
修复围观短剧,清理无用代码
恢复本地数据库直链播放
修复本地数据库默认路径
20251224
修复斗鱼
优化本地数据库播放,调用推送播放数据库链接
新增KTV,需要在配置中心网络数据数据先下载KTV数据库
20251221
修复go代理压缩导致Bad system call
修复聚合短剧,无法显示更多页面,新增筛选
新增凯速远程扫描输入token,方便电视端输入
优化同步凯速云端cookie
修复无法自定义块大小
新增ABI手动选择器,在配置中心
优化go引擎状态探测显示
20251217
凯速备份优化
go代理尝试支持32位安卓9盒子
新增聚合短剧
20251216
商店APK下载优化
代理地址优化
配置中心和商店去掉推荐
实现本地包在线更新
实现github工作流自动打包本地包并发布
20251215
实现备份本地目录/storage/emulated/0/TVData/cookie/下面的cookie到凯速/TVData/cookie/
实现下载凯速/TVData/cookie/目录的cookie到本地目录/storage/emulated/0/TVData/cookie/
20251214
在线接口走网络,本地包走本地,智能判断
实现本地包,可以放置在任意目录
20251127
修复百度网盘推送
隐藏不稳定站点飞快,跨社
优化夸克自动清理
修复夸克播自己分享的
20251127
优化GO代理
统一cookie路径命名项目结构更清晰
优化性能
20251127
打包优化
二进制API23 安卓6
修复无法动态覆盖旧二进制
20251126
修复123登录
修复123登录持久化
新增网盘多线程自定义配置
修复百度播自己分享的
修复百度路径不存在时创建大量垃圾目录
+53
View File
@@ -0,0 +1,53 @@
推荐使用OK影视或者影视最新版壳
最低兼容安卓6,如果发现播放时闪退等情况,请请使用影视最新版本切换ijk播放核心。
❣️注意:仅交流学习,请勿用于商业用途,视频中出现的任何广告,请勿相信!!!!!
❣️注意:请切勿在网盘tv_temp_saved目录放重要文件,此目录仅作为视频播放服务临时转存目录会不定期清除!
点播地址填写
在线接口1
https://chigua.eu.org
在线接口2
https://16151.kstore.space
本地包主入口
file://本地包名/api.json
py爬虫入口
file://本地包名/py.json
js爬虫入口
file://本地包名/js.json
本地包说明
✔️本地包支持改名字,例如:file://dongli/api.json
✔️支持任义路径放置本地包
✔️推荐本地包根目录:/storage/emulated/0/dp/
✔️cookie固定保存目录:/storage/emulated/0/TVData/cookie
✔️数据库固定保存目录:/storage/emulated/0/TVData/db
✔️配置文件固定保存目录:/storage/emulated/0/TVData/config
✔️商店里APK和本地包下载目录:/storage/emulated/0/Download/
✔️本地数据库需要指定自定义映射配置文件,具体映射参考示例配置
https://v6.gh-proxy.org/https://raw.githubusercontent.com/chitue/dongliTV/refs/heads/main/config/local_database_mapping.json
✔️网盘类播放需要配置中心提前设置cookie
✔️cookie默认会存储到本地/storage/emulated/0/TVData/cookie目录
✔️cookie云备份恢复通过配置凯速access_token可以将本地cookie存储到凯速直链云存储里面,实现多设备一键恢复cookie配置
✔️凯速access_token默认保存地址/storage/emulated/0/TVData/kstore_token.txt
凯速access_token请到以下页面底部获取
https://my.ksust.com/kstore.htm?aff=16151
注意:
网络数据库下载后请重启APP生效
目前本地数据库仅支持直链播放
网盘优先顺序个人推荐,百度,夸克,UC,阿里,天翼,123(每月20G流量)
东篱影视专用资源网盘下载`
UC
https://drive.uc.cn/s/084710ec4dc04?public=1
夸克
https://pan.quark.cn/s/514a56ac6d23
百度
https://pan.baidu.com/s/13JGvmZlFIqJblaDFRGthVQ?pwd=2026
+1746
View File
@@ -0,0 +1,1746 @@
{
"logo": "./assets/logo2025121201.png",
"warningText": "禁止任何商业用途,仅限个人学习爬虫原理使用!",
"wallpaper": "https://tu.ltyuanfang.cn/api/fengjing.php",
"spider": "./jar/dongli-spider.jar",
"sites": [
{
"key": "Douban",
"name": "📚|豆瓣|推荐",
"type": 3,
"api": "csp_Douban",
"searchable": 0,
"filterable": 1
},
{
"key": "配置",
"name": "🔨|配置|中心",
"type": 3,
"api": "csp_ConfigCenter",
"searchable": 0,
"changeable": 0,
"style": {
"type": "list",
"ratio": 1.433
},
"ext": "./config/configcenter.json"
},
{
"key": "QD4K",
"name": "🌇|团夕|直播",
"type": 3,
"searchable": 1,
"quickSearch": 0,
"api": "csp_AppV2P1",
"playerType": 2,
"ext": {
"api": "http://dmmax.kuailezhuiju2.com/icciu_api.php/v1.vod",
"datasignkey": "6QQNUsP3PkD2ajJCPCY8",
"apisignkey": "lvdoutv-1.0.0"
}
},
{
"key": "xingying",
"name": "🌇|星影|直播",
"type": 3,
"api": "csp_AppGet",
"searchable": 1,
"quickSearch": 1,
"changeable": 0,
"filterable": 1,
"timeout": 30,
"ext": {
"site": "http://110.81.153.7:1963/get.txt",
"dataKey": "k7L9mQ2xR4pW8n88",
"dataIv": "k7L9mQ2xR4pW8n88",
"version": "2"
}
},
{
"key": "Huya",
"name": "🌇|虎牙|直播",
"type": 3,
"api": "csp_Huya",
"searchable": 0,
"quickSearch": 0,
"changeable": 0,
"filterable": 1,
"timeout": 10,
"style": {
"type": "rect",
"ratio": 1.433
}
},
{
"key": "Douyu",
"name": "🌇|斗鱼|直播",
"type": 3,
"api": "csp_Douyu",
"searchable": 0,
"quickSearch": 0,
"changeable": 0,
"filterable": 1,
"timeout": 10,
"style": {
"type": "rect",
"ratio": 1.433
}
},
{
"key": "KuaiShou",
"name": "🌇|快手|直播",
"type": 3,
"api": "csp_KuaiShou",
"changeable": 0,
"filterable": 1,
"timeout": 10,
"style": {
"type": "rect",
"ratio": 1.433
}
},
{
"key": "BiliLive",
"name": "🌇|哔哩|直播",
"type": 3,
"api": "csp_BiliLive",
"searchable": 0,
"quickSearch": 0,
"changeable": 0,
"filterable": 1,
"timeout": 10,
"style": {
"type": "rect",
"ratio": 1.433
}
},
{
"key": "wogg",
"name": "💗|玩偶|网盘",
"type": 3,
"api": "csp_Wogg",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"changeable": 0,
"ext": {
"site": [
"https://woggpan.888484.xyz/",
"https://wogg.333232.xyz/",
"http://woggpan.xxooo.cf/",
"https://www.wogg.one/",
"http://www.wogg.lol/",
"https://wogg.xxooo.cf/"
]
}
},
{
"key": "木偶",
"name": "💗|木偶|网盘",
"type": 3,
"api": "csp_MacCMS",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"changeable": 0,
"ext": {
"site": [
"https://123.666291.xyz",
"https://666.666291.xyz",
"https://www.muou.site",
"https://www.muou.asia"
]
}
},
{
"key": "蜡笔",
"name": "💗|蜡笔|网盘",
"type": 3,
"api": "csp_MacCMS",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"changeable": 0,
"ext": {
"site": [
"https://www.labi88.sbs",
"https://feimao666.fun",
"http://feimao888.fun"
]
}
},
{
"key": "至臻",
"name": "💗|至臻|网盘",
"type": 3,
"api": "csp_MacCMS",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"changeable": 0,
"ext": {
"site": [
"https://mihdr.top",
"https://www.miqk.cc",
"https://xiaomiai.site",
"https://xiaomi666.fun",
"https://www.mihdr.top",
"https://www.zhizhenpan.fun"
]
}
},
{
"key": "多多",
"name": "💗|多多|网盘",
"type": 3,
"api": "csp_MacCMS",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"changeable": 0,
"ext": {
"site": [
"https://tv.yydsys.top",
"https://tv.yydsys.cc",
"https://tv.214521.xyz"
]
}
},
{
"key": "欧哥",
"name": "💗|欧哥|网盘",
"type": 3,
"api": "csp_MacCMS",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"changeable": 0,
"ext": {
"site": [
"https://woog.nxog.eu.org",
"https://woog.nxog.fun",
"https://woog.430520.xyz",
"https://woog.nxog.de5.net",
"https://woog.装歌.de5.net"
]
}
},
{
"key": "二小",
"name": "💗|二小|网盘",
"type": 3,
"api": "csp_MacCMS",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"changeable": 0,
"ext": {
"site": [
"https://xhww.net",
"https://erxiaofn.site",
"https://erxiaofn.click",
"https://www.xhww.net"
]
}
},
{
"key": "虎斑",
"name": "💗|虎斑|网盘",
"type": 3,
"api": "csp_MacCMS",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"changeable": 0,
"ext": {
"site": [
"http://103.45.162.207:20720"
]
}
},
{
"key": "闪电",
"name": "💗|闪电|网盘",
"type": 3,
"api": "csp_MacCMS",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"changeable": 0,
"ext": {
"site": [
"https://shandian.blog",
"https://sd.sduc.site"
]
}
},
{
"key": "小飒",
"name": "💗|小飒|网盘",
"type": 3,
"api": "csp_MacCMS",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"changeable": 0,
"ext": {
"site": [
"http://xsayang.fun:12512"
]
}
},
{
"key": "Libvio",
"name": "💗|立播|网盘",
"type": 3,
"api": "csp_Libvio",
"searchable": 1,
"filterable": 0,
"changeable": 0,
"ext": "https://www.libvio.mov"
},
{
"key": "KuaKeS",
"name": "💗|夸社|网盘",
"type": 3,
"api": "csp_KuaKeS",
"searchable": 1,
"filterable": 0,
"changeable": 0,
"ext": {}
},
{
"key": "盘它",
"name": "💗|盘它|网盘",
"type": 3,
"api": "csp_PanTa",
"searchable": 1,
"filterable": 0,
"changeable": 0,
"style": {
"type": "list"
}
},
{
"key": "人人",
"name": "💗|人人|网盘",
"type": 3,
"api": "csp_RenRen",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"changeable": 0
},
{
"key": "glod",
"name": "🧡|金牌 | 影视",
"type": 3,
"api": "csp_Glod",
"searchable": 1,
"changeable": 1,
"ext": {}
},
{
"key": "pingguo",
"name": "🧡|苹果|影视",
"type": 3,
"api": "csp_PingGuo",
"searchable": 1,
"changeable": 1,
"ext": {
"siteUrl": "http://asp.xpgtv.com",
"filterKeywords": [
"及时雨",
"及時雨"
]
}
},
{
"key": "guazi",
"name": "🧡|瓜子 | 影视",
"type": 3,
"api": "csp_Guazi",
"searchable": 1,
"changeable": 1,
"ext": {}
},
{
"key": "XinHan",
"name": "🧡|韩剧|影视",
"type": 3,
"api": "csp_XinHan",
"searchable": 0,
"filterable": 1
},
{
"key": "热播影视",
"name": "💛|热播|APP",
"type": 3,
"api": "csp_AppRJ",
"searchable": 1,
"quickSearch": 1,
"filterable": 0,
"ext": {
"site": [
"http://v.rbotv.cn"
]
}
},
{
"key": "火狐",
"name": "💛|火狐|APP",
"type": 3,
"api": "csp_AppGet",
"ext": {
"site": "http://122.114.171.79:568/huohushipin.txt",
"dataKey": "huohushipingetap",
"dataIv": "huohushipingetap"
}
},
{
"key": "白鸽",
"name": "💛|白鸽|APP",
"type": 3,
"searchable": 1,
"changeable": 1,
"api": "csp_AppGet",
"ext": {
"url": "https://cy.baige.asia",
"dataKey": "599D0FE5178642FD",
"dataIv": "599D0FE5178642FD"
}
},
{
"key": "剧梦",
"name": "💛|剧梦|APP",
"type": 3,
"searchable": 1,
"changeable": 1,
"api": "csp_AppGet",
"ext": {
"url": "https://www.jumengwu.com",
"dataKey": "1f0a873caf2550a5",
"dataIv": "1f0a873caf2550a5"
}
},
{
"key": "魔方",
"name": "💛|魔方|APP",
"type": 3,
"searchable": 1,
"changeable": 1,
"api": "csp_AppGet",
"ext": {
"site": "https://snysw.xyz/mf4kzs327.txt",
"dataKey": "1234567887654321",
"dataIv": "1234567887654321"
}
},
{
"key": "茉莉",
"name": "💛|茉莉|APP",
"type": 3,
"searchable": 1,
"api": "csp_AppGet",
"ext": {
"site": "https://gitee.com/wmmoliill/wimg/raw/master/img/bk/9.txt",
"dataKey": "88689667dce61725",
"dataIv": "88689667dce61725"
}
},
{
"key": "灵虎",
"name": "💛|灵虎|APP",
"type": 3,
"quickSearch": 1,
"api": "csp_AppGet",
"ext": {
"site": "https://bind.315999.xyz/89.txt",
"dataKey": "#getapp@TMD@2025",
"dataIv": "#getapp@TMD@2025",
"version": "120"
}
},
{
"key": "火锅",
"name": "💛|火锅|APP",
"type": 3,
"searchable": 1,
"changeable": 1,
"api": "csp_AppGet",
"ext": {
"url": "https://ios.hgyx.vip",
"dataKey": "062dec75d039980e",
"dataIv": "062dec75d039980e",
"ua": "Dart/3.5 (dart:io)"
}
},
{
"key": "爱盈",
"name": "💛|爱盈|APP",
"type": 3,
"api": "csp_AppQi",
"changeable": "1",
"quickSearch": 1,
"filterable": 1,
"ext": {
"site": "https://rxysyyds.oss-cn-chengdu.aliyuncs.com/qiji.txt",
"dataKey": "sjvlwnhk6h9znl61",
"dataIv": "sjvlwnhk6h9znl61",
"version": "305",
"ua": "okhttp/3.10.0"
}
},
{
"key": "金牌",
"name": "💛|金牌|APP",
"type": 3,
"api": "csp_AppQi",
"changeable": "1",
"quickSearch": 1,
"filterable": 1,
"ext": {
"site": "https://dtqj.ggtvb.cc/dtjp.txt",
"dataKey": "eecbio48dsq131ee",
"dataIv": "eecbio48dsq131ee",
"search": "searchList4",
"version": "305",
"init": "initV122",
"ua": "okhttp/3.10.0"
}
},
{
"key": "奇奇",
"name": "💛|奇奇|APP",
"type": 3,
"api": "csp_AppQi",
"ext": {
"site": "https://yun-1316442804.cos.ap-guangzhou.myqcloud.com/a.txt",
"dataKey": "123456789abcdefg",
"dataIv": "123456789abcdefg"
}
},
{
"key": "juheduanju",
"name": "🌟|聚合|短剧",
"type": 3,
"api": "csp_JuheShortDrama",
"changeable": 0,
"filterable": 1
},
{
"key": "HeMa",
"name": "🌟|盒马|短剧",
"type": 3,
"api": "csp_HeMa",
"searchable": 0,
"changeable": 0,
"filterable": 1
},
{
"key": "JuWang",
"name": "🌟|剧王|短剧",
"type": 3,
"api": "csp_JuWang",
"searchable": 0,
"changeable": 0,
"filterable": 1
},
{
"key": "TianQuan",
"name": "🌟|甜圈|短剧",
"type": 3,
"api": "csp_TianQuan",
"searchable": 0,
"changeable": 0,
"filterable": 1
},
{
"key": "jianpian",
"name": "💙|荐片|P2P",
"type": 3,
"api": "csp_Jianpian",
"searchable": 1,
"changeable": 1,
"ext": "./config/jianpian.json"
},
{
"key": "Xb6v",
"name": "💙|新6V|磁力",
"type": 3,
"api": "csp_Xb6v",
"searchable": 1,
"filterable": 1
},
{
"key": "xiqu",
"name": "💙|戏曲┃大全",
"type": 3,
"api": "csp_Xiqu",
"ext": ""
},
{
"key": "CNTV",
"name": "💙|央视|综合",
"type": 3,
"api": "csp_CntvSpider",
"style": {
"type": "rect",
"ratio": 1.433
},
"changeable": 1
},
{
"key": "蜻蜓FM",
"name": "💙|蜻蜓┃FM",
"type": 3,
"api": "csp_QingTing",
"ext": ""
},
{
"key": "AiWan",
"name": "💙|爱玩|音乐",
"type": 3,
"api": "csp_AiWan",
"searchable": 1,
"changeable": 0,
"filterable": 1
},
{
"key": "tingchina",
"name": "🎧|海盗|听书",
"type": 3,
"api": "csp_TingChina",
"changeable": 0,
"filterable": 1
},
{
"key": "wuwei",
"name": "🎧|六月|听书",
"type": 3,
"api": "csp_WuWeiTing",
"changeable": 0,
"filterable": 1
},
{
"key": "bilibili",
"name": "🌈|哔哩|合集",
"type": 3,
"api": "csp_Bili",
"searchable": 1,
"changeable": 1,
"style": {
"type": "rect",
"ratio": 1.433
},
"ext": {
"json": "./config/bilibili.json",
"cookie": ""
}
},
{
"key": "哔哩哔哩演唱会",
"name": "🌈|哔哩|音乐",
"type": 3,
"api": "csp_Bili",
"searchable": 0,
"quickSearch": 0,
"filterable": 0,
"ext": {
"json": "./config/blych.json",
"cookie": ""
},
"style": {
"type": "rect",
"ratio": 1.597
}
},
{
"key": "哔哩哔哩听书",
"name": "🌈|哔哩|听书",
"type": 3,
"api": "csp_Bili",
"searchable": 0,
"quickSearch": 0,
"filterable": 0,
"ext": {
"json": "./config/blts.json",
"cookie": ""
},
"style": {
"type": "rect",
"ratio": 1.597
}
},
{
"key": "哔哩哔哩相声",
"name": "🌈|哔哩|相声",
"type": 3,
"api": "csp_Bili",
"searchable": 0,
"quickSearch": 0,
"filterable": 0,
"ext": {
"json": "./config/blxs.json",
"cookie": ""
},
"style": {
"type": "rect",
"ratio": 1.597
}
},
{
"key": "哔哩哔哩小品",
"name": "🌈|哔哩|小品",
"type": 3,
"api": "csp_Bili",
"searchable": 0,
"quickSearch": 0,
"filterable": 0,
"ext": {
"json": "./config/blxp.json",
"cookie": ""
},
"style": {
"type": "rect",
"ratio": 1.597
}
},
{
"key": "哔哩哔哩戏曲",
"name": "🌈|哔哩|戏曲",
"type": 3,
"api": "csp_Bili",
"searchable": 0,
"quickSearch": 0,
"filterable": 0,
"ext": {
"json": "./config/blxq.json",
"cookie": ""
},
"style": {
"type": "rect",
"ratio": 1.597
}
},
{
"key": "少儿教育",
"name": "🌈|少儿|教育",
"type": 3,
"api": "csp_Bili",
"searchable": 0,
"quickSearch": 0,
"filterable": 1,
"ext": {
"json": "./config/sejy.json",
"cookie": ""
},
"style": {
"type": "rect",
"ratio": 1.597
}
},
{
"key": "小学课堂",
"name": "🌈|小学|课堂",
"type": 3,
"api": "csp_Bili",
"searchable": 0,
"quickSearch": 0,
"filterable": 1,
"ext": {
"json": "./config/xxkt.json",
"cookie": ""
},
"style": {
"type": "rect",
"ratio": 1.597
}
},
{
"key": "初中课堂",
"name": "🌈|初中|课堂",
"type": 3,
"api": "csp_Bili",
"searchable": 0,
"quickSearch": 0,
"filterable": 1,
"ext": {
"json": "./config/czkt.json",
"cookie": ""
},
"style": {
"type": "rect",
"ratio": 1.597
}
},
{
"key": "高中课堂",
"name": "🌈|高中|课堂",
"type": 3,
"api": "csp_Bili",
"searchable": 0,
"quickSearch": 0,
"filterable": 1,
"ext": {
"json": "./config/gzkt.json",
"cookie": ""
},
"style": {
"type": "rect",
"ratio": 1.597
}
},
{
"key": "哔哩影视",
"name": "🌈|哔哩|影视",
"type": 3,
"api": "csp_BiliPGC",
"searchable": 1,
"quickSearch": 0,
"filterable": 0,
"changeable": 0,
"style": {
"type": "rect",
"ratio": 1.597
},
"ext": {
"json": "./config/blys.json",
"cookie": ""
}
},
{
"key": "Jzb",
"name": "⚽┃说球┃回放",
"type": 3,
"api": "csp_Jzb",
"searchable": 0,
"changeable": 0,
"style": {
"type": "list"
},
"gridview": 3,
"ext": {
"sites": ""
}
},
{
"key": "88看球",
"name": "⚽|看球|直播",
"type": 3,
"api": "csp_Kanqiu",
"searchable": 0,
"changeable": 0,
"gridview": 3,
"style": {
"type": "list"
}
},
{
"key": "樱花动漫",
"name": "💜|樱花|动漫",
"type": 3,
"api": "csp_YHDM",
"style": {
"type": "rect",
"ratio": 0.75
},
"changeable": 1
},
{
"key": "云屋动漫",
"name": "💜|云屋|动漫",
"type": 3,
"searchable": 1,
"api": "csp_AppGet",
"ext": {
"url": "https://www.yunwuee.icu",
"dataKey": "ygcnb9bdcmb8aeiw",
"dataIv": "ygcnb9bdcmb8aeiw"
}
},
{
"key": "丫丫动漫",
"name": "💜|丫丫|动漫",
"type": 3,
"searchable": 1,
"api": "csp_AppGet",
"ext": {
"url": "http://tv.yy-fun.cc",
"dataKey": "qkxnwkfjwpcnwycl",
"dataIv": "qkxnwkfjwpcnwycl"
}
},
{
"key": "方舟动漫",
"name": "💜|方舟丨动漫",
"type": 3,
"searchable": 1,
"api": "csp_AppGet",
"ext": {
"url": "https://www.cyfz.vip",
"dataKey": "e72cdfd629e8895d",
"dataIv": "e72cdfd629e8895d"
}
},
{
"key": "元咲动漫",
"name": "💜|元咲丨动漫",
"type": 3,
"searchable": 1,
"api": "csp_AppGet",
"ext": {
"url": "http://cic.aicg.fun",
"dataKey": "2c4h36abd96se10u",
"dataIv": "2c4h36abd96se10u"
}
},
{
"key": "番薯动漫",
"name": "💜|番薯丨动漫",
"type": 3,
"searchable": 1,
"api": "csp_AppGet",
"ext": {
"url": "https://new.app.bytegooty.com",
"dataKey": "N4yj7l7xKxHF4*gz",
"dataIv": "N4yj7l7xKxHF4*gz"
}
},
{
"key": "曼波动漫",
"name": "💜|曼波|动漫",
"type": 3,
"searchable": 1,
"api": "csp_AppGet",
"ext": {
"url": "https://app.omofun1.top",
"dataKey": "66dc309cbeeca454",
"dataIv": "66dc309cbeeca454"
}
},
{
"key": "咕咕动漫",
"name": "💜|咕咕|动漫",
"type": 3,
"searchable": 1,
"api": "csp_AppGet",
"ext": {
"url": "https://www.gugu3.com",
"dataKey": "nKfZ8KX6JTNWRzTD",
"dataIv": "nKfZ8KX6JTNWRzTD"
}
},
{
"key": "米饭动漫",
"name": "💜|米饭|动漫",
"type": 3,
"searchable": 1,
"api": "csp_AppGet",
"ext": {
"url": "https://get.mymifun.com",
"dataKey": "GETMIFUNGEIMIFUN",
"dataIv": "GETMIFUNGEIMIFUN"
}
},
{
"key": "push_agent",
"name": "📢|推送|中心",
"type": 3,
"api": "csp_Push",
"hide": 1,
"searchable": 0,
"changeable": 0,
"timeout": 60
},
{
"key": "本地文件",
"name": "🖤|本地|文件",
"type": 3,
"searchable": 0,
"changeable": 0,
"api": "csp_Local"
},
{
"key": "localdb",
"name": "🖤|本地数据库",
"type": 3,
"api": "csp_LocalDB",
"searchable": 1,
"quickSearch": 1,
"changeable": 0,
"filterable": 1,
"ext": ""
},
{
"key": "song_1a48b",
"name": "🖤|网络数据库KTV",
"type": 3,
"api": "csp_KTV",
"searchable": 1,
"quickSearch": 1,
"changeable": 0,
"filterable": 1,
"ext": ""
},
{
"key": "networkdb",
"name": "🖤|网络数据库合集",
"type": 3,
"api": "csp_NetworkDB",
"searchable": 1,
"quickSearch": 1,
"changeable": 0,
"filterable": 1,
"ext": ""
},
{
"key": "急救教学",
"name": "🚑|急救|教学",
"type": 3,
"api": "csp_FirstAid",
"searchable": 0,
"quickSearch": 0,
"changeable": 0,
"style": {
"type": "rect",
"ratio": 3.8
},
"gridview": "0-0-4.1"
},
{
"key": "myuc",
"name": "❤️|我的┃优囍",
"type": 3,
"api": "csp_MyUC",
"searchable": 0,
"quickSearch": 0,
"changeable": 0,
"filterable": 0,
"indexs": 0,
"style": {
"type": "list"
},
"timeout": 30,
"ext": "./config/myuc.json"
},
{
"key": "myquark",
"name": "❤️|我的┃夸氪",
"type": 3,
"api": "csp_MyQuark",
"searchable": 0,
"quickSearch": 0,
"changeable": 0,
"filterable": 0,
"indexs": 0,
"style": {
"type": "list"
},
"timeout": 30,
"ext": "./config/myquark.json"
},
{
"key": "mybaidu",
"name": "❤️|我的┃百度",
"type": 3,
"api": "csp_MyBaiDu",
"searchable": 0,
"quickSearch": 0,
"changeable": 0,
"filterable": 0,
"indexs": 0,
"style": {
"type": "list"
},
"timeout": 30,
"ext": "./config/mybaidu.json"
},
{
"key": "myali",
"name": "❤️|我的┃阿里",
"type": 3,
"api": "csp_MyAli",
"searchable": 0,
"quickSearch": 0,
"changeable": 0,
"filterable": 0,
"indexs": 0,
"style": {
"type": "list"
},
"timeout": 30,
"ext": "./config/myali.json"
},
{
"key": "mytianyi",
"name": "❤️|我的┃天懿",
"type": 3,
"api": "csp_MyTianYi",
"searchable": 0,
"quickSearch": 0,
"changeable": 0,
"filterable": 0,
"indexs": 0,
"style": {
"type": "list"
},
"timeout": 30
},
{
"key": "商店",
"name": "🏬|商店|更新",
"type": 3,
"api": "csp_Market",
"searchable": 0,
"changeable": 0,
"style": {
"type": "oval",
"ratio": 1.1
},
"ext": "./config/market.json"
},
{
"key": "TgAliSearch",
"name": "💝|夸克|TG搜",
"type": 3,
"api": "csp_TgSearch",
"searchable": 1,
"changeable": 0,
"hide": 1,
"filterable": 0,
"ext": {
"site": "https://tgsou.252035.xyz/",
"query": "channelUsername=alyp_1,clouddriveresources,dianyingshare,hdhhd21,jdjdn1111,leoziyuan,NewQuark,PanjClub,Quark_Movies,xiangxiunb,yunpanchat,yunpanqk,XiangxiuNB,alyp_4K_Movies,alyp_Animation,alyp_TV,alyp_JLP&pic=true"
}
},
{
"key": "TgbaiduSearch",
"name": "💝|百度|TG搜",
"type": 3,
"api": "csp_TgSearch",
"searchable": 1,
"changeable": 0,
"hide": 1,
"filterable": 0,
"ext": {
"site": "https://tgsou.252035.xyz/",
"query": "channelUsername=BaiduCloudDisk,bdwpzhpd,Baidu_Netdisk&pic=true"
}
},
{
"key": "Tg123Search",
"name": "💝|123盘|TG搜",
"type": 3,
"api": "csp_TgSearch",
"searchable": 1,
"changeable": 0,
"hide": 1,
"filterable": 0,
"ext": {
"site": "https://tgsou.252035.xyz/",
"query": "channelUsername=wp123zy,xx123pan,yp123pan,zyfb123&pic=true"
}
},
{
"key": "Tg189Search",
"name": "💝|天翼|TG搜",
"type": 3,
"api": "csp_TgSearch",
"searchable": 1,
"changeable": 0,
"hide": 1,
"filterable": 0,
"ext": {
"site": "https://tgsou.252035.xyz/",
"query": "channelUsername=cloud189_group,yunpan139,cloud189_group,cloudtianyi,kuakeclound,tianyirigeng,txtyzy,tyypzhpd,tyysypzypd,yunpan189&pic=true"
}
},
{
"key": "PanSouQuark",
"name": "💖|夸克┃盘搜",
"type": 3,
"api": "csp_PanSou",
"searchable": 1,
"hide": 1,
"filterable": 0,
"changeable": 1,
"ext": {
"sources": [
"夸克"
]
}
},
{
"key": "PanSouUc",
"name": "💖|优囍┃盘搜",
"type": 3,
"api": "csp_PanSou",
"searchable": 1,
"changeable": 1,
"hide": 1,
"filterable": 0,
"ext": {
"sources": [
"UC"
]
}
},
{
"key": "PanSouAli",
"name": "💖|阿里┃盘搜",
"type": 3,
"api": "csp_PanSou",
"searchable": 1,
"hide": 1,
"changeable": 1,
"filterable": 0,
"ext": {
"sources": [
"阿里"
]
}
},
{
"key": "PanSouBaidu",
"name": "💖|百度┃盘搜",
"type": 3,
"api": "csp_PanSou",
"searchable": 1,
"hide": 1,
"changeable": 1,
"filterable": 0,
"ext": {
"sources": [
"百度"
]
}
},
{
"key": "PanSou123",
"name": "💖|123┃盘搜",
"type": 3,
"api": "csp_PanSou",
"searchable": 1,
"changeable": 1,
"hide": 1,
"filterable": 0,
"ext": {
"sources": [
"123盘"
]
}
},
{
"key": "PanSou189",
"name": "💖|天翼┃盘搜",
"type": 3,
"api": "csp_PanSou",
"searchable": 1,
"filterable": 0,
"changeable": 1,
"hide": 1,
"ext": {
"sources": [
"天翼"
]
}
},
{
"key": "PanSou139",
"name": "💖|移动┃盘搜",
"type": 3,
"api": "csp_PanSou",
"searchable": 1,
"hide": 1,
"changeable": 1,
"filterable": 0,
"ext": {
"sources": [
"移动"
]
}
},
{
"key": "PanSouMagnet",
"name": "💖|磁力┃盘搜",
"type": 3,
"api": "csp_PanSou",
"searchable": 1,
"hide": 1,
"filterable": 0,
"changeable": 1,
"ext": {
"sources": [
"磁力"
]
}
}
],
"lives": [
{
"name": "咪咕",
"type": "0",
"pass": true,
"url": "https://gh-proxy.org/https://raw.githubusercontent.com/develop202/migu_video/refs/heads/main/interface.txt",
"epg": "https://epg.112114.xyz/?ch={name}&date={date}",
"logo": "https://epg.112114.xyz/logo/{name}.png"
},
{
"name": "冰茶",
"type": 0,
"playerType": 2,
"url": "https://bc.188766.xyz/?ip=&mima=bingcha1130&json=true",
"ua": "bingcha/1.1 (mianfeifenxiang) "
},
{
"name": "电视直播",
"type": "0",
"pass": true,
"url": "http://gh-proxy.org/raw.githubusercontent.com/Supprise0901/TVBox_live/main/live.txt",
"epg": "https://epg.112114.xyz/?ch={name}&date={date}",
"logo": "https://epg.112114.xyz/logo/{name}.png"
},
{
"name": "EPG直播",
"type": "0",
"pass": true,
"url": "http://gh-proxy.org/https://raw.githubusercontent.com/Wirili/IPTV/main/live.txt",
"epg": "https://epg.112114.xyz/?ch={name}&date={date}",
"logo": "https://epg.112114.xyz/logo/{name}.png"
},
{
"name": "日后",
"type": 0,
"url": "http://rihou.cc:555/gggg.nzk",
"playerType": 2,
"ua": "okhttp/3",
"epg": "https://epg.112114.eu.org/?ch={name}&date={date}",
"logo": "https://epg.112114.eu.org/logo/{name}.png"
},
{
"name": "🧱YouTube🧱",
"type": 1,
"url": "https://gh-proxy.com/https://raw.githubusercontent.com/zzq1234567890/epg/refs/heads/main/youtube.m3u",
"epg": "https://epg.tv.darwinchow.com/epg.xml.gz,https://p.xbta.cc/https://raw.githubusercontent.com/kuke31/xmlgz/main/e.xml.gz,https://epg.iill.top/epg.xml",
"logo": "https://live.404003.xyz/LOGO/{name}.png",
"playerType": 2
}
],
"parses": [
{
"name": "爱心",
"type": 4,
"url": "http://119.91.123.253:2345/Api/yun.php?url=",
"ext": {
"header": {
"user-agent": "Mozilla/5.0 (Linux; Android 9; DUK-AL20) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Mobile Safari/537.36"
}
}
},
{
"name": "淘片",
"type": 0,
"url": "https://jx.yparse.com/index.php?url=",
"ext": {
"header": {
"user-agent": "Mozilla/5.0 (Linux; Android 9; DUK-AL20) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.101 Mobile Safari/537.36"
}
}
}
],
"flags": [
"youku",
"qq",
"iqiyi",
"qiyi",
"letv",
"sohu",
"tudou",
"pptv",
"mgtv",
"wasu",
"bilibili",
"leshi",
"renrenmi",
"migu",
"B站(解析)",
"B站(AVC)",
"B站(HEVC)",
"B站(AV1)"
],
"ijk": [
{
"group": "软解码",
"options": [
{
"category": 4,
"name": "opensles",
"value": "0"
},
{
"category": 4,
"name": "overlay-format",
"value": "842225234"
},
{
"category": 4,
"name": "framedrop",
"value": "1"
},
{
"category": 4,
"name": "soundtouch",
"value": "1"
},
{
"category": 4,
"name": "start-on-prepared",
"value": "1"
},
{
"category": 1,
"name": "http-detect-range-support",
"value": "0"
},
{
"category": 1,
"name": "fflags",
"value": "fastseek"
},
{
"category": 2,
"name": "skip_loop_filter",
"value": "48"
},
{
"category": 4,
"name": "reconnect",
"value": "1"
},
{
"category": 4,
"name": "enable-accurate-seek",
"value": "0"
},
{
"category": 4,
"name": "mediacodec",
"value": "0"
},
{
"category": 4,
"name": "mediacodec-auto-rotate",
"value": "0"
},
{
"category": 4,
"name": "mediacodec-handle-resolution-change",
"value": "0"
},
{
"category": 4,
"name": "mediacodec-hevc",
"value": "0"
},
{
"category": 1,
"name": "dns_cache_timeout",
"value": "600000000"
}
]
},
{
"group": "硬解码",
"options": [
{
"category": 4,
"name": "opensles",
"value": "0"
},
{
"category": 4,
"name": "overlay-format",
"value": "842225234"
},
{
"category": 4,
"name": "framedrop",
"value": "1"
},
{
"category": 4,
"name": "soundtouch",
"value": "1"
},
{
"category": 4,
"name": "start-on-prepared",
"value": "1"
},
{
"category": 1,
"name": "http-detect-range-support",
"value": "0"
},
{
"category": 1,
"name": "fflags",
"value": "fastseek"
},
{
"category": 2,
"name": "skip_loop_filter",
"value": "48"
},
{
"category": 4,
"name": "reconnect",
"value": "1"
},
{
"category": 4,
"name": "enable-accurate-seek",
"value": "0"
},
{
"category": 4,
"name": "mediacodec",
"value": "1"
},
{
"category": 4,
"name": "mediacodec-auto-rotate",
"value": "1"
},
{
"category": 4,
"name": "mediacodec-handle-resolution-change",
"value": "1"
},
{
"category": 4,
"name": "mediacodec-hevc",
"value": "1"
},
{
"category": 1,
"name": "dns_cache_timeout",
"value": "600000000"
}
]
}
],
"ads": [
"mimg.0c1q0l.cn",
"www.googletagmanager.com",
"www.google-analytics.com",
"mc.usihnbcq.cn",
"mg.g1mm3d.cn",
"mscs.svaeuzh.cn",
"cnzz.hhttm.top",
"tp.vinuxhome.com",
"cnzz.mmstat.com",
"www.baihuillq.com",
"s23.cnzz.com",
"z3.cnzz.com",
"c.cnzz.com",
"stj.v1vo.top",
"z12.cnzz.com",
"img.mosflower.cn",
"tips.gamevvip.com",
"ehwe.yhdtns.com",
"xdn.cqqc3.com",
"www.jixunkyy.cn",
"sp.chemacid.cn",
"hm.baidu.com",
"s9.cnzz.com",
"z6.cnzz.com",
"um.cavuc.com",
"mav.mavuz.com",
"wofwk.aoidf3.com",
"z5.cnzz.com",
"xc.hubeijieshikj.cn",
"tj.tianwenhu.com",
"xg.gars57.cn",
"k.jinxiuzhilv.com",
"cdn.bootcss.com",
"ppl.xunzhuo123.com",
"xomk.jiangjunmh.top",
"img.xunzhuo123.com",
"z1.cnzz.com",
"s13.cnzz.com",
"xg.huataisangao.cn",
"z7.cnzz.com",
"xg.huataisangao.cn",
"z2.cnzz.com",
"s96.cnzz.com",
"q11.cnzz.com",
"thy.dacedsfa.cn",
"xg.whsbpw.cn",
"s19.cnzz.com",
"z8.cnzz.com",
"s4.cnzz.com",
"f5w.as12df.top",
"ae01.alicdn.com",
"www.92424.cn",
"k.wudejia.com",
"vivovip.mmszxc.top",
"qiu.xixiqiu.com",
"cdnjs.hnfenxun.com",
"cms.qdwght.com"
],
"doh": [
{
"name": "Google",
"url": "https://dns.google/dns-query",
"ips": [
"8.8.4.4",
"8.8.8.8"
]
},
{
"name": "Cloudflare",
"url": "https://cloudflare-dns.com/dns-query",
"ips": [
"1.1.1.1",
"1.0.0.1",
"2606:4700:4700::1111",
"2606:4700:4700::1001"
]
},
{
"name": "AdGuard",
"url": "https://dns.adguard.com/dns-query",
"ips": [
"94.140.14.140",
"94.140.14.141"
]
},
{
"name": "DNSWatch",
"url": "https://resolver2.dns.watch/dns-query",
"ips": [
"84.200.69.80",
"84.200.70.40"
]
},
{
"name": "Quad9",
"url": "https://dns.quad9.net/dns-query",
"ips": [
"9.9.9.9",
"149.112.112.112"
]
}
],
"rules": [
{
"name": "proxy",
"hosts": [
"hlsztemgsplive.miguvideo.com=hlsztemgsplive.188766.xyz",
"cache.ott.fifalive.itv.cmvideo.cn=fifalive.188766.xyz",
"iptv.huuc.edu.cn=huucv6.188766.xyz",
"raw.githubusercontent.com",
"googlevideo.com",
"cdn.v82u1l.com",
"cdn.iz8qkg.com",
"cdn.kin6c1.com",
"c.biggggg.com",
"c.olddddd.com",
"haiwaikan.com",
"www.histar.tv",
"youtube.com",
"uhibo.com",
".*boku.*",
".*nivod.*",
".*ulivetv.*"
]
},
{
"name": "海外看",
"hosts": [
"haiwaikan"
],
"regex": [
"10.0099",
"10.3333",
"16.0599",
"8.1748",
"12.33",
"10.85"
]
},
{
"name": "火山嗅探",
"hosts": [
"huoshan.com"
],
"regex": [
"item_id="
]
},
{
"name": "抖音嗅探",
"hosts": [
"douyin.com"
],
"regex": [
"is_play_url="
]
},
{
"name": "農民嗅探",
"hosts": [
"toutiaovod.com"
],
"regex": [
"video/tos/cn"
]
},
{
"name": "新视觉嗅探",
"hosts": [
"muzhi-video.bj.bcebos.com"
],
"regex": [
"202403/"
]
},
{
"name": "七新嗅探",
"hosts": [
"api.52wyb.com"
],
"regex": [
"m3u8?pt=m3u8"
]
},
{
"name": "夜市點擊",
"hosts": [
"yeslivetv.com"
],
"script": [
"document.getElementsByClassName('vjs-big-play-button')[0].click()"
]
},
{
"name": "毛驢點擊",
"hosts": [
"www.maolvys.com"
],
"script": [
"document.getElementsByClassName('swal-button swal-button--confirm')[0].click()"
]
}
],
"headers": [
{
"host": "hlsztemgsplive.miguvideo.com",
"header": {
"User-Agent": "bingcha/1.1 (mianfeifenxiang) "
}
}
]
}
+7
View File
@@ -154,6 +154,13 @@
"icon": "",
"des": "🎉新用户注册保存送1T永久空间"
},
{
"name": "1T永久空间",
"key": "ucFree1T",
"icon": "",
"des": "🎉免费1T永久空间限领1次"
},
{
"name": "退出登录",
"key": "cleanUcCookie",
+441 -425
View File
@@ -1,426 +1,442 @@
{
"1": [
{
"key": "area",
"name": "地區",
"init": "1",
"value": [
{
"n": "全部",
"v": "0"
},
{
"n": "国产",
"v": "1"
},
{
"n": "中国香港",
"v": "3"
},
{
"n": "中国台湾",
"v": "6"
},
{
"n": "美国",
"v": "5"
},
{
"n": "韩国",
"v": "18"
},
{
"n": "日本",
"v": "2"
}
]
},
{
"key": "year",
"name": "年份",
"value": [
{
"n": "全部",
"v": "0"
},
{
"n": "2025",
"v": "107"
},
{
"n": "2024",
"v": "119"
},
{
"n": "2023",
"v": "153"
},
{
"n": "2022",
"v": "101"
},
{
"n": "2021",
"v": "118"
},
{
"n": "2020",
"v": "16"
},
{
"n": "2019",
"v": "7"
},
{
"n": "2018",
"v": "2"
},
{
"n": "2017",
"v": "3"
},
{
"n": "2016",
"v": "22"
}
]
},
{
"key": "by",
"name": "排序",
"init": "updata",
"value": [
{
"n": "热门",
"v": "hot"
},
{
"n": "更新",
"v": "updata"
},
{
"n": "评分",
"v": "rating"
}
]
}
],
"2": [
{
"key": "area",
"name": "地區",
"init": "1",
"value": [
{
"n": "全部",
"v": "0"
},
{
"n": "国产",
"v": "1"
},
{
"n": "中国香港",
"v": "3"
},
{
"n": "中国台湾",
"v": "6"
},
{
"n": "美国",
"v": "5"
},
{
"n": "国",
"v": "18"
},
{
"n": "日本",
"v": "2"
}
]
},
{
"key": "year",
"name": "年份",
"value": [
{
"n": "全部",
"v": "0"
},
{
"n": "2025",
"v": "107"
},
{
"n": "2024",
"v": "119"
},
{
"n": "2023",
"v": "153"
},
{
"n": "2022",
"v": "101"
},
{
"n": "2021",
"v": "118"
},
{
"n": "2020",
"v": "16"
},
{
"n": "2019",
"v": "7"
},
{
"n": "2018",
"v": "2"
},
{
"n": "2017",
"v": "3"
},
{
"n": "2016",
"v": "22"
}
]
},
{
"key": "by",
"name": "排序",
"init": "updata",
"value": [
{
"n": "热门",
"v": "hot"
},
{
"n": "更新",
"v": "updata"
},
{
"n": "评分",
"v": "rating"
}
]
}
],
"3": [
{
"key": "area",
"name": "地區",
"init": "1",
"value": [
{
"n": "全部",
"v": "0"
},
{
"n": "国产",
"v": "1"
},
{
"n": "中国香港",
"v": "3"
},
{
"n": "中国台湾",
"v": "6"
},
{
"n": "美国",
"v": "5"
},
{
"n": "韩国",
"v": "18"
},
{
"n": "日本",
"v": "2"
}
]
},
{
"key": "year",
"name": "年份",
"value": [
{
"n": "全部",
"v": "0"
},
{
"n": "2025",
"v": "107"
},
{
"n": "2024",
"v": "119"
},
{
"n": "2023",
"v": "153"
},
{
"n": "2022",
"v": "101"
},
{
"n": "2021",
"v": "118"
},
{
"n": "2020",
"v": "16"
},
{
"n": "2019",
"v": "7"
},
{
"n": "2018",
"v": "2"
},
{
"n": "2017",
"v": "3"
},
{
"n": "2016",
"v": "22"
}
]
},
{
"key": "by",
"name": "排序",
"init": "updata",
"value": [
{
"n": "热门",
"v": "hot"
},
{
"n": "更新",
"v": "updata"
},
{
"n": "评分",
"v": "rating"
}
]
}
],
"4": [
{
"key": "area",
"name": "地區",
"init": "1",
"value": [
{
"n": "全部",
"v": "0"
},
{
"n": "国产",
"v": "1"
},
{
"n": "中国香港",
"v": "3"
},
{
"n": "中国台湾",
"v": "6"
},
{
"n": "国",
"v": "5"
},
{
"n": "韩国",
"v": "18"
},
{
"n": "日本",
"v": "2"
}
]
},
{
"key": "year",
"name": "年份",
"value": [
{
"n": "全部",
"v": "0"
},
{
"n": "2025",
"v": "107"
},
{
"n": "2024",
"v": "119"
},
{
"n": "2023",
"v": "153"
},
{
"n": "2022",
"v": "101"
},
{
"n": "2021",
"v": "118"
},
{
"n": "2020",
"v": "16"
},
{
"n": "2019",
"v": "7"
},
{
"n": "2018",
"v": "2"
},
{
"n": "2017",
"v": "3"
},
{
"n": "2016",
"v": "22"
}
]
},
{
"key": "by",
"name": "排序",
"init": "updata",
"value": [
{
"n": "热门",
"v": "hot"
},
{
"n": "更新",
"v": "updata"
},
{
"n": "评分",
"v": "rating"
}
]
}
]
{
"1": [
{
"key": "area",
"name": "地區",
"init": "1",
"value": [
{
"n": "全部",
"v": "0"
},
{
"n": "国产",
"v": "1"
},
{
"n": "中国香港",
"v": "3"
},
{
"n": "中国台湾",
"v": "6"
},
{
"n": "美国",
"v": "5"
},
{
"n": "韩国",
"v": "18"
},
{
"n": "日本",
"v": "2"
}
]
},
{
"key": "year",
"name": "年份",
"value": [
{
"n": "全部",
"v": "0"
},
{
"n": "2026",
"v": "162"
},
{
"n": "2025",
"v": "107"
},
{
"n": "2024",
"v": "119"
},
{
"n": "2023",
"v": "153"
},
{
"n": "2022",
"v": "101"
},
{
"n": "2021",
"v": "118"
},
{
"n": "2020",
"v": "16"
},
{
"n": "2019",
"v": "7"
},
{
"n": "2018",
"v": "2"
},
{
"n": "2017",
"v": "3"
},
{
"n": "2016",
"v": "22"
}
]
},
{
"key": "by",
"name": "排序",
"init": "updata",
"value": [
{
"n": "热门",
"v": "hot"
},
{
"n": "更新",
"v": "updata"
},
{
"n": "评分",
"v": "rating"
}
]
}
],
"2": [
{
"key": "area",
"name": "地區",
"init": "1",
"value": [
{
"n": "全部",
"v": "0"
},
{
"n": "国产",
"v": "1"
},
{
"n": "中国香港",
"v": "3"
},
{
"n": "中国台湾",
"v": "6"
},
{
"n": "国",
"v": "5"
},
{
"n": "韩国",
"v": "18"
},
{
"n": "日本",
"v": "2"
}
]
},
{
"key": "year",
"name": "年份",
"value": [
{
"n": "全部",
"v": "0"
},
{
"n": "2026",
"v": "162"
},
{
"n": "2025",
"v": "107"
},
{
"n": "2024",
"v": "119"
},
{
"n": "2023",
"v": "153"
},
{
"n": "2022",
"v": "101"
},
{
"n": "2021",
"v": "118"
},
{
"n": "2020",
"v": "16"
},
{
"n": "2019",
"v": "7"
},
{
"n": "2018",
"v": "2"
},
{
"n": "2017",
"v": "3"
},
{
"n": "2016",
"v": "22"
}
]
},
{
"key": "by",
"name": "排序",
"init": "updata",
"value": [
{
"n": "热门",
"v": "hot"
},
{
"n": "更新",
"v": "updata"
},
{
"n": "评分",
"v": "rating"
}
]
}
],
"3": [
{
"key": "area",
"name": "地區",
"init": "1",
"value": [
{
"n": "全部",
"v": "0"
},
{
"n": "国产",
"v": "1"
},
{
"n": "中国香港",
"v": "3"
},
{
"n": "中国台湾",
"v": "6"
},
{
"n": "美国",
"v": "5"
},
{
"n": "韩国",
"v": "18"
},
{
"n": "日本",
"v": "2"
}
]
},
{
"key": "year",
"name": "年份",
"value": [
{
"n": "全部",
"v": "0"
},
{
"n": "2026",
"v": "162"
},
{
"n": "2025",
"v": "107"
},
{
"n": "2024",
"v": "119"
},
{
"n": "2023",
"v": "153"
},
{
"n": "2022",
"v": "101"
},
{
"n": "2021",
"v": "118"
},
{
"n": "2020",
"v": "16"
},
{
"n": "2019",
"v": "7"
},
{
"n": "2018",
"v": "2"
},
{
"n": "2017",
"v": "3"
},
{
"n": "2016",
"v": "22"
}
]
},
{
"key": "by",
"name": "排序",
"init": "updata",
"value": [
{
"n": "热门",
"v": "hot"
},
{
"n": "更新",
"v": "updata"
},
{
"n": "评分",
"v": "rating"
}
]
}
],
"4": [
{
"key": "area",
"name": "地區",
"init": "1",
"value": [
{
"n": "全部",
"v": "0"
},
{
"n": "国",
"v": "1"
},
{
"n": "中国香港",
"v": "3"
},
{
"n": "中国台湾",
"v": "6"
},
{
"n": "美国",
"v": "5"
},
{
"n": "韩国",
"v": "18"
},
{
"n": "日本",
"v": "2"
}
]
},
{
"key": "year",
"name": "年份",
"value": [
{
"n": "全部",
"v": "0"
},
{
"n": "2026",
"v": "162"
},
{
"n": "2025",
"v": "107"
},
{
"n": "2024",
"v": "119"
},
{
"n": "2023",
"v": "153"
},
{
"n": "2022",
"v": "101"
},
{
"n": "2021",
"v": "118"
},
{
"n": "2020",
"v": "16"
},
{
"n": "2019",
"v": "7"
},
{
"n": "2018",
"v": "2"
},
{
"n": "2017",
"v": "3"
},
{
"n": "2016",
"v": "22"
}
]
},
{
"key": "by",
"name": "排序",
"init": "updata",
"value": [
{
"n": "热门",
"v": "hot"
},
{
"n": "更新",
"v": "updata"
},
{
"n": "评分",
"v": "rating"
}
]
}
]
}
+6 -6
View File
@@ -1,13 +1,13 @@
{
"version": "4.0",
"databases": {
"song_1a48b": {
"song_9c8ec": {
"name": "🎵 KTV",
"valid": 1,
"hide": 1,
"size": 95191040,
"sha256": "1a48b4e3b78ee28cb878607f26637ffbb129fabddd45af8b8857ef9108468419",
"path": "https://v6.gh-proxy.org/https://github.com/chitue/dongliTV/releases/download/databases-20251223/song_1a48b.db",
"size": 113975296,
"sha256": "9c8ec53492541b907f1a40b43acbb887b04565dc7d1d60617cfb6becf0a79b6f",
"path": "https://v6.gh-proxy.org/https://github.com/chitue/dongliTV/releases/download/databases-20260130/song_9c8ec.db",
"count_query": "SELECT COUNT(*) FROM song",
"category_count_query": "SELECT type_id, COUNT(*) FROM song GROUP BY type_id",
"categories_query": "SELECT id, name FROM song_type ORDER BY id",
@@ -38,7 +38,7 @@
"hide": 0,
"size": 1347584,
"sha256": "b8b5ec0a290416464624ead7c5476fc0e0559898385777d8e1ef9d1fb5637d33",
"path": "https://v6.gh-proxy.org/https://github.com/chitue/dongliTV/releases/download/databases-20251223/movie_b8b5e.db",
"path": "https://v6.gh-proxy.org/https://github.com/chitue/dongliTV/releases/download/databases-20260130/movie_b8b5e.db",
"count_query": "SELECT COUNT(*) FROM vod_unified_data",
"category_count_query": "SELECT type_name, COUNT(*) FROM vod_unified_data GROUP BY type_name",
"categories_query": "SELECT DISTINCT type_name, type_name FROM vod_unified_data WHERE type_name IS NOT NULL AND type_name != '' ORDER BY type_name",
@@ -72,7 +72,7 @@
"hide": 0,
"size": 663552,
"sha256": "b4d4b5dc86e74bf2ff96a56f199e19f1d90ebbfff49c864833c421efa13e1db4",
"path": "https://v6.gh-proxy.org/https://github.com/chitue/dongliTV/releases/download/databases-20251223/song_b4d4b.db",
"path": "https://v6.gh-proxy.org/https://github.com/chitue/dongliTV/releases/download/databases-20260130/song_b4d4b.db",
"count_query": "SELECT COUNT(*) FROM songs",
"category_count_query": "SELECT genre, COUNT(*) FROM songs GROUP BY genre",
"categories_query": "SELECT DISTINCT genre, genre FROM songs WHERE genre IS NOT NULL AND genre != '' ORDER BY genre",
Binary file not shown.
+21
View File
@@ -9,7 +9,28 @@
"api": "./js/永乐视频.js",
"searchable": 1,
"changeable": 1
},
{
"key": "采集之王",
"name": "采集之王",
"type": 3,
"api": "./js/drpy2.min.js",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"order_num": 1,
"ext": "./js/采集之王.js?type=url&params=../json/采集.json"
},
{
"key": "直播转点播",
"name": "🐼️电视┃直播",
"type": 3,
"searchable": 0,
"api": "./js/live2vod.js",
"ext": "./json/feimaolive.json"
}
],
"headers": [
{
+1
View File
File diff suppressed because one or more lines are too long
+3201
View File
@@ -0,0 +1,3201 @@
import {
cheerio,
模板
} from "./drpy-core-lite.min.js";
let vercode = typeof pdfl === "function" ? "drpy2.1" : "drpy2";
const VERSION = vercode + " 3.9.52beta3 20250801";
const UpdateInfo = [{
date: "20250801",
title: "drpy依赖更新,使用drpy-core-lite.min.js",
version: "3.9.52beta3 20250801",
msg: `
drpy-core.min.js 更换为更小的drpy-core-lite.min.js
`
}, {
date: "20250729",
title: "drpy更新,所有依赖打包成一个js文件",
version: "3.9.52beta2 20250729",
msg: `
1. wasm支持
2. 引入 TextEncoder、TextDecoder对象
3. 引入 WXXH 加解密库
4. 所有依赖打包成一个js
5. 增加 buildQueryString
`
}, {
date: "20250728",
title: "drpy更新,增加tab_order线路模糊排序,优化解密算法支持文件头",
version: "3.9.52beta1 20250728",
msg: `
1. 增加tab_order线路模糊排序
2. 优化解密算法支持文件头
3. wasm支持
4. 增加 removeHeader 函数可用于清除js/py文件的头信息及所有头注释
5. 引入 TextEncoder、TextDecoder对象
6. 引入 WXXH 加解密库
`
}, {
date: "20241126",
title: "drpy更新,优化去广告算法",
version: "3.9.51beta6 20241126",
msg: `
1. 更新龙头大佬提供的去广告算法
`
}, {
date: "20241104",
title: "drpy更新,增加新特性",
version: "3.9.51beta5 20241104",
msg: `
1. rule增加 搜索验证标识 属性,可以不定义,默认为 '系统安全验证|请输入验证码'
2. rule增加 searchNoPage 属性,可以不定义,如果定义 1 将关闭该源的搜索翻页功能,超过1页直接返回空
`
}];
function getUpdateInfo() {
return UpdateInfo.map(_o => {
_o.msg = _o.msg.trim().split("\n").map(_it => _it.trim()).join("\n");
return _o
})
}
function init_test() {
console.log("init_test_start");
console.log("当前版本号:" + VERSION);
console.log("本地代理地址:" + getProxyUrl());
console.log(RKEY);
console.log(JSON.stringify(rule));
console.log("init_test_end")
}
function ocr_demo_test() {
let img_base64 = `iVBORw0KGgoAAAANSUhEUgAAAIAAAAAoBAMAAADEX+97AAAAG1BMVEXz+/4thQTa7N6QwIFFkyNeokKozqDB3b93sWHFR+MEAAAACXBIWXMAAA7EAAAOxAGVKw4bAAABN0lEQVRIie2TQU+DQBCFt9vScvQpxR4xrcSjJCZ67JDGXsX+AdR4B3vpsSYm/m2HXaRLmuySepR3Gdidb/btDAjRq5dT96eCMlfBuzi1QLZUoZy2yz5sOvI+9iomaPEZ6nWnEtxqIyiM1RcAy44GNDhBXUjot/VVNweV1ah68FqWRyjKIOqAcyYF6rGcmpYnHzGt3fycNoMw0d3/THFu7hFSJ/8OXO6iTM8/KSg09obAzIHLO250LgQ0txOZSfgrV4Exdw98uGycJ0ErAeExZGhOmFHV9zHO6qVSj0MpLq7xZON56o++MjlsEgfVhbQWWME+xQX7J4V6zfi9A1Ly9rP1BvEXp+BbVJ/M77n+wfOIDVp51pZ4iBxvmj9AGrtvry6emwfKnVkW+ZRKd5ZNMvob36vXP9YPDmQki8QiCFAAAAAASUVORK5CYII=`;
OcrApi.api = OCR_API;
let code = OcrApi.classification(img_base64);
log("测试验证码图片的ocr识别结果为:" + code)
}
function rsa_demo_test() {
let t1 = (new Date).getTime();
let pkcs1_public = `
-----BEGIN RSA PUBLIC KEY-----
MEgCQQCrI0pQ/ERRpJ3Ou190XJedFq846nDYP52rOtXyDxlFK5D3p6JJu2RwsKwy
lsQ9xY0xYPpRZUZKMEeR7e9gmRNLAgMBAAE=
-----END RSA PUBLIC KEY-----
`.trim();
let pkcs1_public_pem = `
MEgCQQCrI0pQ/ERRpJ3Ou190XJedFq846nDYP52rOtXyDxlFK5D3p6JJu2RwsKwy
lsQ9xY0xYPpRZUZKMEeR7e9gmRNLAgMBAAE=
`.trim();
let pkcs8_public = `
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKsjSlD8RFGknc67X3Rcl50WrzjqcNg/
nas61fIPGUUrkPenokm7ZHCwrDKWxD3FjTFg+lFlRkowR5Ht72CZE0sCAwEAAQ==
-----END PUBLIC KEY-----`.trim();
let pkcs8_public_pem = `
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKsjSlD8RFGknc67X3Rcl50WrzjqcNg/
nas61fIPGUUrkPenokm7ZHCwrDKWxD3FjTFg+lFlRkowR5Ht72CZE0sCAwEAAQ==
`.trim();
let pkcs1_private = `
-----BEGIN RSA PRIVATE KEY-----
MIIBOAIBAAJBAKsjSlD8RFGknc67X3Rcl50WrzjqcNg/nas61fIPGUUrkPenokm7
ZHCwrDKWxD3FjTFg+lFlRkowR5Ht72CZE0sCAwEAAQI/b6OV1z65UokQaMvSeRXt
0Yv6wiYtduQI9qpq5nzy/ytaqsbBfClNTi/HifKPKxlRouWFkc518EQI8LBxoarJ
AiEA4DaONMplV8PQNa3TKn2F+SDEvLOCjdL0kHKdN90Ti28CIQDDZnTBaHgZwZbA
hS7Bbf5yvwjWMhO6Y7l04/Qm7R+35QIgPuQuqXIoUSD080mp1N5WyRW++atksIF+
5lGv9e6GP/MCICnj8y/rl6Pd7tXDN6zcSeqLrfdNsREKhB3dKOCXgW9JAiAFYtFS
EJNBXVRTK42SNsZ2hJ/9xLwOwnH2epT8Q43s3Q==
-----END RSA PRIVATE KEY-----
`.trim();
let pkcs8_private = `
-----BEGIN PRIVATE KEY-----
MIIBUgIBADANBgkqhkiG9w0BAQEFAASCATwwggE4AgEAAkEAqyNKUPxEUaSdzrtf
dFyXnRavOOpw2D+dqzrV8g8ZRSuQ96eiSbtkcLCsMpbEPcWNMWD6UWVGSjBHke3v
YJkTSwIDAQABAj9vo5XXPrlSiRBoy9J5Fe3Ri/rCJi125Aj2qmrmfPL/K1qqxsF8
KU1OL8eJ8o8rGVGi5YWRznXwRAjwsHGhqskCIQDgNo40ymVXw9A1rdMqfYX5IMS8
s4KN0vSQcp033ROLbwIhAMNmdMFoeBnBlsCFLsFt/nK/CNYyE7pjuXTj9CbtH7fl
AiA+5C6pcihRIPTzSanU3lbJFb75q2SwgX7mUa/17oY/8wIgKePzL+uXo93u1cM3
rNxJ6out902xEQqEHd0o4JeBb0kCIAVi0VIQk0FdVFMrjZI2xnaEn/3EvA7CcfZ6
lPxDjezd
-----END PRIVATE KEY-----
`.trim();
let data = `
NodeRsa
这是node-rsa 现在修改集成在drpy里使用`.trim();
let encryptedWithPublic = NODERSA.encryptRSAWithPublicKey(data, pkcs1_public, {
outputEncoding: "base64",
options: {
environment: "browser",
encryptionScheme: "pkcs1_oaep"
}
});
console.log("公钥加密");
console.log(encryptedWithPublic);
let decryptedWithPrivate = NODERSA.decryptRSAWithPrivateKey(encryptedWithPublic, pkcs1_private, {
options: {
environment: "browser",
encryptionScheme: "pkcs1_oaep"
}
});
console.log("私钥解密");
console.log(decryptedWithPrivate);
let pkcs1_sha256_sign = NODERSA.sign("1", pkcs1_private, {
outputEncoding: "base64",
options: {
environment: "browser",
encryptionScheme: "pkcs1",
signingScheme: "pkcs1-sha256"
}
});
console.log("pkcs1_sha256_sign");
console.log(pkcs1_sha256_sign);
let pkcs1_sha256_sign_verify = NODERSA.verify("1", "Oulx2QrgeipKYBtqEDqFb2s/+ndk2cGQxO4CkhU7iBM1vyNmmvqubpsmeoUuN3waGrYZLknSEdwBkfv0tUMpFQ==", pkcs1_private, {
options: {
environment: "browser",
encryptionScheme: "pkcs1",
signingScheme: "pkcs1-sha256"
}
});
console.log("pkcs1_sha256_sign_verify");
console.log(pkcs1_sha256_sign_verify);
let pkcs1_oaep_sha256 = NODERSA.encryptRSAWithPublicKey(data, `-----BEGIN RSA PUBLIC KEY-----
MIIBCgKCAQEA5KOq1gRNyllLNWKQy8sGpZE3Q1ULLSmzZw+eaAhj9lvqn7IsT1du
SYn08FfoOA2qMwtz+1O2l1mgzNoSVCyVpVabnTG+C9XKeZXAnJHd8aYA7l7Sxhdm
kte+iymYZ0ZBPzijo8938iugtVvqi9UgDmnY3u/NlQDqiL5BGqSxSTd/Sgmy3zD8
PYzEa3wD9vehQ5fZZ45vKIq8GNVh2Z8+IGO85FF1OsN7+b2yGJa/FmDDNn0+HP+m
PfI+kYBqEVpo0Ztbc3UdxgFwGC8O1n8AQyriwHnSOtIiuBH62J/7qyC/3LEAApRb
Dd9YszqzmODjQUddZKHmvc638VW+azc0EwIDAQAB
-----END RSA PUBLIC KEY-----
`, {
outputEncoding: "base64",
options: {
environment: "browser",
encryptionScheme: {
scheme: "pkcs1_oaep",
hash: "sha256"
}
}
});
console.log("pkcs1_oaep_sha256");
console.log(pkcs1_oaep_sha256);
decryptedWithPrivate = NODERSA.decryptRSAWithPrivateKey("kSZesAAyYh2hdsQnYMdGqb6gKAzTauBKouvBzWcc4+F8RvGd0nwO6mVkUMVilPgUuNxjEauHayHiY8gI3Py45UI3+km0rSGyHrS6dHiHgCkMejXHieglYzAB0IxX3Jkm4z/66bdB/D+GFy0oct5fGCMI1UHPjEAYOsazJDa8lBFNbjiWFeb/qiZtIx3vGM7KYPAZzyRf/zPbbQ8zy9xOmRuOl5nnIxgo0Okp3KO/RIPO4GZOSBA8f2lx1UtNwwrXAMpcNavtoqHVcjJ/9lcotXYQFrn5b299pSIRf2gVm8ZJ31SK6Z8cc14nKtvgnmsgClDzIXJ1o1RcDK+knVAySg==", `-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA5KOq1gRNyllLNWKQy8sGpZE3Q1ULLSmzZw+eaAhj9lvqn7Is
T1duSYn08FfoOA2qMwtz+1O2l1mgzNoSVCyVpVabnTG+C9XKeZXAnJHd8aYA7l7S
xhdmkte+iymYZ0ZBPzijo8938iugtVvqi9UgDmnY3u/NlQDqiL5BGqSxSTd/Sgmy
3zD8PYzEa3wD9vehQ5fZZ45vKIq8GNVh2Z8+IGO85FF1OsN7+b2yGJa/FmDDNn0+
HP+mPfI+kYBqEVpo0Ztbc3UdxgFwGC8O1n8AQyriwHnSOtIiuBH62J/7qyC/3LEA
ApRbDd9YszqzmODjQUddZKHmvc638VW+azc0EwIDAQABAoIBADZ/QGgUzInvsLp/
zO2WbfYm39o/uhNAvk9RbLt1TIZbMFhyOpeKynHi3Swwd9xsfWX/U9zS/lGi/m31
iKrhmaW4OA1G3vqpMcK7TBbFufYwUEaA+ZJX344euH8pIfdzyneMQ4z3Far2dS7l
QsmjuilVV2kEFadveXewiYoVOWCu00w6bN8wy2SIHlQn+kIL6HQhWz12iKKflIKu
eGRdzLHsKmBt6WbY1Wuhx7HU0fAKdlBDPxCHNlI+kybUYE9o5C2vJiaVM5wqJBgZ
8Dz8kt1QbLJ910JoLXkLVQ8uC8NJKQwFtqQjTGPnEq0+wbgz6Ij599rKZkwW/xq9
l6KoUiECgYEA6Ah42tVdkNW047f03xVYXFH96RgorHRS36mR8Y+ONUq1fwKidovC
WjwVujt4OPf3l1W6iyn/F6cu/bsmvPrSc3HTN0B1V31QK4OjgetxQ2PSbTldH02J
NPzkt+v+cPxXpx/P5mgt7Weefw5txU547KubGrHUV5rBKFtIx9pj16MCgYEA/EF0
o19+D24DZAPwlDS5VbEd7FStnwY4oQ5PqbuNOSbSJLMWU0AqzXcRokp8UTyCZ0X3
ATkS1REq97kShCuR+npTR6a6DlY7sdpPI1SMLNajgB2tkx0EOzX+PfNIbHUd4jpJ
I0ZMAHv/OOtkzQHDaeTWBTrzsWm6/nTiykfduNECgYEA46AMD4HpPECqKAs66e5i
tI6q7JSKskObWVdcmQEfnSAhVOwcvPb2Ptda6UuV8S0xcwDi88rLOUUFUFzc79+P
vTkY38cYVi/VChsluDpk7ptqv0PbGu5Rf+3n4pZdEjI7OvR2W64wAAn67uIUxc7p
yiO/ET0K9rYWb6S9jXGtKMkCgYEA2kPAqoO7zZoBMQ7/oR0lp/HC1HRIbiqx4RlC
8Lgpb+QZPEwA6zPAVVvLVENi4d+bbcRp/xLlKpraNNJcJSSWAMbLPFoU7sbKjA87
HnTPfRSTEA2d3Ibk3F7Rh8TzS3Ti0JZiJjVzGZAwu41iAMifzwaD8K6boUy80eNN
QH2CaaECgYBUsLYvC/MiYg3w+LGOONuQongoVUXjGqnw2bjVa9RK7lwRdXPUqJ51
MpVO98IkoLvGSI/0sGNP3GKNhC+eMGjJAVwFyEuOn+JsmMv9Y9uStIVi5tIHIhKw
m7mp8il0kaftHdSxTbspG3tZ2fjIiFIZkLEOmRpd7ogWumgOajzUdA==
-----END RSA PRIVATE KEY-----`, {
options: {
environment: "browser",
encryptionScheme: "pkcs1_oaep"
}
});
console.log("decryptedWithPrivate");
console.log(decryptedWithPrivate);
(() => {
let key = new NODERSA.NodeRSA({
b: 1024
});
key.setOptions({
encryptionScheme: "pkcs1"
});
let text = `你好drpy node-ras`;
let encrypted = key.encrypt(text, "base64");
console.log("encrypted: ", encrypted);
const decrypted = key.decrypt(encrypted, "utf8");
console.log("decrypted: ", decrypted)
})();
let t2 = (new Date).getTime();
console.log("rsa_demo_test 测试耗时:" + (t2 - t1) + "毫秒")
}
function pre() {
if (typeof rule.预处理 === "string" && rule.预处理 && rule.预处理.trim()) {
let code = rule.预处理.trim();
console.log("执行预处理代码:" + code);
if (code.startsWith("js:")) {
code = code.replace("js:", "")
}
try {
eval(code)
} catch (e) {
console.log(`预处理执行失败:${e.message}`)
}
}
}
let rule = {};
const MOBILE_UA = "Mozilla/5.0 (Linux; Android 11; Pixel 5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.91 Mobile Safari/537.36";
const PC_UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36";
const UA = "Mozilla/5.0";
const UC_UA = "Mozilla/5.0 (Linux; U; Android 9; zh-CN; MI 9 Build/PKQ1.181121.001) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.108 UCBrowser/12.5.5.1035 Mobile Safari/537.36";
const IOS_UA = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1";
const RULE_CK = "cookie";
const CATE_EXCLUDE = "首页|留言|APP|下载|资讯|新闻|动态";
const TAB_EXCLUDE = "猜你|喜欢|下载|剧情|榜|评论";
const OCR_RETRY = 3;
const OCR_API = "https://api.nn.ci/ocr/b64/text";
if (typeof MY_URL === "undefined") {
var MY_URL
}
var HOST;
var RKEY;
var fetch;
var print;
var log;
var rule_fetch_params;
var fetch_params;
var oheaders;
var _pdfh;
var _pdfa;
var _pd;
const DOM_CHECK_ATTR = /(url|src|href|-original|-src|-play|-url|style)$/;
const SPECIAL_URL = /^(ftp|magnet|thunder|ws):/;
const NOADD_INDEX = /:eq|:lt|:gt|:first|:last|^body$|^#/;
const URLJOIN_ATTR = /(url|src|href|-original|-src|-play|-url|style)$|^(data-|url-|src-)/;
const SELECT_REGEX = /:eq|:lt|:gt|#/g;
const SELECT_REGEX_A = /:eq|:lt|:gt/g;
const $js = {
toString(func) {
let strfun = func.toString();
return strfun.replace(/^\(\)(\s+)?=>(\s+)?\{/, "js:").replace(/\}$/, "")
}
};
function window_b64() {
let b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
let base64DecodeChars = new Array(-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, -1, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1);
function btoa(str) {
var out, i, len;
var c1, c2, c3;
len = str.length;
i = 0;
out = "";
while (i < len) {
c1 = str.charCodeAt(i++) & 255;
if (i == len) {
out += b64map.charAt(c1 >> 2);
out += b64map.charAt((c1 & 3) << 4);
out += "==";
break
}
c2 = str.charCodeAt(i++);
if (i == len) {
out += b64map.charAt(c1 >> 2);
out += b64map.charAt((c1 & 3) << 4 | (c2 & 240) >> 4);
out += b64map.charAt((c2 & 15) << 2);
out += "=";
break
}
c3 = str.charCodeAt(i++);
out += b64map.charAt(c1 >> 2);
out += b64map.charAt((c1 & 3) << 4 | (c2 & 240) >> 4);
out += b64map.charAt((c2 & 15) << 2 | (c3 & 192) >> 6);
out += b64map.charAt(c3 & 63)
}
return out
}
function atob(str) {
var c1, c2, c3, c4;
var i, len, out;
len = str.length;
i = 0;
out = "";
while (i < len) {
do {
c1 = base64DecodeChars[str.charCodeAt(i++) & 255]
} while (i < len && c1 == -1);
if (c1 == -1) break;
do {
c2 = base64DecodeChars[str.charCodeAt(i++) & 255]
} while (i < len && c2 == -1);
if (c2 == -1) break;
out += String.fromCharCode(c1 << 2 | (c2 & 48) >> 4);
do {
c3 = str.charCodeAt(i++) & 255;
if (c3 == 61) return out;
c3 = base64DecodeChars[c3]
} while (i < len && c3 == -1);
if (c3 == -1) break;
out += String.fromCharCode((c2 & 15) << 4 | (c3 & 60) >> 2);
do {
c4 = str.charCodeAt(i++) & 255;
if (c4 == 61) return out;
c4 = base64DecodeChars[c4]
} while (i < len && c4 == -1);
if (c4 == -1) break;
out += String.fromCharCode((c3 & 3) << 6 | c4)
}
return out
}
return {
atob: atob,
btoa: btoa
}
}
if (typeof atob !== "function" || typeof btoa !== "function") {
var {
atob,
btoa
} = window_b64()
}
if (typeof Object.assign !== "function") {
Object.assign = function() {
let target = arguments[0];
for (let i = 1; i < arguments.length; i++) {
let source = arguments[i];
for (let key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key]
}
}
}
return target
}
}
if (!String.prototype.includes) {
String.prototype.includes = function(search, start) {
if (typeof start !== "number") {
start = 0
}
if (start + search.length > this.length) {
return false
} else {
return this.indexOf(search, start) !== -1
}
}
}
if (!Array.prototype.includes) {
Object.defineProperty(Array.prototype, "includes", {
value: function(searchElement, fromIndex) {
if (this == null) {
throw new TypeError('"this" is null or not defined')
}
var o = Object(this);
var len = o.length >>> 0;
if (len === 0) {
return false
}
var n = fromIndex | 0;
var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
while (k < len) {
if (o[k] === searchElement) {
return true
}
k++
}
return false
},
enumerable: false
})
}
if (typeof String.prototype.startsWith !== "function") {
String.prototype.startsWith = function(prefix) {
return this.slice(0, prefix.length) === prefix
}
}
if (typeof String.prototype.endsWith !== "function") {
String.prototype.endsWith = function(suffix) {
return this.indexOf(suffix, this.length - suffix.length) !== -1
}
}
Object.defineProperty(Object.prototype, "myValues", {
value: function(obj) {
if (obj == null) {
throw new TypeError("Cannot convert undefined or null to object")
}
var res = [];
for (var k in obj) {
if (obj.hasOwnProperty(k)) {
res.push(obj[k])
}
}
return res
},
enumerable: false
});
if (typeof Object.prototype.values !== "function") {
Object.defineProperty(Object.prototype, "values", {
value: function(obj) {
if (obj == null) {
throw new TypeError("Cannot convert undefined or null to object")
}
var res = [];
for (var k in obj) {
if (obj.hasOwnProperty(k)) {
res.push(obj[k])
}
}
return res
},
enumerable: false
})
}
if (typeof Array.prototype.join !== "function") {
Object.defineProperty(Array.prototype, "join", {
value: function(emoji) {
emoji = emoji || "";
let self = this;
let str = "";
let i = 0;
if (!Array.isArray(self)) {
throw String(self) + "is not Array"
}
if (self.length === 0) {
return ""
}
if (self.length === 1) {
return String(self[0])
}
i = 1;
str = this[0];
for (; i < self.length; i++) {
str += String(emoji) + String(self[i])
}
return str
},
enumerable: false
})
}
if (typeof Array.prototype.toReversed !== "function") {
Object.defineProperty(Array.prototype, "toReversed", {
value: function() {
const clonedList = this.slice();
const reversedList = clonedList.reverse();
return reversedList
},
enumerable: false
})
}
Object.defineProperty(Array.prototype, "append", {
value: Array.prototype.push,
enumerable: false
});
Object.defineProperty(String.prototype, "strip", {
value: String.prototype.trim,
enumerable: false
});
Object.defineProperty(String.prototype, "rstrip", {
value: function(chars) {
let regex = new RegExp(chars + "$");
return this.replace(regex, "")
},
enumerable: false
});
function 是否正版(vipUrl) {
let flag = new RegExp("qq.com|iqiyi.com|youku.com|mgtv.com|bilibili.com|sohu.com|ixigua.com|pptv.com|miguvideo.com|le.com|1905.com|fun.tv");
return flag.test(vipUrl)
}
function urlDeal(vipUrl) {
if (!vipUrl) {
return ""
}
if (!是否正版(vipUrl)) {
return vipUrl
}
if (!/miguvideo/.test(vipUrl)) {
vipUrl = vipUrl.split("#")[0].split("?")[0]
}
return vipUrl
}
function setResult(d) {
if (!Array.isArray(d)) {
return []
}
VODS = [];
d.forEach(function(it) {
let obj = {
vod_id: it.url || "",
vod_name: it.title || "",
vod_remarks: it.desc || "",
vod_content: it.content || "",
vod_pic: it.pic_url || it.img || ""
};
let keys = Object.keys(it);
if (keys.includes("tname")) {
obj.type_name = it.tname || ""
}
if (keys.includes("tid")) {
obj.type_id = it.tid || ""
}
if (keys.includes("year")) {
obj.vod_year = it.year || ""
}
if (keys.includes("actor")) {
obj.vod_actor = it.actor || ""
}
if (keys.includes("director")) {
obj.vod_director = it.director || ""
}
if (keys.includes("area")) {
obj.vod_area = it.area || ""
}
VODS.push(obj)
});
return VODS
}
function setResult2(res) {
VODS = res.list || [];
return VODS
}
function setHomeResult(res) {
if (!res || typeof res !== "object") {
return []
}
return setResult(res.list)
}
function rc(js) {
if (js === "maomi_aes.js") {
var a = CryptoJS.enc.Utf8.parse("625222f9149e961d");
var t = CryptoJS.enc.Utf8.parse("5efdtf6060e2o330");
return {
De: function(word) {
word = CryptoJS.enc.Hex.parse(word);
return CryptoJS.AES.decrypt(CryptoJS.enc.Base64.stringify(word), a, {
iv: t,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}).toString(CryptoJS.enc.Utf8)
},
En: function(word) {
var Encrypted = CryptoJS.AES.encrypt(word, a, {
iv: t,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
});
return Encrypted.ciphertext.toString()
}
}
}
return {}
}
function maoss(jxurl, ref, key) {
fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
eval(getCryptoJS());
try {
var getVideoInfo = function(text) {
return CryptoJS.AES.decrypt(text, key, {
iv: iv,
padding: CryptoJS.pad.Pkcs7
}).toString(CryptoJS.enc.Utf8)
};
var token_key = key == undefined ? "dvyYRQlnPRCMdQSe" : key;
if (ref) {
var html = request(jxurl, {
headers: {
Referer: ref
}
})
} else {
var html = request(jxurl)
}
if (html.indexOf("&btwaf=") != -1) {
html = request(jxurl + "&btwaf" + html.match(/&btwaf(.*?)"/)[1], {
headers: {
Referer: ref
}
})
}
var token_iv = html.split('_token = "')[1].split('"')[0];
var key = CryptoJS.enc.Utf8.parse(token_key);
var iv = CryptoJS.enc.Utf8.parse(token_iv);
eval(html.match(/var config = {[\s\S]*?}/)[0] + "");
if (!config.url.startsWith("http")) {
config.url = CryptoJS.AES.decrypt(config.url, key, {
iv: iv,
padding: CryptoJS.pad.Pkcs7
}).toString(CryptoJS.enc.Utf8)
}
return config.url
} catch (e) {
return ""
}
}
function urlencode(str) {
str = (str + "").toString();
return encodeURIComponent(str).replace(/!/g, "%21").replace(/'/g, "%27").replace(/\(/g, "%28").replace(/\)/g, "%29").replace(/\*/g, "%2A").replace(/%20/g, "+")
}
function encodeUrl(str) {
if (typeof encodeURI == "function") {
return encodeURI(str)
} else {
str = (str + "").toString();
return encodeURIComponent(str).replace(/%2F/g, "/").replace(/%3F/g, "?").replace(/%3A/g, ":").replace(/%40/g, "@").replace(/%3D/g, "=").replace(/%3A/g, ":").replace(/%2C/g, ",").replace(/%2B/g, "+").replace(/%24/g, "$")
}
}
function base64Encode(text) {
return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(text))
}
function base64Decode(text) {
return CryptoJS.enc.Utf8.stringify(CryptoJS.enc.Base64.parse(text))
}
function md5(text) {
return CryptoJS.MD5(text).toString()
}
function uint8ArrayToBase64(uint8Array) {
let binaryString = String.fromCharCode.apply(null, Array.from(uint8Array));
return btoa(binaryString)
}
function Utf8ArrayToStr(array) {
var out, i, len, c;
var char2, char3;
out = "";
len = array.length;
i = 0;
while (i < len) {
c = array[i++];
switch (c >> 4) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
out += String.fromCharCode(c);
break;
case 12:
case 13:
char2 = array[i++];
out += String.fromCharCode((c & 31) << 6 | char2 & 63);
break;
case 14:
char2 = array[i++];
char3 = array[i++];
out += String.fromCharCode((c & 15) << 12 | (char2 & 63) << 6 | (char3 & 63) << 0);
break
}
}
return out
}
function gzip(str) {
let arr = pako.gzip(str, {});
return uint8ArrayToBase64(arr)
}
function ungzip(b64Data) {
let strData = atob(b64Data);
const charData = strData.split("").map(function(x) {
return x.charCodeAt(0)
});
const binData = new Uint8Array(charData);
const data = pako.inflate(binData);
return Utf8ArrayToStr(data)
}
function encodeStr(input, encoding) {
encoding = encoding || "gbk";
if (encoding.startsWith("gb")) {
input = gbkTool.encode(input)
}
return input
}
function decodeStr(input, encoding) {
encoding = encoding || "gbk";
if (encoding.startsWith("gb")) {
input = gbkTool.decode(input)
}
return input
}
function getCryptoJS() {
return 'console.log("CryptoJS已装载");'
}
const RSA = {
decode: function(data, key, option) {
option = option || {};
if (typeof JSEncrypt === "function") {
let chunkSize = option.chunkSize || 117;
let privateKey = this.getPrivateKey(key);
const decryptor = new JSEncrypt;
decryptor.setPrivateKey(privateKey);
let uncrypted = "";
uncrypted = decryptor.decryptUnicodeLong(data);
return uncrypted
} else {
return false
}
},
encode: function(data, key, option) {
option = option || {};
if (typeof JSEncrypt === "function") {
let chunkSize = option.chunkSize || 117;
let publicKey = this.getPublicKey(key);
const encryptor = new JSEncrypt;
encryptor.setPublicKey(publicKey);
let encrypted = "";
encrypted = encryptor.encryptUnicodeLong(data);
return encrypted
} else {
return false
}
},
fixKey(key, prefix, endfix) {
if (!key.includes(prefix)) {
key = prefix + key
}
if (!key.includes(endfix)) {
key += endfix
}
return key
},
getPrivateKey(key) {
let prefix = "-----BEGIN RSA PRIVATE KEY-----";
let endfix = "-----END RSA PRIVATE KEY-----";
return this.fixKey(key, prefix, endfix)
},
getPublicKey(key) {
let prefix = "-----BEGIN PUBLIC KEY-----";
let endfix = "-----END PUBLIC KEY-----";
return this.fixKey(key, prefix, endfix)
}
};
function getProxyUrl() {
if (typeof getProxy === "function") {
return getProxy(true)
} else {
return "http://127.0.0.1:9978/proxy?do=js"
}
}
function fixAdM3u8(m3u8_text, m3u8_url, ad_remove) {
if (!m3u8_text && !m3u8_url || !m3u8_text && m3u8_url && !m3u8_url.startsWith("http")) {
return ""
}
if (!m3u8_text) {
log("m3u8_url:" + m3u8_url);
m3u8_text = request(m3u8_url)
}
log("len(m3u8_text):" + m3u8_text.length);
if (!ad_remove) {
return m3u8_text
}
if (ad_remove.startsWith("reg:")) {
ad_remove = ad_remove.slice(4)
} else if (ad_remove.startsWith("js:")) {
ad_remove = ad_remove.slice(3)
}
let m3u8_start = m3u8_text.slice(0, m3u8_text.indexOf("#EXTINF")).trim();
let m3u8_body = m3u8_text.slice(m3u8_text.indexOf("#EXTINF"), m3u8_text.indexOf("#EXT-X-ENDLIST")).trim();
let m3u8_end = m3u8_text.slice(m3u8_text.indexOf("#EXT-X-ENDLIST")).trim();
let murls = [];
let m3_body_list = m3u8_body.split("\n");
let m3_len = m3_body_list.length;
let i = 0;
while (i < m3_len) {
let mi = m3_body_list[i];
let mi_1 = m3_body_list[i + 1];
if (mi.startsWith("#EXTINF")) {
murls.push([mi, mi_1].join("&"));
i += 2
} else if (mi.startsWith("#EXT-X-DISCONTINUITY")) {
let mi_2 = m3_body_list[i + 2];
murls.push([mi, mi_1, mi_2].join("&"));
i += 3
} else {
break
}
}
let new_m3u8_body = [];
for (let murl of murls) {
if (ad_remove && new RegExp(ad_remove).test(murl)) {} else {
let murl_list = murl.split("&");
if (!murl_list[murl_list.length - 1].startsWith("http") && m3u8_url.startsWith("http")) {
murl_list[murl_list.length - 1] = urljoin(m3u8_url, murl_list[murl_list.length - 1])
}
murl_list.forEach(it => {
new_m3u8_body.push(it)
})
}
}
new_m3u8_body = new_m3u8_body.join("\n").trim();
m3u8_text = [m3u8_start, new_m3u8_body, m3u8_end].join("\n").trim();
return m3u8_text
}
function fixAdM3u8Ai(m3u8_url, headers) {
let ts = (new Date).getTime();
let option = headers ? {
headers: headers
} : {};
function b(s1, s2) {
let i = 0;
while (i < s1.length) {
if (s1[i] !== s2[i]) {
break
}
i++
}
return i
}
function reverseString(str) {
return str.split("").reverse().join("")
}
let m3u8 = request(m3u8_url, option);
m3u8 = m3u8.trim().split("\n").map(it => it.startsWith("#") ? it : urljoin(m3u8_url, it)).join("\n");
m3u8 = m3u8.replace(/\n\n/gi, "\n");
let last_url = m3u8.split("\n").slice(-1)[0];
if (last_url.length < 5) {
last_url = m3u8.split("\n").slice(-2)[0]
}
if (last_url.includes(".m3u8") && last_url !== m3u8_url) {
m3u8_url = urljoin2(m3u8_url, last_url);
log("嵌套的m3u8_url:" + m3u8_url);
m3u8 = request(m3u8_url, option)
}
let s = m3u8.trim().split("\n").filter(it => it.trim()).join("\n");
let ss = s.split("\n");
if (m3u8_url.indexOf("ffzy") > 0) {
let j = 0,
k1 = 0,
m = 0,
n = 0,
t = 0;
let s2 = "";
for (let i = 0; i < ss.length; i++) {
let s = ss[i];
let s1 = "";
if (s.startsWith("#EXTINF")) {
s1 = s.slice(8);
n++;
if (n == 1) k1 = i;
if (s2.indexOf(s1) == -1) {
s2 = s2 + s1;
m++
}
t = t + parseFloat(s1);
i++;
s = ss[i]
}
if (s.startsWith("#EXT-X-DISCONTINUITY")) {
if (n == 5) {
log("n:" + n);
log("m:" + m);
for (let j = k1; j < k1 + n * 2; j++) {
log(ss[j])
}
log("广告位置:" + k1);
log("数据条数:" + n);
log("数据种类:" + m);
log("广告时间:" + t.toFixed(5));
ss.splice(k1, 2 * n + 1);
i = i - 2 * n + 1
}
t = 0;
m = 0;
n = 0;
s2 = ""
}
}
}
let firststr = "";
let maxl = 0;
let kk = 0;
let kkk1 = 1;
let kkk2 = 0;
let secondstr = "";
for (let i = 0; i < ss.length; i++) {
let s = ss[i];
if (!s.startsWith("#")) {
if (kk == 0) firststr = s;
if (kk > 0) {
if (maxl > b(firststr, s) + 1) {
if (secondstr.length < 5) secondstr = s;
kkk2++
} else {
maxl = b(firststr, s);
kkk1++
}
}
kk++;
if (kk >= 30) break
}
}
if (kkk2 > kkk1) firststr = secondstr;
let firststrlen = firststr.length;
let ml = Math.round(ss.length / 2).toString().length;
let maxc = 0;
let laststr = ss.toReversed().find(x => {
if (!x.startsWith("#")) {
let k = b(reverseString(firststr), reverseString(x));
maxl = b(firststr, x);
maxc++;
if (firststrlen - maxl <= ml + k || maxc > 10) {
return true
}
}
return false
});
log("最后一条切片:" + laststr);
let ad_urls = [];
for (let i = 0; i < ss.length; i++) {
let s = ss[i];
if (!s.startsWith("#")) {
if (b(firststr, s) < maxl) {
ad_urls.push(s);
ss.splice(i - 1, 2);
i = i - 2
} else {
ss[i] = urljoin(m3u8_url, s)
}
} else {
ss[i] = s.replace(/URI=\"(.*)\"/, 'URI="' + urljoin(m3u8_url, "$1") + '"')
}
}
log("处理的m3u8地址:" + m3u8_url);
log("----广告地址----");
log(ad_urls);
m3u8 = ss.join("\n");
log("处理耗时:" + ((new Date).getTime() - ts).toString());
log(m3u8);
return m3u8
}
function forceOrder(lists, key, option) {
let start = Math.floor(lists.length / 2);
let end = Math.min(lists.length - 1, start + 1);
if (start >= end) {
return lists
}
let first = lists[start];
let second = lists[end];
if (key) {
try {
first = first[key];
second = second[key]
} catch (e) {}
}
if (option && typeof option === "function") {
try {
first = option(first);
second = option(second)
} catch (e) {}
}
first += "";
second += "";
if (first.match(/(\d+)/) && second.match(/(\d+)/)) {
let num1 = Number(first.match(/(\d+)/)[1]);
let num2 = Number(second.match(/(\d+)/)[1]);
if (num1 > num2) {
lists.reverse()
}
}
return lists
}
let VODS = [];
let VOD = {};
let TABS = [];
let LISTS = [];
function getQuery(url) {
try {
if (url.indexOf("?") > -1) {
url = url.slice(url.indexOf("?") + 1)
}
let arr = url.split("#")[0].split("&");
const resObj = {};
arr.forEach(item => {
let arr1 = item.split("=");
let key = arr1[0];
let value = arr1.slice(1).join("=");
resObj[key] = value
});
return resObj
} catch (err) {
log(`getQuery发生错误:${e.message}`);
return {}
}
}
function urljoin(fromPath, nowPath) {
fromPath = fromPath || "";
nowPath = nowPath || "";
return joinUrl(fromPath, nowPath)
}
var urljoin2 = urljoin;
const defaultParser = {
pdfh: pdfh,
pdfa: pdfa,
pd: pd
};
function pdfh2(html, parse) {
let html2 = html;
try {
if (typeof html !== "string") {
html2 = html.rr(html.ele).toString()
}
} catch (e) {
print(`html对象转文本发生了错误:${e.message}`)
}
let result = defaultParser.pdfh(html2, parse);
let option = parse.includes("&&") ? parse.split("&&").slice(-1)[0] : parse.split(" ").slice(-1)[0];
if (/style/.test(option.toLowerCase()) && /url\(/.test(result)) {
try {
result = result.match(/url\((.*?)\)/)[1];
result = result.replace(/^['|"](.*)['|"]$/, "$1")
} catch (e) {}
}
return result
}
function pdfa2(html, parse) {
let html2 = html;
try {
if (typeof html !== "string") {
html2 = html.rr(html.ele).toString()
}
} catch (e) {
print(`html对象转文本发生了错误:${e.message}`)
}
return defaultParser.pdfa(html2, parse)
}
function pd2(html, parse, uri) {
let ret = pdfh2(html, parse);
if (typeof uri === "undefined" || !uri) {
uri = ""
}
if (DOM_CHECK_ATTR.test(parse) && !SPECIAL_URL.test(ret)) {
if (/http/.test(ret)) {
ret = ret.slice(ret.indexOf("http"))
} else {
ret = urljoin(MY_URL, ret)
}
}
return ret
}
const parseTags = {
jsp: {
pdfh: pdfh2,
pdfa: pdfa2,
pd: pd2
},
json: {
pdfh(html, parse) {
if (!parse || !parse.trim()) {
return ""
}
if (typeof html === "string") {
html = JSON.parse(html)
}
parse = parse.trim();
if (!parse.startsWith("$.")) {
parse = "$." + parse
}
parse = parse.split("||");
for (let ps of parse) {
let ret = cheerio.jp(ps, html);
if (Array.isArray(ret)) {
ret = ret[0] || ""
} else {
ret = ret || ""
}
if (ret && typeof ret !== "string") {
ret = ret.toString()
}
if (ret) {
return ret
}
}
return ""
},
pdfa(html, parse) {
if (!parse || !parse.trim()) {
return ""
}
if (typeof html === "string") {
html = JSON.parse(html)
}
parse = parse.trim();
if (!parse.startsWith("$.")) {
parse = "$." + parse
}
let ret = cheerio.jp(parse, html);
if (Array.isArray(ret) && Array.isArray(ret[0]) && ret.length === 1) {
return ret[0] || []
}
return ret || []
},
pd(html, parse) {
let ret = parseTags.json.pdfh(html, parse);
if (ret) {
return urljoin(MY_URL, ret)
}
return ret
}
},
jq: {
pdfh(html, parse) {
if (!html || !parse || !parse.trim()) {
return ""
}
parse = parse.trim();
let result = defaultParser.pdfh(html, parse);
return result
},
pdfa(html, parse) {
if (!html || !parse || !parse.trim()) {
return []
}
parse = parse.trim();
let result = defaultParser.pdfa(html, parse);
print(`pdfa解析${parse}=>${result.length}`);
return result
},
pd(html, parse, base_url) {
if (!html || !parse || !parse.trim()) {
return ""
}
parse = parse.trim();
base_url = base_url || MY_URL;
return defaultParser.pd(html, parse, base_url)
}
},
getParse(p0) {
if (p0.startsWith("jsp:")) {
return this.jsp
} else if (p0.startsWith("json:")) {
return this.json
} else if (p0.startsWith("jq:")) {
return this.jq
} else {
return this.jq
}
}
};
const stringify = JSON.stringify;
const jsp = parseTags.jsp;
const jq = parseTags.jq;
function readFile(filePath) {
filePath = filePath || "./uri.min.js";
var fd = os.open(filePath);
var buffer = new ArrayBuffer(1024);
var len = os.read(fd, buffer, 0, 1024);
console.log(len);
let text = String.fromCharCode.apply(null, new Uint8Array(buffer));
console.log(text);
return text
}
function dealJson(html) {
try {
html = html.trim();
if (!(html.startsWith("{") && html.endsWith("}") || html.startsWith("[") && html.endsWith("]"))) {
html = "{" + html.match(/.*?\{(.*)\}/m)[1] + "}"
}
} catch (e) {}
try {
html = JSON.parse(html)
} catch (e) {}
return html
}
var OcrApi = {
api: OCR_API,
classification: function(img) {
let code = "";
try {
log("通过drpy_ocr验证码接口过验证...");
let html = "";
if (this.api.endsWith("drpy/text")) {
html = request(this.api, {
data: {
img: img
},
headers: {
"User-Agent": PC_UA
},
method: "POST"
}, true)
} else {
html = post(this.api, {
body: img
})
}
code = html || ""
} catch (e) {
log(`OCR识别验证码发生错误:${e.message}`)
}
return code
}
};
function verifyCode(url) {
let cnt = 0;
let host = getHome(url);
let cookie = "";
while (cnt < OCR_RETRY) {
try {
let yzm_url = `${host}/index.php/verify/index.html`;
console.log(`验证码链接:${yzm_url}`);
let hhtml = request(yzm_url, {
withHeaders: true,
toBase64: true
}, true);
let json = JSON.parse(hhtml);
if (!cookie) {
let setCk = Object.keys(json).find(it => it.toLowerCase() === "set-cookie");
cookie = setCk ? json[setCk].split(";")[0] : ""
}
console.log("cookie:" + cookie);
let img = json.body;
let code = OcrApi.classification(img);
console.log(`${cnt+1}次验证码识别结果:${code}`);
let submit_url = `${host}/index.php/ajax/verify_check?type=search&verify=${code}`;
console.log(submit_url);
let html = request(submit_url, {
headers: {
Cookie: cookie
},
method: "POST"
});
html = JSON.parse(html);
if (html.msg === "ok") {
console.log(`${cnt+1}次验证码提交成功`);
return cookie
} else if (html.msg !== "ok" && cnt + 1 >= OCR_RETRY) {
cookie = ""
}
} catch (e) {
console.log(`${cnt+1}次验证码提交失败:${e.message}`);
if (cnt + 1 >= OCR_RETRY) {
cookie = ""
}
}
cnt += 1
}
return cookie
}
function setItem(k, v) {
local.set(RKEY, k, v);
console.log(`规则${RKEY}设置${k} => ${v}`)
}
function getItem(k, v) {
return local.get(RKEY, k) || v
}
function clearItem(k) {
local.delete(RKEY, k)
}
function getHome(url) {
if (!url) {
return ""
}
let tmp = url.split("//");
url = tmp[0] + "//" + tmp[1].split("/")[0];
try {
url = decodeURIComponent(url)
} catch (e) {}
return url
}
function buildUrl(url, obj) {
obj = obj || {};
if (url.indexOf("?") < 0) {
url += "?"
}
let param_list = [];
let keys = Object.keys(obj);
keys.forEach(it => {
param_list.push(it + "=" + obj[it])
});
let prs = param_list.join("&");
if (keys.length > 0 && !url.endsWith("?")) {
url += "&"
}
url += prs;
return url
}
function $require(url) {
eval(request(url))
}
function keysToLowerCase(obj) {
return Object.keys(obj).reduce((result, key) => {
const newKey = key.toLowerCase();
result[newKey] = obj[key];
return result
}, {})
}
function buildQueryString(params) {
const queryArray = [];
for (const key in params) {
if (params.hasOwnProperty(key)) {
let value = params[key];
if (value === undefined || value === null) {
value = ""
} else {
value = value.toString()
}
const encodedKey = encodeURIComponent(key);
const encodedValue = encodeURIComponent(value);
queryArray.push(encodedKey + "=" + encodedValue)
}
}
return queryArray.join("&")
}
function parseQueryString(query) {
const params = {};
query.split("&").forEach(function(part) {
const regex = /^(.*?)=(.*)/;
const match = part.match(regex);
if (match) {
const key = decodeURIComponent(match[1]);
const value = decodeURIComponent(match[2]);
params[key] = value
}
});
return params
}
function encodeIfContainsSpecialChars(value) {
const specialChars = ":/?#[]@!$'()*+,;=%";
if (specialChars.split("").some(char => value.includes(char))) {
return encodeURIComponent(value)
}
return value
}
function objectToQueryString(obj) {
const encoded = [];
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
encoded.push(encodeURIComponent(key) + "=" + encodeIfContainsSpecialChars(obj[key]))
}
}
return encoded.join("&")
}
function request(url, obj, ocr_flag) {
ocr_flag = ocr_flag || false;
if (typeof obj === "undefined" || !obj || obj === {}) {
if (!fetch_params || !fetch_params.headers) {
let headers = {
"User-Agent": MOBILE_UA
};
if (rule.headers) {
Object.assign(headers, rule.headers)
}
if (!fetch_params) {
fetch_params = {}
}
fetch_params.headers = headers
}
if (!fetch_params.headers.Referer) {
fetch_params.headers.Referer = getHome(url)
}
obj = fetch_params
} else {
let headers = obj.headers || {};
let keys = Object.keys(headers).map(it => it.toLowerCase());
if (!keys.includes("user-agent")) {
headers["User-Agent"] = MOBILE_UA;
if (typeof fetch_params === "object" && fetch_params && fetch_params.headers) {
let fetch_headers = keysToLowerCase(fetch_params.headers);
if (fetch_headers["user-agent"]) {
headers["User-Agent"] = fetch_headers["user-agent"]
}
}
}
if (!keys.includes("referer")) {
headers["Referer"] = getHome(url)
}
obj.headers = headers
}
if (rule.encoding && rule.encoding !== "utf-8" && !ocr_flag) {
if (!obj.headers.hasOwnProperty("Content-Type") && !obj.headers.hasOwnProperty("content-type")) {
obj.headers["Content-Type"] = "text/html; charset=" + rule.encoding
}
}
if (typeof obj.body != "undefined" && obj.body && typeof obj.body === "string") {
if (!obj.headers.hasOwnProperty("Content-Type") && !obj.headers.hasOwnProperty("content-type")) {
obj.headers["Content-Type"] = "application/x-www-form-urlencoded; charset=" + rule.encoding
}
} else if (typeof obj.body != "undefined" && obj.body && typeof obj.body === "object") {
obj.data = obj.body;
delete obj.body
}
if (!url) {
return obj.withHeaders ? "{}" : ""
}
if (obj.toBase64) {
obj.buffer = 2;
delete obj.toBase64
}
if (obj.redirect === false) {
obj.redirect = 0
}
if (obj.headers.hasOwnProperty("Content-Type") || obj.headers.hasOwnProperty("content-type")) {
let _contentType = obj.headers["Content-Type"] || obj.headers["content-type"] || "";
if (_contentType.includes("application/x-www-form-urlencoded")) {
log("custom body is application/x-www-form-urlencoded");
if (typeof obj.body == "string") {
let temp_obj = parseQueryString(obj.body);
console.log(JSON.stringify(temp_obj))
}
}
}
console.log(JSON.stringify(obj.headers));
console.log("request:" + url + `|method:${obj.method||"GET"}|body:${obj.body||""}`);
let res = req(url, obj);
let html = res.content || "";
if (obj.withHeaders) {
let htmlWithHeaders = res.headers;
htmlWithHeaders.body = html;
return JSON.stringify(htmlWithHeaders)
} else {
return html
}
}
function post(url, obj) {
obj = obj || {};
obj.method = "POST";
return request(url, obj)
}
function reqCookie(url, obj, all_cookie) {
obj = obj || {};
obj.withHeaders = true;
all_cookie = all_cookie || false;
let html = request(url, obj);
let json = JSON.parse(html);
let setCk = Object.keys(json).find(it => it.toLowerCase() === "set-cookie");
let cookie = setCk ? json[setCk] : "";
if (Array.isArray(cookie)) {
cookie = cookie.join(";")
}
if (!all_cookie) {
cookie = cookie.split(";")[0]
}
html = json.body;
return {
cookie: cookie,
html: html
}
}
fetch = request;
print = function(data) {
data = data || "";
if (typeof data == "object" && Object.keys(data).length > 0) {
try {
data = JSON.stringify(data);
console.log(data)
} catch (e) {
console.log(typeof data + ":" + data.length);
return
}
} else if (typeof data == "object" && Object.keys(data).length < 1) {
console.log("null object")
} else {
console.log(data)
}
};
log = print;
function checkHtml(html, url, obj) {
if (/\?btwaf=/.test(html)) {
let btwaf = html.match(/btwaf(.*?)"/)[1];
url = url.split("#")[0] + "?btwaf" + btwaf;
print("宝塔验证访问链接:" + url);
html = request(url, obj)
}
return html
}
function getCode(url, obj) {
let html = request(url, obj);
html = checkHtml(html, url, obj);
return html
}
function getHtml(url) {
let obj = {};
if (rule.headers) {
obj.headers = rule.headers
}
let cookie = getItem(RULE_CK, "");
if (cookie) {
if (obj.headers && !Object.keys(obj.headers).map(it => it.toLowerCase()).includes("cookie")) {
log("历史无cookie,新增过验证后的cookie");
obj.headers["Cookie"] = cookie
} else if (obj.headers && obj.headers.cookie && obj.headers.cookie !== cookie) {
obj.headers["Cookie"] = cookie;
log("历史有小写过期的cookie,更新过验证后的cookie")
} else if (obj.headers && obj.headers.Cookie && obj.headers.Cookie !== cookie) {
obj.headers["Cookie"] = cookie;
log("历史有大写过期的cookie,更新过验证后的cookie")
} else if (!obj.headers) {
obj.headers = {
Cookie: cookie
};
log("历史无headers,更新过验证后的含cookie的headers")
}
}
let html = getCode(url, obj);
return html
}
function homeParse(homeObj) {
fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
let classes = [];
if (homeObj.class_name && homeObj.class_url) {
let names = homeObj.class_name.split("&");
let urls = homeObj.class_url.split("&");
let cnt = Math.min(names.length, urls.length);
for (let i = 0; i < cnt; i++) {
classes.push({
type_id: urls[i],
type_name: names[i]
})
}
}
if (homeObj.class_parse) {
if (homeObj.class_parse.startsWith("js:")) {
var input = homeObj.MY_URL;
try {
eval(homeObj.class_parse.replace("js:", ""));
if (Array.isArray(input)) {
classes = input
}
} catch (e) {
log(`通过js动态获取分类发生了错误:${e.message}`)
}
} else {
let p = homeObj.class_parse.split(";");
let p0 = p[0];
let _ps = parseTags.getParse(p0);
let is_json = p0.startsWith("json:");
_pdfa = _ps.pdfa;
_pdfh = _ps.pdfh;
_pd = _ps.pd;
MY_URL = rule.url;
if (is_json) {
try {
let cms_cate_url = homeObj.MY_URL.replace("ac=detail", "ac=list");
let html = homeObj.home_html || getHtml(cms_cate_url);
if (html) {
if (cms_cate_url === homeObj.MY_URL) {
homeHtmlCache = html
}
let list = _pdfa(html, p0.replace("json:", ""));
if (list && list.length > 0) {
classes = list
}
}
} catch (e) {
console.log(e.message)
}
} else if (p.length >= 3 && !is_json) {
try {
let html = homeObj.home_html || getHtml(homeObj.MY_URL);
if (html) {
homeHtmlCache = html;
let list = _pdfa(html, p0);
if (list && list.length > 0) {
list.forEach((it, idex) => {
try {
let name = _pdfh(it, p[1]);
if (homeObj.cate_exclude && new RegExp(homeObj.cate_exclude).test(name)) {
return
}
let url = _pd(it, p[2]);
if (p.length > 3 && p[3] && !homeObj.home_html) {
let exp = new RegExp(p[3]);
url = url.match(exp)[1]
}
classes.push({
type_id: url.trim(),
type_name: name.trim()
})
} catch (e) {
console.log(`分类列表定位第${idex}个元素正常报错:${e.message}`)
}
})
}
}
} catch (e) {
console.log(e.message)
}
}
}
}
classes = classes.filter(it => !homeObj.cate_exclude || !new RegExp(homeObj.cate_exclude).test(it.type_name));
let resp = {
class: classes
};
if (homeObj.filter) {
resp.filters = homeObj.filter
}
console.log(JSON.stringify(resp));
return JSON.stringify(resp)
}
function getPP(p, pn, pp, ppn) {
try {
let ps = p[pn] === "*" && pp.length > ppn ? pp[ppn] : p[pn];
return ps
} catch (e) {
return ""
}
}
function homeVodParse(homeVodObj) {
fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
let d = [];
MY_URL = homeVodObj.homeUrl;
console.log(MY_URL);
let t1 = (new Date).getTime();
let p = homeVodObj.推荐;
print("p:" + p);
if (p === "*" && rule.一级) {
p = rule.一级;
homeVodObj.double = false
}
if (!p || typeof p !== "string") {
return "{}"
}
p = p.trim();
let pp = rule.一级 ? rule.一级.split(";") : [];
if (p.startsWith("js:")) {
const TYPE = "home";
var input = MY_URL;
HOST = rule.host;
eval(p.replace("js:", ""));
d = VODS
} else {
p = p.split(";");
if (!homeVodObj.double && p.length < 5) {
return "{}"
} else if (homeVodObj.double && p.length < 6) {
return "{}"
}
let p0 = getPP(p, 0, pp, 0);
let _ps = parseTags.getParse(p0);
_pdfa = _ps.pdfa;
_pdfh = _ps.pdfh;
_pd = _ps.pd;
let is_json = p0.startsWith("json:");
p0 = p0.replace(/^(jsp:|json:|jq:)/, "");
let html = homeHtmlCache || getHtml(MY_URL);
homeHtmlCache = undefined;
if (is_json) {
html = dealJson(html)
}
try {
console.log("double:" + homeVodObj.double);
if (homeVodObj.double) {
let items = _pdfa(html, p0);
let p1 = getPP(p, 1, pp, 0);
let p2 = getPP(p, 2, pp, 1);
let p3 = getPP(p, 3, pp, 2);
let p4 = getPP(p, 4, pp, 3);
let p5 = getPP(p, 5, pp, 4);
let p6 = getPP(p, 6, pp, 5);
for (let item of items) {
let items2 = _pdfa(item, p1);
for (let item2 of items2) {
try {
let title = _pdfh(item2, p2);
let img = "";
try {
img = _pd(item2, p3)
} catch (e) {}
let desc = "";
try {
desc = _pdfh(item2, p4)
} catch (e) {}
let links = [];
for (let _p5 of p5.split("+")) {
let link = !homeVodObj.detailUrl ? _pd(item2, _p5, MY_URL) : _pdfh(item2, _p5);
links.push(link)
}
let content;
if (p.length > 6 && p[6]) {
content = _pdfh(item2, p6)
} else {
content = ""
}
let vid = links.join("$");
if (rule.二级 === "*") {
vid = vid + "@@" + title + "@@" + img
}
let vod = {
vod_name: title,
vod_pic: img,
vod_remarks: desc,
vod_content: content,
vod_id: vid
};
d.push(vod)
} catch (e) {
console.log(`首页列表双层定位处理发生错误:${e.message}`)
}
}
}
} else {
let items = _pdfa(html, p0);
let p1 = getPP(p, 1, pp, 1);
let p2 = getPP(p, 2, pp, 2);
let p3 = getPP(p, 3, pp, 3);
let p4 = getPP(p, 4, pp, 4);
let p5 = getPP(p, 5, pp, 5);
for (let item of items) {
try {
let title = _pdfh(item, p1);
let img = "";
try {
img = _pd(item, p2, MY_URL)
} catch (e) {}
let desc = "";
try {
desc = _pdfh(item, p3)
} catch (e) {}
let links = [];
for (let _p5 of p4.split("+")) {
let link = !homeVodObj.detailUrl ? _pd(item, _p5, MY_URL) : _pdfh(item, _p5);
links.push(link)
}
let content;
if (p.length > 5 && p[5]) {
content = _pdfh(item, p5)
} else {
content = ""
}
let vid = links.join("$");
if (rule.二级 === "*") {
vid = vid + "@@" + title + "@@" + img
}
let vod = {
vod_name: title,
vod_pic: img,
vod_remarks: desc,
vod_content: content,
vod_id: vid
};
d.push(vod)
} catch (e) {
console.log(`首页列表单层定位处理发生错误:${e.message}`)
}
}
}
} catch (e) {}
}
let t2 = (new Date).getTime();
console.log("加载首页推荐耗时:" + (t2 - t1) + "毫秒");
if (rule.图片替换) {
if (rule.图片替换.startsWith("js:")) {
d.forEach(it => {
try {
var input = it.vod_pic;
eval(rule.图片替换.trim().replace("js:", ""));
it.vod_pic = input
} catch (e) {
log(`图片:${it.vod_pic}替换错误:${e.message}`)
}
})
} else if (rule.图片替换.includes("=>")) {
let replace_from = rule.图片替换.split("=>")[0];
let replace_to = rule.图片替换.split("=>")[1];
d.forEach(it => {
if (it.vod_pic && it.vod_pic.startsWith("http")) {
it.vod_pic = it.vod_pic.replace(replace_from, replace_to)
}
})
}
}
if (rule.图片来源) {
d.forEach(it => {
if (it.vod_pic && it.vod_pic.startsWith("http")) {
it.vod_pic = it.vod_pic + rule.图片来源
}
})
}
if (d.length > 0) {
print(d.slice(0, 2))
}
return JSON.stringify({
list: d
})
}
function categoryParse(cateObj) {
fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
let p = cateObj.一级;
if (!p || typeof p !== "string") {
return "{}"
}
let d = [];
let url = cateObj.url.replaceAll("fyclass", cateObj.tid);
if (cateObj.pg === 1 && url.includes("[") && url.includes("]")) {
url = url.split("[")[1].split("]")[0]
} else if (cateObj.pg > 1 && url.includes("[") && url.includes("]")) {
url = url.split("[")[0]
}
if (rule.filter_url) {
if (!/fyfilter/.test(url)) {
if (!url.endsWith("&") && !rule.filter_url.startsWith("&")) {
url += "&"
}
url += rule.filter_url
} else {
url = url.replace("fyfilter", rule.filter_url)
}
url = url.replaceAll("fyclass", cateObj.tid);
let fl = cateObj.filter ? cateObj.extend : {};
if (rule.filter_def && typeof rule.filter_def === "object") {
try {
if (Object.keys(rule.filter_def).length > 0 && rule.filter_def.hasOwnProperty(cateObj.tid)) {
let self_fl_def = rule.filter_def[cateObj.tid];
if (self_fl_def && typeof self_fl_def === "object") {
let fl_def = JSON.parse(JSON.stringify(self_fl_def));
fl = Object.assign(fl_def, fl)
}
}
} catch (e) {
print(`合并不同分类对应的默认筛选出错:${e.message}`)
}
}
let new_url;
new_url = cheerio.jinja2(url, {
fl: fl,
fyclass: cateObj.tid
});
url = new_url
}
if (/fypage/.test(url)) {
if (url.includes("(") && url.includes(")")) {
let url_rep = url.match(/.*?\((.*)\)/)[1];
let cnt_page = url_rep.replaceAll("fypage", cateObj.pg);
let cnt_pg = eval(cnt_page);
url = url.replaceAll(url_rep, cnt_pg).replaceAll("(", "").replaceAll(")", "")
} else {
url = url.replaceAll("fypage", cateObj.pg)
}
}
MY_URL = url;
console.log(MY_URL);
p = p.trim();
const MY_CATE = cateObj.tid;
if (p.startsWith("js:")) {
var MY_FL = cateObj.extend;
const TYPE = "cate";
var input = MY_URL;
const MY_PAGE = cateObj.pg;
var desc = "";
eval(p.trim().replace("js:", ""));
d = VODS
} else {
p = p.split(";");
if (p.length < 5) {
return "{}"
}
let _ps = parseTags.getParse(p[0]);
_pdfa = _ps.pdfa;
_pdfh = _ps.pdfh;
_pd = _ps.pd;
let is_json = p[0].startsWith("json:");
p[0] = p[0].replace(/^(jsp:|json:|jq:)/, "");
try {
let html = getHtml(MY_URL);
if (html) {
if (is_json) {
html = dealJson(html)
}
let list = _pdfa(html, p[0]);
list.forEach(it => {
let links = p[4].split("+").map(p4 => {
return !rule.detailUrl ? _pd(it, p4, MY_URL) : _pdfh(it, p4)
});
let link = links.join("$");
let vod_id = rule.detailUrl ? MY_CATE + "$" + link : link;
let vod_name = _pdfh(it, p[1]).replace(/\n|\t/g, "").trim();
let vod_pic = _pd(it, p[2], MY_URL);
if (rule.二级 === "*") {
vod_id = vod_id + "@@" + vod_name + "@@" + vod_pic
}
d.push({
vod_id: vod_id,
vod_name: vod_name,
vod_pic: vod_pic,
vod_remarks: _pdfh(it, p[3]).replace(/\n|\t/g, "").trim()
})
})
}
} catch (e) {
console.log(e.message)
}
}
if (rule.图片替换) {
if (rule.图片替换.startsWith("js:")) {
d.forEach(it => {
try {
var input = it.vod_pic;
eval(rule.图片替换.trim().replace("js:", ""));
it.vod_pic = input
} catch (e) {
log(`图片:${it.vod_pic}替换错误:${e.message}`)
}
})
} else if (rule.图片替换.includes("=>")) {
let replace_from = rule.图片替换.split("=>")[0];
let replace_to = rule.图片替换.split("=>")[1];
d.forEach(it => {
if (it.vod_pic && it.vod_pic.startsWith("http")) {
it.vod_pic = it.vod_pic.replace(replace_from, replace_to)
}
})
}
}
if (rule.图片来源) {
d.forEach(it => {
if (it.vod_pic && it.vod_pic.startsWith("http")) {
it.vod_pic = it.vod_pic + rule.图片来源
}
})
}
if (d.length > 0) {
print(d.slice(0, 2))
}
let pagecount = 0;
if (rule.pagecount && typeof rule.pagecount === "object" && rule.pagecount.hasOwnProperty(MY_CATE)) {
print(`MY_CATE:${MY_CATE},pagecount:${JSON.stringify(rule.pagecount)}`);
pagecount = parseInt(rule.pagecount[MY_CATE])
}
let nodata = {
list: [{
vod_name: "无数据,防无限请求",
vod_id: "no_data",
vod_remarks: "不要点,会崩的",
vod_pic: "https://ghproxy.net/https://raw.githubusercontent.com/hjdhnx/dr_py/main/404.jpg"
}],
total: 1,
pagecount: 1,
page: 1,
limit: 1
};
let vod = d.length < 1 ? JSON.stringify(nodata) : JSON.stringify({
page: parseInt(cateObj.pg),
pagecount: pagecount || 999,
limit: 20,
total: 999,
list: d
});
return vod
}
function searchParse(searchObj) {
fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
let d = [];
if (!searchObj.searchUrl) {
return "{}"
}
if (rule.searchNoPage && Number(searchObj.pg) > 1) {
return "{}"
}
let p = searchObj.搜索 === "*" && rule.一级 ? rule.一级 : searchObj.搜索;
if (!p || typeof p !== "string") {
return "{}"
}
p = p.trim();
let pp = rule.一级 ? rule.一级.split(";") : [];
let url = searchObj.searchUrl.replaceAll("**", searchObj.wd);
if (searchObj.pg === 1 && url.includes("[") && url.includes("]") && !url.includes("#")) {
url = url.split("[")[1].split("]")[0]
} else if (searchObj.pg > 1 && url.includes("[") && url.includes("]") && !url.includes("#")) {
url = url.split("[")[0]
}
if (/fypage/.test(url)) {
if (url.includes("(") && url.includes(")")) {
let url_rep = url.match(/.*?\((.*)\)/)[1];
let cnt_page = url_rep.replaceAll("fypage", searchObj.pg);
let cnt_pg = eval(cnt_page);
url = url.replaceAll(url_rep, cnt_pg).replaceAll("(", "").replaceAll(")", "")
} else {
url = url.replaceAll("fypage", searchObj.pg)
}
}
MY_URL = url;
console.log(MY_URL);
if (p.startsWith("js:")) {
const TYPE = "search";
const MY_PAGE = searchObj.pg;
const KEY = searchObj.wd;
var input = MY_URL;
var detailUrl = rule.detailUrl || "";
eval(p.trim().replace("js:", ""));
d = VODS
} else {
p = p.split(";");
if (p.length < 5) {
return "{}"
}
let p0 = getPP(p, 0, pp, 0);
let _ps = parseTags.getParse(p0);
_pdfa = _ps.pdfa;
_pdfh = _ps.pdfh;
_pd = _ps.pd;
let is_json = p0.startsWith("json:");
p0 = p0.replace(/^(jsp:|json:|jq:)/, "");
try {
let req_method = MY_URL.split(";").length > 1 ? MY_URL.split(";")[1].toLowerCase() : "get";
let html;
if (req_method === "post") {
let rurls = MY_URL.split(";")[0].split("#");
let rurl = rurls[0];
let params = rurls.length > 1 ? rurls[1] : "";
print(`post=》rurl:${rurl},params:${params}`);
let _fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
let postData = {
body: params
};
Object.assign(_fetch_params, postData);
html = post(rurl, _fetch_params)
} else if (req_method === "postjson") {
let rurls = MY_URL.split(";")[0].split("#");
let rurl = rurls[0];
let params = rurls.length > 1 ? rurls[1] : "";
print(`postjson-》rurl:${rurl},params:${params}`);
try {
params = JSON.parse(params)
} catch (e) {
params = "{}"
}
let _fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
let postData = {
body: params
};
Object.assign(_fetch_params, postData);
html = post(rurl, _fetch_params)
} else {
html = getHtml(MY_URL)
}
if (html) {
let search_tag = rule.搜索验证标识 || "系统安全验证|输入验证码";
if (new RegExp(search_tag).test(html)) {
let cookie = verifyCode(MY_URL);
if (cookie) {
console.log(`本次成功过验证,cookie:${cookie}`);
setItem(RULE_CK, cookie)
} else {
console.log(`本次自动过搜索验证失败,cookie:${cookie}`)
}
html = getHtml(MY_URL)
}
if (!html.includes(searchObj.wd)) {
console.log("搜索结果源码未包含关键字,疑似搜索失败,正为您打印结果源码");
console.log(html)
}
if (is_json) {
html = dealJson(html)
}
let list = _pdfa(html, p0);
let p1 = getPP(p, 1, pp, 1);
let p2 = getPP(p, 2, pp, 2);
let p3 = getPP(p, 3, pp, 3);
let p4 = getPP(p, 4, pp, 4);
let p5 = getPP(p, 5, pp, 5);
list.forEach(it => {
let links = p4.split("+").map(_p4 => {
return !rule.detailUrl ? _pd(it, _p4, MY_URL) : _pdfh(it, _p4)
});
let link = links.join("$");
let content;
if (p.length > 5 && p[5]) {
content = _pdfh(it, p5)
} else {
content = ""
}
let vod_id = link;
let vod_name = _pdfh(it, p1).replace(/\n|\t/g, "").trim();
let vod_pic = _pd(it, p2, MY_URL);
if (rule.二级 === "*") {
vod_id = vod_id + "@@" + vod_name + "@@" + vod_pic
}
let ob = {
vod_id: vod_id,
vod_name: vod_name,
vod_pic: vod_pic,
vod_remarks: _pdfh(it, p3).replace(/\n|\t/g, "").trim(),
vod_content: content.replace(/\n|\t/g, "").trim()
};
d.push(ob)
})
}
} catch (e) {
print(`搜索发生错误:${e.message}`);
return "{}"
}
}
if (rule.图片替换) {
if (rule.图片替换.startsWith("js:")) {
d.forEach(it => {
try {
var input = it.vod_pic;
eval(rule.图片替换.trim().replace("js:", ""));
it.vod_pic = input
} catch (e) {
log(`图片:${it.vod_pic}替换错误:${e.message}`)
}
})
} else if (rule.图片替换.includes("=>")) {
let replace_from = rule.图片替换.split("=>")[0];
let replace_to = rule.图片替换.split("=>")[1];
d.forEach(it => {
if (it.vod_pic && it.vod_pic.startsWith("http")) {
it.vod_pic = it.vod_pic.replace(replace_from, replace_to)
}
})
}
}
if (rule.图片来源) {
d.forEach(it => {
if (it.vod_pic && it.vod_pic.startsWith("http")) {
it.vod_pic = it.vod_pic + rule.图片来源
}
})
}
return JSON.stringify({
page: parseInt(searchObj.pg),
pagecount: 10,
limit: 20,
total: 100,
list: d
})
}
function detailParse(detailObj) {
let t1 = (new Date).getTime();
fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
let orId = detailObj.orId;
let vod_name = "片名";
let vod_pic = "";
let vod_id = orId;
if (rule.二级 === "*") {
let extra = orId.split("@@");
vod_name = extra.length > 1 ? extra[1] : vod_name;
vod_pic = extra.length > 2 ? extra[2] : vod_pic
}
let vod = {
vod_id: vod_id,
vod_name: vod_name,
vod_pic: vod_pic,
type_name: "类型",
vod_year: "年份",
vod_area: "地区",
vod_remarks: "更新信息",
vod_actor: "主演",
vod_director: "导演",
vod_content: "简介"
};
let p = detailObj.二级;
let url = detailObj.url;
let detailUrl = detailObj.detailUrl;
let fyclass = detailObj.fyclass;
let tab_exclude = detailObj.tab_exclude;
let html = detailObj.html || "";
MY_URL = url;
if (detailObj.二级访问前) {
try {
print(`尝试在二级访问前执行代码:${detailObj.二级访问前}`);
eval(detailObj.二级访问前.trim().replace("js:", ""))
} catch (e) {
print(`二级访问前执行代码出现错误:${e.message}`)
}
}
if (p === "*") {
vod.vod_play_from = "在线播放";
vod.vod_remarks = detailUrl;
vod.vod_actor = "没有二级,只有一级链接直接嗅探播放";
vod.vod_content = MY_URL;
vod.vod_play_url = "嗅探播放$" + MY_URL.split("@@")[0]
} else if (typeof p === "string" && p.trim().startsWith("js:")) {
const TYPE = "detail";
var input = MY_URL;
var play_url = "";
eval(p.trim().replace("js:", ""));
vod = VOD;
console.log(JSON.stringify(vod))
} else if (p && typeof p === "object") {
let tt1 = (new Date).getTime();
if (!html) {
html = getHtml(MY_URL)
}
print(`二级${MY_URL}仅获取源码耗时:${(new Date).getTime()-tt1}毫秒`);
let _ps;
if (p.is_json) {
print("二级是json");
_ps = parseTags.json;
html = dealJson(html)
} else if (p.is_jsp) {
print("二级是jsp");
_ps = parseTags.jsp
} else if (p.is_jq) {
print("二级是jq");
_ps = parseTags.jq
} else {
print("二级默认jq");
_ps = parseTags.jq
}
let tt2 = (new Date).getTime();
print(`二级${MY_URL}获取并装载源码耗时:${tt2-tt1}毫秒`);
_pdfa = _ps.pdfa;
_pdfh = _ps.pdfh;
_pd = _ps.pd;
if (p.title) {
let p1 = p.title.split(";");
vod.vod_name = _pdfh(html, p1[0]).replace(/\n|\t/g, "").trim();
let type_name = p1.length > 1 ? _pdfh(html, p1[1]).replace(/\n|\t/g, "").replace(/ /g, "").trim() : "";
vod.type_name = type_name || vod.type_name
}
if (p.desc) {
try {
let p1 = p.desc.split(";");
vod.vod_remarks = _pdfh(html, p1[0]).replace(/\n|\t/g, "").trim();
vod.vod_year = p1.length > 1 ? _pdfh(html, p1[1]).replace(/\n|\t/g, "").trim() : "";
vod.vod_area = p1.length > 2 ? _pdfh(html, p1[2]).replace(/\n|\t/g, "").trim() : "";
vod.vod_actor = p1.length > 3 ? _pdfh(html, p1[3]).replace(/\n|\t/g, "").trim() : "";
vod.vod_director = p1.length > 4 ? _pdfh(html, p1[4]).replace(/\n|\t/g, "").trim() : ""
} catch (e) {}
}
if (p.content) {
try {
let p1 = p.content.split(";");
vod.vod_content = _pdfh(html, p1[0]).replace(/\n|\t/g, "").trim()
} catch (e) {}
}
if (p.img) {
try {
let p1 = p.img.split(";");
vod.vod_pic = _pd(html, p1[0], MY_URL)
} catch (e) {}
}
let vod_play_from = "$$$";
let playFrom = [];
if (p.重定向 && p.重定向.startsWith("js:")) {
print("开始执行重定向代码:" + p.重定向);
html = eval(p.重定向.replace("js:", ""))
}
if (p.tabs) {
if (p.tabs.startsWith("js:")) {
print("开始执行tabs代码:" + p.tabs);
var input = MY_URL;
eval(p.tabs.replace("js:", ""));
playFrom = TABS
} else {
let p_tab = p.tabs.split(";")[0];
let vHeader = _pdfa(html, p_tab);
console.log(vHeader.length);
let tab_text = p.tab_text || "body&&Text";
let new_map = {};
for (let v of vHeader) {
let v_title = _pdfh(v, tab_text).trim();
if (!v_title) {
v_title = "线路空"
}
console.log(v_title);
if (tab_exclude && new RegExp(tab_exclude).test(v_title)) {
continue
}
if (!new_map.hasOwnProperty(v_title)) {
new_map[v_title] = 1
} else {
new_map[v_title] += 1
}
if (new_map[v_title] > 1) {
v_title += Number(new_map[v_title] - 1)
}
playFrom.push(v_title)
}
}
console.log(JSON.stringify(playFrom))
} else {
playFrom = ["在线播放"]
}
vod.vod_play_from = playFrom.join(vod_play_from);
let vod_play_url = "$$$";
let vod_tab_list = [];
if (p.lists) {
if (p.lists.startsWith("js:")) {
print("开始执行lists代码:" + p.lists);
try {
var input = MY_URL;
var play_url = "";
eval(p.lists.replace("js:", ""));
for (let i in LISTS) {
if (LISTS.hasOwnProperty(i)) {
try {
LISTS[i] = LISTS[i].map(it => it.split("$").slice(0, 2).join("$"))
} catch (e) {
print(`格式化LISTS发生错误:${e.message}`)
}
}
}
vod_play_url = LISTS.map(it => it.join("#")).join(vod_play_url)
} catch (e) {
print(`js执行lists: 发生错误:${e.message}`)
}
} else {
let list_text = p.list_text || "body&&Text";
let list_url = p.list_url || "a&&href";
let list_url_prefix = p.list_url_prefix || "";
let is_tab_js = p.tabs.trim().startsWith("js:");
for (let i = 0; i < playFrom.length; i++) {
let tab_name = playFrom[i];
let tab_ext = p.tabs.split(";").length > 1 && !is_tab_js ? p.tabs.split(";")[1] : "";
let p1 = p.lists.replaceAll("#idv", tab_name).replaceAll("#id", i);
tab_ext = tab_ext.replaceAll("#idv", tab_name).replaceAll("#id", i);
let tabName = tab_ext ? _pdfh(html, tab_ext) : tab_name;
console.log(tabName);
let new_vod_list = [];
let tt1 = (new Date).getTime();
if (typeof pdfl === "function") {
new_vod_list = pdfl(html, p1, list_text, list_url, MY_URL);
if (list_url_prefix) {
new_vod_list = new_vod_list.map(it => it.split("$")[0] + "$" + list_url_prefix + it.split("$").slice(1).join("$"))
}
} else {
let vodList = [];
try {
vodList = _pdfa(html, p1);
console.log("len(vodList):" + vodList.length)
} catch (e) {}
for (let i = 0; i < vodList.length; i++) {
let it = vodList[i];
new_vod_list.push(_pdfh(it, list_text).trim() + "$" + list_url_prefix + _pd(it, list_url, MY_URL))
}
}
if (new_vod_list.length > 0) {
new_vod_list = forceOrder(new_vod_list, "", x => x.split("$")[0]);
console.log(`drpy影响性能代码共计列表数循环次数:${new_vod_list.length},耗时:${(new Date).getTime()-tt1}毫秒`)
}
let vlist = new_vod_list.join("#");
vod_tab_list.push(vlist)
}
vod_play_url = vod_tab_list.join(vod_play_url)
}
}
vod.vod_play_url = vod_play_url
}
if (rule.图片替换 && rule.图片替换.includes("=>")) {
let replace_from = rule.图片替换.split("=>")[0];
let replace_to = rule.图片替换.split("=>")[1];
vod.vod_pic = vod.vod_pic.replace(replace_from, replace_to)
}
if (rule.图片来源 && vod.vod_pic && vod.vod_pic.startsWith("http")) {
vod.vod_pic = vod.vod_pic + rule.图片来源
}
if (!vod.vod_id || vod_id.includes("$") && vod.vod_id !== vod_id) {
vod.vod_id = vod_id
}
let t2 = (new Date).getTime();
console.log(`加载二级界面${MY_URL}耗时:${t2-t1}毫秒`);
try {
vod = vodDeal(vod)
} catch (e) {
console.log(`vodDeal发生错误:${e.message}`)
}
return JSON.stringify({
list: [vod]
})
}
function get_tab_index(vod) {
let obj = {};
vod.vod_play_from.split("$$$").forEach((it, index) => {
obj[it] = index
});
return obj
}
function vodDeal(vod) {
let vod_play_from = vod.vod_play_from.split("$$$");
let vod_play_url = vod.vod_play_url.split("$$$");
let tab_removed_list = vod_play_from;
let tab_ordered_list = vod_play_from;
let tab_renamed_list = vod_play_from;
let tab_list = vod_play_from;
let play_ordered_list = vod_play_url;
if (rule.tab_remove && rule.tab_remove.length > 0 || rule.tab_order && rule.tab_order.length > 0) {
let tab_index_dict = get_tab_index(vod);
if (rule.tab_remove && rule.tab_remove.length > 0) {
tab_removed_list = vod_play_from.filter(it => !rule.tab_remove.includes(it));
tab_list = tab_removed_list
}
if (rule.tab_order && rule.tab_order.length > 0) {
let tab_order = rule.tab_order;
tab_ordered_list = tab_removed_list.sort((a, b) => {
const getOrderIndex = (tabName, orderRules) => {
for (let i = 0; i < orderRules.length; i++) {
if (tabName.includes(orderRules[i])) {
return i
}
}
return 9999
};
const indexA = getOrderIndex(a, tab_order);
const indexB = getOrderIndex(b, tab_order);
return indexA - indexB
});
tab_list = tab_ordered_list
}
play_ordered_list = tab_list.map(it => vod_play_url[tab_index_dict[it]])
}
if (rule.tab_rename && typeof rule.tab_rename === "object" & Object.keys(rule.tab_rename).length > 0) {
tab_renamed_list = tab_list.map(it => rule.tab_rename[it] || it);
tab_list = tab_renamed_list
}
vod.vod_play_from = tab_list.join("$$$");
vod.vod_play_url = play_ordered_list.join("$$$");
return vod
}
function tellIsJx(url) {
try {
let is_vip = !/\.(m3u8|mp4|m4a)$/.test(url.split("?")[0]) && 是否正版(url);
return is_vip ? 1 : 0
} catch (e) {
return 1
}
}
function playParse(playObj) {
fetch_params = JSON.parse(JSON.stringify(rule_fetch_params));
MY_URL = playObj.url;
var MY_FLAG = playObj.flag;
if (!/http/.test(MY_URL)) {
try {
MY_URL = base64Decode(MY_URL)
} catch (e) {}
}
MY_URL = decodeURIComponent(MY_URL);
var input = MY_URL;
var flag = MY_FLAG;
let common_play = {
parse: SPECIAL_URL.test(input) || /^(push:)/.test(input) ? 0 : 1,
url: input,
flag: flag,
jx: tellIsJx(input)
};
let lazy_play;
if (!rule.play_parse || !rule.lazy) {
lazy_play = common_play
} else if (rule.play_parse && rule.lazy && typeof rule.lazy === "string") {
try {
let lazy_code = rule.lazy.trim();
if (lazy_code.startsWith("js:")) {
lazy_code = lazy_code.replace("js:", "").trim()
}
print("开始执行js免嗅=>" + lazy_code);
eval(lazy_code);
lazy_play = typeof input === "object" ? input : {
parse: SPECIAL_URL.test(input) || /^(push:)/.test(input) ? 0 : 1,
jx: tellIsJx(input),
url: input
}
} catch (e) {
print(`js免嗅错误:${e.message}`);
lazy_play = common_play
}
} else {
lazy_play = common_play
}
if (Array.isArray(rule.play_json) && rule.play_json.length > 0) {
let web_url = lazy_play.url;
for (let pjson of rule.play_json) {
if (pjson.re && (pjson.re === "*" || web_url.match(new RegExp(pjson.re)))) {
if (pjson.json && typeof pjson.json === "object") {
let base_json = pjson.json;
lazy_play = Object.assign(lazy_play, base_json);
break
}
}
}
} else if (rule.play_json && !Array.isArray(rule.play_json)) {
let base_json = {
jx: 1,
parse: 1
};
lazy_play = Object.assign(lazy_play, base_json)
} else if (!rule.play_json) {
let base_json = {
jx: 0,
parse: 1
};
lazy_play = Object.assign(lazy_play, base_json)
}
console.log(JSON.stringify(lazy_play));
return JSON.stringify(lazy_play)
}
function proxyParse(proxyObj) {
var input = proxyObj.params;
if (proxyObj.proxy_rule) {
log("准备执行本地代理规则:\n" + proxyObj.proxy_rule);
try {
eval(proxyObj.proxy_rule);
if (input && input !== proxyObj.params && Array.isArray(input) && input.length >= 3) {
return input
} else {
return [404, "text/plain", "Not Found"]
}
} catch (e) {
return [500, "text/plain", "代理规则错误:" + e.message]
}
} else {
return [404, "text/plain", "Not Found"]
}
}
function isVideoParse(isVideoObj) {
var input = isVideoObj.url;
if (!isVideoObj.t) {
let re_matcher = new RegExp(isVideoObj.isVideo, "i");
return re_matcher.test(input)
} else {
try {
eval(isVideoObj.isVideo);
if (typeof input === "boolean") {
return input
} else {
return false
}
} catch (e) {
log(`执行嗅探规则发生错误:${e.message}`);
return false
}
}
}
function removeHeader(content, options = {}) {
const {
mode = "header-only", fileType
} = options;
const COMMENT_CONFIG = {
".js": {
start: "/*",
end: "*/",
regex: /^\s*\/\*([\s\S]*?)\*\/\s*/,
headerRegex: /@header\(([\s\S]*?)\)/,
topCommentsRegex: /^(\s*(\/\/[^\n]*\n|\/\*[\s\S]*?\*\/)\s*)+/
},
".py": {
start: '"""',
end: '"""',
regex: /^\s*"""([\s\S]*?)"""\s*/,
headerRegex: /@header\(([\s\S]*?)\)/,
topCommentsRegex: /^(\s*(#[^\n]*\n|'''[\s\S]*?'''|"""[\s\S]*?""")\s*)+/
}
};
if (!fileType) throw new Error("fileType option is required");
const ext = fileType.startsWith(".") ? fileType : `.${fileType}`;
const config = COMMENT_CONFIG[ext];
if (!config) throw new Error(`Unsupported file type: ${ext}`);
if (mode === "top-comments") {
const match = content.match(config.topCommentsRegex);
if (match) {
return content.substring(match[0].length).trim()
}
return content.trim()
}
const match = content.match(config.regex);
if (!match) return content.trim();
let [fullComment, innerContent] = match;
if (config.headerRegex.test(innerContent)) {
innerContent = innerContent.replace(config.headerRegex, "");
const cleanedInner = innerContent.split("\n").filter(line => line.trim().length > 0).join("\n");
if (!cleanedInner.trim()) {
return content.replace(fullComment, "").trim()
} else {
const newComment = `${config.start}${cleanedInner}${config.end}`;
return content.replace(fullComment, newComment).trim()
}
}
return content.trim()
}
function getOriginalJs(js_code) {
let current_match = /var rule|function|let |var |const|class Rule|async|this\./;
if (current_match.test(js_code)) {
return js_code
}
js_code = removeHeader(js_code, {
mode: "top-comments",
fileType: ".js"
});
let rsa_private_key = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCqin/jUpqM6+fgYP/oMqj9zcdHMM0mEZXLeTyixIJWP53lzJV2N2E3OP6BBpUmq2O1a9aLnTIbADBaTulTNiOnVGoNG58umBnupnbmmF8iARbDp2mTzdMMeEgLdrfXS6Y3VvazKYALP8EhEQykQVarexR78vRq7ltY3quXx7cgI0ROfZz5Sw3UOLQJ+VoWmwIxu9AMEZLVzFDQN93hzuzs3tNyHK6xspBGB7zGbwCg+TKi0JeqPDrXxYUpAz1cQ/MO+Da0WgvkXnvrry8NQROHejdLVOAslgr6vYthH9bKbsGyNY3H+P12kcxo9RAcVveONnZbcMyxjtF5dWblaernAgMBAAECggEAGdEHlSEPFmAr5PKqKrtoi6tYDHXdyHKHC5tZy4YV+Pp+a6gxxAiUJejx1hRqBcWSPYeKne35BM9dgn5JofgjI5SKzVsuGL6bxl3ayAOu+xXRHWM9f0t8NHoM5fdd0zC3g88dX3fb01geY2QSVtcxSJpEOpNH3twgZe6naT2pgiq1S4okpkpldJPo5GYWGKMCHSLnKGyhwS76gF8bTPLoay9Jxk70uv6BDUMlA4ICENjmsYtd3oirWwLwYMEJbSFMlyJvB7hjOjR/4RpT4FPnlSsIpuRtkCYXD4jdhxGlvpXREw97UF2wwnEUnfgiZJ2FT/MWmvGGoaV/CfboLsLZuQKBgQDTNZdJrs8dbijynHZuuRwvXvwC03GDpEJO6c1tbZ1s9wjRyOZjBbQFRjDgFeWs9/T1aNBLUrgsQL9c9nzgUziXjr1Nmu52I0Mwxi13Km/q3mT+aQfdgNdu6ojsI5apQQHnN/9yMhF6sNHg63YOpH+b+1bGRCtr1XubuLlumKKscwKBgQDOtQ2lQjMtwsqJmyiyRLiUOChtvQ5XI7B2mhKCGi8kZ+WEAbNQcmThPesVzW+puER6D4Ar4hgsh9gCeuTaOzbRfZ+RLn3Aksu2WJEzfs6UrGvm6DU1INn0z/tPYRAwPX7sxoZZGxqML/z+/yQdf2DREoPdClcDa2Lmf1KpHdB+vQKBgBXFCVHz7a8n4pqXG/HvrIMJdEpKRwH9lUQS/zSPPtGzaLpOzchZFyQQBwuh1imM6Te+VPHeldMh3VeUpGxux39/m+160adlnRBS7O7CdgSsZZZ/dusS06HAFNraFDZf1/VgJTk9BeYygX+AZYu+0tReBKSs9BjKSVJUqPBIVUQXAoGBAJcZ7J6oVMcXxHxwqoAeEhtvLcaCU9BJK36XQ/5M67ceJ72mjJC6/plUbNukMAMNyyi62gO6I9exearecRpB/OGIhjNXm99Ar59dAM9228X8gGfryLFMkWcO/fNZzb6lxXmJ6b2LPY3KqpMwqRLTAU/zy+ax30eFoWdDHYa4X6e1AoGAfa8asVGOJ8GL9dlWufEeFkDEDKO9ww5GdnpN+wqLwePWqeJhWCHad7bge6SnlylJp5aZXl1+YaBTtOskC4Whq9TP2J+dNIgxsaF5EFZQJr8Xv+lY9lu0CruYOh9nTNF9x3nubxJgaSid/7yRPfAGnsJRiknB5bsrCvgsFQFjJVs=";
let decode_content = "";
function aes_decrypt(data) {
let key = CryptoJS.enc.Hex.parse("686A64686E780A0A0A0A0A0A0A0A0A0A");
let iv = CryptoJS.enc.Hex.parse("647A797964730A0A0A0A0A0A0A0A0A0A");
let encrypted = CryptoJS.AES.decrypt({
ciphertext: CryptoJS.enc.Base64.parse(data)
}, key, {
iv: iv,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
}).toString(CryptoJS.enc.Utf8);
return encrypted
}
let error_log = false;
function logger(text) {
if (error_log) {
log(text)
}
}
let decode_funcs = [text => {
try {
return ungzip(text)
} catch (e) {
logger("非gzip加密");
return ""
}
}, text => {
try {
return base64Decode(text)
} catch (e) {
logger("非b64加密");
return ""
}
}, text => {
try {
return aes_decrypt(text)
} catch (e) {
logger("非aes加密");
return ""
}
}, text => {
try {
return RSA.decode(text, rsa_private_key, null)
} catch (e) {
logger("非rsa加密");
return ""
}
}];
let func_index = 0;
while (!current_match.test(decode_content)) {
decode_content = decode_funcs[func_index](js_code);
func_index++;
if (func_index >= decode_funcs.length) {
break
}
}
return decode_content
}
function runMain(main_func_code, arg) {
let mainFunc = function() {
return ""
};
try {
eval(main_func_code + "\nmainFunc=main;");
return mainFunc(arg)
} catch (e) {
log(`执行main_funct发生了错误:${e.message}`);
return ""
}
}
function init(ext) {
console.log("init");
rule = {};
rule_fetch_params = {};
fetch_params = null;
try {
let muban = 模板.getMubans();
if (typeof ext == "object") {
rule = ext
} else if (typeof ext == "string") {
let is_file = ext.startsWith("file://");
if (ext.startsWith("http") || is_file) {
let query = getQuery(ext);
if (is_file) {
ext = ext.split("?")[0]
}
let js = request(ext, {
method: "GET"
});
if (js) {
js = getOriginalJs(js);
eval("(function(){" + js.replace("var rule", "rule") + "})()")
}
if (query.type === "url" && query.params) {
if (is_file && /^http/.test(query.params)) {
rule.params = query.params
} else {
rule.params = urljoin(ext, query.params)
}
} else if (query.params) {
rule.params = query.params
}
} else {
ext = getOriginalJs(ext);
eval("(function(){" + ext.replace("var rule", "rule") + "})()")
}
} else {
console.log(`规则加载失败,不支持的规则类型:${typeof ext}`);
return
}
rule.host = (rule.host || "").rstrip("/");
HOST = rule.host;
if (rule.hostJs) {
console.log(`检测到hostJs,准备执行...`);
try {
eval(rule.hostJs);
rule.host = HOST.rstrip("/")
} catch (e) {
console.log(`执行${rule.hostJs}获取host发生错误:${e.message}`)
}
}
if (rule["模板"] === "自动") {
try {
let host_headers = rule["headers"] || {};
let host_html = getCode(HOST, {
headers: host_headers
});
let match_muban = "";
let muban_keys = Object.keys(muban).filter(it => !/默认|短视2|采集1/.test(it));
for (let muban_key of muban_keys) {
try {
let host_data = JSON.parse(home({}, host_html, muban[muban_key].class_parse));
if (host_data.class && host_data.class.length > 0) {
match_muban = muban_key;
console.log(`自动匹配模板:【${muban_key}`);
break
}
} catch (e) {
console.log(`自动匹配模板:【${muban_key}】错误:${e.message}`)
}
}
if (match_muban) {
muban["自动"] = muban[match_muban];
if (rule["模板修改"] && rule["模板修改"].startsWith("js:")) {
eval(rule["模板修改"].replace("js:", "").trim())
}
} else {
delete rule["模板"]
}
} catch (e) {
delete rule["模板"]
}
}
if (rule.模板 && muban.hasOwnProperty(rule.模板)) {
print("继承模板:" + rule.模板);
rule = Object.assign(muban[rule.模板], rule)
}
let rule_cate_excludes = (rule.cate_exclude || "").split("|").filter(it => it.trim());
let rule_tab_excludes = (rule.tab_exclude || "").split("|").filter(it => it.trim());
rule_cate_excludes = rule_cate_excludes.concat(CATE_EXCLUDE.split("|").filter(it => it.trim()));
rule_tab_excludes = rule_tab_excludes.concat(TAB_EXCLUDE.split("|").filter(it => it.trim()));
rule.cate_exclude = rule_cate_excludes.join("|");
rule.tab_exclude = rule_tab_excludes.join("|");
rule.类型 = rule.类型 || "影视";
rule.url = rule.url || "";
rule.double = rule.double || false;
rule.homeUrl = rule.homeUrl || "";
rule.detailUrl = rule.detailUrl || "";
rule.searchUrl = rule.searchUrl || "";
rule.homeUrl = rule.host && rule.homeUrl ? urljoin(rule.host, rule.homeUrl) : rule.homeUrl || rule.host;
rule.homeUrl = cheerio.jinja2(rule.homeUrl, {
rule: rule
});
rule.detailUrl = rule.host && rule.detailUrl ? urljoin(rule.host, rule.detailUrl) : rule.detailUrl;
rule.二级访问前 = rule.二级访问前 || "";
if (rule.url.includes("[") && rule.url.includes("]")) {
let u1 = rule.url.split("[")[0];
let u2 = rule.url.split("[")[1].split("]")[0];
rule.url = rule.host && rule.url ? urljoin(rule.host, u1) + "[" + urljoin(rule.host, u2) + "]" : rule.url
} else {
rule.url = rule.host && rule.url ? urljoin(rule.host, rule.url) : rule.url
}
if (rule.searchUrl.includes("[") && rule.searchUrl.includes("]") && !rule.searchUrl.includes("#")) {
let u1 = rule.searchUrl.split("[")[0];
let u2 = rule.searchUrl.split("[")[1].split("]")[0];
rule.searchUrl = rule.host && rule.searchUrl ? urljoin(rule.host, u1) + "[" + urljoin(rule.host, u2) + "]" : rule.searchUrl
} else {
rule.searchUrl = rule.host && rule.searchUrl ? urljoin(rule.host, rule.searchUrl) : rule.searchUrl
}
rule.timeout = rule.timeout || 5e3;
rule.encoding = rule.编码 || rule.encoding || "utf-8";
rule.search_encoding = rule.搜索编码 || rule.search_encoding || "";
rule.图片来源 = rule.图片来源 || "";
rule.图片替换 = rule.图片替换 || "";
rule.play_json = rule.hasOwnProperty("play_json") ? rule.play_json : [];
rule.pagecount = rule.hasOwnProperty("pagecount") ? rule.pagecount : {};
rule.proxy_rule = rule.hasOwnProperty("proxy_rule") ? rule.proxy_rule : "";
if (!rule.hasOwnProperty("sniffer")) {
rule.sniffer = false
}
rule.sniffer = rule.hasOwnProperty("sniffer") ? rule.sniffer : "";
rule.sniffer = !!(rule.sniffer && rule.sniffer !== "0" && rule.sniffer !== "false");
rule.isVideo = rule.hasOwnProperty("isVideo") ? rule.isVideo : "";
if (rule.sniffer && !rule.isVideo) {
rule.isVideo = "http((?!http).){12,}?\\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg|m4a|mp3)\\?.*|http((?!http).){12,}\\.(m3u8|mp4|flv|avi|mkv|rm|wmv|mpg|m4a|mp3)|http((?!http).)*?video/tos*|http((?!http).)*?obj/tos*"
}
rule.tab_remove = rule.hasOwnProperty("tab_remove") ? rule.tab_remove : [];
rule.tab_order = rule.hasOwnProperty("tab_order") ? rule.tab_order : [];
rule.tab_rename = rule.hasOwnProperty("tab_rename") ? rule.tab_rename : {};
if (rule.headers && typeof rule.headers === "object") {
try {
let header_keys = Object.keys(rule.headers);
for (let k of header_keys) {
if (k.toLowerCase() === "user-agent") {
let v = rule.headers[k];
console.log(v);
if (["MOBILE_UA", "PC_UA", "UC_UA", "IOS_UA", "UA"].includes(v)) {
rule.headers[k] = eval(v)
}
} else if (k.toLowerCase() === "cookie") {
let v = rule.headers[k];
if (v && v.startsWith("http")) {
console.log(v);
try {
v = fetch(v);
console.log(v);
rule.headers[k] = v
} catch (e) {
console.log(`${v}获取cookie发生错误:${e.message}`)
}
}
}
}
} catch (e) {
console.log(`处理headers发生错误:${e.message}`)
}
} else {
rule.headers = {}
}
oheaders = deepCopy(rule.headers);
rule_fetch_params = {
headers: rule.headers,
timeout: rule.timeout,
encoding: rule.encoding
};
RKEY = typeof key !== "undefined" && key ? key : "drpy_" + (rule.title || rule.host);
pre();
init_test()
} catch (e) {
console.log(`init_test发生错误:${e.message}`)
}
}
let homeHtmlCache = undefined;
function home(filter, home_html, class_parse) {
console.log("home");
home_html = home_html || "";
class_parse = class_parse || "";
if (typeof rule.filter === "string" && rule.filter.trim().length > 0) {
try {
let filter_json = ungzip(rule.filter.trim());
rule.filter = JSON.parse(filter_json)
} catch (e) {
rule.filter = {}
}
}
let homeObj = {
filter: rule.filter || false,
MY_URL: rule.homeUrl,
class_name: rule.class_name || "",
class_url: rule.class_url || "",
class_parse: class_parse || rule.class_parse || "",
cate_exclude: rule.cate_exclude,
home_html: home_html
};
return homeParse(homeObj)
}
function homeVod(params) {
console.log("homeVod");
let homeVodObj = {
"推荐": rule.推荐,
double: rule.double,
homeUrl: rule.homeUrl,
detailUrl: rule.detailUrl
};
return homeVodParse(homeVodObj)
}
function category(tid, pg, filter, extend) {
let cateObj = {
url: rule.url,
"一级": rule.一级,
tid: tid,
pg: parseInt(pg),
filter: filter,
extend: extend
};
return categoryParse(cateObj)
}
function detail(vod_url) {
let orId = vod_url;
let fyclass = "";
log("orId:" + orId);
if (vod_url.indexOf("$") > -1) {
let tmp = vod_url.split("$");
fyclass = tmp[0];
vod_url = tmp[1]
}
let detailUrl = vod_url.split("@@")[0];
let url;
if (!detailUrl.startsWith("http") && !detailUrl.includes("/")) {
url = rule.detailUrl.replaceAll("fyid", detailUrl).replaceAll("fyclass", fyclass)
} else if (detailUrl.includes("/")) {
url = urljoin(rule.homeUrl, detailUrl)
} else {
url = detailUrl
}
let detailObj = {
orId: orId,
url: url,
"二级": rule.二级,
"二级访问前": rule.二级访问前,
detailUrl: detailUrl,
fyclass: fyclass,
tab_exclude: rule.tab_exclude
};
return detailParse(detailObj)
}
function play(flag, id, flags) {
let playObj = {
url: id,
flag: flag,
flags: flags
};
return playParse(playObj)
}
function search(wd, quick, pg) {
if (rule.search_encoding) {
if (rule.search_encoding.toLowerCase() !== "utf-8") {
wd = encodeStr(wd, rule.search_encoding)
}
} else if (rule.encoding && rule.encoding.toLowerCase() !== "utf-8") {
wd = encodeStr(wd, rule.encoding)
}
let searchObj = {
searchUrl: rule.searchUrl,
"搜索": rule.搜索,
wd: wd,
pg: pg || 1,
quick: quick
};
return searchParse(searchObj)
}
function proxy(params) {
if (rule.proxy_rule && rule.proxy_rule.trim()) {
rule.proxy_rule = rule.proxy_rule.trim()
}
if (rule.proxy_rule.startsWith("js:")) {
rule.proxy_rule = rule.proxy_rule.replace("js:", "")
}
let proxyObj = {
params: params,
proxy_rule: rule.proxy_rule
};
return proxyParse(proxyObj)
}
function sniffer() {
let enable_sniffer = rule.sniffer || false;
if (enable_sniffer) {
log("开始执行辅助嗅探代理规则...")
}
return enable_sniffer
}
function isVideo(url) {
let t = 0;
let is_video;
if (rule.isVideo && rule.isVideo.trim()) {
is_video = rule.isVideo.trim()
}
if (is_video.startsWith("js:")) {
is_video = is_video.replace("js:", "");
t = 1
}
let isVideoObj = {
url: url,
isVideo: is_video,
t: t
};
let result = isVideoParse(isVideoObj);
if (result) {
log("成功执行辅助嗅探规则并检测到视频地址:\n" + rule.isVideo)
}
return result
}
function getRule(key) {
return key ? rule[key] || "" : rule
}
function deepCopy(_obj) {
return JSON.parse(JSON.stringify(_obj))
}
function matchesAll(str, pattern, flatten) {
if (!pattern.global) {
pattern = new RegExp(pattern.source, "g" + (pattern.ignoreCase ? "i" : "") + (pattern.multiline ? "m" : ""))
}
var matches = [];
var match;
while ((match = pattern.exec(str)) !== null) {
matches.push(match)
}
return flatten ? matches.flat() : matches
}
function stringUtils() {
Object.defineProperties(String.prototype, {
replaceX: {
value: function(regex, replacement) {
let matches = matchesAll(this, regex, true);
if (matches && matches.length > 1) {
const hasCaptureGroup = /\$\d/.test(replacement);
if (hasCaptureGroup) {
return this.replace(regex, m => m.replace(regex, replacement))
} else {
return this.replace(regex, (m, p1) => m.replace(p1, replacement))
}
}
return this.replace(regex, replacement)
},
configurable: true,
enumerable: false,
writable: true
},
parseX: {
get: function() {
try {
return JSON.parse(this)
} catch (e) {
console.log(e.message);
return this.startsWith("[") ? [] : {}
}
},
configurable: true,
enumerable: false
}
})
}
function cut(text, start, end, method, All) {
let result = "";
let c = (t, s, e) => {
let result = "";
let rs = [];
let results = [];
try {
let lr = new RegExp(String.raw`${s}`.toString());
let rr = new RegExp(String.raw`${e}`.toString());
const segments = t.split(lr);
if (segments.length < 2) return "";
let cutSegments = segments.slice(1).map(segment => {
let splitSegment = segment.split(rr);
return splitSegment.length < 2 ? undefined : splitSegment[0] + e
}).filter(f => f);
if (All) {
return `[${cutSegments.join(",")}]`
} else {
return cutSegments[0]
}
} catch (e) {
console.log(`Error cutting text:${e.message}`)
}
return result
};
result = c(text, start, end);
stringUtils();
if (method && typeof method === "function") {
result = method(result)
}
return result
}
function DRPY() {
return {
runMain: runMain,
getRule: getRule,
init: init,
home: home,
homeVod: homeVod,
category: category,
detail: detail,
play: play,
search: search,
proxy: proxy,
sniffer: sniffer,
isVideo: isVideo,
fixAdM3u8Ai: fixAdM3u8Ai
}
}
export default {
runMain: runMain,
getRule: getRule,
init: init,
home: home,
homeVod: homeVod,
category: category,
detail: detail,
play: play,
search: search,
proxy: proxy,
sniffer: sniffer,
isVideo: isVideo,
fixAdM3u8Ai: fixAdM3u8Ai,
DRPY: DRPY
};
+354
View File
@@ -0,0 +1,354 @@
var il = 'jsjiami.com.v6',
il_ = ['il'],
lIIIl1ll = [il, '\x6f\x6b\x68\x74\x74\x70\x2f\x33\x2e\x31\x35', '\x69\x6e\x64\x65\x78\x4f\x66', '\x24\x24\x24', '\x73\x70\x6c\x69\x74', '\x74\x72\x69\x6d', '\x26\x26\x26', '\x3a\x2f\x2f', '\x6c\x6f\x67', '\x70\x69\x63\x55\x72\x6c\x3a\x20', '\x72\x65\x70\x6c\x61\x63\x65', '\x70\x75\x73\x68', '\x2f\x66\x69\x6c\x65\x2f\x6c\x69\x76\x65\x73\x6f\x75\x72\x63\x65\x6c\x69\x73\x74', '\x2f\x6c\x69\x76\x65\x73\x6f\x75\x72\x63\x65\x6c\x69\x73\x74', '\x47\x45\x54', '\x70\x61\x72\x73\x65', '\x63\x6f\x6e\x74\x65\x6e\x74', '\x73\x75\x62\x73\x74\x72\x69\x6e\x67', '\x6c\x61\x73\x74\x49\x6e\x64\x65\x78\x4f\x66', '\x6e\x61\x6d\x65', '\x75\x72\x6c', '\x3d\x3d\x3d\x3d\x20\x3e\x3e\x3e\x20', '\x73\x74\x72\x69\x6e\x67\x69\x66\x79', '\x65\x78\x65\x63', '\x74\x65\x73\x74', '\x6d\x61\x74\x63\x68', '\x63\x68\x61\x6e\x6e\x65\x6c', '\x2c\x23\x67\x65\x6e\x72\x65\x23\x0a', '\x75\x72\x6c\x73', '\x64\x61\x74\x61', '\x64\x61\x74\x61\x6c\x69\x73\x74', '\x70\x72\x6f\x76', '\x6c\x69\x73\x74', '\x2d\x2d\x2d', '\x6c\x69\x6e\x65', '\x77\x65\x62\x50\x69\x63\x55\x72\x6c\x3a\x20', '\x23\x45\x58\x54\x4d\x33\x55', '\x22\x63\x68\x61\x6e\x6e\x65\x6c\x22', '\x22\x75\x72\x6c\x73\x22', '\x22\x64\x61\x74\x61\x6c\x69\x73\x74\x22', '\x6c\x65\x6e\x67\x74\x68', '\x23\x67\x65\x6e\x72\x65\x23', '\x7b\x6e\x61\x6d\x65\x7d', '\x7b\x63\x61\x74\x65\x7d', '\u76f4\u64ad\u5217\u8868', '\x6e\x75\x6c\x6c', '\x74\x79\x70\x65\x5f\x69\x64', '\x76\x6f\x64\x5f\x70\x6c\x61\x79\x5f\x75\x72\x6c', '\x68\x61\x73\x4f\x77\x6e\x50\x72\x6f\x70\x65\x72\x74\x79', '\x6a\x6f\x69\x6e', '\x76\x6f\x64\x5f\x70\x6c\x61\x79\x5f\x66\x72\x6f\x6d', '\x6a\x43\x50\x73\x4e\x6a\x77\x69\x4a\x61\x51\x6d\x69\x2e\x63\x6f\x4e\x4f\x6d\x47\x72\x2e\x76\x56\x36\x41\x46\x67\x79\x74\x74\x3d\x3d'];
function Ii1l1III(_0x3b13df, _0x346a54) {
_0x3b13df = ~~'0x' ['concat'](_0x3b13df['slice'](0x0));
var _0x4db44b = lIIIl1ll[_0x3b13df];
return _0x4db44b;
};
(function(_0x209161, _0x5eaa4a) {
var _0x42ecdf = 0x0;
for (_0x5eaa4a = _0x209161['shift'](_0x42ecdf >> 0x2); _0x5eaa4a && _0x5eaa4a !== (_0x209161['pop'](_0x42ecdf >> 0x3) + '')['replace'](/[CPNwJQNOGrVAFgytt=]/g, ''); _0x42ecdf++) {
_0x42ecdf = _0x42ecdf ^ 0x127efd;
}
}(lIIIl1ll, Ii1l1III));
let headers = {
'User-Agent': Ii1l1III('0')
};
let classes = [];
let cates = {};
let picUrl = '';
let webPaths = {};
function init(IiIIi1i) {
let i1Ii11I1 = '';
if (IiIIi1i[Ii1l1III('1')](Ii1l1III('2')) > 0x0) {
i1Ii11I1 = IiIIi1i[Ii1l1III('3')](Ii1l1III('2'))[0x0][Ii1l1III('4')]();
IiIIi1i = IiIIi1i[Ii1l1III('3')](Ii1l1III('2'))[0x1][Ii1l1III('4')]();
}
if (IiIIi1i[Ii1l1III('1')](Ii1l1III('5')) > 0x0) {
picUrl = IiIIi1i[Ii1l1III('3')](Ii1l1III('5'))[0x1][Ii1l1III('4')]();
if (picUrl[Ii1l1III('1')](Ii1l1III('6')) < 0x0) {
picUrl = i1Ii11I1 + picUrl;
}
IiIIi1i = IiIIi1i[Ii1l1III('3')](Ii1l1III('5'))[0x0][Ii1l1III('4')]();
}
console[Ii1l1III('7')](Ii1l1III('8') + picUrl);
let IIlIlI1I = IiIIi1i[Ii1l1III('3')]('\x23');
for (const IlII1I1 of IIlIlI1I) {
if (IlII1I1[Ii1l1III('1')]('\x24') > 0x0) {
let illIl111 = IlII1I1;
let Ill1iIi = IlII1I1[Ii1l1III('3')]('\x24')[0x0];
if (illIl111[Ii1l1III('1')](Ii1l1III('6')) < 0x0) {
illIl111 = illIl111[Ii1l1III('9')]('\x24', '\x24' + i1Ii11I1);
}
classes[Ii1l1III('a')]({
'type_id': illIl111,
'type_name': Ill1iIi[Ii1l1III('9')]('\x21\x21', '')
});
} else {
let II1lIlli = IlII1I1;
if (II1lIlli[Ii1l1III('1')](Ii1l1III('6')) < 0x0) {
II1lIlli = i1Ii11I1 + II1lIlli;
}
II1lIlli = II1lIlli[Ii1l1III('9')](Ii1l1III('b'), Ii1l1III('c'));
let Illi11ll = req(II1lIlli, {
'\x6d\x65\x74\x68\x6f\x64': Ii1l1III('d'),
'\x68\x65\x61\x64\x65\x72\x73': headers
});
try {
let l1lIiill = JSON[Ii1l1III('e')](Illi11ll[Ii1l1III('f')]);
let lillI11l = II1lIlli[Ii1l1III('10')](0x0, II1lIlli[Ii1l1III('11')]('\x2f') + 0x1);
for (const i1iilII1 of l1lIiill) {
let Iillil = i1iilII1[Ii1l1III('12')];
let lI1iIl = i1iilII1[Ii1l1III('13')];
let illIl111 = Iillil + '\x24' + (lI1iIl[Ii1l1III('1')](Ii1l1III('6')) < 0x0 ? lillI11l : '') + lI1iIl;
classes[Ii1l1III('a')]({
'type_id': illIl111,
'type_name': Iillil[Ii1l1III('9')]('\x21\x21', '')
});
webPaths[illIl111] = lillI11l;
}
} catch (Ii1Ii11) {
console[Ii1l1III('7')](Ii1l1III('14') + Ii1Ii11);
}
}
}
}
function home(I1iiIiIl) {
return JSON[Ii1l1III('15')]({
'class': classes,
'filters': null
});
}
function parseM3u(iIi1Ii1I, I1IlIIIi) {
let iI1iiIii = {};
let iiI11111 = /(#EXTINF:.+?),([^,]+?)\s*\n(.+?)\s*\n/g;
let ii1iilil = null;
while ((ii1iilil = iiI11111[Ii1l1III('16')](iIi1Ii1I)) != null) {
let lllli1iI = ii1iilil[0x1];
let il1Ili1I = ii1iilil[0x2];
let liIlll1l = ii1iilil[0x3];
if (il1Ili1I == null || liIlll1l == null || il1Ili1I == '' || liIlll1l == '') {
continue;
}
il1Ili1I = il1Ili1I[Ii1l1III('4')]();
liIlll1l = liIlll1l[Ii1l1III('4')]();
let IiI1lI1l = I1IlIIIi;
let ilIl1i1i = /group-title="(.*?)"/;
if (ilIl1i1i[Ii1l1III('17')](lllli1iI)) {
IiI1lI1l = lllli1iI[Ii1l1III('18')](ilIl1i1i)[0x1];
}
if (!iI1iiIii[IiI1lI1l]) {
iI1iiIii[IiI1lI1l] = [];
}
iI1iiIii[IiI1lI1l][Ii1l1III('a')](il1Ili1I + '\x2c' + liIlll1l);
}
let ll11III1 = '';
for (const li1Ili in iI1iiIii) {
ll11III1 += li1Ili + '\x0a';
let IlIil1ll = iI1iiIii[li1Ili];
for (const li1iI11 of IlIil1ll) {
ll11III1 += li1iI11 + '\x0a';
}
}
return ll11III1;
}
function parseFm(IliiIl1I) {
let lliiI1i1 = '';
let Iii1ll = JSON[Ii1l1III('e')](IliiIl1I);
for (const i1lIlli1 of Iii1ll) {
let I111Il1l = i1lIlli1[Ii1l1III('12')];
let ilI11li = i1lIlli1[Ii1l1III('19')];
lliiI1i1 += I111Il1l + Ii1l1III('1a');
for (const iiilI1iI of ilI11li) {
let I11111l1 = iiilI1iI[Ii1l1III('12')];
let IlI1l1I1 = iiilI1iI[Ii1l1III('1b')];
for (const l1II1lll of IlI1l1I1) {
lliiI1i1 += I11111l1 + '\x2c' + l1II1lll + '\x0a';
}
}
}
return lliiI1i1;
}
function parseLu(iIliI1lI) {
let IIlilI1i = '';
let I11ilI1i = JSON[Ii1l1III('e')](iIliI1lI)[Ii1l1III('1c')];
for (const i1Ii1l1 of I11ilI1i[Ii1l1III('1d')]) {
let I11111l = i1Ii1l1[Ii1l1III('1e')];
let IiIiii1l = i1Ii1l1[Ii1l1III('1f')];
IIlilI1i += I11111l + Ii1l1III('1a');
for (const l1111lI of IiIiii1l) {
let lIlI1iI = l1111lI[Ii1l1III('12')];
let ll11i1II = l1111lI[Ii1l1III('1b')];
for (const Iliilii of ll11i1II) {
IIlilI1i += lIlI1iI + Ii1l1III('20') + Iliilii[Ii1l1III('21')] + '\x2c' + Iliilii[Ii1l1III('13')] + '\x0a';
}
}
}
return IIlilI1i;
}
function getCateData(IliI1i) {
let iI1I1I1I = picUrl;
if (IliI1i[Ii1l1III('1')](Ii1l1III('5')) > 0x0) {
iI1I1I1I = IliI1i[Ii1l1III('3')](Ii1l1III('5'))[0x1][Ii1l1III('4')]();
if (iI1I1I1I[Ii1l1III('1')](Ii1l1III('6')) < 0x0 && webPaths[IliI1i]) {
iI1I1I1I = webPaths[IliI1i] + iI1I1I1I;
}
IliI1i = IliI1i[Ii1l1III('3')](Ii1l1III('5'))[0x0][Ii1l1III('4')]();
}
console[Ii1l1III('7')](Ii1l1III('22') + iI1I1I1I);
let ll1iIiiI = IliI1i[Ii1l1III('3')]('\x24')[0x1];
let i1I1l1i = IliI1i[Ii1l1III('3')]('\x24')[0x0];
if (!cates[IliI1i]) {
cates[IliI1i] = [];
let iIl11Iii = headers;
if (ll1iIiiI[Ii1l1III('1')]('\x7c') > 0x0) {
let ii111I1I = decodeURIComponent(ll1iIiiI[Ii1l1III('3')]('\x7c')[0x1]);
ll1iIiiI = ll1iIiiI[Ii1l1III('3')]('\x7c')[0x0];
for (const II1Ii1l of ii111I1I[Ii1l1III('3')]('\x26')) {
if (II1Ii1l[Ii1l1III('1')]('\x3d') > 0x0) {
let lI1lliii = II1Ii1l[Ii1l1III('3')]('\x3d')[0x0];
let I11Iii1i = II1Ii1l[Ii1l1III('3')]('\x3d')[0x1];
iIl11Iii[lI1lliii] = I11Iii1i;
}
}
}
let I111lilI = req(ll1iIiiI, {
'\x6d\x65\x74\x68\x6f\x64': Ii1l1III('d'),
'\x68\x65\x61\x64\x65\x72\x73': iIl11Iii
});
I111lilI = I111lilI[Ii1l1III('f')][Ii1l1III('4')]();
if (I111lilI[Ii1l1III('1')](Ii1l1III('23')) >= 0x0) {
I111lilI = parseM3u(I111lilI, i1I1l1i);
} else if (I111lilI[Ii1l1III('1')](Ii1l1III('24')) > 0x0 && I111lilI[Ii1l1III('1')](Ii1l1III('25')) > 0x0) {
I111lilI = parseFm(I111lilI);
} else if (I111lilI[Ii1l1III('1')](Ii1l1III('26')) > 0x0 && I111lilI[Ii1l1III('1')](Ii1l1III('25')) > 0x0) {
I111lilI = parseLu(I111lilI);
}
let li1IiiII = (i1I1l1i + '\x0a' + I111lilI[Ii1l1III('9')]('\x0d', ''))[Ii1l1III('3')]('\x0a');
let lli11iI = i1I1l1i;
let IiiIIiIi = null;
let iiiI1l = '';
for (let i1ii1IIl = 0x0; i1ii1IIl < li1IiiII[Ii1l1III('27')]; i1ii1IIl++) {
let lIliIii = li1IiiII[i1ii1IIl][Ii1l1III('9')](/\s+/g, '');
if (lIliIii != '' && lIliIii[Ii1l1III('1')](Ii1l1III('6')) < 0x0 && (lIliIii[Ii1l1III('1')]('\x2c') < 0x0 || lIliIii[Ii1l1III('1')](Ii1l1III('28')) > 0x0)) {
if (iiiI1l != '') {
let ilIIIl = iI1I1I1I[Ii1l1III('9')](Ii1l1III('29'), encodeURIComponent(lli11iI))[Ii1l1III('9')](Ii1l1III('2a'), encodeURIComponent(i1I1l1i));
let ilI1ilI = ilIIIl[Ii1l1III('1')]('\x3c');
let iili1I1i = ilIIIl[Ii1l1III('11')]('\x3e');
if (ilI1ilI > -0x1 && iili1I1i > ilI1ilI) {
let I11Ilili = ilIIIl[Ii1l1III('10')](ilI1ilI, iili1I1i + 0x1);
let I1liliII = new RegExp(I11Ilili[Ii1l1III('9')](/<|>/g, ''));
let lii11liI = lli11iI[Ii1l1III('9')](I1liliII, function(Ili1lIi1, iiliII1l) {
return iiliII1l;
});
ilIIIl = ilIIIl[Ii1l1III('9')](I11Ilili, lii11liI);
console[Ii1l1III('7')](lli11iI + '\x2c\x20' + ilIIIl);
}
let IiiIIiIi = {
'vod_id': IliI1i + Ii1l1III('2') + cates[IliI1i][Ii1l1III('27')],
'vod_name': lli11iI,
'vod_pic': ilIIIl,
'vod_remarks': '',
'type_name': Ii1l1III('2b'),
'vod_year': '',
'vod_area': '',
'vod_actor': '',
'vod_director': '',
'vod_content': '',
'vod_play_from': i1I1l1i,
'vod_play_url': iiiI1l
};
cates[IliI1i][Ii1l1III('a')](IiiIIiIi);
}
lli11iI = lIliIii[Ii1l1III('3')]('\x2c')[0x0][Ii1l1III('4')]();
iiiI1l = '';
} else if (lIliIii[Ii1l1III('1')]('\x2c') > 0x0 && /http|rtmp|rtsp|rsp/ [Ii1l1III('17')](lIliIii)) {
let l1iiI1ii = lIliIii[Ii1l1III('3')]('\x2c');
if (iiiI1l != '') {
iiiI1l += '\x23';
}
iiiI1l += l1iiI1ii[0x0][Ii1l1III('4')]() + '\x24' + l1iiI1ii[0x1][Ii1l1III('4')]();
}
}
if (iiiI1l != '') {
let II1Iliil = iI1I1I1I[Ii1l1III('9')](Ii1l1III('29'), encodeURIComponent(lli11iI))[Ii1l1III('9')](Ii1l1III('2a'), encodeURIComponent(i1I1l1i));
let ilI1ilI = II1Iliil[Ii1l1III('1')]('\x3c');
let iili1I1i = II1Iliil[Ii1l1III('11')]('\x3e');
if (ilI1ilI > -0x1 && iili1I1i > ilI1ilI) {
let I11Ilili = II1Iliil[Ii1l1III('10')](ilI1ilI, iili1I1i + 0x1);
let I1liliII = new RegExp(I11Ilili[Ii1l1III('9')](/<|>/g, ''));
let lii11liI = I1liliII[Ii1l1III('17')](lli11iI) ? lli11iI[Ii1l1III('18')](I1liliII)[0x1] : Ii1l1III('2c');
II1Iliil = II1Iliil[Ii1l1III('9')](I11Ilili, lii11liI);
}
let IiiIIiIi = {
'vod_id': IliI1i + Ii1l1III('2') + cates[IliI1i][Ii1l1III('27')],
'vod_name': lli11iI,
'vod_pic': II1Iliil,
'vod_remarks': '',
'type_name': Ii1l1III('2b'),
'vod_year': '',
'vod_area': '',
'vod_actor': '',
'vod_director': '',
'vod_content': '',
'vod_play_from': i1I1l1i,
'vod_play_url': iiiI1l
};
cates[IliI1i][Ii1l1III('a')](IiiIIiIi);
}
}
return cates[IliI1i];
}
function homeVod(liIIlIl1) {
let iIl1IIii = getCateData(classes[0x0][Ii1l1III('2d')]);
let I1l1iil = JSON[Ii1l1III('15')]({
'list': iIl1IIii
});
return I1l1iil;
}
function category(I1l1i1Ii, l1IiiIli, IIi1Illi, lilIliIl) {
let IIi1i1ll = [];
if (l1IiiIli == 0x1) {
IIi1i1ll = getCateData(I1l1i1Ii);
}
let iIiiIi1i = JSON[Ii1l1III('15')]({
'list': IIi1i1ll
});
return iIiiIi1i;
}
function detail(lIl11iii) {
let I1IIIil = lIl11iii[Ii1l1III('3')](Ii1l1III('2'));
let liiiil1i = I1IIIil[0x0];
let l1l111II = liiiil1i[Ii1l1III('3')]('\x24')[0x0];
let Il1li11i = parseInt(I1IIIil[0x1]);
let Iill11Ii = getCateData(liiiil1i)[Il1li11i];
console[Ii1l1III('7')](JSON[Ii1l1III('15')](Iill11Ii));
if (l1l111II[Ii1l1III('1')]('\x21\x21') >= 0x0) {
l1l111II = l1l111II[Ii1l1III('9')]('\x21\x21', '');
const ii1l1iil = Iill11Ii[Ii1l1III('2e')][Ii1l1III('3')]('\x23');
console[Ii1l1III('7')](JSON[Ii1l1III('15')](ii1l1iil));
let i1Ili1I = {};
let IIIllli1 = {};
for (const i1IiIlIl of ii1l1iil) {
let Ill1iii1 = i1IiIlIl[Ii1l1III('3')]('\x24')[0x0];
let IIiIII11 = l1l111II;
if (Ill1iii1[Ii1l1III('1')](Ii1l1III('20')) > 0x0) {
IIiIII11 = Ill1iii1[Ii1l1III('3')](Ii1l1III('20'))[0x1];
Ill1iii1 = Ill1iii1[Ii1l1III('3')](Ii1l1III('20'))[0x0];
}
if (!i1Ili1I[Ii1l1III('2f')](Ill1iii1)) {
i1Ili1I[Ill1iii1] = 0x1;
} else {
i1Ili1I[Ill1iii1]++;
}
IIiIII11 = l1l111II + (i1Ili1I[Ill1iii1] > 0x1 ? '\x20' + i1Ili1I[Ill1iii1] : '');
if (!IIIllli1[Ii1l1III('2f')](IIiIII11)) {
IIIllli1[IIiIII11] = [];
}
IIIllli1[IIiIII11][Ii1l1III('a')](Ill1iii1 + '\x24' + i1IiIlIl[Ii1l1III('3')]('\x24')[0x1]);
}
let III1i1ii = [];
let iii1lIIi = [];
for (let iliI1I1i in IIIllli1) {
III1i1ii[Ii1l1III('a')](iliI1I1i);
iii1lIIi[Ii1l1III('a')](IIIllli1[iliI1I1i][Ii1l1III('30')]('\x23'));
}
Iill11Ii[Ii1l1III('31')] = III1i1ii[Ii1l1III('30')](Ii1l1III('2'));
Iill11Ii[Ii1l1III('2e')] = iii1lIIi[Ii1l1III('30')](Ii1l1III('2'));
}
return JSON[Ii1l1III('15')]({
'list': [Iill11Ii]
});
}
function play(l1llIIii, illiiIII, lIIIiIiI) {
return JSON[Ii1l1III('15')]({
'parse': 0x0,
'url': illiiIII
});
}
function search(I1lll, lI1iiIII) {
return null;
}
__JS_SPIDER__ = {
'\x69\x6e\x69\x74': init,
'\x68\x6f\x6d\x65': home,
'\x68\x6f\x6d\x65\x56\x6f\x64': homeVod,
'\x63\x61\x74\x65\x67\x6f\x72\x79': category,
'\x64\x65\x74\x61\x69\x6c': detail,
'\x70\x6c\x61\x79': play,
'\x73\x65\x61\x72\x63\x68': search
};;
il = 'jsjiami.com.v6';
+1
View File
@@ -0,0 +1 @@
LyoqCiAqIOW8uueDiOaOqOiNkOmdmeaAgeWIhuexu+OAguWPr+S7peWKoOW/q+mAn+W6piEhIQogKiDkuI3lu7rorq46CiAqIOS8oOWPgiA/dHlwZT11cmwmcGFyYW1zPS4uL2pzb24v6YeH6ZuGLmpzb24KICog5bu66K6u77yaCiAqIOS8oOWPgiA/dHlwZT11cmwmcGFyYW1zPS4uL2pzb24v6YeH6ZuG6Z2Z5oCBLmpzb24kMQogKiDkvKDlj4IgP3R5cGU9dXJsJnBhcmFtcz0uLi9qc29uL+mHh+mbhlt6eV3pnZnmgIEuanNvbiQxCiAqIOS8oOWPgiA/dHlwZT11cmwmcGFyYW1zPS4uL2pzb24v6YeH6ZuGW+Wvhl3pnZnmgIEuanNvbiQxCiAqIGhpcHktc2VydmVy5pSv5oyBQOaUueWQjeavlOWmgjoKICog5Lyg5Y+CID90eXBlPXVybCZwYXJhbXM9Li4vanNvbi/ph4fpm4bpnZnmgIEuanNvbiQxQOmHh+eOi+mBk+mVv1vlkIhdCiAqIOS8oOWPgiA/dHlwZT11cmwmcGFyYW1zPS4uL2pzb24v6YeH6ZuGW3p5XemdmeaAgS5qc29uJDFA6YeH546Lenlb5a+GXQogKiDkvKDlj4IgP3R5cGU9dXJsJnBhcmFtcz0uLi9qc29uL+mHh+mbhlvlr4Zd6Z2Z5oCBLmpzb25A6YeH546L5oiQ5Lq6W+Wvhl0KICogW3sibmFtZSI6IuaatOmjjui1hOa6kCIsInVybCI6Imh0dHBzOi8vYmZ6eWFwaS5jb20iLCJwYXJzZV91cmwiOiIifSx7Im5hbWUiOiLpo57liIDotYTmupAiLCJ1cmwiOiJodHRwOi8vd3d3LmZlaWRhb3p5LmNvbSIsInBhcnNlX3VybCI6IiJ9LHsibmFtZSI6Ium7keacqOiAs+i1hOa6kCIsInVybCI6Imh0dHBzOi8vd3d3LmhlaW11ZXIudHYiLCJwYXJzZV91cmwiOiIifV0KICovCmdsb2JhbFRoaXMuZ2V0UmFuZG9tSXRlbSA9IGZ1bmN0aW9uIChpdGVtcykgey8v5LuO5YiX6KGo6ZqP5py65Y+W5Ye65LiA5Liq5YWD57SgCiAgICByZXR1cm4gaXRlbXNbTWF0aC5yYW5kb20oKSAqIGl0ZW1zLmxlbmd0aCB8IDBdOwp9CnZhciBydWxlID0gewogICAgdGl0bGU6ICfph4fpm4bkuYvnjotb5ZCIXScsCiAgICBhdXRob3I6ICfpgZPplb8nLAogICAgdmVyc2lvbjogJzIwMjQwNzA2IGJldGExNycsCiAgICB1cGRhdGVfaW5mbzogYAoyMDI0MDcwNjoKMS7pnZnmgIFqc29u5pWw5o2u5pSv5oyBY2F0ZV9leGNsdWRlc+WIhuexu+WQjeensOWIl+ihqOi/h+a7pOaXoOaVsOaNruWIhuexuwoyLuabtOaWsOmHh+mbhuWIhuexu+eUn+aIkOWZqOWinuWKoOi/h+a7pOetm+mAieaooeW8jwoyMDI0MDcwNToKMS7mlK/mjIHkvKDlj4Jqc29u5ZCO6Z2i5aKe5YqgJDEg6L+Z5qC355qE6aKd5aSW5qCH6K+G77yM55So5LqO5pCc57Si57uT5p6c57K+5YeG5Yy56YWNCjIu5pSv5oyB5Lyg5Y+CanNvbuWQjumdouWinuWKoCQxJDEg6L+Z5qC355qE6aKd5aSW5qCH6K+G77yM55So5LqO5by65Yi26I635Y+W5pCc57Si5Zu+54mH44CCJDEk5LiN5pi+56S65Zu+54mH44CC6buY6K6k5piv5pCc57Si5by65Yi25pyJ5Zu+54mH55qEW+W3suWunueOsOivpuaDhemhteivt+axguS9v+eUqOaJuemHj10KMy7kv67lpI3kuoznuqfmlbDmja7ml6Dluo/ljLnphY3mkJzntKLliJfooajlm77niYfnmoTpl67popgKNC7kv67mlLnmkJzntKLnsr7lh4blkozlm77niYfmmL7npLrpop3lpJblj4LmlbDpl7TpmpTnrKbku44j5Y+Y5Li6JAoyMDI0MDcwMzoKMS7ph4fpm4Zqc29u5pSv5oyBInNlYXJjaGFibGUiOiAwLOeUqOS6juaQnOe0ouaXtuaOkumZpOi/meS4qua6kAoyMDI0MDYwNDoKMS7pppbpobXmjqjojZDlj5bmtojnoazmjqfnrYnlvoXjgILlop7liqDpmo/mnLrmjqjojZDlip/og73jgIIKMi7pppbpobXmjqjojZDmlrDlop7mm7TmlrDml6Xlv5fmn6XnnIvlip/og70K44CQ54m55Yir6K+05piO44CR55uu5YmN5Y+q5pSv5oyB5qCH5YeGanNvbuagvOW8j+eahOmHh+mbhuermSjotYTmupDnq5nkuIDoiKzpg73mj5Dkvpt4bWzlkoxqc29u5Lik56eN5o6l5Y+j77yM55uu5YmN5rKh5pyJ5pSv5oyBeG1s55qE5oOz5rOV77yM5rKh5LuA5LmI5b+F6KaBKQrmnInkupvotYTmupDnq5nnmoRqc29u5o6l5Y+j5LiN5piv5qCH5YeG55qEL2FwaS5waHAvcHJvdmlkZS92b2QvLOmcgOimgeiHquW3seWcqOmHh+mbhumdmeaAgS5qc29u5Lit57yW6L6R5a+55bqU55qEYXBp5bGe5oCn5aGr5YaZ5q+U5aaCOi9hcGkucGhwL3Byb3ZpZGUvdm9kL2F0L2pzb24vCuacieS6m+i1hOa6kOermeeahOmHh+mbhuaVsOaNruaYr+WKoOWvhuWQjueahOWIh+eJh+eJh+aute+8jOWPr+iDvemcgOimgemHh+mbhuermeeJueWumueahOino+aekOaOpeWPo++8jOmcgOimgeiHquW3see8lui+kWpzb27ph4znmoRwYXJzZV91cmzlsZ7mgKcK6LWE5rqQ56uZ6YOo5YiG5aSn5YiG57G75LiL5peg5pWw5o2u5b6I5q2j5bi477yM5Y+v5Lul6Ieq6KGM57yW6L6RanNvbumHjGNhdGVfZXhjbHVkZeWxnuaAp+aOkumZpOaOieiHquW3sea1i+ivlei/h+aXoOaVsOaNrueahOWIhuexuyjlsI/nqIvluo/ml6Dms5Xoh6rliqjor4bliKvvvIzlj6rog73kurrlt6XmtYvlpb3lk6rkupvliIbnsbvml6DmlbDmja4pCmAudHJpbSgpLAogICAgaG9zdDogJycsCiAgICBob21lVGlkOiAnJywgLy8g6aaW6aG15o6o6I2Q44CC5LiA6Iis5aGr5YaZ56ys5LiA5Liq6LWE5rqQ56uZ55qE5oOz6KaB55qE5o6o6I2Q5YiG57G755qEaWQu5Y+v5Lul56m6CiAgICBob21lVXJsOiAnL2FwaS5waHAvcHJvdmlkZS92b2QvP2FjPWRldGFpbCZ0PXt7cnVsZS5ob21lVGlkfX0nLAogICAgZGV0YWlsVXJsOiAnL2FwaS5waHAvcHJvdmlkZS92b2QvP2FjPWRldGFpbCZpZHM9ZnlpZCcsCiAgICBzZWFyY2hVcmw6ICcvYXBpLnBocC9wcm92aWRlL3ZvZC8/d2Q9KiomcGc9I1RydWVQYWdlIyNwYWdlPWZ5cGFnZScsCiAgICBjbGFzc1VybDogJy9hcGkucGhwL3Byb3ZpZGUvdm9kLycsCiAgICB1cmw6ICcvYXBpLnBocC9wcm92aWRlL3ZvZC8/YWM9ZGV0YWlsJnBnPWZ5cGFnZSZ0PWZ5ZmlsdGVyJywKICAgIGZpbHRlcl91cmw6ICd7e2ZsLuexu+Wei319JywKICAgIGhlYWRlcnM6IHsnVXNlci1BZ2VudCc6ICdNT0JJTEVfVUEnfSwKICAgIHRpbWVvdXQ6IDUwMDAsIC8vIGNsYXNzX25hbWU6ICfnlLXlvbEm55S16KeG5YmnJue7vOiJuibliqjmvKsnLAogICAgbGltaXQ6IDIwLAogICAgc2VhcmNoX2xpbWl0OiA1LCAvLyDmkJzntKLpmZDliLblj5bliY015Liq77yM5Y+v5Lul5rOo6YeK5o6J77yM5bCx5LiN6ZmQ5Yi25pCc57SiCiAgICBzZWFyY2hhYmxlOiAxLC8v5piv5ZCm5ZCv55So5YWo5bGA5pCc57SiLAogICAgcXVpY2tTZWFyY2g6IDAsLy/mmK/lkKblkK/nlKjlv6vpgJ/mkJzntKIsCiAgICBmaWx0ZXJhYmxlOiAxLC8v5piv5ZCm5ZCv55So5YiG57G7562b6YCJLAogICAgcGxheV9wYXJzZTogdHJ1ZSwKICAgIHBhcnNlX3VybDogJycsIC8vIOi/meS4quWPguaVsOaaguaXtuS4jei1t+S9nOeUqOOAguiBmuWQiOexu+eahOavj+S4qui1hOa6kOW6lOivpeacieiHquW3seeLrOeri+eahOino+aekOWPo+OAguWNleeLrOmFjee9ruWcqOmHh+mbhi5qc29u6YeM55qEcGFyc2VfdXJs5pyJ5pWICiAgICBzZWFyY2hfbWF0Y2g6IGZhbHNlLCAvLyDmkJzntKLnsr7lh4bljLnphY0KICAgIHNlYXJjaF9waWM6IHRydWUsIC8vIOaQnOe0ouW8uuWItumcgOimgeWbvueJhwogICAgLy8gcGFyYW1zOiAnaHR0cDovLzEyNy4wLjAuMTo1NzA3L2ZpbGVzL2pzb24vJUU5JTg3JTg3JUU5JTlCJTg2Lmpzb24nLAogICAgLy8gcGFyYW1zOiAnaHR0cDovLzEyNy4wLjAuMTo1NzA3L2ZpbGVzL2pzb24v6YeH6ZuG6Z2Z5oCBLmpzb24kMScsCiAgICAvLyBwYXJhbXM6ICdodHRwOi8vMTI3LjAuMC4xOjU3MDcvZmlsZXMvanNvbi/ph4fpm4Zbenld6Z2Z5oCBLmpzb24kMScsCiAgICAvLyBob3N0SnM6JGpzLnRvU3RyaW5nKCgpPT57CiAgICAvLwogICAgLy8gfSksCiAgICDpooTlpITnkIY6ICRqcy50b1N0cmluZygoKSA9PiB7CiAgICAgICAgZnVuY3Rpb24gZ2V0Q2xhc3NlcyhpdGVtKSB7CiAgICAgICAgICAgIGxldCBjbGFzc2VzID0gW107CiAgICAgICAgICAgIGlmIChpdGVtLmNsYXNzX25hbWUgJiYgaXRlbS5jbGFzc191cmwpIHsKICAgICAgICAgICAgICAgIGlmICghLyZ855S15b2xfOeUteinhuWJp3znu7zoibp85Yqo5ryrW1x1NEUwMC1cdTlGQTVdKy8udGVzdChpdGVtLmNsYXNzX25hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5jbGFzc19uYW1lID0gdW5nemlwKGl0ZW0uY2xhc3NfbmFtZSkKICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhg5LiN6K+G5Yir55qEY2xhc3NfbmFtZeWvvOiHtGd6aXDop6PnoIHlpLHotKU6JHtlfWApCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGFzc2VzCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGV0IG5hbWVzID0gaXRlbS5jbGFzc19uYW1lLnNwbGl0KCcmJyk7CiAgICAgICAgICAgICAgICBsZXQgdXJscyA9IGl0ZW0uY2xhc3NfdXJsLnNwbGl0KCcmJyk7CiAgICAgICAgICAgICAgICBsZXQgY250ID0gTWF0aC5taW4obmFtZXMubGVuZ3RoLCB1cmxzLmxlbmd0aCk7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgJ3R5cGVfaWQnOiB1cmxzW2ldLAogICAgICAgICAgICAgICAgICAgICAgICAndHlwZV9uYW1lJzogbmFtZXNbaV0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gY2xhc3NlcwogICAgICAgIH0KCiAgICAgICAgaWYgKHR5cGVvZiAoYmF0Y2hGZXRjaCkgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgLy8g5pSv5oyB5om56YeP6K+35rGC55u05o6l5pS+6aOe6Ieq5oiR44CC5pCc57Si6ZmQ5Yi25pyA5aSn57q/56iL5pWw6YePMTYKICAgICAgICAgICAgcnVsZS5zZWFyY2hfbGltaXQgPSAxNjsKICAgICAgICAgICAgbG9nKCflvZPliY3nqIvluo/mlK/mjIHmibnph4/or7fmsYJbYmF0Y2hGZXRjaF0s5pCc57Si6ZmQ5Yi25bey6K6+572u5Li6MTYnKTsKICAgICAgICB9CiAgICAgICAgbGV0IF91cmwgPSBydWxlLnBhcmFtczsKICAgICAgICBsb2coYOS8oOWFpeWPguaVsDoke191cmx9YCk7CiAgICAgICAgaWYgKF91cmwgJiYgdHlwZW9mIChfdXJsKSA9PT0gJ3N0cmluZycgJiYgL14oaHR0cHxmaWxlKS8udGVzdChfdXJsKSkgewogICAgICAgICAgICBpZiAoX3VybC5pbmNsdWRlcygnJCcpKSB7CiAgICAgICAgICAgICAgICBsZXQgX3VybF9wYXJhbXMgPSBfdXJsLnNwbGl0KCckJyk7CiAgICAgICAgICAgICAgICBfdXJsID0gX3VybF9wYXJhbXNbMF07CiAgICAgICAgICAgICAgICBydWxlLnNlYXJjaF9tYXRjaCA9ICEhKF91cmxfcGFyYW1zWzFdKTsKICAgICAgICAgICAgICAgIGlmIChfdXJsX3BhcmFtcy5sZW5ndGggPiAyKSB7IC8vIOW8uuWItuWbvueJhwogICAgICAgICAgICAgICAgICAgIHJ1bGUuc2VhcmNoX3BpYyA9ICEhKF91cmxfcGFyYW1zWzJdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QoX3VybCk7CiAgICAgICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShodG1sKTsKICAgICAgICAgICAgbGV0IF9jbGFzc2VzID0gW107CiAgICAgICAgICAgIHJ1bGUuZmlsdGVyID0ge307CiAgICAgICAgICAgIHJ1bGUuZmlsdGVyX2RlZiA9IHt9OwogICAgICAgICAgICBqc29uLmZvckVhY2goaXQgPT4gewogICAgICAgICAgICAgICAgbGV0IF9vYmogPSB7CiAgICAgICAgICAgICAgICAgICAgdHlwZV9uYW1lOiBpdC5uYW1lLAogICAgICAgICAgICAgICAgICAgIHR5cGVfaWQ6IGl0LnVybCwKICAgICAgICAgICAgICAgICAgICBwYXJzZV91cmw6IGl0LnBhcnNlX3VybCB8fCAnJywKICAgICAgICAgICAgICAgICAgICBzZWFyY2hhYmxlOiBpdC5zZWFyY2hhYmxlICE9PSAwLAogICAgICAgICAgICAgICAgICAgIGFwaTogaXQuYXBpIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIGNhdGVfZXhjbHVkZTogaXQuY2F0ZV9leGNsdWRlIHx8ICcnLAogICAgICAgICAgICAgICAgICAgIGNhdGVfZXhjbHVkZXM6IGl0LmNhdGVfZXhjbHVkZXMgfHwgW10sCiAgICAgICAgICAgICAgICAgICAgLy8gY2xhc3NfbmFtZTogaXQuY2xhc3NfbmFtZSB8fCAnJywKICAgICAgICAgICAgICAgICAgICAvLyBjbGFzc191cmw6IGl0LmNsYXNzX3VybCB8fCAnJywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBfY2xhc3Nlcy5wdXNoKF9vYmopOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBsZXQganNvbjEgPSBbXTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXQuY2xhc3NfbmFtZSAmJiBpdC5jbGFzc191cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAganNvbjEgPSBnZXRDbGFzc2VzKGl0KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBqc29uMSA9IEpTT04ucGFyc2UocmVxdWVzdCh1cmxqb2luKF9vYmoudHlwZV9pZCwgX29iai5hcGkgfHwgcnVsZS5jbGFzc1VybCkpKS5jbGFzczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKF9vYmouY2F0ZV9leGNsdWRlcyAmJiBBcnJheS5pc0FycmF5KF9vYmouY2F0ZV9leGNsdWRlcykgJiYgX29iai5jYXRlX2V4Y2x1ZGVzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAganNvbjEgPSBqc29uMS5maWx0ZXIoY2wgPT4gIV9vYmouY2F0ZV9leGNsdWRlcy5pbmNsdWRlcyhjbC50eXBlX25hbWUpKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKF9vYmouY2F0ZV9leGNsdWRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGpzb24xID0ganNvbjEuZmlsdGVyKGNsID0+ICFuZXcgUmVnRXhwKF9vYmouY2F0ZV9leGNsdWRlLCAnaScpLnRlc3QoY2wudHlwZV9uYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJ1bGUuZmlsdGVyW19vYmoudHlwZV9pZF0gPSBbewogICAgICAgICAgICAgICAgICAgICAgICAia2V5IjogIuexu+WeiyIsICJuYW1lIjogIuexu+WeiyIsICJ2YWx1ZSI6IGpzb24xLm1hcChpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7Im4iOiBpLnR5cGVfbmFtZSwgJ3YnOiBpLnR5cGVfaWR9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgfV07CiAgICAgICAgICAgICAgICAgICAgaWYgKGpzb24xLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcnVsZS5maWx0ZXJfZGVmW2l0LnVybF0gPSB7Iuexu+WeiyI6IGpzb24xWzBdLnR5cGVfaWR9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICBydWxlLmZpbHRlcltpdC51cmxdID0gW3sia2V5IjogIuexu+WeiyIsICJuYW1lIjogIuexu+WeiyIsICJ2YWx1ZSI6IFt7Im4iOiAi5YWo6YOoIiwgInYiOiAiIn1dfV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBydWxlLmNsYXNzZXMgPSBfY2xhc3NlczsKICAgICAgICB9CiAgICB9KSwKICAgIC8vIGNsYXNzX3BhcnNlOiAkanMudG9TdHJpbmcoKCkgPT4gewogICAgLy8gICAgIGxldCBfdXJsID0gcnVsZS5wYXJhbXM7CiAgICAvLyAgICAgaWYgKF91cmwgJiYgdHlwZW9mIChfdXJsKSA9PT0gJ3N0cmluZycgJiYgX3VybC5zdGFydHNXaXRoKCdodHRwJykpIHsKICAgIC8vICAgICAgICAgbGV0IGh0bWwgPSByZXF1ZXN0KF91cmwpOwogICAgLy8gICAgICAgICBsZXQganNvbiA9IEpTT04ucGFyc2UoaHRtbCk7CiAgICAvLyAgICAgICAgIGxldCBfY2xhc3NlcyA9IFtdOwogICAgLy8gICAgICAgICBob21lT2JqLmZpbHRlciA9IHt9OwogICAgLy8gICAgICAgICBydWxlLmZpbHRlcl9kZWYgPSB7fTsKICAgIC8vICAgICAgICAganNvbi5mb3JFYWNoKGl0ID0+IHsKICAgIC8vICAgICAgICAgICAgIGxldCBfb2JqID0gewogICAgLy8gICAgICAgICAgICAgICAgIHR5cGVfbmFtZTogaXQubmFtZSwKICAgIC8vICAgICAgICAgICAgICAgICB0eXBlX2lkOiBpdC51cmwsCiAgICAvLyAgICAgICAgICAgICAgICAgcGFyc2VfdXJsOiBpdC5wYXJzZV91cmwgfHwgJycsCiAgICAvLyAgICAgICAgICAgICAgICAgY2F0ZV9leGNsdWRlOiBpdC5jYXRlX2V4Y2x1ZGUgfHwgJycsCiAgICAvLyAgICAgICAgICAgICB9OwogICAgLy8gICAgICAgICAgICAgX2NsYXNzZXMucHVzaChfb2JqKTsKICAgIC8vICAgICAgICAgICAgIHRyeSB7CiAgICAvLyAgICAgICAgICAgICAgICAgbGV0IGpzb24xID0gSlNPTi5wYXJzZShyZXF1ZXN0KHVybGpvaW4oX29iai50eXBlX2lkLCBydWxlLmNsYXNzVXJsKSkpLmNsYXNzOwogICAgLy8gICAgICAgICAgICAgICAgIGlmIChfb2JqLmNhdGVfZXhjbHVkZSkgewogICAgLy8gICAgICAgICAgICAgICAgICAgICBqc29uMSA9IGpzb24xLmZpbHRlcihjbCA9PiAhbmV3IFJlZ0V4cChfb2JqLmNhdGVfZXhjbHVkZSwgJ2knKS50ZXN0KGNsLnR5cGVfbmFtZSkpOwogICAgLy8gICAgICAgICAgICAgICAgIH0KICAgIC8vICAgICAgICAgICAgICAgICBob21lT2JqLmZpbHRlcltfb2JqLnR5cGVfaWRdID0gW3sKICAgIC8vICAgICAgICAgICAgICAgICAgICAgImtleSI6ICLnsbvlnosiLCAibmFtZSI6ICLnsbvlnosiLCAidmFsdWUiOiBqc29uMS5tYXAoaSA9PiB7CiAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyJuIjogaS50eXBlX25hbWUsICd2JzogaS50eXBlX2lkfQogICAgLy8gICAgICAgICAgICAgICAgICAgICB9KQogICAgLy8gICAgICAgICAgICAgICAgIH1dOwogICAgLy8gICAgICAgICAgICAgICAgIGlmIChqc29uMS5sZW5ndGggPiAwKSB7CiAgICAvLyAgICAgICAgICAgICAgICAgICAgIHJ1bGUuZmlsdGVyX2RlZltpdC51cmxdID0geyLnsbvlnosiOiBqc29uMVswXS50eXBlX2lkfTsKICAgIC8vICAgICAgICAgICAgICAgICB9CiAgICAvLyAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAvLyAgICAgICAgICAgICAgICAgaG9tZU9iai5maWx0ZXJbaXQudXJsXSA9IFt7ImtleSI6ICLnsbvlnosiLCAibmFtZSI6ICLnsbvlnosiLCAidmFsdWUiOiBbeyJuIjogIuWFqOmDqCIsICJ2IjogIiJ9XX1dOwogICAgLy8gICAgICAgICAgICAgfQogICAgLy8gICAgICAgICB9KTsKICAgIC8vICAgICAgICAgcnVsZS5jbGFzc2VzID0gX2NsYXNzZXM7CiAgICAvLyAgICAgICAgIGlucHV0ID0gX2NsYXNzZXM7CiAgICAvLyAgICAgfQogICAgLy8gfSksCiAgICBjbGFzc19wYXJzZTogJGpzLnRvU3RyaW5nKCgpID0+IHsKICAgICAgICBpbnB1dCA9IHJ1bGUuY2xhc3NlczsKICAgIH0pLAogICAg5o6o6I2QOiAkanMudG9TdHJpbmcoKCkgPT4gewogICAgICAgIGxldCB1cGRhdGVfaW5mbyA9IFt7CiAgICAgICAgICAgIHZvZF9uYW1lOiAn5pu05paw5pel5b+XJywKICAgICAgICAgICAgdm9kX2lkOiAndXBkYXRlX2luZm8nLAogICAgICAgICAgICB2b2RfcmVtYXJrczogYOeJiOacrDoke3J1bGUudmVyc2lvbn1gLAogICAgICAgICAgICB2b2RfcGljOiAnaHR0cHM6Ly9naHByb3h5Lm5ldC9odHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vaGpkaG54L2hpcHktc2VydmVyL21hc3Rlci9hcHAvc3RhdGljL2ltZy9sb2dvLnBuZycKICAgICAgICB9XTsKICAgICAgICBWT0RTID0gW107CiAgICAgICAgaWYgKHJ1bGUuY2xhc3NlcykgewogICAgICAgICAgICBsZXQgcmFuZG9tQ2xhc3MgPSBnZXRSYW5kb21JdGVtKHJ1bGUuY2xhc3Nlcyk7CiAgICAgICAgICAgIGxldCBfdXJsID0gdXJsam9pbihyYW5kb21DbGFzcy50eXBlX2lkLCBpbnB1dCk7CiAgICAgICAgICAgIGlmIChyYW5kb21DbGFzcy5hcGkpIHsKICAgICAgICAgICAgICAgIF91cmwgPSBfdXJsLnJlcGxhY2UoJy9hcGkucGhwL3Byb3ZpZGUvdm9kLycsIHJhbmRvbUNsYXNzLmFwaSkKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgbGV0IGh0bWwgPSByZXF1ZXN0KF91cmwsIHt0aW1lb3V0OiBydWxlLnRpbWVvdXR9KTsKICAgICAgICAgICAgICAgIGxldCBqc29uID0gSlNPTi5wYXJzZShodG1sKTsKICAgICAgICAgICAgICAgIFZPRFMgPSBqc29uLmxpc3Q7CiAgICAgICAgICAgICAgICBWT0RTLmZvckVhY2goaXQgPT4gewogICAgICAgICAgICAgICAgICAgIGl0LnZvZF9pZCA9IHJhbmRvbUNsYXNzLnR5cGVfaWQgKyAnJCcgKyBpdC52b2RfaWQ7CiAgICAgICAgICAgICAgICAgICAgaXQudm9kX3JlbWFya3MgPSBpdC52b2RfcmVtYXJrcyArICd8JyArIHJhbmRvbUNsYXNzLnR5cGVfbmFtZTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgVk9EUyA9IHVwZGF0ZV9pbmZvLmNvbmNhdChWT0RTKTsKICAgIH0pLAogICAg5LiA57qnOiAkanMudG9TdHJpbmcoKCkgPT4gewogICAgICAgIFZPRFMgPSBbXTsKICAgICAgICBpZiAocnVsZS5jbGFzc2VzKSB7CiAgICAgICAgICAgIC8vIGxvZyhpbnB1dCk7CiAgICAgICAgICAgIGxldCBfdXJsID0gdXJsam9pbihNWV9DQVRFLCBpbnB1dCk7CiAgICAgICAgICAgIGxldCBjdXJyZW50X3ZvZCA9IHJ1bGUuY2xhc3Nlcy5maW5kKGl0ZW0gPT4gaXRlbS50eXBlX2lkID09PSBNWV9DQVRFKTsKICAgICAgICAgICAgaWYgKGN1cnJlbnRfdm9kICYmIGN1cnJlbnRfdm9kLmFwaSkgewogICAgICAgICAgICAgICAgX3VybCA9IF91cmwucmVwbGFjZSgnL2FwaS5waHAvcHJvdmlkZS92b2QvJywgY3VycmVudF92b2QuYXBpKQogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdChfdXJsKTsKICAgICAgICAgICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKGh0bWwpOwogICAgICAgICAgICBWT0RTID0ganNvbi5saXN0OwogICAgICAgICAgICBWT0RTLmZvckVhY2goaXQgPT4gewogICAgICAgICAgICAgICAgaXQudm9kX2lkID0gTVlfQ0FURSArICckJyArIGl0LnZvZF9pZAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9KSwKICAgIC8vIOS4gOe6pzogJ2pzb246bGlzdDt2b2RfbmFtZTt2b2RfcGljO3ZvZF9yZW1hcmtzO3ZvZF9pZDt2b2RfcGxheV9mcm9tJywKICAgIOS6jOe6pzogJGpzLnRvU3RyaW5nKCgpID0+IHsKICAgICAgICBWT0QgPSB7fTsKICAgICAgICBpZiAob3JJZCA9PT0gJ3VwZGF0ZV9pbmZvJykgewogICAgICAgICAgICBWT0QgPSB7CiAgICAgICAgICAgICAgICB2b2RfY29udGVudDogcnVsZS51cGRhdGVfaW5mby50cmltKCksCiAgICAgICAgICAgICAgICB2b2RfbmFtZTogJ+abtOaWsOaXpeW/lycsCiAgICAgICAgICAgICAgICB0eXBlX25hbWU6ICfmm7TmlrDml6Xlv5cnLAogICAgICAgICAgICAgICAgdm9kX3BpYzogJ2h0dHBzOi8vcmVzb3VyY2UtY2RuLnR1eGlhb2JlaS5jb20vdmlkZW8vRnRXaHMybWV3WF83bkV1RTUxX2s2enZnNmF3bC5wbmcnLAogICAgICAgICAgICAgICAgdm9kX3JlbWFya3M6IGDniYjmnKw6JHtydWxlLnZlcnNpb259YCwKICAgICAgICAgICAgICAgIHZvZF9wbGF5X2Zyb206ICfpgZPplb/lnKjnur8nLAogICAgICAgICAgICAgICAgLy8gdm9kX3BsYXlfdXJsOiAn5ZeF5o6i5pKt5pS+JGh0dHBzOi8vcmVzb3VyY2UtY2RuLnR1eGlhb2JlaS5jb20vdmlkZW8vMTAvOGYvMTA4ZmM5ZDFhYzNmNjlkMjlhNzM4Y2RjMDk3YzkwMTgubXA0JywKICAgICAgICAgICAgICAgIHZvZF9wbGF5X3VybDogJ+maj+acuuWwj+inhumikSRodHRwOi8vYXBpLnl1am4uY24vYXBpL3p6eGpqLnBocCcsCiAgICAgICAgICAgIH07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKHJ1bGUuY2xhc3NlcykgewogICAgICAgICAgICAgICAgbGV0IF91cmwgPSB1cmxqb2luKGZ5Y2xhc3MsIGlucHV0KTsKICAgICAgICAgICAgICAgIGxldCBjdXJyZW50X3ZvZCA9IHJ1bGUuY2xhc3Nlcy5maW5kKGl0ZW0gPT4gaXRlbS50eXBlX2lkID09PSBmeWNsYXNzKTsKICAgICAgICAgICAgICAgIGlmIChjdXJyZW50X3ZvZCAmJiBjdXJyZW50X3ZvZC5hcGkpIHsKICAgICAgICAgICAgICAgICAgICBfdXJsID0gX3VybC5yZXBsYWNlKCcvYXBpLnBocC9wcm92aWRlL3ZvZC8nLCBjdXJyZW50X3ZvZC5hcGkpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZXQgaHRtbCA9IHJlcXVlc3QoX3VybCk7CiAgICAgICAgICAgICAgICBsZXQganNvbiA9IEpTT04ucGFyc2UoaHRtbCk7CiAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IGpzb24ubGlzdDsKICAgICAgICAgICAgICAgIFZPRCA9IGRhdGFbMF07CiAgICAgICAgICAgICAgICBpZiAoY3VycmVudF92b2QgJiYgY3VycmVudF92b2QudHlwZV9uYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgVk9ELnZvZF9wbGF5X2Zyb20gPSBWT0Qudm9kX3BsYXlfZnJvbS5zcGxpdCgnJCQkJykubWFwKGl0ID0+IGN1cnJlbnRfdm9kLnR5cGVfbmFtZSArICd8JyArIGl0KS5qb2luKCckJCQnKQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSksCiAgICDmkJzntKI6ICRqcy50b1N0cmluZygoKSA9PiB7CiAgICAgICAgVk9EUyA9IFtdOwogICAgICAgIGlmIChydWxlLmNsYXNzZXMpIHsKICAgICAgICAgICAgbGV0IGNhblNlYXJjaCA9IHJ1bGUuY2xhc3Nlcy5maWx0ZXIoaXQgPT4gaXQuc2VhcmNoYWJsZSk7CiAgICAgICAgICAgIGxldCBwYWdlID0gTnVtYmVyKE1ZX1BBR0UpOwogICAgICAgICAgICBwYWdlID0gKE1ZX1BBR0UgLSAxKSAlIE1hdGguY2VpbChjYW5TZWFyY2gubGVuZ3RoIC8gcnVsZS5zZWFyY2hfbGltaXQpICsgMTsKICAgICAgICAgICAgbGV0IHRydWVQYWdlID0gTWF0aC5jZWlsKE1ZX1BBR0UgLyBNYXRoLmNlaWwoY2FuU2VhcmNoLmxlbmd0aCAvIHJ1bGUuc2VhcmNoX2xpbWl0KSk7CiAgICAgICAgICAgIGlmIChydWxlLnNlYXJjaF9saW1pdCkgewogICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gKHBhZ2UgLSAxKSAqIHJ1bGUuc2VhcmNoX2xpbWl0OwogICAgICAgICAgICAgICAgbGV0IGVuZCA9IHBhZ2UgKiBydWxlLnNlYXJjaF9saW1pdDsKICAgICAgICAgICAgICAgIGxldCB0MSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpOwogICAgICAgICAgICAgICAgbGV0IHNlYXJjaE1vZGUgPSB0eXBlb2YgKGJhdGNoRmV0Y2gpID09PSAnZnVuY3Rpb24nID8gJ+aJuemHjycgOiAn5Y2V5LiqJzsKICAgICAgICAgICAgICAgIGxvZygnc3RhcnQ6JyArIHN0YXJ0KTsKICAgICAgICAgICAgICAgIGxvZygnZW5kOicgKyBlbmQpOwogICAgICAgICAgICAgICAgbG9nKCfmkJzntKLmqKHlvI86JyArIHNlYXJjaE1vZGUpOwogICAgICAgICAgICAgICAgbG9nKCfnsr7lh4bmkJzntKI6JyArIHJ1bGUuc2VhcmNoX21hdGNoKTsKICAgICAgICAgICAgICAgIC8vIGxvZygndDE6JyArIHQxKTsKICAgICAgICAgICAgICAgIGlmIChzdGFydCA8IGNhblNlYXJjaC5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgc2VhcmNoX2NsYXNzZXMgPSBjYW5TZWFyY2guc2xpY2Uoc3RhcnQsIGVuZCk7CiAgICAgICAgICAgICAgICAgICAgbGV0IHVybHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBzZWFyY2hfY2xhc3Nlcy5mb3JFYWNoKGl0ID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IF91cmwgPSB1cmxqb2luKGl0LnR5cGVfaWQsIGlucHV0KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0LmFwaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgX3VybCA9IF91cmwucmVwbGFjZSgnL2FwaS5waHAvcHJvdmlkZS92b2QvJywgaXQuYXBpKQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIF91cmwgPSBfdXJsLnJlcGxhY2UoIiNUcnVlUGFnZSMiLCAiIiArIHRydWVQYWdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgdXJscy5wdXNoKF91cmwpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHRzX2xpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0cyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKGJhdGNoRmV0Y2gpID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXFVcmxzID0gdXJscy5tYXAoaXQgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IGl0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHt0aW1lb3V0OiBydWxlLnRpbWVvdXR9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmV0cyA9IGJhdGNoRmV0Y2gocmVxVXJscyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkZXRhaWxVcmxzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkZXRhaWxVcmxDb3VudCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHMuZm9yRWFjaCgocmV0LCBpZHgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpdCA9IHNlYXJjaF9jbGFzc2VzW2lkeF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGpzb24gPSBKU09OLnBhcnNlKHJldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0ganNvbi5saXN0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZvckVhY2goaSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnNpdGVfbmFtZSA9IGl0LnR5cGVfbmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkudm9kX2lkID0gaXQudHlwZV9pZCArICckJyArIGkudm9kX2lkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS52b2RfcmVtYXJrcyA9IGkudm9kX3JlbWFya3MgKyAnfCcgKyBpdC50eXBlX25hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZS5zZWFyY2hfbWF0Y2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLmZpbHRlcihpdGVtID0+IGl0ZW0udm9kX25hbWUgJiYgKG5ldyBSZWdFeHAoS0VZLCAnaScpKS50ZXN0KGl0ZW0udm9kX25hbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLnNlYXJjaF9waWMgJiYgIWRhdGFbMF0udm9kX3BpYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhg5b2T5YmN5pCc57Si56uZ54K544CQJHtpdC50eXBlX25hbWV944CR5rKh5Zu+54mHLOWwneivleiuv+mXruS6jOe6p+WOu+iOt+WPluWbvueJh2ApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkZXRhaWxVcmwgPSB1cmxzW2lkeF0uc3BsaXQoJ3dkPScpWzBdICsgJ2FjPWRldGFpbCZpZHM9JyArIGRhdGEubWFwKGsgPT4gay52b2RfaWQuc3BsaXQoJyQnKVsxXSkuam9pbignLCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbFVybHMucHVzaChkZXRhaWxVcmwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNfbGlzdC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX3BpYzogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbFVybENvdW50OiBkZXRhaWxVcmxDb3VudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbFVybENvdW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgbGV0IGRldGFpbEpzb24gPSBKU09OLnBhcnNlKHJlcXVlc3QoZGV0YWlsVXJsKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGRhdGEuZm9yRWFjaCgoZCwgX3NlcSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgbG9nKCfkuoznuqfmlbDmja7liJfooajlhYPntKDmlbA6JyArIGRldGFpbEpzb24ubGlzdC5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgbGV0IGRldGFpbFZvZFBpYyA9IGRldGFpbEpzb24ubGlzdFtfc2VxXS52b2RfcGljOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgaWYgKGRldGFpbFZvZFBpYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZCwge3ZvZF9waWM6IGRldGFpbFZvZFBpY30pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGxvZyhg5by65Yi26I635Y+W572R56uZJHtpdC50eXBlX2lkfeeahOaQnOe0ouWbvueJh+Wksei0pToke2UubWVzc2FnZX1gKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNfbGlzdC5wdXNoKHtkYXRhOiBkYXRhLCBoYXNfcGljOiB0cnVlfSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzdWx0cyA9IHJlc3VsdHMuY29uY2F0KGRhdGEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coYOivt+axgjoke2l0LnR5cGVfaWR95Y+R55Sf6ZSZ6K+vOiR7ZS5tZXNzYWdlfWApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8g5p6E6YCg6K+35rGC5LqM57qn55qEYmF0Y2hGZXRjaOWIl+ihqAogICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVxVXJsczIgPSBkZXRhaWxVcmxzLm1hcChpdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogaXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczoge3RpbWVvdXQ6IHJ1bGUudGltZW91dH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXRzMiA9IGJhdGNoRmV0Y2gocmVxVXJsczIpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHJlc3VsdHNfbGlzdC5sZW5ndGg7IGsrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdF9kYXRhID0gcmVzdWx0c19saXN0W2tdLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdHNfbGlzdFtrXS5oYXNfcGljKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRldGFpbEpzb24gPSBKU09OLnBhcnNlKHJldHMyW3Jlc3VsdHNfbGlzdFtrXS5kZXRhaWxVcmxDb3VudF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coJ+S6jOe6p+aVsOaNruWIl+ihqOWFg+e0oOaVsDonICsgZGV0YWlsSnNvbi5saXN0Lmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdF9kYXRhLmZvckVhY2goKGQsIF9zZXEpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxldCBkZXRhaWxWb2RQaWMgPSBkZXRhaWxKc29uLmxpc3RbX3NlcV0udm9kX3BpYzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvZyhkZXRhaWxKc29uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkZXRhaWxWb2RQaWMgPSBkZXRhaWxKc29uLmxpc3QuZmluZCh2b2QgPT4gdm9kLnZvZF9pZC50b1N0cmluZygpID09PSBkLnZvZF9pZC5zcGxpdCgnJCcpWzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXRhaWxWb2RQaWMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGQsIHt2b2RfcGljOiBkZXRhaWxWb2RQaWMudm9kX3BpY30pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhg5by65Yi26I635Y+W572R56uZJHtyZXN1bHRfZGF0YVswXS5zaXRlX25hbWV955qE5pCc57Si5Zu+54mH5aSx6LSlOiR7ZS5tZXNzYWdlfWApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmNvbmNhdChyZXN1bHRfZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXJscy5mb3JFYWNoKChfdXJsLCBpZHgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpdCA9IHNlYXJjaF9jbGFzc2VzW2lkeF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdChfdXJsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQganNvbiA9IEpTT04ucGFyc2UoaHRtbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBqc29uLmxpc3Q7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5mb3JFYWNoKGkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLnZvZF9pZCA9IGl0LnR5cGVfaWQgKyAnJCcgKyBpLnZvZF9pZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaS52b2RfcmVtYXJrcyA9IGkudm9kX3JlbWFya3MgKyAnfCcgKyBpdC50eXBlX25hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUuc2VhcmNoX21hdGNoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLmZpbHRlcihpdGVtID0+IGl0ZW0udm9kX25hbWUgJiYgKG5ldyBSZWdFeHAoS0VZLCAnaScpKS50ZXN0KGl0ZW0udm9kX25hbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLnNlYXJjaF9waWMgJiYgIWRhdGFbMF0udm9kX3BpYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKGDlvZPliY3mkJzntKLnq5nngrnjgJAke2l0LnR5cGVfbmFtZX3jgJHmsqHlm77niYcs5bCd6K+V6K6/6Zeu5LqM57qn5Y676I635Y+W5Zu+54mHYCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGV0YWlsVXJsID0gdXJsc1tpZHhdLnNwbGl0KCd3ZD0nKVswXSArICdhYz1kZXRhaWwmaWRzPScgKyBkYXRhLm1hcChrID0+IGsudm9kX2lkLnNwbGl0KCckJylbMV0pLmpvaW4oJywnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRldGFpbEpzb24gPSBKU09OLnBhcnNlKHJlcXVlc3QoZGV0YWlsVXJsKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCfkuoznuqfmlbDmja7liJfooajlhYPntKDmlbA6JyArIGRldGFpbEpzb24ubGlzdC5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZm9yRWFjaCgoZCwgX3NlcSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsZXQgZGV0YWlsVm9kUGljID0gZGV0YWlsSnNvbi5saXN0W19zZXFdLnZvZF9waWM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkZXRhaWxWb2RQaWMgPSBkZXRhaWxKc29uLmxpc3QuZmluZCh2b2QgPT4gdm9kLnZvZF9pZC50b1N0cmluZygpID09PSBkLnZvZF9pZC5zcGxpdCgnJCcpWzFdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRldGFpbFZvZFBpYykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihkLCB7dm9kX3BpYzogZGV0YWlsVm9kUGljLnZvZF9waWN9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyhg5by65Yi26I635Y+W572R56uZJHtpdC50eXBlX2lkfeeahOaQnOe0ouWbvueJh+Wksei0pToke2UubWVzc2FnZX1gKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cy5jb25jYXQoZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLmNvbmNhdChkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coYOivt+axgjoke2l0LnR5cGVfaWR95Y+R55Sf6ZSZ6K+vOiR7ZS5tZXNzYWdlfWApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgVk9EUyA9IHJlc3VsdHM7CiAgICAgICAgICAgICAgICAgICAgbGV0IHQyID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgLy8gbG9nKCd0MjonK3QyKTsKICAgICAgICAgICAgICAgICAgICBsb2coYCR7c2VhcmNoTW9kZX3mkJzntKI6JHt1cmxzLmxlbmd0aH3kuKrnq5nogJfml7Y6JHsoTnVtYmVyKHQyKSAtIE51bWJlcih0MSkpfW1zYCkKCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9KSwKICAgIGxhenk6ICRqcy50b1N0cmluZygoKSA9PiB7CiAgICAgICAgLy8gbGF6eeaDs+WKnuazleeUqOWvueW6lOeahHBhcnNlX3VybO+8jOS9huaYr+aciemavuW6pu+8jOaaguacquWunueOsAogICAgICAgIGxldCBwYXJzZV91cmwgPSAnJzsKICAgICAgICBpZiAoZmxhZyAmJiBmbGFnLmluY2x1ZGVzKCd8JykpIHsKICAgICAgICAgICAgbGV0IHR5cGVfbmFtZSA9IGZsYWcuc3BsaXQoJ3wnKVswXTsKICAgICAgICAgICAgbGV0IGN1cnJlbnRfdm9kID0gcnVsZS5jbGFzc2VzLmZpbmQoaXRlbSA9PiBpdGVtLnR5cGVfbmFtZSA9PT0gdHlwZV9uYW1lKTsKICAgICAgICAgICAgaWYgKGN1cnJlbnRfdm9kICYmIGN1cnJlbnRfdm9kLnBhcnNlX3VybCkgewogICAgICAgICAgICAgICAgcGFyc2VfdXJsID0gY3VycmVudF92b2QucGFyc2VfdXJsCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKC9cLihtM3U4fG1wNCkvLnRlc3QoaW5wdXQpKSB7CiAgICAgICAgICAgIGlucHV0ID0ge3BhcnNlOiAwLCB1cmw6IGlucHV0fQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChwYXJzZV91cmwuc3RhcnRzV2l0aCgnanNvbjonKSkgewogICAgICAgICAgICAgICAgbGV0IHB1cmwgPSBwYXJzZV91cmwucmVwbGFjZSgnanNvbjonLCAnJykgKyBpbnB1dDsKICAgICAgICAgICAgICAgIGxldCBodG1sID0gcmVxdWVzdChwdXJsKTsKICAgICAgICAgICAgICAgIGlucHV0ID0ge3BhcnNlOiAwLCB1cmw6IEpTT04ucGFyc2UoaHRtbCkudXJsfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaW5wdXQgPSBwYXJzZV91cmwgKyBpbnB1dDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0pLAp9
+18
View File
@@ -0,0 +1,18 @@
[
{
"name": "虎牙直播",
"url": "http://rihou.cc:88/json/虎牙.txt&&&https://i1.mcobj.com//uploads//20220514_627f51cdc2e2f.png?para=1920x1080"
},
{
"name": "歪歪直播",
"url": "http://rihou.cc:88/json/轮播.txt&&&https://i1.mcobj.com//uploads//20220514_627f51cdc2e2f.png?para=1920x1080"
},
{
"name": "热播电影",
"url": "http://rihou.cc:88/json/热播.m3u&&&https://i1.mcobj.com//uploads//20220514_627f51cdc2e2f.png?para=1920x1080"
},
{
"name": "电影3万",
"url": "http://rihou.cc:88/json/电影3万.txt&&&https://i1.mcobj.com//uploads//20220514_627f51cdc2e2f.png?para=1920x1080"
}
]
+99
View File
@@ -0,0 +1,99 @@
[
{
"name": "快车资源(集)",
"url": "https://caiji.kuaichezy.org/api.php/provide/vod/at/xml/",
"parse_url": "https://jiexi.kuaichezy.info/m3u8/?url=",
"cate_exclude": "",
"class_name": "H4sIAK54Z2gC/zWPWw6CMBBFd9N1+ohKNVGMiBpI+FHrAyJISHiV1bQzsAuZgl/39LY9k0En0zJh6GStWGoumF4/oH4zrOqWlwzLl5ZH5CvqlfSJ0EpgvjAk9rqoiMA6q5Kbd1yMtzC1YeKazvX7erT0dhyG6qvoLsPQXQxFQ9QFTwpsthSQf6BJDZ1uJtKYQtV3tJckVPLQzr5t5qlyw1QeaU+OG/Q/wA//h1CQctwtiHrJD0Ycn8r6AAAA",
"class_url": "6&7&8&9&10&11&12&13&14&15&16&17&18&20&21&22&23&24&25&26&27"
},
{
"name": "电影天堂(集)",
"url": "http://caiji.dyttzyapi.com",
"parse_url": "",
"cate_exclude": "",
"class_name": "H4sIAF9FWGgC/zWQTQ6CMBCFb8M5NUakLgQTBYlENkA1opYYovwUL9NO4RbSoey+92ambzrqUEpeKLKx+t9FNQ9JqKWatie19uT2Cu3dkOARkh+NTZqUU8BqjUT3smo0wdKDhY99hJoqOCdRE/TOXNRUZwxZCN8XUnwbbU2QU9XtNPVPJvkRJ1wGVYfVIIUoRyo/MvGR3szMyoQOoT1tbumXXTaLIB0jZoERRpht8I+mbRbTJkbga7OYsich2kx5Nh4gxsuNvjroO/wBPp752lcBAAA=",
"class_url": "6&7&8&9&10&11&12&13&14&15&16&20&21&22&23&24&25&26&27&28&29&30&31&32&33&34&36&37"
},
{
"name": "虎牙资源(集)",
"url": "https://www.huyaapi.com/api.php/provide/vod/",
"parse_url": "",
"cate_exclude": "",
"class_name": "H4sIAPxIZ2gC/zWOXQ6CQAyEb7Pn9Cciq4liRNRAwpOuRlTUkACynmbbrreQLfjUb6aTdigsrPJAKkFhAfohMFP0WTjje9xjeWdKz27g9sDqnOErd2SaIwUeyamA2cnoxBH5DxxP2IuSNsSeWkH1doTDAAcRb6Xqc+jvTC0d2VsOetPfw+YiwJtAwq9ag0I+YcorxLoPtJUwyf6iq94JejdW1gKWOVYfLqvXdvS0RWzquaD02no/UcDcbf0AAAA=",
"class_url": "3&4&5&6&7&9&10&11&12&13&14&15&16&17&20&23&24&25&26&27&28&29&30"
},
{
"name": "卧龙资源(集)",
"url": "https://collect.wolongzyw.com",
"parse_url": "",
"cate_exclude": "",
"class_name": "H4sIAFAdWGgC/1WR0VLCQAxF/6bfqXQsbB9omYEq2JEHKqtQ2iIC0nbxZ5pk+Qt303VG307uZnJvsjQ9gtqTGHr6+4WaHQjpUdNqUVsNwjdst446lTIlqWmyRKM9+g9McgKXxhLex3iXcJ+Q7hVHT10tWHtWXS2tx209x6+SafluZEuYS7qOLUFU4eXK2uMrpjnT8QxZYkkXFagZ+y53LhxNmz8GHPt3niv6Qa4w1lHV7+kCuAIyeZsHrsBD9S+ak4lvpuVKl58e+iEOFuxdnKDu80SZXvHqMA4g+uAjDHJKJhw6LEltmMqCYt/r2jXFAf/B6WAFs5Yx/QEG4wmPmwEAAA==",
"class_url": "5&6&7&8&9&10&11&12&13&14&15&16&17&18&22&23&24&25&26&27&30&31&32&33&37&38&39&42&43&44&45&46&48&49&51&54"
},
{
"name": "量子资源(集)",
"url": "http://cj.lziapi.com",
"parse_url": "",
"cate_exclude": "",
"class_name": "H4sIAFAdWGgC/zWR607DMAyF3ybPCbuxDom1Yms3UTEJtmWI0bSMAr1kvEzspG9B46S/8h3b8XEcvSpBFjq4Y+bvWTcfEHCmm9YEtY3B4oTtuyclU6I47Yss6XmB4ykRj6BqLOFtiDcx1QXcZ3G+UXVAsSepam49uuMWfwXR7q0PW8Iz19cHSybLQa7pxjLH6krZ5IDpmaj8gX1MdMn9XdjzbjtzkzPbeZkPIjn0FoMgCy/8NPRGXzYIN4kX1G0QztsJ1R51OKMF0BoNfzXiiyn5aEafzHxfdDhmWmR0yMgeGAsjapjeM2xXEG36QN4ljSknJhNDGyfgVKgqdHnWvUwgWpDVzn7SP/ilxw64AQAA",
"class_url": "6&7&8&9&10&11&12&13&14&15&16&20&21&22&23&24&25&26&27&28&29&30&31&32&33&34&35&36&37&38&39&40&41&42&43&44&45&46"
},
{
"name": "新浪资源(集)",
"url": "http://api.xinlangapi.com",
"parse_url": "",
"cate_exclude": "",
"api": "/xinlangapi.php/provide/vod/",
"class_name": "H4sIAFIdWGgC/0WOXQ6CMBCEb9Nz+hOR+qAYETUh4UWtikaQkEihPU27W24hXU18msk3m53BuLaqZBjXTgSWC2YXF+hyhm3nuGQob1Ztkc89Nyr1DsMSpjNyYm2b1jsI90ZyuuPil8I4glFCLEkHTO4o+gP1wPsJuqLGVQGNJnYXqJf/Ffgd12dXSncnkqrwYrozRoH/adTGTV4Ms8fAP2ziC/TQAAAA",
"class_url": "3&4&5&6&7&8&9&10&11&12&13&14&15&16&17&18&20&21&22&23&24"
},
{
"name": "非凡资源(集)",
"url": "http://cj.ffzyapi.com",
"parse_url": "",
"cate_exclude": "",
"class_name": "H4sIAFEdWGgC/zWQWw6CMBBFd8M6NUakfggmChKJ/ADViFpiiPIobqadwi6kQ/k7d153ZtShlLxQZGP1v4tqHpJQSzVtT2odk9srtHdDgkdIfjQWaVJOAas1Et3LqtEESw8WPtYRarLgnERNMHbmoqbaY8hC+L6Q4tsY1gQ5Vd1OU/9kkh+xw2VQdZgNUohypPIjEx/pzUyvTOgQ2tPmlp7sslkE6WgxC7QwwmyDN5qyWUybGIHTZjF5T0K0mfJsfECsP/cHYziM500BAAA=",
"class_url": "4&6&7&8&9&10&11&12&13&14&15&16&20&21&22&23&24&25&26&27&28&29&30&31&32&33&34&36"
},
{
"name": "索尼资源(集)",
"url": "https://suoniapi.com",
"parse_url": "",
"cate_exclude": "",
"class_name": "H4sIAFEdWGgC/1VRUU7CQBC9zZ7AW5h4C01M/PTDTyhSKESgsRaRBggUVxAsCEUoLVxmZ2d7C7e7rYlfM29m9s28t+iEkKwJOqGgJliU4DEWVkSg8cHjzyywxEOrRsD1ZDvLsL7mlarKqA2HY5bxcoeXXDVn0bzL668sslStn7CIZux8QfHUyrJ0OFOF7lSFfZAFaK8U2qiA0RySF0UV/oDvqgmfpj0zP1I+ljQFkBTtVQHUnkKLXq8V6TcF0Of8aUVHq1FUxYzenYPYAWfN4jfCkmdhfIuwz6ImweALOxUidpsspONHsBuKyA1EEEG1SaTJ0mBBJyLYSgcT7tZwuMwUsfgdO2a+k+0tjLQ58mjdEdMzdw/FWHfKvUUO2N7nJSqCE4wMAmYPvSFWlqI+IBeXqD+WexZMCikw3aRjm5eb8gul108iWchTtPG+mFTZscdOIwKHLTtOcHYWuwYRjzbfDrixQNcm2FrJTlpJYG+Q1Aj5qp3vubq+v7m7ffiPRG0O9Z3k/wXPt6PzZgIAAA==",
"class_url": "6&7&8&9&10&11&12&13&14&15&16&17&18&19&20&23&25&26&27&28&29&30&31&39&44&45&47&48&49&50&51&52&53&54&55&56&57&58&59&60&61&62&63&64&65&66&67&68&69&70&71&72"
},
{
"name": "无尽资源(集)",
"url": "https://api.wujinapi.com",
"parse_url": "",
"cate_exclude": "",
"class_name": "H4sIAFMdWGgC/zVRW3LaQBC8zR4nt3CqUuVPf+TTFi8JVwyqEMUYBRwjvDaRLWEQBj3gMjs7o1tktbv6m97p2Z7uwUkG1YbReY7FG3icYVGSlzMYvsjyH6OsS+9Jg0QVojdgEISK1VTobmSnpyvuw7FoKnkzlteB5nncdqV7L3JPv80qkfNGpH6eykPSVDBK5fGkhU93iqDfejH4QwbRTv75y0T5jOO+1snXUP1qqnrxarny90qGsa6yT4gCPR/xetq3RhRBsVugREdpC2KuNFu/Zjfj2sy0QNNa4MQY+NrM8AUn2jQOE6zW+m01sEHUTibTEZpw5TZt1hLVT3I+KJuJ/JZh8o7jDlNt4n3iS0p2DBf6AmbJVtC4sqCcwGQjygdG+20zXj91VVI6ZT0kDh7m3MZjgmO0OsvgaIGJywJxiOQ1p+QEjw6D/hTDBXbeyJ0zGXqwbFeA1bZ+8uXNrbq4utcPqmJ0dfjU9eVubjJhcNyJYomvZ9qr240iWvZEMRWnR4Z3qerUnQoODvtycfX18tt3G41FNFiDu1df/gcr3jnwjwIAAA==",
"class_url": "6&7&8&9&10&11&12&13&14&15&16&17&18&20&21&22&23&24&25&26&27&28&29&30&31&32&33&34&35&36&37&38&39&40&41&42&43&44&45&46&47&48&49&50&51&52&53&54&55&56&57&58&59&60&61"
},
{
"name": "红牛资源(集)",
"url": "https://www.hongniuzy2.com",
"parse_url": "",
"cate_exclude": "",
"class_name": "H4sIAFQdWGgC/y2PXQ6CMBCEb9Nz+hOVaqIYFU0g8qRV1AgSEikUL9Pu1lvorj7Nl5nNZBbXlTOF8K89NjcnlcCm9VILNz1BeyGxJkE5ES5KvjERBgUMR0xq6eqGCPoh9CK+k+qfQrCzWrIXG6sVtcPzDl3JtD2wXBV2cyK3yKHu2Ctzknd65kE6c2bDNbwJf4tte8RwTLY1Kz94+Cq2eiYwpS8+mOVyptYAAAA=",
"class_url": "3&4&5&6&7&8&9&10&11&12&13&14&15&16&17&18&19&20&21&29&30"
},
{
"name": "光速资源(集)",
"url": "https://api.guangsuapi.com/api.php/provide/vod/",
"parse_url": "",
"cate_exclude": "",
"class_name": "H4sIAD04WGgC/y2Oaw6CMBCEb9Nz+ohINVGMiBpJ+KNW4gskJPJoT9PulltIF3/Nl5nJ7GJYGpkzDEsrPMMFw6a1vGZmcYP27kTLGPmcmSjuY0fo5zCdEYmNqRpKufh7MA5gFBH5B11zSs+iO9I6PASqFdH3Dapw1CWpk+EiDv/A/kLeOoNKUb3InNhXZuTOber2ioFHJLd28rHlSddLhsmz7/0A4RcQUdYAAAA=",
"class_url": "3&4&6&7&8&9&10&11&12&13&14&15&16&20&21&22&23&24&25&30&31"
},
{
"name": "魔都资源(集)",
"url": "https://www.mdzyapi.com/api.php/provide/vod/at/xml",
"parse_url": "",
"cate_exclude": "",
"class_name": "H4sIADw4WGgC/zWQ3XKCMBCF34bnrDpFw3REZxSrMvWiaNSiYjtqBUJfht0lb9FkCVf5ztmf2RxYqzqXEOyx/PJwsdWbQydSSdW4E78XCDMn2odmN1BXTw/faH50Fec1fx9UnEBIj4qyEbmdqFVMYuhBFBvfEo2uOHhlklN4FpawN8GXiPuEdFUcvde5YBoE2F9x9XyH/MQUJs0n98HYh/Cb+/opRVPeHFxIHZl6lV5VlppzBmrO3qZd0UZgrtW7pf2oJRPDWllyMRgyAeCzYm+xxThluj0giZh+MjcBidRL3/28Da4TnG8neLET5hQ7Wpc7mvjmqH8j2O9ylwEAAA==",
"class_url": "1&2&3&4&5&6&7&8&9&10&11&12&13&14&15&16&17&18&19&20&21&22&23&24&25&26&27&28&29&30&31&32&33&34&35&36&37&38&39"
}
]
-289
View File
@@ -2,295 +2,6 @@
"logo": "./assets/logo2025121201.png",
"spider": "./jar/dongli-spider.jar",
"sites": [
{
"key": "py_fk",
"name": "飞快TV",
"type": 3,
"api": "./py/飞快TV.py",
"searchable": 1,
"quickSearch": 0,
"filterable": 0,
"changeable": 0
},
{
"key": "py_xiong_di_ying_shi",
"name": "兄弟影视",
"type": 3,
"api": "./py/兄弟影视.min.py",
"searchable": 1,
"quickSearch": 0,
"filterable": 0,
"changeable": 0
},
{
"key": "哔哩直播",
"name": "哔哩直播",
"type": 3,
"api": "./py/哔哩直播.py",
"style": {
"type": "rect",
"ratio": 0.75
},
"changeable": 1
},
{
"key": "4KVM",
"name": "4KVM",
"type": 3,
"api": "./py/4KVM.py",
"style": {
"type": "rect",
"ratio": 0.75
},
"changeable": 1
},
{
"key": "小苹果",
"name": "小苹果",
"type": 3,
"api": "./py/小苹果.py",
"style": {
"type": "rect",
"ratio": 0.75
},
"changeable": 1
},
{
"key": "小鸡暴走",
"name": "小鸡暴走",
"type": 3,
"api": "./py/小鸡暴走.py",
"style": {
"type": "rect",
"ratio": 0.75
},
"changeable": 1
},
{
"key": "hohaiemby",
"name": "hohai|EMBY",
"type": 3,
"api": "./py/emby.py",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"changeable": 1,
"ext": {
"server": "https://emby.hohai.eu.org:443",
"username": "chuxin666",
"password": "ycc123456",
"proxy": "",
"thread": 0,
"device_name": "My Computer",
"client": "Hills Windows",
"client_version": "0.2.2",
"device_id": "a9f74849-83d5-4a28-8b85-a087af1402e3"
}
},
{
"key": "今日看料",
"name": "今日看料",
"type": 3,
"api": "./py/今日看料.py",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"changeable": 1
},
{
"key": "UVod",
"name": "🧱UVod",
"type": 3,
"api": "./py/UVod.py",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"changeable": 1
},
{
"key": "努努影院",
"name": "🧱努努影院",
"type": 3,
"api": "./py/努努影院.py",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"changeable": 1
},
{
"key": "饭团影视",
"name": "饭团影视",
"type": 3,
"api": "./py/饭团影视.py",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"changeable": 1
},
{
"key": "金牌",
"name": "金牌",
"type": 3,
"api": "./py/金牌.py",
"searchable": 1,
"quickSearch": 1,
"filterable": 1,
"changeable": 1
},
{
"key": "4K影视",
"name": "4K影视",
"type": 3,
"api": "./py/4K影视.py",
"style": {
"type": "rect",
"ratio": 0.75
},
"changeable": 1
},
{
"key": "HMDJ",
"name": "HMDJ",
"type": 3,
"api": "./py/HMDJ.py",
"style": {
"type": "rect",
"ratio": 0.75
},
"changeable": 1
},
{
"key": "LSYS",
"name": "LSYS",
"type": 3,
"api": "./py/LSYS.py",
"style": {
"type": "rect",
"ratio": 0.75
},
"changeable": 1
},
{
"key": "YYMP3音乐网",
"name": "YYMP3音乐网",
"type": 3,
"api": "./py/YYMP3音乐网.py",
"style": {
"type": "rect",
"ratio": 0.75
},
"changeable": 1
},
{
"key": "云端影视",
"name": "云端影视",
"type": 3,
"api": "./py/云端影视.py",
"style": {
"type": "rect",
"ratio": 0.75
},
"changeable": 1
},
{
"key": "优酷视频",
"name": "优酷视频",
"type": 3,
"api": "./py/优酷视频.py",
"style": {
"type": "rect",
"ratio": 0.75
},
"changeable": 1
},
{
"key": "剧王短剧",
"name": "剧王短剧",
"type": 3,
"api": "./py/剧王短剧.py",
"style": {
"type": "rect",
"ratio": 0.75
},
"changeable": 1
},
{
"key": "奇优动漫",
"name": "奇优动漫",
"type": 3,
"api": "./py/奇优动漫.py",
"style": {
"type": "rect",
"ratio": 0.75
},
"changeable": 1
},
{
"key": "柯南影视",
"name": "柯南影视",
"type": 3,
"api": "./py/柯南影视.py",
"style": {
"type": "rect",
"ratio": 0.75
},
"changeable": 1
},
{
"key": "永乐视频",
"name": "永乐视频",
"type": 3,
"api": "./py/永乐视频.py",
"style": {
"type": "rect",
"ratio": 0.75
},
"changeable": 1
},
{
"key": "爱瓜影视",
"name": "🧱爱瓜影视",
"type": 3,
"api": "./py/爱瓜影视.py",
"style": {
"type": "rect",
"ratio": 0.75
},
"changeable": 1
},
{
"key": "猎手影视",
"name": "猎手影视",
"type": 3,
"api": "./py/猎手影视.py",
"style": {
"type": "rect",
"ratio": 0.75
},
"changeable": 1
},
{
"key": "甜圈短剧",
"name": "甜圈短剧",
"type": 3,
"api": "./py/甜圈短剧.py",
"style": {
"type": "rect",
"ratio": 0.75
},
"changeable": 1
},
{
"key": "电影猎手",
"name": "电影猎手",
"type": 3,
"api": "./py/电影猎手.py",
"style": {
"type": "rect",
"ratio": 0.75
},
"changeable": 1
},
{
"key": "界影视",
"name": "界影视",