哔哩哔哩

哔哩哔哩

guaner001125 (317)6天前

❗️特别标注:本源只支持洛雅橙改版阅读Σ最新版https://github.com/Luoyacheng/legado

搜索分类
@用户
%视频
#专栏
&直播
*番剧
?影视

API来源
https://github.com/SocialSisterYi/bilibili-API-collect

url scheme链接来源
AI和网页

⚙️部分功能说明【自己随便点点点看看吧】
登录使用效果更佳

1、详情页界面 
点击书名显示【最新评论】
长按书名显示【热门评论】

点击UP主名字显示 【视频列表/专栏文集】【根据登录页设置来】
长按UP主名字显示 【视频合集/专栏动态】【根据登录页设置来】

点击 查看全部动态【查看动态】
长按 查看全部动态【搜索该up主动态】

点击右上角◎ 打开哔哩哔哩客户端
点击分享按钮,复制分享详情
点击拷贝书籍详情URL  复制网页链接
点击登录 可选择【关注up到b站 [需登录账号]】

2、视频页
点击右上角◎ 打开推荐视频 【影视无效,直播无效】
点击登录 可点赞投币收藏

3、发现页
长按书源选项后打开登录页面,可筛选分类

4、正文页
视频/文章图可点击跳转
🔗📖🎥👤图标可点击跳转
二维码导入
{
    "bookSourceComment": "❗️特别标注:本源只支持洛雅橙改版阅读Σ最新版https:\/\/github.com\/Luoyacheng\/legado\n\n搜索分类\n@用户\n%视频\n#专栏\n&直播\n*番剧\n?影视\n\nAPI来源\nhttps:\/\/github.com\/SocialSisterYi\/bilibili-API-collect\n\nurl scheme链接来源\nAI和网页\n\n⚙️部分功能说明【自己随便点点点看看吧】\n登录使用效果更佳\n\n1、详情页界面 \n点击书名显示【最新评论】\n长按书名显示【热门评论】\n\n点击UP主名字显示 【视频列表\/专栏文集】【根据登录页设置来】\n长按UP主名字显示 【视频合集\/专栏动态】【根据登录页设置来】\n\n点击 查看全部动态【查看动态】\n长按 查看全部动态【搜索该up主动态】\n\n点击右上角◎ 打开哔哩哔哩客户端\n点击分享按钮,复制分享详情\n点击拷贝书籍详情URL  复制网页链接\n点击登录 可选择【关注up到b站 [需登录账号]】\n\n2、视频页\n点击右上角◎ 打开推荐视频 【影视无效,直播无效】\n点击登录 可点赞投币收藏\n\n3、发现页\n长按书源选项后打开登录页面,可筛选分类\n\n4、正文页\n视频\/文章图可点击跳转\n🔗📖🎥👤图标可点击跳转",
    "bookSourceGroup": "⑩影视",
    "bookSourceName": "哔哩哔哩",
    "bookSourceType": 0,
    "bookSourceUrl": "哔哩哔哩",
    "bookUrlPattern": "https:\/\/api(?:\\.live)*\\.bilibili.com\/.*?\\?[^r]?(?:room_)*id=.*",
    "customButton": true,
    "customOrder": 8,
    "enabled": false,
    "enabledCookieJar": true,
    "enabledExplore": true,
    "eventListener": true,
    "exploreUrl": "<js>\ntry{\nlet all = [];\n\n\/\/一行个数\nlet num = 3;\n\nlet d = {\n    1: 1,\n    2: 0.4,\n    3: 0.25,\n    4: 0.2,\n    5: 0.15,\n    7: 0.1,\n    10: 0.05\n};\nnum = d[num];\nlet push = (title, url, type, g) => all.push({\n    title: title,\n    url: url,\n    style: {\n        layout_flexGrow: g == 0 ? g : 1,\n        layout_flexBasisPercent: type\n    }\n});\n\nlet mid = JSON.parse(java.ajax(\"https:\/\/api.bilibili.com\/x\/web-interface\/nav\"))?.data?.mid || \"\";\n\npush(\"👤我的\", \"\", 1);\npush(\"推送视频\", \"https:\/\/api.bilibili.com\/x\/web-interface\/index\/top\/feed\/rcmd\", num);\npush(\"热门视频\", \"https:\/\/api.bilibili.com\/x\/web-interface\/popular?pn={\\{page}}\", num);\npush(\"入站必刷\", \"https:\/\/api.bilibili.com\/x\/web-interface\/popular\/precious\", num);\n\nif (mid) {\n    push(\"正在直播\", \"https:\/\/api.live.bilibili.com\/xlive\/web-ucenter\/v1\/xfetter\/GetWebList?hit_ab=true\", num);\n\n    push(\"专栏动态\", `https:\/\/api.bilibili.com\/x\/polymer\/web-dynamic\/v1\/feed\/all?timezone_offset=-480&type=article&platform=web&offset={\\{if(page==1){source.put(\"nextoffset\",\"\")};source.get(\"nextoffset\")}}&page={\\{page}}`, num);\n    push(\"视频动态\", `https:\/\/api.bilibili.com\/x\/polymer\/web-dynamic\/v1\/feed\/all?timezone_offset=-480&type=video&platform=web&offset={\\{if(page==1){source.put(\"nextoffset\",\"\")};source.get(\"nextoffset\")}}&page={\\{page}}`, num);\n    push(\"历史记录\", `https:\/\/api.bilibili.com\/x\/web-interface\/history\/cursor?max={\\{if(page==1){source.put(\"nextoffset\",\"\")};source.get(\"nextoffset\")}}`, num, 0);\n\n    \n    if (M(\"关注分组\") == \"☑️\") {\n        push(\"⚙️关注分组\", \"https:\/\/api.bilibili.com\/x\/relation\/followings?vmid=\"+mid+\"&pn={\\{page}}\", 1);\n        关注分组url = \"https:\/\/api.bilibili.com\/x\/relation\/tags\";\n        关注分组data = JSON.parse(java.ajax(关注分组url));\n        (关注分组data?.data ?? []).forEach(x => {\n            push(x.name, `https:\/\/api.bilibili.com\/x\/relation\/tag?pn={{page}\\}&tagid=${x.tagid}`, num)\n        })\n    }\n\n\n    if (M(\"收藏夹\") == \"☑️\") {\n        push(\"🗂收藏夹\", \"\", 1);\n        收藏夹url = \"https:\/\/api.bilibili.com\/x\/v3\/fav\/folder\/created\/list-all?up_mid=\" + mid;\n        收藏夹data = JSON.parse(java.ajax(收藏夹url));\n        (收藏夹data?.data?.list ?? []).forEach(x => {\n            push(x.title, `https:\/\/api.bilibili.com\/x\/v3\/fav\/resource\/list?media_id=${x.id}&ps=20&pn={\\{page}}`, num)\n        })\n    }\n}\nlet 分区 = [\"动画::1005\", \"游戏::1008\", \"鬼畜::1007\", \"音乐::1003\", \"舞蹈::1004\", \"影视::1001\", \"娱乐::1002\", \"知识::1010\", \"科技数码::1012\", \"资讯::1009\", \"美食::1020\", \"小剧场::1021\", \"汽车::1013\", \"时尚美妆::1014\", \"体育运动::1018\", \"动物::1024\", \"vlog::1029\", \"绘画::1006\", \"人工智能::1011\", \"家装房产::1015\", \"户外潮流::1016\", \"健身::1017\", \"手工::1019\", \"旅游出行::1022\", \"三农::1023\", \"亲子::1025\", \"健康::1026\", \"情感::1027\", \"生活兴趣::1030\", \"生活经验::1031\", \"神秘学::1028\"];\n\npush(\"📽视频分区\", \"\", 1);\n分区.forEach(x => {\n    let a = x.split(\"::\");\n    let json = `{display_id:page,request_cnt:20,from_region:${a[1]},device:\"web\",web_location:333.40138}`\n    push(a[0], `https:\/\/api.bilibili.com\/x\/web-interface\/region\/feed\/rcmd?{\\{getWbiEnc(${json})}}`, num)\n});\n\nfunction getUrl(st = -1, sv = -1, area = -1, is_finish = -1, cr = -1, ss = -1, year = -1, rd = -1, sid = -1, pid = -1, order = -1) {\n    return `https:\/\/api.bilibili.com\/pgc\/season\/index\/result?season_type=${st}&type=1&page={\\{page}}&pagesize=50&season_version=${sv}&area=${area}&is_finish=${is_finish}&copyright=${cr}&season_status=${ss}&year=${year}&release_date=${rd}&style_id=${sid}&producer_id=${pid}&order=${order}`\n}\n\nlet xh = M(\"1🎬番剧,2🎥电影,3🎞纪录片,4🇨🇳国创,5📺电视剧,6🍿综艺 [显示]\");\nlet 类型 = [];\nif (\/\\d+\/.test(xh)) {\n    xh = xh.match(\/\\d\/g);\n    类型 = xh.map(match => {\n        let index = parseInt(match) - 1;\n        return index\n    }).filter(item => item !== undefined);\n}\n\n类型.forEach((x, i) => {\n    let name = fenlei[\"类型\"][x];\n    let icon = fenlei[\"图标\"][x];\n    let st = fenlei[\"类型v\"][x];\n    let area = getValueByIconAndName(icon, \"地区\", M(icon + \"地区\"));\n    let sv = getValueByIconAndName(icon, \"类别\", M(icon + \"类别\"));\n    let is_finish = getValueByIconAndName(icon, \"状态\", M(icon + \"状态\"));\n    let cr = getValueByIconAndName(icon, \"版权\", M(icon + \"版权\"));\n    let ss = getValueByIconAndName(icon, \"付费\", M(\"💰付费\"));\n    let year = getValueByIconAndName(icon, \"年份\", M(icon + \"年份\"));\n    let rd = getValueByIconAndName(icon, \"年份\", M(icon + \"年份\"));\n    let pid = getValueByIconAndName(icon, \"出品\", M(icon + \"出品\"));\n    let order = getValueByIconAndName(icon, \"排序\", M(\"🔁排序\"), null);\n\n    push(icon + name, getUrl(st, sv, area, is_finish, cr, ss, year, rd, -1, pid, order), 1);\n    fenlei[\"风格\"][name].forEach(y => {\n        let url = getUrl(st, sv, area, is_finish, cr, ss, year, rd, y.v, pid, order);\n        push(y.n, url, num)\n    })\n\n})\n\n\nresult = JSON.stringify(all)\n}catch(e){\n\tjava.longToast(\"本书源只支持最新版洛雅橙改版阅读Σ\\n请安装后重新导入书源\");\tjava.startBrowser(\"https:\/\/loyc.xyz\/c\/legado.html#download\", \"下载阅读Σ\");\n\t\n\tresult = `下载阅读Σ::{\\{java.longToast(\"本书源只支持最新版洛雅橙改版阅读Σ\\\\n请安装后重新导入书源\");java.startBrowser(\"https:\/\/loyc.xyz\/c\/legado.html#download\",\"下载阅读Σ\");}}`;\n\t}\n<\/js>",
    "header": "@js:\nJSON.stringify({\n\t\"Referer\":\"https:\/\/www.bilibili.com\/\",\n\t\"Cookie\":cookie.getCookie(\"https:\/\/www.bilibili.com\")\n\t})",
    "jsLib": "const fenlei={\"类型\":[\"番剧\",\"电影\",\"纪录片\",\"国创\",\"电视剧\",\"综艺\"],\"类型v\":[1,2,3,4,5,7],\"图标\":[\"🎬\",\"🎥\",\"🎞\",\"🇨🇳\",\"📺\",\"🍿\"],\"排序\":[{\"n\":\"更新时间\",\"v\":0},{\"n\":\"弹幕数量\",\"v\":1},{\"n\":\"播放数量\",\"v\":2},{\"n\":\"追剧人数\",\"v\":3},{\"n\":\"最高评分\",\"v\":4},{\"n\":\"开播时间\",\"v\":5},{\"n\":\"上映时间\",\"v\":6}],\"付费\":[{\"n\":\"全部\",\"v\":\"-1\"},{\"n\":\"免费\",\"v\":\"1\"},{\"n\":\"付费\",\"v\":\"2,6\"},{\"n\":\"大会员\",\"v\":\"4,6\"}],\"类别\":{番剧:[{\"n\":\"全部\",\"v\":\"-1\"},{\"n\":\"正片\",\"v\":\"1\"},{\"n\":\"电影\",\"v\":\"2\"},{\"n\":\"其他\",\"v\":\"3\"}],国创:[{\"n\":\"全部\",\"v\":\"-1\"},{\"n\":\"正片\",\"v\":\"1\"},{\"n\":\"电影\",\"v\":\"2\"},{\"n\":\"其他\",\"v\":\"3\"}]},\"版权\":{国创:[{\"n\":\"全部\",\"v\":\"-1\"},{\"n\":\"独家\",\"v\":\"3\"},{\"n\":\"其他\",\"v\":\"1,2,4\"}]},\"状态\":{番剧:[{\"n\":\"全部\",\"v\":\"-1\"},{\"n\":\"完结\",\"v\":\"1\"},{\"n\":\"连载\",\"v\":\"0\"}],国创:[{\"n\":\"全部\",\"v\":\"-1\"},{\"n\":\"完结\",\"v\":\"1\"},{\"n\":\"连载\",\"v\":\"0\"}]},\"出品\":{纪录片:[{\"n\":\"全部\",\"v\":\"-1\"},{\"n\":\"央视\",\"v\":\"4\"},{\"n\":\"BBC\",\"v\":\"1\"},{\"n\":\"探索频道\",\"v\":\"7\"},{\"n\":\"国家地理\",\"v\":\"14\"},{\"n\":\"NHK\",\"v\":\"2\"},{\"n\":\"历史频道\",\"v\":\"6\"},{\"n\":\"卫视\",\"v\":\"8\"},{\"n\":\"自制\",\"v\":\"9\"},{\"n\":\"ITV\",\"v\":\"5\"},{\"n\":\"SKY\",\"v\":\"3\"},{\"n\":\"ZDF\",\"v\":\"10\"},{\"n\":\"合作机构\",\"v\":\"11\"},{\"n\":\"国内其他\",\"v\":\"12\"},{\"n\":\"国外其他\",\"v\":\"13\"},{\"n\":\"索尼\",\"v\":\"15\"},{\"n\":\"环球\",\"v\":\"16\"},{\"n\":\"派拉蒙\",\"v\":\"17\"},{\"n\":\"华纳\",\"v\":\"18\"},{\"n\":\"迪士尼\",\"v\":\"19\"},{\"n\":\"HBO\",\"v\":\"20\"}]},\"地区\":{\"电视剧\":[{\"n\":\"全部\",\"v\":\"-1\"},{\"n\":\"中国\",\"v\":\"1,6,7\"},{\"n\":\"日本\",\"v\":2},{\"n\":\"美国\",\"v\":3},{\"n\":\"英国\",\"v\":4},{\"n\":\"其他\",\"v\":\"5,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,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70\"}],\"番剧\":[{\"n\":\"全部\",\"v\":-1},{\"n\":\"日本\",\"v\":2},{\"n\":\"美国\",\"v\":3},{\"n\":\"其他\",\"v\":\"1,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,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70\"}],\"电影\":[{\"n\":\"全部\",\"v\":-1},{\"n\":\"中国大陆\",\"v\":1},{\"n\":\"中国港台\",\"v\":\"6,7\"},{\"n\":\"美国\",\"v\":3},{\"n\":\"日本\",\"v\":2},{\"n\":\"韩国\",\"v\":8},{\"n\":\"法国\",\"v\":9},{\"n\":\"英国\",\"v\":4},{\"n\":\"德国\",\"v\":15},{\"n\":\"泰国\",\"v\":10},{\"n\":\"意大利\",\"v\":35},{\"n\":\"西班牙\",\"v\":13},{\"n\":\"其他\",\"v\":\"5,11,12,14,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,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,62,63,64,65,66,67,68,69,70\"}]},\"风格\":{电视剧:[{\"n\":\"剧情\",\"v\":10050},{\"n\":\"情感\",\"v\":10084},{\"n\":\"搞笑\",\"v\":10021},{\"n\":\"悬疑\",\"v\":10057},{\"n\":\"都市\",\"v\":10080},{\"n\":\"家庭\",\"v\":10061},{\"n\":\"古装\",\"v\":10081},{\"n\":\"历史\",\"v\":10033},{\"n\":\"奇幻\",\"v\":10018},{\"n\":\"青春\",\"v\":10079},{\"n\":\"战争\",\"v\":10058},{\"n\":\"武侠\",\"v\":10078},{\"n\":\"励志\",\"v\":10039},{\"n\":\"短剧\",\"v\":10103},{\"n\":\"科幻\",\"v\":10023},{\"n\":\"其他\",\"v\":\"10086,10088,10089,10017,10083,10082,10087,10085\"}],番剧:[{\"n\":\"原创\",\"v\":10010},{\"n\":\"漫画改\",\"v\":10011},{\"n\":\"小说改\",\"v\":10012},{\"n\":\"游戏改\",\"v\":10013},{\"n\":\"特摄\",\"v\":10102},{\"n\":\"布袋戏\",\"v\":10015},{\"n\":\"热血\",\"v\":10016},{\"n\":\"穿越\",\"v\":10017},{\"n\":\"奇幻\",\"v\":10018},{\"n\":\"战斗\",\"v\":10020},{\"n\":\"搞笑\",\"v\":10021},{\"n\":\"日常\",\"v\":10022},{\"n\":\"科幻\",\"v\":10023},{\"n\":\"萌系\",\"v\":10024},{\"n\":\"治愈\",\"v\":10025},{\"n\":\"校园\",\"v\":10026},{\"n\":\"少儿\",\"v\":10027},{\"n\":\"泡面\",\"v\":10028},{\"n\":\"恋爱\",\"v\":10029},{\"n\":\"少女\",\"v\":10030},{\"n\":\"魔法\",\"v\":10031},{\"n\":\"冒险\",\"v\":10032},{\"n\":\"历史\",\"v\":10033},{\"n\":\"架空\",\"v\":10034},{\"n\":\"机战\",\"v\":10035},{\"n\":\"神魔\",\"v\":10036},{\"n\":\"声控\",\"v\":10037},{\"n\":\"运动\",\"v\":10038},{\"n\":\"励志\",\"v\":10039},{\"n\":\"音乐\",\"v\":10040},{\"n\":\"推理\",\"v\":10041},{\"n\":\"社团\",\"v\":10042},{\"n\":\"智斗\",\"v\":10043},{\"n\":\"催泪\",\"v\":10044},{\"n\":\"美食\",\"v\":10045},{\"n\":\"偶像\",\"v\":10046},{\"n\":\"乙女\",\"v\":10047},{\"n\":\"职场\",\"v\":10048}],电影:[{\"n\":\"短片\",\"v\":10104},{\"n\":\"剧情\",\"v\":10050},{\"n\":\"喜剧\",\"v\":10051},{\"n\":\"爱情\",\"v\":10052},{\"n\":\"动作\",\"v\":10053},{\"n\":\"恐怖\",\"v\":10054},{\"n\":\"科幻\",\"v\":10023},{\"n\":\"犯罪\",\"v\":10055},{\"n\":\"惊悚\",\"v\":10056},{\"n\":\"悬疑\",\"v\":10057},{\"n\":\"奇幻\",\"v\":10018},{\"n\":\"战争\",\"v\":10058},{\"n\":\"动画\",\"v\":10059},{\"n\":\"传记\",\"v\":10060},{\"n\":\"家庭\",\"v\":10061},{\"n\":\"歌舞\",\"v\":10062},{\"n\":\"历史\",\"v\":10033},{\"n\":\"冒险\",\"v\":10032},{\"n\":\"纪实\",\"v\":10063},{\"n\":\"灾难\",\"v\":10064},{\"n\":\"漫画改\",\"v\":10011},{\"n\":\"小说改\",\"v\":10012}],国创:[{\"n\":\"原创\",\"v\":10010},{\"n\":\"漫画改\",\"v\":10011},{\"n\":\"小说改\",\"v\":10012},{\"n\":\"游戏改\",\"v\":10013},{\"n\":\"动态漫\",\"v\":10014},{\"n\":\"布袋戏\",\"v\":10015},{\"n\":\"热血\",\"v\":10016},{\"n\":\"奇幻\",\"v\":10018},{\"n\":\"玄幻\",\"v\":10019},{\"n\":\"战斗\",\"v\":10020},{\"n\":\"搞笑\",\"v\":10021},{\"n\":\"武侠\",\"v\":10078},{\"n\":\"日常\",\"v\":10022},{\"n\":\"科幻\",\"v\":10023},{\"n\":\"萌系\",\"v\":10024},{\"n\":\"治愈\",\"v\":10025},{\"n\":\"悬疑\",\"v\":10057},{\"n\":\"校园\",\"v\":10026},{\"n\":\"少儿\",\"v\":10027},{\"n\":\"泡面\",\"v\":10028},{\"n\":\"恋爱\",\"v\":10029},{\"n\":\"少女\",\"v\":10030},{\"n\":\"魔法\",\"v\":10031},{\"n\":\"历史\",\"v\":10033},{\"n\":\"机战\",\"v\":10035},{\"n\":\"神魔\",\"v\":10036},{\"n\":\"声控\",\"v\":10037},{\"n\":\"运动\",\"v\":10038},{\"n\":\"励志\",\"v\":10039},{\"n\":\"音乐\",\"v\":10040},{\"n\":\"推理\",\"v\":10041},{\"n\":\"社团\",\"v\":10042},{\"n\":\"智斗\",\"v\":10043},{\"n\":\"催泪\",\"v\":10044},{\"n\":\"美食\",\"v\":10045},{\"n\":\"偶像\",\"v\":10046},{\"n\":\"乙女\",\"v\":10047},{\"n\":\"职场\",\"v\":10048},{\"n\":\"古风\",\"v\":10049}],综艺:[{\"n\":\"音乐\",\"v\":10040},{\"n\":\"访谈\",\"v\":10090},{\"n\":\"脱口秀\",\"v\":10091},{\"n\":\"真人秀\",\"v\":10092},{\"n\":\"选秀\",\"v\":10094},{\"n\":\"美食\",\"v\":10045},{\"n\":\"旅游\",\"v\":10095},{\"n\":\"晚会\",\"v\":10098},{\"n\":\"演唱会\",\"v\":10096},{\"n\":\"情感\",\"v\":10084},{\"n\":\"喜剧\",\"v\":10051},{\"n\":\"亲子\",\"v\":10097},{\"n\":\"文化\",\"v\":10100},{\"n\":\"职场\",\"v\":10048},{\"n\":\"萌宠\",\"v\":10069},{\"n\":\"养成\",\"v\":10099}],纪录片:[{\"n\":\"历史\",\"v\":10033},{\"n\":\"美食\",\"v\":10045},{\"n\":\"人文\",\"v\":10065},{\"n\":\"科技\",\"v\":10066},{\"n\":\"探险\",\"v\":10067},{\"n\":\"宇宙\",\"v\":10068},{\"n\":\"萌宠\",\"v\":10069},{\"n\":\"社会\",\"v\":10070},{\"n\":\"动物\",\"v\":10071},{\"n\":\"自然\",\"v\":10072},{\"n\":\"医疗\",\"v\":10073},{\"n\":\"军事\",\"v\":10074},{\"n\":\"灾难\",\"v\":10064},{\"n\":\"罪案\",\"v\":10075},{\"n\":\"神秘\",\"v\":10076},{\"n\":\"旅行\",\"v\":10077},{\"n\":\"运动\",\"v\":10038},{\"n\":\"电影\",\"v\":-10}]},\"年份\":{电视剧:[{\"n\":\"全部\",\"v\":-1},{\"n\":\"2025\",\"v\":\"[2025-01-01 00:00:00,2026-01-01 00:00:00)\"},{\"n\":\"2024\",\"v\":\"[2024-01-01 00:00:00,2025-01-01 00:00:00)\"},{\"n\":\"2023\",\"v\":\"[2023-01-01 00:00:00,2024-01-01 00:00:00)\"},{\"n\":\"2022\",\"v\":\"[2022-01-01 00:00:00,2023-01-01 00:00:00)\"},{\"n\":\"2021\",\"v\":\"[2021-01-01 00:00:00,2022-01-01 00:00:00)\"},{\"n\":\"2020\",\"v\":\"[2020-01-01 00:00:00,2021-01-01 00:00:00)\"},{\"n\":\"2019\",\"v\":\"[2019-01-01 00:00:00,2020-01-01 00:00:00)\"},{\"n\":\"2018\",\"v\":\"[2018-01-01 00:00:00,2019-01-01 00:00:00)\"},{\"n\":\"2017\",\"v\":\"[2017-01-01 00:00:00,2018-01-01 00:00:00)\"},{\"n\":\"2016\",\"v\":\"[2016-01-01 00:00:00,2017-01-01 00:00:00)\"},{\"n\":\"2015-2010\",\"v\":\"[2010-01-01 00:00:00,2016-01-01 00:00:00)\"},{\"n\":\"2009-2005\",\"v\":\"[2005-01-01 00:00:00,2010-01-01 00:00:00)\"},{\"n\":\"2004-2000\",\"v\":\"[2000-01-01 00:00:00,2005-01-01 00:00:00)\"},{\"n\":\"90年代\",\"v\":\"[1990-01-01 00:00:00,2000-01-01 00:00:00)\"},{\"n\":\"80年代\",\"v\":\"[1980-01-01 00:00:00,1990-01-01 00:00:00)\"},{\"n\":\"更早\",\"v\":\"[,1980-01-01 00:00:00)\"}],番剧:[{\"n\":\"全部\",\"v\":-1},{\"n\":\"2025\",\"v\":\"[2025,2026)\"},{\"n\":\"2024\",\"v\":\"[2024,2025)\"},{\"n\":\"2023\",\"v\":\"[2023,2024)\"},{\"n\":\"2022\",\"v\":\"[2022,2023)\"},{\"n\":\"2021\",\"v\":\"[2021,2022)\"},{\"n\":\"2020\",\"v\":\"[2020,2021)\"},{\"n\":\"2019\",\"v\":\"[2019,2020)\"},{\"n\":\"2018\",\"v\":\"[2018,2019)\"},{\"n\":\"2017\",\"v\":\"[2017,2018)\"},{\"n\":\"2016\",\"v\":\"[2016,2017)\"},{\"n\":\"2015\",\"v\":\"[2015,2016)\"},{\"n\":\"2014-2010\",\"v\":\"[2010,2015)\"},{\"n\":\"2009-2005\",\"v\":\"[2005,2010)\"},{\"n\":\"2004-2000\",\"v\":\"[2000,2005)\"},{\"n\":\"90年代\",\"v\":\"[1990,2000)\"},{\"n\":\"80年代\",\"v\":\"[1980,1990)\"},{\"n\":\"更早\",\"v\":\"[,1980)\"}],电影:[{\"n\":\"全部\",\"v\":-1},{\"n\":\"2025\",\"v\":\"[2025-01-01 00:00:00,2026-01-01 00:00:00)\"},{\"n\":\"2024\",\"v\":\"[2024-01-01 00:00:00,2025-01-01 00:00:00)\"},{\"n\":\"2023\",\"v\":\"[2023-01-01 00:00:00,2024-01-01 00:00:00)\"},{\"n\":\"2022\",\"v\":\"[2022-01-01 00:00:00,2023-01-01 00:00:00)\"},{\"n\":\"2021\",\"v\":\"[2021-01-01 00:00:00,2022-01-01 00:00:00)\"},{\"n\":\"2020\",\"v\":\"[2020-01-01 00:00:00,2021-01-01 00:00:00)\"},{\"n\":\"2019\",\"v\":\"[2019-01-01 00:00:00,2020-01-01 00:00:00)\"},{\"n\":\"2018\",\"v\":\"[2018-01-01 00:00:00,2019-01-01 00:00:00)\"},{\"n\":\"2017\",\"v\":\"[2017-01-01 00:00:00,2018-01-01 00:00:00)\"},{\"n\":\"2016\",\"v\":\"[2016-01-01 00:00:00,2017-01-01 00:00:00)\"},{\"n\":\"2015-2010\",\"v\":\"[2010-01-01 00:00:00,2016-01-01 00:00:00)\"},{\"n\":\"2009-2005\",\"v\":\"[2005-01-01 00:00:00,2010-01-01 00:00:00)\"},{\"n\":\"2004-2000\",\"v\":\"[2000-01-01 00:00:00,2005-01-01 00:00:00)\"},{\"n\":\"90年代\",\"v\":\"[1990-01-01 00:00:00,2000-01-01 00:00:00)\"},{\"n\":\"80年代\",\"v\":\"[1980-01-01 00:00:00,1990-01-01 00:00:00)\"},{\"n\":\"更早\",\"v\":\"[,1980-01-01 00:00:00)\"}],国创:[{\"n\":\"全部\",\"v\":-1},{\"n\":\"2025\",\"v\":\"[2025,2026)\"},{\"n\":\"2024\",\"v\":\"[2024,2025)\"},{\"n\":\"2023\",\"v\":\"[2023,2024)\"},{\"n\":\"2022\",\"v\":\"[2022,2023)\"},{\"n\":\"2021\",\"v\":\"[2021,2022)\"},{\"n\":\"2020\",\"v\":\"[2020,2021)\"},{\"n\":\"2019\",\"v\":\"[2019,2020)\"},{\"n\":\"2018\",\"v\":\"[2018,2019)\"},{\"n\":\"2017\",\"v\":\"[2017,2018)\"},{\"n\":\"2016\",\"v\":\"[2016,2017)\"},{\"n\":\"2015\",\"v\":\"[2015,2016)\"},{\"n\":\"2014-2010\",\"v\":\"[2010,2015)\"},{\"n\":\"2009-2005\",\"v\":\"[2005,2010)\"},{\"n\":\"2004-2000\",\"v\":\"[2000,2005)\"},{\"n\":\"90年代\",\"v\":\"[1990,2000)\"},{\"n\":\"80年代\",\"v\":\"[1980,1990)\"},{\"n\":\"更早\",\"v\":\"[,1980)\"}],纪录片:[{\"n\":\"全部\",\"v\":-1},{\"n\":\"2025\",\"v\":\"[2025-01-01 00:00:00,2026-01-01 00:00:00)\"},{\"n\":\"2024\",\"v\":\"[2024-01-01 00:00:00,2025-01-01 00:00:00)\"},{\"n\":\"2023\",\"v\":\"[2023-01-01 00:00:00,2024-01-01 00:00:00)\"},{\"n\":\"2022\",\"v\":\"[2022-01-01 00:00:00,2023-01-01 00:00:00)\"},{\"n\":\"2021\",\"v\":\"[2021-01-01 00:00:00,2022-01-01 00:00:00)\"},{\"n\":\"2020\",\"v\":\"[2020-01-01 00:00:00,2021-01-01 00:00:00)\"},{\"n\":\"2019\",\"v\":\"[2019-01-01 00:00:00,2020-01-01 00:00:00)\"},{\"n\":\"2018\",\"v\":\"[2018-01-01 00:00:00,2019-01-01 00:00:00)\"},{\"n\":\"2017\",\"v\":\"[2017-01-01 00:00:00,2018-01-01 00:00:00)\"},{\"n\":\"2016\",\"v\":\"[2016-01-01 00:00:00,2017-01-01 00:00:00)\"},{\"n\":\"2015-2010\",\"v\":\"[2010-01-01 00:00:00,2016-01-01 00:00:00)\"},{\"n\":\"2009-2005\",\"v\":\"[2005-01-01 00:00:00,2010-01-01 00:00:00)\"},{\"n\":\"2004-2000\",\"v\":\"[2000-01-01 00:00:00,2005-01-01 00:00:00)\"},{\"n\":\"90年代\",\"v\":\"[1990-01-01 00:00:00,2000-01-01 00:00:00)\"},{\"n\":\"80年代\",\"v\":\"[1980-01-01 00:00:00,1990-01-01 00:00:00)\"},{\"n\":\"更早\",\"v\":\"[,1980-01-01 00:00:00)\"}]}};\n\n\nfunction parseContent(textData) {\n    let result,message,emote;\n    let pic=\"\";\n    var messageMatch = textData.match(\/message=([^,]+?),\/);\n    if (messageMatch) {\n        message = messageMatch[1].trim();      \n    }\n    let emoteMatch = textData.match(\/text=\\[.*?\\],\\s*url=[^,]+,\/g);\n    if(emoteMatch){\n        emoteMatch.forEach(x=>{\n            let title = x.match(\/text=(\\[.*?\\])\/)[1];   \n            let url = x.match(\/url=([^,]+),\/)[1];  \n            title = title.replace(\/(\\[|\\]|\\$)\/g,'\\\\$1');   \n            let re = new RegExp(title,\"g\");      \n            \n            let img = `<img src=\"${url},{style:'text'}\">`;\n            message = message.replace(re,img);         \n        })\n    }\n    var picturesMatch = textData.match(\/pictures=\\[([^\\]]+)\\],\/);\n    if (picturesMatch) {\n        var picturesBlock = picturesMatch[1];\n        var srcMatch = picturesBlock.match(\/\"img_src\":\"([^\"]+)\"\/g);        \n        if(srcMatch){\n            srcMatch.forEach(x=>{\n                let src = x.match(\/\"img_src\":\"([^\"]+)\"\/);        \n                pic +=`<img src=\"${src[1].replace(\/\\\\\\\/\/g, '\/') }\">`\n            })\n        }       \n    }\n    result = message+pic\n    return result;\n}\n\nfunction getValueByIconAndName(icon, filterType, optionName, typeName) {\n  let targetType = typeName;\n  \n  if (!targetType && icon) {\n    let iconIndex = fenlei.图标.indexOf(icon);\n    if (iconIndex === -1) {\n      \n      return -1;\n    }\n    targetType = fenlei.类型[iconIndex];\n  } else if (!targetType) {\n    return -1;\n  }\n  \n  if (!fenlei[filterType]) {\n    return -1;\n  }\n  \n  let filterData = fenlei[filterType];\n  \n  if (Array.isArray(filterData)) {\n    let option = filterData.find(item => item.n === optionName);\n    return option ? option.v : -1;\n  }\n  \n  if (typeof filterData === 'object') {\n    if (filterData[targetType]) {\n      let typeData = filterData[targetType];\n      if (Array.isArray(typeData) && typeData[0] === -1) {\n        for (let i = 1; i < typeData.length; i++) {\n          if (typeData[i].n === optionName) {\n            return typeData[i].v;\n          }\n        }\n      } \n      else if (Array.isArray(typeData)) {\n        let option = typeData.find(item => item.n === optionName);\n        if (option) {\n          return option.v;\n        }\n      }\n    }\n    \n    for (let type in filterData) {\n      if (type !== targetType) {\n        let typeData = filterData[type];\n        \n        if (Array.isArray(typeData)) {\n          if (typeData[0] === -1) {\n            for (let i = 1; i < typeData.length; i++) {\n              if (typeData[i].n === optionName) {\n                return typeData[i].v;\n              }\n            }\n          } else {\n            let option = typeData.find(item => item.n === optionName);\n            if (option) {\n              return option.v;\n            }\n          }\n        }\n      }\n    }\n  }\n  \n  \n  return -1;\n}\n\nfunction getApi(type,id,other){\n    let url = \"\";\n    switch(type){\n        case \"video\":\n            url = `https:\/\/api.bilibili.com\/x\/web-interface\/view?aid=${id}`;\n            break;\n            \n        case \"article\":\n            url = `https:\/\/api.bilibili.com\/x\/article\/view?id=${id},{\"js\":\"book?result:'https:\/\/www.bilibili.com\/opus\/${other}?spm_id_from=333.1365.0.0'\"}`;\n            break;  \n            \n        case \"articlelist\":\n            break;\n            \n        case \"user\":\n        case \"live\":\n            url = `https:\/\/api.bilibili.com\/x\/space\/wbi\/acc\/info?${this.getWbiEnc({mid:id})}`;\n            break;\n            \n        case \"forward\":\n            url = `https:\/\/api.bilibili.com\/x\/polymer\/web-dynamic\/v1\/detail?timezone_offset=-480&platform=web&gaia_source=main_web&id=${id}&features=itemOpusStyle,opusBigCover,onlyfansVote,endFooterHidden,decorationCard,onlyfansAssetsV2,ugcDelete,onlyfansQaCard,editable,opusPrivateVisible,avatarAutoTheme,sunflowerStyle,eva3CardOpus,eva3CardVideo,eva3CardComment&web_location=333.1368&x-bili-device-req-json=%7B%22platform%22:%22web%22,%22device%22:%22pc%22,%22spmid%22:%22333.1368%22%7D,{\"js\":\"book?result:'https:\/\/t.bilibili.com\/${other}?spm_id_from=333.1365.0.0'\"}`;\n            break;\n            \n        case \"opus\":\n            url = `https:\/\/api.bilibili.com\/x\/polymer\/web-dynamic\/v1\/opus\/detail?features=\titemOpusStyle,endFooterHidden,onlyfansAssetsV2,ugcDelete,commentsNewVersion&id=${id},{\"js\":\"book?result:'https:\/\/www.bilibili.com\/opus\/${other}?spm_id_from=333.1365.0.0'\"}`;\n            break;\n        case \"media_bangumi\":\n        case \"media_ft\":\n        url = `https:\/\/api.bilibili.com\/pgc\/view\/web\/season?season_id=${id}`;\n        break\n    }\n    \n    return url\n}\n\n\/\/分享链接\nfunction getShareUrl(type,id){\n    let url = \"\";\n\tswitch(type){\n        case \"video\":\n            url = `https:\/\/m.bilibili.com\/video\/av${id}`;\n            break;\n            \n        case \"article\":\n            url = `https:\/\/m.bilibili.com\/opus\/${id}`\n            break;\n            \n         case \"forward\":\n             url = `https:\/\/m.bilibili.com\/dynamic\/${id}`\n             break;   \n             \n          case \"user\":\n              url = `https:\/\/m.bilibili.com\/space\/${id}`\n              break;\n              \n          case \"articlelist\":\n              url = `https:\/\/www.bilibili.com\/read\/readlist\/rl${id}`;\n              break      \n              \n          case \"media_bangumi\":\n              url = `https:\/\/m.bilibili.com\/bangumi\/play\/ss${id}`;\n              break\n\t}\n\treturn url\n}\n\n\/\/打开发现链接\nfunction getEapi(type,id,other){\n    let offset = `{\\{if(page==1){source.put(\"nextoffset\",\"\")};source.get(\"nextoffset\");}}`;\n    let url = \"\";\n    switch(type){\n        case \"videolist\":\n            url = `https:\/\/api.bilibili.com\/x\/v2\/medialist\/resource\/list?out_referer=https%3A%2F%2Fspace.bilibili.com%2F&mobi_app=web&type=1&biz_id=${id}&ps=20&desc=true&sort_field=1&oid=${offset}&tid=0&bvid=&otype=2&with_current=false&direction=false&preview=0&use_pn=false&pn={{page}}&web_location=333.1245`;\n            break;\n        case \"space\":\n            let key = other?other.split(\"❌❌\"):[\"\",\"\"]\n            url = `https:\/\/api.bilibili.com\/x\/polymer\/web-dynamic\/v1\/feed\/space${key[0]}?host_mid=${id}&type=all&features=itemOpusStyle,listOnlyfans,opusBigCover,forwardListHidden,decorationCard,commentsNewVersion,onlyfansAssetsV2,ugcDelete,sunflowerStyle,eva3CardOpus,eva3CardVideo,eva3CardComment&page={{page}}&offset=${offset}${key[1]}`;\n            break;\n        case \"seasons_series_list\":\n            url = `https:\/\/api.bilibili.com\/x\/polymer\/web-space\/seasons_series_list?mid=${id}&page_size=20&page_num={{page}}&web_location=333.1387`;\n            break;\n                \n        }\n    \n    return url\n    \n}\n\n\nfunction getVideoQuality(code) {\n    var description = \"\";\n    switch (parseInt(code)) {\n        case 30000:\n            description = \"杜比\";\n            break;\n        case 20000:\n            description = \"4K\";\n            break;\n        case 10000:\n            description = \"原画\";\n            break;\n        case 400:\n            description = \"蓝光\";\n            break;\n        case 250:\n            description = \"超清\";\n            break;\n        case 150:\n            description = \"高清\";\n            break;\n        case 80:\n            description = \"流畅\";\n            break;\n        default:\n            description = \"未知清晰度\";\n    }\n    return description;\n}\n\nfunction getSeachType(type){\n\tlet result;\n\tswitch(type){\n\t\tcase \"1\":\n    \t\tresult= \"番剧\";\n    \t\tbreak;\n\t\tcase \"2\":\n    \t\tresult= \"电影\"\n    \t\tbreak;\n\t\tcase \"3\":\n    \t\tresult= \"纪录片\"\n    \t\tbreak;\n        case \"4\":\n            result= \"国创\"\n            break;\n        case \"5\":\n            result= \"电视剧\"\n            break;\n        case \"7\":\n            result= \"综艺\"\n            break;\n        default:\n            return \"\"\n\t\t}\n\t\treturn \"🎬\"+result\n}\n\nfunction getNodes(nodes){\n\t  const {java} = this;\n\t  let text = \"\";\n      let js;\n    nodes.forEach(node=>{\n        switch(node.type){\n            case \"TEXT_NODE_TYPE_WORD\":\n                text += node.word.words\n            break;\n            case \"TEXT_NODE_TYPE_RICH\":\n                let rich = node.rich;\n                switch(rich.type){\n                    case \"RICH_TEXT_NODE_TYPE_TEXT\":\n                        text += rich.text;\n                    break;\n                    \n                   case \"RICH_TEXT_NODE_TYPE_AT\":\n                       text+=`${this.getClickImg(\"user\",rich.rid)}${rich.text.replace(\/^@\/,'')}`;\n                    break;\n                    \n                    case \"RICH_TEXT_NODE_TYPE_OGV_EP\":\n                    case \"RICH_TEXT_NODE_TYPE_OGV_SEASON\":\n                    case \"RICH_TEXT_NODE_TYPE_AV\":\n                    case \"RICH_TEXT_NODE_TYPE_BV\":\n                        text+=`\\n${this.getClickImg(\"video\",rich.rid)}${rich.text}\\n`;\n                    break;\n                    \n                    case \"RICH_TEXT_NODE_TYPE_CV\":\n                        text+=`${this.getClickImg(\"article\",rich.rid)}${rich.text}`;\n                    break;\n                    \n                    case \"RICH_TEXT_NODE_TYPE_EMOJI\":\n                        text += `<img src=\"${rich.emoji.icon_url},{style:\\\"text\\\"}\">`;\n                    break;\n                    \n                    case \"RICH_TEXT_NODE_TYPE_VIEW_PICTURE\":\n                        let pics = rich.pics;\n                        pics.forEach(pic=>{\n                            text += `<img src=\"${pic.src}\">`\n                        })\n                    break;\n                    \n                    case \"RICH_TEXT_NODE_TYPE_WEB\":\n                        text+=`${this.getClickImg(\"link\",rich.jump_url)}${rich.text}`;\n                    break;\n                    \n                    default:\n                        text += rich?.text??\"\"\n                    break;\n                }\n            break;\n         }\n     })\n    return text\t\n}\n\nfunction getLinkCard(data){\n    const {java} = this;\n    let html = \"\";\n    let d,title,cover,desc,desc1,desc2,url;\n    let type = data.type;\n    switch(type){\n        \/\/视频\n        case \"ADDITIONAL_TYPE_UGC\":\n        case \"LINK_CARD_TYPE_UGC\":\n            d = data.ugc;\n            title = `${this.getClickImg(\"video\",d.id_str)}${d.title}\\n`;\n            cover =  `${this.getClickImg(\"video\",d.id_str,d.cover,1)}\\n`;\n            let duration = \"时长:\"+d.duration;\n            let play = d.desc_second;\n            html += title+cover+duration+\"  \"+play\n            break;\n            \n        case \"ADDITIONAL_TYPE_COMMON\":\n        case \"LINK_CARD_TYPE_COMMON\":\n            d = data.common;\n            title = d.title;\n            desc1 = d.desc1;\n            desc2 = d.desc2;\n            url = d.jump_url\n            cover = `${this.getClickImg(\"link\",url,d.cover,2)}\\n`;\n            html += title+cover+desc1+\"\\n\"+desc2\n        break;\n        \n        case \"ADDITIONAL_TYPE_RESERVE\":\n        case \"LINK_CARD_TYPE_RESERVE\":\n            d = data.reserve;\n            title = d.title;\n            desc1 = d.desc1.text;\n            let status = d.button.status;\n            let t = d.button.type;\n            let button;\n            \n            if(status == 1){\n                button = d.button?.uncheck?.text\n            }else{\n                button = d.button?.check?.text\n            }\n            if(t == 1){\n                button = d.button.jump_style.text;\n            }\n            let svg = `<svg width=\"180\" height=\"80\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><rect x=\"1\" y=\"1\" width=\"178\" height=\"78\" rx=\"4\" fill=\"#50B4E5\" stroke=\"#fff\" stroke-width=\"0.5\"\/><text x=\"${178\/2}\" y=\"${78\/2+12}\" text-anchor=\"middle\"  dominant-baseline=\"middle\" font-family=\"Arial, sans-serif\" font-size=\"35\" font-weight=\"bold\" fill=\"#fff\">${button}<\/text><\/svg>`;\n            svg = 'data:image\/svg+xml;base64,' + java.base64Encode(svg);\n            if(t == 1){\n                cover = this.getClickImg(\"link\",d.button.jump_url,svg,2)\n            }else{\n                cover = this.getClickImg(\"user\",d.up_mid,svg,2)\n            }\n            \n            html += cover+\"\\n\"+title+\"\\n\"+desc1\n            break\n            \n        case \"LINK_CARD_TYPE_OPUS\":\n            \/\/未找到测试样本\n            return type+\"未找到本测试样本,如果你看到这个信息,请把这个详情页链接给我\"\n            break;\n            \n        case \"LINK_CARD_TYPE_ITEM_NULL\":\n            return data..item_null.text\n            \n        default:\n           html = \"\"\n         \n    }\n    return html?\"\\n————————\\n\"+html:html\n}\n\nfunction getMajor(major){\n    const {java} = this;\n    let html = \"\";\n    let js,title,cover,id,desc,t;\n    let type = major.type;\n    switch(type){\n        case \"MAJOR_TYPE_NONE\":\n            return   \"转发动态已失效\"\n        \n        case \"MAJOR_TYPE_UGC_SEASON\":\n        case \"MAJOR_TYPE_ARCHIVE\":\n            let av = major?.archive ?? major.ugc_season;\n            title = av.title;\n            id = av.aid;\n            cover = av.cover;\n            if(typeof cover !== \"string\"){\n                cover = cover.cover\n            }\n            desc = av.desc;\n            t = \"video\"\n        break;\n        \n        case \"MAJOR_TYPE_LIVE\":\n        case \"LINK_CARD_TYPE_LIVE\":\n            return this.generateBadgeSVG(major,\"live\");\n            \n        case \"MAJOR_TYPE_ARTICLE\":\n            let article = major.article;\n            cover = article.covers[0]\n            title = article.title;\n            desc = article.desc;\n            id = article.id;\n            t = \"article\"\n        break;\n            \n        case \"MAJOR_TYPE_DRAW\":\n            let items = major.draw.items;\n            items.forEach(item=>{\n                html += `<img src=\"${item.src}\">`\n            });\n            return html\n        \n        case \"MAJOR_TYPE_MUSIC\":\n        case \"LINK_CARD_TYPE_MUSIC\":\n            return type\n        break;\n        \n        case \"MAJOR_TYPE_COMMON\":\n            return this.generateBadgeSVG(major)\n        \n        \/*\n        case \"MAJOR_TYPE_MUSIC\":\n            return type\n        break;\n        *\/\n        case \"MAJOR_TYPE_OPUS\":\n            let opus = major.opus.summary;\n            let rich_text_nodes = opus.rich_text_nodes;\n            let pics = major.opus?.pics || [];\n            \n            rich_text_nodes?rich_text_nodes.forEach(node=>{\n\t  \t    let nodes = [{}];\n\t  \t    nodes[0].type = \"TEXT_NODE_TYPE_RICH\";\n\t  \t    nodes[0].rich = node;  \n   \t    html += this.getNodes(nodes); \t    \n\t  \t}):null;\n          pics.forEach(x=>{\n                html += `<img src=\"${x.url}\">`\n            })\n          return html\n          \n          default:\n              return type+\"\\n\"+JSON.stringify(major)\n    }\n    \n       html +=`\\n${this.getClickImg(t,id)}${title}\\n`;\n       js = {\n               type : t,\n               js:`book?getLinkIcon(\"${t}\",\"${id}\",result):result`\n              }\n              html += cover?`\\n${this.getClickImg(t,id,cover,1)}\\n`:\"\";\n              html += desc\n    return html\n}\n\n\n\nfunction getDynamicType(type){\n\tswitch(type){\n\t\tcase \"DYNAMIC_TYPE_AV\":\n\t\treturn \"🎥\"\n\t\tcase \"DYNAMIC_TYPE_UGC_SEASON\":\n\t\treturn \"🗂\"\n\t\tcase \"DYNAMIC_TYPE_ARTICLE\":\n\t\treturn \"📖\"\n\t\tcase \"DYNAMIC_TYPE_LIVE\":\n\t\treturn \"📺\"\n\t\tcase \"DYNAMIC_TYPE_DRAW\":\n\t\treturn \"🖼\"\n\t\tcase \"DYNAMIC_TYPE_WORD\":\n\t\treturn \"📝\"\n\t\tdefault:\n\t\treturn \"\"\n\t\t}\n\t}\n    \n    \nfunction getDynamicUrl(type,json){\n\tconst {java} = this;\n\tlet url;\n    \n\tswitch(type){\n\t\t\/\/转发\n        case \"DYNAMIC_TYPE_COMMON_SQUARE\":\n        case  \"DYNAMIC_TYPE_FORWARD\":\n            url = this.getApi(\"forward\",this.S(\"$.id_str\"),this.S(\"$.id_str\"))\n    \t\tbreak;\n         \n         \/\/视频   \n        case  \"DYNAMIC_TYPE_AV\":\n\t\tcase \"DYNAMIC_TYPE_UGC_SEASON\":\n            url = this.getApi(\"video\",this.S(\"$.modules..major..aid\"));\n            break;\n            \n\t\t\/\/专栏\n\t\tcase \"DYNAMIC_TYPE_ARTICLE\":\n            url = this.getApi(\"article\",this.S(\"$.basic.comment_id_str\"),this.S(\"$.id_str\"))\n\t\tbreak;\n\t\t\n\t\t\/\/直播间分享\n\t\tcase \"DYNAMIC_TYPE_LIVE\":\n            java.toast(\"未找到样本测试,如果你看到这个信息,请把复制详情页链接给我\");\n            return \"未找到样本测试,如果你看到这个信息,请把复制详情页链接给我\"\n\t\tbreak;\n\t\t\n\t\t\/\/直播开播\n\t\tcase \"DYNAMIC_TYPE_LIVE_RCMD\":\n            let uid = this.S(\"$..major.live_rcmd.content\").match(\/\"uid\":(\\d+)\/)[1];\n            url = this.getApi(\"live\",uid);\n\t\tbreak;\n\t\t\n\t\t\/\/其他动态\n\t\t\/*\n\t\tcase \"DYNAMIC_TYPE_DRAW\":\n\t\tcase \"DYNAMIC_TYPE_WORD\":\n\t\t*\/\n        \n\t\tdefault:\n            url = this.getApi(\"opus\",this.S(\"$.id_str\"),this.S(\"$.id_str\"))\n\t\tbreak\n\t\t}\n        return url\n\t}\n    \nfunction generateBadgeSVG(data,type) {\n  const {java} = this;\n  data = data?.common ?? data?.live\n  let badge = data.badge;\n  let jstext;\n  let width = 180;\n  let height = 80;\n  let borderRadius = 4;\n  \n  let textX = width \/ 2;\n  let textY = height \/ 2+12;\n  \n  let svg = `\n<svg width=\"${width}\" height=\"${height}\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n  <!-- 背景矩形 -->\n  <rect\n    x=\"1\"\n    y=\"1\"\n    width=\"${width - 2}\"\n    height=\"${height - 2}\"\n    rx=\"${borderRadius}\"\n    fill=\"${badge.bg_color}\"\n    stroke=\"#fff\"\n    stroke-width=\"0.5\"\n  \/>\n  \n  <text\n    x=\"${textX}\"\n    y=\"${textY}\"\n    text-anchor=\"middle\"\n    dominant-baseline=\"middle\"\n    font-family=\"Arial, sans-serif\"\n    font-size=\"35\"\n    font-weight=\"bold\"\n    fill=\"${badge.color}\"\n  >\n    ${badge.text}\n  <\/text>\n<\/svg>`;\n\nif(!type)type = \"link\";\nlet id = type==\"live\"?data.id:data.jump_url;\n   svg = 'data:image\/svg+xml;base64,' + java.base64Encode(svg);\n   let img = `\\n${this.getClickImg(type,id,svg,2)}标题:${data.title}\\n详细:${data.desc??data.desc_second}\\n${this.getClickImg(type,id,data.cover,1)}\\n`\n  return img\n}\n\n    \nfunction getReply(oid,type,mode){\n    const {java} = this;\n\tlet queryJson = `{oid:\"${oid}\",type:${type},mode:${mode},plat:1,web_location:1315875,pagination_str:JSON.stringify({\"offset\":source.get(\"nextoffset\")})}`;\n\tlet u = `https:\/\/api.bilibili.com\/x\/v2\/reply\/wbi\/main?{{if(page==1){source.put(\"nextoffset\",\"\")};getWbiEnc(${queryJson})}}`;\n\treturn u\n\t}\n\nfunction getOpus(mid,type){\n\tlet queryJson = `{host_mid:${mid},page:page,offset:source.get(\"nextoffset\"),type:\"${type}\",\"web_location\":333.1387}`;\n         let u = `https:\/\/api.bilibili.com\/x\/polymer\/web-dynamic\/v1\/opus\/feed\/space?{\\{if(page==1){source.put(\"nextoffset\",\"\")};getWbiEnc(${queryJson})}}`;    \n        return u\n\t}\n\t\nfunction getType(){\n\tlet type;\n\tif(\/📖\/.test(this.M(\"点击或长按UP主\"))){\n\t\t\ttype = \"article\"\n\t\t}else{\n            type = \"video\"\n        }\n     return type\n\t}\n  \n  \/\/类型,id,图片链接,样式\nfunction getClickImg(type,id,src,s,t){\n    const {java} = this;\n    let jstext;\n    \n    if(src){\n        jstext = `book?getLinkIcon(\"${t??type}\",\"${id}\"):result`\n    }else{\n        src=`data:image\/svg+xml;base64,`;\n        jstext = `book?getLinkIcon(\"${t??type}\",\"${id}\"):getSvg(\"${type}\")`\n    }\n   if(s==1){\n       s = \"full\"\n   }else if(s==2){\n       s = \"default\"\n   }\n    let js = {\n        type : type,\n        js:jstext,\n        style:s??\"text\"\n       }\n     let img =  `<img src=\"${src},${JSON.stringify(js)}\">`\n     return img\n}\n\nfunction processHtml(str){\n    const {java} = this;\n    let doc = org.jsoup.Jsoup.parse(str);\n    let link,js;\n    if (!doc) {\n        return str;\n    }\n     var atag = doc.select(\"a\");\n     for (var i = 0; i < atag.size(); i++) {\n         var e = atag.get(i);\n         let link = e.attr(\"href\");\n         let text = e.text()?e.text(\"网页链接\"):e.text();\n         let img =this.getClickImg(\"link\",link)+text;\n         img = img.replace(\/{.*}\/,function (match){\n             return match.replace(\/\"\/g,'&quot;')\n         });\n        \n        e.html(img);\n         \n        }\n        \n        var videocard = doc.select(\".video-card,.article-card\");\n        for (var i = 0; i < videocard.size(); i++) {\n            var e = videocard.get(i);\n            let aa = \"\";\n            let type =  \/video\/.test(e.attr(\"class\"))?\"video\":\"article\";\n            let link = e.attr(\"aid\");\n            if(\/,\/.test(link)){\n                let linkl = link.split(\",\");\n                linkl.forEach(x=>{\n                    aa+=this.getClickImg(type,x)+x+\"<br>\";\n                });\n                e.before(aa.replace(\/\"\/g,'&quot;'))\n            }else{\n             let img = this.getClickImg(type,link,e.attr(\"src\"),1);\n             img = img.match(\/src=\"(.*)\"\/)[1];\n             e.attr(\"src\",img);\n             }\n             \n         }\n         let result = String(doc.toString()).replace(\/<\\\/img>\/g,'')\n         return result\n}\n  \nfunction processDelta(data) {\n\tconst {java} = this\n    try {\n        if (!data || !Array.isArray(data)) {\n            return \"无效的数据格式\";\n        }\n        var html = \"\";\n        var prevText = \"\";\n        var js;\n        for (var i = 0; i < data.length; i++) {\n            var item = data[i];\n            var currenttext = \"\";\n            var insert = item.insert;\n            \n            if (insert) {\n                if (typeof insert === \"string\") {\n                    \n                    var attr = item.attributes ?? {};                   \n                        if (attr.link) {\n                            html += `${this.getClickImg(\"link\",attr.link)}${insert}`\n                        }else{\n                        html += insert\n                    }\n                }else if(typeof insert == \"object\"){                 \n                    let image = insert[\"native-image\"];\n                    if(image){                \t\t\t\n                        html += `<img src=\"${image.url}\">\\n`\n                \t}\n                    \n                    let cut_off = insert[\"cut-off\"];\n                    if(cut_off){\n                        html += \"\\n&lrm;\\n\";\n                    }\n                \t\t\n                    let article_card = insert[\"article-card\"];\n                    if(article_card){\n                        html += `${this.getClickImg(\"article\",article_card.id,article_card.url,1)}\\n`\n                      }\n                      \n                      let video_card = insert[\"video-card\"];\n                \t  if(video_card){\n                \t\t\thtml += `${this.getClickImg(\"video\",video_card.id,video_card.url,1)}\\n`\n                \t  }\n                }\n            }\n        }\n        return html;\n        \n    } catch (error) {\n        java.log(\"构建HTML时出错: \" + error);\n        return \"处理数据时发生错误\";\n    }\n}\n\n\nfunction M(e){\n    const {source} = this;\n    let m = source.getLoginInfoMap();\n    return String(m[e])\n\t}\n    \nfunction liveToUser(url){\n    const {java} = this;\n    let uid = JSON.parse(java.ajax(url)).data.uid;\n    return this.getApi(\"live\",uid);\n}\n\nfunction getLinkIcon(type,link){\n\t  const {java} = this\n      \n      let url = \"\";\n        switch(type){\n            case \"link\":\n                java.startBrowser(link, \"\");\n                return;\n                \n            case \"live\":\n                url = `https:\/\/api.live.bilibili.com\/room\/v1\/Room\/get_info?room_id=${link}`;\n                url = this.liveToUser(url);\n                break;\n                \n            case \"video\":\n                let aid = link.includes(\"BV1\")?String(bv2av(link)):link;\n             \/\/   java.log(aid)\n                url = this.getApi(type,aid)\n                break;\n                \n            case \"article\":\n                url = this.getApi(type,link,link)\n                break;\n                \n            case \"articlelist\":\n                url = \"https:\/\/api.bilibili.com\/x\/article\/list\/web\/articles?id=\"+link;\n                \n                break\n                \n            case \"user\":\n                 url = this.getApi(type,link)\n                 break\n        }\n        if(\/\"js\"\/.test(url)){\n            let u = url.match(\/,{\"js\".*\/)[0].replace(\/\"}\/,'\",origin:\\\"哔哩哔哩\\\"}');\n            url = url.replace(\/,{\"js\".*\/,'')+u;\n            \n            url = \"legado:\/\/import\/addToBookshelf?src=\"+encodeURIComponent(url)\n\n            \n        }else{\n        \n        \n        url = \"legado:\/\/import\/addToBookshelf?src=\"+encodeURIComponent(url)+\",{origin:\\\"哔哩哔哩\\\"}\";\n        }\n        java.openUrl(url);\n        return;\n}\n\nfunction getSvg(type){\n    const {java} = this;\n    let t = \"🔗\";\n    if(type == \"link\")t = \"🔗\";;\n    if(type ==\"video\")t=\"🎥\";\n    if(type == \"article\")t=\"📖\";\n    if(type==\"user\")t=\"👤\";\n    let svg = `\n  <svg width=\"32\" height=\"32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\">\n    <text x=\"16\" y=\"27\" font-family=\"Roboto Condensed\" text-anchor=\"middle\" dominant-baseline=\"middle\" font-size=\"24\" font-weight=\"bold\" fill=\"#555\">\n    ${t}\n    <\/text>\n  <\/svg>`;\n  \n    return \"data:image\/svg+xml;base64,\" + java.base64Encode(svg);\n}\n\nfunction getIs(type){\n\tconst {java,chapter,cache,book} = this;\n    let url,name,data,mid,is_followed,bmid;\n   \n    if(book){\n        is_followed = \"\";\n        mid = String(cache.get(\"mid\"));\n        bmid = String(book.getVariable(\"mid\"));\n        mid = bmid?bmid:mid\n        if(mid){\n            url = this.getApi(\"user\",mid);\n            is_followed = String(JSON.parse(java.ajax(url)).data.is_followed);\n            if(is_followed == \"true\"){\n                name = \"🆙 已关注\";\n                cache.put(\"up\",1)\n            }else{\n                name = \"🆙 关注\"\n                cache.put(\"up\",0)\n            }\n       }\n    \n\tif(chapter){\n       let aid = this.b64D(chapter.url).split(\"&\")[0];\n       switch(type){\n       \t      case \"like\":\n       \t           url = \"https:\/\/api.bilibili.com\/x\/web-interface\/archive\/has\/like?aid=\"+aid;\n                      data = JSON.parse(java.ajax(url)).data;\n                      if(data == 1){\n                          name = \"👍🏻 已点赞\"\n                          cache.put(\"like\",1,300)\n                      }else{\n                          name = \"👍🏻 点赞\"\n                          cache.put(\"like\",0,300)\n                      }\n       \t      break\n       \t      case \"coin\":\n                      url = \"https:\/\/api.bilibili.com\/x\/web-interface\/archive\/coins?aid=\"+aid;\n                      data = JSON.parse(java.ajax(url)).data.multiply;\n                      cache.put(\"coin\",data,300)\n                      if(data == 0){\n                          name = \"🪙 投币\"                  \n                      }else{\n                          name = \"🪙 已投\"+data+\"枚\"\n                      }\n       \t      break\n       \t      case \"fav\":\n                     url = \"https:\/\/api.bilibili.com\/x\/v2\/fav\/video\/favoured?aid=\"+aid;\n                      data = JSON.parse(java.ajax(url)).data.favoured;\n                      if(data == true){\n                          name = \"⭐️ 已收藏\"\n                          cache.put(\"fav\",1,300)\n                      }else{\n                          name = \"⭐️ 收藏\"\n                          cache.put(\"fav\",0,300)\n                      }\n       \t}\n         }  \n\t}\nreturn name\t\n\t}\n    \nfunction b64D(s){\n\t\tconst {java} = this;\n\t\t  let str = s.match(\/base64,(.*?),\/)[1];\n\t\t  return String(java.base64Decode(str))\n}\n\nfunction S(s){\n\tconst {java} = this;\n\treturn String(java.getString(s))\n}\n\n\n\/*\nconst XOR_CODE = 23442827791579n; const MASK_CODE = 2251799813685247n; const MAX_AID = 1n << 51n; const BASE = 58n; const data = 'FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf';\n\n function av2bv(aid) { const bytes = ['B', 'V', '1', '0', '0', '0', '0', '0', '0', '0', '0', '0']; let bvIndex = bytes.length - 1; let tmp = (MAX_AID | BigInt(aid)) ^ XOR_CODE; while (tmp > 0) { bytes[bvIndex] = data[Number(tmp % BigInt(BASE))]; tmp = tmp \/ BASE; bvIndex -= 1; } [bytes[3], bytes[9]] = [bytes[9], bytes[3]]; [bytes[4], bytes[7]] = [bytes[7], bytes[4]]; return bytes.join(''); }\n \nfunction bv2av(bvid) { const bvidArr = Array.from(bvid); [bvidArr[3], bvidArr[9]] = [bvidArr[9], bvidArr[3]]; [bvidArr[4], bvidArr[7]] = [bvidArr[7], bvidArr[4]]; bvidArr.splice(0, 3); const tmp = bvidArr.reduce((pre, bvidChar) => pre * BASE + BigInt(data.indexOf(bvidChar)), 0n); return Number((tmp & MASK_CODE) ^ XOR_CODE); } \n\n*\/\n\nconst XOR_CODE = 23442827791579; const MASK_CODE = 2251799813685247; const MAX_AID = 2251799813685248; const BASE = 58; const data = 'FcwAPNKTMug3GV5Lj7EJnHpWsx4tb8haYeviqBz6rkCy12mUSDQX9RdoZf'; function av2bv(aid) { var bytes = ['B','V','1','0','0','0','0','0','0','0','0','0']; var bvIndex = 11; var aidNum = Number(aid); var tmp = bitwiseXor(bitwiseOr(MAX_AID, aidNum), XOR_CODE); while (tmp > 0) { bytes[bvIndex] = data[tmp % BASE]; tmp = Math.floor(tmp \/ BASE); bvIndex--; } var temp = bytes[3]; bytes[3] = bytes[9]; bytes[9] = temp; temp = bytes[4]; bytes[4] = bytes[7]; bytes[7] = temp; return bytes.join(''); } function bv2av(bvid) { var bvidArr = bvid.split(''); var temp = bvidArr[3]; bvidArr[3] = bvidArr[9]; bvidArr[9] = temp; temp = bvidArr[4]; bvidArr[4] = bvidArr[7]; bvidArr[7] = temp; bvidArr.splice(0, 3); var tmp = 0; for (var i = 0; i < bvidArr.length; i++) { tmp = tmp * BASE + data.indexOf(bvidArr[i]); } return bitwiseXor(bitwiseAnd(tmp, MASK_CODE), XOR_CODE); } function bitwiseOr(a, b) { var highA = Math.floor(a \/ 4294967296); var lowA = a & 4294967295; var highB = Math.floor(b \/ 4294967296); var lowB = b & 4294967295; var resultHigh = highA | highB; var resultLow = lowA | lowB; return resultHigh * 4294967296 + resultLow; } function bitwiseAnd(a, b) { var highA = Math.floor(a \/ 4294967296); var lowA = a & 4294967295; var highB = Math.floor(b \/ 4294967296); var lowB = b & 4294967295; var resultHigh = highA & highB; var resultLow = lowA & lowB; return resultHigh * 4294967296 + resultLow; } function bitwiseXor(a, b) { var highA = Math.floor(a \/ 4294967296); var lowA = a & 4294967295; var highB = Math.floor(b \/ 4294967296); var lowB = b & 4294967295; var resultHigh = highA ^ highB; var resultLow = lowA ^ lowB; return resultHigh * 4294967296 + resultLow; }\n\n\n  \nfunction danmakuToLRC(xmlString, options = {}) {\n  let {\n    sortByTime = true,      \n    timeFormat = 's',       \n    includeMeta = true,     \n    escapeChars = true \n  } = options;\n  \n  let danmakuPattern = new RegExp('<d\\\\s+p=\"([^\"]+)\">(.*?)<\/d>', 'g');\n  let danmakus = [];\n  let match;\n  \n  while ((match = danmakuPattern.exec(xmlString)) !== null) {\n    let pAttribute = match[1];\n    let textContent = match[2];\n    let parts = pAttribute.split(',');\n    \n    if (parts.length >= 9) {\n      let time = parseFloat(parts[0]);  \n      let text = escapeChars \n        ? textContent.replace(\/\\[\/g, '【').replace(\/\\]\/g, '】')\n        : textContent;\n      \n      danmakus.push({ time, text });\n    }\n  }\n  \n  if (sortByTime) {\n    danmakus.sort((a, b) => a.time - b.time);\n  }\n  \n  let lrcContent = '';\n  \n  if (includeMeta) {\n    lrcContent += '[ti:弹幕歌词]\\n';\n    lrcContent += '[ar:Bilibili弹幕]\\n';\n    lrcContent += `[re:共${danmakus.length}条弹幕]\\n`;\n    lrcContent += `[by:danmaku-to-lrc ${new Date().toISOString().split('T')[0]}]\\n\\n`;\n  }\n  \n  danmakus.forEach((danmaku, index) => {\n    let timeTag = '';\n    let minutes,seconds;\n    if (timeFormat === 'ms') {\n      let totalMs = danmaku.time * 1000;\n      minutes = Math.floor(totalMs \/ 60000);\n      seconds = Math.floor((totalMs % 60000) \/ 1000);\n      let milliseconds = Math.floor(totalMs % 1000);\n      timeTag = `[${minutes.toString().padStart(2, '0')}:${seconds.toString().padStart(2, '0')}.${milliseconds.toString().padStart(3, '0')}]`;\n    } else {\n      minutes = Math.floor(danmaku.time \/ 60);\n      seconds = danmaku.time % 60;\n      timeTag = `[${minutes.toString().padStart(2, '0')}:${seconds.toFixed(2).padStart(5, '0')}]`;\n    }\n    \n    lrcContent += `${timeTag}${danmaku.text}\\n`;\n  });\n  \n  return lrcContent;\n}\n\nfunction modifyDanmaku(xmlStr, fontSize) {\n    if (!xmlStr) return xmlStr;\n    var size = Math.max(1, parseInt(fontSize) || 25);\n    return xmlStr.replace(\n        \/<d p=\"([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+),([^,]+)\">\/g,\n        function(match, t1, t2, t3, t4, t5, t6, t7, t8, t9) {\n            \n            return `<d p=\"${t1},${t2},${size},${t4},${t5},${t6},${t7},${t8},${t9}\">`;\n        }\n    );\n}\n\nfunction generateMPD(Data) {\n    \n    let video = Data.video;\n    let videoData;\n    \n    \n    for(let i=1;i<video.length;i++){\n    \tif(video[i].codecid === 7){\n            \n    \t\tvideoData = video[i];\n    \t\tbreak\n\t\t}\n\t}\n    \n    let audioData = Data.audio[1];\n    let duration = Data.duration;\n    const videoBaseUrl = videoData.baseUrl;\n    const audioBaseUrl = audioData.baseUrl;\n    \n    const videoSegmentBase = videoData.segment_base || videoData.SegmentBase;\n    const audioSegmentBase = audioData.segment_base || audioData.SegmentBase;\n    \n    const videoInitRange = videoSegmentBase.initialization || videoSegmentBase.Initialization;\n    const videoIndexRange = videoSegmentBase.index_range || videoSegmentBase.indexRange;\n    \n    const audioInitRange = audioSegmentBase.initialization || audioSegmentBase.Initialization;\n    const audioIndexRange = audioSegmentBase.index_range || videoSegmentBase.indexRange;\n    \n    \/\/ 将duration格式化为ISO 8601持续时间格式\n    \/\/ duration应为秒数,格式化为PTxS格式\n    const durationStr = \"PT\" + duration + \"S\";\n    \n    const mpdContent = `<MPD xmlns=\"urn:mpeg:dash:schema:mpd:2011\" profiles=\"urn:mpeg:dash:profile:full:2011\" type=\"static\" mediaPresentationDuration=\"${durationStr}\" minBufferTime=\"PT1.5S\">\n    <Period id=\"0\" start=\"PT0.0S\">\n        <AdaptationSet id=\"0\" contentType=\"video\" width=\"${videoData.width}\" height=\"${videoData.height}\" frameRate=\"${videoData.frameRate || videoData.frame_rate}\" par=\"${videoData.sar}\" segmentAlignment=\"true\">\n            <Representation id=\"${videoData.id}\" bandwidth=\"${videoData.bandwidth}\" codecs=\"${videoData.codecs}\" mimeType=\"${videoData.mimeType || videoData.mime_type}\">\n                <BaseURL>${videoBaseUrl.replace(\/&\/g,'&amp;')}<\/BaseURL>\n                <SegmentBase indexRange=\"${videoIndexRange}\">\n                    <Initialization range=\"${videoInitRange}\"\/>\n                <\/SegmentBase>\n            <\/Representation>\n        <\/AdaptationSet>\n        <AdaptationSet id=\"1\" contentType=\"audio\" segmentAlignment=\"true\">\n            <Representation id=\"${audioData.id}\" bandwidth=\"${audioData.bandwidth}\" codecs=\"${audioData.codecs}\" mimeType=\"${audioData.mimeType || audioData.mime_type}\">\n                <BaseURL>${audioBaseUrl.replace(\/&\/g,'&amp;')}<\/BaseURL>\n                <SegmentBase indexRange=\"${audioIndexRange}\">\n                    <Initialization range=\"${audioInitRange}\"\/>\n                <\/SegmentBase>\n            <\/Representation>\n        <\/AdaptationSet>\n    <\/Period>\n<\/MPD>`;\n    \n    return mpdContent;\n}\n\nfunction formatTimeDynamic(totalSeconds) {\n  const hours = Math.floor(totalSeconds \/ 3600);\n  const remainingSeconds = totalSeconds % 3600;\n  const minutes = Math.floor(remainingSeconds \/ 60);\n  const seconds = remainingSeconds % 60;\n  \n  const parts = [];\n  \n  if (hours > 0) {\n    parts.push(hours.toString().padStart(2, '0'));\n  }\n  \n  \/\/ 如果有小时,分钟必须是2位\n  if (hours > 0) {\n    parts.push(minutes.toString().padStart(2, '0'));\n  } else {\n    parts.push(minutes.toString()); \/\/ 不足1小时,分钟不需要补0\n  }\n  \n  parts.push(seconds.toString().padStart(2, '0'));\n  \n  return parts.join(':');\n}\n\nfunction formatCount(count) {\n  if (count < 10000) return count.toString();  \n  const inWan = (count \/ 10000).toFixed(2);\n  return inWan.endsWith('.00') \n    ? `${inWan.split('.')[0]}万` \n    : `${inWan}万`;\n}\n\n function getWbiEnc(queryJson) {\n     const {java} = this;\n    const mixinKeyEncTab = [\n        46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49,\n        33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40,\n        61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11,\n        36, 20, 34, 44, 52\n    ];\n\n    \/\/ 对 imgKey 和 subKey 进行字符顺序打乱编码\n    function getMixinKey(orig) {\n        let temp = '';\n        mixinKeyEncTab.forEach((n) => {\n            temp += orig[n]\n        });\n        return temp.slice(0, 32);\n    }\n\n    \/\/ 为请求参数进行 wbi 签名\n    function encWbi(params, img_key, sub_key) {\n        const mixin_key = getMixinKey(img_key + sub_key),\n            curr_time = Math.round(Date.now() \/ 1000),\n            chr_filter = \/[!'\\(\\)*]\/g\n        let query = [];\n        params = Object.assign(params, { wts: curr_time });    \/\/ 添加 wts 字段\n        \/\/ 按照 key 重排参数\n        Object.keys(params).sort().forEach((key) => {\n            query.push(\n                encodeURIComponent(key) +\n                '=' +\n                \/\/ 过滤 value 中的 \"!'()*\" 字符\n                encodeURIComponent(('' + params[key]).replace(chr_filter, ''))\n            )\n        })\n        query = query.join('&');\n        const wbi_sign =String(java.md5Encode(query + mixin_key)); \/\/ 计算 w_rid\n        return query + '&w_rid=' + wbi_sign;\n    }\n\n    \/\/ 获取最新的 img_key 和 sub_key\n    function getWbiKeys() {\n        const json_content = JSON.parse(java.ajax('https:\/\/api.bilibili.com\/x\/web-interface\/nav')).data;\n        let img_url = json_content.wbi_img.img_url;\n        let sub_url = json_content.wbi_img.sub_url;\n        return {\n            img_key: img_url.substring(img_url.lastIndexOf('\/') + 1, img_url.length).split('.')[0],\n            sub_key: sub_url.substring(sub_url.lastIndexOf('\/') + 1, sub_url.length).split('.')[0]\n        }\n    }\n\n    const wbi_keys = getWbiKeys();\n\n    const query = encWbi(\n        queryJson,\n        wbi_keys.img_key,\n        wbi_keys.sub_key\n    );\n    return query;\n}\n",
    "lastUpdateTime": "1766668358607",
    "loginCheckJs": "if(typeof java.readBookConfig == \"undefined\"){\tjava.startBrowser(\"https:\/\/loyc.xyz\/c\/legado.html#download\", \"下载阅读Σ\");\n\tjava.longToast(\"本书源只支持最新版洛雅橙改版阅读Σ\\n请安装后重新导入书源\")\n\t}\nresult",
    "loginUi": "@js:\nlet d= [];\nlet all = [\n {\n        \"name\": \"模式\",\n        \"type\": \"select\",\n        \"action\":\"test()\",\n        \"chars\": [\"🎥 视 频\", \"🎧 音 频\"],\n        \"default\": \"🎥 视 频\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.3\n           }\n    },\n    {\n        \"name\": \"点击长按UP主\",\n        \"type\": \"select\",\n        \"chars\": [\"🎬 显示视频\", \"📖 显示专栏\"],\n        \"default\": \"🎬 显示视频\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.5\n           }\n      },  {\n        \"name\": \"👤登录\",\n        \"type\": \"button\",\n        \"action\": \"toLogin()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": (!book && !chapter)?0.2:1\n           }\n    }]\n  \nlet mid = String(cache.get(\"mid\"));\nif(book && !chapter){\n\tlet bmid = String(book.getVariable(\"mid\"));\n\tmid = bmid?bmid:mid;\n    if(mid){\n        all.push({\n            \"name\": \"🆙 关注\",\n           \"viewName\": `getIs()`,\n           \"action\":`toLcf('up',\"${mid}\")`,\n           \"type\": \"button\",\n           \"style\": {\n               \"layout_flexGrow\": 1,\n               \"layout_flexBasisPercent\": 0.4\n           }\n       },{\n            \"name\": \"🆙加入书架\",\n           \"action\":`addShlef(\"${mid}\")`,\n           \"type\": \"button\",\n           \"style\": {\n               \"layout_flexGrow\": 1,\n               \"layout_flexBasisPercent\": 0.4\n           }\n       })\n    }\n}\n\nif(chapter){\n\t  if(!\/x\\\/article|data:liveurl\/.test(chapter.url)){\n          let mymid = JSON.parse(java.ajax(\"https:\/\/api.bilibili.com\/x\/web-interface\/nav\"))?.data?.mid || \"\";\n          if(mymid!=\"\"){\n          let button = [{\n              \"name\": \"当前视频:\"+chapter.title,\n              \"type\": \"text\"\n             },\n             {\n                 \"name\": \"👍🏻 点赞\",\n                 \"viewName\": `getIs('like')`,\n                 \"action\":\"toLcf('like')\",\n                 \"type\": \"button\",\n                 \"style\": {\n                     \"layout_flexGrow\": 1,\n                     \"layout_flexBasisPercent\": 0.25\n                    }\n                },\n                {\n                    \"name\": \"⭐️ 收藏\",\n                    \"viewName\": `getIs('fav')`,\n                    \"type\": \"button\",\n                    \"action\":\"toLcf('fav')\",\n                    \"style\": {\n                        \"layout_flexGrow\": 1,\n                        \"layout_flexBasisPercent\": 0.25\n                     }\n                 },\n                 {\n                     \"name\": \"🪙 投币\",\n                     \"viewName\": `getIs('coin')`,\n                     \"type\": \"button\",\n                     \"action\":\"toLcf('coin')\",\n                     \"style\": {\n                         \"layout_flexGrow\": 1,\n                         \"layout_flexBasisPercent\": 0.25\n                      }\n                   },\n                   {\n                       \"name\": \"一👍🏻键🪙三⭐️连\",\n                       \"action\": `toLcf('all')`,\n                       \"type\": \"button\",\n                       \"style\": {\n                           \"layout_flexGrow\": 1,\n                           \"layout_flexBasisPercent\": 1\n                          }\n                      }]\n                      all = all.concat(button)\n           }\n      }\n}\n\nif(!book && !chapter){\n    all.push({\n        \"name\": \"关注分组\",\n        \"type\": \"toggle\",\n        \"chars\": [\"❎\", \"☑️\"],\n        \"default\": \"❎\",\n        \"action\":\"source.refreshExplore()\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n           }\n    },{\n        \"name\": \"收藏夹\",\n        \"type\": \"toggle\",\n        \"chars\": [\"❎\", \"☑️\"],\n        \"action\":\"source.refreshExplore()\",\n        \"default\": \"❎\",\n        \"style\": {\n            \"layout_flexGrow\": 1,\n            \"layout_flexBasisPercent\": 0.2\n           }\n    });\n    \n\tall.push({\n            \"name\": \"1🎬番剧,2🎥电影,3🎞纪录片,4🇨🇳国创,5📺电视剧,6🍿综艺 [显示]\",\n            \"default\":\"123456\",\n            \"type\": \"text\",\n            \n            \"style\": {\n                \"layout_flexGrow\": 1,          \n                \"layout_flexBasisPercent\": 1\n               }\n        });\n        d = [{\n            \"name\": `🔁排序`,\n            \"type\": \"select\",\n           \n            \"chars\": [\"更新时间\", \"弹幕数量\", \"播放数量\",\"追剧人数\",\"最高评分\",\"开播时间\",\"上映时间\"],\n            \"default\": \"追剧人数\",\n            \"style\": {\n                \"layout_flexGrow\": 1,          \n                \"layout_flexBasisPercent\": 0.4,\n                \"layout_justifySelf\": \"flex_end\"\n               }\n        },{\n            \"name\": `💰付费`,\n            \"type\": \"select\",\n           \n            \"chars\": [\"全部\", \"免费\",\"付费\", \"大会员\"],\n            \"default\": \"全部\",\n            \"style\": {\n                \"layout_flexGrow\": 1,          \n                \"layout_flexBasisPercent\": 0.4,\n                \"layout_justifySelf\": \"flex_end\"\n               }\n        }];\n        \nfunction createFilterFromData(typeKey, namePrefix, fenleiData, f, icon) {\n    const dataArray = [];\n    (fenleiData[f] ?? []).forEach(x => {\n        dataArray.push(x.n);\n    });\n    if (dataArray.length) {\n        d.push({\n            \"name\": icon + namePrefix,\n            \"type\": \"select\",\n            \"chars\": dataArray,\n            \"default\": \"全部\",\n            \"style\": {\n                \"layout_flexGrow\": 1,\n                \"layout_flexBasisPercent\": 0.4,\n                \"layout_justifySelf\": \"flex_end\"\n            }\n        });\n    }\n}\n\nfenlei[\"类型\"].forEach((f, i) => {\n    const icon = fenlei[\"图标\"][i];\n    createFilterFromData(\"出品\", \"出品\", fenlei[\"出品\"], f, icon);\n    createFilterFromData(\"状态\", \"状态\", fenlei[\"状态\"], f, icon);\n    createFilterFromData(\"版权\", \"版权\", fenlei[\"版权\"], f, icon);\n    createFilterFromData(\"类别\", \"类别\", fenlei[\"类别\"], f, icon);\n    createFilterFromData(\"地区\", \"地区\", fenlei[\"地区\"], f, icon);\n    createFilterFromData(\"年份\", \"年份\", fenlei[\"年份\"], f, icon);\n});\n}\nall = all.concat(d)\nresult = JSON.stringify(all);\nsource.putLoginInfo(result);\nresult",
    "loginUrl": "function login(){\n\tsource.refreshExplore();\n\t}\n\nfunction addShlef(id,type){\n\tgetLinkIcon(\"user\",id)\n\t}\n\t\n\t\nfunction toLogin(){\n\tlet url = \"https:\/\/www.bilibili.com\";\n\tcookie.setCookie(url,\"\")\n  java.startBrowser(url,\"登录\");\n\t}\n\nfunction toLcf(type,mid){\n\tlet url,name,data,aid;\n    try{\t\n       let info = source.getLoginInfoMap();\n       let csrf = String(cookie.getKey(\"https:\/\/www.bilibili.com\",\"bili_jct\"));\n       let b64 = chapter?chapter.url:\"\";\n       let aid = b64?this.b64D(b64).split(\"&\")[0]:\"\";\n       let isLcy = Number(cache.get(type));\n       \n       switch(type){\n       \t      case \"like\":\n       \t           isLcy = isLcy==1?2:1       \t            \n       \t           url = \"https:\/\/api.bilibili.com\/x\/web-interface\/archive\/like,\"+JSON.stringify({\n                          \"method\":\"POST\",\n                          \"body\":\"aid=\"+aid+\"&like=\"+isLcy+\"&csrf=\"+ csrf\n                      });\n                      data = java.ajax(url);\n                      code = JSON.parse(data).code;\n                      if(code == 0){\n                      \t   if(isLcy == 2){\n                      \t   \t    info[\"👍🏻 点赞\"] = \"👍🏻 点赞\";\n                      \t   \t    java.toast(\"已取消点赞\");\n                      \t   \t    cache.put(type,0,300)\n                      \t   \t}else if(isLcy == 1){\n                      \t   \t\t   info[\"👍🏻 点赞\"] = \"👍🏻 已点赞\";\n                                        java.toast(\"已点赞\");\n                                        cache.put(type,1,300)\n                       \t\t}\n                      }else if(code == 65004){\n                      \t   \t    code = JSON.parse(java.ajax(url.replace(\/like=2\/,'like=1'))).data.code;\n                      \t   \t    if(code == 0){\n                      \t   \t    \t    java.toast(\"已点赞\");\n                                             cache.put(type,1,300)\n                      \t   \t    \t}\n                       }else if(code == 65006){\n                      \t   \t    code = JSON.parse(java.ajax(url.replace(\/like=1\/,'like=2'))).data.code;\n                      \t   \t    if(code == 0){\n                      \t   \t    \t    java.toast(\"已取消点赞\");\n                                             cache.put(type,0,300)\n                      \t   \t    \t}\n                         }else{\n                               java.toast(JSON.parse(data).message)\n                         }\n       \t      break\n       \t      case \"coin\":\n                     url = \"https:\/\/api.bilibili.com\/x\/web-interface\/coin\/add,\"+JSON.stringify({\n                          \"method\":\"POST\",\n                          \"body\":\"multiply=1&del_media_ids=&aid=\"+aid+\"&csrf=\"+ csrf\n                          });\n                      if(isLcy==2){\n                          java.toast(\"该视频已达投币上限\")\n                      }else{\n                          data = java.ajax(url);\n                          code = JSON.parse(data).code;\n                          if(code == 0){\n                                isLcy += 1;\n                                info[\"🪙 投币\"] = \"🪙 已投\"+isLcy+\"枚\";\n                                java.toast(\"成功投币1枚\");\n                                cache.put(type,isLcy,300)\n                          }else{\n                              java.toast(JSON.parse(data).message)\n                          }\n                      }\n       \t      break\n       \t      case \"fav\":\n                       let n = isLcy ==1?\"add_media_ids=&del_media_ids=0\":\"add_media_ids=0&del_media_ids=\";\n                       \n              \t     url = \"https:\/\/api.bilibili.com\/medialist\/gateway\/coll\/resource\/deal,\"+JSON.stringify({\n                          \"method\":\"POST\",\n                          \"body\":n+\"&rid=\"+aid+\"&type=2\"+\"&csrf=\"+ csrf\n                          });\n                      data = java.ajax(url);\n                      code = JSON.parse(data).code;\n                      if(code == 0){\n                          if(isLcy == 0){\n                               info[\"⭐️ 收藏\"] = \"⭐️ 已收藏\"\n                      \t     java.toast(\"已收藏至默认收藏夹\");\n                      \t     cache.put(type,1,300)\n                          }else if(isLcy == 1){\n                               info[\"⭐️ 收藏\"] = \"⭐️ 收藏\"\n                      \t     java.toast(\"已从默认收藏夹取消\");\n                      \t     cache.put(type,0,300)\n                         }\n                      }else{\n                          java.toast(JSON.parse(data).message)\n                      }\n                     break;\n                     case \"all\":\n                         url = \"https:\/\/api.bilibili.com\/x\/web-interface\/archive\/like\/triple,\"+JSON.stringify({\n                             \"method\":\"POST\",\n                             \"body\":\"aid=\"+aid+\"&csrf=\"+csrf\n                         });\n                         data = java.ajax(url);\n                         code = JSON.parse(data).code;\n                         if(code == 0){\n                             info[\"👍🏻 点赞\"] = \"👍🏻 已点赞\"\n                             info[\"⭐️ 收藏\"] = \"⭐️ 已收藏\"\n                             info[\"🪙 投币\"] = \"🪙 已投2枚\"\n                             java.toast(\"👍🏻🪙⭐️一键三连成功\")\n                         }else{\n                             java.toast(JSON.parse(data).message)\n                         }\n                     break;\n                     \n                     case \"up\":\n                          isLcy = isLcy==1?2:1;\n                          url = \"https:\/\/api.bilibili.com\/x\/relation\/modify,\"+JSON.stringify({\n                          \"method\":\"POST\",\n                          \"body\":\"fid=\"+mid+\"&act=\"+isLcy+\"&csrf=\"+ csrf\n                      });\n                      data = java.ajax(url);\n                      code = JSON.parse(data).code;\n                      if(code == 0){\n                          if(isLcy == 1){\n                               info[\"🆙 关注\"] = \"🆙 已关注\"\n                      \t     java.toast(\"已关注至默认分组\");\n                      \t     cache.put(type,1,300)\n                          }else if(isLcy == 2){\n                               info[\"🆙 关注\"] = \"🆙 关注\"\n                      \t     java.toast(\"已从默认分组取消关注\");\n                      \t     cache.put(type,0,300)\n                         }\n                      }else{\n                          java.toast(JSON.parse(data).message)\n                      }\n                         break\n       \t}\n           java.upLoginData(info)\n         }catch(e){\n             java.log(e)\n             \n         }\n\t\n\t}",
    "respondTime": 180000,
    "ruleBookInfo": {
        "author": "$.owner.name||$.author.name\n<js>\nif(\/acc\\\/info\/.test(baseUrl)){\n\tresult = \"查看全部动态\"\n\t}else if(\/season_id=\/.test(baseUrl)){\n\t\tresult = \"查看系列视频\"\n\t\t}\nresult\n<\/js>",
        "canReName": "1",
        "coverUrl": "$.pic||$..origin_image_urls[0]||$.list.image_urls[0]||$.list.image_url||$.face||$.cover.url||$.cover",
        "init": "<js>\nif(S(\"$.message\")!=0 &&S(\"$.message\")!=\"success\" && S(\"$.message\")!=\"OK\"){\n\tjava.toast(\"\\n❌\"+S(\"$.message\")+\"\\n\"+\"如是账号相关问题\\n请尝试点击登录进网页拿Cookie\");\n\t}\n\nif((\/,\"type\":1}}}\/.test(result) ||S(\"$.data.fallback.id\"))&& \/opus\/.test(baseUrl)){\n\tlet rid = S(\"$.data.fallback.id\") || result.match(\/\"rid_str\":\"(\\d+)\",\/)[1];\n\tlet id = baseUrl.match(\/id=(\\d+)\/)[1]\n\tlet url = \n\t\tgetApi(\"article\",rid,id);\n\tjava.put(\"url\",url);\n\t java.setContent(String(java.ajax(url)));\n}\n\n if(!S(\"$.data\") && \/api\/.test(baseUrl)){\n\tresult = java.getElement(\"$.result\");\n\turl = \"https:\/\/api.bilibili.com\/pgc\/web\/season\/section?season_id=\"+S(\"$.result.season_id\");\n\tjava.put(\"url\",url)\n\t}else if(S(\"$.data\")){\n\t\tresult = java.getElement(\"$.data\");\t\t\n\t\t}else if(!\/api\/.test(baseUrl)){\n\t  result = JSON.stringify({data:{}})\n\t}\n\tresult\n<\/js>",
        "intro": "&emsp;&emsp;\n🕑 时长:{{formatTimeDynamic(S(\"$.duration\"))}}\n📤 发布:{{S(\"$.pubtime||$.meta.ptime||$.pubdate||$.list.publish_time\")?java.timeFormat(Number(S(\"$.pubtime||$.meta.ptime||$.pubdate||$.list.publish_time\")+\"000\")):\"\"}}\n⌨️ 更新:{{S(\"$.list.update_time||$.update_time\")?java.timeFormat(Number(S(\"$.list.update_time||$.update_time\")+\"000\")):\"\"}}\n—————————————\n👍🏻 点赞:{{formatCount(S(\"$.stat.like||$.stats.like\"))}}\n⭐️ 收藏:{{formatCount(S(\"$.stat.favorite||$.stats.view\"))}}\n🪙 投币:{{formatCount(S(\"$.stat.coin||$.stats.coin\"))}}\n—————————————\n👁 观看:{{formatCount(S(\"$.stat.view||$.stats.view\"))}}\n📖 阅读:{{formatCount(S(\"$.stats.view||$.list.read\"))}}\n🗯 弹幕:{{formatCount(S(\"$.stat.danmaku\"))}}\n💬 评论:{{formatCount(S(\"$.stat.reply||$.stats.reply\"))}}\n🔗 分享:{{formatCount(S(\"$.stat.share||$.stats.share\"))}}\n—————————————\n{{$.desc}}\n{{$.summary||$.list.summary||$.sign||$.evaluate}}\n{{S(\"$.seasons[*].season_title\")?\"<br>&lrm;<br>同系列剧集:\":\"\"}}\n{{S(\"$.seasons[*].season_title\")?S(\"$.seasons[*].season_title\").split(\"\\n\").map((x,i)=>{let b =S(\"$.seasons[*].new_ep.index_show\").split(\"\\n\");return x+\"【\"+b[i]+\"】\"}).join(\"\\n\"):\"\"}}\n{{content = \"\\n&lrm;\\n\"+S(\"$.root.content.message\");pic = S(\"$.root.content.pictures\");pic?content+\"[图片]\":content}}\n{{if(S(\"$.replies\")){let r = java.getElements(\"$.replies[*]\");let x=\"\";r.forEach(y=>{x+=\"👤【\"+y.member.uname+\"】 \"+y.reply_control.time_desc+\"\\n\"+y.content.message+(y.content.pictures?\"[图片]\":\"\")+\"\\n&lrm;\\n\";});\"\\n&lrm;\\n————回复————\\n\"+x};}}\n<js>##(📤 发布|💬 评论|🗯 弹幕|👁 观看|🪙 投币|⭐️ 收藏|👍🏻 点赞|🔗 分享|🕑 时长|📖 阅读|⌨️ 更新):\\n|🕑 时长:0:00<\/js>\n<js>##(—————————————\\n){2,}<\/js>\n<js>if(\/&emsp;&emsp;\\s+&lrm;\/.test(result)){result = \"&emsp;&emsp;\"+book.intro}result<\/js>\n##null",
        "kind": "{{if(S(\"$.publish.is_finish\")==\"0\"){\"连载\"};if(S(\"$.publish.is_finish\")==\"1\"){\"完结\"};}},{{$.areas[*].name}},{{$.type_name}},{{S(\"$.rating.score\")?S(\"$.rating.score\")+\"分\":\"\"}},{{$.styles}},{{getSeachType(S(\"$.type\"))}},{{$.payment.tip}},{{$.vip.label.text}},{{$.sex##保密}},{{$.official.title}},{{$.tname_v2&&$.tname}},合集共{{$.ugc_season.ep_count}}个视频,所属合集:{{$.ugc_season.title||$.list.name}}##所属合集:$|合集共个视频",
        "lastChapter": "{{$.new_ep.title}}",
        "name": "$.title||$.list.name||$.name\n<js>\nif(\/acc\\\/info\/.test(baseUrl)){\n\tresult = \"👤\" + result\n\t}\nresult\n<\/js>",
        "tocUrl": "@js:java.get(\"url\");",
        "wordCount": "{{$.list.words}}"
    },
    "ruleContent": {
        "callBackJs": "let bu = String(book?book.tocUrl:\"\");\nlet mid = String(book?book.getVariable(\"mid\"):\"\");\nmid = mid || bu.match(\/mid=(\\d+)\/)?.[1];\nfalse;\nif(event == \"startRead\"){\n\tif(\/⚪️\/.test(book.durChapterTitle)){\n\t\tjava.toast(\"当前主播可能未开播,刷新目录再尝试进入\");\n\t\t}\n\t}\n\n    \/\/定制\nif (event == \"clickCustomButton\") {\n\t\n     if(chapter&&\/data:bilibili|series_id\/.test(chapter.url)&&!\/section\/.test(bu)){\n         let a = b64D(chapter.url).split(\"&\")[0];\n        let u = `https:\/\/api.bilibili.com\/x\/web-interface\/archive\/related?aid=${a}`\n        java.open(\"explore\", u, \"推荐视频\");\n    }else if(\/article\\\/view\/.test(bu)) {\n        java.openUrl(\"bilibili:\/\/article\/cv\" + bu.match(\/id=(\\d+)\/)[1]);\n    }else if(chapter && \/data:liveurl\/.test(chapter.url)){\n        java.openUrl(\"bilibili:\/\/live\/\" + b64D(chapter.url).split(\"❌\")[1]);\n    }else if(\/acc\\\/info\/.test(bu)){\n        java.openUrl(\"bilibili:\/\/space\/\" + bu.match(\/mid=(\\d+)\/)[1]);\n    }else if(\/opus\\\/de\/.test(bu)){\n    \tjava.openUrl(\"bilibili:\/\/opus\/detail\/\" + bu.match(\/id=(\\d+)\/)[1]);\n\t}else if(\/v1\\\/detail\/.test(bu)){\n        java.openUrl(\"bilibili:\/\/following\/detail\/\" + (bu.match(\/id=(\\d+)\/)?.[1] ?? book.durChapterTitle.match(\/id(\\d+)$\/)[1]));\n\t}else if(chapter && \/data:liveurl\/.test(chapter.url)){\n        java.openUrl(\"bilibili:\/\/live\/\" + b64(chapter.url));\n    }else if(\/article\\\/list\/.test(bu)){\n        java.openUrl(\"bilibili:\/\/article\/readlist\/\" + bu.match(\/id=(\\d+)\/)[1]);\n    }else if(\/reply\\\/reply\/.test(bu)){\n        java.toast(\"这里啥也没有\")\n    }else if(\/season_id=\/.test(bu)){\n    \tjava.openUrl(\"bilibili:\/\/pgc\/season\/\" + (bu.match(\/_id=(\\d+)\/)?.[1]))\n    \t}else{\n       java.openUrl(\"bilibili:\/\/video\/av\" + (bu.match(\/[a_]id=(\\d+)\/)?.[1] ?? book.durChapterTitle.match(\/id(\\d+)$\/)[1]));\n    }\n   \n}\n\n\/\/分享\nif (event == \"clickShareBook\") {\n    let t = \"\";\n    if (\/article\\\/view\/.test(bu)) {\n        t = getShareUrl(\"article\",bu.match(\/opus\\\/(\\d+)\/)[1]);\n        t = `我正在看 UP主:${book.author}的文章《${book.name}》\\n文章链接:${t}`;\n    }else if(\/acc\\\/info\/.test(bu)){\n        t = getShareUrl(\"user\",bu.match(\/mid=(\\d+)\/)[1]);\n        t = `我正在看 UP主:${book.name}\\n访问主页:${t}`;\n    }else if(\/opus\\\/de\/.test(bu)){\n        t = getShareUrl(\"article\",bu.match(\/id=(\\d+)\/)[1]);\n        t = `我正在看 UP主:${book.author}的动态《${book.name}》\\n动态链接:${t}`;\n\t}else if(\/v1\\\/detail\/.test(bu)){\n        t = getShareUrl(\"forward\",(bu.match(\/id=(\\d+)\/)?.[1] ?? book.durChapterTitle.match(\/id(\\d+)$\/)[1]));\n        t = `我正在看 UP主:${book.author}的动态《${book.name}》\\n动态链接:${t}`;\n\t}else if(\/article\\\/list\/.test(bu)){\n        t = getShareUrl(\"articlelist\",bu.match(\/id=(\\d+)\/)[1]);\n        t = `我正在看 UP主:${book.author}的文集《${book.name}》\\n文集链接:${t}`;\n    }else if(\/reply\\\/reply\/.test(bu)){\n        java.toast(\"这里啥也没有\")\n    }else if(\/season_id\/.test(bu)){\n        t = getShareUrl(\"media_bangumi\",bu.match(\/id=(\\d+)\/)[1]);\n        t = `我正在看剧集《${book.name}》\\n剧集链接:${t}`;\n    }else {\n        t = getShareUrl(\"video\",(bu.match(\/aid=(\\d+)\/)?.[1] ?? book.durChapterTitle.match(\/id(\\d+)$\/)[1]));\n        t = `我正在看 UP主:${book.author}的视频《${book.name}》\\n视频链接:${t}`;\n    }\n    \n    java.copyText(t);\n    java.toast(\"\\n已复制,请去粘贴分享\\n\" + t);\n    true\n}\n\n\/\/书名\nif (event == \"clickBookName\") {\n    if(\/series_id\/.test(bu)) {\n        java.open(\"explore\", String(bu).replace(\/pn=\\d+\/, 'pn={{page}\\}'), \"当前合集视频列表\");\n    }else if(\/v1\\\/detail\/.test(bu)){\n        let u = getReply(bu.match(\/id=(\\d+)\/)[1], 17, 3);\n        java.open(\"explore\", u, \"热门评论\");\n    }else if(\/article\\\/view\/.test(bu)){\n        let u = getReply(bu.match(\/\\?id=(\\d+)\/)[1], 12, 3)\n        java.open(\"explore\", u, \"热门评论\");\n    }else if(\/opus\\\/detail\/.test(bu)){\n        let u = getReply(book.getVariable(\"id\"), 11, 3)\n        java.open(\"explore\", u, \"热门评论\");\n    }else if(\/article\\\/list\/.test(bu)){\n        let queryJson = `{mid:${mid},sort:0,\"web_location\":333.1387}`;\n         let u = `https:\/\/api.bilibili.com\/x\/article\/up\/lists?{\\{getWbiEnc(${queryJson})}}`;    \n        java.open(\"explore\", u, \"专栏文集\");\n    }else if(\/reply\\\/reply\/.test(bu)){\n        java.toast(\"这里啥也没有\")\n    }else if(!\/acc\\\/info\/.test(bu)) {\n        let aid = (bu.match(\/aid=(\\d+)\/)?.[1]??String(book.getVariable(\"aid\")))||cache.get(\"aid\");\n        let name = \"\";\n        if(aid){\n            let u = getReply(aid, 1, 3);\n            if(\/season_id\/.test(bu)){\n                name = book.durChapterTitle;\n                java.toast(\"热门评论\")\n            }\n            java.open(\"explore\", u, name+\"热门评论\");\n        }\n    }\n    \n    if(\/🎬\/.test(M(\"点击长按UP主\")) && \/acc\\\/info\/.test(bu)){\n        url = getEapi(\"videolist\",mid);\n        java.open(\"explore\", url, book.author + \" - 视频 - 最新发布\")\n       }else if(\/📖\/.test(M(\"点击长按UP主\")) && \/acc\\\/info\/.test(bu)){\n           let queryJson = `{mid:${mid},sort:0,\"web_location\":333.1387}`;\n           let u = `https:\/\/api.bilibili.com\/x\/article\/up\/lists?{\\{getWbiEnc(${queryJson})}}`;    \n           java.open(\"explore\", u, \"专栏文集\");\n    }  \n    true\n}\n\n\/\/长按书名\nif (event == \"longClickBookName\") {\n    if (\/series_id\/.test(bu)) {\n        let url = \"https:\/\/api.bilibili.com\/x\/web-interface\/view?aid=\" + book.durChapterTitle.match(\/id(\\d+)$\/)[1];\n        java.open(\"explore\", url, \"当前视频分P\");\n    } else if(\/v1\\\/detail\/.test(bu)){\n        let u = getReply(bu.match(\/id=(\\d+)\/)[1], 17, 2);\n        java.open(\"explore\", u, \"最新评论\");\n    }else if(\/article\\\/view\/.test(bu)){\n        let u = getReply(bu.match(\/\\?id=(\\d+)\/)[1], 12, 2)\n        java.open(\"explore\", u, \"最新评论\");\n    }else if(\/opus\\\/detail\/.test(bu)){\n        let u = getReply(book.getVariable(\"id\"), 11, 3)\n        java.open(\"explore\", u, \"最新评论\");\n    }else if(\/article\\\/list\/.test(bu)){\n        let u = getOpus(mid,\"article\");\n        java.open(\"explore\", u,  \"专栏动态\");\n    }else if(\/reply\\\/reply\/.test(bu)){\n        java.toast(\"这里啥也没有\")\n    } else if (!\/acc\\\/info\/.test(book.tocUrl)) {\n        let aid = (bu.match(\/aid=(\\d+)\/)?.[1]??String(book.getVariable(\"aid\")))||cache.get(\"aid\");\n        let name = \"\"\n        if(aid){\n            let u = getReply(aid, 1, 2);\n            if(\/season_id\/.test(bu)){\n                name = book.durChapterTitle;\n                java.toast(\"最新评论\")\n            }\n            java.open(\"explore\", u, name+\"最新评论\");\n            \n        }\n    }\n    \n    if(\/🎬\/.test(M(\"点击长按UP主\")) && \/acc\\\/info\/.test(bu)){\n        url = getEapi(\"seasons_series_list\",mid);\n        java.open(\"explore\", url, book.author + \" - 视频合集列表\")\n       }else if(\/📖\/.test(M(\"点击长按UP主\")) && \/acc\\\/info\/.test(bu)){\n           let u = getOpus(mid,\"article\");\n           java.open(\"explore\", u,  \"专栏动态\");\n    }\n    true\n}\n\n\/\/作者\nif (event == \"clickAuthor\") {\n    if(\/🎬\/.test(M(\"点击长按UP主\")) && !\/acc\\\/info|season_id\/.test(bu)){\n    url = getEapi(\"videolist\",mid);\n    java.open(\"explore\", url, book.author + \" - 视频 - 最新发布\")\n    }else if(\/📖\/.test(M(\"点击长按UP主\")) && !\/acc\\\/info|season_id\/.test(bu)){\n        let queryJson = `{mid:${mid},sort:0,\"web_location\":333.1387}`;\n         let u = `https:\/\/api.bilibili.com\/x\/article\/up\/lists?{\\{getWbiEnc(${queryJson})}}`;    \n        java.open(\"explore\", u, \"专栏文集\");\n    }\n    \n    if(\/acc\\\/info\/.test(bu)){\n        let u = getEapi(\"space\",mid);\n        java.open(\"explore\", u, book.name + \"的动态\");\n    }else if(\/season_id=\/.test(bu)){\n        java.open(\"explore\", book.bookUrl, \"系列视频\");\n    }\n    true\n}\n\n\/\/长按作者\nif (event == \"longClickAuthor\") {\n    if(\/🎬\/.test(M(\"点击长按UP主\")) && !\/acc\\\/info|season_id\/.test(bu)){\n        url = getEapi(\"seasons_series_list\",mid);\n        java.open(\"explore\", url, book.author + \" - 视频合集列表\")\n    }else if(\/📖\/.test(M(\"点击长按UP主\")) && !\/acc\\\/info|season_id\/.test(bu)){\n        let u = getOpus(mid,\"article\");\n        java.open(\"explore\", u,  \"专栏动态\");\n    }\n    \n    if(\/acc\\\/info\/.test(bu)){\n        let svg=String(java.base64Encode(`<svg width=\"1190\" height=\"300\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><rect width=\"100%\" height=\"100%\" fill=\"#ffffff\"\/><text x=\"200\" y=\"100\" font-family=\"Arial, sans-serif\" font-size=\"70\" fill=\"#333\" font-weight=\"bold\">输入要搜索的关键词<\/text><\/svg>`));\n        \n        let key = java.getVerificationCode('data:image\/svg+xml;base64,'+svg);\n        let u = getEapi(\"space\",mid,\"\/search❌❌&keyword=\"+key);\n        java.open(\"explore\", u, book.name + \"的动态\");\n    }\n    true\n}\n\n\nif (event == \"clickCopyBookUrl\") {\n    let t = \"\";\n    if (\/article\\\/view\/.test(bu)) {\n        t = getShareUrl(\"article\",bu.match(\/opus\\\/(\\d+)\/)[1]);\n    }else if(\/acc\\\/info\/.test(bu)){\n        t = getShareUrl(\"user\",bu.match(\/mid=(\\d+)\/)[1]);   \n    }else if(\/opus\\\/de\/.test(bu)){\n        t = getShareUrl(\"article\",bu.match(\/id=(\\d+)\/)[1]);  \n\t}else if(\/v1\\\/detail\/.test(bu)){\n        t = getShareUrl(\"forward\",(bu.match(\/id=(\\d+)\/)?.[1] ?? book.durChapterTitle.match(\/id(\\d+)$\/)[1]));\n\t}else if(\/article\\\/list\/.test(bu)){\n        t = getShareUrl(\"articlelist\",bu.match(\/id=(\\d+)\/)[1]);\n    }else if(\/reply\\\/reply\/.test(bu)){\n        java.toast(\"这里啥也没有\")\n    }else if(\/season_id\/.test(bu)){\n        t = getShareUrl(\"media_bangumi\",bu.match(\/id=(\\d+)\/)[1]);\n    }else {\n        t = getShareUrl(\"video\",(bu.match(\/aid=(\\d+)\/)?.[1] ?? book.durChapterTitle.match(\/id(\\d+)$\/)[1]));\n    }\n    \n    t?java.copyText(t):null\n    t?java.toast(t):null\n   true\n}\n",
        "content": "@js:\nif(\/data:reply\/.test(baseUrl)){\n    let j = String(java.hexDecodeToString(result));\n    \tresult = parseContent(j);\n\t}else if(\/x\\\/article\/.test(baseUrl)){\n\t\t\n        let json = JSON.parse(src);\n        book.author = json.data.author.name;\n        \n        if(S(\"$.data.type\") == \"3\"){\n            let data = JSON.parse(S(\"$.data.content\"));              \n            result = `${processDelta(data.ops)}`\n        }else if(S(\"$.data.type\") == \"0\"){\n            result = S(\"$.data.content\");\n            result = processHtml(result);\n        }else if(S(\"$.data.type\") == \"2\"){\n           result = S(\"$.data.content\")\n        }\n        if(JSON.parse(src).data.list){\n            let articlelist = JSON.parse(src).data.list;\n            let name = articlelist.name;\n            if(!\/article\\\/list\/.test(book.bookUrl)){\n            result = `${this.getClickImg(\"link\",articlelist.id,null,null,\"articlelist\")}所属文集:${name}\\n`+result;\n            }\n        }\n        if(json.data?.top_video_info?.bvid){\n               result = `${this.getClickImg(\"video\",json.data.top_video_info.bvid,json.data.top_video_info.pic,1)}`+result;\n               let title = `${this.getClickImg(\"video\",json.data.top_video_info.bvid)}${json.data.top_video_info.title}`;\n           result = title+\"\\n\"+result\n        }\n}else if(\/opus\\\/detail\/.test(baseUrl)){\n    let modules = JSON.parse(result)?.data?.item?.modules;\n    let html = \"\";\n    modules?modules.forEach(module=>{\n        switch(module.module_type){\n            case \"MODULE_TYPE_TOP\":\n                let pics = module?.module_top?.display?.album?.pics;\n                if(pics){\n                    pics.forEach(pic=>{\n                        html += `<img src=\"${pic.url}\">\\n`\n                       });\n                }\n                break;\n                \n            case \"MODULE_TYPE_CONTENT\":\n                let paragraphs = module?.module_content?.paragraphs;\n                paragraphs?paragraphs.forEach(paragraph=>{\n                    let type = paragraph.para_type;\n                    switch(type){\n                        case 1:\n                        case 4:\n                            let nodes = paragraph?.text?.nodes;\n                            html+= getNodes(nodes)\n                         break;\n                         \n                         case 2:\n                             let pics = paragraph?.pic?.pics;\n                             pics.forEach(pic=>{\n                                 html += `<img src=\"${pic.url}\">\\n`\n                             });\n                             break;\n                             \n                             case 3:\n                                 let pic = paragraph?.line?.pic?.url;\n                                 html += `<img src=\"${pic}\">\\n`\n                                 break;\n                                 \n                             \/\/列表\n                             case 5:\n                                 let items = paragraph?.list?.items;\n                                 items.forEach(item=>{\n                                     html+= item.order+ getNodes(item.nodes)+\"\\n\"\n                                    });\n                                    break;\n                    \n                            \/\/卡片 \n                             case 6:\n                                 let card = paragraph.link_card.card;\n                                 if(card.type==\"LINK_CARD_TYPE_LIVE\"){\n                                     html += getMajor(card)\n                                 }else{\n                                     html += getLinkCard(card)\n                                 }\n                                 break;\n                                 \n                             case 7:\n                                 html += JSON.stringify(paragraph)\n                                 break;\n                    }\n               }):null\n               break\n           }\n    \t}):null\n    \n    result = html;\n    \n}else if(\/v1\\\/detail\/.test(baseUrl)){\n  \tlet html = \"\";\n\t  let item = JSON.parse(src).data.item;\n      \n\t  let module_dynamic = item.modules.module_dynamic;\n\t  let module_author = item.modules.module_author;\n\t  \n\t  html += \"🕥 \"+module_author.pub_time+\" 发布\\n\";\n\t  \n\t  rich_text_nodes  = module_dynamic?.desc?.rich_text_nodes;\n\t  rich_text_nodes?rich_text_nodes.forEach(node=>{\n\t  \t    let nodes = [{}];\n\t  \t    nodes[0].type = \"TEXT_NODE_TYPE_RICH\";\n\t  \t    nodes[0].rich = node;  \n   \t    html += getNodes(nodes); \t    \n\t  \t}):null;\n\t  \n\t  \tif(module_dynamic.major){\n\t  \t\thtml+=getMajor(module_dynamic.major)\n\t  \t\t}\n\t      if(module_dynamic.additional){\n              html += getLinkCard(module_dynamic.additional)\n          }\n      \n\t  let  orig = item?.orig?.modules?.module_dynamic;\n      if(orig){\n          module_author = item?.orig?.modules?.module_author;\n          let mid = module_author?.mid;\n             name = module_author.name\n             html+=`\\n—转发自:${this.getClickImg(\"user\",mid)}${name}—\\n`\n             rich_text_nodes  = orig?.desc?.rich_text_nodes;\n             rich_text_nodes?rich_text_nodes.forEach(node=>{\n                 let nodes = [{}];\n                 nodes[0].type = \"TEXT_NODE_TYPE_RICH\";\n                 nodes[0].rich = node;  \n                 html += getNodes(nodes); \t   \n              }):null;\n              \n              if(orig.major){\n                  html+=getMajor(orig.major)\n\t  \t\t}\n             if(orig.additional){\n                  html += getLinkCard(orig.additional)\n             }\n\t      }\n\t  result = html\n}else if(\/data:live\/.test(baseUrl)){\n\t\tresult = String(java.hexDecodeToString(result));\n        let c = result.split(\"❌\");\n        if(\/\\d+&\\d+❌\/.test(result)){\n            let code = c[0].split(\"&\");\n            let data = java.ajax(\"https:\/\/api.live.bilibili.com\/xlive\/web-room\/v2\/index\/getRoomPlayInfo?room_id=\"+c[1]+\"&protocol=0,1&format=0,1,2&codec=0,1&qn=\"+code[1]);\n             data = JSON.parse(data).data;\n             let stream = data.playurl_info?.playurl?.stream;\n             let codec = stream[0].format[0].codec[0];\n             let base_url = codec.base_url;\n             let host = codec.url_info[code[0]].host;\n             let extra = codec.url_info[code[0]].extra;\n             result = host+base_url+extra;\n        }else{\n            result = c[0];\n        }\n        if(!result){result = 1;java.toast(\"当前直播可能未开播,尝试刷新详情页更新状态\")}\n\t}else{\n        \n        let aid,cid;\n        aid = java.hexDecodeToString(result);\n        if(\/series_id\/.test(baseUrl)){\n            let data = java.ajax(getApi(\"video\",aid));\n            p = JSON.parse(data).data;\n            if(p.pages.length > 1){\n            \tjava.longToast(\"当前视频分 \"+p.pages.length+\" P\\n可在详情页点击书名或长按书名查看更多分P视频\")\n            \t}\n            book.author = p.owner.name\n            cid = p.cid;\n        }else{\n            let l = java.hexDecodeToString(result).split(\"&\");\n            aid = l[0];\n            cid = l[1];\n        }\n        \n          \/\/dash视频\n          url = `http:\/\/api.bilibili.com\/x\/player\/playurl?avid=${aid}&cid=${cid}&qn=116&fnver=0&fnval=16&fourk=1`;\n          \n          if(\/season_id=\/.test(book.bookUrl)){\n              url = `https:\/\/api.bilibili.com\/pgc\/player\/web\/playurl?avid=${aid}&cid=${cid}&qn=116&fnver=0&fnval=16&fourk=1`;\n          }\n          \n          let data = java.ajax(url);\n          let json = JSON.parse(data);\n          book.putVariable(\"aid\",aid);\n          cache.put(\"aid\",aid,300)\n          \n          if(json.data){\n              json = json.data\n          }else if(json.result){\n              json = json.result\n          }\n          \n          \n      dm = String(java.ajax('https:\/\/comment.bilibili.com\/' + cid + '.xml'));    \n      java.put(\"dm\",modifyDanmaku(dm,15));\n          if(\/DASH\/i.test(json.type)||!json.type){\n              if(json.dash.video[0].id<64){\n                  \/\/切换mp4线路\n                  url = `http:\/\/api.bilibili.com\/x\/player\/playurl?avid=${aid}&cid=${cid}&qn=116&fnver=0&fnval=1&fourk=1`;\n                  data = java.ajax(url);\n                  result = JSON.parse(data).data.durl[0].url;\n              }else{\n                  if(\/🎧\/.test(M(\"模式\"))){\n                      java.put(\"dm\",danmakuToLRC(dm));\n                      \/\/result = JSON.parse(data).data.durl[0].url;\n                      result = json.dash.audio[1].baseUrl;\n                   }else{\n                       result = generateMPD(json.dash);\n                       \/\/result = JSON.parse(data).data.durl[0].url\n                     }\n                }\n          }else if(\/mp4\/i.test(json.type)){\n               result = json.durl[0].url\n           }\n}\n\nresult",
        "imageStyle": "FULL",
        "subContent": "@js:\njava.get(\"dm\")",
        "title": "@js:\nif(\/data:reply\/.test(baseUrl)){\n\t  result = chapter.tag\n\t\t}else{\n\t\t\tresult = title\n\t\t\t}\nresult"
    },
    "ruleExplore": {
        "author": "$.owner.name||$.member.uname||$.upper.name||$.modules.module_author.name||$.uname||$.author_name||$.author.name\n<js>\nif(\/relation\/.test(baseUrl)){\n\tresult = \"查看全部动态\"\n\t}\n\tresult\n<\/js>",
        "bookList": "$.data.item[*]||$.data.list[*]||$.data.medias[*]||$.data.lists[*]||$.data.top_replies[*]&&$.data.replies[*]||$.data.media_list[*]||$.data.items[*]||$.data.archives[*]||$.data.items_lists.seasons_list[*]&&$.data.items_lists.series_list[*]||$.data.pages[*]||$.result.seasons[*]||$.data[*]\n<js>\nif(\/aid=(\\d+)\/.test(baseUrl)){\n\tjava.log(baseUrl)\n\tjava.put(\"aid\",baseUrl.match(\/aid=(\\d+)\/)[1])\n\t}\nif(JSON.parse(src)?.data?.aid){\n\tjava.put(\"aid\",JSON.parse(src)?.data?.aid)\n\t}\nif(\/medialist\/.test(baseUrl)){\nlet m =\tJSON.parse(src || \"[]\")?.data?.media_list ?? [];\n\nif(m.length>=1){\n    source.put(\"nextoffset\",m[m.length-1].id);\n}else{\n\tresult = \"[]\";\n\t}\n}\n\nif(\/reply\\\/wbi\\\/main\/.test(baseUrl)){\n\tif(JSON.parse(src || \"[]\")?.data?.replies.length<1){\n\t\tresult = \"[]\"\n\t\t}else if(!JSON.parse(src || \"[]\")?.data){\n\t\t\tm = JSON.parse(src || \"[]\")?.message;\n\t\tm?java.toast(m):null\n\t\tresult = \"[]\"\n\t\t\t}else{\n\t\t\ta = JSON.parse(src || \"[]\").data.cursor.pagination_reply.next_offset;\nsource.put(\"nextoffset\",a);\n\t\t\t}\n}\nif(\/feed\\\/all|web-dynamic\/.test(baseUrl)){\na = JSON.parse(src || \"[]\").data.offset;\nsource.put(\"nextoffset\",a);\n}\nif(\/history\/.test(baseUrl)){\na = JSON.parse(src || \"[]\").data.cursor.max;\nbusiness = JSON.parse(src || \"[]\").data.cursor.business;\nview_at = JSON.parse(src || \"[]\").data.cursor.view_at;\na = a+\"&business=\"+business+\"&view_at=\"+view_at\nsource.put(\"nextoffset\",a);\n}\n\nif(\/feed\\\/space\/.test(baseUrl)){\n\t  if(!JSON.parse(src||\"[]\")?.data?.items.length)result = \"[]\"\n\t}\n\t\nif(\/fav\/.test(baseUrl)){\n\t  if(!JSON.parse(src||\"[]\")?.data?.medias.length)result = \"[]\"\n\t}\nresult\n<\/js>\n$.[*]",
        "bookUrl": "https:\/\/api.bilibili.com\/x\/web-interface\/view?aid={{$.id||$.aid||$.archives[0].aid||$.modules..aid||$.mid||$.opus_id||$.history.oid}}&cid={{$.cid}}@put:{\"cid\":\"$.cid\"}\n@js:\nif (S(\"$.rpid\")) {\n    result = `https:\/\/api.bilibili.com\/x\/v2\/reply\/reply?oid=${S(\"$.oid\")}&type=${baseUrl.match(\/type=(\\d+)\/)[1]}&root=${S(\"$.rpid\")}&ps=100&pn=1&web_location=333.788`;\n   \n} else if (S(\"$.meta.series_id\")) {\n    result = `https:\/\/api.bilibili.com\/x\/series\/archives?mid=${baseUrl.match(\/mid=(\\d+)\/)[1]}&series_id=${S(\"$.meta.series_id\")}&only_normal=true&sort=desc&ps=1000&pn=1&web_location=333.1387`;\n} else if (\/feed\\\/all.*?type=article\/.test(baseUrl)) {\n    result = getApi(\"article\",S(\"$..rid_str\"),S(\"$..id_str\"))\n}else if(\/opus\\\/feed\/.test(baseUrl)){\n\t\n\tresult = getApi(\"opus\",S(\"$.opus_id\"),S(\"$.opus_id\"))\n\t} else if(\/article\\\/up\\\/lists\/.test(baseUrl)){\n\t\tresult = \"https:\/\/api.bilibili.com\/x\/article\/list\/web\/articles?id=\"+S(\"$.id\")\n\t} else if(\/\\\/pgc\\\/\/.test(baseUrl)){\n\t\t    result = getApi(\"media_bangumi\",S(\"$.season_id||$.id\"))\n\t\t}else if(\/x\\\/relation|xlive\/.test(baseUrl)){\n         result = getApi(\"user\",S(\"$.mid||$.uid\"))\n\t}else if(\/feed\\\/space\/.test(baseUrl)){\n\t\t result = getDynamicUrl(S(\"$.type\"),src);\n\t\t}else {\n\t\t\tif(\/aid=&\/.test(result)){\n\t\t\t\tresult = result.replace(\/aid=&\/,'aid='+java.get('aid')+'&');\n\t\t\t\t}\n    result = result\n}",
        "coverUrl": "$.cover.url||$.pic||$.cover||$.member.avatar||$.meta.cover||$.modules..cover||$.covers[0]||$.modules..pics[0].url||$.orig..cover||$.orig..pics[0].url||$.first_frame||$..face||$..module_author.face",
        "intro": "{{$.modules..major..desc||$.desc||$.intro||$.sign||$.modules..major..summary.text||$.summary||$.subTitle||$.title}}\n{{let a;if(S(\"$.orig\")){a = `&emsp;&emsp;${S(\"$.modules..major..title||$.modules..desc.text\")}\\n&lrm;\\n-转发 @${S(\"$.orig..module_author.name\")} 的${getDynamicType(S(\"$.orig.type\"))}-\\n${S(\"$.orig..title||$.orig..summary.text\")}`};a}}\n<br>&lrm;<br>\n{{$.modules.module_dynamic.additional.reserve.title}}\n{{$.modules.module_dynamic.additional.reserve.desc1.text}}\n {{content = \"\\n&lrm;\\n\"+java.getString(\"$.content.message\");pic = String(java.getString(\"$.content.pictures\"));pic?content+\"[图片]\":content}}\n{{if(String(java.getString(\"$.replies\"))){let r = java.getElements(\"$.replies[*]\");let x=\"\";r.forEach(y=>{x+=\"👤【\"+y.member.uname+\"】 \"+y.reply_control.time_desc+\"\\n\"+y.content.message+(y.content.pictures?\"[图片]\":\"\")+\"\\n&lrm;\\n\";});\"\\n&lrm;\\n————回复————\\n\"+x};}}##null",
        "kind": "{{$.area_name&&$.area_v2_name&&$.area_v2_parent_name}},{{$.vip.label.text}},{{$.badge}},🕑 {{formatTimeDynamic(java.getString(\"$.duration\"))}}\n👍🏻 {{formatCount(java.getString(\"$.stat.like||$.cnt_info.thumb_up\"))}}\n▶️ {{formatCount(java.getString(\"$.stat.view||$.cnt_info.play\"))}}\n🗯 {{formatCount(java.getString(\"$.stat.danmaku||$.cnt_info.danmaku\"))}}\n##🕑 0:00|(?:👍🏻|▶️)\\s+(?!\\d)|🗯$",
        "lastChapter": "分{{$.page}}P {{$.new_ep.index_show||$.index_show}}{{S(\"$.articles_count\")?S(\"$.articles_count\")+\"篇文章\":\"\"}} {{$.modules.module_author.pub_time}} {{$.reply_control.time_desc}} {{S(\"$.publish_time||$.pubtime||$.meta.ptime||$.pubdate\")?java.timeFormat(Number(java.getString(\"$.pubtime||$.meta.ptime||$.pubdate||$.publish_time\")+\"000\")):\"\"}} 💬{{$.rcount}}条回复 👍🏻{{$.like}}##分P|💬条回复|发布|👍🏻$",
        "name": "{{getDynamicType(S(\"$.type\"))}}{{$.modules..major..summary.text||$.season_title||$.meta.name||$.title||$.content.message||$.modules..major..title||$.modules..desc.text||$.modules..major..desc||$.uname||$.part||$.content||$.name||$.modules..major.live_rcmd.content}}{{S(\"$.id_str\")?\"【\"+S(\"$.id_str\").replace(\/^\\d{13}\/,'')+\"】\":\"\"}}\n<js>\nif(\/relation\/.test(baseUrl)){\n\tresult = \"👤\"+result\n}else if(\/,\"live_play_info\/.test(result)){\n\tresult = \"📺\"+ result.match(\/\"title\":\"([^\"]+)\"\/)[1]\n\t}\n\tresult\n<\/js>",
        "wordCount": "$.words"
    },
    "ruleSearch": {
        "author": "$.author||$.uname##<\/*em.*?>",
        "bookList": "$.data.result[*].data[*]&&$.data.result.live_user[*]&&$.data.result.live_room[*]||$.data.result[*]",
        "bookUrl": "https:\/\/api.bilibili.com\/x\/web-interface\/view?aid={{$.id}}@put:{\"cid\":\"$.cid\"}\n<js>\nlet type = S(\"$.type\");\nswitch(type){\n\tcase \"live_user\":\n\tcase \"live_room\":\n\tcase \"bili_user\":\n        result = getApi(\"user\",S(\"$.uid||$.mid\"));\n\tbreak;\n\t\n\tcase \"article\":\n        result = getApi(type,S(\"$.id\"))\n        break;\n  case \"media_bangumi\":\n  case \"media_ft\":\n        result = getApi(type,S(\"$.season_id\"))\n\t}\n\nresult\n<\/js>",
        "checkKeyWord": "--https:\/\/api.bilibili.com\/x\/article\/view?id=34980384,{\"js\":\"book?result:'https:\/\/www.bilibili.com\/opus\/937892609776418850?spm_id_from=333.1365.0.0'\"}",
        "coverUrl": "$.pic||$.cover||$.user_cover||$.cover||$.image_urls[0]||$.uface||$.upic",
        "intro": "$.description||$.desc||$.usign##<\/*em.*?>",
        "kind": "{{S(\"$.type\")==\"live_room\"?\"📺直播间\":\"\"}}\n,{{S(\"$.type\")==\"article\"?\"📖专栏\":\"\"}},{{S(\"$.type\")==\"live_user\"?\"📺主播\":\"\"}}\n,{{S(\"$.type\")==\"bili_user\"?\"👤用户\":\"\"}}\n{{S(\"$.fans\")?\"粉丝:\"+formatCount(S(\"$.fans\")):\"\"}}\n,{{S(\"$.live_status\")==\"true\"?\"已开播\":(S(\"$.live_status\")==\"false\"?\"未开播\":\"\")}}\n{{$.official_verify.desc},}{{$.category_name}}\n,{{$.cate_name}},{{getSeachType(S(\"$.media_type||$.season_type\"))}},{{$.tag||$.tas}},{{$.category_name}}\n,{{S(\"$.media_score.score\")?S(\"$.media_score.score\")+\"分\":\"\"}},{{$.styles}},{{$.areas}},\n🕑 {{S(\"$.duration\")}},👍🏻 {{formatCount(S(\"$.like\"))}},👁 {{formatCount(S(\"$.play||$.view\"))}},🗯 {{formatCount(S(\"$.danmaku||$.reply\"))}}\n##🕑 ,|👍🏻 ,|👁 ,|🗯$|<\/*em.*?>|,0分",
        "lastChapter": "{{$.live_time##0000-00-00.*}}{{S(\"$.pubtime||$.meta.ptime||$.pubdate||$.pub_time\")?java.timeFormat(Number(S(\"$.pubtime||$.meta.ptime||$.pubdate||$.pub_time\")+\"000\")):\"\"}}",
        "name": "$.title||$.uname##<\/*em.*?>"
    },
    "ruleToc": {
        "chapterList": "<js>\nlet b = String(book.bookUrl);\nlet bmid = S(\"$.data.mid||$.data.list.mid||$.data.item.basic.uid||$.data.item.modules.module_author.mid||$.data.owner.mid||$.data.root.mid\");\n\nbook.putVariable(\"mid\", bmid);\ncache.put(\"mid\",bmid);\n\ncaid = String(cache.get(\"aid\"));\tcache.put(\"aid\",S(\"$.result.main_section.episodes[0].aid\"));\n\nbook.putVariable(\"id\",S(\"$.data.item.basic.comment_id_str\"));\n\nif (\/web-interface\\\/view|series|season_id=\/.test(b)) {\n    if (\/^🎧\/.test(M(\"模式\"))) {\n        book.type = 32;\n    } else if (\/^🎥\/.test(M(\"模式\"))) {\n        book.type = 4;\n    }\n} else if (\/reply\\\/reply|article\/.test(b)) {\n    book.type = 8;\n}\n\nif(\/acc\\\/info\/.test(b)){\n\tbook.type = 4;\n\t}\n\n\nif (\/web-interface\\\/view\/.test(baseUrl)) {\n    var p = JSON.parse(result).data;\n    book.putVariable(\"mid\", p.owner.mid);\n    var d = [];\n    var aid = p.aid;\n    if (p.pages.length == 1) {\n        cid = p.pages[0].cid;\n        d.push({\n            title: p.title,\n            url: `data:bilibili;base64,${java.base64Encode(aid+\"&\"+p.cid)},{\"type\":\"c\"}`,\n            pubdate: p.pubdate,\n            desc: formatTimeDynamic(p.duration)\n        });\n    } else if (p.pages.length > 1) {\n        p.pages.forEach(item => {\n            cid = item.cid;\n            d.push({\n                title: item.part,\n                desc: formatTimeDynamic(item.duration),\n                url: `data:bilibili;base64,${java.base64Encode(aid+\"&\"+item.cid)},{\"type\":\"c\"}`,\n                pubdate: item.pubdate,\n\n            })\n        })\n    }\n    if (p.ugc_season) {\n        d.unshift({\n            title: \"当前视频\",\n            vol: true\n        });\n\n        let s = p.ugc_season.sections;\n        let singleVideos = [];\n\n        s.forEach(el => {\n            el.episodes.forEach(x => {\n                if (x.pages.length == 1) {\n                    singleVideos.push({\n                        title: x.title,\n                        url: `data:bilibili;base64,${java.base64Encode(x.aid + \"&\" + (x.pages[0] ? x.pages[0].cid : x.cid))},{\"type\":\"\"}`,\n                        pubdate: x.arc.pubdate,\n                        desc: formatTimeDynamic(x.arc.duration)\n                    });\n                }\n            });\n        });\n\n        if (singleVideos.length > 0) {\n            d.push({\n                title: \"单个视频合集\",\n                vol: true\n            });\n\n            singleVideos.forEach(video => {\n                d.push(video);\n            });\n        }\n\n        s.forEach(el => {\n            el.episodes.forEach(x => {\n                if (x.pages.length > 1) {\n                    d.push({\n                        title: x.title,\n                        vol: true\n                    });\n\n                    x.pages.forEach(y => {\n                        d.push({\n                            title: y.part,\n                            url: `data:bilibili;base64,${java.base64Encode(x.aid + \"&\" + y.cid)},{\"type\":\"\"}`,\n                            pubdate: y?.arc?.pubdate ?? \"\",\n                            desc: formatTimeDynamic(y?.arc.duration ?? y.duration)\n                        });\n                    });\n                }\n            });\n        });\n    }\n    result = JSON.stringify(d)\n} else if (\/reply\\\/reply\/.test(baseUrl)) {\n    book.putVariable(\"mid\", JSON.parse(src).data.root.mid);\n} else if (\/x\\\/article\\\/view\/.test(baseUrl)) {\n    book.putVariable(\"mid\", S(\"$.data.author.mid\"));\n    result = JSON.stringify([{\n        \"title\": S(\"$.data.title\"),\n        \"url\": getApi(\"article\",S(\"$.data.id\"),S(\"$.data.dyn_id_str\"))\n    }])\n} else if (\/acc\\\/info\/.test(baseUrl)) {\n    let name = S(\"$.data.name\");\n    \n    let mid = S(\"$.data.mid\");\n    let d = [];\n    let roomid = S(\"$.data.live_room.roomid\");\n    \n    let liveStatus = S(\"$.data.live_room.liveStatus\");\n    if (liveStatus == \"1\") {\n        liveStatus = \"🔴\";\n        java.toast(\"【\" + name + \"】正在直播\");\n        java.log(\"【\" + name + \"】正在直播\");\n    } else if (liveStatus == \"0\") {\n        liveStatus = \"⚪️\"\n    }\n    if (S(\"$.data.live_room.roundStatus\") == \"1\") {\n        liveStatus = \"🟢\"\n    }\n    let title = S(\"$.data.live_room.title\");\n    \n    if (\/🔴|🟢\/.test(liveStatus)) {\n        result = java.ajax(\"https:\/\/api.live.bilibili.com\/xlive\/web-room\/v2\/index\/getRoomPlayInfo?room_id=\"+roomid+\"&protocol=0,1&format=0,1,2&codec=0,1&qn=30000\");\n        let data = JSON.parse(result).data;\n        let stream = data.playurl_info?.playurl?.stream;\n        \n        if(stream){\n            let codec = stream[0].format[0].codec[0];\n            let base_url = codec.base_url;\n            let accept_qn = codec.accept_qn;\n            accept_qn.forEach(code=>{\n                d.push({\n                    title:getVideoQuality(code),\n                    vol:true\n                });\n               \n                    codec.url_info.forEach((u,i)=>{\n                         if(codec.current_qn==code){\n                             let host = u.host;\n                             let extra = u.extra;\n                             d.push({\n                                 title: (liveStatus+getVideoQuality(code)+(i+1) + \"、【\" + title + \"】\"  + \" \" + name + \"的直播间\").replace(\/【】\/, \"\"),\n                                 url: `data:liveurl;base64,${java.base64Encode(host+base_url+extra+\"❌\"+roomid)},{type:\"live\"}`\n                             })\n                         }else{\n                             d.push({\n                                 title: (liveStatus+getVideoQuality(code)+(i+1) + \"、【\" + title + \"】\"  + \" \" + name + \"的直播间\").replace(\/【】\/, \"\"),\n                                 url: `data:liveurl;base64,${java.base64Encode(i+\"&\"+code+\"❌\"+roomid)},{type:\"live\"}`\n                             })\n                         }\n                  })\n              })\n             \n          }else if(data.playurl_info == null){\n              d.push({\n                  title: (liveStatus+\"直播已结束【\" + title + \"】\"  + \" \" + name + \"的直播间\").replace(\/【】\/, \"\"),\n                  url: `data:liveurl;base64,${java.base64Encode(\"❌\"+roomid)},{type:\"live\"}`\n        })\n          }\n      }else {\n        d.push({\n            title: (liveStatus+\"【\" + title + \"】\" + \" \" + name + \"的直播间\").replace(\/【】\/, \"\"),\n            url: `data:liveurl;base64,${java.base64Encode(\"❌\"+roomid)},{type:\"live\"}`\n        })\n    }\n    \n   \n   \/*\n  \/\/  直接获取视频流\n    if (\/中\/.test(liveStatus)) {\n        let liveApi = \"https:\/\/api.live.bilibili.com\/room\/v1\/Room\/playUrl?qn=30000&cid=\" + roomid;\n        let data = java.ajax(liveApi);\n        let durl = JSON.parse(data).data.durl;\n        durl.forEach((x,i) => {\n        \tjava.log(durl.length-1-i)\n            d.push({\n                title: \"线路\" + x.order,\n                vol: true\n            }, {\n                title: (x.order + \"、【\" + title + \"】\" + liveStatus + \" \" + name + \"的直播间\").replace(\/【】\/, \"\"),\n                url: `data:liveurl;base64,${java.base64Encode(durl[durl.length-1-i].url)},{type:\"live\"}`\n            })\n        })\n    } else {\n        d.push({\n            title: (\"【\" + title + \"】\" + liveStatus + \" \" + name + \"的直播间\").replace(\/【】\/, \"\"),\n            url: `data:liveurl;base64,${java.base64Encode(roomid+\"&\"+mid)},{type:\"live\"}`\n        })\n    }\n    *\/\n   \n    result = JSON.stringify(d)\n} else if (\/data:dynamic_type|opus\\\/detail|v1\\\/detail\/.test(baseUrl)) {\n    \n    result = JSON.stringify([{\n        title:String(book.name),\n        url:baseUrl\n    }])\n}\nresult\n\n<\/js>\n$.[*]&&$.data.root&&$.data.replies[*]&&$.data.archives[*]&&$.data.articles[*]||$.data.items[*]||$.result.main_section.episodes[*]&&$.result.section[*].episodes[*]",
        "chapterName": "$.title||$.long_title||$.content.message||$..root.content.message||$.modules.module_dynamic.major.opus.title||$.modules.module_dynamic.desc.text||$.modules..major..title||$.modules..major..title\n@js:\nif(\/series_id=\/.test(baseUrl)){\n\tresult = result?result + \"id{{$.aid}}\":\"\"\n\t}\nif(\/season_id=\/.test(baseUrl)){\n\tresult = S(\"$.title\")+\" \"+S(\"$.long_title\")+\"【\"+S(\"$.badge_info.text\")+\"】\"\n\t}\nresult.replace(\/【】|^ \/g,'')",
        "chapterUrl": "$.url||$..root.rpid||$.rpid||$.aid||$.id||$.basic.rid_str||$..major..aid||$..id_str\n@js:\nif (\/reply\\\/reply\/.test(baseUrl)) {\t\n\t  content = S(\"$.root.content||$.content\").replace(\/(?:mtime|max_line|jump_url|meta|suggest|jump_title|members|package_id|state|type|attr|id)=.*?,\\s*\/g,'')\n    result = `data:reply;base64,${java.base64Encode(content+\"&\"+S(\"$.mid\"))},{\"type\":\"\"}`;\n} else if (\/series_id=\/.test(baseUrl)) {\n    result = `data:series_id;base64,${java.base64Encode(result)},{\"type\":\"\"}`;\n} else if (\/article\\\/list\/.test(baseUrl)) {\n    result = getApi(\"article\",S(\"$.id\"),S(\"$.dyn_id_str\"))\n}else if(\/feed\\\/space\/.test(baseUrl)){\n\tlet type = S(\"$.type\");\n\tresult = getDynamicUrl(type,src);\n}else if(\/season_id=\/.test(baseUrl)){\n\t\n\tresult =  `data:bilibili;base64,${java.base64Encode(S(\"$.aid\")+\"&\"+S(\"$.cid\"))},{\"type\":\"\"}`\n\t}\nresult",
        "formatJs": "title.replace(\/【\\d{6}】$\/,'')",
        "isVolume": "vol",
        "nextTocUrl": "@js:\nlet list = [];\nif(\/series_id=\/.test(baseUrl) && !\/pn=2\/.test(baseUrl)){\n\tlet page = Math.ceil(Number(java.getString(\"$.data.page.total\"))\/1000);\n\tfor(i = 2;i<=page;i++){\n\t\t  list.push(baseUrl.replace(\/pn=\\d+\/,'pn='+i))\n\t\t}\n\t}\nlist",
        "updateTime": "👤{{$..root.member.uname||$.member.uname}}   {{$..root.reply_control.time_desc||$.reply_control.time_desc}}  {{S(\"$.pubtime||$.meta.ptime||$.pubdate||$.pub_time\")?java.timeFormat(Number(S(\"$.pubtime||$.meta.ptime||$.pubdate||$.pub_time\")+\"000\")):\"\"}}   时长:{{$.desc}}{{$.modules.module_dynamic.additional..title&&$.modules.module_dynamic.major.opus.summary.text##\\n## | }}##👤\\s+|👤\\s*$|时长:(?!\\d)"
    },
    "searchUrl": "@js:\nlet start = key.slice(0,1);\nlet type;\nswitch(start){\n\tcase \"@\":\n\t    type = \"bili_user\";\n\t    break;\n\tcase \"#\":\n\tcase \"#\":\n\t    type = \"article\"\n\t    break;\n\tcase \"%\":\n\t    type = \"video\"\n\t    break\n\tcase \"&\":\n\t    type = \"live\"\n\t    break;\n\tcase \"*\":\n\t    type = \"media_bangumi\";\n\t    break;\n\t case \"?\":\n\t case \"?\":\n\t     type = \"media_ft\"\n\t     break\n\t}\nif(type){\nqueryJson = {\n        __refresh__: true,\n        _extra: '',\n        context: '',\n        page: page,\n        page_size: 30,\n        order: '',\n        duration: '',\n        from_source: '',\n        from_spmid: 333.337,\n        platform: 'pc',\n        highlight: 1,\n        single_column: 0,\n        keyword: key,\n        search_type: type,\n        preload: true,\n        com2co: true\n    }\n    parms = getWbiEnc(queryJson);\n    result = 'https:\/\/api.bilibili.com\/x\/web-interface\/wbi\/search\/type?' + parms;\n\n}else{\nresult = \"https:\/\/api.bilibili.com\/x\/web-interface\/wbi\/search\/all\/v2?\"+getWbiEnc({keyword:key,page: page,page_size: 30})\n}",
    "weight": 0
}
广告