From e71ea1dc7e6c837736964a2c16c3bbe5ca99da1c Mon Sep 17 00:00:00 2001 From: chen310 <33364396+chen310@users.noreply.github.com> Date: Fri, 24 Feb 2023 09:58:09 +0800 Subject: [PATCH 001/132] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index decc46b..d62cde1 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# NeteasePotPlayer +# BilibiliPotPlayer 适用于 PotPlayer 的 Bilibili 插件。 From 0704d791b3dbbc8c2fe96a8b87e7114d171c5dee Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Fri, 24 Feb 2023 16:27:32 +0800 Subject: [PATCH 002/132] =?UTF-8?q?feat:=20=E9=80=82=E9=85=8D=E5=88=86?= =?UTF-8?q?=E5=8C=BA=E6=8E=92=E8=A1=8C=E6=A6=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 64 ++++++++++++++++---- 1 file changed, 53 insertions(+), 11 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index ffe6a14..a1c34cf 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -38,17 +38,14 @@ void OnInitialize() { string host = "https://api.bilibili.com"; string GetTitle() { - return "Bilibili"; } string GetVersion() { - return "1.3"; } string GetDesc() { - return "https://www.bilibili.com"; } @@ -162,6 +159,18 @@ string apiPost(string api, string data="") { return post(host + api); } +uint gettid(string path) { + array urls = { '//www.bilibili.com/v/anime/serial/', '//www.bilibili.com/v/anime/finish', '//www.bilibili.com/v/anime/information/', '//www.bilibili.com/v/anime/offical/', '//www.bilibili.com/anime/', '//www.bilibili.com/movie/', '//www.bilibili.com/v/guochuang/chinese/', '//www.bilibili.com/v/guochuang/original/', '//www.bilibili.com/v/guochuang/puppetry/', '//www.bilibili.com/v/guochuang/motioncomic/', '//www.bilibili.com/v/guochuang/information/', '//www.bilibili.com/guochuang/', '//www.bilibili.com/tv/', '//www.bilibili.com/documentary/', '//www.bilibili.com/v/douga/mad/', '//www.bilibili.com/v/douga/mmd/', '//www.bilibili.com/v/douga/voice/', '//www.bilibili.com/v/douga/garage_kit/', '//www.bilibili.com/v/douga/tokusatsu/', '//www.bilibili.com/v/douga/acgntalks/', '//www.bilibili.com/v/douga/other/', '//www.bilibili.com/v/douga/', '//www.bilibili.com/v/game/stand_alone', '//www.bilibili.com/v/game/esports', '//www.bilibili.com/v/game/mobile', '//www.bilibili.com/v/game/online', '//www.bilibili.com/v/game/board', '//www.bilibili.com/v/game/gmv', '//www.bilibili.com/v/game/music', '//www.bilibili.com/v/game/mugen', '//www.bilibili.com/v/game/', '//www.bilibili.com/v/kichiku/guide', '//www.bilibili.com/v/kichiku/mad', '//www.bilibili.com/v/kichiku/manual_vocaloid', '//www.bilibili.com/v/kichiku/theatre', '//www.bilibili.com/v/kichiku/course', '//www.bilibili.com/v/kichiku/', '//www.bilibili.com/v/music/original', '//www.bilibili.com/v/music/cover', '//www.bilibili.com/v/music/perform', '//www.bilibili.com/v/music/vocaloid', '//www.bilibili.com/v/music/live', '//www.bilibili.com/v/music/mv', '//www.bilibili.com/v/music/commentary', '//www.bilibili.com/v/music/tutorial', '//www.bilibili.com/v/music/other', '//www.bilibili.com/v/music', '//www.bilibili.com/v/dance/otaku/', '//www.bilibili.com/v/dance/hiphop/', '//www.bilibili.com/v/dance/star/', '//www.bilibili.com/v/dance/china/', '//www.bilibili.com/v/dance/three_d/', '//www.bilibili.com/v/dance/demo/', '//www.bilibili.com/v/dance/', '//www.bilibili.com/v/cinephile/cinecism', '//www.bilibili.com/v/cinephile/montage', '//www.bilibili.com/v/cinephile/shortfilm', '//www.bilibili.com/v/cinephile/trailer_info', '//www.bilibili.com/v/cinephile', '//www.bilibili.com/v/ent/variety', '//www.bilibili.com/v/ent/talker', '//www.bilibili.com/v/ent/fans', '//www.bilibili.com/v/ent/celebrity', '//www.bilibili.com/v/ent/', '//www.bilibili.com/v/knowledge/science', '//www.bilibili.com/v/knowledge/social_science', '//www.bilibili.com/v/knowledge/humanity_history', '//www.bilibili.com/v/knowledge/business', '//www.bilibili.com/v/knowledge/campus', '//www.bilibili.com/v/knowlake', '//www.bilibili.com/v/life/painting', '//www.bilibili.com/v/life/daily', '//www.bilibili.com/v/life', '//www.bilibili.com/v/car/racing', '//www.bilibili.com/v/car/modifiedvehicle', '//www.bilibili.com/v/car/newenergyvehicle', '//www.bilibili.com/v/car/touringcar', '//www.bilibili.com/v/car/motorcycle', '//www.bilibili.com/v/car/strategy', '//www.bilibili.com/v/car/life', '//www.bilibili.com/v/car', '//www.bilibili.com/v/fashion/makeup', '//www.bilibili.com/v/fashion/cos', '//www.bilibili.com/v/fashion/clothing', '//www.bilibili.com/v/fashion/trend', '//www.bilibili.com/v/fashion', '//www.bilibili.com/v/sports/basketball', '//www.bilibili.com/v/sports/football', '//www.bilibili.com/v/sports/aerobics', '//www.bilibili.com/v/sports/athletic', '//www.bilibili.com/v/sports/culture', '//www.bilibili.com/v/sports/comprehensive', '//www.bilibili.com/v/sports', '//www.bilibili.com/v/animal/cat', '//www.bilibili.com/v/animal/dog', '//www.bilibili.com/v/animal/reptiles', '//www.bilibili.com/v/animal/wild_animal', '//www.bilibili.com/v/animal/second_edition', '//www.bilibili.com/v/animal/animal_composite', '//www.bilibili.com/v/animal', '//www.bilibili.com/v/life/funny', '//www.bilibili.com/v/game/stand_alone' }; + array tids = { 33, 32, 51, 152, 13, 23, 153, 168, 169, 195, 170, 167, 11, 177, 24, 25, 47, 210, 86, 253, 27, 1, 17, 171, 172, 65, 173, 121, 136, 19, 4, 22, 26, 126, 216, 127, 119, 28, 31, 59, 30, 29, 193, 243, 244, 130, 3, 20, 198, 199, 200, 154, 156, 129, 182, 183, 85, 184, 181, 71, 241, 242, 137, 5, 201, 124, 228, 207, 208, 209, 229, 122, 36, 95, 230, 231, 232, 188, 203, 204, 205, 206, 202, 76, 212, 213, 214, 215, 211, 138, 254, 250, 251, 239, 161, 162, 21, 160, 245, 246, 246, 248, 240, 227, 176, 223, 157, 252, 158, 159, 155, 235, 249, 164, 236, 237, 238, 234, 218, 219, 222, 221, 220, 75, 217, 138, 17 }; + // array names = { '连载动画', '完结动画', '资讯', '官方延伸', '番剧', '电影', '国产动画', '国产原创相关', '布袋戏', '动态漫·广播剧', '资讯', '国创', '电视剧', '纪录片', 'MAD·AMV', 'MMD·3D', '短片·手书·配音', '手办·模玩', '特摄', '动漫杂谈', '综合', '动画', '单机游戏', '电子竞技', '手机游戏', '网络游戏', '桌游棋牌', 'GMV', '音游', 'Mugen', '游戏', '鬼畜调教', '音MAD', '人力VOCALOID', '鬼畜剧场', '教程演示', '鬼畜', '原创音乐', '翻唱', '演奏', 'VOCALOID·UTAU', '音乐现场', 'MV', '乐评盘点', '音乐教学', '音乐综合', '音乐', '宅舞', '街舞', '明星舞蹈', '中国舞', '舞蹈综合', '舞蹈教程', '舞蹈', '影视杂谈', '影视剪辑', '小剧场', '预告·资讯', '影视', '综艺', '娱乐杂谈', '粉丝创作', '明星综合', '娱乐', '科学科普', '社科·法律·心理', '人 文历史', '财经商业', '校园学习', '职业职场', '设计·创意', '野生技能协会', '知识', '数码', '软件应用', '计算机技术', '科 工机械', '科技', '热点', '环球', '社会', '综合', '资讯', '美食制作', '美食侦探', '美食测评', '田园美食', '美食记录', '美食', '搞笑', '亲子', '出行', '三农', '家居房产', '手工', '绘画', '日常', '生活', '赛车', '改装玩车', '新能源车', '房车', '摩托车', '购车攻略', '汽车生活', '汽车', '美妆护肤', '仿妆cos', '穿搭', '时尚潮流', '时尚', '篮球', '足球', '健身', ' 竞技体育', '运动文化', '运动综合', '运动', '喵星人', '汪星人', '小宠异宠', '野生动物', '动物二创', '动物综合', '动物圈', '搞笑', '单机游戏' }; + for (uint i = 0; i < urls.size(); i++) { + if (path.find(urls[i]) >= 0) { + return tids[i]; + } + } + return 0; +} + string Video(string bvid, const string &in path, dictionary &MetaData, array &QualityList) { string res; int aid; @@ -280,11 +289,6 @@ string parseBVId(string url) { return bvid; } -string parseUId(string url) { - string uid = HostRegExpParse(url, "/([0-9]+)"); - return uid; -} - int parseTime(string s) { array strs = s.split(":"); int t = 0; @@ -302,7 +306,7 @@ int parseTime(string s) { array spaceVideo(string path) { int ps = 50; string url = "/x/space/wbi/arc/search?"; - url += "mid=" + parseUId(path); + url += "mid=" + HostRegExpParse(path, "/([0-9]+)"); url += "&ps=" + ps; url += "&tid=" + parse(path, "tid", "0"); url += "&pn=1"; @@ -349,9 +353,12 @@ array FavList(string path) { JsonReader Reader; array videos; string fid = parseFid(path); - log("fid", fid); if (fid.empty()) { - string res = apiPost("/x/v3/fav/folder/created/list-all?up_mid=" + uid); + string mid = HostRegExpParse(path, "bilibili.com/([0-9]+)"); + if (mid.empty()) { + mid = "" + uid; + } + string res = apiPost("/x/v3/fav/folder/created/list-all?up_mid=" + mid); if (res.empty()) { return videos; } @@ -441,6 +448,33 @@ array followingLive(uint page) { return videos; } +array Ranking(uint tid) { + array videos; + JsonReader Reader; + JsonValue Root; + string res = apiPost("/x/web-interface/ranking/v2?rid=" + tid); + if (res.empty()) { + return videos; + } + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return videos; + } + JsonValue list = Root["data"]["list"]; + if (list.isArray()) { + for (uint i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + dictionary video; + video["title"] = item["title"].asString(); + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + videos.insertLast(video); + } + } + } + return videos; +} + int getItag(int qn) { array qns = {10000, 400, 250, 150, 80}; int idx = qns.find(qn); @@ -569,6 +603,9 @@ bool PlaylistCheck(const string &in path) { if (path.find("link.bilibili.com") >= 0 && path.find("/user-center/follow") >= 0) { return true; } + if (gettid(path) > 0) { + return true; + } return false; } @@ -597,6 +634,11 @@ array PlaylistParse(const string &in path) { return followingLive(1); } + uint tid = gettid(path); + if (tid > 0) { + return Ranking(tid); + } + return result; } From a6a17cc78ef3d526194844157ad7368a5c2cd77e Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Fri, 24 Feb 2023 16:57:58 +0800 Subject: [PATCH 003/132] update url list --- Media/PlayParse/MediaPlayParse - Bilibili.as | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index a1c34cf..ba58b8d 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -160,7 +160,7 @@ string apiPost(string api, string data="") { } uint gettid(string path) { - array urls = { '//www.bilibili.com/v/anime/serial/', '//www.bilibili.com/v/anime/finish', '//www.bilibili.com/v/anime/information/', '//www.bilibili.com/v/anime/offical/', '//www.bilibili.com/anime/', '//www.bilibili.com/movie/', '//www.bilibili.com/v/guochuang/chinese/', '//www.bilibili.com/v/guochuang/original/', '//www.bilibili.com/v/guochuang/puppetry/', '//www.bilibili.com/v/guochuang/motioncomic/', '//www.bilibili.com/v/guochuang/information/', '//www.bilibili.com/guochuang/', '//www.bilibili.com/tv/', '//www.bilibili.com/documentary/', '//www.bilibili.com/v/douga/mad/', '//www.bilibili.com/v/douga/mmd/', '//www.bilibili.com/v/douga/voice/', '//www.bilibili.com/v/douga/garage_kit/', '//www.bilibili.com/v/douga/tokusatsu/', '//www.bilibili.com/v/douga/acgntalks/', '//www.bilibili.com/v/douga/other/', '//www.bilibili.com/v/douga/', '//www.bilibili.com/v/game/stand_alone', '//www.bilibili.com/v/game/esports', '//www.bilibili.com/v/game/mobile', '//www.bilibili.com/v/game/online', '//www.bilibili.com/v/game/board', '//www.bilibili.com/v/game/gmv', '//www.bilibili.com/v/game/music', '//www.bilibili.com/v/game/mugen', '//www.bilibili.com/v/game/', '//www.bilibili.com/v/kichiku/guide', '//www.bilibili.com/v/kichiku/mad', '//www.bilibili.com/v/kichiku/manual_vocaloid', '//www.bilibili.com/v/kichiku/theatre', '//www.bilibili.com/v/kichiku/course', '//www.bilibili.com/v/kichiku/', '//www.bilibili.com/v/music/original', '//www.bilibili.com/v/music/cover', '//www.bilibili.com/v/music/perform', '//www.bilibili.com/v/music/vocaloid', '//www.bilibili.com/v/music/live', '//www.bilibili.com/v/music/mv', '//www.bilibili.com/v/music/commentary', '//www.bilibili.com/v/music/tutorial', '//www.bilibili.com/v/music/other', '//www.bilibili.com/v/music', '//www.bilibili.com/v/dance/otaku/', '//www.bilibili.com/v/dance/hiphop/', '//www.bilibili.com/v/dance/star/', '//www.bilibili.com/v/dance/china/', '//www.bilibili.com/v/dance/three_d/', '//www.bilibili.com/v/dance/demo/', '//www.bilibili.com/v/dance/', '//www.bilibili.com/v/cinephile/cinecism', '//www.bilibili.com/v/cinephile/montage', '//www.bilibili.com/v/cinephile/shortfilm', '//www.bilibili.com/v/cinephile/trailer_info', '//www.bilibili.com/v/cinephile', '//www.bilibili.com/v/ent/variety', '//www.bilibili.com/v/ent/talker', '//www.bilibili.com/v/ent/fans', '//www.bilibili.com/v/ent/celebrity', '//www.bilibili.com/v/ent/', '//www.bilibili.com/v/knowledge/science', '//www.bilibili.com/v/knowledge/social_science', '//www.bilibili.com/v/knowledge/humanity_history', '//www.bilibili.com/v/knowledge/business', '//www.bilibili.com/v/knowledge/campus', '//www.bilibili.com/v/knowlake', '//www.bilibili.com/v/life/painting', '//www.bilibili.com/v/life/daily', '//www.bilibili.com/v/life', '//www.bilibili.com/v/car/racing', '//www.bilibili.com/v/car/modifiedvehicle', '//www.bilibili.com/v/car/newenergyvehicle', '//www.bilibili.com/v/car/touringcar', '//www.bilibili.com/v/car/motorcycle', '//www.bilibili.com/v/car/strategy', '//www.bilibili.com/v/car/life', '//www.bilibili.com/v/car', '//www.bilibili.com/v/fashion/makeup', '//www.bilibili.com/v/fashion/cos', '//www.bilibili.com/v/fashion/clothing', '//www.bilibili.com/v/fashion/trend', '//www.bilibili.com/v/fashion', '//www.bilibili.com/v/sports/basketball', '//www.bilibili.com/v/sports/football', '//www.bilibili.com/v/sports/aerobics', '//www.bilibili.com/v/sports/athletic', '//www.bilibili.com/v/sports/culture', '//www.bilibili.com/v/sports/comprehensive', '//www.bilibili.com/v/sports', '//www.bilibili.com/v/animal/cat', '//www.bilibili.com/v/animal/dog', '//www.bilibili.com/v/animal/reptiles', '//www.bilibili.com/v/animal/wild_animal', '//www.bilibili.com/v/animal/second_edition', '//www.bilibili.com/v/animal/animal_composite', '//www.bilibili.com/v/animal', '//www.bilibili.com/v/life/funny', '//www.bilibili.com/v/game/stand_alone' }; + array urls = { 'www.bilibili.com/v/anime/serial', 'www.bilibili.com/v/anime/finish', 'www.bilibili.com/v/anime/information', 'www.bilibili.com/v/anime/offical', 'www.bilibili.com/anime', 'www.bilibili.com/movie', 'www.bilibili.com/v/guochuang/chinese', 'www.bilibili.com/v/guochuang/original', 'www.bilibili.com/v/guochuang/puppetry', 'www.bilibili.com/v/guochuang/motioncomic', 'www.bilibili.com/v/guochuang/information', 'www.bilibili.com/guochuang', 'www.bilibili.com/tv', 'www.bilibili.com/documentary', 'www.bilibili.com/v/douga/mad', 'www.bilibili.com/v/douga/mmd', 'www.bilibili.com/v/douga/voice', 'www.bilibili.com/v/douga/garage_kit', 'www.bilibili.com/v/douga/tokusatsu', 'www.bilibili.com/v/douga/acgntalks', 'www.bilibili.com/v/douga/other', 'www.bilibili.com/v/douga', 'www.bilibili.com/v/game/stand_alone', 'www.bilibili.com/v/game/esports', 'www.bilibili.com/v/game/mobile', 'www.bilibili.com/v/game/online', 'www.bilibili.com/v/game/board', 'www.bilibili.com/v/game/gmv', 'www.bilibili.com/v/game/music', 'www.bilibili.com/v/game/mugen', 'www.bilibili.com/v/game', 'www.bilibili.com/v/kichiku/guide', 'www.bilibili.com/v/kichiku/mad', 'www.bilibili.com/v/kichiku/manual_vocaloid', 'www.bilibili.com/v/kichiku/theatre', 'www.bilibili.com/v/kichiku/course', 'www.bilibili.com/v/kichiku', 'www.bilibili.com/v/music/original', 'www.bilibili.com/v/music/cover', 'www.bilibili.com/v/music/perform', 'www.bilibili.com/v/music/vocaloid', 'www.bilibili.com/v/music/live', 'www.bilibili.com/v/music/mv', 'www.bilibili.com/v/music/commentary', 'www.bilibili.com/v/music/tutorial', 'www.bilibili.com/v/music/other', 'www.bilibili.com/v/music', 'www.bilibili.com/v/dance/otaku', 'www.bilibili.com/v/dance/hiphop', 'www.bilibili.com/v/dance/star', 'www.bilibili.com/v/dance/china', 'www.bilibili.com/v/dance/three_d', 'www.bilibili.com/v/dance/demo', 'www.bilibili.com/v/dance', 'www.bilibili.com/v/cinephile/cinecism', 'www.bilibili.com/v/cinephile/montage', 'www.bilibili.com/v/cinephile/shortfilm', 'www.bilibili.com/v/cinephile/trailer_info', 'www.bilibili.com/v/cinephile', 'www.bilibili.com/v/ent/variety', 'www.bilibili.com/v/ent/talker', 'www.bilibili.com/v/ent/fans', 'www.bilibili.com/v/ent/celebrity', 'www.bilibili.com/v/ent', 'www.bilibili.com/v/knowledge/science', 'www.bilibili.com/v/knowledge/social_science', 'www.bilibili.com/v/knowledge/humanity_history', 'www.bilibili.com/v/knowledge/business', 'www.bilibili.com/v/knowledge/campus', 'www.bilibili.com/v/knowledge/career', 'www.bilibili.com/v/knowledge/design', 'www.bilibili.com/v/knowledge/skill', 'www.bilibili.com/v/knowledge', 'www.bilibili.com/v/tech/digital', 'www.bilibili.com/v/tech/application', 'www.bilibili.com/v/tech/computer_tech', 'www.bilibili.com/v/tech/industry', 'www.bilibili.com/v/tech', 'www.bilibili.com/v/information/hotspot', 'www.bilibili.com/v/information/global', 'www.bilibili.com/v/information/social', 'www.bilibili.com/v/information/multiple', 'www.bilibili.com/v/information', 'www.bilibili.com/v/food/make', 'www.bilibili.com/v/food/detective', 'www.bilibili.com/v/food/measurement', 'www.bilibili.com/v/food/rural', 'www.bilibili.com/v/food/record', 'www.bilibili.com/v/food', 'www.bilibili.com/v/life/funny', 'www.bilibili.com/v/life/parenting', 'www.bilibili.com/v/life/travel', 'www.bilibili.com/v/life/rurallife', 'www.bilibili.com/v/life/home', 'www.bilibili.com/v/life/handmake', 'www.bilibili.com/v/life/painting', 'www.bilibili.com/v/life/daily', 'www.bilibili.com/v/life', 'www.bilibili.com/v/car/racing', 'www.bilibili.com/v/car/modifiedvehicle', 'www.bilibili.com/v/car/newenergyvehicle', 'www.bilibili.com/v/car/touringcar', 'www.bilibili.com/v/car/motorcycle', 'www.bilibili.com/v/car/strategy', 'www.bilibili.com/v/car/life', 'www.bilibili.com/v/car', 'www.bilibili.com/v/fashion/makeup', 'www.bilibili.com/v/fashion/cos', 'www.bilibili.com/v/fashion/clothing', 'www.bilibili.com/v/fashion/trend', 'www.bilibili.com/v/fashion', 'www.bilibili.com/v/sports/basketball', 'www.bilibili.com/v/sports/football', 'www.bilibili.com/v/sports/aerobics', 'www.bilibili.com/v/sports/athletic', 'www.bilibili.com/v/sports/culture', 'www.bilibili.com/v/sports/comprehensive', 'www.bilibili.com/v/sports', 'www.bilibili.com/v/animal/cat', 'www.bilibili.com/v/animal/dog', 'www.bilibili.com/v/animal/reptiles', 'www.bilibili.com/v/animal/wild_animal', 'www.bilibili.com/v/animal/second_edition', 'www.bilibili.com/v/animal/animal_composite', 'www.bilibili.com/v/animal', 'www.bilibili.com/v/life/funny', 'www.bilibili.com/v/game/stand_alone' }; array tids = { 33, 32, 51, 152, 13, 23, 153, 168, 169, 195, 170, 167, 11, 177, 24, 25, 47, 210, 86, 253, 27, 1, 17, 171, 172, 65, 173, 121, 136, 19, 4, 22, 26, 126, 216, 127, 119, 28, 31, 59, 30, 29, 193, 243, 244, 130, 3, 20, 198, 199, 200, 154, 156, 129, 182, 183, 85, 184, 181, 71, 241, 242, 137, 5, 201, 124, 228, 207, 208, 209, 229, 122, 36, 95, 230, 231, 232, 188, 203, 204, 205, 206, 202, 76, 212, 213, 214, 215, 211, 138, 254, 250, 251, 239, 161, 162, 21, 160, 245, 246, 246, 248, 240, 227, 176, 223, 157, 252, 158, 159, 155, 235, 249, 164, 236, 237, 238, 234, 218, 219, 222, 221, 220, 75, 217, 138, 17 }; // array names = { '连载动画', '完结动画', '资讯', '官方延伸', '番剧', '电影', '国产动画', '国产原创相关', '布袋戏', '动态漫·广播剧', '资讯', '国创', '电视剧', '纪录片', 'MAD·AMV', 'MMD·3D', '短片·手书·配音', '手办·模玩', '特摄', '动漫杂谈', '综合', '动画', '单机游戏', '电子竞技', '手机游戏', '网络游戏', '桌游棋牌', 'GMV', '音游', 'Mugen', '游戏', '鬼畜调教', '音MAD', '人力VOCALOID', '鬼畜剧场', '教程演示', '鬼畜', '原创音乐', '翻唱', '演奏', 'VOCALOID·UTAU', '音乐现场', 'MV', '乐评盘点', '音乐教学', '音乐综合', '音乐', '宅舞', '街舞', '明星舞蹈', '中国舞', '舞蹈综合', '舞蹈教程', '舞蹈', '影视杂谈', '影视剪辑', '小剧场', '预告·资讯', '影视', '综艺', '娱乐杂谈', '粉丝创作', '明星综合', '娱乐', '科学科普', '社科·法律·心理', '人 文历史', '财经商业', '校园学习', '职业职场', '设计·创意', '野生技能协会', '知识', '数码', '软件应用', '计算机技术', '科 工机械', '科技', '热点', '环球', '社会', '综合', '资讯', '美食制作', '美食侦探', '美食测评', '田园美食', '美食记录', '美食', '搞笑', '亲子', '出行', '三农', '家居房产', '手工', '绘画', '日常', '生活', '赛车', '改装玩车', '新能源车', '房车', '摩托车', '购车攻略', '汽车生活', '汽车', '美妆护肤', '仿妆cos', '穿搭', '时尚潮流', '时尚', '篮球', '足球', '健身', ' 竞技体育', '运动文化', '运动综合', '运动', '喵星人', '汪星人', '小宠异宠', '野生动物', '动物二创', '动物综合', '动物圈', '搞笑', '单机游戏' }; for (uint i = 0; i < urls.size(); i++) { From ec9bc8c5b5ec486f2cf7c8e9a28cbc1b59142e70 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Fri, 24 Feb 2023 20:24:19 +0800 Subject: [PATCH 004/132] =?UTF-8?q?feat:=20=E9=80=82=E9=85=8D=E9=A6=96?= =?UTF-8?q?=E9=A1=B5=E6=8E=A8=E8=8D=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 48 +++++++++++++++++++- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index ba58b8d..14d2764 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -475,6 +475,46 @@ array Ranking(uint tid) { return videos; } +array Recommend(uint page) { + array videos; + JsonReader Reader; + JsonValue Root; + const uint nums = 5; + string url ="/x/web-interface/wbi/index/top/feed/rcmd?y_num=3&fresh_type=4&feed_version=V8&fresh_idx_1h="+page+"&fetch_row="+(3*page+1)+"&fresh_idx="+page+"&brush="+page+"&homepage_ver=1&ps=12&last_y_num=4&outside_trigger="; + string res = apiPost(url); + if (res.empty()) { + return videos; + } + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return videos; + } + JsonValue list = Root["data"]["item"]; + if (list.isArray()) { + for (uint i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + dictionary video; + if (item["uri"].asString().find("live.bilibili.com") >= 0) { + video["title"] = "【直播】" + item["owner"]["name"].asString() + " - " + item["title"].asString(); + video["url"] = item["uri"].asString(); + } else { + video["title"] = item["title"].asString(); + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = item["uri"].asString(); + } + videos.insertLast(video); + } + } + } + if (page < nums) { + array videos2 = Recommend(page+1); + for (uint i = 0; i < videos2.size(); i++) { + videos.insertLast(videos2[i]); + } + } + return videos; +} + int getItag(int qn) { array qns = {10000, 400, 250, 150, 80}; int idx = qns.find(qn); @@ -557,7 +597,6 @@ string Live(string id, const string &in path, dictionary &MetaData, array= 0 && path.find("/user-center/follow") >= 0) { return true; } + if (path.find("www.bilibili.com") >= 0 && HostRegExpParse(path, "www.bilibili.com/([a-zA-Z0-9]+)").empty()) { + return true; + } if (gettid(path) > 0) { return true; } @@ -633,7 +675,9 @@ array PlaylistParse(const string &in path) { if (path.find("link.bilibili.com") >= 0 && path.find("/user-center/follow") >= 0) { return followingLive(1); } - + if (path.find("www.bilibili.com") >= 0 && HostRegExpParse(path, "www.bilibili.com/([a-zA-Z0-9]+)").empty()) { + return Recommend(1); + } uint tid = gettid(path); if (tid > 0) { return Ranking(tid); From 9c5c31a8db84baa7dc981f9c4a8852abd76cc988 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Sat, 25 Feb 2023 12:47:31 +0800 Subject: [PATCH 005/132] =?UTF-8?q?feat:=20=E9=80=82=E9=85=8D=E7=95=AA?= =?UTF-8?q?=E5=89=A7=E3=80=81=E7=94=B5=E5=BD=B1=E3=80=81=E7=94=B5=E8=A7=86?= =?UTF-8?q?=E5=89=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 101 ++++++++++++++++--- 1 file changed, 88 insertions(+), 13 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 14d2764..929417d 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -26,6 +26,8 @@ bool debug = false; string cookie = ""; int uid = 0; +bool enable_subtitle = true; +string subtitle_url = "https://subtitle.chen310.repl.co/subtitle?font=" + HostUrlEncode("微软雅黑") + "&font_size=30.0&alpha=0.8&is_reduce_comments=false&cid="; // 是否可选择画质 bool enable_qualities = true; @@ -194,7 +196,10 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array subtitle; - dictionary dic; - dic["name"] = title; - // dic["url"] = "http://127.0.0.1:12345/subtitle?cid=" + cid; - dic["url"] = "https://subtitle.chen310.repl.co/subtitle?cid=" + cid; - subtitle.insertLast(dic); - MetaData["subtitle"] = subtitle; + if (enable_subtitle) { + array subtitle; + dictionary dic; + dic["name"] = title; + dic["url"] = subtitle_url + cid; + subtitle.insertLast(dic); + MetaData["subtitle"] = subtitle; + } + log("--------------------------------------------------"); log("标题", title); log("创建者", owner); @@ -271,11 +278,11 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array spaceVideo(string path) { dictionary video; video["title"] = item["title"].asString(); video["duration"] = parseTime(item["length"].asString()); - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; videos.insertLast(video); } } @@ -402,7 +409,7 @@ array FavList(string path) { dictionary video; video["title"] = item["title"].asString(); video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; videos.insertLast(video); } } @@ -467,7 +474,60 @@ array Ranking(uint tid) { dictionary video; video["title"] = item["title"].asString(); video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + videos.insertLast(video); + } + } + } + return videos; +} + +string md2ss(string mdid) { + JsonReader Reader; + JsonValue Root; + string ssid = ""; + string res = apiPost("/pgc/review/user?media_id=" + mdid); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + ssid = Root["result"]["media"]["season_id"].asString(); + } + } + return ssid; +} + +// type: meida_id/season_id/ep_id +array Banggumi(string id, string type) { + array videos; + JsonReader Reader; + JsonValue Root; + if (type == "media_id") { + id = md2ss(id); + if (id.empty()) { + return videos; + } + type = "season_id"; + } + string url = "/pgc/view/web/season?" + type + "=" + id; + string res = apiPost(url); + if (res.empty()) { + return videos; + } + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return videos; + } + JsonValue episodes = Root["result"]["episodes"]; + if (episodes.isArray()) { + for (uint i = 0; i < episodes.size(); i++) { + JsonValue item = episodes[i]; + dictionary video; + if (item["badge"].asString().empty()) { + video["title"] = item["share_copy"].asString(); + } else { + video["title"] = "【" + item["badge"].asString() + "】" + item["share_copy"].asString(); + } + video["duration"] = item["duration"].asInt(); + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; videos.insertLast(video); } } @@ -645,6 +705,12 @@ bool PlaylistCheck(const string &in path) { if (path.find("www.bilibili.com") >= 0 && HostRegExpParse(path, "www.bilibili.com/([a-zA-Z0-9]+)").empty()) { return true; } + if (path.find("bangumi/media/md") >= 0) { + return true; + } + if (path.find("bangumi/play/") >= 0) { + return true; + } if (gettid(path) > 0) { return true; } @@ -678,6 +744,15 @@ array PlaylistParse(const string &in path) { if (path.find("www.bilibili.com") >= 0 && HostRegExpParse(path, "www.bilibili.com/([a-zA-Z0-9]+)").empty()) { return Recommend(1); } + if (path.find("bangumi/media/md") >= 0) { + return Banggumi(HostRegExpParse(path, "bangumi/media/md([0-9]+)"), "media_id"); + } + if (path.find("bangumi/play/ep") >= 0) { + return Banggumi(HostRegExpParse(path, "bangumi/play/ep([0-9]+)"), "ep_id"); + } + if (path.find("bangumi/play/ss") >= 0) { + return Banggumi(HostRegExpParse(path, "bangumi/play/ss([0-9]+)"), "season_id"); + } uint tid = gettid(path); if (tid > 0) { return Ranking(tid); From 9ebe75bd8817a40586e343bfa20b8b25eecb3962 Mon Sep 17 00:00:00 2001 From: chen310 <33364396+chen310@users.noreply.github.com> Date: Sat, 25 Feb 2023 13:19:39 +0800 Subject: [PATCH 006/132] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index d62cde1..5f4ef60 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,8 @@ ![Test](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/test.png) +如果 Cookie 是从浏览器上复制来的,登录成功后,到浏览器中把 Bilibili 的 Cookie 删除,再重新到浏览器上登录,不然 PotPlayer 中的 Cookie 可能会很快失效(大概吧,我也不确定) + ## 使用方法 将 Bilibili 视频链接拖到 PotPlayer,或者按 ctrl + U 粘贴 Bilibili 视频链接即可播放。 From a7214911ff5911f1169306a5d73a8d556c5c596f Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Sat, 25 Feb 2023 17:16:10 +0800 Subject: [PATCH 007/132] =?UTF-8?q?=E5=88=86=E5=8C=BA=E6=8E=92=E8=A1=8C?= =?UTF-8?q?=E6=A6=9C&=E6=9C=80=E6=96=B0=E6=8A=95=E7=A8=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 56 ++++++++++++++++++-- 1 file changed, 53 insertions(+), 3 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 929417d..446335b 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -455,11 +455,28 @@ array followingLive(uint page) { return videos; } -array Ranking(uint tid) { +array Ranking(string path) { array videos; + + array names = { "全站", "国创相关", "动画", "音乐", "舞蹈", "游戏", "知识", "科技", "运动", "汽车", "生活", "美食", "动物圈", "鬼畜", "时尚", "娱乐", "影视" }; + array urls = { "www.bilibili.com/v/popular/rank/all", "www.bilibili.com/v/popular/rank/guochuang", "www.bilibili.com/v/popular/rank/douga", "www.bilibili.com/v/popular/rank/music", "www.bilibili.com/v/popular/rank/dance", "www.bilibili.com/v/popular/rank/game", "www.bilibili.com/v/popular/rank/knowledge", "www.bilibili.com/v/popular/rank/tec", "www.bilibili.com/v/popular/rank/spor", "www.bilibili.com/v/popular/rank/car", "www.bilibili.com/v/popular/rank/life", "www.bilibili.com/v/popular/rank/food", "www.bilibili.com/v/popular/rank/animal", "www.bilibili.com/v/popular/rank/kichiku", "www.bilibili.com/v/popular/rank/fashion", "www.bilibili.com/v/popular/rank/en", "www.bilibili.com/v/popular/rank/cinephile" }; + array ids = { 0, 168, 1, 3, 129, 4, 36, 188, 234, 223, 160, 211, 217, 119, 155, 5, 181 }; + uint pos = -1; + for (uint i = 0; i < urls.size(); i++) { + if (path.find(urls[i]) >= 0) { + pos = i; + break; + } + } + if (pos < 0) { + return videos; + } + string url; + JsonReader Reader; JsonValue Root; - string res = apiPost("/x/web-interface/ranking/v2?rid=" + tid); + + string res = apiPost(url = "/x/web-interface/ranking/v2?rid=" + ids[pos]); if (res.empty()) { return videos; } @@ -482,6 +499,33 @@ array Ranking(uint tid) { return videos; } +array Dynamic(uint tid) { + array videos; + JsonReader Reader; + JsonValue Root; + string res = apiPost("/x/web-interface/dynamic/region?pn=1&ps=50&rid=" + tid); + if (res.empty()) { + return videos; + } + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return videos; + } + JsonValue list = Root["data"]["archives"]; + if (list.isArray()) { + for (uint i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + dictionary video; + video["title"] = item["title"].asString(); + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + videos.insertLast(video); + } + } + } + return videos; +} + string md2ss(string mdid) { JsonReader Reader; JsonValue Root; @@ -711,6 +755,9 @@ bool PlaylistCheck(const string &in path) { if (path.find("bangumi/play/") >= 0) { return true; } + if (path.find("www.bilibili.com/v/popular/rank") >= 0) { + return true; + } if (gettid(path) > 0) { return true; } @@ -753,9 +800,12 @@ array PlaylistParse(const string &in path) { if (path.find("bangumi/play/ss") >= 0) { return Banggumi(HostRegExpParse(path, "bangumi/play/ss([0-9]+)"), "season_id"); } + if (path.find("www.bilibili.com/v/popular/rank") >= 0) { + return Ranking(path); + } uint tid = gettid(path); if (tid > 0) { - return Ranking(tid); + return Dynamic(tid); } return result; From 3a036abdb7d0c29251bf7671ca99cf3375e406e6 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Sat, 25 Feb 2023 17:50:09 +0800 Subject: [PATCH 008/132] add urllist --- Media/UrlList/MediaUrlList - Bilibili.as | 118 ++++++++++++++++++++++ Media/UrlList/MediaUrlList - Bilibili.ico | Bin 0 -> 4286 bytes README.md | 6 +- public/urllist.png | Bin 0 -> 64021 bytes 4 files changed, 123 insertions(+), 1 deletion(-) create mode 100644 Media/UrlList/MediaUrlList - Bilibili.as create mode 100644 Media/UrlList/MediaUrlList - Bilibili.ico create mode 100644 public/urllist.png diff --git a/Media/UrlList/MediaUrlList - Bilibili.as b/Media/UrlList/MediaUrlList - Bilibili.as new file mode 100644 index 0000000..b055711 --- /dev/null +++ b/Media/UrlList/MediaUrlList - Bilibili.as @@ -0,0 +1,118 @@ +/* + media url search by bilibili + author: chen310 + link: https://github.com/chen310/BilibiliPotPlayer +*/ + +// void OnInitialize() +// void OnFinalize() +// string GetTitle() -> get title for UI +// string GetVersion -> get version for manage +// string GetDesc() -> get detail information +// string GetLoginTitle() -> get title for login dialog +// string GetLoginDesc() -> get desc for login dialog +// string GetUserText() -> get user text for login dialog +// string GetPasswordText() -> get password text for login dialog +// string ServerCheck(string User, string Pass) -> server check +// string ServerLogin(string User, string Pass) -> login +// void ServerLogout() -> logout +//------------------------------------------------------------------------------------------------ +// array GetCategorys() -> get category list +// string GetSorts(string Category, string Extra, string PathToken, string Query) -> get sort option +// array GetUrlList(string Category, string Extra, string PathToken, string Query, string PageToken) -> get url list for Category + +string GetTitle() +{ + return "Bilibili"; +} + +string GetVersion() +{ + return "1.0"; +} + +string GetDesc() +{ + return "https://www.bilibili.com"; +} + +array Ranking() { + array ret; + array urls = { "https://www.bilibili.com/v/popular/rank/all", "https://www.bilibili.com/v/popular/rank/guochuang", "https://www.bilibili.com/v/popular/rank/douga", "https://www.bilibili.com/v/popular/rank/music", "https://www.bilibili.com/v/popular/rank/dance", "https://www.bilibili.com/v/popular/rank/game", "https://www.bilibili.com/v/popular/rank/knowledge", "https://www.bilibili.com/v/popular/rank/tec", "https://www.bilibili.com/v/popular/rank/spor", "https://www.bilibili.com/v/popular/rank/car", "https://www.bilibili.com/v/popular/rank/life", "https://www.bilibili.com/v/popular/rank/food", "https://www.bilibili.com/v/popular/rank/animal", "https://www.bilibili.com/v/popular/rank/kichiku", "https://www.bilibili.com/v/popular/rank/fashion", "https://www.bilibili.com/v/popular/rank/en", "https://www.bilibili.com/v/popular/rank/cinephile" }; + array names = { "全站", "国创相关", "动画", "音乐", "舞蹈", "游戏", "知识", "科技", "运动", "汽车", "生活", "美食", "动物圈", "鬼畜", "时尚", "娱乐", "影视" }; + for (uint i = 0; i < urls.size(); i++) { + dictionary channel; + channel["title"] = names[i]; + channel["url"] = urls[i]; + ret.insertLast(channel); + } + return ret; +} + +array Dynamic() { + array ret; + array urls = { 'https://www.bilibili.com/anime/', 'https://www.bilibili.com/v/anime/serial/', 'https://www.bilibili.com/v/anime/finish', 'https://www.bilibili.com/v/anime/information/', 'https://www.bilibili.com/v/anime/offical/', 'https://www.bilibili.com/movie/', 'https://www.bilibili.com/guochuang/', 'https://www.bilibili.com/v/guochuang/chinese/', 'https://www.bilibili.com/v/guochuang/original/', 'https://www.bilibili.com/v/guochuang/puppetry/', 'https://www.bilibili.com/v/guochuang/motioncomic/', 'https://www.bilibili.com/v/guochuang/information/', 'https://www.bilibili.com/tv/', 'https://www.bilibili.com/documentary/', 'https://www.bilibili.com/v/douga/', 'https://www.bilibili.com/v/douga/mad/', 'https://www.bilibili.com/v/douga/mmd/', 'https://www.bilibili.com/v/douga/voice/', 'https://www.bilibili.com/v/douga/garage_kit/', 'https://www.bilibili.com/v/douga/tokusatsu/', 'https://www.bilibili.com/v/douga/acgntalks/', 'https://www.bilibili.com/v/douga/other/', 'https://www.bilibili.com/v/game/', 'https://www.bilibili.com/v/game/stand_alone', 'https://www.bilibili.com/v/game/esports', 'https://www.bilibili.com/v/game/mobile', 'https://www.bilibili.com/v/game/online', 'https://www.bilibili.com/v/game/board', 'https://www.bilibili.com/v/game/gmv', 'https://www.bilibili.com/v/game/music', 'https://www.bilibili.com/v/game/mugen', 'https://www.bilibili.com/v/kichiku/', 'https://www.bilibili.com/v/kichiku/guide', 'https://www.bilibili.com/v/kichiku/mad', 'https://www.bilibili.com/v/kichiku/manual_vocaloid', 'https://www.bilibili.com/v/kichiku/theatre', 'https://www.bilibili.com/v/kichiku/course', 'https://www.bilibili.com/v/music', 'https://www.bilibili.com/v/music/original', 'https://www.bilibili.com/v/music/cover', 'https://www.bilibili.com/v/music/perform', 'https://www.bilibili.com/v/music/vocaloid', 'https://www.bilibili.com/v/music/live', 'https://www.bilibili.com/v/music/mv', 'https://www.bilibili.com/v/music/commentary', 'https://www.bilibili.com/v/music/tutorial', 'https://www.bilibili.com/v/music/other', 'https://www.bilibili.com/v/dance/', 'https://www.bilibili.com/v/dance/otaku/', 'https://www.bilibili.com/v/dance/hiphop/', 'https://www.bilibili.com/v/dance/star/', 'https://www.bilibili.com/v/dance/china/', 'https://www.bilibili.com/v/dance/three_d/', 'https://www.bilibili.com/v/dance/demo/', 'https://www.bilibili.com/v/cinephile', 'https://www.bilibili.com/v/cinephile/cinecism', 'https://www.bilibili.com/v/cinephile/montage', 'https://www.bilibili.com/v/cinephile/shortfilm', 'https://www.bilibili.com/v/cinephile/trailer_info', 'https://www.bilibili.com/v/ent/', 'https://www.bilibili.com/v/ent/variety', 'https://www.bilibili.com/v/ent/talker', 'https://www.bilibili.com/v/ent/fans', 'https://www.bilibili.com/v/ent/celebrity', 'https://www.bilibili.com/v/knowledge/', 'https://www.bilibili.com/v/knowledge/science', 'https://www.bilibili.com/v/knowledge/social_science', 'https://www.bilibili.com/v/knowledge/humanity_history', 'https://www.bilibili.com/v/knowledge/business', 'https://www.bilibili.com/v/knowledge/campus', 'https://www.bilibili.com/v/knowledge/career', 'https://www.bilibili.com/v/knowledge/design', 'https://www.bilibili.com/v/knowledge/skill', 'https://www.bilibili.com/v/tech/', 'https://www.bilibili.com/v/tech/digital', 'https://www.bilibili.com/v/tech/application', 'https://www.bilibili.com/v/tech/computer_tech', 'https://www.bilibili.com/v/tech/industry', 'https://www.bilibili.com/v/information/', 'https://www.bilibili.com/v/information/hotspot', 'https://www.bilibili.com/v/information/global', 'https://www.bilibili.com/v/information/social', 'https://www.bilibili.com/v/information/multiple', 'https://www.bilibili.com/v/food', 'https://www.bilibili.com/v/food/make', 'https://www.bilibili.com/v/food/detective', 'https://www.bilibili.com/v/food/measurement', 'https://www.bilibili.com/v/food/rural', 'https://www.bilibili.com/v/food/record', 'https://www.bilibili.com/v/life', 'https://www.bilibili.com/v/life/funny', 'https://www.bilibili.com/v/life/parenting', 'https://www.bilibili.com/v/life/travel', 'https://www.bilibili.com/v/life/rurallife', 'https://www.bilibili.com/v/life/home', 'https://www.bilibili.com/v/life/handmake', 'https://www.bilibili.com/v/life/painting', 'https://www.bilibili.com/v/life/daily', 'https://www.bilibili.com/v/car', 'https://www.bilibili.com/v/car/racing', 'https://www.bilibili.com/v/car/modifiedvehicle', 'https://www.bilibili.com/v/car/newenergyvehicle', 'https://www.bilibili.com/v/car/touringcar', 'https://www.bilibili.com/v/car/motorcycle', 'https://www.bilibili.com/v/car/strategy', 'https://www.bilibili.com/v/car/life', 'https://www.bilibili.com/v/fashion', 'https://www.bilibili.com/v/fashion/makeup', 'https://www.bilibili.com/v/fashion/cos', 'https://www.bilibili.com/v/fashion/clothing', 'https://www.bilibili.com/v/fashion/trend', 'https://www.bilibili.com/v/sports', 'https://www.bilibili.com/v/sports/basketball', 'https://www.bilibili.com/v/sports/football', 'https://www.bilibili.com/v/sports/aerobics', 'https://www.bilibili.com/v/sports/athletic', 'https://www.bilibili.com/v/sports/culture', 'https://www.bilibili.com/v/sports/comprehensive', 'https://www.bilibili.com/v/animal', 'https://www.bilibili.com/v/animal/cat', 'https://www.bilibili.com/v/animal/dog', 'https://www.bilibili.com/v/animal/reptiles', 'https://www.bilibili.com/v/animal/wild_animal', 'https://www.bilibili.com/v/animal/second_edition', 'https://www.bilibili.com/v/animal/animal_composite', 'https://www.bilibili.com/v/life/funny', 'https://www.bilibili.com/v/game/stand_alone' }; + array names = { '番剧', '- 连载动画', '- 完结动画', '- 资讯', '- 官方延伸', '电影', '国创', '- 国产动画', '- 国产原创相关', '- 布袋戏', '- 动态漫·广播剧', '- 资讯', '电视剧', '纪录片', '动画', '- MAD·AMV', '- MMD·3D', '- 短片·手书·配音', '- 手办·模玩', '- 特摄', '- 动漫杂谈', '- 综合', '游戏', '- 单机游戏', '- 电子竞技', '- 手机游戏', '- 网络游戏', '- 桌游棋牌', '- GMV', '- 音游', '- Mugen', '鬼畜', '- 鬼畜调教', '- 音MAD', '- 人力VOCALOID', '- 鬼畜剧场', '- 教程演示', '音乐', '- 原创音乐', '- 翻唱', '- 演奏', '- VOCALOID·UTAU', '- 音乐现场', '- MV', '- 乐评盘点', '- 音乐教学', '- 音乐综合', '舞蹈', '- 宅舞', '- 街舞', '- 明星舞蹈', '- 中国舞', '- 舞蹈综合', '- 舞蹈教程', '影视', '- 影视杂谈', '- 影视剪辑', '- 小剧场', '- 预告·资讯', '娱乐', '- 综艺', '- 娱乐杂谈', '- 粉丝创作', '- 明星综合', '知识', '- 科学科普', '- 社科·法律·心理', '- 人文历史', '- 财经商业', '- 校园学习', '- 职业职场', '- 设计·创意', '- 野生技能协会', '科技', '- 数 码', '- 软件应用', '- 计算机技术', '- 科工机械', '资讯', '- 热点', '- 环球', '- 社会', '- 综合', '美食', '- 美食制作', '- 美食侦探', '- 美食测评', '- 田园美食', '- 美食记录', '生活', '- 搞笑', '- 亲子', '- 出行', '- 三农', '- 家居房产', '- 手工', '- 绘画', '- 日常', '汽车', '- 赛车', '- 改装玩车', '- 新能源车', '- 房车', '- 摩托车', '- 购车攻略', '- 汽车生活', '时尚', '- 美妆护肤', '- 仿妆cos', '- 穿搭', '- 时尚潮流', '运动', '- 篮球', '- 足球', '- 健身', '- 竞技 体育', '- 运动文化', '- 运动综合', '动物圈', '- 喵星人', '- 汪星人', '- 小宠异宠', '- 野生动物', '- 动物二创', '- 动物综合', '搞笑', '单机游戏' }; + for (uint i = 0; i < urls.size(); i++) { + dictionary channel; + channel["title"] = names[i]; + channel["url"] = urls[i]; + ret.insertLast(channel); + } + return ret; +} + +array Other() { + array ret; + array urls = { "https://www.bilibili.com", "https://link.bilibili.com/p/center/index#/user-center/follow/1" }; + array names = { "首页推荐", "我关注的直播" }; + for (uint i = 0; i < urls.size(); i++) { + dictionary channel; + channel["title"] = names[i]; + channel["url"] = urls[i]; + ret.insertLast(channel); + } + return ret; +} + +array GetCategorys() +{ + array ret; + + { + dictionary item; + item["title"] = "分区 - 排行榜"; + item["Category"] = "Ranking"; + ret.insertLast(item); + } + { + dictionary item; + item["title"] = "分区 - 最新投稿"; + item["Category"] = "Dynamic"; + ret.insertLast(item); + } + { + dictionary item; + item["title"] = "其它"; + item["Category"] = "Other"; + ret.insertLast(item); + } + + return ret; +} + +array GetUrlList(string Category, string Extra, string PathToken, string Query, string PageToken) +{ + if (Category == "Ranking") { + return Ranking(); + } + if (Category == "Dynamic") { + return Dynamic(); + } + if (Category == "Other") { + return Other(); + } + + array ret; + return ret; +} diff --git a/Media/UrlList/MediaUrlList - Bilibili.ico b/Media/UrlList/MediaUrlList - Bilibili.ico new file mode 100644 index 0000000000000000000000000000000000000000..628ecb4a389b87478bc487a6a6540e18cd136eda GIT binary patch literal 4286 zcmd^@u}T9$6h%iONg=p`Ac{p&`WLa)pAfWGe<7cuU4B68G-6?)Hr6RbL7N3FA_T^J z%|00~vu;)Qt<>-sCstvTnmAf((j#QetxW2;LOO%l#| z@Bg*#PMs^%M0*TfL9dWcEPB$L46=;Nb`!dWQZvi^ZVD#ZEr@Yh?X2>*1^eh1*tRFK zFNJ@GcpVDwPl`V8F};n=mh3mlZ6Hp;i+ONgA^$~Uj>YDs%!T||KP4;X6=R0E*qoHP zkQM8vWW~H<%rK{OcJWL+LiZ5+I<9e5eaMRS)$ajJtK&L!T;r;G^D1lAPwRACH*@uz~$7kIqy9v$n>}Px8nXd)$`Iz_lllvtzd^UL<>^v4b zm)N?0+R~Hvn+&o-cC5dQnhQvI%w>`Jb?akH%W-{m*f#IGHB7T-^Vu)iH~p=qtSwu^ z!4z}Nb5HoZ7Sph8eryf&wDGET5w$1K6V!+5u+5uuIQJQ%7d>t4v;6~qe`5*W51ecC y_^*QE(?F`_{V?-B|Dr6A@30W84^YN3CIdl;!Oazuj>gSpN=wm~24+ literal 0 HcmV?d00001 diff --git a/README.md b/README.md index 5f4ef60..06f0a5a 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,11 @@ ## 安装插件 -将项目 `Media/PlayParse` 路径下的 `MediaPlayParse - Bilibili.as` 和 `MediaPlayParse - Bilibili.ico` 两个文件复制到 `{PotPlayer 安装路径}\Extension\Media\PlayParse` 文件夹下。 +将项目 `Media/PlayParse` 路径下的 `MediaPlayParse - Bilibili.as` 和 `MediaPlayParse - Bilibili.ico` 两个文件复制到 `{PotPlayer 安装路径}\Extension\Media\PlayParse` 文件夹下。`MediaPlayParse - Bilibili.as` 提供了解析 `Bilibil` 链接的功能。 + +将项目 `Media/UrlList` 路径下的 `MediaUrlList - Bilibili.as` 和 `MediaUrlList - Bilibili.ico` 两个文件复制到 `{PotPlayer 安装路径}\Extension\Media\UrlList` 文件夹下。`MediaUrlList - Bilibili.as` 提供了列出 `Bilibil` 常用链接的功能,使用方式为按下 ctrl + U 并选择要播放的项目,如下图所示 + +![UrlList](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/urllist.png) ## 登录 diff --git a/public/urllist.png b/public/urllist.png new file mode 100644 index 0000000000000000000000000000000000000000..de376d8c7615a3234fa4197e00e556a2ee727ba9 GIT binary patch literal 64021 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 literal 0 HcmV?d00001 From 8688c6b538615a74e94303f3707aa349ae2d4181 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Sat, 25 Feb 2023 20:36:10 +0800 Subject: [PATCH 009/132] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=AD=97=E5=B9=95?= =?UTF-8?q?=EF=BC=8C=E5=8F=AF=E4=BB=A5=E5=90=8C=E6=97=B6=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E5=BC=B9=E5=B9=95=E5=92=8C=E5=AD=97=E5=B9=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 32 ++++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 446335b..2d9f02d 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -27,7 +27,9 @@ bool debug = false; string cookie = ""; int uid = 0; bool enable_subtitle = true; -string subtitle_url = "https://subtitle.chen310.repl.co/subtitle?font=" + HostUrlEncode("微软雅黑") + "&font_size=30.0&alpha=0.8&is_reduce_comments=false&cid="; +string subtitle_host = "https://subtitle.chen310.repl.co"; +string danmaku_url = subtitle_host + "/subtitle?font=" + HostUrlEncode("微软雅黑") + "&font_size=30.0&alpha=0.8&is_reduce_comments=false&cid="; +string subtitle_url = subtitle_host + "/subtitle?url="; // 是否可选择画质 bool enable_qualities = true; @@ -200,7 +202,25 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array subtitle; + dictionary dic; + dic["name"] = "【弹幕】" + title; + dic["url"] = danmaku_url + cid; + subtitle.insertLast(dic); + JsonValue subs = root["data"]["subtitle"]["list"]; + if (subs.isArray()) { + for (uint i = 0; i < subs.size(); i++) { + JsonValue sub = subs[i]; + dictionary dic; + dic["name"] = "【字幕】" + sub["lan_doc"].asString(); + dic["url"] = subtitle_url + sub["subtitle_url"].asString(); + subtitle.insertLast(dic); + } + } + MetaData["subtitle"] = subtitle; + } } else { return url; } @@ -255,14 +275,6 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array subtitle; - dictionary dic; - dic["name"] = title; - dic["url"] = subtitle_url + cid; - subtitle.insertLast(dic); - MetaData["subtitle"] = subtitle; - } log("--------------------------------------------------"); log("标题", title); From 998dc0ab848263f8bbba76a0d6cb3369ad3b5014 Mon Sep 17 00:00:00 2001 From: chen310 <33364396+chen310@users.noreply.github.com> Date: Sun, 26 Feb 2023 10:00:09 +0800 Subject: [PATCH 010/132] Update MediaPlayParse - Bilibili.as --- Media/PlayParse/MediaPlayParse - Bilibili.as | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 2d9f02d..c7a4e61 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -473,7 +473,7 @@ array Ranking(string path) { array names = { "全站", "国创相关", "动画", "音乐", "舞蹈", "游戏", "知识", "科技", "运动", "汽车", "生活", "美食", "动物圈", "鬼畜", "时尚", "娱乐", "影视" }; array urls = { "www.bilibili.com/v/popular/rank/all", "www.bilibili.com/v/popular/rank/guochuang", "www.bilibili.com/v/popular/rank/douga", "www.bilibili.com/v/popular/rank/music", "www.bilibili.com/v/popular/rank/dance", "www.bilibili.com/v/popular/rank/game", "www.bilibili.com/v/popular/rank/knowledge", "www.bilibili.com/v/popular/rank/tec", "www.bilibili.com/v/popular/rank/spor", "www.bilibili.com/v/popular/rank/car", "www.bilibili.com/v/popular/rank/life", "www.bilibili.com/v/popular/rank/food", "www.bilibili.com/v/popular/rank/animal", "www.bilibili.com/v/popular/rank/kichiku", "www.bilibili.com/v/popular/rank/fashion", "www.bilibili.com/v/popular/rank/en", "www.bilibili.com/v/popular/rank/cinephile" }; array ids = { 0, 168, 1, 3, 129, 4, 36, 188, 234, 223, 160, 211, 217, 119, 155, 5, 181 }; - uint pos = -1; + int pos = -1; for (uint i = 0; i < urls.size(); i++) { if (path.find(urls[i]) >= 0) { pos = i; From 464ea5e73c063556a04cff49450f089be01cb832 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Sun, 26 Feb 2023 10:32:33 +0800 Subject: [PATCH 011/132] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=88=86?= =?UTF-8?q?=E8=BE=A8=E7=8E=87=E6=98=BE=E7=A4=BA=E9=94=99=E8=AF=AF=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index c7a4e61..da77674 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -184,7 +184,8 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array qn && quality > qn) { + continue; + } log("qn", quality); dictionary qualityitem; if (quality == qn) { From 0e701b1b44197628988675f2891636d994849e29 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Sun, 26 Feb 2023 10:50:12 +0800 Subject: [PATCH 012/132] =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=BE=93=E5=85=A5coo?= =?UTF-8?q?kie=E6=97=B6=E7=9A=84=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index da77674..673b36e 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -100,7 +100,10 @@ string ServerLogin(string User, string Pass) { if (Pass.empty()) return "cookie 为空"; handleCookie(Pass); - return "200 ok"; + if (cookie.empty()) { + return "您输入的 cookie 不可用"; + } + return "cookie 设置成功"; } void handleCookie(string full_cookie) { From fc2d6e6b48187951c589b7428646d87f6296389e Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Sun, 26 Feb 2023 16:03:31 +0800 Subject: [PATCH 013/132] =?UTF-8?q?feat:=20=E9=80=82=E9=85=8D=E9=9F=B3?= =?UTF-8?q?=E4=B9=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 87 +++++++++++++++++++- 1 file changed, 83 insertions(+), 4 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 673b36e..a1cf52d 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -459,7 +459,7 @@ array followingLive(uint page) { } dictionary video; video["title"] = item["uname"].asString() + " - " + item["title"].asString(); - video["url"] = "https://live.bilibili.com/" + item["roomid"].asInt(); + video["url"] = "https://live.bilibili.com/" + item["roomid"].asInt() + "?isfromlist=true"; videos.insertLast(video); } if (page < Root["data"]["totalPage"].asInt()) { @@ -598,6 +598,39 @@ array Banggumi(string id, string type) { return videos; } +array AudioList(string path) { + array audios; + JsonReader Reader; + JsonValue Root; + string id = HostRegExpParse(path, "www.bilibili.com/audio/am([0-9]+)"); + if (id.empty()) { + return audios; + } + string url = "https://www.bilibili.com/audio/music-service-c/web/song/of-menu?pn=1&ps=100&sid=" + id; + string res = post(url); + res = HostDecompress(res); + if (res.empty()) { + return audios; + } + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return audios; + } + JsonValue data = Root["data"]["data"]; + if (data.isArray()) { + for (uint i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + dictionary audio; + audio["title"] = item["title"].asString(); + audio["duration"] = item["duration"].asInt() * 1000; + audio["url"] = "https://www.bilibili.com/audio/au" + item["statistic"]["sid"].asInt() + "?isfromlist=true"; + audios.insertLast(audio); + } + } + } + return audios; +} + array Recommend(uint page) { array videos; JsonReader Reader; @@ -619,11 +652,11 @@ array Recommend(uint page) { dictionary video; if (item["uri"].asString().find("live.bilibili.com") >= 0) { video["title"] = "【直播】" + item["owner"]["name"].asString() + " - " + item["title"].asString(); - video["url"] = item["uri"].asString(); + video["url"] = item["uri"].asString() + "?isfromlist=true"; } else { video["title"] = item["title"].asString(); video["duration"] = item["duration"].asInt() * 1000; - video["url"] = item["uri"].asString(); + video["url"] = item["uri"].asString() + "?isfromlist=true"; } videos.insertLast(video); } @@ -666,6 +699,38 @@ string getVideoquality(int qn) { return "未知"; } +string Audio(const string &in path, dictionary &MetaData, array &QualityList) { + string id = HostRegExpParse(path, "/audio/au([0-9]+)"); + JsonReader Reader; + JsonValue Root; + string url; + string res; + if (parse(path, "isfromlist") != "true") { + res = post("https://www.bilibili.com/audio/music-service-c/web/song/info?sid=" + id); + res = HostDecompress(res); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return ""; + } + JsonValue data = Root["data"]; + MetaData["title"] = data["uname"].asString() + " - " + data["title"].asString(); + MetaData["SourceUrl"] = path; + } + } + res = post("https://www.bilibili.com/audio/music-service-c/web/url?privilege=2&quality=2&sid=" + id); + res = HostDecompress(res); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return ""; + } + JsonValue data = Root["data"]["cdns"]; + if (data.isArray()) { + return data[0].asString(); + } + } + return url; +} + string Live(string id, const string &in path, dictionary &MetaData, array &QualityList) { string url = ""; int room_id = 0; @@ -678,7 +743,9 @@ string Live(string id, const string &in path, dictionary &MetaData, array= 0) { return true; } + if (path.find("www.bilibili.com/audio/au") >= 0) { + return true; + } return false; } @@ -780,6 +850,9 @@ bool PlaylistCheck(const string &in path) { if (gettid(path) > 0) { return true; } + if (path.find("www.bilibili.com/audio/am") >= 0) { + return true; + } return false; } @@ -822,6 +895,9 @@ array PlaylistParse(const string &in path) { if (path.find("www.bilibili.com/v/popular/rank") >= 0) { return Ranking(path); } + if (path.find("www.bilibili.com/audio/am") >= 0) { + return AudioList(path); + } uint tid = gettid(path); if (tid > 0) { return Dynamic(tid); @@ -841,6 +917,9 @@ string PlayitemParse(const string &in path, dictionary &MetaData, array= 0) { + return Audio(path, MetaData, QualityList); + } return path; } From b2bbe5e222c751cd14eba40a10f5cfd89b5bbc98 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Sun, 26 Feb 2023 16:37:11 +0800 Subject: [PATCH 014/132] =?UTF-8?q?feat:=20=E9=80=82=E9=85=8D=E5=90=88?= =?UTF-8?q?=E9=9B=86=E5=92=8C=E8=A7=86=E9=A2=91=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 37 ++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index a1cf52d..7bb2ca3 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -329,6 +329,37 @@ int parseTime(string s) { return t; } +array Channel(string path) { + int ps = 100; + string uid = HostRegExpParse(path, "/([0-9]+)"); + string sid = parse(path, "sid"); + string url = "/x/polymer/space/seasons_archives_list?mid=" + uid + "&season_id=" + sid + "&sort_reverse=" + parse(path, "sort_reverse", "false") + "&page_num=1&page_size=" + ps; + string res = apiPost(url); + array videos; + if (!res.empty()) { + JsonReader Reader; + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue data = Root["data"]["archives"]; + if (data.isArray()) { + for (uint i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + if (item.isObject()) { + dictionary video; + video["title"] = item["title"].asString(); + video["duration"] = item["length"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + videos.insertLast(video); + } + } + } + } + } + } + return videos; +} + array spaceVideo(string path) { int ps = 50; string url = "/x/space/wbi/arc/search?"; @@ -822,6 +853,9 @@ bool PlaylistCheck(const string &in path) { else if (path.find("/favlist") >= 0) { return true; } + else if (path.find("/channel/collectiondetail") >= 0) { + return true; + } else if (HostRegExpParse(path, "/([0-9]+)/[a-zA-Z0-9]").empty()) { return true; } @@ -870,6 +904,9 @@ array PlaylistParse(const string &in path) { else if (path.find("/favlist") >= 0) { return FavList(path); } + else if (path.find("/channel/collectiondetail") >= 0) { + return Channel(path); + } else if (HostRegExpParse(path, "/([0-9]+)/[a-zA-Z0-9]").empty()) { return spaceVideo(path); } From a51a289012b426a24669760063954b36dd5958b4 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Sun, 26 Feb 2023 18:05:09 +0800 Subject: [PATCH 015/132] =?UTF-8?q?=E9=80=82=E9=85=8D=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E5=88=86p=E7=9A=84=E6=83=85=E5=86=B5:=20=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E6=97=B6=E4=B8=8D=E4=BC=9A=E5=88=86p?= =?UTF-8?q?=EF=BC=8C=E6=92=AD=E6=94=BE=E5=8D=95=E4=B8=AA=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E6=97=B6=E6=89=8D=E4=BC=9A=E5=88=86p?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 87 +++++++++++++++----- 1 file changed, 68 insertions(+), 19 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 7bb2ca3..0adee62 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -178,20 +178,57 @@ uint gettid(string path) { return 0; } +// 分P +array VideoPages(string path) { + string bvid = parseBVId(path); + array videos; + if (bvid.empty()) { + return videos; + } + string res = apiPost("/x/web-interface/view?bvid=" + bvid); + if (!res.empty()) { + JsonReader Reader; + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue data = Root["data"]["pages"]; + if (data.isArray()) { + for (uint i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + if (item.isObject()) { + dictionary video; + video["title"] = item["part"].asString(); + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + Root["data"]["bvid"].asString() + "?isfromlist=true&cid=" + item["cid"].asInt(); + videos.insertLast(video); + } + } + } + } + } + } + return videos; +} + string Video(string bvid, const string &in path, dictionary &MetaData, array &QualityList) { + log("--------------------------------------------------"); string res; int aid; - int cid; string title; - string owner; string url; JsonReader reader; JsonValue root; int defaultQn = 120; int qn = defaultQn; string quality; + string cid = parse(path, "cid"); + bool isPart = !cid.empty(); + if (isPart) { + res = apiPost("/x/player/v2?bvid=" + bvid + "&cid=" + cid); + } else { + res = apiPost("/x/web-interface/view?bvid=" + bvid); + } - res = apiPost("/x/web-interface/view?bvid=" + bvid); if (res.empty()) { return url; } @@ -200,26 +237,34 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array subtitle; dictionary dic; - dic["name"] = "【弹幕】" + title; + if (isPart) { + dic["name"] = "【弹幕】"; + } else { + dic["name"] = "【弹幕】" + data["title"].asString(); + title = data["title"].asString(); + } dic["url"] = danmaku_url + cid; subtitle.insertLast(dic); - JsonValue subs = root["data"]["subtitle"]["list"]; + JsonValue subs; + if (isPart) { + subs = root["data"]["subtitle"]["subtitles"]; + } else { + subs = root["data"]["subtitle"]["list"]; + } if (subs.isArray()) { for (uint i = 0; i < subs.size(); i++) { JsonValue sub = subs[i]; dictionary dic; dic["name"] = "【字幕】" + sub["lan_doc"].asString(); - dic["url"] = subtitle_url + sub["subtitle_url"].asString(); + if (sub["subtitle_url"].asString().find("http") == 0) { + dic["url"] = subtitle_url + sub["subtitle_url"].asString(); + } else { + dic["url"] = subtitle_url + "http:" + sub["subtitle_url"].asString(); + } subtitle.insertLast(dic); } } @@ -248,7 +293,6 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array qn && quality > qn) { continue; } - log("qn", quality); dictionary qualityitem; if (quality == qn) { qualityitem["url"] = url; @@ -282,10 +326,9 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array= 0) { + if (path.find("/video/BV") >= 0 && path.find("isfromlist") >= 0) { return true; } @@ -843,6 +886,9 @@ bool PlaylistCheck(const string &in path) { if (path.find("bilibili.com") < 0) { return false; } + if (path.find("/video/BV") >= 0 && path.find("isfromlist") < 0) { + return true; + } if (path.find("space.bilibili.com") >= 0) { if (path.find("/video") >= 0) { return true; @@ -894,6 +940,9 @@ bool PlaylistCheck(const string &in path) { array PlaylistParse(const string &in path) { array result; + if (path.find("/video/BV") >= 0 && path.find("isfromlist") < 0) { + return VideoPages(path); + } if (path.find("space.bilibili.com") >= 0) { if (path.find("/video") >= 0) { return spaceVideo(path); @@ -944,7 +993,7 @@ array PlaylistParse(const string &in path) { } string PlayitemParse(const string &in path, dictionary &MetaData, array &QualityList) { - if (path.find("/video/BV") >= 0) { + if (path.find("/video/BV") >= 0 && path.find("isfromlist") >= 0) { string bvid = parseBVId(path); return Video(bvid, path, MetaData, QualityList); } From 41b2b19bb0db0717895f0db81d9a50c921349753 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Sun, 26 Feb 2023 18:14:33 +0800 Subject: [PATCH 016/132] fix --- Media/PlayParse/MediaPlayParse - Bilibili.as | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 0adee62..ba499fa 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -723,6 +723,9 @@ array Recommend(uint page) { if (list.isArray()) { for (uint i = 0; i < list.size(); i++) { JsonValue item = list[i]; + if (item["bvid"].asString().empty()) { + continue; + } dictionary video; if (item["uri"].asString().find("live.bilibili.com") >= 0) { video["title"] = "【直播】" + item["owner"]["name"].asString() + " - " + item["title"].asString(); From 4ddcc1e221825926ce460f0e14265da2faab0c33 Mon Sep 17 00:00:00 2001 From: kdXiaoyi <1291646401@qq.com> Date: Mon, 27 Feb 2023 09:18:56 +0800 Subject: [PATCH 017/132] =?UTF-8?q?=E6=96=B0=E5=A2=9Ecookies=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E6=95=99=E7=A8=8B=E3=80=81=E9=A1=B9=E7=9B=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E4=B8=8B=E8=BD=BD=20(#4)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 46 ++++++++++++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index 06f0a5a..588ba7c 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,37 @@ # BilibiliPotPlayer - 适用于 PotPlayer 的 Bilibili 插件。 ## 安装插件 +[下载项目](https://github.com/chen310/BilibiliPotPlayer/archive/refs/heads/master.zip) -将项目 `Media/PlayParse` 路径下的 `MediaPlayParse - Bilibili.as` 和 `MediaPlayParse - Bilibili.ico` 两个文件复制到 `{PotPlayer 安装路径}\Extension\Media\PlayParse` 文件夹下。`MediaPlayParse - Bilibili.as` 提供了解析 `Bilibil` 链接的功能。 - -将项目 `Media/UrlList` 路径下的 `MediaUrlList - Bilibili.as` 和 `MediaUrlList - Bilibili.ico` 两个文件复制到 `{PotPlayer 安装路径}\Extension\Media\UrlList` 文件夹下。`MediaUrlList - Bilibili.as` 提供了列出 `Bilibil` 常用链接的功能,使用方式为按下 ctrl + U 并选择要播放的项目,如下图所示 +将项目 `Media/PlayParse` 路径下的 `MediaPlayParse - Bilibili.as` 和 `MediaPlayParse - Bilibili.ico` 两个文件复制到 `{PotPlayer 安装路径}\Extension\Media\PlayParse` 文件夹下。
+`MediaPlayParse - Bilibili.as` 提供了解析 `Bilibil` 链接的功能。
-![UrlList](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/urllist.png) +将项目 `Media/UrlList` 路径下的 `MediaUrlList - Bilibili.as` 和 `MediaUrlList - Bilibili.ico` 两个文件复制到 `{PotPlayer 安装路径}\Extension\Media\UrlList` 文件夹下。
+`MediaUrlList - Bilibili.as` 提供了列出 `Bilibil` 常用链接的功能,使用方式为按下 ctrl + U 并选择要播放的项目,如下图所示
+![UrlList](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/urllist.png)
## 登录 - -打开 PotPlayer,按 F5 打开选项,点击`扩展功能`下的`媒体播放列表/项目`,再点击 `Bilibili`,然后打开账户设置,在 `Cookie` 一栏粘贴你的 Bilibili Cookie。 - -![Login](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/login.png) - -点击测试按钮,如果弹出账号信息,就说明登录成功。 - -![Test](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/test.png) - -如果 Cookie 是从浏览器上复制来的,登录成功后,到浏览器中把 Bilibili 的 Cookie 删除,再重新到浏览器上登录,不然 PotPlayer 中的 Cookie 可能会很快失效(大概吧,我也不确定) - +打开 PotPlayer,按 F5 打开选项,点击`扩展功能`下的`媒体播放列表/项目`,再点击 `Bilibili`,然后打开账户设置,在 `Cookie` 一栏粘贴你的 Bilibili Cookie。
+![Login](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/login.png)
+点击测试按钮,如果弹出账号信息,就说明登录成功。
+![Test](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/test.png)
+如果 Cookie 是从浏览器上复制来的,登录成功后,到浏览器中把 Bilibili 的 Cookie 删除,再重新到浏览器上登录,不然 PotPlayer 中的 Cookie 可能会很快失效(大概吧,我也不确定)
+### Cookies获取 +参阅:B站Cookie获取教程 +- 打开你所用浏览器的**无痕模式**
**如果还是抓不到就把无痕模式关了再试试!** +- 第二步: + - 在**无痕窗口**进入任意一个直播间 + - 在直播间页面点击右上角登录自己的B站账号 +- 第三步: + - 点击键盘`F12`或者`鼠标右键`->检查,进入开发者工具 + - 点击`网络`/`NetWork`选项卡
+ ![网络/Network](http://i0.hdslb.com/bfs/album/4717448339d26a412ba23215d3ce674c549adf4f.png) + - 进入该选项卡后,键盘`F5`或浏览器左上角刷新页面 + - 在数据包中找到**heartBeat**或**webHeartBeat**,点击找到请求头中的**cookie**项,并复制保留(图中浅蓝色部分)后面部署会用到这个cookie
+ ![cookie](http://i0.hdslb.com/bfs/album/01c052ec17757a34f6a256f03523efa89c3e4d56.jpg) + +PS:有了cookie能操作B站账号的大部分功能,切勿泄露或分享出去
+**如果后续出现报错,请关闭无痕模式抓cookie** ## 使用方法 - -将 Bilibili 视频链接拖到 PotPlayer,或者按 ctrl + U 粘贴 Bilibili 视频链接即可播放。 +将 Bilibili 视频链接拖到 PotPlayer,或者按 ctrl + U 粘贴 Bilibili 视频链接即可播放。
From bf5f69c02bd53ca6d2980f6358da3b2efdf21a09 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Mon, 27 Feb 2023 09:52:52 +0800 Subject: [PATCH 018/132] =?UTF-8?q?feat:=20=E9=80=82=E9=85=8D=E5=85=A5?= =?UTF-8?q?=E7=AB=99=E5=BF=85=E5=88=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 36 ++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index ba499fa..468c0a3 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -548,6 +548,33 @@ array followingLive(uint page) { return videos; } +array PopularHistory() { + array videos; + JsonReader Reader; + JsonValue Root; + string res = apiPost("/x/web-interface/popular/precious?page_size=100&page=1"); + if (res.empty()) { + return videos; + } + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return videos; + } + JsonValue list = Root["data"]["list"]; + if (list.isArray()) { + for (uint i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + dictionary video; + video["title"] = item["title"].asString(); + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + videos.insertLast(video); + } + } + } + return videos; +} + array Ranking(string path) { array videos; @@ -564,12 +591,11 @@ array Ranking(string path) { if (pos < 0) { return videos; } - string url; JsonReader Reader; JsonValue Root; - string res = apiPost(url = "/x/web-interface/ranking/v2?rid=" + ids[pos]); + string res = apiPost("/x/web-interface/ranking/v2?rid=" + ids[pos]); if (res.empty()) { return videos; } @@ -930,6 +956,9 @@ bool PlaylistCheck(const string &in path) { if (path.find("www.bilibili.com/v/popular/rank") >= 0) { return true; } + if (path.find("www.bilibili.com/v/popular/history") >= 0) { + return true; + } if (gettid(path) > 0) { return true; } @@ -984,6 +1013,9 @@ array PlaylistParse(const string &in path) { if (path.find("www.bilibili.com/v/popular/rank") >= 0) { return Ranking(path); } + if (path.find("www.bilibili.com/v/popular/history") >= 0) { + return PopularHistory(); + } if (path.find("www.bilibili.com/audio/am") >= 0) { return AudioList(path); } From 66e10c9529e6c1c55c4c4cfe89a5a9c78533cabc Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Mon, 27 Feb 2023 10:10:14 +0800 Subject: [PATCH 019/132] =?UTF-8?q?feat:=20=E9=80=82=E9=85=8D=E6=AF=8F?= =?UTF-8?q?=E5=91=A8=E5=BF=85=E7=9C=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 49 ++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 468c0a3..100aa9c 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -575,6 +575,49 @@ array PopularHistory() { return videos; } +array PopularWeekly(string path) { + array videos; + JsonReader Reader; + JsonValue Root; + string num = parse(path, "num"); + if (num.empty()) { + string res = apiPost("/x/web-interface/popular/series/list"); + if (res.empty()) { + return videos; + } + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return videos; + } + JsonValue list = Root["data"]["list"]; + if (list.isArray()) { + num = "" + list[0]["number"].asInt(); + } + } + } + string res = apiPost("/x/web-interface/popular/series/one?number=" + num); + if (res.empty()) { + return videos; + } + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return videos; + } + JsonValue list = Root["data"]["list"]; + if (list.isArray()) { + for (uint i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + dictionary video; + video["title"] = item["title"].asString(); + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + videos.insertLast(video); + } + } + } + return videos; +} + array Ranking(string path) { array videos; @@ -959,6 +1002,9 @@ bool PlaylistCheck(const string &in path) { if (path.find("www.bilibili.com/v/popular/history") >= 0) { return true; } + if (path.find("www.bilibili.com/v/popular/weekly") >= 0) { + return true; + } if (gettid(path) > 0) { return true; } @@ -1016,6 +1062,9 @@ array PlaylistParse(const string &in path) { if (path.find("www.bilibili.com/v/popular/history") >= 0) { return PopularHistory(); } + if (path.find("www.bilibili.com/v/popular/weekly") >= 0) { + return PopularWeekly(path); + } if (path.find("www.bilibili.com/audio/am") >= 0) { return AudioList(path); } From 022f42e195a947651e086ab775978c396e9537b3 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Mon, 27 Feb 2023 10:52:03 +0800 Subject: [PATCH 020/132] update urllist --- Media/UrlList/MediaUrlList - Bilibili.as | 239 ++++++++++++++++++----- 1 file changed, 190 insertions(+), 49 deletions(-) diff --git a/Media/UrlList/MediaUrlList - Bilibili.as b/Media/UrlList/MediaUrlList - Bilibili.as index b055711..2f674bf 100644 --- a/Media/UrlList/MediaUrlList - Bilibili.as +++ b/Media/UrlList/MediaUrlList - Bilibili.as @@ -36,69 +36,207 @@ string GetDesc() return "https://www.bilibili.com"; } +string post(string url, string data="") { + string UserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"; + string Headers = "Referer: https://www.bilibili.com\r\n"; + return HostUrlGetStringWithAPI(url, UserAgent, Headers, data, true); +} + array Ranking() { - array ret; - array urls = { "https://www.bilibili.com/v/popular/rank/all", "https://www.bilibili.com/v/popular/rank/guochuang", "https://www.bilibili.com/v/popular/rank/douga", "https://www.bilibili.com/v/popular/rank/music", "https://www.bilibili.com/v/popular/rank/dance", "https://www.bilibili.com/v/popular/rank/game", "https://www.bilibili.com/v/popular/rank/knowledge", "https://www.bilibili.com/v/popular/rank/tec", "https://www.bilibili.com/v/popular/rank/spor", "https://www.bilibili.com/v/popular/rank/car", "https://www.bilibili.com/v/popular/rank/life", "https://www.bilibili.com/v/popular/rank/food", "https://www.bilibili.com/v/popular/rank/animal", "https://www.bilibili.com/v/popular/rank/kichiku", "https://www.bilibili.com/v/popular/rank/fashion", "https://www.bilibili.com/v/popular/rank/en", "https://www.bilibili.com/v/popular/rank/cinephile" }; - array names = { "全站", "国创相关", "动画", "音乐", "舞蹈", "游戏", "知识", "科技", "运动", "汽车", "生活", "美食", "动物圈", "鬼畜", "时尚", "娱乐", "影视" }; - for (uint i = 0; i < urls.size(); i++) { - dictionary channel; - channel["title"] = names[i]; - channel["url"] = urls[i]; - ret.insertLast(channel); - } - return ret; + return { + { { "title", "全站" }, { "url", "https://www.bilibili.com/v/popular/rank/all" } }, + { { "title", "国创相关" }, { "url", "https://www.bilibili.com/v/popular/rank/guochuang" } }, + { { "title", "动画" }, { "url", "https://www.bilibili.com/v/popular/rank/douga" } }, + { { "title", "音乐" }, { "url", "https://www.bilibili.com/v/popular/rank/music" } }, + { { "title", "舞蹈" }, { "url", "https://www.bilibili.com/v/popular/rank/dance" } }, + { { "title", "游戏" }, { "url", "https://www.bilibili.com/v/popular/rank/game" } }, + { { "title", "知识" }, { "url", "https://www.bilibili.com/v/popular/rank/knowledge" } }, + { { "title", "科技" }, { "url", "https://www.bilibili.com/v/popular/rank/tec" } }, + { { "title", "运动" }, { "url", "https://www.bilibili.com/v/popular/rank/spor" } }, + { { "title", "汽车" }, { "url", "https://www.bilibili.com/v/popular/rank/car" } }, + { { "title", "生活" }, { "url", "https://www.bilibili.com/v/popular/rank/life" } }, + { { "title", "美食" }, { "url", "https://www.bilibili.com/v/popular/rank/food" } }, + { { "title", "动物圈" }, { "url", "https://www.bilibili.com/v/popular/rank/animal" } }, + { { "title", "鬼畜" }, { "url", "https://www.bilibili.com/v/popular/rank/kichiku" } }, + { { "title", "时尚" }, { "url", "https://www.bilibili.com/v/popular/rank/fashion" } }, + { { "title", "娱乐" }, { "url", "https://www.bilibili.com/v/popular/rank/en" } }, + { { "title", "影视" }, { "url", "https://www.bilibili.com/v/popular/rank/cinephile" } }, + }; } array Dynamic() { + return { + { { "title", "番剧" }, { "url", "https://www.bilibili.com/anime/" } }, + { { "title", "- 连载动画" }, { "url", "https://www.bilibili.com/v/anime/serial/" } }, + { { "title", "- 完结动画" }, { "url", "https://www.bilibili.com/v/anime/finish" } }, + { { "title", "- 资讯" }, { "url", "https://www.bilibili.com/v/anime/information/" } }, + { { "title", "- 官方延伸" }, { "url", "https://www.bilibili.com/v/anime/offical/" } }, + { { "title", "电影" }, { "url", "https://www.bilibili.com/movie/" } }, + { { "title", "国创" }, { "url", "https://www.bilibili.com/guochuang/" } }, + { { "title", "- 国产动画" }, { "url", "https://www.bilibili.com/v/guochuang/chinese/" } }, + { { "title", "- 国产原创相关" }, { "url", "https://www.bilibili.com/v/guochuang/original/" } }, + { { "title", "- 布袋戏" }, { "url", "https://www.bilibili.com/v/guochuang/puppetry/" } }, + { { "title", "- 动态漫·广播剧" }, { "url", "https://www.bilibili.com/v/guochuang/motioncomic/" } }, + { { "title", "- 资讯" }, { "url", "https://www.bilibili.com/v/guochuang/information/" } }, + { { "title", "电视剧" }, { "url", "https://www.bilibili.com/tv/" } }, + { { "title", "纪录片" }, { "url", "https://www.bilibili.com/documentary/" } }, + { { "title", "动画" }, { "url", "https://www.bilibili.com/v/douga/" } }, + { { "title", "- MAD·AMV" }, { "url", "https://www.bilibili.com/v/douga/mad/" } }, + { { "title", "- MMD·3D" }, { "url", "https://www.bilibili.com/v/douga/mmd/" } }, + { { "title", "- 短片·手书·配音" }, { "url", "https://www.bilibili.com/v/douga/voice/" } }, + { { "title", "- 手办·模玩" }, { "url", "https://www.bilibili.com/v/douga/garage_kit/" } }, + { { "title", "- 特摄" }, { "url", "https://www.bilibili.com/v/douga/tokusatsu/" } }, + { { "title", "- 动漫杂谈" }, { "url", "https://www.bilibili.com/v/douga/acgntalks/" } }, + { { "title", "- 综合" }, { "url", "https://www.bilibili.com/v/douga/other/" } }, + { { "title", "游戏" }, { "url", "https://www.bilibili.com/v/game/" } }, + { { "title", "- 单机游戏" }, { "url", "https://www.bilibili.com/v/game/stand_alone" } }, + { { "title", "- 电子竞技" }, { "url", "https://www.bilibili.com/v/game/esports" } }, + { { "title", "- 手机游戏" }, { "url", "https://www.bilibili.com/v/game/mobile" } }, + { { "title", "- 网络游戏" }, { "url", "https://www.bilibili.com/v/game/online" } }, + { { "title", "- 桌游棋牌" }, { "url", "https://www.bilibili.com/v/game/board" } }, + { { "title", "- GMV" }, { "url", "https://www.bilibili.com/v/game/gmv" } }, + { { "title", "- 音游" }, { "url", "https://www.bilibili.com/v/game/music" } }, + { { "title", "- Mugen" }, { "url", "https://www.bilibili.com/v/game/mugen" } }, + { { "title", "鬼畜" }, { "url", "https://www.bilibili.com/v/kichiku/" } }, + { { "title", "- 鬼畜调教" }, { "url", "https://www.bilibili.com/v/kichiku/guide" } }, + { { "title", "- 音MAD" }, { "url", "https://www.bilibili.com/v/kichiku/mad" } }, + { { "title", "- 人力VOCALOID" }, { "url", "https://www.bilibili.com/v/kichiku/manual_vocaloid" } }, + { { "title", "- 鬼畜剧场" }, { "url", "https://www.bilibili.com/v/kichiku/theatre" } }, + { { "title", "- 教程演示" }, { "url", "https://www.bilibili.com/v/kichiku/course" } }, + { { "title", "音乐" }, { "url", "https://www.bilibili.com/v/music" } }, + { { "title", "- 原创音乐" }, { "url", "https://www.bilibili.com/v/music/original" } }, + { { "title", "- 翻唱" }, { "url", "https://www.bilibili.com/v/music/cover" } }, + { { "title", "- 演奏" }, { "url", "https://www.bilibili.com/v/music/perform" } }, + { { "title", "- VOCALOID·UTAU" }, { "url", "https://www.bilibili.com/v/music/vocaloid" } }, + { { "title", "- 音乐现场" }, { "url", "https://www.bilibili.com/v/music/live" } }, + { { "title", "- MV" }, { "url", "https://www.bilibili.com/v/music/mv" } }, + { { "title", "- 乐评盘点" }, { "url", "https://www.bilibili.com/v/music/commentary" } }, + { { "title", "- 音乐教学" }, { "url", "https://www.bilibili.com/v/music/tutorial" } }, + { { "title", "- 音乐综合" }, { "url", "https://www.bilibili.com/v/music/other" } }, + { { "title", "舞蹈" }, { "url", "https://www.bilibili.com/v/dance/" } }, + { { "title", "- 宅舞" }, { "url", "https://www.bilibili.com/v/dance/otaku/" } }, + { { "title", "- 街舞" }, { "url", "https://www.bilibili.com/v/dance/hiphop/" } }, + { { "title", "- 明星舞蹈" }, { "url", "https://www.bilibili.com/v/dance/star/" } }, + { { "title", "- 中国舞" }, { "url", "https://www.bilibili.com/v/dance/china/" } }, + { { "title", "- 舞蹈综合" }, { "url", "https://www.bilibili.com/v/dance/three_d/" } }, + { { "title", "- 舞蹈教程" }, { "url", "https://www.bilibili.com/v/dance/demo/" } }, + { { "title", "影视" }, { "url", "https://www.bilibili.com/v/cinephile" } }, + { { "title", "- 影视杂谈" }, { "url", "https://www.bilibili.com/v/cinephile/cinecism" } }, + { { "title", "- 影视剪辑" }, { "url", "https://www.bilibili.com/v/cinephile/montage" } }, + { { "title", "- 小剧场" }, { "url", "https://www.bilibili.com/v/cinephile/shortfilm" } }, + { { "title", "- 预告·资讯" }, { "url", "https://www.bilibili.com/v/cinephile/trailer_info" } }, + { { "title", "娱乐" }, { "url", "https://www.bilibili.com/v/ent/" } }, + { { "title", "- 综艺" }, { "url", "https://www.bilibili.com/v/ent/variety" } }, + { { "title", "- 娱乐杂谈" }, { "url", "https://www.bilibili.com/v/ent/talker" } }, + { { "title", "- 粉丝创作" }, { "url", "https://www.bilibili.com/v/ent/fans" } }, + { { "title", "- 明星综合" }, { "url", "https://www.bilibili.com/v/ent/celebrity" } }, + { { "title", "知识" }, { "url", "https://www.bilibili.com/v/knowledge/" } }, + { { "title", "- 科学科普" }, { "url", "https://www.bilibili.com/v/knowledge/science" } }, + { { "title", "- 社科·法律·心理" }, { "url", "https://www.bilibili.com/v/knowledge/social_science" } }, + { { "title", "- 人文历史" }, { "url", "https://www.bilibili.com/v/knowledge/humanity_history" } }, + { { "title", "- 财经商业" }, { "url", "https://www.bilibili.com/v/knowledge/business" } }, + { { "title", "- 校园学习" }, { "url", "https://www.bilibili.com/v/knowledge/campus" } }, + { { "title", "- 职业职场" }, { "url", "https://www.bilibili.com/v/knowledge/career" } }, + { { "title", "- 设计·创意" }, { "url", "https://www.bilibili.com/v/knowledge/design" } }, + { { "title", "- 野生技能协会" }, { "url", "https://www.bilibili.com/v/knowledge/skill" } }, + { { "title", "科技" }, { "url", "https://www.bilibili.com/v/tech/" } }, + { { "title", "- 数 码" }, { "url", "https://www.bilibili.com/v/tech/digital" } }, + { { "title", "- 软件应用" }, { "url", "https://www.bilibili.com/v/tech/application" } }, + { { "title", "- 计算机技术" }, { "url", "https://www.bilibili.com/v/tech/computer_tech" } }, + { { "title", "- 科工机械" }, { "url", "https://www.bilibili.com/v/tech/industry" } }, + { { "title", "资讯" }, { "url", "https://www.bilibili.com/v/information/" } }, + { { "title", "- 热点" }, { "url", "https://www.bilibili.com/v/information/hotspot" } }, + { { "title", "- 环球" }, { "url", "https://www.bilibili.com/v/information/global" } }, + { { "title", "- 社会" }, { "url", "https://www.bilibili.com/v/information/social" } }, + { { "title", "- 综合" }, { "url", "https://www.bilibili.com/v/information/multiple" } }, + { { "title", "美食" }, { "url", "https://www.bilibili.com/v/food" } }, + { { "title", "- 美食制作" }, { "url", "https://www.bilibili.com/v/food/make" } }, + { { "title", "- 美食侦探" }, { "url", "https://www.bilibili.com/v/food/detective" } }, + { { "title", "- 美食测评" }, { "url", "https://www.bilibili.com/v/food/measurement" } }, + { { "title", "- 田园美食" }, { "url", "https://www.bilibili.com/v/food/rural" } }, + { { "title", "- 美食记录" }, { "url", "https://www.bilibili.com/v/food/record" } }, + { { "title", "生活" }, { "url", "https://www.bilibili.com/v/life" } }, + { { "title", "- 搞笑" }, { "url", "https://www.bilibili.com/v/life/funny" } }, + { { "title", "- 亲子" }, { "url", "https://www.bilibili.com/v/life/parenting" } }, + { { "title", "- 出行" }, { "url", "https://www.bilibili.com/v/life/travel" } }, + { { "title", "- 三农" }, { "url", "https://www.bilibili.com/v/life/rurallife" } }, + { { "title", "- 家居房产" }, { "url", "https://www.bilibili.com/v/life/home" } }, + { { "title", "- 手工" }, { "url", "https://www.bilibili.com/v/life/handmake" } }, + { { "title", "- 绘画" }, { "url", "https://www.bilibili.com/v/life/painting" } }, + { { "title", "- 日常" }, { "url", "https://www.bilibili.com/v/life/daily" } }, + { { "title", "汽车" }, { "url", "https://www.bilibili.com/v/car" } }, + { { "title", "- 赛车" }, { "url", "https://www.bilibili.com/v/car/racing" } }, + { { "title", "- 改装玩车" }, { "url", "https://www.bilibili.com/v/car/modifiedvehicle" } }, + { { "title", "- 新能源车" }, { "url", "https://www.bilibili.com/v/car/newenergyvehicle" } }, + { { "title", "- 房车" }, { "url", "https://www.bilibili.com/v/car/touringcar" } }, + { { "title", "- 摩托车" }, { "url", "https://www.bilibili.com/v/car/motorcycle" } }, + { { "title", "- 购车攻略" }, { "url", "https://www.bilibili.com/v/car/strategy" } }, + { { "title", "- 汽车生活" }, { "url", "https://www.bilibili.com/v/car/life" } }, + { { "title", "时尚" }, { "url", "https://www.bilibili.com/v/fashion" } }, + { { "title", "- 美妆护肤" }, { "url", "https://www.bilibili.com/v/fashion/makeup" } }, + { { "title", "- 仿妆cos" }, { "url", "https://www.bilibili.com/v/fashion/cos" } }, + { { "title", "- 穿搭" }, { "url", "https://www.bilibili.com/v/fashion/clothing" } }, + { { "title", "- 时尚潮流" }, { "url", "https://www.bilibili.com/v/fashion/trend" } }, + { { "title", "运动" }, { "url", "https://www.bilibili.com/v/sports" } }, + { { "title", "- 篮球" }, { "url", "https://www.bilibili.com/v/sports/basketball" } }, + { { "title", "- 足球" }, { "url", "https://www.bilibili.com/v/sports/football" } }, + { { "title", "- 健身" }, { "url", "https://www.bilibili.com/v/sports/aerobics" } }, + { { "title", "- 竞技 体育" }, { "url", "https://www.bilibili.com/v/sports/athletic" } }, + { { "title", "- 运动文化" }, { "url", "https://www.bilibili.com/v/sports/culture" } }, + { { "title", "- 运动综合" }, { "url", "https://www.bilibili.com/v/sports/comprehensive" } }, + { { "title", "动物圈" }, { "url", "https://www.bilibili.com/v/animal" } }, + { { "title", "- 喵星人" }, { "url", "https://www.bilibili.com/v/animal/cat" } }, + { { "title", "- 汪星人" }, { "url", "https://www.bilibili.com/v/animal/dog" } }, + { { "title", "- 小宠异宠" }, { "url", "https://www.bilibili.com/v/animal/reptiles" } }, + { { "title", "- 野生动物" }, { "url", "https://www.bilibili.com/v/animal/wild_animal" } }, + { { "title", "- 动物二创" }, { "url", "https://www.bilibili.com/v/animal/second_edition" } }, + { { "title", "- 动物综合" }, { "url", "https://www.bilibili.com/v/animal/animal_composite" } }, + { { "title", "搞笑" }, { "url", "https://www.bilibili.com/v/life/funny" } }, + { { "title", "单机游戏" }, { "url", "https://www.bilibili.com/v/game/stand_alone" } }, + }; +} + +array PopularHistory() { array ret; - array urls = { 'https://www.bilibili.com/anime/', 'https://www.bilibili.com/v/anime/serial/', 'https://www.bilibili.com/v/anime/finish', 'https://www.bilibili.com/v/anime/information/', 'https://www.bilibili.com/v/anime/offical/', 'https://www.bilibili.com/movie/', 'https://www.bilibili.com/guochuang/', 'https://www.bilibili.com/v/guochuang/chinese/', 'https://www.bilibili.com/v/guochuang/original/', 'https://www.bilibili.com/v/guochuang/puppetry/', 'https://www.bilibili.com/v/guochuang/motioncomic/', 'https://www.bilibili.com/v/guochuang/information/', 'https://www.bilibili.com/tv/', 'https://www.bilibili.com/documentary/', 'https://www.bilibili.com/v/douga/', 'https://www.bilibili.com/v/douga/mad/', 'https://www.bilibili.com/v/douga/mmd/', 'https://www.bilibili.com/v/douga/voice/', 'https://www.bilibili.com/v/douga/garage_kit/', 'https://www.bilibili.com/v/douga/tokusatsu/', 'https://www.bilibili.com/v/douga/acgntalks/', 'https://www.bilibili.com/v/douga/other/', 'https://www.bilibili.com/v/game/', 'https://www.bilibili.com/v/game/stand_alone', 'https://www.bilibili.com/v/game/esports', 'https://www.bilibili.com/v/game/mobile', 'https://www.bilibili.com/v/game/online', 'https://www.bilibili.com/v/game/board', 'https://www.bilibili.com/v/game/gmv', 'https://www.bilibili.com/v/game/music', 'https://www.bilibili.com/v/game/mugen', 'https://www.bilibili.com/v/kichiku/', 'https://www.bilibili.com/v/kichiku/guide', 'https://www.bilibili.com/v/kichiku/mad', 'https://www.bilibili.com/v/kichiku/manual_vocaloid', 'https://www.bilibili.com/v/kichiku/theatre', 'https://www.bilibili.com/v/kichiku/course', 'https://www.bilibili.com/v/music', 'https://www.bilibili.com/v/music/original', 'https://www.bilibili.com/v/music/cover', 'https://www.bilibili.com/v/music/perform', 'https://www.bilibili.com/v/music/vocaloid', 'https://www.bilibili.com/v/music/live', 'https://www.bilibili.com/v/music/mv', 'https://www.bilibili.com/v/music/commentary', 'https://www.bilibili.com/v/music/tutorial', 'https://www.bilibili.com/v/music/other', 'https://www.bilibili.com/v/dance/', 'https://www.bilibili.com/v/dance/otaku/', 'https://www.bilibili.com/v/dance/hiphop/', 'https://www.bilibili.com/v/dance/star/', 'https://www.bilibili.com/v/dance/china/', 'https://www.bilibili.com/v/dance/three_d/', 'https://www.bilibili.com/v/dance/demo/', 'https://www.bilibili.com/v/cinephile', 'https://www.bilibili.com/v/cinephile/cinecism', 'https://www.bilibili.com/v/cinephile/montage', 'https://www.bilibili.com/v/cinephile/shortfilm', 'https://www.bilibili.com/v/cinephile/trailer_info', 'https://www.bilibili.com/v/ent/', 'https://www.bilibili.com/v/ent/variety', 'https://www.bilibili.com/v/ent/talker', 'https://www.bilibili.com/v/ent/fans', 'https://www.bilibili.com/v/ent/celebrity', 'https://www.bilibili.com/v/knowledge/', 'https://www.bilibili.com/v/knowledge/science', 'https://www.bilibili.com/v/knowledge/social_science', 'https://www.bilibili.com/v/knowledge/humanity_history', 'https://www.bilibili.com/v/knowledge/business', 'https://www.bilibili.com/v/knowledge/campus', 'https://www.bilibili.com/v/knowledge/career', 'https://www.bilibili.com/v/knowledge/design', 'https://www.bilibili.com/v/knowledge/skill', 'https://www.bilibili.com/v/tech/', 'https://www.bilibili.com/v/tech/digital', 'https://www.bilibili.com/v/tech/application', 'https://www.bilibili.com/v/tech/computer_tech', 'https://www.bilibili.com/v/tech/industry', 'https://www.bilibili.com/v/information/', 'https://www.bilibili.com/v/information/hotspot', 'https://www.bilibili.com/v/information/global', 'https://www.bilibili.com/v/information/social', 'https://www.bilibili.com/v/information/multiple', 'https://www.bilibili.com/v/food', 'https://www.bilibili.com/v/food/make', 'https://www.bilibili.com/v/food/detective', 'https://www.bilibili.com/v/food/measurement', 'https://www.bilibili.com/v/food/rural', 'https://www.bilibili.com/v/food/record', 'https://www.bilibili.com/v/life', 'https://www.bilibili.com/v/life/funny', 'https://www.bilibili.com/v/life/parenting', 'https://www.bilibili.com/v/life/travel', 'https://www.bilibili.com/v/life/rurallife', 'https://www.bilibili.com/v/life/home', 'https://www.bilibili.com/v/life/handmake', 'https://www.bilibili.com/v/life/painting', 'https://www.bilibili.com/v/life/daily', 'https://www.bilibili.com/v/car', 'https://www.bilibili.com/v/car/racing', 'https://www.bilibili.com/v/car/modifiedvehicle', 'https://www.bilibili.com/v/car/newenergyvehicle', 'https://www.bilibili.com/v/car/touringcar', 'https://www.bilibili.com/v/car/motorcycle', 'https://www.bilibili.com/v/car/strategy', 'https://www.bilibili.com/v/car/life', 'https://www.bilibili.com/v/fashion', 'https://www.bilibili.com/v/fashion/makeup', 'https://www.bilibili.com/v/fashion/cos', 'https://www.bilibili.com/v/fashion/clothing', 'https://www.bilibili.com/v/fashion/trend', 'https://www.bilibili.com/v/sports', 'https://www.bilibili.com/v/sports/basketball', 'https://www.bilibili.com/v/sports/football', 'https://www.bilibili.com/v/sports/aerobics', 'https://www.bilibili.com/v/sports/athletic', 'https://www.bilibili.com/v/sports/culture', 'https://www.bilibili.com/v/sports/comprehensive', 'https://www.bilibili.com/v/animal', 'https://www.bilibili.com/v/animal/cat', 'https://www.bilibili.com/v/animal/dog', 'https://www.bilibili.com/v/animal/reptiles', 'https://www.bilibili.com/v/animal/wild_animal', 'https://www.bilibili.com/v/animal/second_edition', 'https://www.bilibili.com/v/animal/animal_composite', 'https://www.bilibili.com/v/life/funny', 'https://www.bilibili.com/v/game/stand_alone' }; - array names = { '番剧', '- 连载动画', '- 完结动画', '- 资讯', '- 官方延伸', '电影', '国创', '- 国产动画', '- 国产原创相关', '- 布袋戏', '- 动态漫·广播剧', '- 资讯', '电视剧', '纪录片', '动画', '- MAD·AMV', '- MMD·3D', '- 短片·手书·配音', '- 手办·模玩', '- 特摄', '- 动漫杂谈', '- 综合', '游戏', '- 单机游戏', '- 电子竞技', '- 手机游戏', '- 网络游戏', '- 桌游棋牌', '- GMV', '- 音游', '- Mugen', '鬼畜', '- 鬼畜调教', '- 音MAD', '- 人力VOCALOID', '- 鬼畜剧场', '- 教程演示', '音乐', '- 原创音乐', '- 翻唱', '- 演奏', '- VOCALOID·UTAU', '- 音乐现场', '- MV', '- 乐评盘点', '- 音乐教学', '- 音乐综合', '舞蹈', '- 宅舞', '- 街舞', '- 明星舞蹈', '- 中国舞', '- 舞蹈综合', '- 舞蹈教程', '影视', '- 影视杂谈', '- 影视剪辑', '- 小剧场', '- 预告·资讯', '娱乐', '- 综艺', '- 娱乐杂谈', '- 粉丝创作', '- 明星综合', '知识', '- 科学科普', '- 社科·法律·心理', '- 人文历史', '- 财经商业', '- 校园学习', '- 职业职场', '- 设计·创意', '- 野生技能协会', '科技', '- 数 码', '- 软件应用', '- 计算机技术', '- 科工机械', '资讯', '- 热点', '- 环球', '- 社会', '- 综合', '美食', '- 美食制作', '- 美食侦探', '- 美食测评', '- 田园美食', '- 美食记录', '生活', '- 搞笑', '- 亲子', '- 出行', '- 三农', '- 家居房产', '- 手工', '- 绘画', '- 日常', '汽车', '- 赛车', '- 改装玩车', '- 新能源车', '- 房车', '- 摩托车', '- 购车攻略', '- 汽车生活', '时尚', '- 美妆护肤', '- 仿妆cos', '- 穿搭', '- 时尚潮流', '运动', '- 篮球', '- 足球', '- 健身', '- 竞技 体育', '- 运动文化', '- 运动综合', '动物圈', '- 喵星人', '- 汪星人', '- 小宠异宠', '- 野生动物', '- 动物二创', '- 动物综合', '搞笑', '单机游戏' }; - for (uint i = 0; i < urls.size(); i++) { - dictionary channel; - channel["title"] = names[i]; - channel["url"] = urls[i]; - ret.insertLast(channel); + string res = post("https://api.bilibili.com/x/web-interface/popular/series/list"); + if (res.empty()){ + return ret; + } + JsonReader Reader; + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return ret; + } + JsonValue list = Root["data"]["list"]; + if (list.isArray()) { + for (uint i = 0; i < list.size(); i++) { + dictionary week; + week["title"] = list[i]["name"].asString() + " " + list[i]["subject"].asString(); + week["url"] = "https://www.bilibili.com/v/popular/weekly/?num=" + list[i]["number"].asInt(); + ret.insertLast(week); + } + } } return ret; } array Other() { - array ret; - array urls = { "https://www.bilibili.com", "https://link.bilibili.com/p/center/index#/user-center/follow/1" }; - array names = { "首页推荐", "我关注的直播" }; - for (uint i = 0; i < urls.size(); i++) { - dictionary channel; - channel["title"] = names[i]; - channel["url"] = urls[i]; - ret.insertLast(channel); - } - return ret; + return { + { { "title", "首页推荐" }, { "url", "https://www.bilibili.com" } }, + { { "title", "我关注的直播" }, { "url", "https://link.bilibili.com/p/center/index#/user-center/follow/1" } }, + { { "title", "入站必刷" }, { "url", "https://www.bilibili.com/v/popular/history/" } }, + }; } array GetCategorys() { - array ret; - - { - dictionary item; - item["title"] = "分区 - 排行榜"; - item["Category"] = "Ranking"; - ret.insertLast(item); - } - { - dictionary item; - item["title"] = "分区 - 最新投稿"; - item["Category"] = "Dynamic"; - ret.insertLast(item); - } - { - dictionary item; - item["title"] = "其它"; - item["Category"] = "Other"; - ret.insertLast(item); - } - - return ret; + return { + { { "title", "分区 - 排行榜" }, { "Category", "Ranking" } }, + { { "title", "分区 - 最新投稿" }, { "Category", "Dynamic" } }, + { { "title", "每周必看" }, { "Category", "PopularHistory" } }, + { { "title", "其他" }, { "Category", "Other" } }, + }; } array GetUrlList(string Category, string Extra, string PathToken, string Query, string PageToken) @@ -109,6 +247,9 @@ array GetUrlList(string Category, string Extra, string PathToken, st if (Category == "Dynamic") { return Dynamic(); } + if (Category == "PopularHistory") { + return PopularHistory(); + } if (Category == "Other") { return Other(); } From e6c3b4873b96a56c5d9383ebba6ca7e051a66c2f Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Wed, 1 Mar 2023 10:57:47 +0800 Subject: [PATCH 021/132] update --- Media/PlayParse/MediaPlayParse - Bilibili.as | 6 +++--- Media/UrlList/MediaUrlList - Bilibili.as | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 100aa9c..a0fb28b 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -246,6 +246,7 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array qn && quality > qn) { continue; @@ -326,7 +327,7 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array PlaylistParse(const string &in path) { return spaceVideo(path); } else if (path.find("/audio") >= 0) { - } else if (path.find("/favlist") >= 0) { return FavList(path); diff --git a/Media/UrlList/MediaUrlList - Bilibili.as b/Media/UrlList/MediaUrlList - Bilibili.as index 2f674bf..fce494e 100644 --- a/Media/UrlList/MediaUrlList - Bilibili.as +++ b/Media/UrlList/MediaUrlList - Bilibili.as @@ -213,7 +213,7 @@ array PopularHistory() { for (uint i = 0; i < list.size(); i++) { dictionary week; week["title"] = list[i]["name"].asString() + " " + list[i]["subject"].asString(); - week["url"] = "https://www.bilibili.com/v/popular/weekly/?num=" + list[i]["number"].asInt(); + week["url"] = "https://www.bilibili.com/v/popular/weekly?num=" + list[i]["number"].asInt(); ret.insertLast(week); } } From 46ba27ff24a391908c52d37bad82715f28985068 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Wed, 1 Mar 2023 14:29:11 +0800 Subject: [PATCH 022/132] debug --- Media/PlayParse/MediaPlayParse - Bilibili.as | 26 ++++++-------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index a0fb28b..e300d99 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -37,6 +37,9 @@ void OnInitialize() { HostSetUrlHeaderHTTP("bilivideo.com", "Referer: https://www.bilibili.com\r\n"); HostSetUrlHeaderHTTP("bilivideo.cn", "Referer: https://www.bilibili.com\r\n"); HostSetUrlHeaderHTTP("bilibili.com", "Referer: https://www.bilibili.com\r\n"); + if (debug) { + HostOpenConsole(); + } } string host = "https://api.bilibili.com"; @@ -123,32 +126,15 @@ void log(string item) { if (!debug) { return; } - HostOpenConsole(); HostPrintUTF8(item); } void log(string item, string info) { - if (!debug) { - return; - } - HostOpenConsole(); - if (item.empty()) { - HostPrintUTF8(info); - } else { - HostPrintUTF8(item + ": " + info); - } + log(item + ": " + info); } void log(string item, int info) { - if (!debug) { - return; - } - HostOpenConsole(); - if (item.empty()) { - HostPrintUTF8("" + info); - } else { - HostPrintUTF8(item + ": " + info); - } + log(item + ": " + info); } string post(string url, string data="") { @@ -1017,6 +1003,7 @@ bool PlaylistCheck(const string &in path) { } array PlaylistParse(const string &in path) { + log("Playlist path", path); array result; if (path.find("/video/BV") >= 0 && path.find("isfromlist") < 0) { @@ -1077,6 +1064,7 @@ array PlaylistParse(const string &in path) { } string PlayitemParse(const string &in path, dictionary &MetaData, array &QualityList) { + log("Playitem path", path); if (path.find("/video/BV") >= 0 && path.find("isfromlist") >= 0) { string bvid = parseBVId(path); return Video(bvid, path, MetaData, QualityList); From 5f935f3459a83ec2613104ad9b4e41ef0507573e Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Wed, 1 Mar 2023 15:29:43 +0800 Subject: [PATCH 023/132] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E5=AE=8C=E6=95=B4?= =?UTF-8?q?=E7=9A=84=20cookie?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index e300d99..ae91b0a 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -114,7 +114,8 @@ void handleCookie(string full_cookie) { for (uint i=0; i < cookies.length(); i++) { int pos = cookies[i].find("SESSDATA"); if (pos >= 0) { - cookie = cookies[i].substr(pos); + // cookie = cookies[i].substr(pos); + cookie = full_cookie; } if (cookies[i].find("DedeUserID=") >= 0) { uid = parseInt(cookies[i].split("=")[1]); From 69977ec4c3cacf447a4df85fd9b452b2ebaca7f0 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Fri, 3 Mar 2023 21:58:08 +0800 Subject: [PATCH 024/132] =?UTF-8?q?=E9=80=82=E9=85=8D=E6=90=9C=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 65 +++++++++++++++++++- Media/UrlList/MediaUrlList - Bilibili.as | 1 + 2 files changed, 64 insertions(+), 2 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index ae91b0a..1a273eb 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -328,11 +328,11 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array AudioList(string path) { return audios; } +array Search(string path) { + array videos; + JsonReader Reader; + JsonValue Root; + path.replace("?WithCaption", ""); + string kw = parse(path, "keyword"); + if (kw.empty()) { + return videos; + } + string type = HostRegExpParse(path, "search.bilibili.com/([a-zA-Z0-9]+)"); + string url; + if (type == "all") { + url = "/x/web-interface/search/all/v2?keyword=" + HostUrlEncode(kw); + } else if (type == "video") { + url = "/x/web-interface/search/type?search_type=video&keyword=" + HostUrlEncode(kw); + } else { + return videos; + } + string res = apiPost(url); + if (res.empty()) { + return videos; + } + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return videos; + } + JsonValue list; + if (type == "all") { + for (uint i = 0; i < Root["data"]["result"].size(); i++) { + if (Root["data"]["result"][i]["result_type"].asString() == "video") { + list = Root["data"]["result"][i]["data"]; + break; + } + } + } else if (type == "video") { + list = Root["data"]["result"]; + } else { + return videos; + } + for (uint i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + dictionary video; + string title = item["title"].asString(); + title.replace("", ''); + title.replace("", ''); + video["title"] = title; + video["content"] = item["author"].asString() + " | " + title; + video["duration"] = parseTime(item["duration"].asString()) * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + videos.insertLast(video); + } + } + return videos; +} + array Recommend(uint page) { array videos; JsonReader Reader; @@ -949,6 +1004,9 @@ bool PlaylistCheck(const string &in path) { if (path.find("/video/BV") >= 0 && path.find("isfromlist") < 0) { return true; } + if (path.find("search.bilibili.com") >= 0) { + return true; + } if (path.find("space.bilibili.com") >= 0) { if (path.find("/video") >= 0) { return true; @@ -1010,6 +1068,9 @@ array PlaylistParse(const string &in path) { if (path.find("/video/BV") >= 0 && path.find("isfromlist") < 0) { return VideoPages(path); } + if (path.find("search.bilibili.com") >= 0) { + return Search(path); + } if (path.find("space.bilibili.com") >= 0) { if (path.find("/video") >= 0) { return spaceVideo(path); diff --git a/Media/UrlList/MediaUrlList - Bilibili.as b/Media/UrlList/MediaUrlList - Bilibili.as index fce494e..95c534f 100644 --- a/Media/UrlList/MediaUrlList - Bilibili.as +++ b/Media/UrlList/MediaUrlList - Bilibili.as @@ -226,6 +226,7 @@ array Other() { { { "title", "首页推荐" }, { "url", "https://www.bilibili.com" } }, { { "title", "我关注的直播" }, { "url", "https://link.bilibili.com/p/center/index#/user-center/follow/1" } }, { { "title", "入站必刷" }, { "url", "https://www.bilibili.com/v/popular/history/" } }, + { { "title", "搜索" }, { "url", "https://search.bilibili.com/video?keyword=陈奕迅" } }, }; } From 9ab61eed87628f66e27b6361269470f0a9343324 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Sat, 4 Mar 2023 09:56:08 +0800 Subject: [PATCH 025/132] =?UTF-8?q?docs:=20=E6=90=9C=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 81 ++++++++++++++++++++++++++++++---------------- public/search.png | Bin 0 -> 32468 bytes 2 files changed, 54 insertions(+), 27 deletions(-) create mode 100644 public/search.png diff --git a/README.md b/README.md index 588ba7c..59bfb7e 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,64 @@ # BilibiliPotPlayer + 适用于 PotPlayer 的 Bilibili 插件。 ## 安装插件 + [下载项目](https://github.com/chen310/BilibiliPotPlayer/archive/refs/heads/master.zip) -将项目 `Media/PlayParse` 路径下的 `MediaPlayParse - Bilibili.as` 和 `MediaPlayParse - Bilibili.ico` 两个文件复制到 `{PotPlayer 安装路径}\Extension\Media\PlayParse` 文件夹下。
-`MediaPlayParse - Bilibili.as` 提供了解析 `Bilibil` 链接的功能。
+将项目 `Media/PlayParse` 路径下的 `MediaPlayParse - Bilibili.as` 和 `MediaPlayParse - Bilibili.ico` 两个文件复制到 `{PotPlayer 安装路径}\Extension\Media\PlayParse` 文件夹下。 + +`MediaPlayParse - Bilibili.as` 提供了解析 `Bilibil` 链接的功能。 -将项目 `Media/UrlList` 路径下的 `MediaUrlList - Bilibili.as` 和 `MediaUrlList - Bilibili.ico` 两个文件复制到 `{PotPlayer 安装路径}\Extension\Media\UrlList` 文件夹下。
-`MediaUrlList - Bilibili.as` 提供了列出 `Bilibil` 常用链接的功能,使用方式为按下 ctrl + U 并选择要播放的项目,如下图所示
-![UrlList](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/urllist.png)
+将项目 `Media/UrlList` 路径下的 `MediaUrlList - Bilibili.as` 和 `MediaUrlList - Bilibili.ico` 两个文件复制到 `{PotPlayer 安装路径}\Extension\Media\UrlList` 文件夹下。 + +`MediaUrlList - Bilibili.as` 提供了列出 `Bilibil` 常用链接的功能,使用方式为按下 ctrl + U 并选择要播放的项目,如下图所示 + +![UrlList](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/urllist.png) ## 登录 -打开 PotPlayer,按 F5 打开选项,点击`扩展功能`下的`媒体播放列表/项目`,再点击 `Bilibili`,然后打开账户设置,在 `Cookie` 一栏粘贴你的 Bilibili Cookie。
-![Login](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/login.png)
-点击测试按钮,如果弹出账号信息,就说明登录成功。
-![Test](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/test.png)
-如果 Cookie 是从浏览器上复制来的,登录成功后,到浏览器中把 Bilibili 的 Cookie 删除,再重新到浏览器上登录,不然 PotPlayer 中的 Cookie 可能会很快失效(大概吧,我也不确定)
-### Cookies获取 -参阅:B站Cookie获取教程 -- 打开你所用浏览器的**无痕模式**
**如果还是抓不到就把无痕模式关了再试试!** -- 第二步: - - 在**无痕窗口**进入任意一个直播间 - - 在直播间页面点击右上角登录自己的B站账号 -- 第三步: - - 点击键盘`F12`或者`鼠标右键`->检查,进入开发者工具 - - 点击`网络`/`NetWork`选项卡
- ![网络/Network](http://i0.hdslb.com/bfs/album/4717448339d26a412ba23215d3ce674c549adf4f.png) - - 进入该选项卡后,键盘`F5`或浏览器左上角刷新页面 - - 在数据包中找到**heartBeat**或**webHeartBeat**,点击找到请求头中的**cookie**项,并复制保留(图中浅蓝色部分)后面部署会用到这个cookie
- ![cookie](http://i0.hdslb.com/bfs/album/01c052ec17757a34f6a256f03523efa89c3e4d56.jpg) - -PS:有了cookie能操作B站账号的大部分功能,切勿泄露或分享出去
-**如果后续出现报错,请关闭无痕模式抓cookie** + +打开 PotPlayer,按 F5 打开选项,点击`扩展功能`下的`媒体播放列表/项目`,再点击 `Bilibili`,然后打开`账户设置`,在 `Cookie` 一栏粘贴你的 Bilibili Cookie。 + +![Login](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/login.png) + +点击测试按钮,如果弹出账号信息,就说明登录成功。 + +![Test](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/test.png) + +### Cookies 获取 + +参阅:B 站 Cookie 获取教程 + +- 打开你所用浏览器的**无痕模式** + **如果还是抓不到就把无痕模式关了再试试!** +- 第二步: + - 在**无痕窗口**进入任意一个直播间 + - 在直播间页面点击右上角登录自己的 B 站账号 +- 第三步: + + - 点击键盘`F12`或者`鼠标右键`->检查,进入开发者工具 + - 点击`网络`/`NetWork`选项卡 + + ![网络/Network](http://i0.hdslb.com/bfs/album/4717448339d26a412ba23215d3ce674c549adf4f.png) + + - 进入该选项卡后,键盘`F5`或浏览器左上角刷新页面 + - 在数据包中找到 **heartBeat** 或 **webHeartBeat**,点击找到请求头中的 **cookie** 项,并复制保留(图中浅蓝色部分)填写到插件账号设置的 Cookie 一栏中 + + ![cookie](http://i0.hdslb.com/bfs/album/01c052ec17757a34f6a256f03523efa89c3e4d56.jpg) + +PS:有了 cookie 能操作 B 站账号的大部分功能,切勿泄露或分享出去 + +**如果后续出现报错,请关闭无痕模式抓 cookie** + ## 使用方法 -将 Bilibili 视频链接拖到 PotPlayer,或者按 ctrl + U 粘贴 Bilibili 视频链接即可播放。
+ +### 播放视频/直播 + +将 Bilibili 链接拖到 PotPlayer,或者按 ctrl + U 粘贴 Bilibili 链接即可播放。可参考[视频](https://www.bilibili.com/video/BV1mM41177kT) + +### 搜索 + +按 ctrl + U,在文件地址列表中选择`搜索`,然后到上面的输入框中替换关键词,最后回车即可 + +![Search](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/search.png) diff --git a/public/search.png b/public/search.png new file mode 100644 index 0000000000000000000000000000000000000000..a55ecd019d5b728f1ab0e53d5b4d0c40c2b2eddc GIT binary patch literal 32468 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 Date: Mon, 6 Mar 2023 16:00:36 +0800 Subject: [PATCH 026/132] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E6=92=AD=E6=94=BE=E9=87=8F=E3=80=81=E7=82=B9=E8=B5=9E=E6=95=B0?= =?UTF-8?q?=E7=AD=89=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 26 ++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 1a273eb..a059b1d 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -186,7 +186,7 @@ array VideoPages(string path) { dictionary video; video["title"] = item["part"].asString(); video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + Root["data"]["bvid"].asString() + "?isfromlist=true&cid=" + item["cid"].asInt(); + video["url"] = "https://www.bilibili.com/video/" + Root["data"]["bvid"].asString() + "?isfromlist=true&p=" + item["page"].asInt() + "&cid=" + item["cid"].asInt(); videos.insertLast(video); } } @@ -197,6 +197,19 @@ array VideoPages(string path) { return videos; } +string makeWebUrl(string path) { + array strs = path.split("?"); + string p = parse(path, "p"); + if (strs.length() >= 2) { + string url = strs[0]; + if (!p.empty()) { + url += "?p=" + p; + } + return url; + } + return path; +} + string Video(string bvid, const string &in path, dictionary &MetaData, array &QualityList) { log("--------------------------------------------------"); string res; @@ -233,8 +246,17 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array Date: Mon, 6 Mar 2023 16:33:58 +0800 Subject: [PATCH 027/132] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=9B=B4=E6=92=AD?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index a059b1d..2526a5c 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -237,7 +237,7 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array subtitle; dictionary dic; @@ -925,7 +925,6 @@ string Audio(const string &in path, dictionary &MetaData, array &Qua } JsonValue data = Root["data"]; MetaData["title"] = data["uname"].asString() + " - " + data["title"].asString(); - MetaData["SourceUrl"] = path; } } res = post("https://www.bilibili.com/audio/music-service-c/web/url?privilege=2&quality=2&sid=" + id); @@ -954,10 +953,17 @@ string Live(string id, const string &in path, dictionary &MetaData, array Date: Mon, 6 Mar 2023 20:57:17 +0800 Subject: [PATCH 028/132] =?UTF-8?q?feat:=20=E8=83=BD=E8=B7=B3=E8=BF=87?= =?UTF-8?q?=E7=89=87=E5=A4=B4=E5=92=8C=E7=89=87=E5=B0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 55 +++++++++++++++++--- 1 file changed, 49 insertions(+), 6 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 2526a5c..2359852 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -223,6 +223,8 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array= 0) { + webUrl = redirect_url.asString(); + ispgc = true; + } } - MetaData["webUrl"] = makeWebUrl(path); + MetaData["webUrl"] = makeWebUrl(webUrl); dic["url"] = danmaku_url + cid; subtitle.insertLast(dic); JsonValue subs; @@ -284,19 +291,55 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array 0) { + array chapt; + for (uint i = 0; i < clip_info_list.size(); i++) { + JsonValue chapter = clip_info_list[i]; + if (chapter.isObject()) { + if (chapter["clipType"].asString() == "CLIP_TYPE_OP") { + dictionary startItem; + startItem["title"] = "哔哩哔哩-片头"; + startItem["time"] = formatUInt((chapter["start"].asInt() == 0 ? chapter["start"].asInt() : chapter["start"].asInt() + 1) * 1000); + chapt.insertLast(startItem); + dictionary contentItem; + contentItem["title"] = "哔哩哔哩-正片"; + contentItem["time"] = formatUInt((chapter["end"].asInt() - 1) * 1000); + chapt.insertLast(contentItem); + } else if (chapter["clipType"].asString() == "CLIP_TYPE_ED") { + dictionary endItem; + endItem["title"] = "哔哩哔哩-片尾"; + endItem["time"] = formatUInt((chapter["start"].asInt() + 1) * 1000); + chapt.insertLast(endItem); + } + } + } + if (!chapt.empty() && (@QualityList !is null)) { + MetaData["chapter"] = chapt; + log("已经添加片头片尾时间"); + } + } + } else { + data = root["data"]; + } JsonValue urls = data["durl"]; if (data["durl"].isArray()) { url = data["durl"][0]["url"].asString(); - qn = root["data"]["quality"].asInt(); - JsonValue qualities = root["data"]["accept_quality"]; + qn = data["quality"].asInt(); + JsonValue qualities = data["accept_quality"]; if (enable_qualities && @QualityList !is null) { for (uint i = 0; i < qualities.size(); i++) { int quality = qualities[i].asInt(); From 072bf551263758b1b62130ec838dbc96e8469a43 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Mon, 6 Mar 2023 21:13:47 +0800 Subject: [PATCH 029/132] =?UTF-8?q?docs:=20=E8=B7=B3=E8=BF=87=E7=89=87?= =?UTF-8?q?=E5=A4=B4=E7=89=87=E5=B0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 ++++++++++ public/skip_1.png | Bin 0 -> 129831 bytes public/skip_2.png | Bin 0 -> 21502 bytes 3 files changed, 10 insertions(+) create mode 100644 public/skip_1.png create mode 100644 public/skip_2.png diff --git a/README.md b/README.md index 59bfb7e..9059db7 100644 --- a/README.md +++ b/README.md @@ -62,3 +62,13 @@ PS:有了 cookie 能操作 B 站账号的大部分功能,切勿泄露或分享 按 ctrl + U,在文件地址列表中选择`搜索`,然后到上面的输入框中替换关键词,最后回车即可 ![Search](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/search.png) + +### 跳过片头片尾 + +对于一些电视剧、番剧,能够跳过片头和片尾。具体设置为:在 PotPlayer 上点击鼠标右键,选择`播放`-`跳略播放`-`跳略播放设置` + +![Skip_Settings](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/skip_1.png) + +勾选`跳略播放`和`章节名称`,并在名称列表中追加`哔哩哔哩-片头`和`哔哩哔哩-片尾`两项,每一项之间用英文分号`;`隔开。 + +![Skip_Settings](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/skip_2.png) diff --git a/public/skip_1.png b/public/skip_1.png new file mode 100644 index 0000000000000000000000000000000000000000..72799a06cd6ce9d6d9ba6c68b46ce53b1feb6035 GIT binary patch literal 129831 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

I_UNDk`ol0biQWX@!d? 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 I$Ilh~6V)Stng9R* literal 0 HcmV?d00001 diff --git a/public/skip_2.png b/public/skip_2.png new file mode 100644 index 0000000000000000000000000000000000000000..39091bc9fdb3e46f42ff6045f67bfb6119f054a6 GIT binary patch literal 21502 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 Cn}g^8 literal 0 HcmV?d00001 From 6e47380072f1d87ffcf02b0f55bac4c43f8c7a16 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Tue, 7 Mar 2023 09:54:29 +0800 Subject: [PATCH 030/132] =?UTF-8?q?=E7=BB=99=E5=88=86p=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E4=B9=9F=E6=B7=BB=E5=8A=A0=E8=A7=86=E9=A2=91=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 77 ++++++++++---------- 1 file changed, 38 insertions(+), 39 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 2359852..847cd06 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -186,7 +186,7 @@ array VideoPages(string path) { dictionary video; video["title"] = item["part"].asString(); video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + Root["data"]["bvid"].asString() + "?isfromlist=true&p=" + item["page"].asInt() + "&cid=" + item["cid"].asInt(); + video["url"] = "https://www.bilibili.com/video/" + Root["data"]["bvid"].asString() + "?isfromlist=true&p=" + item["page"].asInt(); videos.insertLast(video); } } @@ -221,16 +221,12 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array= 0) { + webUrl = redirect_url.asString(); + ispgc = true; + } + MetaData["webUrl"] = makeWebUrl(webUrl); if (enable_subtitle) { - array subtitle; dictionary dic; - if (isPart) { - dic["name"] = "【弹幕】"; - } else { - dic["name"] = "【弹幕】" + data["title"].asString(); - title = data["title"].asString(); - MetaData["author"] = data["owner"]["name"].asString(); - MetaData["viewCount"] = data["stat"]["view"].asString(); - MetaData["likeCount"] = data["stat"]["like"].asString(); - string desc = data["desc"].asString(); - if (desc.empty()) { - MetaData["content"] = title; - } else { - MetaData["content"] = data["desc"].asString(); - } - JsonValue redirect_url = data["redirect_url"]; - if (redirect_url.isString() && redirect_url.asString().find("bangumi/play/ep") >= 0) { - webUrl = redirect_url.asString(); - ispgc = true; - } - } - MetaData["webUrl"] = makeWebUrl(webUrl); + dic["name"] = "【弹幕】" + title; dic["url"] = danmaku_url + cid; subtitle.insertLast(dic); + } + } else { + return url; + } + } + + res = apiPost("/x/player/v2?bvid=" + bvid + "&cid=" + cid); + if (res.empty()) { + return url; + } + if (reader.parse(res, root) && root.isObject()) { + if (root["code"].asInt() == 0) { + JsonValue data = root["data"]; + if (enable_subtitle) { JsonValue subs; - if (isPart) { - subs = root["data"]["subtitle"]["subtitles"]; - } else { - subs = root["data"]["subtitle"]["list"]; - } + subs = root["data"]["subtitle"]["subtitles"]; if (subs.isArray()) { for (uint i = 0; i < subs.size(); i++) { JsonValue sub = subs[i]; @@ -329,7 +329,6 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array Date: Tue, 7 Mar 2023 10:10:05 +0800 Subject: [PATCH 031/132] =?UTF-8?q?feat:=20=E8=A7=86=E9=A2=91=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E6=98=BE=E7=A4=BA=E5=88=86=E6=AE=B5=E7=AB=A0=E8=8A=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 847cd06..5563a1a 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -285,7 +285,23 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array chapt; + for (uint i = 0; i < points.size(); i++) { + JsonValue point = points[i]; + dictionary item; + item["title"] = point["content"].asString(); + item["time"] = formatUInt(point["from"].asInt() * 1000); + chapt.insertLast(item); + } + if (!chapt.empty() && (@QualityList !is null)) { + MetaData["chapter"] = chapt; + } } } else { return url; From 3718579728354ad8a234abd22aa792211d81fdc0 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Thu, 9 Mar 2023 09:27:48 +0800 Subject: [PATCH 032/132] =?UTF-8?q?=E6=B7=BB=E5=8A=A0:=20=E7=A8=8D?= =?UTF-8?q?=E5=90=8E=E5=86=8D=E7=9C=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 36 ++++++++++++++++++++ Media/UrlList/MediaUrlList - Bilibili.as | 1 + 2 files changed, 37 insertions(+) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 5563a1a..016763d 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -407,6 +407,33 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array watchlater() { + array videos; + string res = apiPost("/x/v2/history/toview"); + if (!res.empty()) { + JsonReader Reader; + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue data = Root["data"]["list"]; + if (data.isArray()) { + for (uint i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + if (item.isObject()) { + dictionary video; + video["title"] = item["title"].asString(); + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + videos.insertLast(video); + } + } + } + } + } + } + return videos; +} + string parse(string url, string key, string defaultValue="") { string value = HostRegExpParse(url, "\?" + key + "=([^&]+)"); if (!value.empty()) { @@ -1093,6 +1120,9 @@ bool PlaylistCheck(const string &in path) { if (path.find("search.bilibili.com") >= 0) { return true; } + if (path.find("/watchlater") >= 0) { + return true; + } if (path.find("space.bilibili.com") >= 0) { if (path.find("/video") >= 0) { return true; @@ -1154,9 +1184,15 @@ array PlaylistParse(const string &in path) { if (path.find("/video/BV") >= 0 && path.find("isfromlist") < 0) { return VideoPages(path); } + if (path.find("/watchlater") >= 0) { + return watchlater(); + } if (path.find("search.bilibili.com") >= 0) { return Search(path); } + if (path.find("bilibili.com/watchlater/#/list") >= 0) { + return watchlater(); + } if (path.find("space.bilibili.com") >= 0) { if (path.find("/video") >= 0) { return spaceVideo(path); diff --git a/Media/UrlList/MediaUrlList - Bilibili.as b/Media/UrlList/MediaUrlList - Bilibili.as index 95c534f..f17cf8e 100644 --- a/Media/UrlList/MediaUrlList - Bilibili.as +++ b/Media/UrlList/MediaUrlList - Bilibili.as @@ -227,6 +227,7 @@ array Other() { { { "title", "我关注的直播" }, { "url", "https://link.bilibili.com/p/center/index#/user-center/follow/1" } }, { { "title", "入站必刷" }, { "url", "https://www.bilibili.com/v/popular/history/" } }, { { "title", "搜索" }, { "url", "https://search.bilibili.com/video?keyword=陈奕迅" } }, + { { "title", "稍后再看" }, { "url", "https://www.bilibili.com/watchlater/#/list" } }, }; } From d66288d34eda2d8e9ea31e7751694f2367de3de9 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Thu, 9 Mar 2023 10:07:43 +0800 Subject: [PATCH 033/132] =?UTF-8?q?=E6=B7=BB=E5=8A=A0:=20=E5=8E=86?= =?UTF-8?q?=E5=8F=B2=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 60 +++++++++++++++++++- Media/UrlList/MediaUrlList - Bilibili.as | 1 + 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 016763d..5cc1acc 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -421,9 +421,14 @@ array watchlater() { JsonValue item = data[i]; if (item.isObject()) { dictionary video; - video["title"] = item["title"].asString(); + int p = item["page"]["page"].asInt(); + if (p == 1) { + video["title"] = item["title"].asString(); + } else { + video["title"] = item["title"].asString() + " | " + item["page"]["part"].asString(); + } video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?p=" + p + "&isfromlist=true"; videos.insertLast(video); } } @@ -434,6 +439,49 @@ array watchlater() { return videos; } +array History() { + array videos; + uint max = 0; + uint ps = 20; + string res = apiPost("/x/web-interface/history/cursor?max=" + max + "&ps=" + ps); + if (!res.empty()) { + JsonReader Reader; + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue data = Root["data"]["list"]; + if (data.isArray()) { + for (uint i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + string type = item["history"]["business"].asString(); + // archive live pgc + if (type == "archive" || type == "live") { + if (item.isObject()) { + dictionary video; + if (type == "live") { + video["title"] = "直播 | " + item["title"].asString(); + video["url"] = item["uri"].asString() + "?isfromlist=true"; + } else if (type == "archive") { + int p = item["history"]["page"].asInt(); + if (p == 1) { + video["title"] = item["title"].asString(); + } else { + video["title"] = item["title"].asString() + " | " + item["history"]["part"].asString(); + } + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["history"]["bvid"].asString() + "?p=" + p + "&isfromlist=true"; + } + videos.insertLast(video); + } + } + } + } + } + } + } + return videos; +} + string parse(string url, string key, string defaultValue="") { string value = HostRegExpParse(url, "\?" + key + "=([^&]+)"); if (!value.empty()) { @@ -947,7 +995,7 @@ array Recommend(uint page) { } dictionary video; if (item["uri"].asString().find("live.bilibili.com") >= 0) { - video["title"] = "【直播】" + item["owner"]["name"].asString() + " - " + item["title"].asString(); + video["title"] = "直播 | " + item["owner"]["name"].asString() + " - " + item["title"].asString(); video["url"] = item["uri"].asString() + "?isfromlist=true"; } else { video["title"] = item["title"].asString(); @@ -1123,6 +1171,9 @@ bool PlaylistCheck(const string &in path) { if (path.find("/watchlater") >= 0) { return true; } + if (path.find("/account/history") >= 0) { + return true; + } if (path.find("space.bilibili.com") >= 0) { if (path.find("/video") >= 0) { return true; @@ -1187,6 +1238,9 @@ array PlaylistParse(const string &in path) { if (path.find("/watchlater") >= 0) { return watchlater(); } + if (path.find("/account/history") >= 0) { + return History(); + } if (path.find("search.bilibili.com") >= 0) { return Search(path); } diff --git a/Media/UrlList/MediaUrlList - Bilibili.as b/Media/UrlList/MediaUrlList - Bilibili.as index f17cf8e..b008b3c 100644 --- a/Media/UrlList/MediaUrlList - Bilibili.as +++ b/Media/UrlList/MediaUrlList - Bilibili.as @@ -228,6 +228,7 @@ array Other() { { { "title", "入站必刷" }, { "url", "https://www.bilibili.com/v/popular/history/" } }, { { "title", "搜索" }, { "url", "https://search.bilibili.com/video?keyword=陈奕迅" } }, { { "title", "稍后再看" }, { "url", "https://www.bilibili.com/watchlater/#/list" } }, + { { "title", "历史记录" }, { "url", "https://www.bilibili.com/account/history" } }, }; } From cf2c24d008b15de8b8c9fa0f61a4bef4c4226704 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Thu, 9 Mar 2023 11:02:25 +0800 Subject: [PATCH 034/132] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E5=A4=9A=E9=A1=B5?= =?UTF-8?q?=E7=BB=93=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 131 ++++++++++++------- 1 file changed, 87 insertions(+), 44 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 5cc1acc..5684861 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -516,66 +516,109 @@ int parseTime(string s) { } array Channel(string path) { + array videos; int ps = 100; + int pn = 1; string uid = HostRegExpParse(path, "/([0-9]+)"); string sid = parse(path, "sid"); - string url = "/x/polymer/space/seasons_archives_list?mid=" + uid + "&season_id=" + sid + "&sort_reverse=" + parse(path, "sort_reverse", "false") + "&page_num=1&page_size=" + ps; - string res = apiPost(url); - array videos; - if (!res.empty()) { - JsonReader Reader; - JsonValue Root; - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue data = Root["data"]["archives"]; - if (data.isArray()) { - for (uint i = 0; i < data.size(); i++) { - JsonValue item = data[i]; - if (item.isObject()) { - dictionary video; - video["title"] = item["title"].asString(); - video["duration"] = item["length"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; - videos.insertLast(video); + string baseurl; + bool isCollection = path.find("collectiondetail") >= 0; + if (isCollection) { + baseurl = "/x/polymer/space/seasons_archives_list?mid=" + uid + "&season_id=" + sid + "&sort_reverse=" + parse(path, "sort_reverse", "false") + "&page_size=" + ps; + } else { + baseurl = "/x/series/archives?mid=" + uid + "&series_id=" + sid + "&sort=desc" + "&ps=" + ps; + } + while (true){ + string url; + if (isCollection) { + url = baseurl + "&page_num=" + pn; + } else { + url = baseurl + "&pn=" + pn; + } + string res = apiPost(url); + if (!res.empty()) { + JsonReader Reader; + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue data = Root["data"]["archives"]; + if (data.isArray()) { + for (uint i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + if (item.isObject()) { + dictionary video; + video["title"] = item["title"].asString(); + video["duration"] = item["length"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + videos.insertLast(video); + } + } + } + JsonValue page = Root["data"]["page"]; + if (isCollection) { + if (page["page_num"].asInt() * page["page_size"].asInt() >= page["total"].asInt()) { + break; + } + } else { + if (page["num"].asInt() * page["size"].asInt() >= page["total"].asInt()) { + break; } } + pn += 1; + } else { + return videos; } } + } else { + return videos; } } + return videos; } array spaceVideo(string path) { - int ps = 50; - string url = "/x/space/wbi/arc/search?"; - url += "mid=" + HostRegExpParse(path, "/([0-9]+)"); - url += "&ps=" + ps; - url += "&tid=" + parse(path, "tid", "0"); - url += "&pn=1"; - url += "&keyword=" + parse(path, "keyword"); - url += "&order=" + parse(path, "order", "pubdate"); - string res = apiPost(url); array videos; - if (!res.empty()) { - JsonReader Reader; - JsonValue Root; - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue data = Root["data"]["list"]["vlist"]; - if (data.isArray()) { - for (uint i = 0; i < data.size(); i++) { - JsonValue item = data[i]; - if (item.isObject()) { - dictionary video; - video["title"] = item["title"].asString(); - video["duration"] = parseTime(item["length"].asString()); - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; - videos.insertLast(video); + int ps = 50; + int pn = 1; + string baseurl = "/x/space/wbi/arc/search?"; + baseurl += "mid=" + HostRegExpParse(path, "/([0-9]+)"); + baseurl += "&ps=" + ps; + baseurl += "&tid=" + parse(path, "tid", "0"); + baseurl += "&keyword=" + parse(path, "keyword"); + baseurl += "&order=" + parse(path, "order", "pubdate"); + while (true) { + string url = baseurl + "&pn=" + pn; + string res = apiPost(url); + if (!res.empty()) { + JsonReader Reader; + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue data = Root["data"]["list"]["vlist"]; + if (data.isArray()) { + for (uint i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + if (item.isObject()) { + dictionary video; + video["title"] = item["title"].asString(); + video["duration"] = parseTime(item["length"].asString()); + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + videos.insertLast(video); + } } } + JsonValue page = Root["data"]["page"]; + if (page["pn"].asInt() * page["ps"].asInt() >= page["count"].asInt()) { + break; + } + pn += 1; + } else { + return videos; } } + } else { + return videos; } } return videos; @@ -1184,7 +1227,7 @@ bool PlaylistCheck(const string &in path) { else if (path.find("/favlist") >= 0) { return true; } - else if (path.find("/channel/collectiondetail") >= 0) { + else if (path.find("/channel/collectiondetail") >= 0 || path.find("/channel/seriesdetail") >= 0) { return true; } else if (HostRegExpParse(path, "/([0-9]+)/[a-zA-Z0-9]").empty()) { @@ -1256,7 +1299,7 @@ array PlaylistParse(const string &in path) { else if (path.find("/favlist") >= 0) { return FavList(path); } - else if (path.find("/channel/collectiondetail") >= 0) { + else if (path.find("/channel/collectiondetail") >= 0 || path.find("/channel/seriesdetail") >= 0) { return Channel(path); } else if (HostRegExpParse(path, "/([0-9]+)/[a-zA-Z0-9]").empty()) { From 7468f1d0160cb05ea1bb857c53c39ecb675ded01 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Mon, 13 Mar 2023 19:53:02 +0800 Subject: [PATCH 035/132] update --- Media/PlayParse/MediaPlayParse - Bilibili.as | 23 +++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 5684861..49bce2b 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -166,8 +166,7 @@ uint gettid(string path) { } // 分P -array VideoPages(string path) { - string bvid = parseBVId(path); +array VideoPages(string bvid) { array videos; if (bvid.empty()) { return videos; @@ -199,15 +198,15 @@ array VideoPages(string path) { string makeWebUrl(string path) { array strs = path.split("?"); + if (strs.length() <= 1) { + return path; + } + string url = strs[0]; string p = parse(path, "p"); - if (strs.length() >= 2) { - string url = strs[0]; - if (!p.empty()) { - url += "?p=" + p; - } + if (p.empty() || p == "1") { return url; } - return path; + return url += "?p=" + p; } string Video(string bvid, const string &in path, dictionary &MetaData, array &QualityList) { @@ -1275,8 +1274,9 @@ array PlaylistParse(const string &in path) { log("Playlist path", path); array result; - if (path.find("/video/BV") >= 0 && path.find("isfromlist") < 0) { - return VideoPages(path); + string bvid = parseBVId(path); + if (!bvid.empty() && path.find("isfromlist") < 0) { + return VideoPages(bvid); } if (path.find("/watchlater") >= 0) { return watchlater(); @@ -1287,9 +1287,6 @@ array PlaylistParse(const string &in path) { if (path.find("search.bilibili.com") >= 0) { return Search(path); } - if (path.find("bilibili.com/watchlater/#/list") >= 0) { - return watchlater(); - } if (path.find("space.bilibili.com") >= 0) { if (path.find("/video") >= 0) { return spaceVideo(path); From 7f11e5a704be011725217cd918ed1dc2c3eb5a34 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Mon, 13 Mar 2023 20:07:52 +0800 Subject: [PATCH 036/132] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E6=8E=A8=E8=8D=90=EF=BC=8C=E4=BB=85=E5=9C=A8=E6=92=AD?= =?UTF-8?q?=E6=94=BE=E5=8D=95P=E8=A7=86=E9=A2=91=E6=97=B6=E7=94=9F?= =?UTF-8?q?=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 27 ++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 49bce2b..a619a79 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -32,6 +32,8 @@ string danmaku_url = subtitle_host + "/subtitle?font=" + HostUrlEncode("微软 string subtitle_url = subtitle_host + "/subtitle?url="; // 是否可选择画质 bool enable_qualities = true; +// 视频推荐 +bool enable_related = true; void OnInitialize() { HostSetUrlHeaderHTTP("bilivideo.com", "Referer: https://www.bilibili.com\r\n"); @@ -193,6 +195,31 @@ array VideoPages(string bvid) { } } } + if (videos.length() >= 2 || !enable_related) { + return videos; + } + res = apiPost("/x/web-interface/archive/related?bvid=" + bvid); + if (!res.empty()) { + JsonReader Reader; + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue data = Root["data"]; + if (data.isArray()) { + for (uint i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + if (item.isObject()) { + dictionary video; + video["title"] = item["title"].asString(); + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + videos.insertLast(video); + } + } + } + } + } + } return videos; } From 73218b913bf873362bf7ff5e75df513b76b8f5ce Mon Sep 17 00:00:00 2001 From: chen310 <33364396+chen310@users.noreply.github.com> Date: Mon, 13 Mar 2023 22:41:42 +0800 Subject: [PATCH 037/132] Update MediaPlayParse - Bilibili.as --- Media/PlayParse/MediaPlayParse - Bilibili.as | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index a619a79..f003cb3 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -233,7 +233,7 @@ string makeWebUrl(string path) { if (p.empty() || p == "1") { return url; } - return url += "?p=" + p; + return url + "?p=" + p; } string Video(string bvid, const string &in path, dictionary &MetaData, array &QualityList) { From 65bb1fe4ddf857d1d35c3be1f0b771adf8ece508 Mon Sep 17 00:00:00 2001 From: chen310 <33364396+chen310@users.noreply.github.com> Date: Tue, 14 Mar 2023 16:02:53 +0800 Subject: [PATCH 038/132] fix --- Media/PlayParse/MediaPlayParse - Bilibili.as | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index f003cb3..7a7ced9 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -1046,7 +1046,7 @@ array Recommend(uint page) { JsonReader Reader; JsonValue Root; const uint nums = 5; - string url ="/x/web-interface/wbi/index/top/feed/rcmd?y_num=3&fresh_type=4&feed_version=V8&fresh_idx_1h="+page+"&fetch_row="+(3*page+1)+"&fresh_idx="+page+"&brush="+page+"&homepage_ver=1&ps=12&last_y_num=4&outside_trigger="; + string url ="/x/web-interface/index/top/feed/rcmd?y_num=3&fresh_type=4&feed_version=V8&fresh_idx_1h="+page+"&fetch_row="+(3*page+1)+"&fresh_idx="+page+"&brush="+page+"&homepage_ver=1&ps=12&last_y_num=4&outside_trigger="; string res = apiPost(url); if (res.empty()) { return videos; From aab7d57aa79189115023ca6ae557bee59c599228 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Tue, 14 Mar 2023 16:44:14 +0800 Subject: [PATCH 039/132] =?UTF-8?q?=E9=80=82=E9=85=8D=E4=B8=BB=E9=A1=B5?= =?UTF-8?q?=E9=9F=B3=E9=A2=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 45 ++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 7a7ced9..87be4b1 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -650,6 +650,50 @@ array spaceVideo(string path) { return videos; } +array spaceAudio(string path) { + array audios; + int ps = 50; + int pn = 1; + string baseurl = "/audio/music-service/web/song/upper?"; + baseurl += "uid=" + HostRegExpParse(path, "/([0-9]+)"); + baseurl += "&ps=" + ps; + baseurl += "&order=" + parse(path, "order", "1"); + while (true) { + string url = baseurl + "&pn=" + pn; + string res = apiPost(url); + if (!res.empty()) { + JsonReader Reader; + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue data = Root["data"]["data"]; + if (data.isArray()) { + for (uint i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + if (item.isObject()) { + dictionary audio; + audio["title"] = item["title"].asString(); + audio["duration"] = item["duration"].asInt() * 1000; + audio["url"] = "https://www.bilibili.com/audio/au" + item["id"].asString() + "?isfromlist=true"; + audios.insertLast(audio); + } + } + } + if (Root["data"]["curPage"].asInt() >= Root["data"]["pageCount"].asInt()) { + break; + } + pn += 1; + } else { + return audios; + } + } + } else { + return audios; + } + } + return audios; +} + string parseFid(string path) { string fid = parse(path, "fid"); if (fid.empty()) { @@ -1319,6 +1363,7 @@ array PlaylistParse(const string &in path) { return spaceVideo(path); } else if (path.find("/audio") >= 0) { + return spaceAudio(path); } else if (path.find("/favlist") >= 0) { return FavList(path); From baaa77ecf38b06b60dd3e96c1d5840bdcdd90995 Mon Sep 17 00:00:00 2001 From: chen310 <33364396+chen310@users.noreply.github.com> Date: Tue, 14 Mar 2023 22:53:00 +0800 Subject: [PATCH 040/132] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 9059db7..5821312 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # BilibiliPotPlayer -适用于 PotPlayer 的 Bilibili 插件。 +适用于 PotPlayer 的 Bilibili 插件。如果配合[油猴脚本](https://greasyfork.org/zh-CN/scripts/461800-bilibilipotplayer),可以直接在网页打开 PotPlayer 进行播放 ## 安装插件 From 4817a54fed4998248716bf78eb6d5e51ac69046f Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Wed, 15 Mar 2023 16:26:18 +0800 Subject: [PATCH 041/132] =?UTF-8?q?=E9=80=82=E9=85=8D=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E9=A6=96=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 80 +++++++++++++++++++- Media/UrlList/MediaUrlList - Bilibili.as | 1 + 2 files changed, 80 insertions(+), 1 deletion(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 87be4b1..71750a3 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -550,7 +550,7 @@ array Channel(string path) { string baseurl; bool isCollection = path.find("collectiondetail") >= 0; if (isCollection) { - baseurl = "/x/polymer/space/seasons_archives_list?mid=" + uid + "&season_id=" + sid + "&sort_reverse=" + parse(path, "sort_reverse", "false") + "&page_size=" + ps; + baseurl = "/x/polymer/space/seasons_archives_list?mid=" + uid + "&season_id=" + sid + "&sort_reverse=" + parse(path, "sort_reverse", "false") + "&page_size=" + ps; } else { baseurl = "/x/series/archives?mid=" + uid + "&series_id=" + sid + "&sort=desc" + "&ps=" + ps; } @@ -1085,6 +1085,78 @@ array Search(string path) { return videos; } +array webDynamic(string path) { + array videos; + JsonReader Reader; + JsonValue Root; + string type = parse(path, "tab"); + if (type != "video") { + type = "all"; + } + int nums = 2; + string offset; + string baseurl ="/x/polymer/web-dynamic/v1/feed/all?timezone_offset=-480&type=" + type; + for (int i = 1; i <= nums; i++) { + string url = baseurl + "&page=" + i; + if (!offset.empty()) { + url += "&offset=" + offset; + } + string res = apiPost(url); + if (res.empty()) { + return videos; + } + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return videos; + } + JsonValue list = Root["data"]["items"]; + if (list.isArray()) { + offset = Root["data"]["offset"].asString(); + for (uint j = 0; j < list.size(); j++) { + JsonValue dynamic = list[j]["modules"]["module_dynamic"]; + if (dynamic.isObject()) { + JsonValue major = dynamic["major"]; + if (!major.isObject()) { + continue; + } + string author = list[j]["modules"]["module_author"]["name"].asString(); + JsonValue archive = major["archive"]; + if (archive.isObject()) { + if (archive["bvid"].isString() && !archive["bvid"].asString().empty()) { + string bvid = archive["bvid"].asString(); + dictionary video; + video["title"] = "视频 | " + author + " - " + archive["title"].asString(); + video["duration"] = parseTime(archive["duration_text"].asString()) * 1000; + video["url"] = "https://www.bilibili.com/video/" + bvid + "?isfromlist=true"; + videos.insertLast(video); + } + continue; + } + JsonValue live_rcmd = major["live_rcmd"]; + if (live_rcmd.isObject()) { + string content_str = live_rcmd["content"].asString(); + JsonValue content; + if (Reader.parse(content_str, content) && content.isObject()) { + if (content["live_play_info"]["live_status"].asInt() == 1) { + dictionary live; + live["title"] = "直播 | " + author + " - " + content["live_play_info"]["title"].asString(); + live["url"] = "https://live.bilibili.com/" + content["live_play_info"]["room_id"].asString() + "?isfromlist=true"; + videos.insertLast(live); + } + } + continue; + } + } + } + if (!Root["data"]["has_more"].asBool()) { + break; + } + } + } + } + return videos; +} + array Recommend(uint page) { array videos; JsonReader Reader; @@ -1337,6 +1409,9 @@ bool PlaylistCheck(const string &in path) { if (path.find("www.bilibili.com/audio/am") >= 0) { return true; } + if (path.find("t.bilibili.com") >= 0) { + return true; + } return false; } @@ -1409,6 +1484,9 @@ array PlaylistParse(const string &in path) { if (tid > 0) { return Dynamic(tid); } + if (path.find("t.bilibili.com") >= 0) { + return webDynamic(path); + } return result; } diff --git a/Media/UrlList/MediaUrlList - Bilibili.as b/Media/UrlList/MediaUrlList - Bilibili.as index b008b3c..57bcb46 100644 --- a/Media/UrlList/MediaUrlList - Bilibili.as +++ b/Media/UrlList/MediaUrlList - Bilibili.as @@ -229,6 +229,7 @@ array Other() { { { "title", "搜索" }, { "url", "https://search.bilibili.com/video?keyword=陈奕迅" } }, { { "title", "稍后再看" }, { "url", "https://www.bilibili.com/watchlater/#/list" } }, { { "title", "历史记录" }, { "url", "https://www.bilibili.com/account/history" } }, + { { "title", "动态首页" }, { "url", "https://t.bilibili.com" } }, }; } From d53157fd73d7d56717b56407276bf31a53de6e4f Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Wed, 15 Mar 2023 16:41:04 +0800 Subject: [PATCH 042/132] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=A7=86=E9=A2=91?= =?UTF-8?q?=E6=97=B6=E9=95=BF=E6=98=BE=E7=A4=BA=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 71750a3..00d31bd 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -1077,7 +1077,7 @@ array Search(string path) { title.replace("", ''); video["title"] = title; video["content"] = item["author"].asString() + " | " + title; - video["duration"] = parseTime(item["duration"].asString()) * 1000; + video["duration"] = parseTime(item["duration"].asString()); video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; videos.insertLast(video); } @@ -1126,7 +1126,7 @@ array webDynamic(string path) { string bvid = archive["bvid"].asString(); dictionary video; video["title"] = "视频 | " + author + " - " + archive["title"].asString(); - video["duration"] = parseTime(archive["duration_text"].asString()) * 1000; + video["duration"] = parseTime(archive["duration_text"].asString()); video["url"] = "https://www.bilibili.com/video/" + bvid + "?isfromlist=true"; videos.insertLast(video); } From 8f8cb8f84e0ebfce918623b367af7a3efd4051c3 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Wed, 15 Mar 2023 16:55:39 +0800 Subject: [PATCH 043/132] =?UTF-8?q?=E5=8E=86=E5=8F=B2=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E4=B8=AD=E4=B8=8D=E6=98=BE=E7=A4=BA=E6=9C=AA=E5=BC=80=E6=92=AD?= =?UTF-8?q?=E7=9A=84=E7=9B=B4=E6=92=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 7 ++++++- Media/UrlList/MediaUrlList - Bilibili.as | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 00d31bd..f1f8840 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -485,7 +485,10 @@ array History() { if (item.isObject()) { dictionary video; if (type == "live") { - video["title"] = "直播 | " + item["title"].asString(); + if (item["live_status"].asInt() != 1) { + continue; + } + video["title"] = "直播 | " + item["author_name"].asString() + " - " + item["title"].asString(); video["url"] = item["uri"].asString() + "?isfromlist=true"; } else if (type == "archive") { int p = item["history"]["page"].asInt(); @@ -496,6 +499,8 @@ array History() { } video["duration"] = item["duration"].asInt() * 1000; video["url"] = "https://www.bilibili.com/video/" + item["history"]["bvid"].asString() + "?p=" + p + "&isfromlist=true"; + } else { + continue; } videos.insertLast(video); } diff --git a/Media/UrlList/MediaUrlList - Bilibili.as b/Media/UrlList/MediaUrlList - Bilibili.as index 57bcb46..631bd0b 100644 --- a/Media/UrlList/MediaUrlList - Bilibili.as +++ b/Media/UrlList/MediaUrlList - Bilibili.as @@ -256,7 +256,7 @@ array GetUrlList(string Category, string Extra, string PathToken, st } if (Category == "Other") { return Other(); - } + } array ret; return ret; From bc77e8c1f88527f8966d340156640126ba84b83e Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Thu, 16 Mar 2023 16:46:34 +0800 Subject: [PATCH 044/132] fix --- Media/PlayParse/MediaPlayParse - Bilibili.as | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index f1f8840..0855706 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -1039,17 +1039,22 @@ array Search(string path) { array videos; JsonReader Reader; JsonValue Root; - path.replace("?WithCaption", ""); - string kw = parse(path, "keyword"); + string kw; + if (path.find("?WithCaption") >= 0) { + path.replace("?WithCaption", ""); + kw = HostUrlEncode(parse(path, "keyword")); + } else { + kw = parse(path, "keyword"); + } if (kw.empty()) { return videos; } string type = HostRegExpParse(path, "search.bilibili.com/([a-zA-Z0-9]+)"); string url; if (type == "all") { - url = "/x/web-interface/search/all/v2?keyword=" + HostUrlEncode(kw); + url = "/x/web-interface/search/all/v2?keyword=" + kw; } else if (type == "video") { - url = "/x/web-interface/search/type?search_type=video&keyword=" + HostUrlEncode(kw); + url = "/x/web-interface/search/type?search_type=video&keyword=" + kw; } else { return videos; } From abb5c21bcfcae4bc48f45387700490ce13bc497a Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Mon, 27 Mar 2023 15:29:34 +0800 Subject: [PATCH 045/132] =?UTF-8?q?=E6=94=B6=E8=97=8F=E5=A4=B9=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E5=85=A8=E9=83=A8=E8=A7=86=E9=A2=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 60 ++++++++++++-------- 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 0855706..50c52af 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -143,7 +143,6 @@ void log(string item, int info) { string post(string url, string data="") { string UserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"; string Headers = "Referer: https://www.bilibili.com\r\n"; - Headers += "User-Agent: " + UserAgent + "\r\n"; if (!cookie.empty()) { Headers += "Cookie: " + cookie + "\r\n"; } @@ -736,37 +735,50 @@ array FavList(string path) { if (fid.empty()) { return videos; } - string url = ""; + int pn = 1; + int ps = 20; + string baseurl; + string url; string ftype = parse(path, "ftype"); // 订阅和收藏 if (ftype == "collect") { - url = "/x/space/fav/season/list?season_id=" + fid + "&pn=1&ps=20"; + baseurl = "/x/space/fav/season/list?season_id=" + fid + "&ps=" + ps; } else { - url = "/x/v3/fav/resource/list?media_id=" + fid + "&pn=1&ps=20"; - url += "&keyword=" + parse(path, "keyword"); - url += "&order=" + parse(path, "order", "mtime"); + baseurl = "/x/v3/fav/resource/list?media_id=" + fid + "&ps=" + ps; + baseurl += "&keyword=" + parse(path, "keyword"); + baseurl += "&order=" + parse(path, "order", "mtime"); // url += "&type=" + parse(path, "type", "0"); - url += "&tid=" + parse(path, "tid", "0"); + baseurl += "&tid=" + parse(path, "tid", "0"); } - string res = apiPost(url); - if (res.empty()) { - return videos; - } - JsonValue Root; - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue data = Root["data"]["medias"]; - if (data.isArray()) { - for (uint i = 0; i < data.size(); i++) { - JsonValue item = data[i]; - if (item.isObject()) { - dictionary video; - video["title"] = item["title"].asString(); - video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; - videos.insertLast(video); + while (true) { + url = baseurl + "&pn=" + pn; + string res = apiPost(url); + if (res.empty()) { + return videos; + } + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue data = Root["data"]["medias"]; + if (data.isArray()) { + for (uint i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + if (item.isObject()) { + dictionary video; + video["title"] = item["title"].asString(); + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + videos.insertLast(video); + } } } + int count = Root["data"]["info"]["media_count"].asInt(); + if (pn * ps >= count) { + break; + } + pn += 1; + } else { + return videos; } } } From 32427db45869eadfcd05db17ecd4b012e81acbbd Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Tue, 28 Mar 2023 15:59:36 +0800 Subject: [PATCH 046/132] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=B8=85=E6=99=B0?= =?UTF-8?q?=E5=BA=A6=E5=A4=87=E4=BB=BD=E9=93=BE=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 39 +++++++++++++++++--- 1 file changed, 33 insertions(+), 6 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 50c52af..cc34302 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -387,8 +387,12 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array 0) { + qualityitem2["url"] = data["durl"][0]["backup_url"][0].asString(); + } } else { string quality_res = apiPost("/x/player/playurl?avid=" + aid + "&cid=" + cid + "&qn=" + quality + "&fnval=128&fourk=1"); JsonValue temp; @@ -396,16 +400,25 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array 0) { + qualityitem2["url"] = quality_data[0]["backup_url"][0].asString(); + } } } } + int itag = getVideoItag(quality); qualityitem["quality"] = getVideoquality(quality); qualityitem["qualityDetail"] = qualityitem["quality"]; - qualityitem["itag"] = getVideoItag(quality); + qualityitem["itag"] = itag; QualityList.insertLast(qualityitem); + + qualityitem2["quality"] = "- " + getVideoquality(quality) + " 备份"; + qualityitem2["qualityDetail"] = qualityitem2["quality"]; + qualityitem2["itag"] = itag + 20; + QualityList.insertLast(qualityitem2); } } } @@ -1320,8 +1333,13 @@ string Live(string id, const string &in path, dictionary &MetaData, array 1) { + qualityitem2["url"] = data[1]["url"].asString(); + } } else { string quality_res = post("https://api.live.bilibili.com/xlive/web-room/v1/playUrl/playUrl?cid=" + room_id + "&platform=web&qn=" + quality + "&https_url_req=1&ptype=16"); JsonValue temp; @@ -1332,13 +1350,22 @@ string Live(string id, const string &in path, dictionary &MetaData, array 1) { + qualityitem2["url"] = qyality_data[1]["url"].asString(); + } } } } + int itag = getItag(quality); qualityitem["quality"] = qualities[i]["desc"].asString(); - qualityitem["qualityDetail"] = qualities[i]["desc"].asString(); - qualityitem["itag"] = getItag(quality); + qualityitem["qualityDetail"] = qualityitem["quality"]; + qualityitem["itag"] = itag; QualityList.insertLast(qualityitem); + + qualityitem2["quality"] = "- " + qualities[i]["desc"].asString() + " 备份"; + qualityitem2["qualityDetail"] = qualityitem2["quality"]; + qualityitem2["itag"] = itag + 20; + QualityList.insertLast(qualityitem2); } } } From 9bb15be4f387069a90e067fee9be9ca6a9116768 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Fri, 31 Mar 2023 15:37:37 +0800 Subject: [PATCH 047/132] =?UTF-8?q?=E9=80=82=E9=85=8David=E8=A7=86?= =?UTF-8?q?=E9=A2=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 33 +++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index cc34302..8f60a88 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -167,17 +167,24 @@ uint gettid(string path) { } // 分P -array VideoPages(string bvid) { +array VideoPages(string id) { array videos; - if (bvid.empty()) { + if (id.empty()) { return videos; } - string res = apiPost("/x/web-interface/view?bvid=" + bvid); + string res; + if (id.find("BV") == 0) { + res = apiPost("/x/web-interface/view?bvid=" + id); + } else { + res = apiPost("/x/web-interface/view?aid=" + id); + } + string bvid; if (!res.empty()) { JsonReader Reader; JsonValue Root; if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() == 0) { + bvid = Root["data"]["bvid"].asString(); JsonValue data = Root["data"]["pages"]; if (data.isArray()) { for (uint i = 0; i < data.size(); i++) { @@ -186,7 +193,7 @@ array VideoPages(string bvid) { dictionary video; video["title"] = item["part"].asString(); video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + Root["data"]["bvid"].asString() + "?isfromlist=true&p=" + item["page"].asInt(); + video["url"] = "https://www.bilibili.com/video/" + bvid + "?isfromlist=true&p=" + item["page"].asInt(); videos.insertLast(video); } } @@ -540,8 +547,11 @@ string parse(string url, string key, string defaultValue="") { } string parseBVId(string url) { - string bvid = HostRegExpParse(url, "(BV[a-zA-Z0-9]+)"); - return bvid; + return HostRegExpParse(url, "(BV[a-zA-Z0-9]+)"); +} + +string parseAVId(string url) { + return HostRegExpParse(url, "av([0-9]+)"); } int parseTime(string s) { @@ -1396,7 +1406,10 @@ bool PlaylistCheck(const string &in path) { if (path.find("bilibili.com") < 0) { return false; } - if (path.find("/video/BV") >= 0 && path.find("isfromlist") < 0) { + if (path.find("isfromlist") >= 0) { + return false; + } + if (!parseBVId(path).empty() || !parseAVId(path).empty()) { return true; } if (path.find("search.bilibili.com") >= 0) { @@ -1470,9 +1483,13 @@ array PlaylistParse(const string &in path) { array result; string bvid = parseBVId(path); - if (!bvid.empty() && path.find("isfromlist") < 0) { + if (!bvid.empty()) { return VideoPages(bvid); } + string avid = parseAVId(path); + if (!avid.empty()) { + return VideoPages(avid); + } if (path.find("/watchlater") >= 0) { return watchlater(); } From fa94ed158728ca749037a58d5e8e986d2c57f0e5 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Fri, 7 Apr 2023 09:22:48 +0800 Subject: [PATCH 048/132] =?UTF-8?q?docs:=20=E5=88=9B=E5=BB=BA=E5=8F=AF?= =?UTF-8?q?=E4=BB=A5=E8=87=AA=E5=8A=A8=E6=9B=B4=E6=96=B0=E7=9A=84=E6=92=AD?= =?UTF-8?q?=E6=94=BE=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 ++++++++ public/create_playlist_1.png | Bin 0 -> 27717 bytes public/create_playlist_2.png | Bin 0 -> 27623 bytes 3 files changed, 8 insertions(+) create mode 100644 public/create_playlist_1.png create mode 100644 public/create_playlist_2.png diff --git a/README.md b/README.md index 5821312..f808cdc 100644 --- a/README.md +++ b/README.md @@ -72,3 +72,11 @@ PS:有了 cookie 能操作 B 站账号的大部分功能,切勿泄露或分享 勾选`跳略播放`和`章节名称`,并在名称列表中追加`哔哩哔哩-片头`和`哔哩哔哩-片尾`两项,每一项之间用英文分号`;`隔开。 ![Skip_Settings](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/skip_2.png) + +### 创建自动更新的播放列表 + +按 F6 打开播放列表,点击新建专辑,起一个合适的专辑名称,选择外部播放器列表,并填写相应的链接,再点击确定即可。这样就得到一个可以自动更新的列表。 + +![Create_Playlist](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/create_playlist_1.png) + +![Create_Playlist](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/create_playlist_2.png) diff --git a/public/create_playlist_1.png b/public/create_playlist_1.png new file mode 100644 index 0000000000000000000000000000000000000000..7b95837368c890f06f230dd3a7ce3eb4a90e524c GIT binary patch literal 27717 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 CX=LO8 literal 0 HcmV?d00001 diff --git a/public/create_playlist_2.png b/public/create_playlist_2.png new file mode 100644 index 0000000000000000000000000000000000000000..4c9e1af37645d3ba70b3c9b117b4285f000d7c10 GIT binary patch literal 27623 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 Date: Fri, 7 Apr 2023 09:27:19 +0800 Subject: [PATCH 049/132] fix typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f808cdc..33cf166 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,7 @@ PS:有了 cookie 能操作 B 站账号的大部分功能,切勿泄露或分享 ### 创建自动更新的播放列表 -按 F6 打开播放列表,点击新建专辑,起一个合适的专辑名称,选择外部播放器列表,并填写相应的链接,再点击确定即可。这样就得到一个可以自动更新的列表。 +按 F6 打开播放列表,点击新建专辑,起一个合适的专辑名称,选择外部播放列表,并填写相应的链接,再点击确定即可。这样就得到一个可以自动更新的列表。 ![Create_Playlist](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/create_playlist_1.png) From e6420221c5e83996442dc34857bb8ad541733bd3 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Fri, 7 Apr 2023 10:18:41 +0800 Subject: [PATCH 050/132] feat: add GetStatus() --- Media/PlayParse/MediaPlayParse - Bilibili.as | 30 ++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 8f60a88..ad67551 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -111,6 +111,29 @@ string ServerLogin(string User, string Pass) return "cookie 设置成功"; } +uint status = 0; +string GetStatus() +{ + string info = ""; + + switch (status) + { + case 1: + info = "Parsing bilibili playlist"; + break; + case 2: + info = "Parsing bilibili video/audio"; + break; + case 3: + info = "Parsing bilibili playback link"; + break; + default: + info = "Waiting for parsing"; + } + + return info; +} + void handleCookie(string full_cookie) { array cookies = full_cookie.split(";"); for (uint i=0; i < cookies.length(); i++) { @@ -339,6 +362,7 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array &Qua MetaData["title"] = data["uname"].asString() + " - " + data["title"].asString(); } } + status = 3; res = post("https://www.bilibili.com/audio/music-service-c/web/url?privilege=2&quality=2&sid=" + id); res = HostDecompress(res); if (Reader.parse(res, Root) && Root.isObject()) { @@ -1329,6 +1354,7 @@ string Live(string id, const string &in path, dictionary &MetaData, array PlaylistParse(const string &in path) { log("Playlist path", path); + status = 1; array result; string bvid = parseBVId(path); @@ -1559,6 +1588,7 @@ array PlaylistParse(const string &in path) { string PlayitemParse(const string &in path, dictionary &MetaData, array &QualityList) { log("Playitem path", path); + status = 2; if (path.find("/video/BV") >= 0 && path.find("isfromlist") >= 0) { string bvid = parseBVId(path); return Video(bvid, path, MetaData, QualityList); From 1736a7ea45bc4eec5f749688e66ecef7f78742ad Mon Sep 17 00:00:00 2001 From: chen310 <33364396+chen310@users.noreply.github.com> Date: Sat, 8 Apr 2023 10:33:32 +0800 Subject: [PATCH 051/132] fix typo --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 33cf166..fd57512 100644 --- a/README.md +++ b/README.md @@ -8,11 +8,11 @@ 将项目 `Media/PlayParse` 路径下的 `MediaPlayParse - Bilibili.as` 和 `MediaPlayParse - Bilibili.ico` 两个文件复制到 `{PotPlayer 安装路径}\Extension\Media\PlayParse` 文件夹下。 -`MediaPlayParse - Bilibili.as` 提供了解析 `Bilibil` 链接的功能。 +`MediaPlayParse - Bilibili.as` 提供了解析 `Bilibili` 链接的功能。 将项目 `Media/UrlList` 路径下的 `MediaUrlList - Bilibili.as` 和 `MediaUrlList - Bilibili.ico` 两个文件复制到 `{PotPlayer 安装路径}\Extension\Media\UrlList` 文件夹下。 -`MediaUrlList - Bilibili.as` 提供了列出 `Bilibil` 常用链接的功能,使用方式为按下 ctrl + U 并选择要播放的项目,如下图所示 +`MediaUrlList - Bilibili.as` 提供了列出 `Bilibili` 常用链接的功能,使用方式为按下 ctrl + U 并选择要播放的项目,如下图所示 ![UrlList](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/urllist.png) From b1d00c2ab62c4bb9cfd3389cb0162681e589669b Mon Sep 17 00:00:00 2001 From: aliofwind <35068322+aliofwind@users.noreply.github.com> Date: Sun, 9 Apr 2023 13:17:11 +0800 Subject: [PATCH 052/132] =?UTF-8?q?=E5=AE=9E=E7=8E=B0DASH=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E4=B8=8B=E7=9A=84=E6=89=80=E6=9C=89=E5=88=86=E8=BE=A8?= =?UTF-8?q?=E7=8E=87=E6=92=AD=E6=94=BE=EF=BC=88=E6=94=AF=E6=8C=81=E9=9F=B3?= =?UTF-8?q?=E9=A2=91=EF=BC=89=20(#18)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Update MediaPlayParse - Bilibili.as * 实现dash播放 * disable debug * clean code * clean code --- Media/PlayParse/MediaPlayParse - Bilibili.as | 121 +++++++++++-------- 1 file changed, 72 insertions(+), 49 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index ad67551..5ed1ea6 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -273,8 +273,7 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array qn && quality > qn) { - continue; - } + for (uint i = 0; i < videos.size(); i++) { + int quality = videos[i]["id"].asInt(); dictionary qualityitem; - dictionary qualityitem2; - if (quality == qn) { - qualityitem["url"] = url; - if (data["durl"][0]["backup_url"].isArray() && data["durl"][0]["backup_url"].size() > 0) { - qualityitem2["url"] = data["durl"][0]["backup_url"][0].asString(); - } - } else { - string quality_res = apiPost("/x/player/playurl?avid=" + aid + "&cid=" + cid + "&qn=" + quality + "&fnval=128&fourk=1"); - JsonValue temp; - if (reader.parse(quality_res, temp) && temp.isObject()) { - if (temp["code"].asInt() != 0) { - continue; - } - JsonValue quality_data = temp["data"]["durl"]; - if (quality_data.isArray()) { - qualityitem["url"] = quality_data[0]["url"].asString(); - if (quality_data[0]["backup_url"].isArray() && quality_data[0]["backup_url"].size() > 0) { - qualityitem2["url"] = quality_data[0]["backup_url"][0].asString(); - } - } - } - } - int itag = getVideoItag(quality); - qualityitem["quality"] = getVideoquality(quality); + int codecid = videos[i]["codecid"].asInt(); + url = videos[i]["baseUrl"].asString(); + qualityitem["url"] = url; + int itag = videos[i]["id"].asInt() *10 +codecid; + int trueitag = getTrueItag(itag); + qualityitem["quality"] = getVideoquality(quality) + getCodec(codecid) ; qualityitem["qualityDetail"] = qualityitem["quality"]; - qualityitem["itag"] = itag; + qualityitem["itag"] = trueitag; QualityList.insertLast(qualityitem); - - qualityitem2["quality"] = "- " + getVideoquality(quality) + " 备份"; - qualityitem2["qualityDetail"] = qualityitem2["quality"]; - qualityitem2["itag"] = itag + 20; - QualityList.insertLast(qualityitem2); } } - } - else if (data["dash"].isObject()) { - if (data["dash"]["video"].isArray()) { - url = data["dash"]["video"][0]["baseUrl"].asString(); + if (data["dash"]["flac"].isObject()){ + string flacquality; + flacquality = formatFloat(data["dash"]["flac"]["audio"]["bandwidth"].asInt() / 1000.0, "", 0, 1) + "K"; + dictionary flacqualityitem; + flacqualityitem["url"] = data["dash"]["flac"]["audio"]["baseUrl"].asString(); + flacqualityitem["quality"] = "FLAC" +flacquality; + flacqualityitem["qualityDetail"] = flacqualityitem["quality"]; + flacqualityitem["itag"] = 258; + QualityList.insertLast(flacqualityitem); + } + JsonValue audios = data["dash"]["audio"]; + if (enable_qualities && @QualityList !is null) { + for (uint i = 0; i < audios.size(); i++) { + string audioquality; + audioquality = formatFloat(audios[i]["bandwidth"].asInt() / 1000.0, "", 0, 1) + "K"; + dictionary audioqualityitem; + int audioid = audios[i]["id"].asInt(); + int audioitag = getAudioItag(audioid); + audioqualityitem["url"] = audios[i]["baseUrl"].asString(); + audioqualityitem["quality"] = "AAC " + audioquality ; + audioqualityitem["qualityDetail"] = audioqualityitem["quality"] ; + audioqualityitem["itag"] = audioitag; + QualityList.insertLast(audioqualityitem); + } } } - quality = data["quality"].asInt(); } else { return url; } @@ -1287,6 +1278,27 @@ int getVideoItag(int qn) { return qn; } +int getTrueItag(int itag) { + array itags = {1282,1283,1272,1273,1262,1263,1207,1212,1213,1167,1172,1173,1127,1132,1133,807,812,813,647,652,653,327,332,333,167,172,173,67,72,73 +}; + array tis = {102,571,101,702,266,701,138,272,401,299,303,699,264,271,400,137,248,399,136,247,398,135,244,397,134,243,396,133,242,395}; + int idx = itags.find(itag); + if (idx >= 0) { + return tis[idx]; + } + return itag; +} + +int getAudioItag(int id) { + array ids = {30280, 30232, 30216}; + array itags = {327, 256, 139}; + int idx = ids.find(id); + if (idx >= 0) { + return itags[idx]; + } + return id; +} + string getVideoquality(int qn) { array qns = {127, 126, 125, 120, 116, 112, 80, 74, 64, 32, 16, 6}; array qualities = {"8K 超高清", "杜比视界", "HDR 真彩色", "4K 超清", "1080P60 高帧率", "1080P+ 高码率", "1080P 高清", "720P60 高帧率", "720P 高清", "480P 清晰", "360P 流畅", "240P 极速"}; @@ -1297,6 +1309,16 @@ string getVideoquality(int qn) { return "未知"; } +string getCodec(int codecid) { + array codecids = {7, 12, 13}; + array codec = {" AVC", " HEVC", " AV1"}; + int idx = codecids.find(codecid); + if (idx >= 0) { + return codec[idx]; + } + return "未知"; +} + string Audio(const string &in path, dictionary &MetaData, array &QualityList) { string id = HostRegExpParse(path, "/audio/au([0-9]+)"); JsonReader Reader; @@ -1605,3 +1627,4 @@ string PlayitemParse(const string &in path, dictionary &MetaData, array Date: Thu, 25 May 2023 09:19:20 +0800 Subject: [PATCH 053/132] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E8=8E=B7=E5=8F=96up=E4=B8=BB=E6=89=80=E6=9C=89?= =?UTF-8?q?=E8=A7=86=E9=A2=91=E7=9A=84=E9=97=AE=E9=A2=98=20(#29)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 54 +++++++++++++++++--- 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 5ed1ea6..a9add42 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -45,6 +45,7 @@ void OnInitialize() { } string host = "https://api.bilibili.com"; +string mixin_key; string GetTitle() { return "Bilibili"; @@ -177,6 +178,40 @@ string apiPost(string api, string data="") { return post(host + api); } +string getMixinKey() { + JsonReader Reader; + JsonValue Root; + string key = ""; + string res = apiPost("/x/web-interface/nav"); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].isInt()) { + JsonValue wbi_img = Root["data"]["wbi_img"]; + string img_url = wbi_img["img_url"].asString(); + string sub_url = wbi_img["sub_url"].asString(); + array parts = img_url.split("/"); + string img_value = parts[parts.length() - 1].split(".")[0]; + parts = sub_url.split("/"); + string sub_value = parts[parts.length() - 1].split(".")[0]; + string ae = img_value + sub_value; + array oe = {46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, 36, 20, 34, 44, 52}; + for (int i = 0; i < oe.length(); i++) { + key += ae.substr(oe[i], 1); + } + } + } + if (key.empty()) { + return key; + } + return key.substr(0,32); +} + +string encWbi(string params) { + if (mixin_key.empty()) { + mixin_key = getMixinKey(); + } + return HostHashMD5(params + mixin_key); +} + uint gettid(string path) { array urls = { 'www.bilibili.com/v/anime/serial', 'www.bilibili.com/v/anime/finish', 'www.bilibili.com/v/anime/information', 'www.bilibili.com/v/anime/offical', 'www.bilibili.com/anime', 'www.bilibili.com/movie', 'www.bilibili.com/v/guochuang/chinese', 'www.bilibili.com/v/guochuang/original', 'www.bilibili.com/v/guochuang/puppetry', 'www.bilibili.com/v/guochuang/motioncomic', 'www.bilibili.com/v/guochuang/information', 'www.bilibili.com/guochuang', 'www.bilibili.com/tv', 'www.bilibili.com/documentary', 'www.bilibili.com/v/douga/mad', 'www.bilibili.com/v/douga/mmd', 'www.bilibili.com/v/douga/voice', 'www.bilibili.com/v/douga/garage_kit', 'www.bilibili.com/v/douga/tokusatsu', 'www.bilibili.com/v/douga/acgntalks', 'www.bilibili.com/v/douga/other', 'www.bilibili.com/v/douga', 'www.bilibili.com/v/game/stand_alone', 'www.bilibili.com/v/game/esports', 'www.bilibili.com/v/game/mobile', 'www.bilibili.com/v/game/online', 'www.bilibili.com/v/game/board', 'www.bilibili.com/v/game/gmv', 'www.bilibili.com/v/game/music', 'www.bilibili.com/v/game/mugen', 'www.bilibili.com/v/game', 'www.bilibili.com/v/kichiku/guide', 'www.bilibili.com/v/kichiku/mad', 'www.bilibili.com/v/kichiku/manual_vocaloid', 'www.bilibili.com/v/kichiku/theatre', 'www.bilibili.com/v/kichiku/course', 'www.bilibili.com/v/kichiku', 'www.bilibili.com/v/music/original', 'www.bilibili.com/v/music/cover', 'www.bilibili.com/v/music/perform', 'www.bilibili.com/v/music/vocaloid', 'www.bilibili.com/v/music/live', 'www.bilibili.com/v/music/mv', 'www.bilibili.com/v/music/commentary', 'www.bilibili.com/v/music/tutorial', 'www.bilibili.com/v/music/other', 'www.bilibili.com/v/music', 'www.bilibili.com/v/dance/otaku', 'www.bilibili.com/v/dance/hiphop', 'www.bilibili.com/v/dance/star', 'www.bilibili.com/v/dance/china', 'www.bilibili.com/v/dance/three_d', 'www.bilibili.com/v/dance/demo', 'www.bilibili.com/v/dance', 'www.bilibili.com/v/cinephile/cinecism', 'www.bilibili.com/v/cinephile/montage', 'www.bilibili.com/v/cinephile/shortfilm', 'www.bilibili.com/v/cinephile/trailer_info', 'www.bilibili.com/v/cinephile', 'www.bilibili.com/v/ent/variety', 'www.bilibili.com/v/ent/talker', 'www.bilibili.com/v/ent/fans', 'www.bilibili.com/v/ent/celebrity', 'www.bilibili.com/v/ent', 'www.bilibili.com/v/knowledge/science', 'www.bilibili.com/v/knowledge/social_science', 'www.bilibili.com/v/knowledge/humanity_history', 'www.bilibili.com/v/knowledge/business', 'www.bilibili.com/v/knowledge/campus', 'www.bilibili.com/v/knowledge/career', 'www.bilibili.com/v/knowledge/design', 'www.bilibili.com/v/knowledge/skill', 'www.bilibili.com/v/knowledge', 'www.bilibili.com/v/tech/digital', 'www.bilibili.com/v/tech/application', 'www.bilibili.com/v/tech/computer_tech', 'www.bilibili.com/v/tech/industry', 'www.bilibili.com/v/tech', 'www.bilibili.com/v/information/hotspot', 'www.bilibili.com/v/information/global', 'www.bilibili.com/v/information/social', 'www.bilibili.com/v/information/multiple', 'www.bilibili.com/v/information', 'www.bilibili.com/v/food/make', 'www.bilibili.com/v/food/detective', 'www.bilibili.com/v/food/measurement', 'www.bilibili.com/v/food/rural', 'www.bilibili.com/v/food/record', 'www.bilibili.com/v/food', 'www.bilibili.com/v/life/funny', 'www.bilibili.com/v/life/parenting', 'www.bilibili.com/v/life/travel', 'www.bilibili.com/v/life/rurallife', 'www.bilibili.com/v/life/home', 'www.bilibili.com/v/life/handmake', 'www.bilibili.com/v/life/painting', 'www.bilibili.com/v/life/daily', 'www.bilibili.com/v/life', 'www.bilibili.com/v/car/racing', 'www.bilibili.com/v/car/modifiedvehicle', 'www.bilibili.com/v/car/newenergyvehicle', 'www.bilibili.com/v/car/touringcar', 'www.bilibili.com/v/car/motorcycle', 'www.bilibili.com/v/car/strategy', 'www.bilibili.com/v/car/life', 'www.bilibili.com/v/car', 'www.bilibili.com/v/fashion/makeup', 'www.bilibili.com/v/fashion/cos', 'www.bilibili.com/v/fashion/clothing', 'www.bilibili.com/v/fashion/trend', 'www.bilibili.com/v/fashion', 'www.bilibili.com/v/sports/basketball', 'www.bilibili.com/v/sports/football', 'www.bilibili.com/v/sports/aerobics', 'www.bilibili.com/v/sports/athletic', 'www.bilibili.com/v/sports/culture', 'www.bilibili.com/v/sports/comprehensive', 'www.bilibili.com/v/sports', 'www.bilibili.com/v/animal/cat', 'www.bilibili.com/v/animal/dog', 'www.bilibili.com/v/animal/reptiles', 'www.bilibili.com/v/animal/wild_animal', 'www.bilibili.com/v/animal/second_edition', 'www.bilibili.com/v/animal/animal_composite', 'www.bilibili.com/v/animal', 'www.bilibili.com/v/life/funny', 'www.bilibili.com/v/game/stand_alone' }; array tids = { 33, 32, 51, 152, 13, 23, 153, 168, 169, 195, 170, 167, 11, 177, 24, 25, 47, 210, 86, 253, 27, 1, 17, 171, 172, 65, 173, 121, 136, 19, 4, 22, 26, 126, 216, 127, 119, 28, 31, 59, 30, 29, 193, 243, 244, 130, 3, 20, 198, 199, 200, 154, 156, 129, 182, 183, 85, 184, 181, 71, 241, 242, 137, 5, 201, 124, 228, 207, 208, 209, 229, 122, 36, 95, 230, 231, 232, 188, 203, 204, 205, 206, 202, 76, 212, 213, 214, 215, 211, 138, 254, 250, 251, 239, 161, 162, 21, 160, 245, 246, 246, 248, 240, 227, 176, 223, 157, 252, 158, 159, 155, 235, 249, 164, 236, 237, 238, 234, 218, 219, 222, 221, 220, 75, 217, 138, 17 }; @@ -650,13 +685,20 @@ array spaceVideo(string path) { int ps = 50; int pn = 1; string baseurl = "/x/space/wbi/arc/search?"; - baseurl += "mid=" + HostRegExpParse(path, "/([0-9]+)"); - baseurl += "&ps=" + ps; - baseurl += "&tid=" + parse(path, "tid", "0"); - baseurl += "&keyword=" + parse(path, "keyword"); - baseurl += "&order=" + parse(path, "order", "pubdate"); + string params1; + string params2; + params1 += "keyword=" + parse(path, "keyword"); + params1 += "&mid=" + HostRegExpParse(path, "/([0-9]+)"); + params1 += "&order=" + parse(path, "order", "pubdate"); + + params2 += "&ps=" + ps; + params2 += "&tid=" + parse(path, "tid", "0"); while (true) { - string url = baseurl + "&pn=" + pn; + string params = params1 + "&pn=" + pn + params2; + string w_rid = encWbi(params); + params += "&w_rid=" + w_rid; + + string url = baseurl + params; string res = apiPost(url); if (!res.empty()) { JsonReader Reader; From 88711a4b2608b9a45c21ad9d9633eb8dce957e16 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Sat, 3 Jun 2023 10:12:06 +0800 Subject: [PATCH 054/132] =?UTF-8?q?=E5=8F=82=E6=95=B0=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index a9add42..618374d 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -209,7 +209,16 @@ string encWbi(string params) { if (mixin_key.empty()) { mixin_key = getMixinKey(); } - return HostHashMD5(params + mixin_key); + array lst = params.split("&"); + lst.sortAsc(); + string newParams; + for (uint i = 0; i < lst.length(); i++) + { + newParams += lst[i]; + if (i != lst.length() - 1) + newParams += "&"; + } + return HostHashMD5(newParams + mixin_key); } uint gettid(string path) { From 37db4215aa002c85dac56bba43e326648bb2935f Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Sat, 3 Jun 2023 10:17:14 +0800 Subject: [PATCH 055/132] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=9F=90?= =?UTF-8?q?=E4=BA=9B=E7=95=AA=E5=89=A7=E5=8F=AA=E8=83=BD=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E7=AC=AC=E4=B8=80=E9=9B=86=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 618374d..98375ce 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -319,7 +319,7 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array Banggumi(string id, string type) { video["title"] = "【" + item["badge"].asString() + "】" + item["share_copy"].asString(); } video["duration"] = item["duration"].asInt(); - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true&cid=" + item["cid"].asString(); videos.insertLast(video); } } From f9f08cae8be775382aafe9497dbce4f93c860228 Mon Sep 17 00:00:00 2001 From: chen310 <33364396+chen310@users.noreply.github.com> Date: Mon, 17 Jul 2023 17:51:41 +0800 Subject: [PATCH 056/132] =?UTF-8?q?feat:=20=E5=9C=A8=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E4=B8=AD=E6=98=BE=E7=A4=BA=E8=A7=86=E9=A2=91=E7=BC=A9=E7=95=A5?= =?UTF-8?q?=E5=9B=BE=E5=8F=8A=E4=BD=9C=E8=80=85=20(#42)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 60 ++++++++++++++++--- README.md | 6 ++ public/thumbnail.png | Bin 0 -> 106565 bytes 3 files changed, 57 insertions(+), 9 deletions(-) create mode 100644 public/thumbnail.png diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 98375ce..aab8273 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -261,6 +261,8 @@ array VideoPages(string id) { video["title"] = item["part"].asString(); video["duration"] = item["duration"].asInt() * 1000; video["url"] = "https://www.bilibili.com/video/" + bvid + "?isfromlist=true&p=" + item["page"].asInt(); + video["thumbnail"] = item["first_frame"].asString(); + video["author"] = Root["data"]["owner"]["name"].asString(); videos.insertLast(video); } } @@ -286,6 +288,8 @@ array VideoPages(string id) { video["title"] = item["title"].asString(); video["duration"] = item["duration"].asInt() * 1000; video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + video["thumbnail"] = item["pic"].asString(); + video["author"] = item["owner"]["name"].asString(); videos.insertLast(video); } } @@ -345,6 +349,7 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array watchlater() { } video["duration"] = item["duration"].asInt() * 1000; video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?p=" + p + "&isfromlist=true"; + video["thumbnail"] = item["pic"].asString(); + video["author"] = item["owner"]["name"].asString(); videos.insertLast(video); } } @@ -570,11 +576,13 @@ array History() { if (type == "archive" || type == "live") { if (item.isObject()) { dictionary video; + video["thumbnail"] = item["cover"].asString(); + video["author"] = item["author_name"].asString(); if (type == "live") { if (item["live_status"].asInt() != 1) { continue; } - video["title"] = "直播 | " + item["author_name"].asString() + " - " + item["title"].asString(); + video["title"] = "直播 | " + item["title"].asString(); video["url"] = item["uri"].asString() + "?isfromlist=true"; } else if (type == "archive") { int p = item["history"]["page"].asInt(); @@ -670,6 +678,7 @@ array Channel(string path) { video["title"] = item["title"].asString(); video["duration"] = item["length"].asInt() * 1000; video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + video["thumbnail"] = item["pic"].asString(); videos.insertLast(video); } } @@ -731,6 +740,8 @@ array spaceVideo(string path) { video["title"] = item["title"].asString(); video["duration"] = parseTime(item["length"].asString()); video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + video["thumbnail"] = item["pic"].asString(); + video["author"] = item["author"].asString(); videos.insertLast(video); } } @@ -776,6 +787,7 @@ array spaceAudio(string path) { audio["title"] = item["title"].asString(); audio["duration"] = item["duration"].asInt() * 1000; audio["url"] = "https://www.bilibili.com/audio/au" + item["id"].asString() + "?isfromlist=true"; + audio["thumbnail"] = item["cover"].asString(); audios.insertLast(audio); } } @@ -865,6 +877,8 @@ array FavList(string path) { video["title"] = item["title"].asString(); video["duration"] = item["duration"].asInt() * 1000; video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + video["thumbnail"] = item["cover"].asString(); + video["author"] = item["upper"]["name"].asString(); videos.insertLast(video); } } @@ -902,8 +916,10 @@ array followingLive(uint page) { return videos; } dictionary video; - video["title"] = item["uname"].asString() + " - " + item["title"].asString(); + video["title"] = item["title"].asString(); video["url"] = "https://live.bilibili.com/" + item["roomid"].asInt() + "?isfromlist=true"; + video["thumbnail"] = item["face"].asString(); + video["author"] = item["uname"].asString(); videos.insertLast(video); } if (page < Root["data"]["totalPage"].asInt()) { @@ -938,6 +954,8 @@ array PopularHistory() { video["title"] = item["title"].asString(); video["duration"] = item["duration"].asInt() * 1000; video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + video["thumbnail"] = item["pic"].asString(); + video["author"] = item["owner"]["name"].asString(); videos.insertLast(video); } } @@ -981,6 +999,8 @@ array PopularWeekly(string path) { video["title"] = item["title"].asString(); video["duration"] = item["duration"].asInt() * 1000; video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + video["thumbnail"] = item["pic"].asString(); + video["author"] = item["owner"]["name"].asString(); videos.insertLast(video); } } @@ -1024,6 +1044,8 @@ array Ranking(string path) { video["title"] = item["title"].asString(); video["duration"] = item["duration"].asInt() * 1000; video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + video["thumbnail"] = item["pic"].asString(); + video["author"] = item["owner"]["name"].asString(); videos.insertLast(video); } } @@ -1051,6 +1073,8 @@ array Dynamic(uint tid) { video["title"] = item["title"].asString(); video["duration"] = item["duration"].asInt() * 1000; video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + video["thumbnail"] = item["pic"].asString(); + video["author"] = item["owner"]["name"].asString(); videos.insertLast(video); } } @@ -1104,6 +1128,7 @@ array Banggumi(string id, string type) { } video["duration"] = item["duration"].asInt(); video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true&cid=" + item["cid"].asString(); + video["thumbnail"] = item["cover"].asString(); videos.insertLast(video); } } @@ -1137,6 +1162,10 @@ array AudioList(string path) { audio["title"] = item["title"].asString(); audio["duration"] = item["duration"].asInt() * 1000; audio["url"] = "https://www.bilibili.com/audio/au" + item["statistic"]["sid"].asInt() + "?isfromlist=true"; + audio["thumbnail"] = item["cover"].asString(); + if (item["author"].isString()) { + audio["author"] = item["author"].asString(); + } audios.insertLast(audio); } } @@ -1195,9 +1224,11 @@ array Search(string path) { title.replace("", ''); title.replace("", ''); video["title"] = title; - video["content"] = item["author"].asString() + " | " + title; + video["content"] = title; video["duration"] = parseTime(item["duration"].asString()); video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + video["thumbnail"] = "https:" + item["pic"].asString(); + video["author"] = item["author"].asString(); videos.insertLast(video); } } @@ -1244,9 +1275,11 @@ array webDynamic(string path) { if (archive["bvid"].isString() && !archive["bvid"].asString().empty()) { string bvid = archive["bvid"].asString(); dictionary video; - video["title"] = "视频 | " + author + " - " + archive["title"].asString(); + video["title"] = "视频 | " + archive["title"].asString(); video["duration"] = parseTime(archive["duration_text"].asString()); video["url"] = "https://www.bilibili.com/video/" + bvid + "?isfromlist=true"; + video["thumbnail"] = archive["cover"].asString(); + video["author"] = author; videos.insertLast(video); } continue; @@ -1258,8 +1291,10 @@ array webDynamic(string path) { if (Reader.parse(content_str, content) && content.isObject()) { if (content["live_play_info"]["live_status"].asInt() == 1) { dictionary live; - live["title"] = "直播 | " + author + " - " + content["live_play_info"]["title"].asString(); + live["title"] = "直播 | " + content["live_play_info"]["title"].asString(); live["url"] = "https://live.bilibili.com/" + content["live_play_info"]["room_id"].asString() + "?isfromlist=true"; + live["thumbnail"] = content["live_play_info"]["cover"].asString(); + live["author"] = author; videos.insertLast(live); } } @@ -1298,8 +1333,10 @@ array Recommend(uint page) { continue; } dictionary video; + video["thumbnail"] = item["pic"].asString(); + video["author"] = item["owner"]["name"].asString(); if (item["uri"].asString().find("live.bilibili.com") >= 0) { - video["title"] = "直播 | " + item["owner"]["name"].asString() + " - " + item["title"].asString(); + video["title"] = "直播 | " + item["title"].asString(); video["url"] = item["uri"].asString() + "?isfromlist=true"; } else { video["title"] = item["title"].asString(); @@ -1392,7 +1429,11 @@ string Audio(const string &in path, dictionary &MetaData, array &Qua return ""; } JsonValue data = Root["data"]; - MetaData["title"] = data["uname"].asString() + " - " + data["title"].asString(); + MetaData["title"] = data["title"].asString(); + MetaData["thumbnail"] = data["cover"].asString(); + if (data["author"].isString()) { + MetaData["author"] = data["author"].asString(); + } } } status = 3; @@ -1433,6 +1474,7 @@ string Live(string id, const string &in path, dictionary &MetaData, arrayF6 打开播放列表,点击鼠标右键,点击`样式`,选择`显示缩略图`,即可显示视频的缩略图。 + +![Thumbnail](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/thumbnail.png) + ### 创建自动更新的播放列表 按 F6 打开播放列表,点击新建专辑,起一个合适的专辑名称,选择外部播放列表,并填写相应的链接,再点击确定即可。这样就得到一个可以自动更新的列表。 diff --git a/public/thumbnail.png b/public/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..425b32a0a268c28cc16b25674d6d555358eeceed GIT binary patch literal 106565 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 Date: Wed, 20 Sep 2023 10:49:28 +0800 Subject: [PATCH 057/132] update --- Media/PlayParse/MediaPlayParse - Bilibili.as | 140 +++++++++---------- Media/UrlList/MediaUrlList - Bilibili.as | 2 +- 2 files changed, 68 insertions(+), 74 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index aab8273..5581ac6 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -194,7 +194,7 @@ string getMixinKey() { string sub_value = parts[parts.length() - 1].split(".")[0]; string ae = img_value + sub_value; array oe = {46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, 36, 20, 34, 44, 52}; - for (int i = 0; i < oe.length(); i++) { + for (uint i = 0; i < oe.length(); i++) { key += ae.substr(oe[i], 1); } } @@ -254,13 +254,13 @@ array VideoPages(string id) { bvid = Root["data"]["bvid"].asString(); JsonValue data = Root["data"]["pages"]; if (data.isArray()) { - for (uint i = 0; i < data.size(); i++) { + for (int i = 0; i < data.size(); i++) { JsonValue item = data[i]; if (item.isObject()) { dictionary video; video["title"] = item["part"].asString(); video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + bvid + "?isfromlist=true&p=" + item["page"].asInt(); + video["url"] = "https://www.bilibili.com/video/" + bvid + "?p=" + item["page"].asInt(); video["thumbnail"] = item["first_frame"].asString(); video["author"] = Root["data"]["owner"]["name"].asString(); videos.insertLast(video); @@ -281,13 +281,13 @@ array VideoPages(string id) { if (Root["code"].asInt() == 0) { JsonValue data = Root["data"]; if (data.isArray()) { - for (uint i = 0; i < data.size(); i++) { + for (int i = 0; i < data.size(); i++) { JsonValue item = data[i]; if (item.isObject()) { dictionary video; video["title"] = item["title"].asString(); video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); video["thumbnail"] = item["pic"].asString(); video["author"] = item["owner"]["name"].asString(); videos.insertLast(video); @@ -322,7 +322,6 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array chapt; - for (uint i = 0; i < points.size(); i++) { + for (int i = 0; i < points.size(); i++) { JsonValue point = points[i]; dictionary item; item["title"] = point["content"].asString(); @@ -435,7 +434,7 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array 0) { array chapt; - for (uint i = 0; i < clip_info_list.size(); i++) { + for (int i = 0; i < clip_info_list.size(); i++) { JsonValue chapter = clip_info_list[i]; if (chapter.isObject()) { if (chapter["clipType"].asString() == "CLIP_TYPE_OP") { @@ -466,7 +465,7 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array watchlater() { if (Root["code"].asInt() == 0) { JsonValue data = Root["data"]["list"]; if (data.isArray()) { - for (uint i = 0; i < data.size(); i++) { + for (int i = 0; i < data.size(); i++) { JsonValue item = data[i]; if (item.isObject()) { dictionary video; @@ -544,7 +542,7 @@ array watchlater() { video["title"] = item["title"].asString() + " | " + item["page"]["part"].asString(); } video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?p=" + p + "&isfromlist=true"; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?p=" + p; video["thumbnail"] = item["pic"].asString(); video["author"] = item["owner"]["name"].asString(); videos.insertLast(video); @@ -569,7 +567,7 @@ array History() { if (Root["code"].asInt() == 0) { JsonValue data = Root["data"]["list"]; if (data.isArray()) { - for (uint i = 0; i < data.size(); i++) { + for (int i = 0; i < data.size(); i++) { JsonValue item = data[i]; string type = item["history"]["business"].asString(); // archive live pgc @@ -583,7 +581,7 @@ array History() { continue; } video["title"] = "直播 | " + item["title"].asString(); - video["url"] = item["uri"].asString() + "?isfromlist=true"; + video["url"] = item["uri"].asString(); } else if (type == "archive") { int p = item["history"]["page"].asInt(); if (p == 1) { @@ -592,7 +590,7 @@ array History() { video["title"] = item["title"].asString() + " | " + item["history"]["part"].asString(); } video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["history"]["bvid"].asString() + "?p=" + p + "&isfromlist=true"; + video["url"] = "https://www.bilibili.com/video/" + item["history"]["bvid"].asString() + "?p=" + p; } else { continue; } @@ -608,7 +606,7 @@ array History() { } string parse(string url, string key, string defaultValue="") { - string value = HostRegExpParse(url, "\?" + key + "=([^&]+)"); + string value = HostRegExpParse(url, "\\?" + key + "=([^&]+)"); if (!value.empty()) { return value; } @@ -671,13 +669,13 @@ array Channel(string path) { if (Root["code"].asInt() == 0) { JsonValue data = Root["data"]["archives"]; if (data.isArray()) { - for (uint i = 0; i < data.size(); i++) { + for (int i = 0; i < data.size(); i++) { JsonValue item = data[i]; if (item.isObject()) { dictionary video; video["title"] = item["title"].asString(); video["duration"] = item["length"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); video["thumbnail"] = item["pic"].asString(); videos.insertLast(video); } @@ -733,13 +731,13 @@ array spaceVideo(string path) { if (Root["code"].asInt() == 0) { JsonValue data = Root["data"]["list"]["vlist"]; if (data.isArray()) { - for (uint i = 0; i < data.size(); i++) { + for (int i = 0; i < data.size(); i++) { JsonValue item = data[i]; if (item.isObject()) { dictionary video; video["title"] = item["title"].asString(); video["duration"] = parseTime(item["length"].asString()); - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); video["thumbnail"] = item["pic"].asString(); video["author"] = item["author"].asString(); videos.insertLast(video); @@ -780,13 +778,13 @@ array spaceAudio(string path) { if (Root["code"].asInt() == 0) { JsonValue data = Root["data"]["data"]; if (data.isArray()) { - for (uint i = 0; i < data.size(); i++) { + for (int i = 0; i < data.size(); i++) { JsonValue item = data[i]; if (item.isObject()) { dictionary audio; audio["title"] = item["title"].asString(); audio["duration"] = item["duration"].asInt() * 1000; - audio["url"] = "https://www.bilibili.com/audio/au" + item["id"].asString() + "?isfromlist=true"; + audio["url"] = "https://www.bilibili.com/audio/au" + item["id"].asString(); audio["thumbnail"] = item["cover"].asString(); audios.insertLast(audio); } @@ -870,13 +868,13 @@ array FavList(string path) { if (Root["code"].asInt() == 0) { JsonValue data = Root["data"]["medias"]; if (data.isArray()) { - for (uint i = 0; i < data.size(); i++) { + for (int i = 0; i < data.size(); i++) { JsonValue item = data[i]; if (item.isObject()) { dictionary video; video["title"] = item["title"].asString(); video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); video["thumbnail"] = item["cover"].asString(); video["author"] = item["upper"]["name"].asString(); videos.insertLast(video); @@ -909,7 +907,7 @@ array followingLive(uint page) { if (Root["code"].asInt() == 0) { JsonValue list = Root["data"]["list"]; if (list.isArray()) { - for (uint i = 0; i < list.size(); i++) { + for (int i = 0; i < list.size(); i++) { JsonValue item = list[i]; // 未开播 if (item["live_status"].asInt() == 0) { @@ -917,12 +915,12 @@ array followingLive(uint page) { } dictionary video; video["title"] = item["title"].asString(); - video["url"] = "https://live.bilibili.com/" + item["roomid"].asInt() + "?isfromlist=true"; + video["url"] = "https://live.bilibili.com/" + item["roomid"].asInt(); video["thumbnail"] = item["face"].asString(); video["author"] = item["uname"].asString(); videos.insertLast(video); } - if (page < Root["data"]["totalPage"].asInt()) { + if (page < Root["data"]["totalPage"].asUInt()) { array videos2 = followingLive(page+1); for (uint i = 0; i < videos2.size(); i++) { videos.insertLast(videos2[i]); @@ -948,12 +946,12 @@ array PopularHistory() { } JsonValue list = Root["data"]["list"]; if (list.isArray()) { - for (uint i = 0; i < list.size(); i++) { + for (int i = 0; i < list.size(); i++) { JsonValue item = list[i]; dictionary video; video["title"] = item["title"].asString(); video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); video["thumbnail"] = item["pic"].asString(); video["author"] = item["owner"]["name"].asString(); videos.insertLast(video); @@ -993,12 +991,12 @@ array PopularWeekly(string path) { } JsonValue list = Root["data"]["list"]; if (list.isArray()) { - for (uint i = 0; i < list.size(); i++) { + for (int i = 0; i < list.size(); i++) { JsonValue item = list[i]; dictionary video; video["title"] = item["title"].asString(); video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); video["thumbnail"] = item["pic"].asString(); video["author"] = item["owner"]["name"].asString(); videos.insertLast(video); @@ -1038,12 +1036,12 @@ array Ranking(string path) { } JsonValue list = Root["data"]["list"]; if (list.isArray()) { - for (uint i = 0; i < list.size(); i++) { + for (int i = 0; i < list.size(); i++) { JsonValue item = list[i]; dictionary video; video["title"] = item["title"].asString(); video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); video["thumbnail"] = item["pic"].asString(); video["author"] = item["owner"]["name"].asString(); videos.insertLast(video); @@ -1067,12 +1065,12 @@ array Dynamic(uint tid) { } JsonValue list = Root["data"]["archives"]; if (list.isArray()) { - for (uint i = 0; i < list.size(); i++) { + for (int i = 0; i < list.size(); i++) { JsonValue item = list[i]; dictionary video; video["title"] = item["title"].asString(); video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); video["thumbnail"] = item["pic"].asString(); video["author"] = item["owner"]["name"].asString(); videos.insertLast(video); @@ -1118,7 +1116,7 @@ array Banggumi(string id, string type) { } JsonValue episodes = Root["result"]["episodes"]; if (episodes.isArray()) { - for (uint i = 0; i < episodes.size(); i++) { + for (int i = 0; i < episodes.size(); i++) { JsonValue item = episodes[i]; dictionary video; if (item["badge"].asString().empty()) { @@ -1127,7 +1125,7 @@ array Banggumi(string id, string type) { video["title"] = "【" + item["badge"].asString() + "】" + item["share_copy"].asString(); } video["duration"] = item["duration"].asInt(); - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true&cid=" + item["cid"].asString(); + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?cid=" + item["cid"].asString(); video["thumbnail"] = item["cover"].asString(); videos.insertLast(video); } @@ -1156,12 +1154,12 @@ array AudioList(string path) { } JsonValue data = Root["data"]["data"]; if (data.isArray()) { - for (uint i = 0; i < data.size(); i++) { + for (int i = 0; i < data.size(); i++) { JsonValue item = data[i]; dictionary audio; audio["title"] = item["title"].asString(); audio["duration"] = item["duration"].asInt() * 1000; - audio["url"] = "https://www.bilibili.com/audio/au" + item["statistic"]["sid"].asInt() + "?isfromlist=true"; + audio["url"] = "https://www.bilibili.com/audio/au" + item["statistic"]["sid"].asInt(); audio["thumbnail"] = item["cover"].asString(); if (item["author"].isString()) { audio["author"] = item["author"].asString(); @@ -1206,7 +1204,7 @@ array Search(string path) { } JsonValue list; if (type == "all") { - for (uint i = 0; i < Root["data"]["result"].size(); i++) { + for (int i = 0; i < Root["data"]["result"].size(); i++) { if (Root["data"]["result"][i]["result_type"].asString() == "video") { list = Root["data"]["result"][i]["data"]; break; @@ -1217,7 +1215,7 @@ array Search(string path) { } else { return videos; } - for (uint i = 0; i < list.size(); i++) { + for (int i = 0; i < list.size(); i++) { JsonValue item = list[i]; dictionary video; string title = item["title"].asString(); @@ -1226,7 +1224,7 @@ array Search(string path) { video["title"] = title; video["content"] = title; video["duration"] = parseTime(item["duration"].asString()); - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?isfromlist=true"; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); video["thumbnail"] = "https:" + item["pic"].asString(); video["author"] = item["author"].asString(); videos.insertLast(video); @@ -1262,7 +1260,7 @@ array webDynamic(string path) { JsonValue list = Root["data"]["items"]; if (list.isArray()) { offset = Root["data"]["offset"].asString(); - for (uint j = 0; j < list.size(); j++) { + for (int j = 0; j < list.size(); j++) { JsonValue dynamic = list[j]["modules"]["module_dynamic"]; if (dynamic.isObject()) { JsonValue major = dynamic["major"]; @@ -1277,7 +1275,7 @@ array webDynamic(string path) { dictionary video; video["title"] = "视频 | " + archive["title"].asString(); video["duration"] = parseTime(archive["duration_text"].asString()); - video["url"] = "https://www.bilibili.com/video/" + bvid + "?isfromlist=true"; + video["url"] = "https://www.bilibili.com/video/" + bvid; video["thumbnail"] = archive["cover"].asString(); video["author"] = author; videos.insertLast(video); @@ -1292,7 +1290,7 @@ array webDynamic(string path) { if (content["live_play_info"]["live_status"].asInt() == 1) { dictionary live; live["title"] = "直播 | " + content["live_play_info"]["title"].asString(); - live["url"] = "https://live.bilibili.com/" + content["live_play_info"]["room_id"].asString() + "?isfromlist=true"; + live["url"] = "https://live.bilibili.com/" + content["live_play_info"]["room_id"].asString(); live["thumbnail"] = content["live_play_info"]["cover"].asString(); live["author"] = author; videos.insertLast(live); @@ -1327,7 +1325,7 @@ array Recommend(uint page) { } JsonValue list = Root["data"]["item"]; if (list.isArray()) { - for (uint i = 0; i < list.size(); i++) { + for (int i = 0; i < list.size(); i++) { JsonValue item = list[i]; if (item["bvid"].asString().empty()) { continue; @@ -1337,11 +1335,11 @@ array Recommend(uint page) { video["author"] = item["owner"]["name"].asString(); if (item["uri"].asString().find("live.bilibili.com") >= 0) { video["title"] = "直播 | " + item["title"].asString(); - video["url"] = item["uri"].asString() + "?isfromlist=true"; + video["url"] = item["uri"].asString(); } else { video["title"] = item["title"].asString(); video["duration"] = item["duration"].asInt() * 1000; - video["url"] = item["uri"].asString() + "?isfromlist=true"; + video["url"] = item["uri"].asString(); } videos.insertLast(video); } @@ -1421,21 +1419,21 @@ string Audio(const string &in path, dictionary &MetaData, array &Qua JsonValue Root; string url; string res; - if (parse(path, "isfromlist") != "true") { - res = post("https://www.bilibili.com/audio/music-service-c/web/song/info?sid=" + id); - res = HostDecompress(res); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() != 0) { - return ""; - } - JsonValue data = Root["data"]; - MetaData["title"] = data["title"].asString(); - MetaData["thumbnail"] = data["cover"].asString(); - if (data["author"].isString()) { - MetaData["author"] = data["author"].asString(); - } + + res = post("https://www.bilibili.com/audio/music-service-c/web/song/info?sid=" + id); + res = HostDecompress(res); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return ""; + } + JsonValue data = Root["data"]; + MetaData["title"] = data["title"].asString(); + MetaData["thumbnail"] = data["cover"].asString(); + if (data["author"].isString()) { + MetaData["author"] = data["author"].asString(); } } + status = 3; res = post("https://www.bilibili.com/audio/music-service-c/web/url?privilege=2&quality=2&sid=" + id); res = HostDecompress(res); @@ -1464,9 +1462,8 @@ string Live(string id, const string &in path, dictionary &MetaData, array= 0 && path.find("isfromlist") >= 0) { + if (path.find("/video/BV") >= 0) { return true; } @@ -1557,9 +1554,6 @@ bool PlaylistCheck(const string &in path) { if (path.find("bilibili.com") < 0) { return false; } - if (path.find("isfromlist") >= 0) { - return false; - } if (!parseBVId(path).empty() || !parseAVId(path).empty()) { return true; } @@ -1712,7 +1706,7 @@ array PlaylistParse(const string &in path) { string PlayitemParse(const string &in path, dictionary &MetaData, array &QualityList) { log("Playitem path", path); status = 2; - if (path.find("/video/BV") >= 0 && path.find("isfromlist") >= 0) { + if (path.find("/video/BV") >= 0) { string bvid = parseBVId(path); return Video(bvid, path, MetaData, QualityList); } diff --git a/Media/UrlList/MediaUrlList - Bilibili.as b/Media/UrlList/MediaUrlList - Bilibili.as index 631bd0b..4537298 100644 --- a/Media/UrlList/MediaUrlList - Bilibili.as +++ b/Media/UrlList/MediaUrlList - Bilibili.as @@ -210,7 +210,7 @@ array PopularHistory() { } JsonValue list = Root["data"]["list"]; if (list.isArray()) { - for (uint i = 0; i < list.size(); i++) { + for (int i = 0; i < list.size(); i++) { dictionary week; week["title"] = list[i]["name"].asString() + " " + list[i]["subject"].asString(); week["url"] = "https://www.bilibili.com/v/popular/weekly?num=" + list[i]["number"].asInt(); From 5279d4b1c6b6d432e73d55b989dbc9f6c0657fae Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Thu, 19 Oct 2023 10:30:07 +0800 Subject: [PATCH 058/132] =?UTF-8?q?=E5=8F=AF=E8=8E=B7=E5=8F=96=E4=BC=9A?= =?UTF-8?q?=E5=91=98=E8=AF=95=E7=9C=8B=E7=89=87=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 5581ac6..b63db01 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -468,10 +468,10 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array Date: Fri, 20 Oct 2023 10:05:05 +0800 Subject: [PATCH 059/132] =?UTF-8?q?=E8=A7=82=E7=9C=8B=E8=AF=95=E7=9C=8B?= =?UTF-8?q?=E4=BC=9A=E5=91=98=E7=89=87=E6=AE=B5=E6=97=B6=EF=BC=8C=E4=B9=9F?= =?UTF-8?q?=E8=83=BD=E5=88=87=E6=8D=A2=E6=B8=85=E6=99=B0=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 65 ++++++++++++++++++-- 1 file changed, 60 insertions(+), 5 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index b63db01..a447d3d 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -473,7 +473,7 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array 0) { + qualityitem2["url"] = data["durl"][0]["backup_url"][0].asString(); + } else { + qualityitem2["url"] = url; + } + qualityitem2["quality"] = "- " + getVideoquality(qn) + getCodec(codecid) + " 备用"; + qualityitem2["qualityDetail"] = qualityitem2["quality"]; + qualityitem2["itag"] = 1; + QualityList.insertLast(qualityitem2); + } + } } } else { return url; @@ -1375,8 +1431,7 @@ int getVideoItag(int qn) { } int getTrueItag(int itag) { - array itags = {1282,1283,1272,1273,1262,1263,1207,1212,1213,1167,1172,1173,1127,1132,1133,807,812,813,647,652,653,327,332,333,167,172,173,67,72,73 -}; + array itags = {1282,1283,1272,1273,1262,1263,1207,1212,1213,1167,1172,1173,1127,1132,1133,807,812,813,647,652,653,327,332,333,167,172,173,67,72,73}; array tis = {102,571,101,702,266,701,138,272,401,299,303,699,264,271,400,137,248,399,136,247,398,135,244,397,134,243,396,133,242,395}; int idx = itags.find(itag); if (idx >= 0) { From f7dcdc57abeb0c4e5ad1550239b6235f038ba499 Mon Sep 17 00:00:00 2001 From: chen310 <33364396+chen310@users.noreply.github.com> Date: Mon, 25 Dec 2023 10:09:44 +0800 Subject: [PATCH 060/132] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6=EF=BC=8C=E5=8F=AF=E8=AE=BE=E7=BD=AE?= =?UTF-8?q?=E5=BC=B9=E5=B9=95=20(#65)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 179 ++++++++++++------- README.md | 4 +- public/login.png | Bin 50874 -> 44005 bytes 3 files changed, 121 insertions(+), 62 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index a447d3d..211a45a 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -22,26 +22,12 @@ // bool PlaylistCheck(const string &in) -> check playlist // array PlaylistParse(const string &in) -> parse playlist - -bool debug = false; -string cookie = ""; -int uid = 0; -bool enable_subtitle = true; -string subtitle_host = "https://subtitle.chen310.repl.co"; -string danmaku_url = subtitle_host + "/subtitle?font=" + HostUrlEncode("微软雅黑") + "&font_size=30.0&alpha=0.8&is_reduce_comments=false&cid="; -string subtitle_url = subtitle_host + "/subtitle?url="; -// 是否可选择画质 -bool enable_qualities = true; -// 视频推荐 -bool enable_related = true; +Config ConfigData; void OnInitialize() { HostSetUrlHeaderHTTP("bilivideo.com", "Referer: https://www.bilibili.com\r\n"); HostSetUrlHeaderHTTP("bilivideo.cn", "Referer: https://www.bilibili.com\r\n"); HostSetUrlHeaderHTTP("bilibili.com", "Referer: https://www.bilibili.com\r\n"); - if (debug) { - HostOpenConsole(); - } } string host = "https://api.bilibili.com"; @@ -61,27 +47,33 @@ string GetDesc() { string GetLoginTitle() { - return "请输入Bilibili Cookie"; + return "请输入配置文件所在位置"; } string GetLoginDesc() { - return "请输入Bilibili Cookie"; + return "请输入配置文件所在位置"; } string GetUserText() { - return "这里放空"; + return "配置文件路径"; } string GetPasswordText() { - return "Cookie:"; + return ""; } string ServerCheck(string User, string Pass) { - if (Pass.empty()) { - return "请输入Cookie"; + if (User.empty()) { + return "未填写配置文件路径"; + } + if (!isFileExists(User)) { + return "配置文件不存在"; + } + if (ConfigData.cookie.empty()) { + return "未填写cookie"; } string info = ""; JsonReader reader; @@ -104,12 +96,94 @@ string ServerCheck(string User, string Pass) { string ServerLogin(string User, string Pass) { - if (Pass.empty()) return "cookie 为空"; - handleCookie(Pass); - if (cookie.empty()) { - return "您输入的 cookie 不可用"; + if (User.empty()) { + return "路径不可为空"; + } + if (!isFileExists(User)) { + return "配置文件不存在"; + } + ConfigData = ReadConfigFile(User); + if (ConfigData.debug) { + HostOpenConsole(); + } + + return "配置文件读取成功,修改完配置文件后需要重启 PotPlayer 才能生效"; +} + +bool isFileExists(string path) { + return HostFileOpen(path) > 0; +} + +class Config { + string fullConfig; + string cookie; + int uid = 0; + bool danmakuEnable = true; + string danmakuServer; + string danmakuFont; + float danmakuFontSize = 30.0; + float danmakuOpacity = 0.8; + float danmakuDisplayArea = 0.8; + float danmakuStayTime = 15.0; + bool showRecommendedVideos = true; + bool debug = false; + + string danmakuUrl; + string subtitleUrl; +}; + +Config ReadConfigFile(string file) { + Config config; + config.fullConfig = HostFileRead(HostFileOpen(file), 10000); + JsonReader reader; + JsonValue root; + if (reader.parse(config.fullConfig, root) && root.isObject()) { + if (root["cookie"].isString() && !root["cookie"].asString().empty()) { + config.cookie = root["cookie"].asString(); + array cookies = config.cookie.split(";"); + for (uint i=0; i < cookies.length(); i++) { + if (cookies[i].find("DedeUserID=") >= 0) { + ConfigData.uid = parseInt(cookies[i].split("=")[1]); + break; + } + } + } + if (root["danmaku"].isObject()) { + JsonValue danmaku = root["danmaku"]; + if (danmaku["enable"].isBool()) { + config.danmakuEnable = danmaku["enable"].asBool(); + } + if (danmaku["server"].isString() && !danmaku["server"].asString().empty()) { + config.danmakuServer = danmaku["server"].asString(); + } + if (danmaku["font"].isString()) { + config.danmakuFont = danmaku["font"].asString(); + } + if (danmaku["fontSize"].isNumeric()) { + config.danmakuFontSize = danmaku["fontSize"].asFloat(); + } + if (danmaku["opacity"].isNumeric()) { + config.danmakuOpacity = danmaku["opacity"].asFloat(); + } + if (danmaku["displayArea"].isNumeric()) { + config.danmakuDisplayArea = danmaku["displayArea"].asFloat(); + } + if (danmaku["stayTime"].isNumeric()) { + config.danmakuStayTime = danmaku["stayTime"].asFloat(); + } + } + if (root["showRecommendedVideos"].isBool()) { + config.showRecommendedVideos = root["showRecommendedVideos"].asBool(); + } + if (root["debug"].isBool()) { + config.debug = root["debug"].asBool(); + } + if (!config.danmakuServer.empty()) { + config.danmakuUrl = config.danmakuServer + "/subtitle?font=" + HostUrlEncode(config.danmakuFont) + "&font_size=" + config.danmakuFontSize + "&alpha=" + config.danmakuOpacity + "&display_area=" + config.danmakuDisplayArea + "&duration_marquee=" + config.danmakuStayTime + "&duration_still=" + config.danmakuStayTime + "&cid="; + config.subtitleUrl = config.danmakuServer + "/subtitle?url="; + } } - return "cookie 设置成功"; + return config; } uint status = 0; @@ -135,22 +209,8 @@ string GetStatus() return info; } -void handleCookie(string full_cookie) { - array cookies = full_cookie.split(";"); - for (uint i=0; i < cookies.length(); i++) { - int pos = cookies[i].find("SESSDATA"); - if (pos >= 0) { - // cookie = cookies[i].substr(pos); - cookie = full_cookie; - } - if (cookies[i].find("DedeUserID=") >= 0) { - uid = parseInt(cookies[i].split("=")[1]); - } - } -} - void log(string item) { - if (!debug) { + if (!ConfigData.debug) { return; } HostPrintUTF8(item); @@ -167,8 +227,8 @@ void log(string item, int info) { string post(string url, string data="") { string UserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"; string Headers = "Referer: https://www.bilibili.com\r\n"; - if (!cookie.empty()) { - Headers += "Cookie: " + cookie + "\r\n"; + if (!ConfigData.cookie.empty()) { + Headers += "Cookie: " + ConfigData.cookie + "\r\n"; } log("request", url); return HostUrlGetStringWithAPI(url, UserAgent, Headers, data, true); @@ -270,7 +330,7 @@ array VideoPages(string id) { } } } - if (videos.length() >= 2 || !enable_related) { + if (videos.length() >= 2 || !ConfigData.showRecommendedVideos) { return videos; } res = apiPost("/x/web-interface/archive/related?bvid=" + bvid); @@ -361,10 +421,10 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array FavList(string path) { if (fid.empty()) { string mid = HostRegExpParse(path, "bilibili.com/([0-9]+)"); if (mid.empty()) { - mid = "" + uid; + mid = "" + ConfigData.uid; } string res = apiPost("/x/v3/fav/folder/created/list-all?up_mid=" + mid); if (res.empty()) { @@ -1542,7 +1601,7 @@ string Live(string id, const string &in path, dictionary &MetaData, arrayF5 打开选项,点击`扩展功能`下的`媒体播放列表/项目`,再点击 `Bilibili`,然后打开`账户设置`,在 `Cookie` 一栏粘贴你的 Bilibili Cookie。 +找到刚刚复制过去的配置文件 `Bilibili_Config.json`,填写 Cookie 等设置内容。 打开 PotPlayer,按 F5 打开选项,点击`扩展功能`下的`媒体播放列表/项目`,再点击 `Bilibili`,然后打开`账户设置`,填写配置文件路径,如 `D:\DAUM\PotPlayer\Extension\Media\PlayParse\Bilibili_Config.json`。每次修改完配置文件,可能都要重启 PotPlayer 才能生效。 ![Login](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/login.png) diff --git a/public/login.png b/public/login.png index 6a96236162b3425c7ec30f16efb3d4066104da8b..4a090480168ea27dbea20bbcb6a469b19062580a 100644 GIT binary patch literal 44005 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

FhYcA>A)?Q6I4OuNsz7lMN7>)g)awJ%cm^%_| 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%0D0(?MorzvzbL}uZq`n*$C#VC;s->4w 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 From 7e5fbb22431827f0b67bfe878cd695592580f168 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Mon, 25 Dec 2023 10:15:38 +0800 Subject: [PATCH 061/132] update --- README.md | 2 +- public/{login.png => settings.png} | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename public/{login.png => settings.png} (100%) diff --git a/README.md b/README.md index 4cdcc5d..73051c1 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ 找到刚刚复制过去的配置文件 `Bilibili_Config.json`,填写 Cookie 等设置内容。 打开 PotPlayer,按 F5 打开选项,点击`扩展功能`下的`媒体播放列表/项目`,再点击 `Bilibili`,然后打开`账户设置`,填写配置文件路径,如 `D:\DAUM\PotPlayer\Extension\Media\PlayParse\Bilibili_Config.json`。每次修改完配置文件,可能都要重启 PotPlayer 才能生效。 -![Login](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/login.png) +![Settings](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/settings.png) 点击测试按钮,如果弹出账号信息,就说明登录成功。 diff --git a/public/login.png b/public/settings.png similarity index 100% rename from public/login.png rename to public/settings.png From 6ee3a04248d3322cf79c69920f8e70f2e59dacce Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Mon, 25 Dec 2023 10:38:29 +0800 Subject: [PATCH 062/132] update --- README.md | 23 +---------------------- 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/README.md b/README.md index 73051c1..9a5f224 100644 --- a/README.md +++ b/README.md @@ -28,28 +28,7 @@ ### Cookies 获取 -参阅:B 站 Cookie 获取教程 - -- 打开你所用浏览器的**无痕模式** - **如果还是抓不到就把无痕模式关了再试试!** -- 第二步: - - 在**无痕窗口**进入任意一个直播间 - - 在直播间页面点击右上角登录自己的 B 站账号 -- 第三步: - - - 点击键盘`F12`或者`鼠标右键`->检查,进入开发者工具 - - 点击`网络`/`NetWork`选项卡 - - ![网络/Network](http://i0.hdslb.com/bfs/album/4717448339d26a412ba23215d3ce674c549adf4f.png) - - - 进入该选项卡后,键盘`F5`或浏览器左上角刷新页面 - - 在数据包中找到 **heartBeat** 或 **webHeartBeat**,点击找到请求头中的 **cookie** 项,并复制保留(图中浅蓝色部分)填写到插件账号设置的 Cookie 一栏中 - - ![cookie](http://i0.hdslb.com/bfs/album/01c052ec17757a34f6a256f03523efa89c3e4d56.jpg) - -PS:有了 cookie 能操作 B 站账号的大部分功能,切勿泄露或分享出去 - -**如果后续出现报错,请关闭无痕模式抓 cookie** +[获取Cookie](https://github.com/chen310/BilibiliPotPlayer/issues/62#issuecomment-1841909583) ## 使用方法 From 3c4480f7a276c90957f7c7ab71c52063a1b5e532 Mon Sep 17 00:00:00 2001 From: chen310 <33364396+chen310@users.noreply.github.com> Date: Wed, 10 Jan 2024 20:30:05 +0800 Subject: [PATCH 063/132] =?UTF-8?q?=E9=99=90=E5=88=B6=E4=B8=BB=E9=A1=B5?= =?UTF-8?q?=E8=A7=86=E9=A2=91=E8=8E=B7=E5=8F=96=E6=95=B0=E9=87=8F=EF=BC=8C?= =?UTF-8?q?=E9=81=BF=E5=85=8D=E8=B6=85=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 211a45a..e4ab132 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -824,7 +824,8 @@ array Channel(string path) { array spaceVideo(string path) { array videos; int ps = 50; - int pn = 1; + int page = parseInt(parse(path, "pn", "1")); + int pn = page; string baseurl = "/x/space/wbi/arc/search?"; string params1; string params2; @@ -835,6 +836,9 @@ array spaceVideo(string path) { params2 += "&ps=" + ps; params2 += "&tid=" + parse(path, "tid", "0"); while (true) { + if (pn - page >= 10) { + break; + } string params = params1 + "&pn=" + pn + params2; string w_rid = encWbi(params); params += "&w_rid=" + w_rid; From 45b6a10621d124e9de8803040fdd14b334df45a8 Mon Sep 17 00:00:00 2001 From: aliofwind <35068322+aliofwind@users.noreply.github.com> Date: Sun, 28 Jul 2024 18:45:58 +0800 Subject: [PATCH 064/132] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=B6=85=E9=95=BFaid?= =?UTF-8?q?=E8=A7=86=E9=A2=91=E6=97=A0=E6=B3=95=E6=92=AD=E6=94=BE=20(#102)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index e4ab132..f1e6f49 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -376,7 +376,7 @@ string makeWebUrl(string path) { string Video(string bvid, const string &in path, dictionary &MetaData, array &QualityList) { log("--------------------------------------------------"); string res; - int aid; + string aid; string title; string url; JsonReader reader; @@ -394,7 +394,7 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array Date: Sun, 28 Jul 2024 20:48:24 +0800 Subject: [PATCH 065/132] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E6=9D=9C=E6=AF=94=E5=85=A8=E6=99=AF=E5=A3=B0=E9=9F=B3=E6=95=88?= =?UTF-8?q?=20(#90)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index f1e6f49..9f15dc1 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -539,6 +539,16 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array Date: Tue, 13 Aug 2024 09:38:32 +0800 Subject: [PATCH 066/132] =?UTF-8?q?feat:=E6=A0=B9=E6=8D=AE=E7=9B=B4?= =?UTF-8?q?=E6=92=ADurl=E7=9A=84area=5Fid=E5=B1=9E=E6=80=A7=E8=8E=B7?= =?UTF-8?q?=E5=8F=96=E7=9B=B4=E6=92=AD=E5=88=97=E8=A1=A8=20(#109)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 根据直播url的area_id属性获取直播列表 * feat:📺获取直播分类列表 --------- Co-authored-by: la02 --- Media/PlayParse/MediaPlayParse - Bilibili.as | 48 ++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 9f15dc1..203a5d5 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -1063,6 +1063,40 @@ array followingLive(uint page) { return videos; } +array liveCategory(uint page,string cateid,string parentAreaId) { + array videos; + JsonReader Reader; + JsonValue Root; + string url = "https://api.live.bilibili.com/xlive/web-interface/v1/second/getList?platform=web&parent_area_id="+parentAreaId+"&area_id="+cateid+"&page=" + page; + string res = post(url); + if (res.empty()) { + return videos; + } + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue list = Root["data"]["list"]; + if (list.isArray()) { + for (int i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + dictionary video; + video["title"] = item["title"].asString(); + video["url"] = "https://live.bilibili.com/" + item["roomid"].asInt(); + video["thumbnail"] = item["face"].asString(); + video["author"] = item["uname"].asString(); + videos.insertLast(video); + } + if (page < 2) { + array videos2 = liveCategory(page+1,cateid,parentAreaId); + for (uint i = 0; i < videos2.size(); i++) { + videos.insertLast(videos2[i]); + } + } + } + } + } + return videos; +} + array PopularHistory() { array videos; JsonReader Reader; @@ -1722,6 +1756,9 @@ bool PlaylistCheck(const string &in path) { if (path.find("link.bilibili.com") >= 0 && path.find("/user-center/follow") >= 0) { return true; } + if(path.find("live.bilibili.com") >= 0){ + return true; + } if (path.find("www.bilibili.com") >= 0 && HostRegExpParse(path, "www.bilibili.com/([a-zA-Z0-9]+)").empty()) { return true; } @@ -1798,6 +1835,17 @@ array PlaylistParse(const string &in path) { if (path.find("link.bilibili.com") >= 0 && path.find("/user-center/follow") >= 0) { return followingLive(1); } + if(path.find("live.bilibili.com") >= 0) { + if(path.find("areaId") >= 0){ + return liveCategory(1,HostRegExpParse(path, "areaId=([0-9]+)"),"2"); + } + if(path.find("lol") >= 0){ + return liveCategory(1,"86","2"); + } + if(path.find("hpjy") >= 0){ + return liveCategory(1,"256","3"); + } + } if (path.find("www.bilibili.com") >= 0 && HostRegExpParse(path, "www.bilibili.com/([a-zA-Z0-9]+)").empty()) { return Recommend(1); } From b372252406996491a6400e28f14c051831660141 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Tue, 13 Aug 2024 10:12:58 +0800 Subject: [PATCH 067/132] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=A4=9A?= =?UTF-8?q?=E6=AC=A1=E5=BE=AA=E7=8E=AF=E8=8E=B7=E5=8F=96=E5=90=88=E9=9B=86?= =?UTF-8?q?=E8=A7=86=E9=A2=91=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 203a5d5..5eb7f90 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -980,7 +980,7 @@ array FavList(string path) { string ftype = parse(path, "ftype"); // 订阅和收藏 if (ftype == "collect") { - baseurl = "/x/space/fav/season/list?season_id=" + fid + "&ps=" + ps; + baseurl = "/x/space/fav/season/list?season_id=" + fid; } else { baseurl = "/x/v3/fav/resource/list?media_id=" + fid + "&ps=" + ps; baseurl += "&keyword=" + parse(path, "keyword"); @@ -989,7 +989,11 @@ array FavList(string path) { baseurl += "&tid=" + parse(path, "tid", "0"); } while (true) { - url = baseurl + "&pn=" + pn; + if (ftype == "collect") { + url = baseurl; + } else { + url = baseurl + "&pn=" + pn; + } string res = apiPost(url); if (res.empty()) { return videos; @@ -1012,6 +1016,9 @@ array FavList(string path) { } } } + if (ftype == "collect") { + return videos; + } int count = Root["data"]["info"]["media_count"].asInt(); if (pn * ps >= count) { break; From 3be9089b88090da8eb96fe55b9a9f84bccf37202 Mon Sep 17 00:00:00 2001 From: La02 <59063603+huajiba@users.noreply.github.com> Date: Tue, 13 Aug 2024 17:51:50 +0800 Subject: [PATCH 068/132] =?UTF-8?q?fix:=E4=BF=AE=E5=A4=8D=E7=88=B6?= =?UTF-8?q?=E5=8C=BA=E5=9F=9Fid=E4=B8=8D=E5=8C=B9=E9=85=8D=E5=92=8C?= =?UTF-8?q?=E8=B5=B7=E5=A7=8B=E9=A1=B5=E6=95=B0=E9=97=AE=E9=A2=98=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E8=AE=BE=E7=BD=AE=E7=9B=B4=E6=92=AD=E9=97=B4=E6=9C=80?= =?UTF-8?q?=E5=A4=A7=E6=95=B0=E9=87=8F=20(#111)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: la02 --- Media/PlayParse/MediaPlayParse - Bilibili.as | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 5eb7f90..ca26043 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -1092,7 +1092,7 @@ array liveCategory(uint page,string cateid,string parentAreaId) { video["author"] = item["uname"].asString(); videos.insertLast(video); } - if (page < 2) { + if ((page - 1) * list.size() < 200) { array videos2 = liveCategory(page+1,cateid,parentAreaId); for (uint i = 0; i < videos2.size(); i++) { videos.insertLast(videos2[i]); @@ -1844,13 +1844,13 @@ array PlaylistParse(const string &in path) { } if(path.find("live.bilibili.com") >= 0) { if(path.find("areaId") >= 0){ - return liveCategory(1,HostRegExpParse(path, "areaId=([0-9]+)"),"2"); + return liveCategory(2,HostRegExpParse(path, "areaId=([0-9]+)"), HostRegExpParse(path, "parentAreaId=([0-9]+)")); } if(path.find("lol") >= 0){ - return liveCategory(1,"86","2"); + return liveCategory(2,"86","2"); } if(path.find("hpjy") >= 0){ - return liveCategory(1,"256","3"); + return liveCategory(2,"256","3"); } } if (path.find("www.bilibili.com") >= 0 && HostRegExpParse(path, "www.bilibili.com/([a-zA-Z0-9]+)").empty()) { From f083e343e1e9bc63f8211d1b7c2988772739da05 Mon Sep 17 00:00:00 2001 From: undefined Date: Fri, 31 Jan 2025 06:53:53 +0000 Subject: [PATCH 069/132] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20AI=20=E5=AD=97?= =?UTF-8?q?=E5=B9=95=20Endpoint=20(#139)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index ca26043..bf24753 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -432,7 +432,7 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array videos2 = liveCategory(page+1,cateid,parentAreaId); for (uint i = 0; i < videos2.size(); i++) { videos.insertLast(videos2[i]); From 3897bd2be7516cf51478bb6a912cfd44426b1fd1 Mon Sep 17 00:00:00 2001 From: Nyamuchi <59063603+nyamuch1@users.noreply.github.com> Date: Fri, 28 Feb 2025 17:50:38 +0800 Subject: [PATCH 071/132] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E7=9B=B4?= =?UTF-8?q?=E6=92=AD=E9=97=B4=E6=9C=80=E5=A4=A7=E6=95=B0=E9=87=8F=E9=99=90?= =?UTF-8?q?=E5=88=B6=E9=85=8D=E7=BD=AE=E5=8F=8A=E4=BF=AE=E5=A4=8Dhas=5Fmor?= =?UTF-8?q?e=E8=B7=AF=E5=BE=84=20(#144)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 添加直播间最大数量限制配置及相应逻辑处理 修复has_more路径判断,添加最大直播间数量配置 * style: 格式化 Bilibili_Config.json 和 MediaPlayParse - Bilibili.as 文件 --- Media/PlayParse/MediaPlayParse - Bilibili.as | 36 ++++++++++++++------ 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 7157ccc..e436608 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -130,6 +130,8 @@ class Config { string danmakuUrl; string subtitleUrl; + + int maxliveroom; }; Config ReadConfigFile(string file) { @@ -148,6 +150,9 @@ Config ReadConfigFile(string file) { } } } + if (root["maxliveroom"].isNumeric()) { + config.maxliveroom = root["maxliveroom"].asInt(); + } if (root["danmaku"].isObject()) { JsonValue danmaku = root["danmaku"]; if (danmaku["enable"].isBool()) { @@ -559,15 +564,15 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array followingLive(uint page) { return videos; } -array liveCategory(uint page,string cateid,string parentAreaId) { +array liveCategory(uint page, string cateid, string parentAreaId) { array videos; JsonReader Reader; JsonValue Root; - string url = "https://api.live.bilibili.com/xlive/web-interface/v1/second/getList?platform=web&parent_area_id="+parentAreaId+"&area_id="+cateid+"&page=" + page; + string url = "https://api.live.bilibili.com/xlive/web-interface/v1/second/getList?platform=web&parent_area_id=" + parentAreaId + "&area_id=" + cateid + "&page=" + page; string res = post(url); if (res.empty()) { return videos; @@ -1091,14 +1096,23 @@ array liveCategory(uint page,string cateid,string parentAreaId) { video["thumbnail"] = item["face"].asString(); video["author"] = item["uname"].asString(); videos.insertLast(video); + if (videos.size() >= ConfigData.maxliveroom ) { + return videos; + } } - if ((page - 1) * list.size() < 200 && Root["has_more"].asBool()) { - array videos2 = liveCategory(page+1,cateid,parentAreaId); - for (uint i = 0; i < videos2.size(); i++) { - videos.insertLast(videos2[i]); + if (Root["data"]["has_more"].asBool()) { + array nextVideos = liveCategory(page + 1, cateid, parentAreaId); + for (uint i = 0; i < nextVideos.size(); i++) { + videos.insertLast(nextVideos[i]); + if (videos.size() >= ConfigData.maxliveroom) { + break; + } + } + if (videos.size() >= ConfigData.maxliveroom ) { + return videos; } } - } + } } } return videos; From ce98275756936b815cac554dedd35b29ca479e24 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Sun, 2 Mar 2025 18:50:50 +0800 Subject: [PATCH 072/132] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20liveCategor?= =?UTF-8?q?y=20=E5=87=BD=E6=95=B0=E4=B8=AD=20maxliveroom=20=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E9=80=BB=E8=BE=91=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 23 ++++++++------------ 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index e436608..b1f8fb6 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -131,7 +131,7 @@ class Config { string danmakuUrl; string subtitleUrl; - int maxliveroom; + int maxliveroom = 200; }; Config ReadConfigFile(string file) { @@ -1075,7 +1075,7 @@ array followingLive(uint page) { return videos; } -array liveCategory(uint page, string cateid, string parentAreaId) { +array liveCategory(uint page, string cateid, string parentAreaId, uint liveRoomCount) { array videos; JsonReader Reader; JsonValue Root; @@ -1096,23 +1096,18 @@ array liveCategory(uint page, string cateid, string parentAreaId) { video["thumbnail"] = item["face"].asString(); video["author"] = item["uname"].asString(); videos.insertLast(video); - if (videos.size() >= ConfigData.maxliveroom ) { + liveRoomCount += 1; + if (liveRoomCount >= ConfigData.maxliveroom ) { return videos; } } if (Root["data"]["has_more"].asBool()) { - array nextVideos = liveCategory(page + 1, cateid, parentAreaId); + array nextVideos = liveCategory(page + 1, cateid, parentAreaId, liveRoomCount); for (uint i = 0; i < nextVideos.size(); i++) { videos.insertLast(nextVideos[i]); - if (videos.size() >= ConfigData.maxliveroom) { - break; - } - } - if (videos.size() >= ConfigData.maxliveroom ) { - return videos; } } - } + } } } return videos; @@ -1858,13 +1853,13 @@ array PlaylistParse(const string &in path) { } if(path.find("live.bilibili.com") >= 0) { if(path.find("areaId") >= 0){ - return liveCategory(2,HostRegExpParse(path, "areaId=([0-9]+)"), HostRegExpParse(path, "parentAreaId=([0-9]+)")); + return liveCategory(1,HostRegExpParse(path, "areaId=([0-9]+)"), HostRegExpParse(path, "parentAreaId=([0-9]+)"), 0); } if(path.find("lol") >= 0){ - return liveCategory(2,"86","2"); + return liveCategory(1,"86","2", 0); } if(path.find("hpjy") >= 0){ - return liveCategory(2,"256","3"); + return liveCategory(1,"256","3", 0); } } if (path.find("www.bilibili.com") >= 0 && HostRegExpParse(path, "www.bilibili.com/([a-zA-Z0-9]+)").empty()) { From acb6e786989a1f0b744c407225b7ffc4119efdb4 Mon Sep 17 00:00:00 2001 From: chen_10 <1803012703@qq.com> Date: Sun, 2 Mar 2025 20:41:22 +0800 Subject: [PATCH 073/132] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=97=A0?= =?UTF-8?q?=E6=B3=95=E6=92=AD=E6=94=BE=E8=A7=86=E9=A2=91=E5=90=88=E9=9B=86?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index b1f8fb6..f1c624a 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -777,12 +777,16 @@ array Channel(string path) { array videos; int ps = 100; int pn = 1; - string uid = HostRegExpParse(path, "/([0-9]+)"); - string sid = parse(path, "sid"); + string uid = HostRegExpParse(path, "/([0-9]+)/lists"); + string sid = HostRegExpParse(path, "lists/([0-9]+)"); + if (sid.empty()) { + return videos; + } string baseurl; - bool isCollection = path.find("collectiondetail") >= 0; + string type = parse(path, "type", "season"); + bool isCollection = type == "season"; if (isCollection) { - baseurl = "/x/polymer/space/seasons_archives_list?mid=" + uid + "&season_id=" + sid + "&sort_reverse=" + parse(path, "sort_reverse", "false") + "&page_size=" + ps; + baseurl = "/x/polymer/web-space/seasons_archives_list?mid=" + uid + "&season_id=" + sid + "&sort_reverse=" + parse(path, "sort_reverse", "false") + "&page_size=" + ps; } else { baseurl = "/x/series/archives?mid=" + uid + "&series_id=" + sid + "&sort=desc" + "&ps=" + ps; } @@ -806,7 +810,7 @@ array Channel(string path) { if (item.isObject()) { dictionary video; video["title"] = item["title"].asString(); - video["duration"] = item["length"].asInt() * 1000; + video["duration"] = item["duration"].asInt() * 1000; video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); video["thumbnail"] = item["pic"].asString(); videos.insertLast(video); @@ -1756,7 +1760,7 @@ bool PlaylistCheck(const string &in path) { else if (path.find("/favlist") >= 0) { return true; } - else if (path.find("/channel/collectiondetail") >= 0 || path.find("/channel/seriesdetail") >= 0) { + else if (path.find("lists") >= 0) { return true; } else if (HostRegExpParse(path, "/([0-9]+)/[a-zA-Z0-9]").empty()) { @@ -1838,7 +1842,7 @@ array PlaylistParse(const string &in path) { else if (path.find("/favlist") >= 0) { return FavList(path); } - else if (path.find("/channel/collectiondetail") >= 0 || path.find("/channel/seriesdetail") >= 0) { + else if (path.find("lists") >= 0) { return Channel(path); } else if (HostRegExpParse(path, "/([0-9]+)/[a-zA-Z0-9]").empty()) { From 487a3455b956498ee875c2eda4a2f91d347b45f5 Mon Sep 17 00:00:00 2001 From: Nyamuchi <59063603+nyamuch1@users.noreply.github.com> Date: Thu, 22 May 2025 23:43:14 +0800 Subject: [PATCH 074/132] =?UTF-8?q?fix:=E4=B8=BA=E7=9B=B4=E6=92=AD?= =?UTF-8?q?=E5=88=86=E7=B1=BB=E5=88=97=E8=A1=A8=E8=8E=B7=E5=8F=96=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0w=5Frid=E9=89=B4=E6=9D=83=20(#155)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index f1c624a..ab0ac53 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -1083,7 +1083,9 @@ array liveCategory(uint page, string cateid, string parentAreaId, ui array videos; JsonReader Reader; JsonValue Root; - string url = "https://api.live.bilibili.com/xlive/web-interface/v1/second/getList?platform=web&parent_area_id=" + parentAreaId + "&area_id=" + cateid + "&page=" + page; + string params = "platform=web&parent_area_id=" + parentAreaId + "&area_id=" + cateid + "&page=" + page; + string w_rid = encWbi(params); + string url = "https://api.live.bilibili.com/xlive/web-interface/v1/second/getList?" + params + "&w_rid=" + w_rid; string res = post(url); if (res.empty()) { return videos; From b9eb15b5c589d3f20ea5d518509c257b49a779f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Wed, 12 Aug 2026 21:34:04 +0800 Subject: [PATCH 075/132] =?UTF-8?q?=E7=9B=B4=E6=92=AD=EF=BC=9A=E6=96=B0?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E9=80=82=E5=BA=94=E6=80=A7=E6=94=AF=E6=8C=81?= =?UTF-8?q?=EF=BC=8C=E6=94=AF=E6=8C=81AVC,HEVC,AV1=E7=BC=96=E7=A0=81?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F=EF=BC=8C=E9=BB=98=E8=AE=A4=E9=AB=98=E5=B8=A7?= =?UTF-8?q?=E7=8E=87=E3=80=82=E5=9B=A0=E4=B8=BAB=E7=AB=99av1=E5=8F=AA?= =?UTF-8?q?=E5=9C=A8fmp4=E4=B8=AD=E6=8F=90=E4=BE=9B=EF=BC=8C=E4=BC=98?= =?UTF-8?q?=E5=85=88=E4=BD=BF=E7=94=A8fmp4=E3=80=82=E5=B0=8F=E4=B8=BB?= =?UTF-8?q?=E6=92=AD=E4=B8=8D=E6=8F=90=E4=BE=9Bfmp4=EF=BC=8C=E5=9B=9E?= =?UTF-8?q?=E9=80=80=E8=87=B3ts=EF=BC=8C=E6=94=AF=E6=8C=81=E7=9B=B4?= =?UTF-8?q?=E6=92=AD=E5=A4=87=E4=BB=BD=E5=9C=B0=E5=9D=80=EF=BC=8C=E7=9B=AE?= =?UTF-8?q?=E5=89=8D=E7=9A=84=E5=B0=8F=E9=97=AE=E9=A2=98=EF=BC=8C=E7=94=BB?= =?UTF-8?q?=E8=B4=A8=E9=80=89=E9=A1=B9=E4=B8=AD=E4=BC=9A=E5=87=BA=E7=8E=B0?= =?UTF-8?q?HLS=E7=9B=B8=E5=85=B3=E9=80=89=E9=A1=B9=EF=BC=8C=E8=B2=8C?= =?UTF-8?q?=E4=BC=BC=E6=98=AFpotplayer=E7=89=B9=E6=80=A7=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 178 +++++++++++++++---- 1 file changed, 139 insertions(+), 39 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index ab0ac53..c0bf95e 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -1599,6 +1599,18 @@ string getCodec(int codecid) { return "未知"; } +string getLiveQuality(int qn) { + if (qn == 30000) return "杜比"; + if (qn == 20000) return "4K超高清"; + if (qn == 15000) return "2K(原画)"; + if (qn == 10000) return "1080p(原画)"; + if (qn == 400) return "1080p(蓝光)"; + if (qn == 250) return "720p(超清)"; + if (qn == 150) return "480p(高清)"; + if (qn == 80) return "360p(流畅)"; + return ""; +} + string Audio(const string &in path, dictionary &MetaData, array &QualityList) { string id = HostRegExpParse(path, "/audio/au([0-9]+)"); JsonReader Reader; @@ -1638,7 +1650,6 @@ string Audio(const string &in path, dictionary &MetaData, array &Qua string Live(string id, const string &in path, dictionary &MetaData, array &QualityList) { string url = ""; int room_id = 0; - int qn = 10000; string res = post("https://api.live.bilibili.com/xlive/web-room/v1/index/getInfoByRoom?room_id=" + id); JsonReader Reader; JsonValue Root; @@ -1661,57 +1672,146 @@ string Live(string id, const string &in path, dictionary &MetaData, array 1) { - qualityitem2["url"] = data[1]["url"].asString(); - } - } else { - string quality_res = post("https://api.live.bilibili.com/xlive/web-room/v1/playUrl/playUrl?cid=" + room_id + "&platform=web&qn=" + quality + "&https_url_req=1&ptype=16"); - JsonValue temp; - if (Reader.parse(quality_res, temp) && temp.isObject()) { - if (temp["code"].asInt() != 0) { - continue; + + JsonValue playurl = Root["data"]["playurl_info"]["playurl"]; + JsonValue streams = playurl["stream"]; + + if (streams.isArray()) { + for (int s = 0; s < streams.size(); s++) { + string protocol_name = streams[s]["protocol_name"].asString(); + if (protocol_name == "http_hls") { + JsonValue formats = streams[s]["format"]; + if (formats.isArray()) { + // 一些小主播不提供 fmp4,优先选择 fmp4,其次 ts + string default_format_name = ""; + for (int a = 0; a < formats.size(); a++) { + if (formats[a]["format_name"].asString() == "fmp4") { + default_format_name = "fmp4"; + break; + } else if (formats[a]["format_name"].asString() == "ts") { + default_format_name = "ts"; } - JsonValue qyality_data = temp["data"]["durl"]; - if (qyality_data.isArray()) { - qualityitem["url"] = qyality_data[0]["url"].asString(); - if (qyality_data.size() > 1) { - qualityitem2["url"] = qyality_data[1]["url"].asString(); + } + + for (int f = 0; f < formats.size(); f++) { + string format_name = formats[f]["format_name"].asString(); + if (format_name == default_format_name) { + JsonValue codecs = formats[f]["codec"]; + if (codecs.isArray()) { + for (int c = 0; c < codecs.size(); c++) { + JsonValue codec = codecs[c]; + string codec_name = codec["codec_name"].asString(); + + array accept_qnArray; + JsonValue qnValue = codec["accept_qn"]; + + if (qnValue.isArray()) { + for (int i = 0; i < qnValue.size(); i++) { + accept_qnArray.insertLast(qnValue[i].asInt()); + } + } + + int best_qn = 0; + for (int i = 0; i < accept_qnArray.size(); i++) { + int accept_qn = accept_qnArray[i]; + if (best_qn < accept_qn) { + best_qn = accept_qn; + } + } + + if (@QualityList !is null) { + for (int i = 0; i < accept_qnArray.size(); i++) { + int accept_qn = accept_qnArray[i]; + string quality_res = post("https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo?room_id=" + room_id + + "&qn=" + accept_qn + "&codec=0,1,2&format=0,1,2&mask=0&no_playurl=0&platform=web&protocol=0,1"); + JsonValue temp; + if (Reader.parse(quality_res, temp) && temp.isObject()) { + if (temp["code"].asInt() != 0) { + continue; + } + } + JsonValue temp_streams = temp["data"]["playurl_info"]["playurl"]["stream"]; + for (int ts = 0; ts < temp_streams.size(); ts++) { + string temp_protocol_name = temp_streams[ts]["protocol_name"].asString(); + if (temp_protocol_name == "http_hls") { + JsonValue temp_formats = temp_streams[ts]["format"]; + if (temp_formats.isArray()) { + for (int tf = 0; tf < temp_formats.size(); tf++) { + string temp_format_name = temp_formats[tf]["format_name"].asString(); + if (temp_format_name == default_format_name) { + JsonValue temp_codecs = temp_formats[tf]["codec"]; + if (temp_codecs.isArray()) { + for (int tc = 0; tc < temp_codecs.size(); tc++) { + JsonValue temp_codec = temp_codecs[tc]; + if (temp_codec["codec_name"].asString() == codec_name && temp_codec["current_qn"].asInt() == accept_qn) { + + dictionary qualityItemMain; + dictionary qualityItemBackup; + + string codec_suffix; + int codecOffset = 1; + if (codec_name == "avc") { + codec_suffix = " AVC"; + codecOffset = 1; + } else if (codec_name == "hevc") { + codec_suffix = " HEVC"; + codecOffset = 2; + } else if (codec_name == "av1") { + codec_suffix = " AV1"; + codecOffset = 3; + } else { + codec_suffix = " " + codec_name; + codecOffset = 4; + } + + JsonValue temp_url_info = temp_codec["url_info"]; + + if (temp_url_info.isArray() && temp_url_info.size() > 0) { + if ( best_qn == temp_codec["current_qn"].asInt() ) { + url = temp_codec["url_info"][0]["host"].asString() + temp_codec["base_url"].asString() + temp_codec["url_info"][0]["extra"].asString(); + } + + qualityItemMain["url"] = temp_codec["url_info"][0]["host"].asString() + temp_codec["base_url"].asString() + temp_codec["url_info"][0]["extra"].asString(); + qualityItemMain["quality"] = getLiveQuality(temp_codec["current_qn"].asInt()) + codec_suffix; + qualityItemMain["qualityDetail"] = qualityItemMain["quality"]; + qualityItemMain["itag"] = getItag(temp_codec["current_qn"].asInt()) * 100 + codecOffset * 10; + QualityList.insertLast(qualityItemMain); + + if (temp_url_info.size() > 1) { + qualityItemBackup["url"] = temp_codec["url_info"][1]["host"].asString() + temp_codec["base_url"].asString() + temp_codec["url_info"][1]["extra"].asString(); + qualityItemBackup["quality"] = "- " + getLiveQuality(temp_codec["current_qn"].asInt()) + codec_suffix + " 备份"; + qualityItemBackup["qualityDetail"] = qualityItemBackup["quality"]; + qualityItemBackup["itag"] = getItag(temp_codec["current_qn"].asInt()) * 100 + codecOffset * 10 + 1; + QualityList.insertLast(qualityItemBackup); + } + } + } + } + } + } + } + } + } + } + } + } + } } } } } - int itag = getItag(quality); - qualityitem["quality"] = qualities[i]["desc"].asString(); - qualityitem["qualityDetail"] = qualityitem["quality"]; - qualityitem["itag"] = itag; - QualityList.insertLast(qualityitem); - - qualityitem2["quality"] = "- " + qualities[i]["desc"].asString() + " 备份"; - qualityitem2["qualityDetail"] = qualityitem2["quality"]; - qualityitem2["itag"] = itag + 20; - QualityList.insertLast(qualityitem2); } } } } + log("url", url); return url; } From 7155f2a2539684773c3130fc6fb54fe87839acf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Mon, 17 Aug 2026 02:27:45 +0800 Subject: [PATCH 076/132] =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 622 +++++++++++++------ 1 file changed, 418 insertions(+), 204 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index c0bf95e..de9fd96 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -230,7 +230,7 @@ void log(string item, int info) { } string post(string url, string data="") { - string UserAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36"; + string UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36 Edg/151.0.0.0"; string Headers = "Referer: https://www.bilibili.com\r\n"; if (!ConfigData.cookie.empty()) { Headers += "Cookie: " + ConfigData.cookie + "\r\n"; @@ -381,7 +381,7 @@ string makeWebUrl(string path) { string Video(string bvid, const string &in path, dictionary &MetaData, array &QualityList) { log("--------------------------------------------------"); string res; - string aid; + string aid = parse(path, "aid"); string title; string url; JsonReader reader; @@ -392,8 +392,11 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array subtitle; - res = apiPost("/x/web-interface/view?bvid=" + bvid); + + if (aid.empty()) { + res = apiPost("/x/web-interface/view?bvid=" + bvid); if (res.empty()) { + log("Video view API response EMPTY", bvid); return url; } if (reader.parse(res, root) && root.isObject()) { @@ -421,9 +424,13 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array= 0) { webUrl = redirect_url.asString(); ispgc = true; + ep_id = HostRegExpParse(redirect_url.asString(), "bangumi/play/ep([0-9]+)"); + log("Video ispgc detected", webUrl); + log("Video ep_id", ep_id); } MetaData["webUrl"] = makeWebUrl(webUrl); if (ConfigData.danmakuEnable) { @@ -433,9 +440,15 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array 0) { - array chapt; - for (int i = 0; i < clip_info_list.size(); i++) { - JsonValue chapter = clip_info_list[i]; - if (chapter.isObject()) { - if (chapter["clipType"].asString() == "CLIP_TYPE_OP") { - dictionary startItem; - startItem["title"] = "哔哩哔哩-片头"; - startItem["time"] = formatUInt((chapter["start"].asInt() == 0 ? chapter["start"].asInt() : chapter["start"].asInt() + 1) * 1000); - chapt.insertLast(startItem); - dictionary contentItem; - contentItem["title"] = "哔哩哔哩-正片"; - contentItem["time"] = formatUInt((chapter["end"].asInt() - 1) * 1000); - chapt.insertLast(contentItem); - } else if (chapter["clipType"].asString() == "CLIP_TYPE_ED") { - dictionary endItem; - endItem["title"] = "哔哩哔哩-片尾"; - endItem["time"] = formatUInt((chapter["start"].asInt() + 1) * 1000); - chapt.insertLast(endItem); - } - } - } - if (!chapt.empty() && (@QualityList !is null)) { - MetaData["chapter"] = chapt; - } - } - } else { - data = root["data"]; - } + JsonValue data = root["data"]; if (data["dash"].isObject()) { JsonValue videos = data["dash"]["video"]; @@ -579,7 +562,27 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array 0) { + url = data["durl"][0]["url"].asString(); + } + if (data["dash"].isObject() && (!data["durl"].isArray() || data["durl"].size() == 0)) { + if (!ispgc) { + string flv_res = apiPost("/x/player/playurl?avid=" + aid + "&cid=" + cid + "&qn=" + qn + "&fnval=16&fourk=1"); + if (!flv_res.empty()) { + JsonValue flv_root; + if (reader.parse(flv_res, flv_root) && flv_root.isObject()) { + if (flv_root["code"].asInt() == 0) { + JsonValue flv_data = flv_root["data"]; + if (flv_data["durl"].isArray() && flv_data["durl"].size() > 0) { + url = flv_data["durl"][0]["url"].asString(); + } + } + } + } + } + } + if (!data["dash"].isObject() && data["durl"].isArray()) { url = data["durl"][0]["url"].asString(); qn = data["quality"].asInt(); dictionary qualityitem; @@ -595,22 +598,13 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array Banggumi(string id, string type) { type = "season_id"; } string url = "/pgc/view/web/season?" + type + "=" + id; + log("Banggumi request", url); string res = apiPost(url); if (res.empty()) { + log("Banggumi response EMPTY"); return videos; } if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() != 0) { + log("Banggumi code != 0", Root["code"].asInt()); + log("Banggumi message", Root["message"].asString()); return videos; } JsonValue episodes = Root["result"]["episodes"]; @@ -1579,6 +1579,14 @@ int getAudioItag(int id) { return id; } +uint getUniItag(void) +{ + uint itag = 1; + while (HostExistITag(itag)) itag++; + HostSetITag(itag); + return itag; +} + string getVideoquality(int qn) { array qns = {127, 126, 125, 120, 116, 112, 80, 74, 64, 32, 16, 6}; array qualities = {"8K 超高清", "杜比视界", "HDR 真彩色", "4K 超清", "1080P60 高帧率", "1080P+ 高码率", "1080P 高清", "720P60 高帧率", "720P 高清", "480P 清晰", "360P 流畅", "240P 极速"}; @@ -1599,16 +1607,68 @@ string getCodec(int codecid) { return "未知"; } -string getLiveQuality(int qn) { - if (qn == 30000) return "杜比"; - if (qn == 20000) return "4K超高清"; - if (qn == 15000) return "2K(原画)"; - if (qn == 10000) return "1080p(原画)"; - if (qn == 400) return "1080p(蓝光)"; - if (qn == 250) return "720p(超清)"; - if (qn == 150) return "480p(高清)"; - if (qn == 80) return "360p(流畅)"; - return ""; +string getLiveQuality(JsonValue g_qn_desc, int qn, int hdr_type, JsonValue video_color_info) { + int etof = 0; + if (video_color_info.isObject() && video_color_info["eotf"].isNumeric()) { + etof = video_color_info["eotf"].asInt(); + } + + if (!g_qn_desc.isArray() || g_qn_desc.size() == 0) { + log("getLiveQualityNew: g_qn_desc is not an array or is empty"); + return "未匹配画质"; + } + + for (int i = 0; i < g_qn_desc.size(); i++) { + JsonValue item = g_qn_desc[i]; + if (!item.isObject()) { + log("getLiveQualityNew item is not object, index", i); + continue; + } + + int item_qn = item["qn"].asInt(); + int item_hdr_type = item["hdr_type"].asInt(); + int item_etof = item["eotf"].asInt(); + + if (item_qn != qn || item_hdr_type != hdr_type || item["eotf"].asInt() != etof) { + continue; + } + + string fallback_desc = item["desc"].asString(); + JsonValue media_base_desc = item["media_base_desc"]; + if (!media_base_desc.isObject()) { + log("getLiveQualityNew media_base_desc missing, fallback desc, qn=" + qn + ", hdr_type=" + hdr_type + ", etof=" + etof); + return fallback_desc; + } + + JsonValue detail_desc = media_base_desc["detail_desc"]; + if (!detail_desc.isObject()) { + log("getLiveQualityNew detail_desc missing, fallback desc, qn=" + qn + ", hdr_type=" + hdr_type + ", etof=" + etof); + return fallback_desc; + } + + string main_desc = detail_desc["desc"].asString(); + if (main_desc.empty()) { + log("getLiveQualityNew detail_desc desc empty, fallback desc, qn=" + qn + ", hdr_type=" + hdr_type + ", etof=" + etof); + return fallback_desc; + } + + JsonValue tags = detail_desc["tag"]; + if (!tags.isArray()) { + return main_desc; + } + + string tag_text = ""; + for (int t = 0; t < tags.size(); t++) { + if (!tag_text.empty()) { + tag_text += " "; + } + tag_text += tags[t].asString(); + } + + return main_desc + " (" + tag_text + ")"; + } + + return "未匹配画质"; } string Audio(const string &in path, dictionary &MetaData, array &QualityList) { @@ -1653,157 +1713,213 @@ string Live(string id, const string &in path, dictionary &MetaData, array accept_qnArray; + JsonValue qnValue = codec["accept_qn"]; + if (qnValue.isArray()) { + for (int i = 0; i < qnValue.size(); i++) { + accept_qnArray.insertLast(qnValue[i].asInt()); + } + } + if (accept_qnArray.size() == 0) { + continue; + } + + int best_qn = 0; + for (int i = 0; i < accept_qnArray.size(); i++) { + if (best_qn < accept_qnArray[i]) { + best_qn = accept_qnArray[i]; + } + } + + if (@QualityList is null) { + continue; + } + + for (int i = 0; i < accept_qnArray.size(); i++) { + int accept_qn = accept_qnArray[i]; + string quality_res = post("https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo?room_id=" + room_id + "&qn=" + accept_qn + "&codec=0,1,2&format=0,1,2&mask=0&no_playurl=0&platform=web&protocol=0,1&eotf=0,1,2"); + JsonValue temp; + if (!Reader.parse(quality_res, temp) || !temp.isObject() || temp["code"].asInt() != 0) { + continue; + } + + JsonValue g_qn_desc = temp["data"]["playurl_info"]["playurl"]["g_qn_desc"]; + + JsonValue temp_streams = temp["data"]["playurl_info"]["playurl"]["stream"]; + if (!temp_streams.isArray()) { + continue; + } + + for (int ts = 0; ts < temp_streams.size(); ts++) { + if (temp_streams[ts]["protocol_name"].asString() != "http_hls") { + continue; + } + + JsonValue temp_formats = temp_streams[ts]["format"]; + if (!temp_formats.isArray()) { + continue; } - for (int f = 0; f < formats.size(); f++) { - string format_name = formats[f]["format_name"].asString(); - if (format_name == default_format_name) { - JsonValue codecs = formats[f]["codec"]; - if (codecs.isArray()) { - for (int c = 0; c < codecs.size(); c++) { - JsonValue codec = codecs[c]; - string codec_name = codec["codec_name"].asString(); - - array accept_qnArray; - JsonValue qnValue = codec["accept_qn"]; - - if (qnValue.isArray()) { - for (int i = 0; i < qnValue.size(); i++) { - accept_qnArray.insertLast(qnValue[i].asInt()); - } - } - - int best_qn = 0; - for (int i = 0; i < accept_qnArray.size(); i++) { - int accept_qn = accept_qnArray[i]; - if (best_qn < accept_qn) { - best_qn = accept_qn; - } - } - - if (@QualityList !is null) { - for (int i = 0; i < accept_qnArray.size(); i++) { - int accept_qn = accept_qnArray[i]; - string quality_res = post("https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo?room_id=" + room_id - + "&qn=" + accept_qn + "&codec=0,1,2&format=0,1,2&mask=0&no_playurl=0&platform=web&protocol=0,1"); - JsonValue temp; - if (Reader.parse(quality_res, temp) && temp.isObject()) { - if (temp["code"].asInt() != 0) { - continue; - } - } - JsonValue temp_streams = temp["data"]["playurl_info"]["playurl"]["stream"]; - for (int ts = 0; ts < temp_streams.size(); ts++) { - string temp_protocol_name = temp_streams[ts]["protocol_name"].asString(); - if (temp_protocol_name == "http_hls") { - JsonValue temp_formats = temp_streams[ts]["format"]; - if (temp_formats.isArray()) { - for (int tf = 0; tf < temp_formats.size(); tf++) { - string temp_format_name = temp_formats[tf]["format_name"].asString(); - if (temp_format_name == default_format_name) { - JsonValue temp_codecs = temp_formats[tf]["codec"]; - if (temp_codecs.isArray()) { - for (int tc = 0; tc < temp_codecs.size(); tc++) { - JsonValue temp_codec = temp_codecs[tc]; - if (temp_codec["codec_name"].asString() == codec_name && temp_codec["current_qn"].asInt() == accept_qn) { - - dictionary qualityItemMain; - dictionary qualityItemBackup; - - string codec_suffix; - int codecOffset = 1; - if (codec_name == "avc") { - codec_suffix = " AVC"; - codecOffset = 1; - } else if (codec_name == "hevc") { - codec_suffix = " HEVC"; - codecOffset = 2; - } else if (codec_name == "av1") { - codec_suffix = " AV1"; - codecOffset = 3; - } else { - codec_suffix = " " + codec_name; - codecOffset = 4; - } - - JsonValue temp_url_info = temp_codec["url_info"]; - - if (temp_url_info.isArray() && temp_url_info.size() > 0) { - if ( best_qn == temp_codec["current_qn"].asInt() ) { - url = temp_codec["url_info"][0]["host"].asString() + temp_codec["base_url"].asString() + temp_codec["url_info"][0]["extra"].asString(); - } - - qualityItemMain["url"] = temp_codec["url_info"][0]["host"].asString() + temp_codec["base_url"].asString() + temp_codec["url_info"][0]["extra"].asString(); - qualityItemMain["quality"] = getLiveQuality(temp_codec["current_qn"].asInt()) + codec_suffix; - qualityItemMain["qualityDetail"] = qualityItemMain["quality"]; - qualityItemMain["itag"] = getItag(temp_codec["current_qn"].asInt()) * 100 + codecOffset * 10; - QualityList.insertLast(qualityItemMain); - - if (temp_url_info.size() > 1) { - qualityItemBackup["url"] = temp_codec["url_info"][1]["host"].asString() + temp_codec["base_url"].asString() + temp_codec["url_info"][1]["extra"].asString(); - qualityItemBackup["quality"] = "- " + getLiveQuality(temp_codec["current_qn"].asInt()) + codec_suffix + " 备份"; - qualityItemBackup["qualityDetail"] = qualityItemBackup["quality"]; - qualityItemBackup["itag"] = getItag(temp_codec["current_qn"].asInt()) * 100 + codecOffset * 10 + 1; - QualityList.insertLast(qualityItemBackup); - } - } - } - } - } - } - } - } - } - } - } - } + for (int tf = 0; tf < temp_formats.size(); tf++) { + if (temp_formats[tf]["format_name"].asString() != default_format_name) { + continue; + } + + JsonValue temp_codecs = temp_formats[tf]["codec"]; + if (!temp_codecs.isArray()) { + continue; + } + + for (int tc = 0; tc < temp_codecs.size(); tc++) { + JsonValue temp_codec = temp_codecs[tc]; + if (temp_codec["codec_name"].asString() != codec_name || temp_codec["current_qn"].asInt() != accept_qn) { + continue; + } + + JsonValue temp_url_info = temp_codec["url_info"]; + if (!temp_url_info.isArray() || temp_url_info.size() == 0) { + continue; + } + + dictionary qualityItemMain; + dictionary qualityItemBackup; + + string codec_suffix; + int codecOffset = 1; + if (codec_name == "avc") { + codec_suffix = " AVC"; + codecOffset = 1; + } else if (codec_name == "hevc") { + codec_suffix = " HEVC"; + codecOffset = 2; + } else if (codec_name == "av1") { + codec_suffix = " AV1"; + codecOffset = 3; + } else { + codec_suffix = " " + codec_name; + codecOffset = 4; + } + + if (best_qn == temp_codec["current_qn"].asInt()) { + if (url.empty()) { + url = temp_codec["url_info"][0]["host"].asString() + temp_codec["base_url"].asString() + temp_codec["url_info"][0]["extra"].asString(); } } + + JsonValue video_color_info = temp_codec["video_color_info"]; + bool isHDR = false; + if (temp_codec["hdr_type"].asInt() == 1) { + isHDR = true; + } + int bitrate = 0; + string bitrateStr = ""; + + qualityItemMain["url"] = temp_codec["url_info"][0]["host"].asString() + temp_codec["base_url"].asString() + temp_codec["url_info"][0]["extra"].asString(); + qualityItemMain["quality"] = getLiveQualit(g_qn_desc, temp_codec["current_qn"].asInt(), temp_codec["hdr_type"].asInt(), video_color_info) + codec_suffix; + // qualityItemMain["quality"] = getLiveQualityNew(g_qn_desc, temp_codec["current_qn"].asInt(), temp_codec["hdr_type"].asInt(), video_color_info); + // qualityItemMain["format"] = codec_name; + qualityItemMain["qualityDetail"] = qualityItemMain["quality"]; + qualityItemMain["itag"] = getUniItag(); + + qualityItemMain["resolution"] = temp_codec["width"].asInt() + "x" + temp_codec["height"].asInt(); + qualityItemMain["isHDR"] = isHDR; + bitrateStr = HostRegExpParse(url, "(?:[?&]origin_bitrate=)(\\d+)(?:&|$)"); + if (!bitrateStr.empty()) { + bitrate = HostString2UIntPtr(bitrateStr); + } + qualityItemMain["bitrate"] = bitrate * 1000; + QualityList.insertLast(qualityItemMain); + + if (temp_url_info.size() <= 1) { + continue; + } + + qualityItemBackup["url"] = temp_codec["url_info"][1]["host"].asString() + temp_codec["base_url"].asString() + temp_codec["url_info"][1]["extra"].asString(); + qualityItemBackup["quality"] = "- " + getLiveQuality(g_qn_desc, temp_codec["current_qn"].asInt(), temp_codec["hdr_type"].asInt(), video_color_info) + codec_suffix + " 备份"; + // qualityItemBackup["quality"] = "- " + getLiveQualityNew(g_qn_desc, temp_codec["current_qn"].asInt(), temp_codec["hdr_type"].asInt(), video_color_info) + " 备份"; + // qualityItemBackup["format"] = codec_name; + qualityItemBackup["qualityDetail"] = qualityItemBackup["quality"]; + qualityItemBackup["itag"] = getUniItag(); + + qualityItemBackup["resolution"] = temp_codec["width"].asInt() + "x" + temp_codec["height"].asInt(); + qualityItemBackup["isHDR"] = isHDR; + bitrateStr = HostRegExpParse(url, "(?:[?&]origin_bitrate=)(\\d+)(?:&|$)"); + if (!bitrateStr.empty()) { + bitrate = HostString2UIntPtr(bitrateStr); + } + qualityItemMain["bitrate"] = bitrate * 1000; + QualityList.insertLast(qualityItemBackup); } } } @@ -1812,6 +1928,10 @@ string Live(string id, const string &in path, dictionary &MetaData, array= 0) { + log("PlayitemCheck bangumi/ep TRUE", path); + return true; + } + if (path.find("live.bilibili.com") >= 0) { return true; } @@ -1879,7 +2004,9 @@ bool PlaylistCheck(const string &in path) { return true; } if(path.find("live.bilibili.com") >= 0){ - return true; + if(path.find("areaId") >= 0 || path.find("lol") >= 0 || path.find("hpjy") >= 0){ + return true; + } } if (path.find("www.bilibili.com") >= 0 && HostRegExpParse(path, "www.bilibili.com/([a-zA-Z0-9]+)").empty()) { return true; @@ -1975,9 +2102,11 @@ array PlaylistParse(const string &in path) { return Banggumi(HostRegExpParse(path, "bangumi/media/md([0-9]+)"), "media_id"); } if (path.find("bangumi/play/ep") >= 0) { + log("PlaylistParse bangumi ep detected", path); return Banggumi(HostRegExpParse(path, "bangumi/play/ep([0-9]+)"), "ep_id"); } if (path.find("bangumi/play/ss") >= 0) { + log("PlaylistParse bangumi ss detected", path); return Banggumi(HostRegExpParse(path, "bangumi/play/ss([0-9]+)"), "season_id"); } if (path.find("www.bilibili.com/v/popular/rank") >= 0) { @@ -2006,6 +2135,92 @@ array PlaylistParse(const string &in path) { string PlayitemParse(const string &in path, dictionary &MetaData, array &QualityList) { log("Playitem path", path); status = 2; + + if (path.find("bangumi/play/ep") >= 0) { + log("Bangumi item detected", path); + string epid = HostRegExpParse(path, "bangumi/play/ep([0-9]+)"); + log("Bangumi epid", epid); + if (!epid.empty()) { + string apiUrl = "/pgc/view/web/season?ep_id=" + epid; + string res = apiPost(apiUrl); + log("Bangumi season API response length", res.length()); + if (res.empty()) { + log("Bangumi season API response EMPTY"); + return ""; + } + JsonReader reader; + JsonValue root; + if (!reader.parse(res, root)) { + log("Bangumi season API JSON parse FAILED"); + return ""; + } + if (!root.isObject()) { + log("Bangumi season API root is NOT object"); + return ""; + } + log("Bangumi season API code", root["code"].asInt()); + if (root["code"].asInt() != 0) { + log("Bangumi season API message", root["message"].asString()); + return ""; + } + JsonValue result = root["result"]; + if (!result.isObject()) { + log("Bangumi season API result is NOT object"); + return ""; + } + JsonValue episodes = result["episodes"]; + if (!episodes.isArray()) { + log("Bangumi season API episodes is NOT array"); + return ""; + } + log("Bangumi episode count", episodes.size()); + if (episodes.size() == 0) { + log("Bangumi episode list EMPTY"); + return ""; + } + string bvid; + string cid; + string aid; + string title; + string cover; + for (int i = 0; i < episodes.size(); i++) { + if (episodes[i]["id"].asInt() == parseInt(epid)) { + bvid = episodes[i]["bvid"].asString(); + cid = episodes[i]["cid"].asString(); + aid = episodes[i]["aid"].asString(); + title = episodes[i]["share_copy"].asString(); + cover = episodes[i]["cover"].asString(); + break; + } + } + if (bvid.empty()) { + log("Bangumi ep not found by id, using first episode"); + bvid = episodes[0]["bvid"].asString(); + cid = episodes[0]["cid"].asString(); + aid = episodes[0]["aid"].asString(); + title = episodes[0]["share_copy"].asString(); + cover = episodes[0]["cover"].asString(); + } + log("Bangumi bvid", bvid); + log("Bangumi cid", cid); + log("Bangumi aid", aid); + if (!title.empty()) { + MetaData["title"] = title; + MetaData["content"] = title; + } + if (!cover.empty()) { + MetaData["thumbnail"] = cover; + } + if (!bvid.empty()) { + string videoUrl = "https://www.bilibili.com/video/" + bvid + "?cid=" + cid + "&aid=" + aid; + log("Bangumi calling Video with URL", videoUrl); + return Video(bvid, videoUrl, MetaData, QualityList); + } + log("Bangumi bvid EMPTY after lookup"); + } + return ""; + } + if (path.find("/video/BV") >= 0) { string bvid = parseBVId(path); return Video(bvid, path, MetaData, QualityList); @@ -2021,5 +2236,4 @@ string PlayitemParse(const string &in path, dictionary &MetaData, array Date: Mon, 17 Aug 2026 02:32:58 +0800 Subject: [PATCH 077/132] =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index de9fd96..d8f18c9 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -1886,7 +1886,7 @@ string Live(string id, const string &in path, dictionary &MetaData, array Date: Sat, 22 Aug 2026 10:16:36 +0800 Subject: [PATCH 078/132] =?UTF-8?q?=E7=B2=BE=E7=AE=80=E7=9B=B4=E6=92=AD?= =?UTF-8?q?=E7=BD=91=E7=BB=9C=E8=AF=B7=E6=B1=82=E6=95=B0=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 445 +++++++++++-------- 1 file changed, 259 insertions(+), 186 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index d8f18c9..c1b5a19 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -1707,6 +1707,204 @@ string Audio(const string &in path, dictionary &MetaData, array &Qua return url; } +void appendLiveQualityFromRoot(JsonValue &in root, int reqQnInt, array &inout QualityList, string &inout selectedUrl, array &inout acceptCodecQnKeys, array &inout presentCodecQnKeys, array &inout insertedItemKeys, bool collectAcceptQn) { + JsonValue playurl = root["data"]["playurl_info"]["playurl"]; + JsonValue g_qn_desc = playurl["g_qn_desc"]; + JsonValue streams = playurl["stream"]; + if (!streams.isArray()) { + return; + } + for (int s = 0; s < streams.size(); s++) { + if (streams[s]["protocol_name"].asString() != "http_hls") { + continue; + } + + JsonValue formats = streams[s]["format"]; + if (!formats.isArray()) { + continue; + } + + string preferFormat = ""; + for (int i = 0; i < formats.size(); i++) { + string name = formats[i]["format_name"].asString(); + if (name == "fmp4") { + preferFormat = "fmp4"; + break; + } + if (name == "ts") { + preferFormat = "ts"; + } + } + if (preferFormat.empty()) { + continue; + } + + for (int f = 0; f < formats.size(); f++) { + if (formats[f]["format_name"].asString() != preferFormat) { + continue; + } + + JsonValue codecs = formats[f]["codec"]; + if (!codecs.isArray()) { + continue; + } + + for (int c = 0; c < codecs.size(); c++) { + JsonValue codec = codecs[c]; + string codecName = codec["codec_name"].asString(); + int currentQn = codec["current_qn"].asInt(); + int hdrType = codec["hdr_type"].asInt(); + + JsonValue videoColorInfo = codec["video_color_info"]; + int eotf = 0; + if (videoColorInfo.isObject() && videoColorInfo["eotf"].isNumeric()) { + eotf = videoColorInfo["eotf"].asInt(); + } + + if (collectAcceptQn) { + JsonValue acceptQn = codec["accept_qn"]; + if (acceptQn.isArray()) { + for (int i = 0; i < acceptQn.size(); i++) { + int qn = acceptQn[i].asInt(); + string key = codecName + "|" + qn; + + bool exists = false; + for (uint k = 0; k < acceptCodecQnKeys.length(); k++) { + if (acceptCodecQnKeys[k] == key) { + exists = true; + break; + } + } + if (!exists) { + acceptCodecQnKeys.insertLast(key); + } + } + } + } + + { + string presentKey = codecName + "|" + currentQn; + bool exists = false; + for (uint k = 0; k < presentCodecQnKeys.length(); k++) { + if (presentCodecQnKeys[k] == presentKey) { + exists = true; + break; + } + } + if (!exists) { + presentCodecQnKeys.insertLast(presentKey); + } + } + + JsonValue urlInfo = codec["url_info"]; + if (!urlInfo.isArray() || urlInfo.size() == 0) { + continue; + } + + string baseUrl = codec["base_url"].asString(); + string mainUrl = urlInfo[0]["host"].asString() + baseUrl + urlInfo[0]["extra"].asString(); + + if (selectedUrl.empty()) { + if (currentQn == reqQnInt) { + selectedUrl = mainUrl; + } else { + selectedUrl = mainUrl; + } + } + + string codecSuffix = " " + codecName; + if (codecName == "avc") { + codecSuffix = " AVC"; + } else if (codecName == "hevc") { + codecSuffix = " HEVC"; + } else if (codecName == "av1") { + codecSuffix = " AV1"; + } + + string uniqueMain = codecName + "|" + currentQn + "|" + hdrType + "|" + eotf + "|" + preferFormat + "|main"; + bool mainExists = false; + for (uint i = 0; i < insertedItemKeys.length(); i++) { + if (insertedItemKeys[i] == uniqueMain) { + mainExists = true; + break; + } + } + + if (!mainExists) { + dictionary qualityItemMain; + qualityItemMain["url"] = mainUrl; + qualityItemMain["quality"] = getLiveQuality(g_qn_desc, currentQn, hdrType, videoColorInfo) + codecSuffix; + qualityItemMain["qualityDetail"] = qualityItemMain["quality"]; + qualityItemMain["itag"] = getUniItag(); + qualityItemMain["qn"] = currentQn; + qualityItemMain["codec_name"] = codecName; + qualityItemMain["isHDR"] = (hdrType == 1); + + int w = 0; + int h = 0; + if (codec["media_info"].isObject()) { + w = codec["media_info"]["width"].asInt(); + h = codec["media_info"]["height"].asInt(); + } + qualityItemMain["resolution"] = w + "x" + h; + + int bitrate = 0; + string bitrateStr = HostRegExpParse(mainUrl, "(?:[?&]origin_bitrate=)([0-9]+)(?:&|$)"); + if (!bitrateStr.empty()) { + bitrate = HostString2UIntPtr(bitrateStr) * 1000; + } + qualityItemMain["bitrate"] = bitrate; + + QualityList.insertLast(qualityItemMain); + insertedItemKeys.insertLast(uniqueMain); + } + + if (urlInfo.size() > 1) { + string backupUrl = urlInfo[1]["host"].asString() + baseUrl + urlInfo[1]["extra"].asString(); + string uniqueBackup = codecName + "|" + currentQn + "|" + hdrType + "|" + eotf + "|" + preferFormat + "|backup"; + + bool backupExists = false; + for (uint i = 0; i < insertedItemKeys.length(); i++) { + if (insertedItemKeys[i] == uniqueBackup) { + backupExists = true; + break; + } + } + + if (!backupExists) { + dictionary qualityItemBackup; + qualityItemBackup["url"] = backupUrl; + qualityItemBackup["quality"] = "- " + getLiveQuality(g_qn_desc, currentQn, hdrType, videoColorInfo) + codecSuffix + " 备份"; + qualityItemBackup["qualityDetail"] = qualityItemBackup["quality"]; + qualityItemBackup["itag"] = getUniItag(); + qualityItemBackup["qn"] = currentQn; + qualityItemBackup["codec_name"] = codecName; + qualityItemBackup["isHDR"] = (hdrType == 1); + + int bw = 0; + int bh = 0; + if (codec["media_info"].isObject()) { + bw = codec["media_info"]["width"].asInt(); + bh = codec["media_info"]["height"].asInt(); + } + qualityItemBackup["resolution"] = bw + "x" + bh; + + int backupBitrate = 0; + string backupBitrateStr = HostRegExpParse(backupUrl, "(?:[?&]origin_bitrate=)([0-9]+)(?:&|$)"); + if (!backupBitrateStr.empty()) { + backupBitrate = HostString2UIntPtr(backupBitrateStr) * 1000; + } + qualityItemBackup["bitrate"] = backupBitrate; + + QualityList.insertLast(qualityItemBackup); + insertedItemKeys.insertLast(uniqueBackup); + } + } + } + } + } +} + string Live(string id, const string &in path, dictionary &MetaData, array &QualityList) { string url = ""; int room_id = 0; @@ -1733,200 +1931,75 @@ string Live(string id, const string &in path, dictionary &MetaData, array accept_qnArray; - JsonValue qnValue = codec["accept_qn"]; - if (qnValue.isArray()) { - for (int i = 0; i < qnValue.size(); i++) { - accept_qnArray.insertLast(qnValue[i].asInt()); - } - } - if (accept_qnArray.size() == 0) { - continue; - } - - int best_qn = 0; - for (int i = 0; i < accept_qnArray.size(); i++) { - if (best_qn < accept_qnArray[i]) { - best_qn = accept_qnArray[i]; - } - } - - if (@QualityList is null) { - continue; - } + int reqQnInt = parseInt(req_qn); - for (int i = 0; i < accept_qnArray.size(); i++) { - int accept_qn = accept_qnArray[i]; - string quality_res = post("https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo?room_id=" + room_id + "&qn=" + accept_qn + "&codec=0,1,2&format=0,1,2&mask=0&no_playurl=0&platform=web&protocol=0,1&eotf=0,1,2"); - JsonValue temp; - if (!Reader.parse(quality_res, temp) || !temp.isObject() || temp["code"].asInt() != 0) { - continue; - } - - JsonValue g_qn_desc = temp["data"]["playurl_info"]["playurl"]["g_qn_desc"]; - - JsonValue temp_streams = temp["data"]["playurl_info"]["playurl"]["stream"]; - if (!temp_streams.isArray()) { - continue; - } - - for (int ts = 0; ts < temp_streams.size(); ts++) { - if (temp_streams[ts]["protocol_name"].asString() != "http_hls") { - continue; - } - - JsonValue temp_formats = temp_streams[ts]["format"]; - if (!temp_formats.isArray()) { - continue; - } - - for (int tf = 0; tf < temp_formats.size(); tf++) { - if (temp_formats[tf]["format_name"].asString() != default_format_name) { - continue; - } - - JsonValue temp_codecs = temp_formats[tf]["codec"]; - if (!temp_codecs.isArray()) { - continue; - } + res = post("https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo?room_id=" + room_id + "&qn=" + req_qn + "&codec=0,1,2&format=0,1,2&mask=0&no_playurl=0&platform=web&protocol=0,1&eotf=0,1,2"); + if (!Reader.parse(res, Root) || !Root.isObject() || Root["code"].asInt() != 0) { + return ""; + } - for (int tc = 0; tc < temp_codecs.size(); tc++) { - JsonValue temp_codec = temp_codecs[tc]; - if (temp_codec["codec_name"].asString() != codec_name || temp_codec["current_qn"].asInt() != accept_qn) { - continue; - } + array acceptCodecQnKeys; + array presentCodecQnKeys; + array insertedItemKeys; + array requestedQn; + + appendLiveQualityFromRoot(Root, reqQnInt, QualityList, url, acceptCodecQnKeys, presentCodecQnKeys, insertedItemKeys, true); + + while (true) { + int missingQn = -1; + + for (uint i = 0; i < acceptCodecQnKeys.length(); i++) { + string k = acceptCodecQnKeys[i]; + + bool present = false; + for (uint p = 0; p < presentCodecQnKeys.length(); p++) { + if (presentCodecQnKeys[p] == k) { + present = true; + break; + } + } + if (present) { + continue; + } + + array parts = k.split("|"); + if (parts.length() < 2) { + continue; + } + + int qn = parseInt(parts[1]); + + bool alreadyRequested = false; + for (uint r = 0; r < requestedQn.length(); r++) { + if (requestedQn[r] == qn) { + alreadyRequested = true; + break; + } + } + if (alreadyRequested) { + continue; + } + + missingQn = qn; + break; + } - JsonValue temp_url_info = temp_codec["url_info"]; - if (!temp_url_info.isArray() || temp_url_info.size() == 0) { - continue; - } + if (missingQn < 0) { + break; + } - dictionary qualityItemMain; - dictionary qualityItemBackup; - - string codec_suffix; - int codecOffset = 1; - if (codec_name == "avc") { - codec_suffix = " AVC"; - codecOffset = 1; - } else if (codec_name == "hevc") { - codec_suffix = " HEVC"; - codecOffset = 2; - } else if (codec_name == "av1") { - codec_suffix = " AV1"; - codecOffset = 3; - } else { - codec_suffix = " " + codec_name; - codecOffset = 4; - } + requestedQn.insertLast(missingQn); - if (best_qn == temp_codec["current_qn"].asInt()) { - if (url.empty()) { - url = temp_codec["url_info"][0]["host"].asString() + temp_codec["base_url"].asString() + temp_codec["url_info"][0]["extra"].asString(); - } - } + string extraRes = post("https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo?room_id=" + room_id + "&qn=" + missingQn + "&codec=0,1,2&format=0,1,2&mask=0&no_playurl=0&platform=web&protocol=0,1&eotf=0,1,2"); - JsonValue video_color_info = temp_codec["video_color_info"]; - bool isHDR = false; - if (temp_codec["hdr_type"].asInt() == 1) { - isHDR = true; - } - int bitrate = 0; - string bitrateStr = ""; - - qualityItemMain["url"] = temp_codec["url_info"][0]["host"].asString() + temp_codec["base_url"].asString() + temp_codec["url_info"][0]["extra"].asString(); - qualityItemMain["quality"] = getLiveQuality(g_qn_desc, temp_codec["current_qn"].asInt(), temp_codec["hdr_type"].asInt(), video_color_info) + codec_suffix; - // qualityItemMain["quality"] = getLiveQualityNew(g_qn_desc, temp_codec["current_qn"].asInt(), temp_codec["hdr_type"].asInt(), video_color_info); - // qualityItemMain["format"] = codec_name; - qualityItemMain["qualityDetail"] = qualityItemMain["quality"]; - qualityItemMain["itag"] = getUniItag(); - - qualityItemMain["resolution"] = temp_codec["width"].asInt() + "x" + temp_codec["height"].asInt(); - qualityItemMain["isHDR"] = isHDR; - bitrateStr = HostRegExpParse(url, "(?:[?&]origin_bitrate=)(\\d+)(?:&|$)"); - if (!bitrateStr.empty()) { - bitrate = HostString2UIntPtr(bitrateStr); - } - qualityItemMain["bitrate"] = bitrate * 1000; - QualityList.insertLast(qualityItemMain); + JsonValue extraRoot; + if (!Reader.parse(extraRes, extraRoot) || !extraRoot.isObject() || extraRoot["code"].asInt() != 0) { + continue; + } - if (temp_url_info.size() <= 1) { - continue; - } + appendLiveQualityFromRoot(extraRoot, reqQnInt, QualityList, url, acceptCodecQnKeys, presentCodecQnKeys, insertedItemKeys, false); + } - qualityItemBackup["url"] = temp_codec["url_info"][1]["host"].asString() + temp_codec["base_url"].asString() + temp_codec["url_info"][1]["extra"].asString(); - qualityItemBackup["quality"] = "- " + getLiveQuality(g_qn_desc, temp_codec["current_qn"].asInt(), temp_codec["hdr_type"].asInt(), video_color_info) + codec_suffix + " 备份"; - // qualityItemBackup["quality"] = "- " + getLiveQualityNew(g_qn_desc, temp_codec["current_qn"].asInt(), temp_codec["hdr_type"].asInt(), video_color_info) + " 备份"; - // qualityItemBackup["format"] = codec_name; - qualityItemBackup["qualityDetail"] = qualityItemBackup["quality"]; - qualityItemBackup["itag"] = getUniItag(); - - qualityItemBackup["resolution"] = temp_codec["width"].asInt() + "x" + temp_codec["height"].asInt(); - qualityItemBackup["isHDR"] = isHDR; - bitrateStr = HostRegExpParse(url, "(?:[?&]origin_bitrate=)(\\d+)(?:&|$)"); - if (!bitrateStr.empty()) { - bitrate = HostString2UIntPtr(bitrateStr); - } - qualityItemMain["bitrate"] = bitrate * 1000; - QualityList.insertLast(qualityItemBackup); - } - } - } - } - } - } - } log("url", url); // log("Quality items", QualityList.length()); // for (uint i = 0; i < QualityList.length(); i++) { From 0120c858c389277d34533156fb24c7a766967a18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Sat, 22 Aug 2026 13:28:49 +0800 Subject: [PATCH 079/132] =?UTF-8?q?1.=20bugfix=20-=20=E4=BF=AE=E5=A4=8Dupo?= =?UTF-8?q?s=20url=E4=B8=8D=E8=83=BD=E6=AD=A3=E5=B8=B8=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=8C2.=20=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E8=A7=86=E9=A2=91=E6=B5=81=E5=9C=B0=E5=9D=80=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 139 +++++++++++-------- 1 file changed, 83 insertions(+), 56 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index c1b5a19..39ff35e 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -24,10 +24,39 @@ Config ConfigData; +string UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36 Edg/151.0.0.0"; +string Headers = "Referer: https://www.bilibili.com\r\n"; + void OnInitialize() { - HostSetUrlHeaderHTTP("bilivideo.com", "Referer: https://www.bilibili.com\r\n"); - HostSetUrlHeaderHTTP("bilivideo.cn", "Referer: https://www.bilibili.com\r\n"); - HostSetUrlHeaderHTTP("bilibili.com", "Referer: https://www.bilibili.com\r\n"); + HostSetUrlHeaderHTTP( + "bilivideo.com", + "User-Agent: " + UserAgent + "\r\n" + ); + + HostSetUrlHeaderHTTP( + "bilivideo.cn", + "User-Agent: " + UserAgent + "\r\n" + ); + + HostSetUrlHeaderHTTP( + "bilibili.com", + "User-Agent: " + UserAgent + "\r\n" + ); + + HostSetUrlRefererHTTP( + "bilivideo.com", + "https://www.bilibili.com" + ); + + HostSetUrlRefererHTTP( + "bilivideo.cn", + "https://www.bilibili.com" + ); + + HostSetUrlRefererHTTP( + "bilibili.com", + "https://www.bilibili.com" + ); } string host = "https://api.bilibili.com"; @@ -230,8 +259,6 @@ void log(string item, int info) { } string post(string url, string data="") { - string UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36 Edg/151.0.0.0"; - string Headers = "Referer: https://www.bilibili.com\r\n"; if (!ConfigData.cookie.empty()) { Headers += "Cookie: " + ConfigData.cookie + "\r\n"; } @@ -395,60 +422,60 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array= 0) { + webUrl = redirect_url.asString(); + ispgc = true; + ep_id = HostRegExpParse(redirect_url.asString(), "bangumi/play/ep([0-9]+)"); + log("Video ispgc detected", webUrl); + log("Video ep_id", ep_id); + } + MetaData["webUrl"] = makeWebUrl(webUrl); + if (ConfigData.danmakuEnable) { + dictionary dic; + dic["name"] = "【弹幕】" + title; + dic["url"] = ConfigData.danmakuUrl + cid; + subtitle.insertLast(dic); + } } else { - MetaData["content"] = title + " | " + desc; - } - JsonValue redirect_url = data["redirect_url"]; - string ep_id; - if (redirect_url.isString() && redirect_url.asString().find("bangumi/play/ep") >= 0) { - webUrl = redirect_url.asString(); - ispgc = true; - ep_id = HostRegExpParse(redirect_url.asString(), "bangumi/play/ep([0-9]+)"); - log("Video ispgc detected", webUrl); - log("Video ep_id", ep_id); + log("Video view API code != 0", root["code"].asInt()); + log("Video view API message", root["message"].asString()); + return url; } - MetaData["webUrl"] = makeWebUrl(webUrl); - if (ConfigData.danmakuEnable) { - dictionary dic; - dic["name"] = "【弹幕】" + title; - dic["url"] = ConfigData.danmakuUrl + cid; - subtitle.insertLast(dic); - } - } else { - log("Video view API code != 0", root["code"].asInt()); - log("Video view API message", root["message"].asString()); - return url; } + } else { + log("Video skip view API, aid known", aid); + ispgc = true; } -} else { - log("Video skip view API, aid known", aid); - ispgc = true; -} res = apiPost("/x/player/wbi/v2?bvid=" + bvid + "&cid=" + cid); if (res.empty()) { @@ -498,9 +525,9 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array Date: Mon, 24 Aug 2026 16:49:21 +0800 Subject: [PATCH 080/132] =?UTF-8?q?=E6=96=B0=E7=99=BB=E5=BD=95=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=EF=BC=8C=E5=85=B6=E5=AE=83=E5=B0=8F=E7=BB=86=E8=8A=82?= =?UTF-8?q?=E8=B0=83=E6=95=B4=EF=BC=8Cupdate=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 153 ++++++------------- README.md | 59 +++++-- public/login_1.png | Bin 0 -> 150771 bytes public/login_2.png | Bin 0 -> 138410 bytes public/login_web.png | Bin 0 -> 726830 bytes public/settings.png | Bin 44005 -> 0 bytes public/test.png | Bin 44941 -> 0 bytes 7 files changed, 93 insertions(+), 119 deletions(-) create mode 100644 public/login_1.png create mode 100644 public/login_2.png create mode 100644 public/login_web.png delete mode 100644 public/settings.png delete mode 100644 public/test.png diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 39ff35e..130c185 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -16,47 +16,41 @@ // string ServerCheck(string User, string Pass) -> server check // string ServerLogin(string User, string Pass) -> login // void ServerLogout() -> logout +// string GetWebAccountUrl() -> login process by WebBrowser +// string GetWebAccountDomain() -> transport cookie domain for login //------------------------------------------------------------------------------------------------ // bool PlayitemCheck(const string &in) -> check playitem // array PlayitemParse(const string &in) -> parse playitem +// void PlayitemCancel() -> cancel playitem // bool PlaylistCheck(const string &in) -> check playlist // array PlaylistParse(const string &in) -> parse playlist +// void PlaylistCancel() -> cancel playlist +// string GetStatus() -> display status +// string GetBroadcastListUrl() -> get broadcast list url +// string GetBroadcastListScript() -> for WebView2::AddScriptToExecuteOnDocumentCreated for script process -Config ConfigData; -string UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36 Edg/151.0.0.0"; -string Headers = "Referer: https://www.bilibili.com\r\n"; +array BilibiliDomains = {"bilibili.com", "bilivideo.com", "bilivideo.cn"}; + +Config ConfigData; void OnInitialize() { - HostSetUrlHeaderHTTP( - "bilivideo.com", - "User-Agent: " + UserAgent + "\r\n" - ); - - HostSetUrlHeaderHTTP( - "bilivideo.cn", - "User-Agent: " + UserAgent + "\r\n" - ); - - HostSetUrlHeaderHTTP( - "bilibili.com", - "User-Agent: " + UserAgent + "\r\n" - ); - - HostSetUrlRefererHTTP( - "bilivideo.com", - "https://www.bilibili.com" - ); - - HostSetUrlRefererHTTP( - "bilivideo.cn", - "https://www.bilibili.com" - ); - - HostSetUrlRefererHTTP( - "bilibili.com", - "https://www.bilibili.com" - ); + string UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36 Edg/151.0.0.0"; + string Referer = "https://www.bilibili.com"; + + for (uint i = 0; i < BilibiliDomains.length(); i++) { + HostSetUrlUserAgentHTTP(BilibiliDomains[i], UserAgent); + HostSetUrlRefererHTTP(BilibiliDomains[i], Referer); + } + + string configFile = HostGetScriptFolder() + "Bilibili_Config.json"; + if (!isFileExists(configFile)) { + HostMessageBox(configFile + " 配置文件不存在"); + } + ConfigData = ReadConfigFile(configFile); + if (ConfigData.debug) { + HostOpenConsole(); + } } string host = "https://api.bilibili.com"; @@ -74,69 +68,18 @@ string GetDesc() { return "https://www.bilibili.com"; } -string GetLoginTitle() -{ - return "请输入配置文件所在位置"; -} - -string GetLoginDesc() -{ - return "请输入配置文件所在位置"; -} - -string GetUserText() -{ - return "配置文件路径"; -} - -string GetPasswordText() -{ - return ""; -} - -string ServerCheck(string User, string Pass) { - if (User.empty()) { - return "未填写配置文件路径"; - } - if (!isFileExists(User)) { - return "配置文件不存在"; - } - if (ConfigData.cookie.empty()) { - return "未填写cookie"; - } - string info = ""; - JsonReader reader; - JsonValue root; - string res = post("https://api.bilibili.com/x/web-interface/nav"); - if (reader.parse(res, root) && root.isObject()) { - if (root["code"].asInt() != 0) { - return "无法获取用户信息"; - } - JsonValue data = root["data"]; - if (data.isObject()) { - info += "用户名: " + data["uname"].asString() + "\n"; - info += "uid: " + data["mid"].asInt() + "\n"; - info += "等级: " + data["level_info"]["current_level"].asString() + "\n"; - info += "硬币: " + data["money"].asFloat() + "\n"; - } - } - return info; +string GetWebAccountUrl() { + return "https://passport.bilibili.com/login"; } -string ServerLogin(string User, string Pass) -{ - if (User.empty()) { - return "路径不可为空"; - } - if (!isFileExists(User)) { - return "配置文件不存在"; - } - ConfigData = ReadConfigFile(User); - if (ConfigData.debug) { - HostOpenConsole(); - } - - return "配置文件读取成功,修改完配置文件后需要重启 PotPlayer 才能生效"; +string GetWebAccountDomain() { + string domains = ""; + for (uint i = 0; i < BilibiliDomains.length(); i++) { + if (i > 0) + domains += ";"; + domains += BilibiliDomains[i]; + } + return domains; } bool isFileExists(string path) { @@ -145,7 +88,6 @@ bool isFileExists(string path) { class Config { string fullConfig; - string cookie; int uid = 0; bool danmakuEnable = true; string danmakuServer; @@ -169,16 +111,6 @@ Config ReadConfigFile(string file) { JsonReader reader; JsonValue root; if (reader.parse(config.fullConfig, root) && root.isObject()) { - if (root["cookie"].isString() && !root["cookie"].asString().empty()) { - config.cookie = root["cookie"].asString(); - array cookies = config.cookie.split(";"); - for (uint i=0; i < cookies.length(); i++) { - if (cookies[i].find("DedeUserID=") >= 0) { - ConfigData.uid = parseInt(cookies[i].split("=")[1]); - break; - } - } - } if (root["maxliveroom"].isNumeric()) { config.maxliveroom = root["maxliveroom"].asInt(); } @@ -259,11 +191,8 @@ void log(string item, int info) { } string post(string url, string data="") { - if (!ConfigData.cookie.empty()) { - Headers += "Cookie: " + ConfigData.cookie + "\r\n"; - } log("request", url); - return HostUrlGetStringWithAPI(url, UserAgent, Headers, data, true); + return HostUrlGetStringWithAPI(url); } string apiPost(string api, string data="") { @@ -559,9 +488,10 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array 如果你不希望手动获取 Cookie,这是本项目与上游版本最明显的区别。 + +## 其它改进 + +### 📺 直播 + +- 支持 AVC、HEVC、AV1 +- 默认使用低延迟的 HLS/fMP4 流,无法提供时回退至 HLS/TS +- 支持直播备用地址 +- 动态生成直播画质选项 + +### ▶️ 点播 + +- 修复部分 Host 为 `upos` 的点播 URL 播放失败的问题 +- Bilibili 点播更换新接口 +- 优化 Bilibili 音频画质选项显示: + - `EC-3` → **杜比全景声 EC-3** + - `FLAC` → **Hi-Res 无损 FLAC** +- 当同时存在杜比全景声与Hi-Res无损时,默认使用Hi-Res无损。 ## 安装插件 -[下载项目](https://github.com/chen310/BilibiliPotPlayer/archive/refs/heads/master.zip) +[下载项目](https://github.com/frostnotfall/BilibiliPotPlayer/archive/refs/heads/master.zip) 将项目 `Media/PlayParse` 路径下的 `MediaPlayParse - Bilibili.as`、`MediaPlayParse - Bilibili.ico` 和 `Bilibili_Config.json` 三个文件复制到 `{PotPlayer 安装路径}\Extension\Media\PlayParse` 文件夹下。 @@ -16,19 +55,21 @@ ![UrlList](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/urllist.png) -## 登录 +## 新登录方式(旧cookie方式已弃用) -找到刚刚复制过去的配置文件 `Bilibili_Config.json`,填写 Cookie 等设置内容。 打开 PotPlayer,按 F5 打开选项,点击`扩展功能`下的`媒体播放列表/项目`,再点击 `Bilibili`,然后打开`账户设置`,填写配置文件路径,如 `D:\DAUM\PotPlayer\Extension\Media\PlayParse\Bilibili_Config.json`。每次修改完配置文件,可能都要重启 PotPlayer 才能生效。 +打开 PotPlayer,按 F5 打开选项,点击`扩展功能`,此时有两种登录方式,任选其一即可: -![Settings](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/settings.png) +* 第一种,点击`媒体播放列表/项目`,再点击 `Bilibili`,然后点击`设置`,此时弹出一个网页进程,按照正常网页端登录即可。 -点击测试按钮,如果弹出账号信息,就说明登录成功。 +![login_1](public/login_1.png) -![Test](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/test.png) +* 第二种,点击右方向右箭头,找到`网络账户`并点击,然后点击`Bilibili`,最后点击`管理账户`,同样会弹出一个网页进程,按照正常网页端登录即可。 -### Cookies 获取 +![login_2](/public/login_2.png) -[获取Cookie](https://github.com/chen310/BilibiliPotPlayer/issues/62#issuecomment-1841909583) +### 网页登陆界面 +注:窗口大小可手动调整 +![login_web](/public/login_web.png) ## 使用方法 diff --git a/public/login_1.png b/public/login_1.png new file mode 100644 index 0000000000000000000000000000000000000000..ff933efae8e429b3d691bf8501e7a866644758e9 GIT binary patch literal 150771 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

` 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 literal 0 HcmV?d00001 diff --git a/public/login_web.png b/public/login_web.png new file mode 100644 index 0000000000000000000000000000000000000000..0e2442459821450f3e647c22f102ec011bb9445a GIT binary patch literal 726830 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

kz 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%0Ayi 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 c|>`|HM!{7VWyGGRaWbV~FL}+DyC0p!w-oP#8 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

L_;QYcQFP!^Ur_#~Ka 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�D*i-k0mNQ@8pSqH+ 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ℑr@^H^l^z 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

FhYcA>A)?Q6I4OuNsz7lMN7>)g)awJ%cm^%_| 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

U@Z=?8zLPQ;P@J z{FX}>at849xqzACf42$Ayh&Gh(~&NYs~CGXqTuNw_K8l-daK+oUH`YxgE$0bh)52syQ-&_k_Tsn8?#OgJiHL7m&`W|ILH{kU;{DDB zsnaq()puq+5XXKe8BrnljqM+mQ`94Pyx2{2a->~5sE3*LP`b zQ3m+&MZUiuEGsSaN=N4;%Z|CP$_)iPpP>EC50N^t8yl1R=9MTQ%LF3r`z4{(VH{%h zD5UWSf>sH%bO-3J!o_I*;rj$>Oyip({5^oKYuxN;jRxd$;77=U2_!Hd{^zFJ2cLwW zg7@r#Cq=KUXl8SP+I2)?zaORI)He83AP>1BTB@e4?J4Oc{ZE6i!!r^7(=i$Uc<#lV z4cnZD(cF9-dkC$!?eHNd&ar)C5n}At4iZD9-+rELk0;h^yhCttW1fU-W!0F1_v{8E zxStJ)Fg#h+%a&z+j}jpRo>c!`e@8*g%H#!M})n=N#=Y`{u(V`cxd7NB@q@bb5PPTxp{ zC*0>bkm91iqMUg4*~@e;vwq4HF%(XI1bCTOzY?frQQ1e2zJuxxdbHFq5oG-bWo;{0 z%PJG7fNkA>;T~K0drc|ThBt$6iyq03|Jb}Tt0kH{TJ&ulA8IQwS&Tm8zW9jz`Gv|3 z59zWAf4(pw6iZKkmrT~GOGD_f3ehrUBgEn(l^rCQm#5WbIbqtgGE;Kc#tT9{qcGnb z8!jRGQT?8CS3T!GG8FJYQ}A~9TT2k{k(8b$%KGaP(GGzEFTz?IIYnG40)AB#wQP|n zro^Dagz6+DM4DhTr*UstyfUc4cW#)g1P@o?rkSqLmKOkzve&y@Y|PgtDf=6fzqL|U z#Jn6wL9^?EJJ?0pjS)iQG5FlIv=+qrETA-4?IqKA?VAd%3q#}|^UiyOoWy6sSz9H? zzmZX?olLRQ&lPUhc@LdO;oBU)^8dG~G){c8ev=M+;Mzkz(M2tP8QF4EXM)Ywg!m z1JV`5q1U({{RE2pr+^vWMnwRo@~H8(Y1@Fm*I=PtVCgt(%Osjgj9(q0;3EH`KwYuPI&ey@@~C(wqVBTfVafE9vVD zQ#D48>S8A6rdLd!&II~1HSG0(C>-mwF+EheLSFQzEcR{aA5VyfTm|hVjYZ>{SU}4p z#1~EH$>v);pB--XH&L1)>9~`BRV}J>IdWNRJPmnKOoC=jm3mLCO~cAn2UWXn42p^} zz;UWA`HY03jTQ3(@nNWKT!r!{YD?BK`;?6qXyv8O32Du@U5&n`mf>&I1qrr~^N2K5 z^2vFajRL*MXnfzn>Y7Ga#dK&pBkI{s-l)5KY`S>&-1@lFUgh9hrOQ`vihCSMr1yV6 z`s$gd)xA7uW6{&=bq!K_6o*jVINDMvU_)IlM+JKfLxh?R6eXoKJp0^frvP1oEKibc z?G_+Ulfn%vq$py}^O_yxNB0duPCMu*hsN;y^wQW@W~oQ z=I*ItUbk3?Mwg#F9Rx0`PCl}Q1gH3+N(fg)Uxn&d6mFhW(vlitPVIbuIS{-FJFw{3 zF3^qSl*EpM4Njlr8D@g#pXJCL9brVh*&DDXkA1omZy@kOJlD|JJWLv<-}^kwnvb0W zBV>9NBczd5cVsR@DsW!&k|Rp|+64m?6rfa{n_y#c%!N+kU>0!+?_Ke6%+j-3>K~dx zsZnDQ^^Qt$5MrlbZEFflGYYS-bSZW79`bWw!u+NEz6v1n!6{{iEqd9xEE#MF`BD4` z#*;UsHk+jF{`5BH#}So)(T(K^BPrvZ8IG;hiUG?0I90pc&}2+^w|F{PD{5d2M13wFBcn39k{WhI z+xCpkd>Kx}r?!tz_yo9RmtfKt6!k@`7Hzm3NsbPSd};Z?ou%(g#cb0;KTez=eZ_=( zEH57#Is%ROA~l(CX&L&=w{ulP*(+H`BN`mk0h60jZ0Tb=(8EZIDUU4L2fk)Hzr$#} zkf&u}IJuW&teAP{YU=S9EmK+ZzVg?I%agUbXT^p&jZF%&3d2KD84DV!7YH7$1yf#= z!wo%rvIHm2iWdJ-FI$)8Jf4PuFw1QpZ02BFy46Yrh| zoZJ3TX12p_=_}Qj$y|&r_uaYId#?9BNsvAHfWdyJlu=3C(ha#|j>ZZ4M;SLa6eQ}9 zI_vBQ(BVT7ISO8VlJ}NN-8|&7QCXfXor-E7zH}ueR6(xw>z{a$(c;-K1wURkks@m+ zJGyPA3?ep0-OzHA{ix`C;lm^+=DOtmj6C5%naY}I#KY;q&*lyD{wKYpu90FrcJS?&7^*6+6Xy4Gv7+`7Ts}!vc^C7>wV>cY!@A#D{V*aA`E)ndh%3i^WAES-D>w2bs08rU?Zw+YU_wyjd95=zd#S5>KDVuV^n>I{_xT=BOCQ%? zwrtAtX#iMehB(`W>xum=-&JI~dbXn}?xU4r(!T79{FWEiqxamqO7%|6nX)OVRJw^* zP5@>_TYxGaIII|(5)3R6yFp|aTTTupw5?`Z{)d{Q8AelC z&JTD*XvR|)Tq)`0?M!z3#Zm3Ln^zIu;g0ELHAe;uRsz)lAIRpk;DnNymvhDR1$`UJ zYs@`ksC9?gDiKrKh2xTi{UvcCTF?*~eWUiqZ5EG?AKDLyeFsY#&p!7%FAj*^`w)xQ zQ0h(4lZIu zeDb1s;55soJ~!vJS-R(8weWR*Og%P&D17)y*zKeciPh4?XZJCrmuV!0#qrgF82B^~ zm9L#l9Yw6@6yVm{#BF$1yKCz^uyLF@e$P(BG7kUGAO=Uv4>bPN&nSQ#h&f(mMCcp2 z=f+SD@4Y-Q)kzw!ROC_MN`-!kF&;*AabODWl$zL8PpK}~$@eIWC`S(&9>eDq)GQ3E z1M{$}3penvn&e^5h2JM-yLdOoaj{&q;*Q(I+u0ivsv*DS7VrkkXwF2DIB# zUh)v7_|BnU7;QREpE);H?AHKSPNt4jF3a|~_$zL}DA3^rS2-a*)qjp&^YkPs<`WlY z%?*D>(UK+P1dFO_8Q^VoI)TO5jVR7@D5^2sYayy4Jb8RoZW3-mem;6g!+i_X!gaLg8V%prqzHGByDTGY3;oYTQgN1*J zXAs?SuPaT}Zi(GG0r#2oa`aW@G*=e5xrB{5Wg9f-Z*K!0(NJAP4}7uTK&-0xFL?JN zMsP)56u3hJ%L`Lj<`|7!hu7jO1K3)24f?n&E?3jTrND!$=nogwfO{4)aRo0 zKgTN(DhuNQJy7$d?3!<(N6fwL{Z2CTe@lQr&uPDIj;eF|Ko6PPwg|B<^ielgntH#( zhSGhyrmdC2qtvTVGgKuKRylMswI_nUU=6X3-Vj~=La%%?)%hOLIO2b9AP_X0aX?;X z(}V5&1u*D4X#%yM>6Jh!iQfOcQfvyvV;?)_%nv^mWaIwcblx3~7kI8SB zm5-$&>sa73axHhjA@iCvi7Vw|B*b6*#RJ{>4kowyfqCtm&6i`;K;=`ihfP+o%8i&g z<@K<;b+aoin{pm>je0^~;C}a~VQz+Wa($A!3Cx;(d=wv@l9LU|@*YCnBl9JcrTvQ* z(KyUP(MX_SDX5YE&mM0^0=h*E5F|9G?WDDfx5~ntfN~GjA{s%>=?^rlfsI-%b^Y+q zzx&Ts#mB==RSt$KsjRIco z`k`+H^BEIppXl{3yTt!yw#^$zdq`9<&iePEyB5-$&S-c5QA5LE;|p`XTIH;QmRs6M zX4{fM^R-~IsEdyVDG&sd>@&`6wmAbiFwp}csV4zoMG5%8W8cQa{U!Y7RxvHo-q8^F z;FF#rKZ*y{T0#L!k8kN<0Y*G6MBua!!VU+8!!g;bE(-D76%*^e{rv(ThE2RsXXE=l z5fw*I=^(y+>|ZFp4nFBPH3%Ho7oh{u{X7%xm#qbRUAPa?TCx+K05>=P)p-S)iz+=H zq2HgBbk_Z^GJIb#_yO=#HlAF0qQ;Riy^Q!eDW4U>ffk|mOYjFvAdClcxCeb7_>#LN z+Pmk~le>L}zr3#qFa>M(y+KfBgC4nFZsZ z`%p<(_Jqz5l{4-E5|Hbc8R2(8YeYiAbBmBUN6jT!Zymk4TYTNTSiQGc8QC%DK($?; zQ6M6Os>Q8$5W%Z-gN$MH>w&I{r zyU{EtRC0x{BZWNI`l@G4qpNrhL>ywC>Y>iKLllx1YnNetpV*_O`8FEZ^FaIZBxUEt zYu0O7>IPz_oO5LrGD=hZgrxpiDgl+WK8D(#-0|p_)rkVGMdb3AoV~0XKsm=8nTuK7 zMY8fpxwHGk-ix4Sale`AXD+T7GwXa#2E5ghyR!TampEI2&f@H_OleRS;c+=Z#$^s{ zR2nbh`50GA!)F$qTjoo5c}_nui5c2Os$BodW>>i;r5sT)>5h1Q=)z8vg2Ug*PmuKQGx(mTpP*yJC82-9-^~_BB<8~7f#*eB= zsVdh6GWJ8?ju-PYfUcHB6nPKa^k9$a+ley#86DDM6ueQ|sDxO?9v$=c{tIMFFQR?M zT5nz1-ylz9qan6v-D`E&I@iO*9cp|xSspPU?PWG|VV>Ya+*hzMCB9*^P+2(>)swSU zpL2_6?F)SYO|oU{to(YcXi4hDjVNJ*=rlL0`eqw89qzi&#M0QL2#aZxJhN!3r<-y+ z-Nm+5GsP%wIai^wSVZ(p<6MbJi9br1tw2`|oTsH^#uSf?X7buG z%H%7x0%OEifqcZO%La78v2ww&2hiB^*y<=w-^c5GBT4ZFd%ZmA-p7xA9)&k(>y3%jdm^kvRsyDl%{MY)oNFwmcO7VJb`OcIGi<>Sgn&h#h{mYd0U>5rXWWLa5h z{6!w@;#o4mzI7j<}!RgXx>zu-bg_#oatZivIGc2Av z^0VDBu#A^SL&v6h2UCt_v@RS^;;9|gzA;!j=~wsasKUzH&HQ7^Zv3l*U z?GQ44An}Z%F1TzIubLILIWoZEBj9TMBwW5b2}jtqZeZWvxchPq(cF~ZiLbu(plal} zT%bU~h2G~!F6r0?#{*m4W{l&c#vOl*GZYoWN859uRYyxvrzMzQCwwBLvJgFBFms#S zKJViOLPQ#u-?nUjV6Cm$AFi9$=m}-VSeLA^Gpv{m3yuc)Xlvq@fvb%!9~SMQtWQ#G zLC?5{aj9At%u&BxP?&Y4_7an-@o)K+Q>YKndG=CacHGc&Itb$kZF$HiQ>>8k*H=`h4_>XJp@CNC8=vu5<(tQkM_TT2lbfA+_Ahe1e z0>XtSuABpty@E(N`JzSfvmJ;z|9&-wEa^WChAD?0qUnHp>sK@`7$6wt42=$Ld59Gk zx~)%b1H(T>GYufK=TP9?IV}J$^P@F2Ex2!CJasp$Z+s~5a3M!s@QVl87Ln^$)Kpe9 zp0~8Me*SH&#Q)i|so|J!zH02$C{{T2Bp9&7>)&3z^f?F;nIz}NUpC)md~N%)AocPM zDn;BcjRA~kW%EDUp8oP5AU#P-HvdQPf6re0chKK6691Lc;FJIKss3MjgWkCIUwZ`P zwn56`zp5YfX92mAe{YXn6d*7KO$`P97} zvWtNl28@>SnIyO0nOic1S1CJ3(V%-24>`SktI zBd-VNLEVDwW60f17RK-IER-AbhVKQOaW8d_lXj}mUU*>-RQtcLET05`Byy<2#!4IZ-a2TmDX1N!AVK#JbR9 zN)bw@-Qg+p`BG}kHUg7^F@EjhY9FqPn=B@N+RrWDku@+_FYdXIXLV}dkdlC&f}gsd z8hm1f@D`EHBJg!kF+R!XdAH6CGrGv0iHaAn{G`gsdw(SRK_#=b=u!nlXt!bheVgh% zS%fF1wco7vZcsVlEe$e76eWRi3h~C3oB9cb>1ayOMLMCb*B1n>WD&+LrAV7rd8 z(oL_?yVU;4+5Y7RHJqA%q4;tAuG>l#KE3)RAj{wtMB3huF!t0N^r`IrTAQ?)cWh>QO%FI(5@bXvM?JLU@Yapdm*E6%C!@Vo^o_MN%5;-GA<;Zeh zQom=RXcM(c#uWE_e<`%9qY{1yY4ZBu1^Y?P75FI}_4uW~alXPx`;7rXJ#ssTLgvj6 zlGgXXl$Eb(I~5wdf(|JxT%9(3Td6Sbb=#brcafpNiDh*O8aI7kmp$n4?Hbh#5Xt&= zQ#kIsUTX`?#C)lL-nQeEQ8T?I_SUCeSLj!2R0o*6mAtu-&*frC@bUAa^Dfbxq;UC>&hz ze0ZOi&Efum_%c>1qnYqW0uOPq<|Tn|b58Fvym@8# z?<5|1`

Hy>&5NhpjNU!Jx>xq$L&qTK<@|aRz6e{_Ii5;*3uI>S<$Abk8pn(@s_# zYcmH3-)%`Pp`&cL_L#YuX)>&cdfjv7jYxy92k#xWi1wZo#ir#!d3g40ZGlQ{3$Edb zq$|z)d}W0&gdh}KbSNxNIFDy57kxY~Pfg@U%0yTP<9VYyjEkyL+Lx;*=T1iH_$!Wg ztGceyo;J&O$-_7Y+WPaIggSL9e?wgB9%(8aUl%+w?~+TdzcDsD+%8sGO$_phz<`p~-8+rK6zs0R;HCHNJ;q}*L9`v|8eQ5e)wG3IaqXPHZYsR!bZyL3Hm zN}+{Emv5o<_Q&g2?v%Zwbbc%I8S=`=ZIsEgias0q_vlk?sS{nU`S_yx+AM`+l;8BU zI9jXxUxD`2t*K=z|GP@b z2^BM6-PgoWn8+cJwY!;GM?bDwWV+CTMzLZ!A_bno-F;1iOolN;NHI9XVxS4ZbvDHG z#Iv_9DtEZpCJ6RevoYA~rk9c_%%OxE&cb+Ibkca>px3grjWIpcgo3yx);2QTE7UBQ zp-h#j%e5rn z%$J*eUVqxdeDr1T?6h0;N^n{}pPIG}TSnn%{-D2ManzVtvivh{IgdQe zb}@CYZ%gUqj&Q!7^x)eGLnnuK+xQIIj07$LUUyFhj440bFh^{pmIJ5JrCOVf@6cGm zE>>B9wK&>|I$!x#{@eOI{A%%V$#}4kxpN}DQP-W@)%dLSwHoQ_3Zy2 zwVioXQ&%3x&(V&!ATk0%b&x4g!zPGBsS*qo1awl20tyHr7KtDbD0^|T)CDPmSUgN4 zU`UlsDLX<)LXw$E5-=c?B@q&NY$1>k0wPN`G6{5X@XVj{`|G}Q?tSl^-+kwI-{*I~ z_xFx&?=i<4F^&zv$T{hWeWu&|_O!YC9ltDS5kCnuc*H#!GMPTtsqvOZw%WsA9XG9|?`nA5T2s{~cCF!ho3>TmQv?dFgww8l8C7oWrUD;}0u(BKaev=F zxVm!EQK85gj;UMtJ(4eDg3-Lw0z>WgJFdis&QN^@$EEqtoZ58&vPiXF8!=ncPCCfP zMq6AIO*oqgELmPFed0$E*N}FjOl!KE&tMGN+2_!CJvX9MOh$>?f?ZXdK8$0EBnH1wrF-?<$?ywA6F!i z^4DZHS^y!T0sYu4P;_@xNB`Yu?+5r$QyD-KIIgd4BzOk6)7gc~Nn|bA-B;fX$MXQU zWgqbJ8IhH+y}};P2^c&{qN4Nq!9up-3amcPyz*ijjmnr5{B$4l4PcOeWYY4Up=UDB z63FuI`X0Au3V^?5Q1glb&{tn3&IKov8(>RtBbL+KZ+-RCXu9J0w=7LRKP_Hj(4Y@wThg`0FDA)Bagmbt@j+WX@^HBmIf< zfJp!Ll6YDpSmjC2PYSo_g&4fdr>v@nA?eUxU;2G=$bdG7dZi(*2||@nXG`glh^=OJ ziaEp1l}qz#OF&NyJ{5^24ekBG#A;xwxjK2C7S8>fN69=j+@dtG&8wfBmOXqlAuE6) z{k-=OGm)phz|Ih+SuM-89x%acNC($OW=Vj=k2vV+CX3cqracyZrgS(ud($^yY)7Y= zxcY!Y)M5{l8M+NxFjcM3YO=#Xf?p|mG86$!?}}%ZK!k^fp*qRYqqoWhhKyRwDGz%t zY#LzWxJxOVlLX4A`sA-e_!Q({0>XOi2!oJ2D(B9H5dPr{C>!A^WT>=^4~K+iymW3? z8%-h$OrDZyL&Pd~IGZJ(;oSS1ykuQ{$frXnInU+s0`kaJh~Bh59~6KZb8Ui;%ieKi z^YJ@4F-Fg#g2)#&xNe*#)e$!)Q`3HaH-s``g;D%c+@F~YL~V8mhnTBVGJWx;kT%|H z-w2k03lY|Nksz5p50Kwg+&o{yZ~_Rhh%c0F*zT&j-RYLeYak*k%r3 zRUso`l?GrZ^UqQBo5CY)ZK*DO#sa5WAoOMdt548J7~od3Ha^@MKvj^eSJMi;ipw2- z@@U>C<$t2hky(6l``qI|#vUad{CvvTN*{$s#TvRm`i+~41)t_?yRPGjDYHL&ll zjP8h-kN97GuDt+VmD$tBKOU;nutG?xM|5=Y-J#7-}tTX*J?X}cj`pRTD$DKE)v$ZW^H~Q z{H?jJ#DdQ1OV>5P+E$vePV=m_f92`^BcQX_x)LGl_J6t=sIyVyLEq;-R;ebFbPqb? MefCtX=jEIK0mQHkNdN!< From f50591dbef61cf0ba460a5b8416923421e215197 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Wed, 26 Aug 2026 03:32:35 +0800 Subject: [PATCH 081/132] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=B1=8F=E8=94=BDP2P?= =?UTF-8?q?CDN=E5=8A=9F=E8=83=BD=EF=BC=8C=E4=BC=98=E5=8C=96=E5=88=9D?= =?UTF-8?q?=E6=AC=A1=E4=BD=BF=E7=94=A8=E4=BD=93=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 177 ++++++++++--------- README.md | 23 ++- 2 files changed, 108 insertions(+), 92 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 130c185..b26493f 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -29,10 +29,18 @@ // string GetBroadcastListUrl() -> get broadcast list url // string GetBroadcastListScript() -> for WebView2::AddScriptToExecuteOnDocumentCreated for script process - -array BilibiliDomains = {"bilibili.com", "bilivideo.com", "bilivideo.cn"}; - Config ConfigData; +string ConfigFileName = "Bilibili_Config.json"; +array BilibiliDomains = {"bilibili.com", "bilivideo.com", "bilivideo.cn"}; +array knownP2pCdnDomainPattern = { + "302ppio", + "302kodo", + ".mcdn.bilivideo", + "szbdyd.com", + ".nexusedgeio.com", + ".ahdohpiechei.com", + "upos-sz-mirror14b.bilivideo.com" +}; void OnInitialize() { string UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36 Edg/151.0.0.0"; @@ -43,10 +51,11 @@ void OnInitialize() { HostSetUrlRefererHTTP(BilibiliDomains[i], Referer); } - string configFile = HostGetScriptFolder() + "Bilibili_Config.json"; + string configFile = HostGetScriptFolder() + ConfigFileName; if (!isFileExists(configFile)) { - HostMessageBox(configFile + " 配置文件不存在"); + HostMessageBox("配置文件不存在\n\n路径:" + configFile + "\n\n进入设置→<扩展功能>→<媒体播放列表/项目>→选中→点击下方<设置文件>进行编辑\n或\n手动建立该配置文件", "配置文件不存在"); } + ConfigData = ReadConfigFile(configFile); if (ConfigData.debug) { HostOpenConsole(); @@ -68,6 +77,9 @@ string GetDesc() { return "https://www.bilibili.com"; } +string GetConfigFile() { + return HostGetScriptFolder() + ConfigFileName; +} string GetWebAccountUrl() { return "https://passport.bilibili.com/login"; } @@ -97,6 +109,7 @@ class Config { float danmakuDisplayArea = 0.8; float danmakuStayTime = 15.0; bool showRecommendedVideos = true; + bool blockP2PCDN = true; bool debug = false; string danmakuUrl; @@ -148,6 +161,9 @@ Config ReadConfigFile(string file) { config.danmakuUrl = config.danmakuServer + "/subtitle?font=" + HostUrlEncode(config.danmakuFont) + "&font_size=" + config.danmakuFontSize + "&alpha=" + config.danmakuOpacity + "&display_area=" + config.danmakuDisplayArea + "&duration_marquee=" + config.danmakuStayTime + "&duration_still=" + config.danmakuStayTime + "&cid="; config.subtitleUrl = config.danmakuServer + "/subtitle?url="; } + if (root["blockP2PCDN"].isBool()) { + config.blockP2PCDN = root["blockP2PCDN"].asBool(); + } } return config; } @@ -452,12 +468,7 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array 0) { - url = data["durl"][0]["url"].asString(); - } - if (data["dash"].isObject() && (!data["durl"].isArray() || data["durl"].size() == 0)) { - if (!ispgc) { - string flv_res = apiPost("/x/player/wbi/playurl?avid=" + aid + "&cid=" + cid + "&qn=" + qn + "&fnval=16&fourk=1"); - if (!flv_res.empty()) { - JsonValue flv_root; - if (reader.parse(flv_res, flv_root) && flv_root.isObject()) { - if (flv_root["code"].asInt() == 0) { - JsonValue flv_data = flv_root["data"]; - if (flv_data["durl"].isArray() && flv_data["durl"].size() > 0) { - url = flv_data["durl"][0]["url"].asString(); - } - } - } - } - } - } - if (!data["dash"].isObject() && data["durl"].isArray()) { - url = data["durl"][0]["url"].asString(); - qn = data["quality"].asInt(); - dictionary qualityitem; - int codecid = data["video_codecid"].asInt(); - JsonValue qualities = data["accept_quality"]; - if (@QualityList !is null) { - for (uint i = 0; i < qualities.size(); i++) { - int quality = qualities[i].asInt(); - dictionary qualityitem; - int quality_codecid; - if (quality == qn) { - qualityitem["url"] = url; - quality_codecid = codecid; - } else { - string quality_res; - quality_res = apiPost("/x/player/playurl?avid=" + aid + "&cid=" + cid + "&qn=" + quality + "&fnval=16&fourk=1"); - JsonValue temp; - if (reader.parse(quality_res, temp) && temp.isObject()) { - if (temp["code"].asInt() != 0) { - continue; - } - JsonValue quality_data = temp["data"]; - if (quality_data["durl"].isArray()) { - qualityitem["url"] = quality_data["durl"][0]["url"].asString(); - quality_codecid = quality_data["video_codecid"].asInt(); - } - } - } - int itag = quality * 10 + quality_codecid; - int trueitag = getTrueItag(itag); - qualityitem["quality"] = getVideoquality(quality) + getCodec(quality_codecid); - qualityitem["qualityDetail"] = qualityitem["quality"]; - qualityitem["itag"] = trueitag; - QualityList.insertLast(qualityitem); - } - if (QualityList.length() == 1) { - dictionary qualityitem2; - if (data["durl"][0]["backup_url"].isArray() && data["durl"][0]["backup_url"].size() > 0) { - qualityitem2["url"] = data["durl"][0]["backup_url"][0].asString(); - } else { - qualityitem2["url"] = url; - } - qualityitem2["quality"] = "- " + getVideoquality(qn) + getCodec(codecid) + " 备用"; - qualityitem2["qualityDetail"] = qualityitem2["quality"]; - qualityitem2["itag"] = 1; - QualityList.insertLast(qualityitem2); - } - } - } } else { log("Video playurl response code != 0", root["code"].asInt()); log("Video playurl response message", root["message"].asString()); @@ -605,7 +547,9 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array History() { return videos; } +bool isP2PCDN(const string &in url) { + if (parse(url, "os") == "mcdn") + return true; + + array parts = url.split("://"); + string hostname = parts.length() > 1 ? parts[1] : parts[0]; + + int pos = hostname.findFirst("/"); + if (pos >= 0) + hostname = hostname.substr(0, pos); + + pos = hostname.findFirst("?"); + if (pos >= 0) + hostname = hostname.substr(0, pos); + + pos = hostname.findFirst("#"); + if (pos >= 0) + hostname = hostname.substr(0, pos); + + pos = hostname.findFirst(":"); + if (pos >= 0) + hostname = hostname.substr(0, pos); + + for (uint i = 0; i < knownP2pCdnDomainPattern.length(); i++) { + if (hostname.find(knownP2pCdnDomainPattern[i]) >= 0) { + return true; + } + } + + string subdomain = hostname.split(".")[0]; + return subdomain.find("302") >= 0; +} + +string getFixedURL(JsonValue &in data) { + string baseUrl = data["baseUrl"].asString(); + + if (!ConfigData.blockP2PCDN) { + return baseUrl; + } + + if (!isP2PCDN(baseUrl)) { + return baseUrl; + } + + if (data["backupUrl"].isString()) { + string backupUrl = data["backupUrl"].asString(); + + if (!isP2PCDN(backupUrl)) { + return backupUrl; + } + } else { + for (uint j = 0; j < data["backupUrl"].size(); j++) { + string backupUrl = data["backupUrl"][j].asString(); + + if (!isP2PCDN(backupUrl)) { + return backupUrl; + } + } + } + + return baseUrl; +} + string parse(string url, string key, string defaultValue="") { string value = HostRegExpParse(url, "\\?" + key + "=([^&]+)"); if (!value.empty()) { diff --git a/README.md b/README.md index 30f5d83..2044c85 100644 --- a/README.md +++ b/README.md @@ -3,17 +3,11 @@ 适用于 PotPlayer 的 Bilibili 播放插件。配合 [油猴脚本](https://greasyfork.org/zh-CN/scripts/461800-bilibilipotplayer), 可以直接从 Bilibili 网页调用 PotPlayer 进行播放。 -本项目源自 [chen310/BilibiliPotPlayer](https://github.com/chen310/BilibiliPotPlayer), -并基于 [juening2000/BilibiliPotPlayer](https://github.com/juening2000/BilibiliPotPlayer) -继续进行修改和维护。 - -在上游项目的基础上,本项目根据个人使用需求进行了进一步的功能调整与兼容性修复,主要用于搭配 [vs-mlrt](https://github.com/AmusementClub/vs-mlrt) 的学习与测试。 - ## ✨ 主要改进 ### 🔐 直接网页登录,免手动配置 Cookie -相较于上游版本,本项目对 Bilibili 登录方式进行了较大的改进: +相较于原版本[chen310/BilibiliPotPlayer](https://github.com/chen310/BilibiliPotPlayer) 和上游版本[juening2000/BilibiliPotPlayer](https://github.com/juening2000/BilibiliPotPlayer),本项目对 Bilibili 登录方式进行了较大的改进: - **无需手动获取、复制和配置 Cookie** - 通过**网页登录**完成账号认证 @@ -34,6 +28,7 @@ ### ▶️ 点播 +- 支持屏蔽 P2PCDN - 修复部分 Host 为 `upos` 的点播 URL 播放失败的问题 - Bilibili 点播更换新接口 - 优化 Bilibili 音频画质选项显示: @@ -106,3 +101,17 @@ ![Create_Playlist](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/create_playlist_1.png) ![Create_Playlist](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/create_playlist_2.png) + +本项目源自 [chen310/BilibiliPotPlayer](https://github.com/chen310/BilibiliPotPlayer), +并基于 [juening2000/BilibiliPotPlayer](https://github.com/juening2000/BilibiliPotPlayer) +继续进行修改和维护。 + +# 声明 +- 致敬原作者:[chen310/BilibiliPotPlayer](https://github.com/chen310/BilibiliPotPlayer) +- 致敬上游作者:[juening2000/BilibiliPotPlayer](https://github.com/juening2000/BilibiliPotPlayer) +- 在上游项目的基础上,本项目根据个人使用需求进行了进一步的功能调整与兼容性修复,主要用于搭配 [vs-mlrt](https://github.com/AmusementClub/vs-mlrt) 的学习与测试。 + +## THANKS +- [bilibili-API-collect](https://github.com/SocialSisterYi/bilibili-API-collect) +- [Make-Bilibili-Great-Than-Ever-Before](https://github.com/SukkaW/Make-Bilibili-Great-Than-Ever-Before) +- [hgcat-360/PotPlayer-Extension_yt-dlp](https://github.com/hgcat-360/PotPlayer-Extension_yt-dlp) From 3b5daa706c77a1f3d3d5eb2c7484f77a7e8095ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Fri, 28 Aug 2026 04:12:14 +0800 Subject: [PATCH 082/132] =?UTF-8?q?1.=20=E9=87=8D=E6=96=B0=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E7=94=A8=E6=88=B7=E5=90=88=E9=9B=86=E8=A7=86=E9=A2=91?= =?UTF-8?q?=202.=20=E6=94=AF=E6=8C=81AV=E5=9C=B0=E5=9D=80=203.=20=E5=90=88?= =?UTF-8?q?=E9=9B=86=E8=A7=86=E9=A2=91=E6=AD=A3=E7=A1=AE=E5=AE=9A=E4=BD=8D?= =?UTF-8?q?=204.=20=E6=9B=B4=E6=8D=A2=E6=96=B0=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 412 ++++++++++--------- README.md | 66 ++- 2 files changed, 286 insertions(+), 192 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index b26493f..cc41361 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -30,6 +30,8 @@ // string GetBroadcastListScript() -> for WebView2::AddScriptToExecuteOnDocumentCreated for script process Config ConfigData; +VideoIsUGCorPGC videoIsUGCorPGC; + string ConfigFileName = "Bilibili_Config.json"; array BilibiliDomains = {"bilibili.com", "bilivideo.com", "bilivideo.cn"}; array knownP2pCdnDomainPattern = { @@ -118,6 +120,14 @@ class Config { int maxliveroom = 200; }; +class VideoIsUGCorPGC { + string url = ""; + bool isUGCSeason = false; + bool isPGC = false; + string pgcURL = ""; + string res = ""; +}; + Config ReadConfigFile(string file) { Config config; config.fullConfig = HostFileRead(HostFileOpen(file), 10000); @@ -169,8 +179,7 @@ Config ReadConfigFile(string file) { } uint status = 0; -string GetStatus() -{ +string GetStatus() { string info = ""; switch (status) @@ -271,45 +280,68 @@ uint gettid(string path) { } // 分P -array VideoPages(string id) { +array VideoPages(const string &in path) { array videos; - if (id.empty()) { - return videos; - } + + string bvid = parseBVId(path); + string aid = parseAVId(path); + string params; + if (!bvid.empty()) params += "bvid=" + bvid; + if (!aid.empty()) params += "aid=" + aid; + if (bvid.empty() && aid.empty()) return videos; + string res; - if (id.find("BV") == 0) { - res = apiPost("/x/web-interface/view?bvid=" + id); + if (videoIsUGCorPGC.url == makeWebUrl(path)){ + res = videoIsUGCorPGC.res; } else { - res = apiPost("/x/web-interface/view?aid=" + id); + res = apiPost("/x/web-interface/wbi/view/detail?" + params + "&w_rid=" + encWbi(params)); + if (res.empty()) { + return videos; + } + videoIsUGCorPGC.url = makeWebUrl(path); + videoIsUGCorPGC.res = res; } - string bvid; - if (!res.empty()) { - JsonReader Reader; - JsonValue Root; - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - bvid = Root["data"]["bvid"].asString(); - JsonValue data = Root["data"]["pages"]; - if (data.isArray()) { - for (int i = 0; i < data.size(); i++) { - JsonValue item = data[i]; + + JsonReader Reader; + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + if (Root["data"]["View"]["ugc_season"]["sections"].isArray()) { + if (Root["data"]["View"]["ugc_season"]["sections"][0]["episodes"].isArray()) { + JsonValue episodes = Root["data"]["View"]["ugc_season"]["sections"][0]["episodes"]; + for (int i = 0; i < episodes.size(); i++) { + JsonValue item = episodes[i]; if (item.isObject()) { dictionary video; - video["title"] = item["part"].asString(); - video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + bvid + "?p=" + item["page"].asInt(); - video["thumbnail"] = item["first_frame"].asString(); - video["author"] = Root["data"]["owner"]["name"].asString(); + video["title"] = item["title"].asString(); + video["duration"] = item["arc"]["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + video["thumbnail"] = item["arc"]["pic"].asString(); + video["author"] = item["arc"]["author"]["name"].asString(); + if (item["bvid"].asString() == bvid || item["aid"].asString() == aid) video["current"] = "1"; videos.insertLast(video); + } else { + log("item is empty"); } } + } else { + log('Root["data"]["View"]["ugc_season"]["sections"][0]["episodes"] is not array.'); } + } else { + log('Root["data"]["View"]["ugc_season"]["sections"] is not array.'); } + } else { + log("Video view API code != 0", Root["code"].asInt()); + log("Video view API message", Root["message"].asString()); } + } else { + log("res parse failed or Root is empty."); } + if (videos.length() >= 2 || !ConfigData.showRecommendedVideos) { return videos; } + res = apiPost("/x/web-interface/archive/related?bvid=" + bvid); if (!res.empty()) { JsonReader Reader; @@ -342,87 +374,103 @@ string makeWebUrl(string path) { if (strs.length() <= 1) { return path; } - string url = strs[0]; - string p = parse(path, "p"); - if (p.empty() || p == "1") { - return url; - } - return url + "?p=" + p; + // string url = strs[0]; + // string p = parse(path, "p"); + // if (p.empty() || p == "1") { + // return url; + // } + // return url + "?p=" + p; + return strs[0]; } -string Video(string bvid, const string &in path, dictionary &MetaData, array &QualityList) { +string Video(string id, const string &in path, dictionary &MetaData, array &QualityList) { log("--------------------------------------------------"); string res; - string aid = parse(path, "aid"); + string bvid; + string aid; + string cid; string title; string url; + string params; JsonReader reader; JsonValue root; int qn = 127; - string cid = parse(path, "cid"); - int p = parseInt(parse(path, "p", "1")); - bool ispgc = false; - string webUrl = path; + // int p = parseInt(parse(path, "p", "1")); + // bool ispgc = false; + // string webUrl = path; array subtitle; - if (aid.empty()) { - res = apiPost("/x/web-interface/view?bvid=" + bvid); + if (videoIsUGCorPGC.url == makeWebUrl(path)){ + res = videoIsUGCorPGC.res; + } else { + if (id.find("BV") == 0) { + bvid = id; + params += "bvid=" + id; + } + if (id.find("av") == 0) { + aid = id; + params += "aid=" + id; + } + res = apiPost("/x/web-interface/wbi/view/detail?" + params + "&w_rid=" + encWbi(params)); if (res.empty()) { - log("Video view API response EMPTY", bvid); return url; } - if (reader.parse(res, root) && root.isObject()) { - if (root["code"].asInt() == 0) { - JsonValue data = root["data"]; - aid = data["aid"].asString(); - if (!cid.empty()) { - for (int i = 0; i < data["pages"].size(); i++) { - if (data["pages"][i]["cid"].asString() == cid) { - p = i + 1; - break; - } - } - } - cid = data["pages"][p-1]["cid"].asString(); - title = data["pages"][p-1]["part"].asString(); - MetaData["author"] = data["owner"]["name"].asString(); - MetaData["viewCount"] = data["stat"]["view"].asString(); - MetaData["likeCount"] = data["stat"]["like"].asString(); - MetaData["thumbnail"] = data["pic"].asString(); - string desc = data["desc"].asString(); - if (desc.empty()) { - MetaData["content"] = title; - } else { - MetaData["content"] = title + " | " + desc; - } - JsonValue redirect_url = data["redirect_url"]; - string ep_id; - if (redirect_url.isString() && redirect_url.asString().find("bangumi/play/ep") >= 0) { - webUrl = redirect_url.asString(); - ispgc = true; - ep_id = HostRegExpParse(redirect_url.asString(), "bangumi/play/ep([0-9]+)"); - log("Video ispgc detected", webUrl); - log("Video ep_id", ep_id); - } - MetaData["webUrl"] = makeWebUrl(webUrl); - if (ConfigData.danmakuEnable) { - dictionary dic; - dic["name"] = "【弹幕】" + title; - dic["url"] = ConfigData.danmakuUrl + cid; - subtitle.insertLast(dic); - } + videoIsUGCorPGC.url = makeWebUrl(path); + videoIsUGCorPGC.res = res; + } + + if (reader.parse(res, root) && root.isObject()) { + if (root["code"].asInt() == 0) { + JsonValue data = root["data"]["View"]; + aid = data["aid"].asString(); + // if (!cid.empty()) { + // for (int i = 0; i < data["pages"].size(); i++) { + // if (data["pages"][i]["cid"].asString() == cid) { + // p = i + 1; + // break; + // } + // } + // } + bvid = data["bvid"].asString(); + aid = data["aid"].asString(); + cid = data["cid"].asString(); + title = data["title"].asString(); + MetaData["title"] = title; + MetaData["author"] = data["owner"]["name"].asString(); + MetaData["viewCount"] = data["stat"]["view"].asString(); + MetaData["likeCount"] = data["stat"]["like"].asString(); + MetaData["thumbnail"] = data["pic"].asString(); + string desc = data["desc"].asString(); + if (desc.empty()) { + MetaData["content"] = title; } else { - log("Video view API code != 0", root["code"].asInt()); - log("Video view API message", root["message"].asString()); - return url; + MetaData["content"] = title + " | " + desc; } + // JsonValue redirect_url = data["redirect_url"]; + // string ep_id; + // if (redirect_url.isString() && redirect_url.asString().find("bangumi/play/ep") >= 0) { + // webUrl = redirect_url.asString(); + // ispgc = true; + // ep_id = HostRegExpParse(redirect_url.asString(), "bangumi/play/ep([0-9]+)"); + // log("Video ispgc detected", webUrl); + // log("Video ep_id", ep_id); + // } + // MetaData["webUrl"] = makeWebUrl(webUrl); + if (ConfigData.danmakuEnable) { + dictionary dic; + dic["name"] = "【弹幕】" + title; + dic["url"] = ConfigData.danmakuUrl + cid; + subtitle.insertLast(dic); + } + } else { + log("Video view API code != 0", root["code"].asInt()); + log("Video view API message", root["message"].asString()); + return url; } - } else { - log("Video skip view API, aid known", aid); - ispgc = true; } - res = apiPost("/x/player/wbi/v2?bvid=" + bvid + "&cid=" + cid); + params = "bvid=" + bvid + "&cid=" + cid; + res = apiPost("/x/player/wbi/v2?" + params + "&w_rid=" + encWbi(params)); if (res.empty()) { return url; } @@ -449,6 +497,7 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array chapt; @@ -468,7 +517,9 @@ string Video(string bvid, const string &in path, dictionary &MetaData, array Banggumi(string id, string type) { video["duration"] = item["duration"].asInt(); video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?cid=" + item["cid"].asString(); video["thumbnail"] = item["cover"].asString(); + if (item["ep_id"].asString() == id) video["current"] = "1"; videos.insertLast(video); } } @@ -1975,6 +2022,58 @@ string Live(string id, const string &in path, dictionary &MetaData, array= 0) { + videoIsUGCorPGC.isPGC = true; + videoIsUGCorPGC.pgcURL = redirect_url.asString(); + return true; + } + if (Root["data"]["View"]["ugc_season"].isObject()) { + videoIsUGCorPGC.isUGCSeason = true; + return true; + } + } else { + log("Video view API code != 0", Root["code"].asInt()); + log("Video view API message", Root["message"].asString()); + } + } + return false; +} + bool PlayitemCheck(const string &in path) { status = 0; if (path.find("bilibili.com") < 0) { @@ -1984,9 +2083,7 @@ bool PlayitemCheck(const string &in path) { if (path.find("/video/BV") >= 0) { return true; } - - if (path.find("bangumi/play/ep") >= 0) { - log("PlayitemCheck bangumi/ep TRUE", path); + if (path.find("/video/av") >= 0) { return true; } @@ -2001,10 +2098,14 @@ bool PlayitemCheck(const string &in path) { } bool PlaylistCheck(const string &in path) { + log("PlaylistCheck, path: ", path); status = 0; if (path.find("bilibili.com") < 0) { return false; } + if ((path.find("/video/BV") >= 0 || path.find("/video/av") >= 0) && isUgcSeason(path)) { + return true; + } if (!parseBVId(path).empty() || !parseAVId(path).empty()) { return true; } @@ -2055,6 +2156,7 @@ bool PlaylistCheck(const string &in path) { return true; } if (path.find("bangumi/play/") >= 0) { + log("PlaylistCheck - bangumi/play/"); return true; } if (path.find("www.bilibili.com/v/popular/rank") >= 0) { @@ -2080,17 +2182,30 @@ bool PlaylistCheck(const string &in path) { } array PlaylistParse(const string &in path) { - log("Playlist path", path); + log("PlaylistParse path", path); status = 1; array result; string bvid = parseBVId(path); + if ((path.find("/video/BV") >= 0 || path.find("/video/av") >= 0) && isUgcSeason(path)) { + if (videoIsUGCorPGC.isUGCSeason) { + return VideoPages(path); + } + if (videoIsUGCorPGC.isPGC) { + if (videoIsUGCorPGC.pgcURL.find("bangumi/play/ep") >= 0) { + return Banggumi(HostRegExpParse(videoIsUGCorPGC.pgcURL, "bangumi/play/ep([0-9]+)"), "ep_id"); + } + if (videoIsUGCorPGC.pgcURL.find("bangumi/play/ss") >= 0) { + return Banggumi(HostRegExpParse(videoIsUGCorPGC.pgcURL, "bangumi/play/ss([0-9]+)"), "season_id"); + } + } + } if (!bvid.empty()) { - return VideoPages(bvid); + return VideoPages(path); } string avid = parseAVId(path); if (!avid.empty()) { - return VideoPages(avid); + return VideoPages(path); } if (path.find("/watchlater") >= 0) { return watchlater(); @@ -2142,11 +2257,9 @@ array PlaylistParse(const string &in path) { return Banggumi(HostRegExpParse(path, "bangumi/media/md([0-9]+)"), "media_id"); } if (path.find("bangumi/play/ep") >= 0) { - log("PlaylistParse bangumi ep detected", path); return Banggumi(HostRegExpParse(path, "bangumi/play/ep([0-9]+)"), "ep_id"); } if (path.find("bangumi/play/ss") >= 0) { - log("PlaylistParse bangumi ss detected", path); return Banggumi(HostRegExpParse(path, "bangumi/play/ss([0-9]+)"), "season_id"); } if (path.find("www.bilibili.com/v/popular/rank") >= 0) { @@ -2176,95 +2289,14 @@ string PlayitemParse(const string &in path, dictionary &MetaData, array= 0) { - log("Bangumi item detected", path); - string epid = HostRegExpParse(path, "bangumi/play/ep([0-9]+)"); - log("Bangumi epid", epid); - if (!epid.empty()) { - string apiUrl = "/pgc/view/web/season?ep_id=" + epid; - string res = apiPost(apiUrl); - log("Bangumi season API response length", res.length()); - if (res.empty()) { - log("Bangumi season API response EMPTY"); - return ""; - } - JsonReader reader; - JsonValue root; - if (!reader.parse(res, root)) { - log("Bangumi season API JSON parse FAILED"); - return ""; - } - if (!root.isObject()) { - log("Bangumi season API root is NOT object"); - return ""; - } - log("Bangumi season API code", root["code"].asInt()); - if (root["code"].asInt() != 0) { - log("Bangumi season API message", root["message"].asString()); - return ""; - } - JsonValue result = root["result"]; - if (!result.isObject()) { - log("Bangumi season API result is NOT object"); - return ""; - } - JsonValue episodes = result["episodes"]; - if (!episodes.isArray()) { - log("Bangumi season API episodes is NOT array"); - return ""; - } - log("Bangumi episode count", episodes.size()); - if (episodes.size() == 0) { - log("Bangumi episode list EMPTY"); - return ""; - } - string bvid; - string cid; - string aid; - string title; - string cover; - for (int i = 0; i < episodes.size(); i++) { - if (episodes[i]["id"].asInt() == parseInt(epid)) { - bvid = episodes[i]["bvid"].asString(); - cid = episodes[i]["cid"].asString(); - aid = episodes[i]["aid"].asString(); - title = episodes[i]["share_copy"].asString(); - cover = episodes[i]["cover"].asString(); - break; - } - } - if (bvid.empty()) { - log("Bangumi ep not found by id, using first episode"); - bvid = episodes[0]["bvid"].asString(); - cid = episodes[0]["cid"].asString(); - aid = episodes[0]["aid"].asString(); - title = episodes[0]["share_copy"].asString(); - cover = episodes[0]["cover"].asString(); - } - log("Bangumi bvid", bvid); - log("Bangumi cid", cid); - log("Bangumi aid", aid); - if (!title.empty()) { - MetaData["title"] = title; - MetaData["content"] = title; - } - if (!cover.empty()) { - MetaData["thumbnail"] = cover; - } - if (!bvid.empty()) { - string videoUrl = "https://www.bilibili.com/video/" + bvid + "?cid=" + cid + "&aid=" + aid; - log("Bangumi calling Video with URL", videoUrl); - return Video(bvid, videoUrl, MetaData, QualityList); - } - log("Bangumi bvid EMPTY after lookup"); - } - return ""; - } - - if (path.find("/video/BV") >= 0) { + if (path.find("/video/BV") >= 0 ) { string bvid = parseBVId(path); return Video(bvid, path, MetaData, QualityList); } + if (path.find("/video/av") >= 0) { + string aid = parseAVId(path); + return Video(aid, path, MetaData, QualityList); + } if (path.find("live.bilibili.com") >= 0) { string id = HostRegExpParse(path, "live.bilibili.com/([0-9]+)"); if (!id.empty()) { diff --git a/README.md b/README.md index 2044c85..c7c2bc2 100644 --- a/README.md +++ b/README.md @@ -28,13 +28,75 @@ ### ▶️ 点播 -- 支持屏蔽 P2PCDN +- 支持屏蔽 P2PCDN,可通过配置文件调整,默认屏蔽 - 修复部分 Host 为 `upos` 的点播 URL 播放失败的问题 -- Bilibili 点播更换新接口 +- Bilibili 点播更换新接口,尽量使用wbi签名认证防止接口失效 +- 重新支持用户合集视频,potplayer播放列表( 快捷键 F6 )正确显示合集视频 +- 播放番剧,电视剧等其它PGC合集或用户合集时,正确定位当前视频,不会出现从第一集开始播放的问题 +- 支持AV播放地址 - 优化 Bilibili 音频画质选项显示: - `EC-3` → **杜比全景声 EC-3** - `FLAC` → **Hi-Res 无损 FLAC** - 当同时存在杜比全景声与Hi-Res无损时,默认使用Hi-Res无损。 +- 请求本地缓存,尽量减少请求次数 +- 移除或注释无用旧代码,比较激进。 + + +## TODO + +* 支持精准空降(视 PotPlayer 是否提供相关支持)。 +* 直播播放目前存在 `exception` 异常,但暂未发现其对实际播放造成影响;当前播放及画质选项均正常。 + +# 一些可能的问题及解决办法 + +#### 播放视频时一直转圈,右下角画质选项不断跳动 + +这通常是由于 PotPlayer 中保存了旧的 `Cookie`、`Header` 或 `Referer` 信息导致的。可以尝试清理相关配置后重新播放。 + +**如果未勾选「保存设置到 INI 文件」:(按 F5 打开选项"设置 - 基本" 页面下 )** + +1. 打开注册表编辑器(`regedit`)。 + +2. 定位到: + + `计算机\HKEY_CURRENT_USER\Software\DAUM\` + +3. 根据你平时使用的 PotPlayer 程序,进入对应的注册表项: + + * `PotPlayer64` + * `PotPlayerMini64` + + 一般情况下使用的是 `PotPlayerMini64`。 + +4. 删除其中的以下键值(如果存在): + + * `_UrlCookie` + * `_UrlHeader` + * `_UrlReferer` + +**如果已勾选「保存设置到 INI 文件」:** + +1. 打开 PotPlayer 安装目录。 + +2. 根据你平时使用的程序,打开对应的配置文件: + + * `PotPlayerMini64.ini` + * `PotPlayer64.ini` + + 一般情况下使用的是 `PotPlayerMini64.ini`。 + +3. 在文件中删除以下配置节(如果存在): + + ```ini + [_UrlCookie] + + [_UrlHeader] + + [_UrlReferer] + ``` + +完成后重新启动 PotPlayer,再尝试播放。 + ## 安装插件 From b579ec17e1f2809f385decc86867905772d40202 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Fri, 28 Aug 2026 04:12:45 +0800 Subject: [PATCH 083/132] =?UTF-8?q?1.=20=E9=87=8D=E6=96=B0=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E7=94=A8=E6=88=B7=E5=90=88=E9=9B=86=E8=A7=86=E9=A2=91?= =?UTF-8?q?=202.=20=E6=94=AF=E6=8C=81AV=E5=9C=B0=E5=9D=80=203.=20=E5=90=88?= =?UTF-8?q?=E9=9B=86=E8=A7=86=E9=A2=91=E6=AD=A3=E7=A1=AE=E5=AE=9A=E4=BD=8D?= =?UTF-8?q?=204.=20=E6=9B=B4=E6=8D=A2=E6=96=B0=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index cc41361..672d8c5 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -2022,7 +2022,7 @@ string Live(string id, const string &in path, dictionary &MetaData, array= 0 || path.find("/video/av") >= 0) && isUgcSeason(path)) { + if ((path.find("/video/BV") >= 0 || path.find("/video/av") >= 0) && isPlaylist(path)) { return true; } if (!parseBVId(path).empty() || !parseAVId(path).empty()) { @@ -2187,7 +2187,7 @@ array PlaylistParse(const string &in path) { array result; string bvid = parseBVId(path); - if ((path.find("/video/BV") >= 0 || path.find("/video/av") >= 0) && isUgcSeason(path)) { + if ((path.find("/video/BV") >= 0 || path.find("/video/av") >= 0) && isPlaylist(path)) { if (videoIsUGCorPGC.isUGCSeason) { return VideoPages(path); } From 18b743b2a098a751201a9b62c4162c54fcbc9412 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Fri, 28 Aug 2026 04:31:54 +0800 Subject: [PATCH 084/132] update README.md --- README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c7c2bc2..c1c89a1 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,11 @@ # BilibiliPotPlayer -适用于 PotPlayer 的 Bilibili 播放插件。配合 [油猴脚本](https://greasyfork.org/zh-CN/scripts/461800-bilibilipotplayer), -可以直接从 Bilibili 网页调用 PotPlayer 进行播放。 +本项目基于 [chen310/BilibiliPotPlayer](https://github.com/chen310/BilibiliPotPlayer) 及其上游版本 [juening2000/BilibiliPotPlayer](https://github.com/juening2000/BilibiliPotPlayer) 进行维护,并针对个人使用需求持续进行功能改进、Bug 修复和测试。 + +本项目主要用于持续测试、维护和提交改进。 + +如果上游项目恢复持续更新,本项目将优先向上游提交相关改进,并根据上游项目的维护情况决定是否继续维护本项目。 + ## ✨ 主要改进 @@ -45,6 +49,7 @@ ## TODO * 支持精准空降(视 PotPlayer 是否提供相关支持)。 +* 支持空降助手。 * 直播播放目前存在 `exception` 异常,但暂未发现其对实际播放造成影响;当前播放及画质选项均正常。 # 一些可能的问题及解决办法 From 906839526944c015473edb4fd1772e8cb8bf1c03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Fri, 28 Aug 2026 06:28:23 +0800 Subject: [PATCH 085/132] =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=A4=9A=E5=90=88?= =?UTF-8?q?=E9=9B=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 672d8c5..032babb 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -306,14 +306,17 @@ array VideoPages(const string &in path) { JsonValue Root; if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() == 0) { - if (Root["data"]["View"]["ugc_season"]["sections"].isArray()) { - if (Root["data"]["View"]["ugc_season"]["sections"][0]["episodes"].isArray()) { - JsonValue episodes = Root["data"]["View"]["ugc_season"]["sections"][0]["episodes"]; + JsonValue sections = Root["data"]["View"]["ugc_season"]["sections"]; + if (sections.isArray()) { + string title; + for (int j = 0; j < sections.size(); j++) { + if (sections.size() > 0) title = sections[j]["title"].asString() + " | "; + JsonValue episodes = sections[j]["episodes"]; for (int i = 0; i < episodes.size(); i++) { JsonValue item = episodes[i]; if (item.isObject()) { dictionary video; - video["title"] = item["title"].asString(); + video["title"] = title + item["title"].asString(); video["duration"] = item["arc"]["duration"].asInt() * 1000; video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); video["thumbnail"] = item["arc"]["pic"].asString(); @@ -324,8 +327,6 @@ array VideoPages(const string &in path) { log("item is empty"); } } - } else { - log('Root["data"]["View"]["ugc_season"]["sections"][0]["episodes"] is not array.'); } } else { log('Root["data"]["View"]["ugc_season"]["sections"] is not array.'); @@ -2192,6 +2193,7 @@ array PlaylistParse(const string &in path) { return VideoPages(path); } if (videoIsUGCorPGC.isPGC) { + log("isPGC"); if (videoIsUGCorPGC.pgcURL.find("bangumi/play/ep") >= 0) { return Banggumi(HostRegExpParse(videoIsUGCorPGC.pgcURL, "bangumi/play/ep([0-9]+)"), "ep_id"); } From 2da9fab0e21696e8dae896321dbd99e2de62bf89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Fri, 28 Aug 2026 07:38:06 +0800 Subject: [PATCH 086/132] =?UTF-8?q?=E7=BB=86=E8=8A=82=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 032babb..2052626 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -310,7 +310,7 @@ array VideoPages(const string &in path) { if (sections.isArray()) { string title; for (int j = 0; j < sections.size(); j++) { - if (sections.size() > 0) title = sections[j]["title"].asString() + " | "; + if (sections.size() > 0) title = "【" + sections[j]["title"].asString() + "】"; JsonValue episodes = sections[j]["episodes"]; for (int i = 0; i < episodes.size(); i++) { JsonValue item = episodes[i]; @@ -1443,7 +1443,7 @@ array webDynamic(string path) { if (type != "video") { type = "all"; } - int nums = 2; + int nums = 5; string offset; string baseurl ="/x/polymer/web-dynamic/v1/feed/all?timezone_offset=-480&type=" + type; for (int i = 1; i <= nums; i++) { @@ -1516,7 +1516,7 @@ array Recommend(uint page) { JsonReader Reader; JsonValue Root; const uint nums = 5; - string url ="/x/web-interface/index/top/feed/rcmd?y_num=3&fresh_type=4&feed_version=V8&fresh_idx_1h="+page+"&fetch_row="+(3*page+1)+"&fresh_idx="+page+"&brush="+page+"&homepage_ver=1&ps=12&last_y_num=4&outside_trigger="; + string url = "/x/web-interface/wbi/index/top/feed/rcmd?y_num=3&fresh_type=4&feed_version=V8&fresh_idx_1h="+page+"&fetch_row="+(3*page+1)+"&fresh_idx="+page+"&brush="+page+"&homepage_ver=1&ps=12&last_y_num=4&outside_trigger="; string res = apiPost(url); if (res.empty()) { return videos; From a7332315e6919edd0611a2a935e4fa16d758eaef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Fri, 28 Aug 2026 13:16:27 +0800 Subject: [PATCH 087/132] =?UTF-8?q?bugfix=20-=20=E6=AD=A3=E7=A1=AE?= =?UTF-8?q?=E5=A4=84=E7=90=86UGC=E8=A7=86=E9=A2=91=E5=90=88=E9=9B=86?= =?UTF-8?q?=E4=B8=8E=E5=8D=95=E8=A7=86=E9=A2=91=E6=8E=A8=E8=8D=90=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 128 ++++++++++++------- README.md | 2 +- 2 files changed, 80 insertions(+), 50 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 2052626..1b05fe0 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -279,12 +279,12 @@ uint gettid(string path) { return 0; } -// 分P -array VideoPages(const string &in path) { +array UGCSeason(const string &in path) { array videos; string bvid = parseBVId(path); string aid = parseAVId(path); + string cid; string params; if (!bvid.empty()) params += "bvid=" + bvid; if (!aid.empty()) params += "aid=" + aid; @@ -295,9 +295,6 @@ array VideoPages(const string &in path) { res = videoIsUGCorPGC.res; } else { res = apiPost("/x/web-interface/wbi/view/detail?" + params + "&w_rid=" + encWbi(params)); - if (res.empty()) { - return videos; - } videoIsUGCorPGC.url = makeWebUrl(path); videoIsUGCorPGC.res = res; } @@ -306,6 +303,11 @@ array VideoPages(const string &in path) { JsonValue Root; if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() == 0) { + if(!Root["data"]["View"].isObject()) { + log('Root["data"]["View"] is empty.'); + return videos; + } + JsonValue sections = Root["data"]["View"]["ugc_season"]["sections"]; if (sections.isArray()) { string title; @@ -339,34 +341,75 @@ array VideoPages(const string &in path) { log("res parse failed or Root is empty."); } - if (videos.length() >= 2 || !ConfigData.showRecommendedVideos) { - return videos; + return videos; +} + +array RelatedVideos(const string &in path) { + array videos; + + string bvid = parseBVId(path); + string aid = parseAVId(path); + string params; + if (!bvid.empty()) params += "bvid=" + bvid; + if (!aid.empty()) params += "aid=" + aid; + if (bvid.empty() && aid.empty()) return videos; + + string res; + if (videoIsUGCorPGC.url == makeWebUrl(path)){ + res = videoIsUGCorPGC.res; + } else { + res = apiPost("/x/web-interface/wbi/view/detail?" + params + "&w_rid=" + encWbi(params)); + videoIsUGCorPGC.url = makeWebUrl(path); + videoIsUGCorPGC.res = res; } - - res = apiPost("/x/web-interface/archive/related?bvid=" + bvid); - if (!res.empty()) { - JsonReader Reader; - JsonValue Root; - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue data = Root["data"]; - if (data.isArray()) { - for (int i = 0; i < data.size(); i++) { - JsonValue item = data[i]; - if (item.isObject()) { - dictionary video; - video["title"] = item["title"].asString(); - video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); - video["thumbnail"] = item["pic"].asString(); - video["author"] = item["owner"]["name"].asString(); - videos.insertLast(video); - } + + JsonReader Reader; + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + if(!Root["data"]["View"].isObject()) { + log('Root["data"]["View"] is empty.'); + return videos; + } + + JsonValue data = Root["data"]["View"]; + + dictionary video; + video["title"] = data["title"].asString(); + video["duration"] = data["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + bvid; + video["author"] = data["owner"]["name"].asString(); + video["thumbnail"] = data["pic"].asString(); + videos.insertLast(video); + + if (!ConfigData.showRecommendedVideos) return videos; + + JsonValue related = Root["data"]["Related"]; + if (related.isArray()) { + for (int i = 0; i < related.size(); i++) { + JsonValue item = related[i]; + if (item.isObject()) { + dictionary video; + video["title"] = item["title"].asString(); + video["duration"] = item["arc"]["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + video["thumbnail"] = item["arc"]["pic"].asString(); + video["author"] = item["arc"]["author"]["name"].asString(); + if (item["bvid"].asString() == bvid || item["aid"].asString() == aid) video["current"] = "1"; + videos.insertLast(video); + } else { + log("item is empty"); } } } + } else { + log("Video view API code != 0", Root["code"].asInt()); + log("Video view API message", Root["message"].asString()); } + } else { + log("res parse failed or Root is empty."); } + return videos; } @@ -2033,10 +2076,7 @@ bool isPlaylist(const string &in path) { string params; if (!bvid.empty()) params += "bvid=" + bvid; if (!aid.empty()) params += "aid=" + aid; - if (bvid.empty() && aid.empty()) { - HostMessageBox(path, "地址有误"); - return false; - } + if (bvid.empty() && aid.empty()) return false; string res; if (videoIsUGCorPGC.url == path){ @@ -2104,7 +2144,7 @@ bool PlaylistCheck(const string &in path) { if (path.find("bilibili.com") < 0) { return false; } - if ((path.find("/video/BV") >= 0 || path.find("/video/av") >= 0) && isPlaylist(path)) { + if (isPlaylist(path)) { return true; } if (!parseBVId(path).empty() || !parseAVId(path).empty()) { @@ -2182,32 +2222,22 @@ bool PlaylistCheck(const string &in path) { return false; } -array PlaylistParse(const string &in path) { +array PlaylistParse(const string &in url) { + string path = url; log("PlaylistParse path", path); status = 1; array result; + if (videoIsUGCorPGC.isPGC) path = videoIsUGCorPGC.pgcURL; + if (videoIsUGCorPGC.isUGCSeason) return UGCSeason(path); + string bvid = parseBVId(path); - if ((path.find("/video/BV") >= 0 || path.find("/video/av") >= 0) && isPlaylist(path)) { - if (videoIsUGCorPGC.isUGCSeason) { - return VideoPages(path); - } - if (videoIsUGCorPGC.isPGC) { - log("isPGC"); - if (videoIsUGCorPGC.pgcURL.find("bangumi/play/ep") >= 0) { - return Banggumi(HostRegExpParse(videoIsUGCorPGC.pgcURL, "bangumi/play/ep([0-9]+)"), "ep_id"); - } - if (videoIsUGCorPGC.pgcURL.find("bangumi/play/ss") >= 0) { - return Banggumi(HostRegExpParse(videoIsUGCorPGC.pgcURL, "bangumi/play/ss([0-9]+)"), "season_id"); - } - } - } if (!bvid.empty()) { - return VideoPages(path); + return RelatedVideos(path); } string avid = parseAVId(path); if (!avid.empty()) { - return VideoPages(path); + return RelatedVideos(path); } if (path.find("/watchlater") >= 0) { return watchlater(); diff --git a/README.md b/README.md index c1c89a1..8599c2f 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ - 支持屏蔽 P2PCDN,可通过配置文件调整,默认屏蔽 - 修复部分 Host 为 `upos` 的点播 URL 播放失败的问题 - Bilibili 点播更换新接口,尽量使用wbi签名认证防止接口失效 -- 重新支持用户合集视频,potplayer播放列表( 快捷键 F6 )正确显示合集视频 +- 重新支持用户合集视频,potplayer 播放列表( 快捷键 F6 ) 正确显示合集视频。当存在用户视频合集时,播放列表里只展示合集视频。当只存在单个视频时,播放列表里包含当前视频与推荐视频(是否包含推荐视频取决于配置文件`showRecommendedVideos`开关) - 播放番剧,电视剧等其它PGC合集或用户合集时,正确定位当前视频,不会出现从第一集开始播放的问题 - 支持AV播放地址 - 优化 Bilibili 音频画质选项显示: From 8b9f856c83ab440286e59d26899ca3ebaad93131 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Fri, 28 Aug 2026 16:00:47 +0800 Subject: [PATCH 088/132] =?UTF-8?q?1.=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81.=202.=20=E8=A7=86=E9=A2=91=E4=B8=8E=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E5=A2=9E=E5=8A=A0=E5=A4=9A=E9=A1=B9=E5=B1=9E?= =?UTF-8?q?=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 425 ++++++++----------- README.md | 3 +- 2 files changed, 185 insertions(+), 243 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 1b05fe0..fff241d 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -215,9 +215,34 @@ void log(string item, int info) { log(item + ": " + info); } +string UnixTimeToDate(int64 t) { + int64 d = t / 86400; + int s = int(t % 86400); + int y = 1970, m = 1, md; + while (true) { + int dy = ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) ? 366 : 365; + if (d < dy) break; + d -= dy; + y++; + } + bool leap = (y % 4 == 0 && y % 100 != 0) || y % 400 == 0; + while (true) { + md = m == 2 ? (leap ? 29 : 28) : (m == 4 || m == 6 || m == 9 || m == 11 ? 30 : 31); + if (d < md) break; + d -= md; + m++; + } + int h = s / 3600; + int min = s % 3600 / 60; + s %= 60; + return formatInt(y) + "-" + formatInt(m + 100).substr(1) + "-" + formatInt(int(d) + 101).substr(1) + " " + formatInt(h + 100).substr(1) + ":" + formatInt(min + 100).substr(1) + ":" + formatInt(s + 100).substr(1); +} + string post(string url, string data="") { log("request", url); - return HostUrlGetStringWithAPI(url); + string res = HostUrlGetStringWithAPI(url); + if (res.empty()) HostMessageBox("未获取到响应数据, url: " + url, "请求失败"); + return res; } string apiPost(string api, string data="") { @@ -284,7 +309,6 @@ array UGCSeason(const string &in path) { string bvid = parseBVId(path); string aid = parseAVId(path); - string cid; string params; if (!bvid.empty()) params += "bvid=" + bvid; if (!aid.empty()) params += "aid=" + aid; @@ -320,9 +344,14 @@ array UGCSeason(const string &in path) { dictionary video; video["title"] = title + item["title"].asString(); video["duration"] = item["arc"]["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); video["thumbnail"] = item["arc"]["pic"].asString(); video["author"] = item["arc"]["author"]["name"].asString(); + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + video["viewCount"] = item["arc"]["stat"]["view"].asString(); + video["likeCount"] = item["arc"]["stat"]["like"].asString(); + video["dislikeCount"] = item["arc"]["stat"]["dislike"].asString(); + video["date"] = UnixTimeToDate(item["arc"]["pubdate"].asInt()); + video["resolution"] = item["arc"]["dimension"]["width"].asInt() + "x" + item["arc"]["dimension"]["height"].asInt(); if (item["bvid"].asString() == bvid || item["aid"].asString() == aid) video["current"] = "1"; videos.insertLast(video); } else { @@ -377,9 +406,15 @@ array RelatedVideos(const string &in path) { dictionary video; video["title"] = data["title"].asString(); video["duration"] = data["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + bvid; - video["author"] = data["owner"]["name"].asString(); video["thumbnail"] = data["pic"].asString(); + video["author"] = data["owner"]["name"].asString(); + video["url"] = "https://www.bilibili.com/video/" + bvid; + video["viewCount"] = data["stat"]["view"].asString(); + video["likeCount"] = data["stat"]["like"].asString(); + video["dislikeCount"] = data["stat"]["dislike"].asString(); + video["date"] = UnixTimeToDate(data["pubdate"].asInt()); + video["resolution"] = data["dimension"]["width"].asInt() + "x" + data["dimension"]["height"].asInt(); + video["current"] = "1"; videos.insertLast(video); if (!ConfigData.showRecommendedVideos) return videos; @@ -391,11 +426,15 @@ array RelatedVideos(const string &in path) { if (item.isObject()) { dictionary video; video["title"] = item["title"].asString(); - video["duration"] = item["arc"]["duration"].asInt() * 1000; + video["duration"] = item["duration"].asInt() * 1000; + video["thumbnail"] = item["pic"].asString(); + video["author"] = item["owner"]["name"].asString(); video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); - video["thumbnail"] = item["arc"]["pic"].asString(); - video["author"] = item["arc"]["author"]["name"].asString(); - if (item["bvid"].asString() == bvid || item["aid"].asString() == aid) video["current"] = "1"; + video["viewCount"] = item["stat"]["view"].asString(); + video["likeCount"] = item["stat"]["like"].asString(); + video["dislikeCount"] = item["stat"]["dislike"].asString(); + video["date"] = UnixTimeToDate(item["pubdate"].asInt()); + video["resolution"] = item["dimension"]["width"].asInt() + "x" + item["dimension"]["height"].asInt(); videos.insertLast(video); } else { log("item is empty"); @@ -418,12 +457,6 @@ string makeWebUrl(string path) { if (strs.length() <= 1) { return path; } - // string url = strs[0]; - // string p = parse(path, "p"); - // if (p.empty() || p == "1") { - // return url; - // } - // return url + "?p=" + p; return strs[0]; } @@ -439,9 +472,6 @@ string Video(string id, const string &in path, dictionary &MetaData, array subtitle; if (videoIsUGCorPGC.url == makeWebUrl(path)){ @@ -456,9 +486,6 @@ string Video(string id, const string &in path, dictionary &MetaData, array= 0) { - // webUrl = redirect_url.asString(); - // ispgc = true; - // ep_id = HostRegExpParse(redirect_url.asString(), "bangumi/play/ep([0-9]+)"); - // log("Video ispgc detected", webUrl); - // log("Video ep_id", ep_id); - // } - // MetaData["webUrl"] = makeWebUrl(webUrl); + MetaData["dislikeCount"] = data["stat"]["dislike"].asString(); + MetaData["date"] = UnixTimeToDate(data["pubdate"].asInt()); + MetaData["resolution"] = data["dimension"]["width"].asInt() + "x" + data["dimension"]["height"].asInt(); + if (ConfigData.danmakuEnable) { dictionary dic; dic["name"] = "【弹幕】" + title; @@ -515,9 +525,6 @@ string Video(string id, const string &in path, dictionary &MetaData, array watchlater() { array videos; string res = apiPost("/x/v2/history/toview"); - if (!res.empty()) { - JsonReader Reader; - JsonValue Root; - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue data = Root["data"]["list"]; - if (data.isArray()) { - for (int i = 0; i < data.size(); i++) { - JsonValue item = data[i]; - if (item.isObject()) { - dictionary video; - int p = item["page"]["page"].asInt(); - if (p == 1) { - video["title"] = item["title"].asString(); - } else { - video["title"] = item["title"].asString() + " | " + item["page"]["part"].asString(); - } - video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?p=" + p; - video["thumbnail"] = item["pic"].asString(); - video["author"] = item["owner"]["name"].asString(); - videos.insertLast(video); + JsonReader Reader; + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue data = Root["data"]["list"]; + if (data.isArray()) { + for (int i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + if (item.isObject()) { + dictionary video; + int p = item["page"]["page"].asInt(); + if (p == 1) { + video["title"] = item["title"].asString(); + } else { + video["title"] = item["title"].asString() + " | " + item["page"]["part"].asString(); } + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?p=" + p; + video["thumbnail"] = item["pic"].asString(); + video["author"] = item["owner"]["name"].asString(); + videos.insertLast(video); } } } @@ -683,42 +685,40 @@ array History() { uint max = 0; uint ps = 20; string res = apiPost("/x/web-interface/history/cursor?max=" + max + "&ps=" + ps); - if (!res.empty()) { - JsonReader Reader; - JsonValue Root; - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue data = Root["data"]["list"]; - if (data.isArray()) { - for (int i = 0; i < data.size(); i++) { - JsonValue item = data[i]; - string type = item["history"]["business"].asString(); - // archive live pgc - if (type == "archive" || type == "live") { - if (item.isObject()) { - dictionary video; - video["thumbnail"] = item["cover"].asString(); - video["author"] = item["author_name"].asString(); - if (type == "live") { - if (item["live_status"].asInt() != 1) { - continue; - } - video["title"] = "直播 | " + item["title"].asString(); - video["url"] = item["uri"].asString(); - } else if (type == "archive") { - int p = item["history"]["page"].asInt(); - if (p == 1) { - video["title"] = item["title"].asString(); - } else { - video["title"] = item["title"].asString() + " | " + item["history"]["part"].asString(); - } - video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["history"]["bvid"].asString() + "?p=" + p; - } else { + JsonReader Reader; + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue data = Root["data"]["list"]; + if (data.isArray()) { + for (int i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + string type = item["history"]["business"].asString(); + // archive live pgc + if (type == "archive" || type == "live") { + if (item.isObject()) { + dictionary video; + video["thumbnail"] = item["cover"].asString(); + video["author"] = item["author_name"].asString(); + if (type == "live") { + if (item["live_status"].asInt() != 1) { continue; } - videos.insertLast(video); + video["title"] = "直播 | " + item["title"].asString(); + video["url"] = item["uri"].asString(); + } else if (type == "archive") { + int p = item["history"]["page"].asInt(); + if (p == 1) { + video["title"] = item["title"].asString(); + } else { + video["title"] = item["title"].asString() + " | " + item["history"]["part"].asString(); + } + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["history"]["bvid"].asString() + "?p=" + p; + } else { + continue; } + videos.insertLast(video); } } } @@ -851,42 +851,38 @@ array Channel(string path) { url = baseurl + "&pn=" + pn; } string res = apiPost(url); - if (!res.empty()) { - JsonReader Reader; - JsonValue Root; - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue data = Root["data"]["archives"]; - if (data.isArray()) { - for (int i = 0; i < data.size(); i++) { - JsonValue item = data[i]; - if (item.isObject()) { - dictionary video; - video["title"] = item["title"].asString(); - video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); - video["thumbnail"] = item["pic"].asString(); - videos.insertLast(video); - } + JsonReader Reader; + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue data = Root["data"]["archives"]; + if (data.isArray()) { + for (int i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + if (item.isObject()) { + dictionary video; + video["title"] = item["title"].asString(); + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + video["thumbnail"] = item["pic"].asString(); + videos.insertLast(video); } } - JsonValue page = Root["data"]["page"]; - if (isCollection) { - if (page["page_num"].asInt() * page["page_size"].asInt() >= page["total"].asInt()) { - break; - } - } else { - if (page["num"].asInt() * page["size"].asInt() >= page["total"].asInt()) { - break; - } + } + JsonValue page = Root["data"]["page"]; + if (isCollection) { + if (page["page_num"].asInt() * page["page_size"].asInt() >= page["total"].asInt()) { + break; } - pn += 1; } else { - return videos; + if (page["num"].asInt() * page["size"].asInt() >= page["total"].asInt()) { + break; + } } + pn += 1; + } else { + return videos; } - } else { - return videos; } } @@ -917,37 +913,33 @@ array spaceVideo(string path) { string url = baseurl + params; string res = apiPost(url); - if (!res.empty()) { - JsonReader Reader; - JsonValue Root; - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue data = Root["data"]["list"]["vlist"]; - if (data.isArray()) { - for (int i = 0; i < data.size(); i++) { - JsonValue item = data[i]; - if (item.isObject()) { - dictionary video; - video["title"] = item["title"].asString(); - video["duration"] = parseTime(item["length"].asString()); - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); - video["thumbnail"] = item["pic"].asString(); - video["author"] = item["author"].asString(); - videos.insertLast(video); - } + JsonReader Reader; + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue data = Root["data"]["list"]["vlist"]; + if (data.isArray()) { + for (int i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + if (item.isObject()) { + dictionary video; + video["title"] = item["title"].asString(); + video["duration"] = parseTime(item["length"].asString()); + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + video["thumbnail"] = item["pic"].asString(); + video["author"] = item["author"].asString(); + videos.insertLast(video); } } - JsonValue page = Root["data"]["page"]; - if (page["pn"].asInt() * page["ps"].asInt() >= page["count"].asInt()) { - break; - } - pn += 1; - } else { - return videos; } + JsonValue page = Root["data"]["page"]; + if (page["pn"].asInt() * page["ps"].asInt() >= page["count"].asInt()) { + break; + } + pn += 1; + } else { + return videos; } - } else { - return videos; } } return videos; @@ -964,35 +956,31 @@ array spaceAudio(string path) { while (true) { string url = baseurl + "&pn=" + pn; string res = apiPost(url); - if (!res.empty()) { - JsonReader Reader; - JsonValue Root; - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue data = Root["data"]["data"]; - if (data.isArray()) { - for (int i = 0; i < data.size(); i++) { - JsonValue item = data[i]; - if (item.isObject()) { - dictionary audio; - audio["title"] = item["title"].asString(); - audio["duration"] = item["duration"].asInt() * 1000; - audio["url"] = "https://www.bilibili.com/audio/au" + item["id"].asString(); - audio["thumbnail"] = item["cover"].asString(); - audios.insertLast(audio); - } + JsonReader Reader; + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue data = Root["data"]["data"]; + if (data.isArray()) { + for (int i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + if (item.isObject()) { + dictionary audio; + audio["title"] = item["title"].asString(); + audio["duration"] = item["duration"].asInt() * 1000; + audio["url"] = "https://www.bilibili.com/audio/au" + item["id"].asString(); + audio["thumbnail"] = item["cover"].asString(); + audios.insertLast(audio); } } - if (Root["data"]["curPage"].asInt() >= Root["data"]["pageCount"].asInt()) { - break; - } - pn += 1; - } else { - return audios; } + if (Root["data"]["curPage"].asInt() >= Root["data"]["pageCount"].asInt()) { + break; + } + pn += 1; + } else { + return audios; } - } else { - return audios; } } return audios; @@ -1019,9 +1007,6 @@ array FavList(string path) { mid = "" + ConfigData.uid; } string res = apiPost("/x/v3/fav/folder/created/list-all?up_mid=" + mid); - if (res.empty()) { - return videos; - } JsonValue Root; if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() == 0) { @@ -1057,9 +1042,6 @@ array FavList(string path) { url = baseurl + "&pn=" + pn; } string res = apiPost(url); - if (res.empty()) { - return videos; - } JsonValue Root; if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() == 0) { @@ -1100,9 +1082,6 @@ array followingLive(uint page) { JsonValue Root; string url = "https://api.live.bilibili.com/xlive/web-ucenter/user/following?page=" + page + "&page_size=10"; string res = post(url); - if (res.empty()) { - return videos; - } if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() == 0) { JsonValue list = Root["data"]["list"]; @@ -1140,9 +1119,6 @@ array liveCategory(uint page, string cateid, string parentAreaId, ui string w_rid = encWbi(params); string url = "https://api.live.bilibili.com/xlive/web-interface/v1/second/getList?" + params + "&w_rid=" + w_rid; string res = post(url); - if (res.empty()) { - return videos; - } if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() == 0) { JsonValue list = Root["data"]["list"]; @@ -1177,9 +1153,6 @@ array PopularHistory() { JsonReader Reader; JsonValue Root; string res = apiPost("/x/web-interface/popular/precious?page_size=100&page=1"); - if (res.empty()) { - return videos; - } if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() != 0) { return videos; @@ -1208,9 +1181,6 @@ array PopularWeekly(string path) { string num = parse(path, "num"); if (num.empty()) { string res = apiPost("/x/web-interface/popular/series/list"); - if (res.empty()) { - return videos; - } if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() != 0) { return videos; @@ -1222,9 +1192,6 @@ array PopularWeekly(string path) { } } string res = apiPost("/x/web-interface/popular/series/one?number=" + num); - if (res.empty()) { - return videos; - } if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() != 0) { return videos; @@ -1267,9 +1234,6 @@ array Ranking(string path) { JsonValue Root; string res = apiPost("/x/web-interface/ranking/v2?rid=" + ids[pos]); - if (res.empty()) { - return videos; - } if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() != 0) { return videos; @@ -1296,9 +1260,6 @@ array Dynamic(uint tid) { JsonReader Reader; JsonValue Root; string res = apiPost("/x/web-interface/dynamic/region?pn=1&ps=50&rid=" + tid); - if (res.empty()) { - return videos; - } if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() != 0) { return videos; @@ -1348,10 +1309,6 @@ array Banggumi(string id, string type) { string url = "/pgc/view/web/season?" + type + "=" + id; log("Banggumi request", url); string res = apiPost(url); - if (res.empty()) { - log("Banggumi response EMPTY"); - return videos; - } if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() != 0) { log("Banggumi code != 0", Root["code"].asInt()); @@ -1390,9 +1347,6 @@ array AudioList(string path) { string url = "https://www.bilibili.com/audio/music-service-c/web/song/of-menu?pn=1&ps=100&sid=" + id; string res = post(url); res = HostDecompress(res); - if (res.empty()) { - return audios; - } if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() != 0) { return audios; @@ -1440,9 +1394,6 @@ array Search(string path) { return videos; } string res = apiPost(url); - if (res.empty()) { - return videos; - } if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() != 0) { return videos; @@ -1495,9 +1446,6 @@ array webDynamic(string path) { url += "&offset=" + offset; } string res = apiPost(url); - if (res.empty()) { - return videos; - } if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() != 0) { return videos; @@ -1561,9 +1509,6 @@ array Recommend(uint page) { const uint nums = 5; string url = "/x/web-interface/wbi/index/top/feed/rcmd?y_num=3&fresh_type=4&feed_version=V8&fresh_idx_1h="+page+"&fetch_row="+(3*page+1)+"&fresh_idx="+page+"&brush="+page+"&homepage_ver=1&ps=12&last_y_num=4&outside_trigger="; string res = apiPost(url); - if (res.empty()) { - return videos; - } if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() != 0) { return videos; @@ -2084,11 +2029,6 @@ bool isPlaylist(const string &in path) { } else { string req = "/x/web-interface/wbi/view/detail?" + params + "&w_rid=" + encWbi(params); res = apiPost(req); - if (res.empty()) { - log("request failed, url: ", req); - HostMessageBox("接口/x/web-interface/view 失效", "接口失效"); - return false; - } videoIsUGCorPGC.url = makeWebUrl(path); videoIsUGCorPGC.res = res; } @@ -2116,6 +2056,7 @@ bool isPlaylist(const string &in path) { } bool PlayitemCheck(const string &in path) { + log("PlayitemCheck - path: ", path); status = 0; if (path.find("bilibili.com") < 0) { return false; @@ -2139,7 +2080,7 @@ bool PlayitemCheck(const string &in path) { } bool PlaylistCheck(const string &in path) { - log("PlaylistCheck, path: ", path); + log("PlaylistCheck - path: ", path); status = 0; if (path.find("bilibili.com") < 0) { return false; @@ -2224,7 +2165,7 @@ bool PlaylistCheck(const string &in path) { array PlaylistParse(const string &in url) { string path = url; - log("PlaylistParse path", path); + log("PlaylistParse - path", path); status = 1; array result; @@ -2318,7 +2259,7 @@ array PlaylistParse(const string &in url) { } string PlayitemParse(const string &in path, dictionary &MetaData, array &QualityList) { - log("Playitem path", path); + log("Playitem - path", path); status = 2; if (path.find("/video/BV") >= 0 ) { diff --git a/README.md b/README.md index 8599c2f..6d07b19 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,8 @@ - `FLAC` → **Hi-Res 无损 FLAC** - 当同时存在杜比全景声与Hi-Res无损时,默认使用Hi-Res无损。 - 请求本地缓存,尽量减少请求次数 -- 移除或注释无用旧代码,比较激进。 +- 移除无用旧代码,比较激进。 +- 视频与播放列表增加多项属性,如果你足够细心的话,就可以发现。 ## TODO From 9a7e966d02bc924d7b8d781aaf72dac3fed0da5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Fri, 28 Aug 2026 23:00:26 +0800 Subject: [PATCH 089/132] =?UTF-8?q?1.=20=E9=87=8D=E6=96=B0=E6=94=B9?= =?UTF-8?q?=E5=8A=A8=E7=9B=B4=E6=92=AD=E4=BB=A3=E7=A0=81=EF=BC=8C=E6=9B=B4?= =?UTF-8?q?=E7=9B=B4=E8=A7=82=202.=20=E5=A2=9E=E5=8A=A0=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E5=93=8D=E5=BA=94=E6=95=B0=E6=8D=AE=E7=BC=93?= =?UTF-8?q?=E5=AD=98=EF=BC=8C=E5=87=8F=E5=B0=91=E9=87=8D=E5=A4=8D=E8=AF=B7?= =?UTF-8?q?=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 601 +++++++++---------- README.md | 14 +- 2 files changed, 293 insertions(+), 322 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index fff241d..6537968 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -31,6 +31,7 @@ Config ConfigData; VideoIsUGCorPGC videoIsUGCorPGC; +dictionary ResponseCache; string ConfigFileName = "Bilibili_Config.json"; array BilibiliDomains = {"bilibili.com", "bilivideo.com", "bilivideo.cn"}; @@ -112,6 +113,7 @@ class Config { float danmakuStayTime = 15.0; bool showRecommendedVideos = true; bool blockP2PCDN = true; + int cacheValidTime = 300; bool debug = false; string danmakuUrl; @@ -125,9 +127,14 @@ class VideoIsUGCorPGC { bool isUGCSeason = false; bool isPGC = false; string pgcURL = ""; - string res = ""; }; +class ResponseCacheItem { + string response; + uint tick_count; + uint valid_time; +} + Config ReadConfigFile(string file) { Config config; config.fullConfig = HostFileRead(HostFileOpen(file), 10000); @@ -164,6 +171,12 @@ Config ReadConfigFile(string file) { if (root["showRecommendedVideos"].isBool()) { config.showRecommendedVideos = root["showRecommendedVideos"].asBool(); } + if (root["blockP2PCDN"].isBool()) { + config.blockP2PCDN = root["blockP2PCDN"].asBool(); + } + if (root["cacheValidTime"].isNumeric()) { + config.cacheValidTime = root["cacheValidTime"].asInt(); + } if (root["debug"].isBool()) { config.debug = root["debug"].asBool(); } @@ -171,9 +184,7 @@ Config ReadConfigFile(string file) { config.danmakuUrl = config.danmakuServer + "/subtitle?font=" + HostUrlEncode(config.danmakuFont) + "&font_size=" + config.danmakuFontSize + "&alpha=" + config.danmakuOpacity + "&display_area=" + config.danmakuDisplayArea + "&duration_marquee=" + config.danmakuStayTime + "&duration_still=" + config.danmakuStayTime + "&cid="; config.subtitleUrl = config.danmakuServer + "/subtitle?url="; } - if (root["blockP2PCDN"].isBool()) { - config.blockP2PCDN = root["blockP2PCDN"].asBool(); - } + } return config; } @@ -238,11 +249,50 @@ string UnixTimeToDate(int64 t) { return formatInt(y) + "-" + formatInt(m + 100).substr(1) + "-" + formatInt(int(d) + 101).substr(1) + " " + formatInt(h + 100).substr(1) + ":" + formatInt(min + 100).substr(1) + ":" + formatInt(s + 100).substr(1); } -string post(string url, string data="") { - log("request", url); - string res = HostUrlGetStringWithAPI(url); - if (res.empty()) HostMessageBox("未获取到响应数据, url: " + url, "请求失败"); - return res; +// string post(string url, string data="") { +// log("request", url); +// string res = HostUrlGetStringWithAPI(url); +// if (res.empty()) HostMessageBox("未获取到响应数据, url: " + url, "请求失败"); +// return res; +// } + +string post(string url, string data = "") { + int default_valid_time = 300000; + + string key; + if (!data.empty()) { + key = url + "\n" + data; + } else { + key = url; + } + + ResponseCacheItem item; + + if (ResponseCache.get(key, item)) { + if (HostGetTickCount() - item.tick_count <= item.valid_time) { + log("request cache hit", url); + return item.response; + } + log("request cache expired", url); + } + + string resp = HostUrlGetStringWithAPI(url); + if (resp.empty()) { + HostMessageBox("未获取到响应数据, url: " + url, "请求失败"); + return resp; + } + + if (item is null) { + ResponseCacheItem newItem = ResponseCacheItem(); + item = newItem; + } + + item.response = resp; + item.tick_count = HostGetTickCount(); + item.valid_time = default_valid_time; + ResponseCache[key] = @item; + + return resp; } string apiPost(string api, string data="") { @@ -314,14 +364,7 @@ array UGCSeason(const string &in path) { if (!aid.empty()) params += "aid=" + aid; if (bvid.empty() && aid.empty()) return videos; - string res; - if (videoIsUGCorPGC.url == makeWebUrl(path)){ - res = videoIsUGCorPGC.res; - } else { - res = apiPost("/x/web-interface/wbi/view/detail?" + params + "&w_rid=" + encWbi(params)); - videoIsUGCorPGC.url = makeWebUrl(path); - videoIsUGCorPGC.res = res; - } + string res = apiPost("/x/web-interface/wbi/view/detail?" + params + "&w_rid=" + encWbi(params)); JsonReader Reader; JsonValue Root; @@ -383,14 +426,7 @@ array RelatedVideos(const string &in path) { if (!aid.empty()) params += "aid=" + aid; if (bvid.empty() && aid.empty()) return videos; - string res; - if (videoIsUGCorPGC.url == makeWebUrl(path)){ - res = videoIsUGCorPGC.res; - } else { - res = apiPost("/x/web-interface/wbi/view/detail?" + params + "&w_rid=" + encWbi(params)); - videoIsUGCorPGC.url = makeWebUrl(path); - videoIsUGCorPGC.res = res; - } + string res = apiPost("/x/web-interface/wbi/view/detail?" + params + "&w_rid=" + encWbi(params)); JsonReader Reader; JsonValue Root; @@ -437,7 +473,7 @@ array RelatedVideos(const string &in path) { video["resolution"] = item["dimension"]["width"].asInt() + "x" + item["dimension"]["height"].asInt(); videos.insertLast(video); } else { - log("item is empty"); + log("item is not exists."); } } } @@ -461,7 +497,7 @@ string makeWebUrl(string path) { } string Video(string id, const string &in path, dictionary &MetaData, array &QualityList) { - log("--------------------------------------------------"); + log("==============================video============================="); string res; string bvid; string aid; @@ -474,21 +510,15 @@ string Video(string id, const string &in path, dictionary &MetaData, array subtitle; - if (videoIsUGCorPGC.url == makeWebUrl(path)){ - res = videoIsUGCorPGC.res; - } else { - if (id.find("BV") == 0) { - bvid = id; - params += "bvid=" + id; - } - if (id.find("av") == 0) { - aid = id; - params += "aid=" + id; - } - res = apiPost("/x/web-interface/wbi/view/detail?" + params + "&w_rid=" + encWbi(params)); - videoIsUGCorPGC.url = makeWebUrl(path); - videoIsUGCorPGC.res = res; + if (id.find("BV") == 0) { + bvid = id; + params += "bvid=" + id; } + if (id.find("av") == 0) { + aid = id; + params += "aid=" + id; + } + res = apiPost("/x/web-interface/wbi/view/detail?" + params + "&w_rid=" + encWbi(params)); if (reader.parse(res, root) && root.isObject()) { if (root["code"].asInt() == 0) { @@ -1296,6 +1326,7 @@ string md2ss(string mdid) { // type: meida_id/season_id/ep_id array Banggumi(string id, string type) { + log("============================Banggumi============================"); array videos; JsonReader Reader; JsonValue Root; @@ -1307,7 +1338,6 @@ array Banggumi(string id, string type) { type = "season_id"; } string url = "/pgc/view/web/season?" + type + "=" + id; - log("Banggumi request", url); string res = apiPost(url); if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() != 0) { @@ -1710,299 +1740,240 @@ string Audio(const string &in path, dictionary &MetaData, array &Qua return url; } -void appendLiveQualityFromRoot(JsonValue &in root, int reqQnInt, array &inout QualityList, string &inout selectedUrl, array &inout acceptCodecQnKeys, array &inout presentCodecQnKeys, array &inout insertedItemKeys, bool collectAcceptQn) { - JsonValue playurl = root["data"]["playurl_info"]["playurl"]; - JsonValue g_qn_desc = playurl["g_qn_desc"]; - JsonValue streams = playurl["stream"]; - if (!streams.isArray()) { - return; - } - for (int s = 0; s < streams.size(); s++) { - if (streams[s]["protocol_name"].asString() != "http_hls") { - continue; - } - - JsonValue formats = streams[s]["format"]; - if (!formats.isArray()) { - continue; - } - - string preferFormat = ""; - for (int i = 0; i < formats.size(); i++) { - string name = formats[i]["format_name"].asString(); - if (name == "fmp4") { - preferFormat = "fmp4"; - break; - } - if (name == "ts") { - preferFormat = "ts"; - } - } - if (preferFormat.empty()) { - continue; - } - - for (int f = 0; f < formats.size(); f++) { - if (formats[f]["format_name"].asString() != preferFormat) { - continue; - } - - JsonValue codecs = formats[f]["codec"]; - if (!codecs.isArray()) { - continue; - } - - for (int c = 0; c < codecs.size(); c++) { - JsonValue codec = codecs[c]; - string codecName = codec["codec_name"].asString(); - int currentQn = codec["current_qn"].asInt(); - int hdrType = codec["hdr_type"].asInt(); - - JsonValue videoColorInfo = codec["video_color_info"]; - int eotf = 0; - if (videoColorInfo.isObject() && videoColorInfo["eotf"].isNumeric()) { - eotf = videoColorInfo["eotf"].asInt(); - } - - if (collectAcceptQn) { - JsonValue acceptQn = codec["accept_qn"]; - if (acceptQn.isArray()) { - for (int i = 0; i < acceptQn.size(); i++) { - int qn = acceptQn[i].asInt(); - string key = codecName + "|" + qn; - - bool exists = false; - for (uint k = 0; k < acceptCodecQnKeys.length(); k++) { - if (acceptCodecQnKeys[k] == key) { - exists = true; - break; - } - } - if (!exists) { - acceptCodecQnKeys.insertLast(key); - } - } - } - } - - { - string presentKey = codecName + "|" + currentQn; - bool exists = false; - for (uint k = 0; k < presentCodecQnKeys.length(); k++) { - if (presentCodecQnKeys[k] == presentKey) { - exists = true; - break; - } - } - if (!exists) { - presentCodecQnKeys.insertLast(presentKey); - } - } - - JsonValue urlInfo = codec["url_info"]; - if (!urlInfo.isArray() || urlInfo.size() == 0) { - continue; - } - - string baseUrl = codec["base_url"].asString(); - string mainUrl = urlInfo[0]["host"].asString() + baseUrl + urlInfo[0]["extra"].asString(); - - if (selectedUrl.empty()) { - if (currentQn == reqQnInt) { - selectedUrl = mainUrl; - } else { - selectedUrl = mainUrl; - } - } - - string codecSuffix = " " + codecName; - if (codecName == "avc") { - codecSuffix = " AVC"; - } else if (codecName == "hevc") { - codecSuffix = " HEVC"; - } else if (codecName == "av1") { - codecSuffix = " AV1"; - } - - string uniqueMain = codecName + "|" + currentQn + "|" + hdrType + "|" + eotf + "|" + preferFormat + "|main"; - bool mainExists = false; - for (uint i = 0; i < insertedItemKeys.length(); i++) { - if (insertedItemKeys[i] == uniqueMain) { - mainExists = true; - break; - } - } - - if (!mainExists) { - dictionary qualityItemMain; - qualityItemMain["url"] = mainUrl; - qualityItemMain["quality"] = getLiveQuality(g_qn_desc, currentQn, hdrType, videoColorInfo) + codecSuffix; - qualityItemMain["qualityDetail"] = qualityItemMain["quality"]; - qualityItemMain["itag"] = getUniItag(); - qualityItemMain["qn"] = currentQn; - qualityItemMain["codec_name"] = codecName; - qualityItemMain["isHDR"] = (hdrType == 1); - - int w = 0; - int h = 0; - if (codec["media_info"].isObject()) { - w = codec["media_info"]["width"].asInt(); - h = codec["media_info"]["height"].asInt(); - } - qualityItemMain["resolution"] = w + "x" + h; - - int bitrate = 0; - string bitrateStr = HostRegExpParse(mainUrl, "(?:[?&]origin_bitrate=)([0-9]+)(?:&|$)"); - if (!bitrateStr.empty()) { - bitrate = HostString2UIntPtr(bitrateStr) * 1000; - } - qualityItemMain["bitrate"] = bitrate; - - QualityList.insertLast(qualityItemMain); - insertedItemKeys.insertLast(uniqueMain); - } - - if (urlInfo.size() > 1) { - string backupUrl = urlInfo[1]["host"].asString() + baseUrl + urlInfo[1]["extra"].asString(); - string uniqueBackup = codecName + "|" + currentQn + "|" + hdrType + "|" + eotf + "|" + preferFormat + "|backup"; - - bool backupExists = false; - for (uint i = 0; i < insertedItemKeys.length(); i++) { - if (insertedItemKeys[i] == uniqueBackup) { - backupExists = true; - break; - } - } - - if (!backupExists) { - dictionary qualityItemBackup; - qualityItemBackup["url"] = backupUrl; - qualityItemBackup["quality"] = "- " + getLiveQuality(g_qn_desc, currentQn, hdrType, videoColorInfo) + codecSuffix + " 备份"; - qualityItemBackup["qualityDetail"] = qualityItemBackup["quality"]; - qualityItemBackup["itag"] = getUniItag(); - qualityItemBackup["qn"] = currentQn; - qualityItemBackup["codec_name"] = codecName; - qualityItemBackup["isHDR"] = (hdrType == 1); - - int bw = 0; - int bh = 0; - if (codec["media_info"].isObject()) { - bw = codec["media_info"]["width"].asInt(); - bh = codec["media_info"]["height"].asInt(); - } - qualityItemBackup["resolution"] = bw + "x" + bh; - - int backupBitrate = 0; - string backupBitrateStr = HostRegExpParse(backupUrl, "(?:[?&]origin_bitrate=)([0-9]+)(?:&|$)"); - if (!backupBitrateStr.empty()) { - backupBitrate = HostString2UIntPtr(backupBitrateStr) * 1000; - } - qualityItemBackup["bitrate"] = backupBitrate; - - QualityList.insertLast(qualityItemBackup); - insertedItemKeys.insertLast(uniqueBackup); - } - } - } - } - } -} - string Live(string id, const string &in path, dictionary &MetaData, array &QualityList) { - string url = ""; - int room_id = 0; - string res = post("https://api.live.bilibili.com/xlive/web-room/v1/index/getInfoByRoom?room_id=" + id); + log("==============================live=============================="); + string url; + string res; + + res = post("https://api.live.bilibili.com/xlive/web-room/v1/index/getInfoByRoom?room_id=" + id); JsonReader Reader; JsonValue Root; if (!Reader.parse(res, Root) || !Root.isObject() || Root["code"].asInt() != 0) { - return ""; + return url; } JsonValue data = Root["data"]["room_info"]; - string author = Root["data"]["anchor_info"]["base_info"]["uname"].asString(); + MetaData["title"] = data["title"].asString(); + MetaData["thumbnail"] = data["cover"].asString(); + MetaData["author"] = Root["data"]["anchor_info"]["base_info"]["uname"].asString(); + MetaData["content"] = data["description"].asString(); + MetaData["webUrl"] = makeWebUrl(path); + MetaData["viewCount"] = Root["watched_show"]["num"].asString(); + MetaData["likeCount"] = Root["like_info_v3"]["like"].asString(); + + status = 3; + + array accept_qns; + string default_format; + string room_id = data["room_id"].asInt(); + int qn = 30000; - string desc = data["description"].asString(); - if (desc.empty()) { - desc = data["title"].asString(); + res = post("https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo?room_id=" + room_id + "&qn=" + qn + "&codec=0,1,2&format=0,1,2&mask=0&no_playurl=0&platform=web&protocol=0,1&eotf=0,1,2"); + if (!Reader.parse(res, Root) || !Root.isObject() || Root["code"].asInt() != 0) { + return url; } - MetaData["author"] = author; - MetaData["content"] = data["area_name"].asString() + " | " + desc; - MetaData["webUrl"] = makeWebUrl(path); - MetaData["thumbnail"] = data["cover"].asString(); - room_id = data["room_id"].asInt(); - status = 3; - string req_qn = parse(path, "qn", "30000"); - int reqQnInt = parseInt(req_qn); + JsonValue playurl = Root["data"]["playurl_info"]["playurl"]; + if (!playurl.isObject()) { + log('Root["data"]["playurl_info"]["playurl"] is not exists.'); + return url; + } - res = post("https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo?room_id=" + room_id + "&qn=" + req_qn + "&codec=0,1,2&format=0,1,2&mask=0&no_playurl=0&platform=web&protocol=0,1&eotf=0,1,2"); - if (!Reader.parse(res, Root) || !Root.isObject() || Root["code"].asInt() != 0) { - return ""; - } + JsonValue g_qn_desc = playurl["g_qn_desc"]; + if (!g_qn_desc.isArray()) { + log('Root["data"]["playurl_info"]["playurl"]["g_qn_desc"] is not array.'); + return url; + } - array acceptCodecQnKeys; - array presentCodecQnKeys; - array insertedItemKeys; - array requestedQn; + JsonValue streams = playurl["stream"]; + if (!streams.isArray()) { + log('streams is not array.'); + return url; + } - appendLiveQualityFromRoot(Root, reqQnInt, QualityList, url, acceptCodecQnKeys, presentCodecQnKeys, insertedItemKeys, true); + for (int s = 0; s < streams.size(); s++) { + if (streams[s]["protocol_name"].asString() != "http_hls") { + continue; + } - while (true) { - int missingQn = -1; + JsonValue formats = streams[s]["format"]; + if (!formats.isArray()) { + continue; + } - for (uint i = 0; i < acceptCodecQnKeys.length(); i++) { - string k = acceptCodecQnKeys[i]; + // 一些小主播不提供 fmp4,优先选择 fmp4,其次 ts + for (int a = 0; a < formats.size(); a++) { + string format_name_candidate = formats[a]["format_name"].asString(); + if (format_name_candidate == "fmp4") { + default_format = "fmp4"; + break; + } + if (format_name_candidate == "ts") { + default_format = "ts"; + } + } + if (default_format.empty()) { + log("formats(fmp4 and ts) is not exists."); + continue; + } - bool present = false; - for (uint p = 0; p < presentCodecQnKeys.length(); p++) { - if (presentCodecQnKeys[p] == k) { - present = true; - break; - } - } - if (present) { - continue; - } + for (int f = 0; f < formats.size(); f++) { + if (formats[f]["format_name"].asString() != default_format) { + continue; + } - array parts = k.split("|"); - if (parts.length() < 2) { - continue; - } + JsonValue codecs = formats[f]["codec"]; + if (!codecs.isArray()) { + continue; + } - int qn = parseInt(parts[1]); + for (int i = 0; i < codecs.size(); i++) { + JsonValue codec = codecs[i]; - bool alreadyRequested = false; - for (uint r = 0; r < requestedQn.length(); r++) { - if (requestedQn[r] == qn) { - alreadyRequested = true; - break; - } - } - if (alreadyRequested) { - continue; - } + JsonValue qnValue = codec["accept_qn"]; + if (qnValue.isArray()) { + for (int j = 0; j < qnValue.size(); j++) { + int qn = qnValue[j].asInt(); - missingQn = qn; - break; - } + if (accept_qns.find(qn) < 0) { + accept_qns.insertLast(qn); + } + } + } + } + } + } - if (missingQn < 0) { - break; - } + int best_qn = 0; + for (int i = 0; i < accept_qns.size(); i++) { + if (best_qn < accept_qns[i]) { + best_qn = accept_qns[i]; + } + } - requestedQn.insertLast(missingQn); + for (int i = 0; i < accept_qns.size(); i++) { + qn = accept_qns[i]; + res = post("https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo?room_id=" + room_id + "&qn=" + accept_qns[i] + "&codec=0,1,2&format=0,1,2&mask=0&no_playurl=0&platform=web&protocol=0,1&eotf=0,1,2"); - string extraRes = post("https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo?room_id=" + room_id + "&qn=" + missingQn + "&codec=0,1,2&format=0,1,2&mask=0&no_playurl=0&platform=web&protocol=0,1&eotf=0,1,2"); + if (!Reader.parse(res, Root) || !Root.isObject() || Root["code"].asInt() != 0) { + return url; + } - JsonValue extraRoot; - if (!Reader.parse(extraRes, extraRoot) || !extraRoot.isObject() || extraRoot["code"].asInt() != 0) { - continue; - } + JsonValue playurl = Root["data"]["playurl_info"]["playurl"]; + if (!playurl.isObject()) { + log('Root["data"]["playurl_info"]["playurl"] is not exists.'); + return url; + } - appendLiveQualityFromRoot(extraRoot, reqQnInt, QualityList, url, acceptCodecQnKeys, presentCodecQnKeys, insertedItemKeys, false); - } + g_qn_desc = playurl["g_qn_desc"]; + if (!g_qn_desc.isArray()) { + log('Root["data"]["playurl_info"]["playurl"]["g_qn_desc"] is not array.'); + return url; + } + + JsonValue streams = playurl["stream"]; + if (!streams.isArray()) { + log('streams is not array.'); + return url; + } + for (int s = 0; s < streams.size(); s++) { + if (streams[s]["protocol_name"].asString() != "http_hls") { + continue; + } + + JsonValue formats = streams[s]["format"]; + if (!formats.isArray()) { + continue; + } + + for (int f = 0; f < formats.size(); f++) { + if (formats[f]["format_name"].asString() != default_format) { + continue; + } + + JsonValue codecs = formats[f]["codec"]; + if (!codecs.isArray()) { + continue; + } + + for (int i = 0; i < codecs.size(); i++) { + JsonValue codec = codecs[i]; + string codec_name = codec["codec_name"].asString(); + if (codec["current_qn"].asInt() != qn) { + continue; + } + + JsonValue url_infos = codec["url_info"]; + if (!url_infos.isArray() || url_infos.size() == 0) { + continue; + } + + dictionary qualityItemMain; + dictionary qualityItemBackup; + + string codec_suffix; + int codecOffset = 1; + if (codec_name == "avc") { + codec_suffix = " AVC"; + codecOffset = 1; + } else if (codec_name == "hevc") { + codec_suffix = " HEVC"; + codecOffset = 2; + } else if (codec_name == "av1") { + codec_suffix = " AV1"; + codecOffset = 3; + } else { + codec_suffix = " " + codec_name; + codecOffset = 4; + } + + + JsonValue video_color_info = codec["video_color_info"]; + bool isHDR = false; + if (codec["hdr_type"].asInt() == 1) { + isHDR = true; + } + int bitrate = 0; + string bitrateStr; + + string main_url = codec["url_info"][0]["host"].asString() + codec["base_url"].asString() + codec["url_info"][0]["extra"].asString(); + if (best_qn == codec["current_qn"].asInt() && url.empty()) url = main_url; + qualityItemMain["url"] = main_url; + qualityItemMain["quality"] = getLiveQuality(g_qn_desc, codec["current_qn"].asInt(), codec["hdr_type"].asInt(), video_color_info) + codec_suffix; + // qualityItemMain["quality"] = getLiveQualityNew(g_qn_desc, codec["current_qn"].asInt(), codec["hdr_type"].asInt(), video_color_info); + // qualityItemMain["format"] = codec_name; + qualityItemMain["qualityDetail"] = qualityItemMain["quality"]; + qualityItemMain["itag"] = getUniItag(); + qualityItemMain["resolution"] = codec["width"].asInt() + "x" + codec["height"].asInt(); + qualityItemMain["isHDR"] = isHDR; + bitrateStr = HostRegExpParse(main_url, "(?:[?&]origin_bitrate=)(\\d+)(?:&|$)"); + if (!bitrateStr.empty()) bitrate = HostString2UIntPtr(bitrateStr); + qualityItemMain["bitrate"] = bitrate * 1000; + if (@QualityList !is null) QualityList.insertLast(qualityItemMain); + + if (url_infos.size() <= 1) { + continue; + } + + string backup_url = codec["url_info"][1]["host"].asString() + codec["base_url"].asString() + codec["url_info"][1]["extra"].asString(); + qualityItemBackup["url"] = backup_url; + qualityItemBackup["quality"] = "- " + getLiveQuality(g_qn_desc, codec["current_qn"].asInt(), codec["hdr_type"].asInt(), video_color_info) + codec_suffix + " 备份"; + // qualityItemBackup["quality"] = "- " + getLiveQualityNew(g_qn_desc, codec["current_qn"].asInt(), codec["hdr_type"].asInt(), video_color_info) + " 备份"; + // qualityItemBackup["format"] = codec_name; + qualityItemBackup["qualityDetail"] = qualityItemBackup["quality"]; + qualityItemBackup["itag"] = getUniItag(); + qualityItemBackup["resolution"] = codec["width"].asInt() + "x" + codec["height"].asInt(); + qualityItemBackup["isHDR"] = isHDR; + bitrateStr = HostRegExpParse(url, "(?:[?&]origin_bitrate=)(\\d+)(?:&|$)"); + if (!bitrateStr.empty()) bitrate = HostString2UIntPtr(bitrateStr); + qualityItemBackup["bitrate"] = bitrate * 1000; + if (@QualityList !is null) QualityList.insertLast(qualityItemBackup); + } + } + } + } log("url", url); // log("Quality items", QualityList.length()); // for (uint i = 0; i < QualityList.length(); i++) { @@ -2023,15 +1994,7 @@ bool isPlaylist(const string &in path) { if (!aid.empty()) params += "aid=" + aid; if (bvid.empty() && aid.empty()) return false; - string res; - if (videoIsUGCorPGC.url == path){ - res = videoIsUGCorPGC.res; - } else { - string req = "/x/web-interface/wbi/view/detail?" + params + "&w_rid=" + encWbi(params); - res = apiPost(req); - videoIsUGCorPGC.url = makeWebUrl(path); - videoIsUGCorPGC.res = res; - } + string res = apiPost("/x/web-interface/wbi/view/detail?" + params + "&w_rid=" + encWbi(params)); JsonReader Reader; JsonValue Root; @@ -2056,7 +2019,7 @@ bool isPlaylist(const string &in path) { } bool PlayitemCheck(const string &in path) { - log("PlayitemCheck - path: ", path); + log("PlayitemCheck - path", path); status = 0; if (path.find("bilibili.com") < 0) { return false; @@ -2259,7 +2222,7 @@ array PlaylistParse(const string &in url) { } string PlayitemParse(const string &in path, dictionary &MetaData, array &QualityList) { - log("Playitem - path", path); + log("PlayitemParse - path", path); status = 2; if (path.find("/video/BV") >= 0 ) { diff --git a/README.md b/README.md index 6d07b19..a732719 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,10 @@ ## 其它改进 +### 🔧 整体优化 +- 增加请求响应数据缓存,减少重复请求,降低 API 请求次数。 +- 清理并移除部分无用旧代码,进行较大幅度的代码重构与整理。 + ### 📺 直播 - 支持 AVC、HEVC、AV1 @@ -35,7 +39,7 @@ - 支持屏蔽 P2PCDN,可通过配置文件调整,默认屏蔽 - 修复部分 Host 为 `upos` 的点播 URL 播放失败的问题 - Bilibili 点播更换新接口,尽量使用wbi签名认证防止接口失效 -- 重新支持用户合集视频,potplayer 播放列表( 快捷键 F6 ) 正确显示合集视频。当存在用户视频合集时,播放列表里只展示合集视频。当只存在单个视频时,播放列表里包含当前视频与推荐视频(是否包含推荐视频取决于配置文件`showRecommendedVideos`开关) +- 重新支持用户合集视频,并支持多合集,potplayer 播放列表( 快捷键 F6 ) 正确显示合集视频。当存在用户视频合集时,播放列表里只展示合集视频。当只存在单个视频时,播放列表里包含当前视频与推荐视频(是否包含推荐视频取决于配置文件`showRecommendedVideos`开关) - 播放番剧,电视剧等其它PGC合集或用户合集时,正确定位当前视频,不会出现从第一集开始播放的问题 - 支持AV播放地址 - 优化 Bilibili 音频画质选项显示: @@ -43,7 +47,6 @@ - `FLAC` → **Hi-Res 无损 FLAC** - 当同时存在杜比全景声与Hi-Res无损时,默认使用Hi-Res无损。 - 请求本地缓存,尽量减少请求次数 -- 移除无用旧代码,比较激进。 - 视频与播放列表增加多项属性,如果你足够细心的话,就可以发现。 @@ -51,7 +54,6 @@ * 支持精准空降(视 PotPlayer 是否提供相关支持)。 * 支持空降助手。 -* 直播播放目前存在 `exception` 异常,但暂未发现其对实际播放造成影响;当前播放及画质选项均正常。 # 一些可能的问题及解决办法 @@ -103,6 +105,12 @@ 完成后重新启动 PotPlayer,再尝试播放。 +## 其它 +目前搭配的油猴脚本 [BilibiliPotPlayer](https://greasyfork.org/zh-CN/scripts/461800-bilibilipotplayer),已增加 “打开 PotPlayer 时自动暂停网页端视频” 的功能。 + +修改版脚本地址:[https://greasyfork.org/zh-CN/scripts/593353-bilibilipotplayer-改](https://greasyfork.org/zh-CN/scripts/593353-bilibilipotplayer-改) + +声明:基于原作者的 [BilibiliPotPlayer](https://greasyfork.org/zh-CN/scripts/461800-bilibilipotplayer) 修改而来,并保留原作者及原项目相关信息。如原作者对本脚本的发布或再分发存在异议,并要求停止发布,本人将配合下架本脚本。 ## 安装插件 From eec8af2359fc6c77897c35043a55791cfdd7a9df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Sat, 29 Aug 2026 02:41:11 +0800 Subject: [PATCH 090/132] update README.md --- README.md | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index a732719..cd72186 100644 --- a/README.md +++ b/README.md @@ -105,12 +105,21 @@ 完成后重新启动 PotPlayer,再尝试播放。 -## 其它 -目前搭配的油猴脚本 [BilibiliPotPlayer](https://greasyfork.org/zh-CN/scripts/461800-bilibilipotplayer),已增加 “打开 PotPlayer 时自动暂停网页端视频” 的功能。 +## 油猴脚本 -修改版脚本地址:[https://greasyfork.org/zh-CN/scripts/593353-bilibilipotplayer-改](https://greasyfork.org/zh-CN/scripts/593353-bilibilipotplayer-改) +由于从 PotPlayer 内部实现精准空降存在一定难度[1](#关于精准空降),因此目前采用外部油猴脚本的方式实现其功能。 + +目前修改版脚本 [BilibiliPotPlayer-改](https://greasyfork.org/zh-CN/scripts/593353-bilibilipotplayer-改) 支持: + +* **精准空降**:将网页端指定的播放时间传递给 PotPlayer,实现精准跳转。 + +* **打开 PotPlayer 时自动暂停网页端视频**:启动 PotPlayer 播放后,自动暂停 Bilibili 网页端正在播放的视频,避免音视频重复播放。 + + +### 声明 + +修改版脚本 `BilibiliPotPlayer-改` [https://greasyfork.org/zh-CN/scripts/593353-bilibilipotplayer-改](https://greasyfork.org/zh-CN/scripts/593353-bilibilipotplayer-%E6%94%B9)) 基于`原版油猴脚本` [油猴脚本https://greasyfork.org/zh-CN/scripts/461800-bilibilipotplayer](https://greasyfork.org/zh-CN/scripts/461800-bilibilipotplayer),并保留原作者及原项目相关信息。如原作者对本脚本的发布或再分发存在异议,并要求停止发布,本人将配合下架本脚本。 -声明:基于原作者的 [BilibiliPotPlayer](https://greasyfork.org/zh-CN/scripts/461800-bilibilipotplayer) 修改而来,并保留原作者及原项目相关信息。如原作者对本脚本的发布或再分发存在异议,并要求停止发布,本人将配合下架本脚本。 ## 安装插件 @@ -191,3 +200,10 @@ - [bilibili-API-collect](https://github.com/SocialSisterYi/bilibili-API-collect) - [Make-Bilibili-Great-Than-Ever-Before](https://github.com/SukkaW/Make-Bilibili-Great-Than-Ever-Before) - [hgcat-360/PotPlayer-Extension_yt-dlp](https://github.com/hgcat-360/PotPlayer-Extension_yt-dlp) + + +## 关于精准空降 + +目前发现 PotPlayer 可支持精准空降,但分析 `MediaPlayParse - YouTube.as` 文件后,未找到其相关控制代码。 + +目前精准空降的实现是通过搭配的[修改版油猴脚本](#油猴脚本)实现。 From 31ba00f69bbd147adcf4e2e3a76f2624826ff32e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Sun, 30 Aug 2026 01:54:18 +0800 Subject: [PATCH 091/132] =?UTF-8?q?1.=20=E6=94=AF=E6=8C=81=E7=A9=BA?= =?UTF-8?q?=E9=99=8D=E5=8A=A9=E6=89=8B.=202.=20=E7=BB=86=E8=8A=82=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 314 +++++++++++++++---- README.md | 28 +- public/skip_2.png | Bin 21502 -> 65186 bytes 3 files changed, 281 insertions(+), 61 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 6537968..7061657 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -33,9 +33,9 @@ Config ConfigData; VideoIsUGCorPGC videoIsUGCorPGC; dictionary ResponseCache; -string ConfigFileName = "Bilibili_Config.json"; -array BilibiliDomains = {"bilibili.com", "bilivideo.com", "bilivideo.cn"}; -array knownP2pCdnDomainPattern = { +const string ConfigFileName = "Bilibili_Config.json"; +const array BilibiliDomains = {"bilibili.com", "bilivideo.com", "bilivideo.cn"}; +const array knownP2pCdnDomainPattern = { "302ppio", "302kodo", ".mcdn.bilivideo", @@ -45,10 +45,10 @@ array knownP2pCdnDomainPattern = { "upos-sz-mirror14b.bilivideo.com" }; -void OnInitialize() { - string UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36 Edg/151.0.0.0"; - string Referer = "https://www.bilibili.com"; +const string UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36 Edg/151.0.0.0"; +const string Referer = "https://www.bilibili.com"; +void OnInitialize() { for (uint i = 0; i < BilibiliDomains.length(); i++) { HostSetUrlUserAgentHTTP(BilibiliDomains[i], UserAgent); HostSetUrlRefererHTTP(BilibiliDomains[i], Referer); @@ -73,7 +73,7 @@ string GetTitle() { } string GetVersion() { - return "1.3"; + return "2.6.8"; } string GetDesc() { @@ -114,6 +114,7 @@ class Config { bool showRecommendedVideos = true; bool blockP2PCDN = true; int cacheValidTime = 300; + bool enableSponsorBlock = false; bool debug = false; string danmakuUrl; @@ -177,6 +178,10 @@ Config ReadConfigFile(string file) { if (root["cacheValidTime"].isNumeric()) { config.cacheValidTime = root["cacheValidTime"].asInt(); } + if (root["enableSponsorBlock"].isBool()) { + config.enableSponsorBlock = root["enableSponsorBlock"].asBool(); + } + if (root["debug"].isBool()) { config.debug = root["debug"].asBool(); } @@ -196,21 +201,31 @@ string GetStatus() { switch (status) { case 1: - info = "Parsing bilibili playlist"; + info = "单视频检查"; break; case 2: - info = "Parsing bilibili video/audio"; + info = "合集检查"; break; case 3: - info = "Parsing bilibili playback link"; + info = "解析视频合集"; + break; + case 4: + info = "解析视频信息"; + break; + case 5: + info = "请求空降助手接口"; + break; + case 6: + info = "解析真实播放地址"; break; default: - info = "Waiting for parsing"; + info = "请等待"; } return info; } + void log(string item) { if (!ConfigData.debug) { return; @@ -249,37 +264,39 @@ string UnixTimeToDate(int64 t) { return formatInt(y) + "-" + formatInt(m + 100).substr(1) + "-" + formatInt(int(d) + 101).substr(1) + " " + formatInt(h + 100).substr(1) + ":" + formatInt(min + 100).substr(1) + ":" + formatInt(s + 100).substr(1); } -// string post(string url, string data="") { -// log("request", url); -// string res = HostUrlGetStringWithAPI(url); -// if (res.empty()) HostMessageBox("未获取到响应数据, url: " + url, "请求失败"); -// return res; -// } +string post(string url, string data="", string headers="") { + if (headers.empty()) headers = "User-Agent: " + UserAgent + "\r\n" + "Referer: " + Referer + "\r\n"; + log("request url", url); + return HostUrlGetStringWithAPI(url, "", headers, data); +} -string post(string url, string data = "") { - int default_valid_time = 300000; - +string apiPost(string api, string data="") { string key; if (!data.empty()) { - key = url + "\n" + data; + key = api + "\n" + data; } else { - key = url; + key = api; } ResponseCacheItem item; + if (ResponseCache.get(key, item) && HostGetTickCount() - item.tick_count <= item.valid_time) return item.response; - if (ResponseCache.get(key, item)) { - if (HostGetTickCount() - item.tick_count <= item.valid_time) { - log("request cache hit", url); - return item.response; - } - log("request cache expired", url); + string resp = post(host + api, data); + if (resp.empty()) { + HostMessageBox("未获取到响应数据,请等待一段时间后重试一下\nurl: " + host + api, "请求失败"); + return ""; } - string resp = HostUrlGetStringWithAPI(url); - if (resp.empty()) { - HostMessageBox("未获取到响应数据, url: " + url, "请求失败"); - return resp; + JsonReader Reader; + JsonValue Root; + if (!Reader.parse(resp, Root) || !Root.isObject()) { + HostMessageBox("未能解析响应数据\nurl: " + host + api, "请求失败"); + return ""; + } + if (Root["code"].asInt() != 0) { + log("error code: " + Root["code"].asInt() + "\n" + "error message: " + Root["message"].asString() + "\n" + "url:" + host + api); + HostMessageBox("error code: " + Root["code"].asInt() + "\n" + "error message: " + Root["message"].asString() + "\n" + "url:" + host + api, Root["message"].asString()); + return ""; } if (item is null) { @@ -289,14 +306,198 @@ string post(string url, string data = "") { item.response = resp; item.tick_count = HostGetTickCount(); - item.valid_time = default_valid_time; - ResponseCache[key] = @item; + item.valid_time = ConfigData.cacheValidTime * 1000; + ResponseCache[key] = item; return resp; } -string apiPost(string api, string data="") { - return post(host + api); +array generateChapter(const string &in bvid) { + array chapter; + const float MIN_CHAPTER_DURATION = 1.0f; + dictionary typesToName = { + {"sponsor", "赞助"}, + {"selfpromo", "推广"}, + {"exclusive_access", "品牌合作"}, + {"interaction", "三连提醒"}, + {"poi_highlight", "精彩时刻"}, + {"intro", "开场动画"}, + {"outro", "片尾"}, + {"preview", "预览"}, + {"padding", "填充内容"}, + {"filler", "离题"}, + {"music_offtopic", "非音乐"} + }; + + string headers = "origin: chrome-extension://eaoelafamejbnggahofapllmfhlhajdd\r\nx-ext-version: 0.13.1\r\n"; + string url = "https://bsbsb.top/api/skipSegments?videoID=" + bvid; + + // headers += "User-Agent: " + UserAgent + "\r\n" + "Referer: " + Referer; + // string temp = HostUrlGetString("http://localhost:8080", "", headers); + // temp = post("http://localhost:8080"); + // temp = HostUrlGetStringWithAPI("http://localhost:8080", "", headers); + + string resp; + for (int i = 0; i < 3; i++) { + uint start = HostGetTickCount(); + resp = post(url, "", headers); + uint elapsed = HostGetTickCount() - start; + HostPrintUTF8("SponsorBlock Request #" + i + ": " + elapsed + " ms"); + } + + // string resp = HostUrlGetString(url, "", headers); + uint parsingStart = HostGetTickCount(); + + if (resp.empty()) { + log("SponsorBlock response is empty. url: " + url); + return chapter; + } + + JsonReader Reader; + JsonValue SponsorBlock; + + if (!Reader.parse(resp, SponsorBlock) || !SponsorBlock.isArray()) { + log("Failed to parse SponsorBlock response. url: " + url); + return chapter; + } + log("SponsorBlock Parsing: " + ( HostGetTickCount() - parsingStart) + " ms"); + if (SponsorBlock.size() == 0) return chapter; + + array starts; + array ends; + array titles; + array times; + + for (int i = 0; i < SponsorBlock.size(); i++) { + JsonValue item = SponsorBlock[i]; + string category = item["category"].asString(); + + if (!typesToName.exists(category)) continue; + + float start = item["segment"][0].asFloat(); + float end = item["segment"][1].asFloat(); + + if (start >= end) continue; + + starts.insertLast(start); + ends.insertLast(end); + titles.insertLast(string(typesToName[category])); + + times.insertLast(start); + times.insertLast(end); + } + + if (starts.size() == 0) return chapter; + + for (int i = 1; i < times.size(); i++) { + float value = times[i]; + int j = i - 1; + + while (j >= 0 && times[j] > value) { + times[j + 1] = times[j]; + j--; + } + + times[j + 1] = value; + } + + array sortedTimes; + + for (int i = 0; i < times.size(); i++) { + if (sortedTimes.size() == 0 || + sortedTimes[sortedTimes.size() - 1] != times[i]) { + sortedTimes.insertLast(times[i]); + } + } + + array resultTimes; + array resultTitles; + string lastTitle; + + for (int i = 0; i < sortedTimes.size(); i++) { + float time = sortedTimes[i]; + + string currentTitle; + float selectedStart = -1; + + for (int j = 0; j < starts.size(); j++) { + if (starts[j] <= time && ends[j] > time) { + if (starts[j] > selectedStart) { + selectedStart = starts[j]; + currentTitle = titles[j]; + } + } + } + + if (currentTitle.empty()) currentTitle = "正片"; + if (currentTitle == lastTitle) continue; + + resultTimes.insertLast(time); + resultTitles.insertLast(currentTitle); + lastTitle = currentTitle; + } + + array filteredTimes; + array filteredTitles; + + for (int i = 0; i < resultTimes.size(); i++) { + if (i == 0) { + filteredTimes.insertLast(resultTimes[i]); + filteredTitles.insertLast(resultTitles[i]); + continue; + } + + float duration = resultTimes[i] - resultTimes[i - 1]; + + if (duration < MIN_CHAPTER_DURATION) { + if (filteredTimes.size() > 0) { + filteredTimes.removeLast(); + filteredTitles.removeLast(); + } + + filteredTimes.insertLast(resultTimes[i]); + filteredTitles.insertLast(resultTitles[i]); + continue; + } + + filteredTimes.insertLast(resultTimes[i]); + filteredTitles.insertLast(resultTitles[i]); + } + + array finalTimes; + array finalTitles; + + for (int i = 0; i < filteredTimes.size(); i++) { + if (finalTitles.size() > 0 && + finalTitles[finalTitles.size() - 1] == filteredTitles[i]) { + continue; + } + + finalTimes.insertLast(filteredTimes[i]); + finalTitles.insertLast(filteredTitles[i]); + } + + for (int i = 0; i < finalTimes.size(); i++) { + dictionary chapterItem; + + chapterItem["title"] = finalTitles[i]; + chapterItem["time"] = formatFloat(finalTimes[i] * 1000, "", 32, 0); + chapter.insertLast(chapterItem); + } + + for (int i = 0; i < chapter.size(); i++) { + string title; + string time; + + chapter[i].get("title", title); + chapter[i].get("time", time); + + log("Chapter: " + title + " Time: " + time); + } + + uint parsingEnd = HostGetTickCount(); + log("SponsorBlock Parsing: " + ( HostGetTickCount() - parsingStart) + " ms"); + return chapter; } string getMixinKey() { @@ -476,6 +677,8 @@ array RelatedVideos(const string &in path) { log("item is not exists."); } } + } else { + log("no related videos"); } } else { log("Video view API code != 0", Root["code"].asInt()); @@ -539,7 +742,12 @@ string Video(string id, const string &in path, dictionary &MetaData, array chapter = generateChapter(bvid); + if (!chapter.empty() && (@QualityList !is null)) MetaData["chapter"] = chapter; + status = 4; + } if (ConfigData.danmakuEnable) { dictionary dic; dic["name"] = "【弹幕】" + title; @@ -598,7 +806,7 @@ string Video(string id, const string &in path, dictionary &MetaData, array &Qua } } - status = 3; + status = 6; res = post("https://www.bilibili.com/audio/music-service-c/web/url?privilege=2&quality=2&sid=" + id); res = HostDecompress(res); if (Reader.parse(res, Root) && Root.isObject()) { @@ -1762,7 +1970,7 @@ string Live(string id, const string &in path, dictionary &MetaData, array accept_qns; string default_format; @@ -1983,10 +2191,6 @@ string Live(string id, const string &in path, dictionary &MetaData, array= 0) { return true; } - + log("PlayitemCheck", "false"); return false; } bool PlaylistCheck(const string &in path) { log("PlaylistCheck - path: ", path); - status = 0; + status = 2; if (path.find("bilibili.com") < 0) { return false; } if (isPlaylist(path)) { return true; } - if (!parseBVId(path).empty() || !parseAVId(path).empty()) { - return true; - } + // if (!parseBVId(path).empty() || !parseAVId(path).empty()) { + // return true; + // } if (path.find("search.bilibili.com") >= 0) { return true; } @@ -2123,13 +2328,14 @@ bool PlaylistCheck(const string &in path) { return true; } + log("PlaylistCheck", "false"); return false; } array PlaylistParse(const string &in url) { string path = url; log("PlaylistParse - path", path); - status = 1; + status = 3; array result; if (videoIsUGCorPGC.isPGC) path = videoIsUGCorPGC.pgcURL; @@ -2223,7 +2429,7 @@ array PlaylistParse(const string &in url) { string PlayitemParse(const string &in path, dictionary &MetaData, array &QualityList) { log("PlayitemParse - path", path); - status = 2; + status = 4; if (path.find("/video/BV") >= 0 ) { string bvid = parseBVId(path); diff --git a/README.md b/README.md index cd72186..31aa860 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ ## 其它改进 ### 🔧 整体优化 -- 增加请求响应数据缓存,减少重复请求,降低 API 请求次数。 +- 本地缓存响应数据,降低 API 请求次数。可在配置文件中设置,默认300。 - 清理并移除部分无用旧代码,进行较大幅度的代码重构与整理。 ### 📺 直播 @@ -46,14 +46,14 @@ - `EC-3` → **杜比全景声 EC-3** - `FLAC` → **Hi-Res 无损 FLAC** - 当同时存在杜比全景声与Hi-Res无损时,默认使用Hi-Res无损。 -- 请求本地缓存,尽量减少请求次数 - 视频与播放列表增加多项属性,如果你足够细心的话,就可以发现。 +- 增加 [空降助手](https://github.com/hanydd/BilibiliSponsorBlock) 支持。作者所在网络线路访问空降助手服务端 ipv6 地址不稳定,默认禁用。 ## TODO -* 支持精准空降(视 PotPlayer 是否提供相关支持)。 -* 支持空降助手。 +* ~~支持精准空降(视 PotPlayer 是否提供相关支持)~~,目前搭配油猴脚本实现。 +* ~~支持空降助手~~。 # 一些可能的问题及解决办法 @@ -163,15 +163,29 @@ ![Search](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/search.png) -### 跳过片头片尾 +### 跳过片头片尾(通过空降助手) 对于一些电视剧、番剧,能够跳过片头和片尾。具体设置为:在 PotPlayer 上点击鼠标右键,选择`播放`-`跳略播放`-`跳略播放设置` ![Skip_Settings](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/skip_1.png) -勾选`跳略播放`和`章节名称`,并在名称列表中追加`哔哩哔哩-片头`和`哔哩哔哩-片尾`两项,每一项之间用英文分号`;`隔开。 +勾选`跳略播放`和`章节名称`,并在名称列表中追加片段名称(例如:`片头`和`片尾`),每一项之间用英文分号`;`隔开,所有片段名称如下: -![Skip_Settings](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/skip_2.png) +- `赞助` +- `推广` +- `品牌合作` +- `三连提醒` +- `精彩时刻` +- `开场动画` +- `片尾` +- `预览` +- `填充内容` +- `离题` +- `非音乐` + +**注**:是否存在这些片段跳过取决于 [空降助手](https://github.com/hanydd/BilibiliSponsorBlock) 服务端是否有该视频对应的数据,而数据需要用户手动上传。网页端可安装 [浏览器扩展](https://chromewebstore.google.com/detail/%E5%B0%8F%E7%94%B5%E8%A7%86%E7%A9%BA%E9%99%8D%E5%8A%A9%E6%89%8B/eaoelafamejbnggahofapllmfhlhajdd),欢迎添加片段。 + +![Skip_Settings](/public/skip_2.png) ### 在列表中显示缩略图 diff --git a/public/skip_2.png b/public/skip_2.png index 39091bc9fdb3e46f42ff6045f67bfb6119f054a6..eb984145636849d3c11d2953daa749c614a177ed 100644 GIT binary patch literal 65186 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 Jyz08^{{U0?V*daD literal 21502 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 Cn}g^8 From bf1c4ca6635600b446f36b24e6451f9f4ce8573d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Sun, 30 Aug 2026 01:57:53 +0800 Subject: [PATCH 092/132] update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 31aa860..9c110de 100644 --- a/README.md +++ b/README.md @@ -218,6 +218,6 @@ ## 关于精准空降 -目前发现 PotPlayer 可支持精准空降,但分析 `MediaPlayParse - YouTube.as` 文件后,未找到其相关控制代码。 +目前发现 PotPlayer 播放 youtube 可支持精准空降,但分析研究 `MediaPlayParse - YouTube.as`,未找到其相关控制代码。 目前精准空降的实现是通过搭配的[修改版油猴脚本](#油猴脚本)实现。 From 9602061ce9cce40c93103af09d14429c5e189d71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Sun, 30 Aug 2026 11:45:46 +0800 Subject: [PATCH 093/132] =?UTF-8?q?1.=20=E5=A2=9E=E5=8A=A0=E7=A9=BA?= =?UTF-8?q?=E9=99=8D=E5=8A=A9=E6=89=8B=E9=85=8D=E7=BD=AE=E9=A1=B9=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E6=94=AF=E6=8C=81=E6=8C=87=E5=AE=9A=E9=95=9C=E5=83=8F?= =?UTF-8?q?=E7=AB=99=E7=82=B9=202.=20=E4=BC=98=E5=8C=96=E5=B9=B6=E6=B8=85?= =?UTF-8?q?=E7=90=86=E9=83=A8=E5=88=86=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 94 ++++---------------- README.md | 8 +- 2 files changed, 19 insertions(+), 83 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 7061657..54046d0 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -115,6 +115,7 @@ class Config { bool blockP2PCDN = true; int cacheValidTime = 300; bool enableSponsorBlock = false; + string sponsorBlockMirror; bool debug = false; string danmakuUrl; @@ -181,6 +182,9 @@ Config ReadConfigFile(string file) { if (root["enableSponsorBlock"].isBool()) { config.enableSponsorBlock = root["enableSponsorBlock"].asBool(); } + if (root["sponsorBlockMirror"].isString()) { + config.sponsorBlockMirror = root["sponsorBlockMirror"].asString(); + } if (root["debug"].isBool()) { config.debug = root["debug"].asBool(); @@ -273,13 +277,22 @@ string post(string url, string data="", string headers="") { string apiPost(string api, string data="") { string key; if (!data.empty()) { - key = api + "\n" + data; + key = api + "?" + data; } else { key = api; } ResponseCacheItem item; - if (ResponseCache.get(key, item) && HostGetTickCount() - item.tick_count <= item.valid_time) return item.response; + if (ResponseCache.get(key, item)) { + if (HostGetTickCount() - item.tick_count <= item.valid_time) { + log("Cache Hit, url:", api); + return item.response; + } else { + log("Cache expire, url:", api); + } + } else { + log("Cache not Hit, url:", api); + } string resp = post(host + api, data); if (resp.empty()) { @@ -299,11 +312,6 @@ string apiPost(string api, string data="") { return ""; } - if (item is null) { - ResponseCacheItem newItem = ResponseCacheItem(); - item = newItem; - } - item.response = resp; item.tick_count = HostGetTickCount(); item.valid_time = ConfigData.cacheValidTime * 1000; @@ -329,25 +337,16 @@ array generateChapter(const string &in bvid) { {"music_offtopic", "非音乐"} }; - string headers = "origin: chrome-extension://eaoelafamejbnggahofapllmfhlhajdd\r\nx-ext-version: 0.13.1\r\n"; - string url = "https://bsbsb.top/api/skipSegments?videoID=" + bvid; - - // headers += "User-Agent: " + UserAgent + "\r\n" + "Referer: " + Referer; - // string temp = HostUrlGetString("http://localhost:8080", "", headers); - // temp = post("http://localhost:8080"); - // temp = HostUrlGetStringWithAPI("http://localhost:8080", "", headers); + string headers = "origin: https://github.com/frostnotfall/BilibiliPotPlayer\r\nx-ext-version: " + GetVersion() + "\r\n"; + string url = !ConfigData.sponsorBlockMirror.empty() ? ConfigData.sponsorBlockMirror + "/api/skipSegments?videoID=" + bvid : "https://bsbsb.top/api/skipSegments?videoID=" + bvid; string resp; for (int i = 0; i < 3; i++) { uint start = HostGetTickCount(); resp = post(url, "", headers); uint elapsed = HostGetTickCount() - start; - HostPrintUTF8("SponsorBlock Request #" + i + ": " + elapsed + " ms"); } - // string resp = HostUrlGetString(url, "", headers); - uint parsingStart = HostGetTickCount(); - if (resp.empty()) { log("SponsorBlock response is empty. url: " + url); return chapter; @@ -360,7 +359,7 @@ array generateChapter(const string &in bvid) { log("Failed to parse SponsorBlock response. url: " + url); return chapter; } - log("SponsorBlock Parsing: " + ( HostGetTickCount() - parsingStart) + " ms"); + if (SponsorBlock.size() == 0) return chapter; array starts; @@ -485,18 +484,6 @@ array generateChapter(const string &in bvid) { chapter.insertLast(chapterItem); } - for (int i = 0; i < chapter.size(); i++) { - string title; - string time; - - chapter[i].get("title", title); - chapter[i].get("time", time); - - log("Chapter: " + title + " Time: " + time); - } - - uint parsingEnd = HostGetTickCount(); - log("SponsorBlock Parsing: " + ( HostGetTickCount() - parsingStart) + " ms"); return chapter; } @@ -761,51 +748,6 @@ string Video(string id, const string &in path, dictionary &MetaData, array chapt; - for (int i = 0; i < points.size(); i++) { - JsonValue point = points[i]; - dictionary item; - item["title"] = point["content"].asString(); - item["time"] = formatUInt(point["from"].asInt() * 1000); - chapt.insertLast(item); - } - if (!chapt.empty() && (@QualityList !is null)) { - MetaData["chapter"] = chapt; - } - } - } else { - return url; - } - } - status = 6; params = "bvid=" + bvid + "&avid=" + aid + "&cid=" + cid + "&qn=" + qn + "&fnval=4048&fourk=1"; diff --git a/README.md b/README.md index 9c110de..be3fc6d 100644 --- a/README.md +++ b/README.md @@ -47,8 +47,7 @@ - `FLAC` → **Hi-Res 无损 FLAC** - 当同时存在杜比全景声与Hi-Res无损时,默认使用Hi-Res无损。 - 视频与播放列表增加多项属性,如果你足够细心的话,就可以发现。 -- 增加 [空降助手](https://github.com/hanydd/BilibiliSponsorBlock) 支持。作者所在网络线路访问空降助手服务端 ipv6 地址不稳定,默认禁用。 - +- 增加 [空降助手](https://github.com/hanydd/BilibiliSponsorBlock) 支持。通过配置文件设置,另外支持指定镜像站点,以解决主站访问不稳定的问题。(由于目前主站访问不稳定,镜像站是临时的,所以默认禁用。) ## TODO @@ -201,10 +200,6 @@ ![Create_Playlist](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/create_playlist_2.png) -本项目源自 [chen310/BilibiliPotPlayer](https://github.com/chen310/BilibiliPotPlayer), -并基于 [juening2000/BilibiliPotPlayer](https://github.com/juening2000/BilibiliPotPlayer) -继续进行修改和维护。 - # 声明 - 致敬原作者:[chen310/BilibiliPotPlayer](https://github.com/chen310/BilibiliPotPlayer) - 致敬上游作者:[juening2000/BilibiliPotPlayer](https://github.com/juening2000/BilibiliPotPlayer) @@ -215,7 +210,6 @@ - [Make-Bilibili-Great-Than-Ever-Before](https://github.com/SukkaW/Make-Bilibili-Great-Than-Ever-Before) - [hgcat-360/PotPlayer-Extension_yt-dlp](https://github.com/hgcat-360/PotPlayer-Extension_yt-dlp) - ## 关于精准空降 目前发现 PotPlayer 播放 youtube 可支持精准空降,但分析研究 `MediaPlayParse - YouTube.as`,未找到其相关控制代码。 From 61bada2f0b8804bb81e367f5676817288bfaddcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Sun, 30 Aug 2026 12:30:09 +0800 Subject: [PATCH 094/132] =?UTF-8?q?=E5=8E=BB=E9=99=A4=E8=B0=83=E8=AF=95?= =?UTF-8?q?=E9=80=BB=E8=BE=91=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 54046d0..375a000 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -285,13 +285,13 @@ string apiPost(string api, string data="") { ResponseCacheItem item; if (ResponseCache.get(key, item)) { if (HostGetTickCount() - item.tick_count <= item.valid_time) { - log("Cache Hit, url:", api); + log("Cache Hit, url", host + api); return item.response; } else { - log("Cache expire, url:", api); + log("Cache expire, url", host + api); } } else { - log("Cache not Hit, url:", api); + log("Cache not Hit, url", host + api); } string resp = post(host + api, data); @@ -341,11 +341,7 @@ array generateChapter(const string &in bvid) { string url = !ConfigData.sponsorBlockMirror.empty() ? ConfigData.sponsorBlockMirror + "/api/skipSegments?videoID=" + bvid : "https://bsbsb.top/api/skipSegments?videoID=" + bvid; string resp; - for (int i = 0; i < 3; i++) { - uint start = HostGetTickCount(); - resp = post(url, "", headers); - uint elapsed = HostGetTickCount() - start; - } + resp = post(url, "", headers); if (resp.empty()) { log("SponsorBlock response is empty. url: " + url); @@ -2198,9 +2194,9 @@ bool PlaylistCheck(const string &in path) { if (isPlaylist(path)) { return true; } - // if (!parseBVId(path).empty() || !parseAVId(path).empty()) { - // return true; - // } + if (!parseBVId(path).empty() || !parseAVId(path).empty()) { + return true; + } if (path.find("search.bilibili.com") >= 0) { return true; } From fe679d362f3cef08276e8a874874f30764c7ef70 Mon Sep 17 00:00:00 2001 From: frostnotfall <38377709+frostnotfall@users.noreply.github.com> Date: Mon, 31 Aug 2026 06:00:25 +0800 Subject: [PATCH 095/132] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index be3fc6d..b9467f3 100644 --- a/README.md +++ b/README.md @@ -24,8 +24,8 @@ ## 其它改进 ### 🔧 整体优化 -- 本地缓存响应数据,降低 API 请求次数。可在配置文件中设置,默认300。 -- 清理并移除部分无用旧代码,进行较大幅度的代码重构与整理。 +- 本地缓存响应数据,降低 API 请求次数。可在配置文件中设置,默认300s。 +- 清理部分无用旧代码。 ### 📺 直播 @@ -39,13 +39,15 @@ - 支持屏蔽 P2PCDN,可通过配置文件调整,默认屏蔽 - 修复部分 Host 为 `upos` 的点播 URL 播放失败的问题 - Bilibili 点播更换新接口,尽量使用wbi签名认证防止接口失效 -- 重新支持用户合集视频,并支持多合集,potplayer 播放列表( 快捷键 F6 ) 正确显示合集视频。当存在用户视频合集时,播放列表里只展示合集视频。当只存在单个视频时,播放列表里包含当前视频与推荐视频(是否包含推荐视频取决于配置文件`showRecommendedVideos`开关) +- 重新支持用户合集视频,并支持多合集,potplayer 播放列表( 快捷键 F6 ) 正确显示合集视频。 + - 当存在用户视频合集时,播放列表里只展示合集视频。 + - 当只存在单个视频时,播放列表里包含当前视频与推荐视频(是否包含推荐视频取决于配置文件`showRecommendedVideos`开关) - 播放番剧,电视剧等其它PGC合集或用户合集时,正确定位当前视频,不会出现从第一集开始播放的问题 - 支持AV播放地址 - 优化 Bilibili 音频画质选项显示: - `EC-3` → **杜比全景声 EC-3** - `FLAC` → **Hi-Res 无损 FLAC** -- 当同时存在杜比全景声与Hi-Res无损时,默认使用Hi-Res无损。 +- 当同时存在 `杜比全景声` 与 `Hi-Res无损` 时,默认使用 `Hi-Res无损`。 - 视频与播放列表增加多项属性,如果你足够细心的话,就可以发现。 - 增加 [空降助手](https://github.com/hanydd/BilibiliSponsorBlock) 支持。通过配置文件设置,另外支持指定镜像站点,以解决主站访问不稳定的问题。(由于目前主站访问不稳定,镜像站是临时的,所以默认禁用。) @@ -60,7 +62,7 @@ 这通常是由于 PotPlayer 中保存了旧的 `Cookie`、`Header` 或 `Referer` 信息导致的。可以尝试清理相关配置后重新播放。 -**如果未勾选「保存设置到 INI 文件」:(按 F5 打开选项"设置 - 基本" 页面下 )** +**如果未勾选「保存设置到 INI 文件」:** (按 F5 打开选项"设置 - 基本" 页面下) 1. 打开注册表编辑器(`regedit`)。 From 2c1e526c649a0c0733fdaa0a75d4bab6b289c078 Mon Sep 17 00:00:00 2001 From: frostnotfall <38377709+frostnotfall@users.noreply.github.com> Date: Mon, 31 Aug 2026 06:35:54 +0800 Subject: [PATCH 096/132] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 45 ++++++++++++++++++--------------------------- 1 file changed, 18 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index b9467f3..8737e88 100644 --- a/README.md +++ b/README.md @@ -56,53 +56,44 @@ * ~~支持精准空降(视 PotPlayer 是否提供相关支持)~~,目前搭配油猴脚本实现。 * ~~支持空降助手~~。 -# 一些可能的问题及解决办法 +## 一些可能的问题及解决办法 -#### 播放视频时一直转圈,右下角画质选项不断跳动 +### 播放视频时一直转圈,右下角画质选项不断跳动 这通常是由于 PotPlayer 中保存了旧的 `Cookie`、`Header` 或 `Referer` 信息导致的。可以尝试清理相关配置后重新播放。 -**如果未勾选「保存设置到 INI 文件」:** (按 F5 打开选项"设置 - 基本" 页面下) +#### 检查是否「保存设置到 INI 文件」 +(按 F5 打开选项"设置 - 基本" 页面下) -1. 打开注册表编辑器(`regedit`)。 +* **如果未勾选「保存设置到 INI 文件」:** -2. 定位到: + 1. 打开注册表编辑器(`regedit`)。 - `计算机\HKEY_CURRENT_USER\Software\DAUM\` - -3. 根据你平时使用的 PotPlayer 程序,进入对应的注册表项: + 2. 定位到: `计算机\HKEY_CURRENT_USER\Software\DAUM\` + 3. 根据你平时使用的 PotPlayer 程序,进入对应的注册表项:(一般情况下使用的是 `PotPlayerMini64`) * `PotPlayer64` * `PotPlayerMini64` - 一般情况下使用的是 `PotPlayerMini64`。 - -4. 删除其中的以下键值(如果存在): - + 4. 删除其中的以下键值(如果存在): * `_UrlCookie` * `_UrlHeader` * `_UrlReferer` -**如果已勾选「保存设置到 INI 文件」:** - -1. 打开 PotPlayer 安装目录。 +* **如果已勾选「保存设置到 INI 文件」:** -2. 根据你平时使用的程序,打开对应的配置文件: + 1. 打开 PotPlayer 安装目录。 + 2. 根据你平时使用的程序,打开对应的配置文件:(一般情况下使用的是 `PotPlayerMini64.ini`。) * `PotPlayerMini64.ini` * `PotPlayer64.ini` - 一般情况下使用的是 `PotPlayerMini64.ini`。 - -3. 在文件中删除以下配置节(如果存在): - - ```ini - [_UrlCookie] - - [_UrlHeader] - - [_UrlReferer] - ``` + 3. 在文件中删除以下配置节(如果存在): + ```ini + [_UrlCookie] + [_UrlHeader] + [_UrlReferer] + ``` 完成后重新启动 PotPlayer,再尝试播放。 From d496f6a3d9e1de38d6cd88403d623889b0b7aa6e Mon Sep 17 00:00:00 2001 From: frostnotfall <38377709+frostnotfall@users.noreply.github.com> Date: Mon, 31 Aug 2026 06:39:34 +0800 Subject: [PATCH 097/132] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20README.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 8737e88..a20e163 100644 --- a/README.md +++ b/README.md @@ -72,21 +72,21 @@ 2. 定位到: `计算机\HKEY_CURRENT_USER\Software\DAUM\` 3. 根据你平时使用的 PotPlayer 程序,进入对应的注册表项:(一般情况下使用的是 `PotPlayerMini64`) - * `PotPlayer64` - * `PotPlayerMini64` + * `PotPlayer64` + * `PotPlayerMini64` 4. 删除其中的以下键值(如果存在): - * `_UrlCookie` - * `_UrlHeader` - * `_UrlReferer` + * `_UrlCookie` + * `_UrlHeader` + * `_UrlReferer` * **如果已勾选「保存设置到 INI 文件」:** 1. 打开 PotPlayer 安装目录。 2. 根据你平时使用的程序,打开对应的配置文件:(一般情况下使用的是 `PotPlayerMini64.ini`。) - * `PotPlayerMini64.ini` - * `PotPlayer64.ini` + * `PotPlayerMini64.ini` + * `PotPlayer64.ini` 3. 在文件中删除以下配置节(如果存在): ```ini From 9c7e49b1f198e2c216080fac9c53ff08188135e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Mon, 31 Aug 2026 23:33:56 +0800 Subject: [PATCH 098/132] =?UTF-8?q?1.=20=E5=A2=9E=E5=8A=A0=E4=B8=80?= =?UTF-8?q?=E4=BA=9B=E5=B1=9E=E6=80=A7=202.=20=E7=82=B9=E6=92=AD=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E6=8D=A2=E7=94=A8=E6=96=B0itag=E9=80=BB=E8=BE=91=203.?= =?UTF-8?q?=20=E5=8A=A8=E6=80=81=E7=94=9F=E6=88=90=E7=94=BB=E8=B4=A8?= =?UTF-8?q?=E5=90=8D=E7=A7=B0=EF=BC=8C=E8=B7=9F=E9=9A=8F=E5=AE=98=E6=96=B9?= =?UTF-8?q?=204.=20=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96=E5=8F=8A=E6=B8=85?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 246 +++++++++++-------- README.md | 89 +++---- 2 files changed, 180 insertions(+), 155 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 375a000..bdc7262 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -1,7 +1,9 @@ /* Bilibili media parse - author: chen310 - link: https://github.com/chen310/BilibiliPotPlayer + author: frostnotfall + link: https://github.com/frostnotfall/BilibiliPotPlayer + originalAuthor: chen310 + originalLink: https://github.com/chen310/BilibiliPotPlayer */ // void OnInitialize() @@ -73,7 +75,7 @@ string GetTitle() { } string GetVersion() { - return "2.6.8"; + return "2.6.9"; } string GetDesc() { @@ -580,6 +582,7 @@ array UGCSeason(const string &in path) { video["date"] = UnixTimeToDate(item["arc"]["pubdate"].asInt()); video["resolution"] = item["arc"]["dimension"]["width"].asInt() + "x" + item["arc"]["dimension"]["height"].asInt(); if (item["bvid"].asString() == bvid || item["aid"].asString() == aid) video["current"] = "1"; + video["referer"] = "https://www.bilibili.com/video/" + Root["data"]["View"]["bvid"].asString(); videos.insertLast(video); } else { log("item is empty"); @@ -621,26 +624,28 @@ array RelatedVideos(const string &in path) { return videos; } - JsonValue data = Root["data"]["View"]; + JsonValue view = Root["data"]["View"]; dictionary video; - video["title"] = data["title"].asString(); - video["duration"] = data["duration"].asInt() * 1000; - video["thumbnail"] = data["pic"].asString(); - video["author"] = data["owner"]["name"].asString(); + video["title"] = view["title"].asString(); + video["duration"] = view["duration"].asInt() * 1000; + video["thumbnail"] = view["pic"].asString(); + video["author"] = view["owner"]["name"].asString(); video["url"] = "https://www.bilibili.com/video/" + bvid; - video["viewCount"] = data["stat"]["view"].asString(); - video["likeCount"] = data["stat"]["like"].asString(); - video["dislikeCount"] = data["stat"]["dislike"].asString(); - video["date"] = UnixTimeToDate(data["pubdate"].asInt()); - video["resolution"] = data["dimension"]["width"].asInt() + "x" + data["dimension"]["height"].asInt(); + if (!view["desc"].asString().empty() || view["desc"].asString() != "-") video["content"] = view["desc"].asString(); + video["viewCount"] = view["stat"]["view"].asString(); + video["likeCount"] = view["stat"]["like"].asString(); + video["dislikeCount"] = view["stat"]["dislike"].asString(); + video["date"] = UnixTimeToDate(view["pubdate"].asInt()); + video["resolution"] = view["dimension"]["width"].asInt() + "x" + view["dimension"]["height"].asInt(); video["current"] = "1"; + video["referer"] = "https://www.bilibili.com/video/" + view["bvid"].asString(); videos.insertLast(video); if (!ConfigData.showRecommendedVideos) return videos; JsonValue related = Root["data"]["Related"]; - if (related.isArray()) { + if (related.isArray()) { for (int i = 0; i < related.size(); i++) { JsonValue item = related[i]; if (item.isObject()) { @@ -650,11 +655,13 @@ array RelatedVideos(const string &in path) { video["thumbnail"] = item["pic"].asString(); video["author"] = item["owner"]["name"].asString(); video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + if (!item["desc"].asString().empty() || item["desc"].asString() != "-") video["content"] = item["desc"].asString(); video["viewCount"] = item["stat"]["view"].asString(); video["likeCount"] = item["stat"]["like"].asString(); video["dislikeCount"] = item["stat"]["dislike"].asString(); video["date"] = UnixTimeToDate(item["pubdate"].asInt()); video["resolution"] = item["dimension"]["width"].asInt() + "x" + item["dimension"]["height"].asInt(); + video["referer"] = "https://www.bilibili.com/video/" + view["bvid"].asString(); videos.insertLast(video); } else { log("item is not exists."); @@ -682,6 +689,43 @@ string makeWebUrl(string path) { return strs[0]; } +dictionary AppendAudioQualityList(JsonValue audio, string bvid) { + dictionary audioqualityitem; + string format; + + int itag = 0; + int audioid = audio["id"].asInt(); + audioqualityitem["itag"] = getAudioItag(audioid); + audioqualityitem["url"] = getFixedURL(audio); + + bool audioIsDefault = false; + if (audioid == 30250) { + audioqualityitem["quality"] = "杜比全景声"; + } else if (audioid == 30251) { + audioqualityitem["quality"] = "Hi-Res无损"; + audioIsDefault = true; + } else if (audio["codecs"].asString().MakeLower().find("mp4a") >= 0) { + audioqualityitem["quality"] = "AAC"; + } + audioqualityitem["qualityDetail"] = audioqualityitem["quality"]; + audioqualityitem["audioIsDefault"] = audioIsDefault; + + int bitrateVal = audio["bandwidth"].asInt(); + string bitrate = formatFloat(bitrateVal / 1000.0, "", 0, 1) + "Kbps"; + audioqualityitem["bitrateVal"] = bitrateVal; + audioqualityitem["bitrate"] = bitrate; + + string codec = audio["codecs"].asString().MakeLower(); + string mimeType = audio["mimeType"].asString().MakeLower(); + audioqualityitem["format"] = mimeType.substr(mimeType.findLast("/") + 1) + ", " + codec.substr(0, codec.find(".")) + ", " + bitrate; + + audioqualityitem["resolution"] = "audio only"; + audioqualityitem["va"] = "a"; + audioqualityitem["referer"] = "https://www.bilibili.com/video/" + bvid; + + return audioqualityitem; +} + string Video(string id, const string &in path, dictionary &MetaData, array &QualityList) { log("==============================video============================="); string res; @@ -714,17 +758,21 @@ string Video(string id, const string &in path, dictionary &MetaData, array chapter = generateChapter(bvid); @@ -754,60 +802,65 @@ string Video(string id, const string &in path, dictionary &MetaData, array spaceVideo(string path) { dictionary video; video["title"] = item["title"].asString(); video["duration"] = parseTime(item["length"].asString()); - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); video["thumbnail"] = item["pic"].asString(); video["author"] = item["author"].asString(); + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + if (!item["description"].asString().empty() || item["description"].asString() != "-") video["content"] = item["description"].asString(); + video["viewCount"] = item["play"].asString(); + video["date"] = UnixTimeToDate(item["created"].asInt()); videos.insertLast(video); } } @@ -1729,14 +1785,6 @@ int getItag(int qn) { return qn; } -int getVideoItag(int qn) { - array qns = {127, 126, 125, 120, 116, 112, 80, 74, 64, 32, 16, 6}; - int idx = qns.find(qn); - if (idx >= 0) { - return idx; - } - return qn; -} int getTrueItag(int itag) { array itags = {1282,1283,1272,1273,1262,1263,1207,1212,1213,1167,1172,1173,1127,1132,1133,807,812,813,647,652,653,327,332,333,167,172,173,67,72,73}; @@ -1749,8 +1797,9 @@ int getTrueItag(int itag) { } int getAudioItag(int id) { - array ids = {30280, 30232, 30216}; - array itags = {327, 256, 139}; + // 增加 EC-3/E-AC3 和 flac 的 itag 映射,flac 没有对应的 itag,使用 AC3 替代 + array ids = {30251, 30250, 30280, 30232, 30216}; + array itags = {258, 328, 327, 256, 139}; int idx = ids.find(id); if (idx >= 0) { return itags[idx]; @@ -1758,7 +1807,7 @@ int getAudioItag(int id) { return id; } -uint getUniItag(void) +uint getUniItag() { uint itag = 1; while (HostExistITag(itag)) itag++; @@ -1766,19 +1815,16 @@ uint getUniItag(void) return itag; } -string getVideoquality(int qn) { - array qns = {127, 126, 125, 120, 116, 112, 80, 74, 64, 32, 16, 6}; - array qualities = {"8K 超高清", "杜比视界", "HDR 真彩色", "4K 超清", "1080P60 高帧率", "1080P+ 高码率", "1080P 高清", "720P60 高帧率", "720P 高清", "480P 清晰", "360P 流畅", "240P 极速"}; - int idx = qns.find(qn); - if (idx >= 0) { - return qualities[idx]; +string getVideoquality(JsonValue support_formats, int quality) { + for (int i = 0; i <= support_formats.size(); i++) { + if (support_formats[i]["quality"].asInt() == quality) return support_formats[i]["new_description"].asString(); } return "未知"; } string getCodec(int codecid) { array codecids = {7, 12, 13}; - array codec = {" AVC", " HEVC", " AV1"}; + array codec = {"avc", "hevc", "av1"}; int idx = codecids.find(codecid); if (idx >= 0) { return codec[idx]; @@ -1900,13 +1946,15 @@ string Live(string id, const string &in path, dictionary &MetaData, arrayF6 ) 正确显示合集视频。 - - 当存在用户视频合集时,播放列表里只展示合集视频。 - - 当只存在单个视频时,播放列表里包含当前视频与推荐视频(是否包含推荐视频取决于配置文件`showRecommendedVideos`开关) +- 重新支持用户合集视频,并支持多合集,potplayer 播放列表( 快捷键 F6 ) 正确显示合集视频。当存在用户视频合集时,播放列表里只展示合集视频。当只存在单个视频时,播放列表里包含当前视频与推荐视频(是否包含推荐视频取决于配置文件`showRecommendedVideos`开关) - 播放番剧,电视剧等其它PGC合集或用户合集时,正确定位当前视频,不会出现从第一集开始播放的问题 - 支持AV播放地址 - 优化 Bilibili 音频画质选项显示: - `EC-3` → **杜比全景声 EC-3** - `FLAC` → **Hi-Res 无损 FLAC** -- 当同时存在 `杜比全景声` 与 `Hi-Res无损` 时,默认使用 `Hi-Res无损`。 +- 当同时存在杜比全景声与Hi-Res无损时,默认使用Hi-Res无损。 - 视频与播放列表增加多项属性,如果你足够细心的话,就可以发现。 -- 增加 [空降助手](https://github.com/hanydd/BilibiliSponsorBlock) 支持。通过配置文件设置,另外支持指定镜像站点,以解决主站访问不稳定的问题。(由于目前主站访问不稳定,镜像站是临时的,所以默认禁用。) +- 增加 [空降助手](https://github.com/hanydd/BilibiliSponsorBlock) 支持。通过配置文件设置,默认禁用。 + + 另外支持指定镜像站点,以解决主站访问不稳定的问题。(由于目前主站访问不稳定,镜像站是临时的,所以默认禁用。) + +- 换用新的画质选项名称生成逻辑,现在动态获取,与官方名称一致。 +- 画质选项增加更多属性 +- 换用新的 itag 选择机制。 ## TODO * ~~支持精准空降(视 PotPlayer 是否提供相关支持)~~,目前搭配油猴脚本实现。 * ~~支持空降助手~~。 -## 一些可能的问题及解决办法 - -### 播放视频时一直转圈,右下角画质选项不断跳动 - -这通常是由于 PotPlayer 中保存了旧的 `Cookie`、`Header` 或 `Referer` 信息导致的。可以尝试清理相关配置后重新播放。 - -#### 检查是否「保存设置到 INI 文件」 -(按 F5 打开选项"设置 - 基本" 页面下) - -* **如果未勾选「保存设置到 INI 文件」:** - - 1. 打开注册表编辑器(`regedit`)。 - - 2. 定位到: `计算机\HKEY_CURRENT_USER\Software\DAUM\` - - 3. 根据你平时使用的 PotPlayer 程序,进入对应的注册表项:(一般情况下使用的是 `PotPlayerMini64`) - * `PotPlayer64` - * `PotPlayerMini64` - - 4. 删除其中的以下键值(如果存在): - * `_UrlCookie` - * `_UrlHeader` - * `_UrlReferer` - -* **如果已勾选「保存设置到 INI 文件」:** - - 1. 打开 PotPlayer 安装目录。 - - 2. 根据你平时使用的程序,打开对应的配置文件:(一般情况下使用的是 `PotPlayerMini64.ini`。) - * `PotPlayerMini64.ini` - * `PotPlayer64.ini` - - 3. 在文件中删除以下配置节(如果存在): - ```ini - [_UrlCookie] - [_UrlHeader] - [_UrlReferer] - ``` - -完成后重新启动 PotPlayer,再尝试播放。 - ## 油猴脚本 由于从 PotPlayer 内部实现精准空降存在一定难度[1](#关于精准空降),因此目前采用外部油猴脚本的方式实现其功能。 @@ -107,12 +70,10 @@ * **打开 PotPlayer 时自动暂停网页端视频**:启动 PotPlayer 播放后,自动暂停 Bilibili 网页端正在播放的视频,避免音视频重复播放。 - ### 声明 修改版脚本 `BilibiliPotPlayer-改` [https://greasyfork.org/zh-CN/scripts/593353-bilibilipotplayer-改](https://greasyfork.org/zh-CN/scripts/593353-bilibilipotplayer-%E6%94%B9)) 基于`原版油猴脚本` [油猴脚本https://greasyfork.org/zh-CN/scripts/461800-bilibilipotplayer](https://greasyfork.org/zh-CN/scripts/461800-bilibilipotplayer),并保留原作者及原项目相关信息。如原作者对本脚本的发布或再分发存在异议,并要求停止发布,本人将配合下架本脚本。 - ## 安装插件 [下载项目](https://github.com/frostnotfall/BilibiliPotPlayer/archive/refs/heads/master.zip) @@ -193,18 +154,34 @@ ![Create_Playlist](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/create_playlist_2.png) +## 油猴脚本 + +由于从 PotPlayer 内部实现精准空降存在一定难度[2](#关于精准空降),因此目前采用外部油猴脚本的方式实现其功能。 + +目前修改版脚本 [BilibiliPotPlayer-改](https://greasyfork.org/zh-CN/scripts/593353-bilibilipotplayer-改) 支持: + +* **精准空降**:将网页端指定的播放时间传递给 PotPlayer,实现精准跳转。 + +* **打开 PotPlayer 时自动暂停网页端视频**:启动 PotPlayer 播放后,自动暂停 Bilibili 网页端正在播放的视频,避免音视频重复播放。 + +### 油猴脚本声明 + +修改版脚本 `BilibiliPotPlayer-改` [https://greasyfork.org/zh-CN/scripts/593353-bilibilipotplayer-改](https://greasyfork.org/zh-CN/scripts/593353-bilibilipotplayer-%E6%94%B9)) 基于`原版油猴脚本` [油猴脚本https://greasyfork.org/zh-CN/scripts/461800-bilibilipotplayer](https://greasyfork.org/zh-CN/scripts/461800-bilibilipotplayer),并保留原作者及原项目相关信息。如原作者对本脚本的发布或再分发存在异议,并要求停止发布,本人将配合下架本脚本。 + +## 关于精准空降 + +目前发现 PotPlayer 播放 youtube 可支持精准空降,但分析研究 `MediaPlayParse - YouTube.as`,未找到其相关控制代码。 + +目前精准空降的实现是通过搭配的[修改版油猴脚本](#油猴脚本)实现。 + # 声明 - 致敬原作者:[chen310/BilibiliPotPlayer](https://github.com/chen310/BilibiliPotPlayer) - 致敬上游作者:[juening2000/BilibiliPotPlayer](https://github.com/juening2000/BilibiliPotPlayer) - 在上游项目的基础上,本项目根据个人使用需求进行了进一步的功能调整与兼容性修复,主要用于搭配 [vs-mlrt](https://github.com/AmusementClub/vs-mlrt) 的学习与测试。 -## THANKS +# THANKS - [bilibili-API-collect](https://github.com/SocialSisterYi/bilibili-API-collect) - [Make-Bilibili-Great-Than-Ever-Before](https://github.com/SukkaW/Make-Bilibili-Great-Than-Ever-Before) - [hgcat-360/PotPlayer-Extension_yt-dlp](https://github.com/hgcat-360/PotPlayer-Extension_yt-dlp) -## 关于精准空降 -目前发现 PotPlayer 播放 youtube 可支持精准空降,但分析研究 `MediaPlayParse - YouTube.as`,未找到其相关控制代码。 - -目前精准空降的实现是通过搭配的[修改版油猴脚本](#油猴脚本)实现。 From 7d52c0f8babf856c8aa5c7ba35b299344d5c17d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Mon, 31 Aug 2026 23:42:59 +0800 Subject: [PATCH 099/132] update README.md --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index faaa08c..5df0226 100644 --- a/README.md +++ b/README.md @@ -60,6 +60,10 @@ * ~~支持精准空降(视 PotPlayer 是否提供相关支持)~~,目前搭配油猴脚本实现。 * ~~支持空降助手~~。 +## wiki + +一些问题的解决办法,[wiki](https://github.com/frostnotfall/BilibiliPotPlayer/wiki/%E4%B8%80%E4%BA%9B%E5%8F%AF%E8%83%BD%E7%9A%84%E9%97%AE%E9%A2%98%E5%8F%8A%E9%83%A8%E5%88%86%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95) + ## 油猴脚本 由于从 PotPlayer 内部实现精准空降存在一定难度[1](#关于精准空降),因此目前采用外部油猴脚本的方式实现其功能。 @@ -70,7 +74,7 @@ * **打开 PotPlayer 时自动暂停网页端视频**:启动 PotPlayer 播放后,自动暂停 Bilibili 网页端正在播放的视频,避免音视频重复播放。 -### 声明 +### 油猴脚本声明 修改版脚本 `BilibiliPotPlayer-改` [https://greasyfork.org/zh-CN/scripts/593353-bilibilipotplayer-改](https://greasyfork.org/zh-CN/scripts/593353-bilibilipotplayer-%E6%94%B9)) 基于`原版油猴脚本` [油猴脚本https://greasyfork.org/zh-CN/scripts/461800-bilibilipotplayer](https://greasyfork.org/zh-CN/scripts/461800-bilibilipotplayer),并保留原作者及原项目相关信息。如原作者对本脚本的发布或再分发存在异议,并要求停止发布,本人将配合下架本脚本。 @@ -183,5 +187,3 @@ - [bilibili-API-collect](https://github.com/SocialSisterYi/bilibili-API-collect) - [Make-Bilibili-Great-Than-Ever-Before](https://github.com/SukkaW/Make-Bilibili-Great-Than-Ever-Before) - [hgcat-360/PotPlayer-Extension_yt-dlp](https://github.com/hgcat-360/PotPlayer-Extension_yt-dlp) - - From 26068cebd6ef01e34dc9d3ae94cc3abf50914170 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Tue, 1 Sep 2026 13:02:59 +0800 Subject: [PATCH 100/132] =?UTF-8?q?1.=20=E4=BC=98=E5=8C=96=E9=A6=96?= =?UTF-8?q?=E6=AC=A1=E4=BD=BF=E7=94=A8=E4=BD=93=E9=AA=8C=202.=20=E5=B0=BD?= =?UTF-8?q?=E5=8F=AF=E8=83=BD=E7=9A=84=E4=BC=98=E5=8C=96itag=203.=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 328 +++++++++++++++---- 1 file changed, 265 insertions(+), 63 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index bdc7262..27b7537 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -20,6 +20,8 @@ // void ServerLogout() -> logout // string GetWebAccountUrl() -> login process by WebBrowser // string GetWebAccountDomain() -> transport cookie domain for login +// string GetConfigFile() +// void ApplyConfigFile() //------------------------------------------------------------------------------------------------ // bool PlayitemCheck(const string &in) -> check playitem // array PlayitemParse(const string &in) -> parse playitem @@ -57,10 +59,9 @@ void OnInitialize() { } string configFile = HostGetScriptFolder() + ConfigFileName; - if (!isFileExists(configFile)) { - HostMessageBox("配置文件不存在\n\n路径:" + configFile + "\n\n进入设置→<扩展功能>→<媒体播放列表/项目>→选中→点击下方<设置文件>进行编辑\n或\n手动建立该配置文件", "配置文件不存在"); + if (!HostFileExist(configFile)) { + HostMessageBox("配置文件不存在\n\n路径: " + configFile , "[BilibiliPotplayer] 配置文件不存在", 0, 0); } - ConfigData = ReadConfigFile(configFile); if (ConfigData.debug) { HostOpenConsole(); @@ -71,7 +72,23 @@ string host = "https://api.bilibili.com"; string mixin_key; string GetTitle() { - return "Bilibili"; + string title = "Bilibili"; + if (!HostFileExist(HostGetScriptFolder() + ConfigFileName)) { + return title + "(配置文件不存在)"; + } + + Config config; + uintptr fp = HostFileOpen(HostGetScriptFolder() + ConfigFileName); + config.fullConfig = HostFileRead(fp, HostFileLength(fp)); + HostFileClose(fp); + + JsonReader reader; + JsonValue root; + if (!reader.parse(config.fullConfig, root) && !root.isObject()) { + return title + "(配置文件格式错误)"; + } + + return title; } string GetVersion() { @@ -85,6 +102,23 @@ string GetDesc() { string GetConfigFile() { return HostGetScriptFolder() + ConfigFileName; } + +void ApplyConfigFile() { + string msg; + Config config; + uintptr fp = HostFileOpen(HostGetScriptFolder() + ConfigFileName); + config.fullConfig = HostFileRead(fp, HostFileLength(fp)); + HostFileClose(fp); + + JsonReader reader; + JsonValue root; + if (!reader.parse(config.fullConfig, root) && !root.isObject()) { + msg = "配置文件存在问题"; + } + + HostMessageBox(msg, "[BilibiliPotplayer] 配置文件错误", 0,1); +} + string GetWebAccountUrl() { return "https://passport.bilibili.com/login"; } @@ -99,10 +133,6 @@ string GetWebAccountDomain() { return domains; } -bool isFileExists(string path) { - return HostFileOpen(path) > 0; -} - class Config { string fullConfig; int uid = 0; @@ -139,9 +169,54 @@ class ResponseCacheItem { uint valid_time; } +class QualityListItem { + string url; + string quality; + string qualityDetail; + string resolution; + string bitrate; + string format; + int itag = 0; + int fps = 0.0; + int type3D = 0; // 1:sbs, 2:t&b + bool is360 = false; + bool isHDR = false; + string audioName; + string audioCode; + bool audioIsDefault = false; + int bitrateVal = 0; + string va; + string referer; + + dictionary toDictionary() { + dictionary ret; + + ret["url"] = url; + ret["quality"] = quality; + ret["qualityDetail"] = qualityDetail; + ret["resolution"] = resolution; + ret["bitrate"] = bitrate; + ret["format"] = format; + ret["itag"] = itag; + ret["fps"] = fps; + ret["type3D"] = type3D; + ret["is360"] = is360; + ret["isHDR"] = isHDR; + ret["audioName"] = audioName; + ret["audioCode"] = audioCode; + ret["audioIsDefault"] = audioIsDefault; + ret["bitrateVal"] = bitrateVal; + ret["va"] = va; + ret["referer"] = referer; + + return ret; + } +}; + Config ReadConfigFile(string file) { Config config; - config.fullConfig = HostFileRead(HostFileOpen(file), 10000); + uintptr fp = HostFileOpen(file); + config.fullConfig = HostFileRead(fp, HostFileLength(fp)); JsonReader reader; JsonValue root; if (reader.parse(config.fullConfig, root) && root.isObject()) { @@ -196,7 +271,12 @@ Config ReadConfigFile(string file) { config.subtitleUrl = config.danmakuServer + "/subtitle?url="; } + } else{ + HostMessageBox("配置文件存在问题", "[BilibiliPotplayer] 配置文件错误", 0,1); } + + HostFileClose(fp); + return config; } @@ -273,7 +353,7 @@ string UnixTimeToDate(int64 t) { string post(string url, string data="", string headers="") { if (headers.empty()) headers = "User-Agent: " + UserAgent + "\r\n" + "Referer: " + Referer + "\r\n"; log("request url", url); - return HostUrlGetStringWithAPI(url, "", headers, data); + return HostUrlGetString(url, "", headers, data); } string apiPost(string api, string data="") { @@ -565,7 +645,7 @@ array UGCSeason(const string &in path) { if (sections.isArray()) { string title; for (int j = 0; j < sections.size(); j++) { - if (sections.size() > 0) title = "【" + sections[j]["title"].asString() + "】"; + if (sections.size() > 1) title = "【" + sections[j]["title"].asString() + "】"; JsonValue episodes = sections[j]["episodes"]; for (int i = 0; i < episodes.size(); i++) { JsonValue item = episodes[i]; @@ -690,40 +770,94 @@ string makeWebUrl(string path) { } dictionary AppendAudioQualityList(JsonValue audio, string bvid) { - dictionary audioqualityitem; + QualityListItem item; string format; int itag = 0; int audioid = audio["id"].asInt(); - audioqualityitem["itag"] = getAudioItag(audioid); - audioqualityitem["url"] = getFixedURL(audio); + item.itag = getAudioItag(audioid); + item.url = getFixedURL(audio); bool audioIsDefault = false; if (audioid == 30250) { - audioqualityitem["quality"] = "杜比全景声"; + item.quality = "杜比全景声"; } else if (audioid == 30251) { - audioqualityitem["quality"] = "Hi-Res无损"; + item.quality = "Hi-Res无损"; audioIsDefault = true; } else if (audio["codecs"].asString().MakeLower().find("mp4a") >= 0) { - audioqualityitem["quality"] = "AAC"; + item.quality = "AAC"; } - audioqualityitem["qualityDetail"] = audioqualityitem["quality"]; - audioqualityitem["audioIsDefault"] = audioIsDefault; + item.qualityDetail = item.quality; + item.audioIsDefault = audioIsDefault; int bitrateVal = audio["bandwidth"].asInt(); - string bitrate = formatFloat(bitrateVal / 1000.0, "", 0, 1) + "Kbps"; - audioqualityitem["bitrateVal"] = bitrateVal; - audioqualityitem["bitrate"] = bitrate; + string bitrate = HostFormatBitrate(bitrateVal) + "bps"; + item.bitrateVal = bitrateVal; + item.bitrate = bitrate; string codec = audio["codecs"].asString().MakeLower(); string mimeType = audio["mimeType"].asString().MakeLower(); - audioqualityitem["format"] = mimeType.substr(mimeType.findLast("/") + 1) + ", " + codec.substr(0, codec.find(".")) + ", " + bitrate; + item.format = mimeType.substr(mimeType.findLast("/") + 1) + ", " + codec.substr(0, codec.find(".")) + ", " + bitrate; - audioqualityitem["resolution"] = "audio only"; - audioqualityitem["va"] = "a"; - audioqualityitem["referer"] = "https://www.bilibili.com/video/" + bvid; - - return audioqualityitem; + item.resolution = "audio only"; + item.va = "a"; + item.referer = "https://www.bilibili.com/video/" + bvid; + + return item.toDictionary(); +} + +JsonValue SortVideos(JsonValue &videos) +{ + array VideoIdOrder = {6, 16, 32, 64, 74, 80, 100, 112, 116, 120, 127, 125, 126, 129}; + JsonReader reader; + JsonValue sortedVideos; + + reader.parse("[]", sortedVideos); + + array used(videos.size(), false); + + for (uint i = 0; i < videos.size(); i++) + { + int minIndex = -1; + int minOrder = 999; + + for (uint j = 0; j < videos.size(); j++) + { + if (used[j]) + continue; + + int id = videos[j]["id"].asInt(); + int order = VideoIdOrder.length(); + + for (uint k = 0; k < VideoIdOrder.length(); k++) + { + if (VideoIdOrder[k] == id) + { + order = int(k); + break; + } + } + + if (minIndex == -1 || order < minOrder) + { + minIndex = int(j); + minOrder = order; + } + else if (order == minOrder) + { + int codecidA = videos[j]["codecid"].asInt(); + int codecidB = videos[minIndex]["codecid"].asInt(); + + if (codecidA < codecidB) + minIndex = int(j); + } + } + + sortedVideos[i] = videos[minIndex]; + used[minIndex] = true; + } + + return sortedVideos; } string Video(string id, const string &in path, dictionary &MetaData, array &QualityList) { @@ -801,44 +935,48 @@ string Video(string id, const string &in path, dictionary &MetaData, array> videoItagMap = { + //240P + {6, 7, 133}, + {6, 12, 133}, + {6, 13, 395}, + // 360P + {16, 7, 134}, + {16, 12, 134}, + {16, 13, 396}, + // 480P + {32, 7, 135}, + {32, 12, 135}, + {32, 13, 397}, + // 720P + {64, 7, 136}, + {64, 12, 136}, + {64, 13, 398}, + // 720P60 + {74, 7, 298}, + {74, 12, 298}, + {74, 13, 398}, + // 1080P + {80, 7, 137}, + {80, 12, 137}, + {80, 13, 399}, + // 1080P+ + {112, 7, 137}, + {112, 12, 137}, + {112, 13, 399}, + // 1080P60 + {116, 7, 299}, + {116, 12, 299}, + {116, 13, 399}, + // 4K + {120, 7, 266}, + {120, 12, 266}, + {120, 13, 401}, + // HDR + {125, 7, 337}, + {125, 12, 337}, + {125, 13, 701}, + // 杜比视界 + {126, 7, 337}, + {126, 12, 337}, + {126, 13, 701}, + // 8K + {127, 7, 571}, + {127, 12, 571}, + {127, 13, 571}, + // HDR Vivid + {129, 7, 337}, + {129, 12, 337}, + {129, 13, 701} + }; + + for (int i = 0; i < videoItagMap.size(); i++) { + if (videoItagMap[i][0] == id && videoItagMap[i][1] == codecid) { + return videoItagMap[i][2]; + } + } + + return 0; +} int getTrueItag(int itag) { array itags = {1282,1283,1272,1273,1262,1263,1207,1212,1213,1167,1172,1173,1127,1132,1133,807,812,813,647,652,653,327,332,333,167,172,173,67,72,73}; From db2fb5aed356042e4d0cb3d5b75ae3c0456ecc8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Wed, 2 Sep 2026 11:38:27 +0800 Subject: [PATCH 101/132] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=9B=B4=E6=92=AD?= =?UTF-8?q?=EF=BC=8C=E9=81=BF=E5=85=8Dpotplayer=E8=87=AA=E5=8A=A8=E8=A6=86?= =?UTF-8?q?=E7=9B=96=E7=94=BB=E8=B4=A8=E9=80=89=E9=A1=B9=E5=90=8D=E7=A7=B0?= =?UTF-8?q?=E4=B8=BAHLS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 154 +++++++++++-------- README.md | 7 +- 2 files changed, 90 insertions(+), 71 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 27b7537..e17d915 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -38,7 +38,7 @@ VideoIsUGCorPGC videoIsUGCorPGC; dictionary ResponseCache; const string ConfigFileName = "Bilibili_Config.json"; -const array BilibiliDomains = {"bilibili.com", "bilivideo.com", "bilivideo.cn"}; +const array BilibiliDomains = {"bilibili.com", "bilivideo.com", "bilivideo.cn", "smtcdns.net"}; const array knownP2pCdnDomainPattern = { "302ppio", "302kodo", @@ -92,7 +92,7 @@ string GetTitle() { } string GetVersion() { - return "2.6.9"; + return "2.6.10"; } string GetDesc() { @@ -620,6 +620,14 @@ uint gettid(string path) { return 0; } +string makeWebUrl(string path) { + array strs = path.split("?"); + if (strs.length() <= 1) { + return path; + } + return strs[0]; +} + array UGCSeason(const string &in path) { array videos; @@ -761,14 +769,6 @@ array RelatedVideos(const string &in path) { return videos; } -string makeWebUrl(string path) { - array strs = path.split("?"); - if (strs.length() <= 1) { - return path; - } - return strs[0]; -} - dictionary AppendAudioQualityList(JsonValue audio, string bvid) { QualityListItem item; string format; @@ -1915,7 +1915,7 @@ array Recommend(uint page) { } int getItag(int qn) { - array qns = {10000, 400, 250, 150, 80}; + array qns = {30000, 25000, 20000, 10000, 400, 250, 150, 80}; int idx = qns.find(qn); if (idx >= 0) { return idx; @@ -2134,6 +2134,27 @@ string Audio(const string &in path, dictionary &MetaData, array &Qua return url; } +string GetM3u8RealURL(string url) { + string resp = post(url); + array lines = resp.split("\n"); + + for (uint i = 0; i < lines.size(); i++) { + string line = lines[i].Trim(); + + if (line.find("#EXT-X-STREAM-INF:") == 0) { + if (i + 1 < lines.size()) { + string m3u8 = lines[i + 1].Trim(); + + if (m3u8.find("http://") == 0 || m3u8.find("https://") == 0) { + return m3u8; + } + } + } + } + + return url; +} + string Live(string id, const string &in path, dictionary &MetaData, array &QualityList) { log("==============================live=============================="); string url; @@ -2242,12 +2263,14 @@ string Live(string id, const string &in path, dictionary &MetaData, array 0) { + string backup = "备"; + if (j > 1) { + backup += j - 1; + } + format = backup + ", " + format; + } - JsonValue video_color_info = codec["video_color_info"]; - bool isHDR = false; - if (codec["hdr_type"].asInt() == 1) { - isHDR = true; - } - int bitrate = 0; - string bitrateStr; - - string main_url = codec["url_info"][0]["host"].asString() + codec["base_url"].asString() + codec["url_info"][0]["extra"].asString(); - if (best_qn == codec["current_qn"].asInt() && url.empty()) url = main_url; - qualityItemMain["url"] = main_url; - qualityItemMain["quality"] = getLiveQuality(g_qn_desc, codec["current_qn"].asInt(), codec["hdr_type"].asInt(), video_color_info) + codec_suffix; - // qualityItemMain["quality"] = getLiveQualityNew(g_qn_desc, codec["current_qn"].asInt(), codec["hdr_type"].asInt(), video_color_info); - // qualityItemMain["format"] = codec_name; - qualityItemMain["qualityDetail"] = qualityItemMain["quality"]; - qualityItemMain["itag"] = getUniItag(); - qualityItemMain["resolution"] = codec["width"].asInt() + "x" + codec["height"].asInt(); - qualityItemMain["isHDR"] = isHDR; - bitrateStr = HostRegExpParse(main_url, "(?:[?&]origin_bitrate=)(\\d+)(?:&|$)"); - if (!bitrateStr.empty()) bitrate = HostString2UIntPtr(bitrateStr); - qualityItemMain["bitrate"] = bitrate * 1000; - if (@QualityList !is null) QualityList.insertLast(qualityItemMain); - - if (url_infos.size() <= 1) { - continue; + // itag = getVideoItag(quality, codecid); + if (itag <= 0 || HostExistITag(itag)) itag = HostGetITag(height, 0, true, true); + while (HostExistITag(itag)) itag++; + HostSetITag(itag); + + QualityListItem item; + + item.itag = itag; + item.url = url_info_url; + item.quality = quality; + item.qualityDetail = quality; + item.bitrateVal = bitrateVal; + item.bitrate = HostFormatBitrate(item.bitrateVal * 1000.0) + "bps"; + item.format = format; + item.resolution = resolution; + item.isHDR = (codec["hdr_type"].asInt() == 1); + + QualityList.insertLast(item.toDictionary()); + } } - - string backup_url = codec["url_info"][1]["host"].asString() + codec["base_url"].asString() + codec["url_info"][1]["extra"].asString(); - qualityItemBackup["url"] = backup_url; - qualityItemBackup["quality"] = "- " + getLiveQuality(g_qn_desc, codec["current_qn"].asInt(), codec["hdr_type"].asInt(), video_color_info) + codec_suffix + " 备份"; - // qualityItemBackup["quality"] = "- " + getLiveQualityNew(g_qn_desc, codec["current_qn"].asInt(), codec["hdr_type"].asInt(), video_color_info) + " 备份"; - // qualityItemBackup["format"] = codec_name; - qualityItemBackup["qualityDetail"] = qualityItemBackup["quality"]; - qualityItemBackup["itag"] = getUniItag(); - qualityItemBackup["resolution"] = codec["width"].asInt() + "x" + codec["height"].asInt(); - qualityItemBackup["isHDR"] = isHDR; - bitrateStr = HostRegExpParse(url, "(?:[?&]origin_bitrate=)(\\d+)(?:&|$)"); - if (!bitrateStr.empty()) bitrate = HostString2UIntPtr(bitrateStr); - qualityItemBackup["bitrate"] = bitrate * 1000; - if (@QualityList !is null) QualityList.insertLast(qualityItemBackup); } } } diff --git a/README.md b/README.md index 5df0226..e023f70 100644 --- a/README.md +++ b/README.md @@ -30,9 +30,10 @@ ### 📺 直播 - 支持 AVC、HEVC、AV1 -- 默认使用低延迟的 HLS/fMP4 流,无法提供时回退至 HLS/TS -- 支持直播备用地址 -- 动态生成直播画质选项 +- 默认使用低延迟的 HLS/fMP4 流,无法提供时回退至 HLS/TS。 +- 支持直播备用地址。 +- 动态生成直播画质选项。 +- 规避画质选项 potplayer 自动覆盖成 HLS 的问题。 ### ▶️ 点播 From 3e2eb412342b56cae4fdd8f8f36c0b2709f30f92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Wed, 2 Sep 2026 18:06:14 +0800 Subject: [PATCH 102/132] =?UTF-8?q?1.=20=E4=BC=98=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=202.=20=E5=A2=9E=E5=8A=A0=E4=B8=80=E4=BA=9Bitag?= =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=8C=E4=BD=86=E6=B5=8B=E8=AF=95=E5=90=8E?= =?UTF-8?q?=E6=97=A0=E7=94=A8=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 100 ++++++++++--------- 1 file changed, 53 insertions(+), 47 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index e17d915..6ff197c 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -92,7 +92,7 @@ string GetTitle() { } string GetVersion() { - return "2.6.10"; + return "2.6.9"; } string GetDesc() { @@ -148,6 +148,8 @@ class Config { int cacheValidTime = 300; bool enableSponsorBlock = false; string sponsorBlockMirror; + bool disableAVC = false; + bool preferHDR = false; bool debug = false; string danmakuUrl; @@ -187,6 +189,7 @@ class QualityListItem { int bitrateVal = 0; string va; string referer; + bool videoIsDefault; dictionary toDictionary() { dictionary ret; @@ -208,6 +211,7 @@ class QualityListItem { ret["bitrateVal"] = bitrateVal; ret["va"] = va; ret["referer"] = referer; + ret["videoIsDefault"] = videoIsDefault; return ret; } @@ -262,7 +266,9 @@ Config ReadConfigFile(string file) { if (root["sponsorBlockMirror"].isString()) { config.sponsorBlockMirror = root["sponsorBlockMirror"].asString(); } - + if (root["disableAVC"].isBool()) { + config.disableAVC = root["disableAVC"].asBool(); + } if (root["debug"].isBool()) { config.debug = root["debug"].asBool(); } @@ -350,9 +356,9 @@ string UnixTimeToDate(int64 t) { return formatInt(y) + "-" + formatInt(m + 100).substr(1) + "-" + formatInt(int(d) + 101).substr(1) + " " + formatInt(h + 100).substr(1) + ":" + formatInt(min + 100).substr(1) + ":" + formatInt(s + 100).substr(1); } -string post(string url, string data="", string headers="") { +string post(string url, string data = "", string headers = "", bool debug = true) { if (headers.empty()) headers = "User-Agent: " + UserAgent + "\r\n" + "Referer: " + Referer + "\r\n"; - log("request url", url); + if (debug) log("request url", url); return HostUrlGetString(url, "", headers, data); } @@ -806,53 +812,51 @@ dictionary AppendAudioQualityList(JsonValue audio, string bvid) { return item.toDictionary(); } -JsonValue SortVideos(JsonValue &videos) -{ - array VideoIdOrder = {6, 16, 32, 64, 74, 80, 100, 112, 116, 120, 127, 125, 126, 129}; +JsonValue SortVideos(JsonValue &videos) { + array VideoIdOrder; + if (ConfigData.preferHDR) { + VideoIdOrder = {6, 16, 32, 64, 74, 80, 100, 112, 116, 120, 127, 125, 126, 129}; + } else { + VideoIdOrder = {6, 16, 32, 64, 74, 80, 100, 112, 116, 120, 125, 126, 127, 129}; + } + JsonReader reader; JsonValue sortedVideos; - reader.parse("[]", sortedVideos); array used(videos.size(), false); - for (uint i = 0; i < videos.size(); i++) - { + for (uint i = 0; i < videos.size(); i++) { int minIndex = -1; - int minOrder = 999; + int minOrder; - for (uint j = 0; j < videos.size(); j++) - { - if (used[j]) - continue; + for (uint j = 0; j < videos.size(); j++) { + if (used[j]) continue; + + int codecid = videos[j]["codecid"].asInt(); + + if (ConfigData.disableAVC && codecid == 7) continue; - int id = videos[j]["id"].asInt(); int order = VideoIdOrder.length(); + int id = videos[j]["id"].asInt(); - for (uint k = 0; k < VideoIdOrder.length(); k++) - { - if (VideoIdOrder[k] == id) - { + for (uint k = 0; k < VideoIdOrder.length(); k++) { + if (VideoIdOrder[k] == id) { order = int(k); break; } } - if (minIndex == -1 || order < minOrder) - { + if (minIndex == -1 || order < minOrder) { minIndex = int(j); minOrder = order; - } - else if (order == minOrder) - { - int codecidA = videos[j]["codecid"].asInt(); - int codecidB = videos[minIndex]["codecid"].asInt(); - - if (codecidA < codecidB) - minIndex = int(j); + } else if (order == minOrder && codecid < videos[minIndex]["codecid"].asInt()) { + minIndex = int(j); } } + if (minIndex == -1) break; + sortedVideos[i] = videos[minIndex]; used[minIndex] = true; } @@ -938,6 +942,7 @@ string Video(string id, const string &in path, dictionary &MetaData, array &Qua } string GetM3u8RealURL(string url) { - string resp = post(url); + string resp = post(url, "", "", false); array lines = resp.split("\n"); for (uint i = 0; i < lines.size(); i++) { @@ -2334,9 +2341,7 @@ string Live(string id, const string &in path, dictionary &MetaData, array 0) { - string backup = "备"; + string backup = " - 备 "; if (j > 1) { backup += j - 1; } - format = backup + ", " + format; + qualityDetail = quality + backup; } + + int width = codec["media_info"]["width"].asInt(); + int height = codec["media_info"]["height"].asInt(); + string resolution = width + "x" + height; - // itag = getVideoItag(quality, codecid); + int bitrateVal = parseInt(HostRegExpParse(url_info_url, "(?:[?&]origin_bitrate=)(\\d+)(?:&|$)")); + string bitrate = HostFormatBitrate(bitrateVal * 1000.0) + "bps"; + + string format = codec_name + ", " + bitrate; if (itag <= 0 || HostExistITag(itag)) itag = HostGetITag(height, 0, true, true); while (HostExistITag(itag)) itag++; HostSetITag(itag); @@ -2374,7 +2379,7 @@ string Live(string id, const string &in path, dictionary &MetaData, array Date: Wed, 2 Sep 2026 18:08:19 +0800 Subject: [PATCH 103/132] update version --- Media/PlayParse/MediaPlayParse - Bilibili.as | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 6ff197c..bf5e096 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -92,7 +92,7 @@ string GetTitle() { } string GetVersion() { - return "2.6.9"; + return "2.6.10"; } string GetDesc() { From 92ec2d781ebe94b3a5cc2c610eacdc65e4ac7ceb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Wed, 2 Sep 2026 18:08:43 +0800 Subject: [PATCH 104/132] update version --- Media/PlayParse/MediaPlayParse - Bilibili.as | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index bf5e096..5183f45 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -92,7 +92,7 @@ string GetTitle() { } string GetVersion() { - return "2.6.10"; + return "2.6.11"; } string GetDesc() { From acf8213816cf173865aa1b075a31bfa449cd1317 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Wed, 2 Sep 2026 18:20:47 +0800 Subject: [PATCH 105/132] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=BC=B9=E5=B9=95?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 5183f45..53b8b1e 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -92,7 +92,7 @@ string GetTitle() { } string GetVersion() { - return "2.6.11"; + return "2.6.9"; } string GetDesc() { @@ -921,8 +921,12 @@ string Video(string id, const string &in path, dictionary &MetaData, array Date: Wed, 2 Sep 2026 18:24:18 +0800 Subject: [PATCH 106/132] update version --- Media/PlayParse/MediaPlayParse - Bilibili.as | 1 - 1 file changed, 1 deletion(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 53b8b1e..83345f9 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -921,7 +921,6 @@ string Video(string id, const string &in path, dictionary &MetaData, array Date: Thu, 3 Sep 2026 10:07:55 +0800 Subject: [PATCH 107/132] update README.md --- README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index e023f70..007f857 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ ### 🔧 整体优化 - 本地缓存响应数据,降低 API 请求次数。可在配置文件中设置,默认300s。 - 清理无用代码。 +- 换用新的 itag 选择机制。 ### 📺 直播 @@ -40,7 +41,9 @@ - 支持屏蔽 P2PCDN,可通过配置文件调整,默认屏蔽 - 修复部分 Host 为 `upos` 的点播 URL 播放失败的问题 - Bilibili 点播更换新接口,尽量使用wbi签名认证防止接口失效 -- 重新支持用户合集视频,并支持多合集,potplayer 播放列表( 快捷键 F6 ) 正确显示合集视频。当存在用户视频合集时,播放列表里只展示合集视频。当只存在单个视频时,播放列表里包含当前视频与推荐视频(是否包含推荐视频取决于配置文件`showRecommendedVideos`开关) +- 重新支持用户合集视频,并支持多合集,potplayer 播放列表( 快捷键 F6 ) 正确显示合集视频。 + - 当存在用户视频合集时,播放列表里只展示合集视频。 + - 当只存在单个视频时,播放列表里包含当前视频与推荐视频(是否包含推荐视频取决于配置文件`showRecommendedVideos`开关) - 播放番剧,电视剧等其它PGC合集或用户合集时,正确定位当前视频,不会出现从第一集开始播放的问题 - 支持AV播放地址 - 优化 Bilibili 音频画质选项显示: @@ -53,8 +56,8 @@ 另外支持指定镜像站点,以解决主站访问不稳定的问题。(由于目前主站访问不稳定,镜像站是临时的,所以默认禁用。) - 换用新的画质选项名称生成逻辑,现在动态获取,与官方名称一致。 -- 画质选项增加更多属性 -- 换用新的 itag 选择机制。 +- 画质选项增加更多属性。 +- 增加 disableAVC 和 preferHDR 设置。 ## TODO @@ -127,7 +130,7 @@ ![Skip_Settings](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/skip_1.png) -勾选`跳略播放`和`章节名称`,并在名称列表中追加片段名称(例如:`片头`和`片尾`),每一项之间用英文分号`;`隔开,所有片段名称如下: +勾选`跳略播放`和`章节名称`,并在名称列表中追加片段名称(例如:`开场动画`和`片尾`),每一项之间用英文分号`;`隔开,所有片段名称如下: - `赞助` - `推广` @@ -168,10 +171,7 @@ * **精准空降**:将网页端指定的播放时间传递给 PotPlayer,实现精准跳转。 * **打开 PotPlayer 时自动暂停网页端视频**:启动 PotPlayer 播放后,自动暂停 Bilibili 网页端正在播放的视频,避免音视频重复播放。 - -### 油猴脚本声明 - -修改版脚本 `BilibiliPotPlayer-改` [https://greasyfork.org/zh-CN/scripts/593353-bilibilipotplayer-改](https://greasyfork.org/zh-CN/scripts/593353-bilibilipotplayer-%E6%94%B9)) 基于`原版油猴脚本` [油猴脚本https://greasyfork.org/zh-CN/scripts/461800-bilibilipotplayer](https://greasyfork.org/zh-CN/scripts/461800-bilibilipotplayer),并保留原作者及原项目相关信息。如原作者对本脚本的发布或再分发存在异议,并要求停止发布,本人将配合下架本脚本。 +对本脚本的发布或再分发存在异议,并要求停止发布,本人将配合下架本脚本。 ## 关于精准空降 From bc0f9dd8dd41fbe57154e681abe4c5f35eaf7ab8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Thu, 3 Sep 2026 10:11:15 +0800 Subject: [PATCH 108/132] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 83345f9..bd67634 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -92,7 +92,7 @@ string GetTitle() { } string GetVersion() { - return "2.6.9"; + return "2.6.11"; } string GetDesc() { From f13f54331f062b5e24e518aa51317d97649480e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Sat, 5 Sep 2026 21:56:04 +0800 Subject: [PATCH 109/132] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=A9=BA=E9=97=B4=E5=90=88=E9=9B=86=E3=80=82=20-=20?= =?UTF-8?q?=E6=95=B4=E7=90=86=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84=E3=80=82?= =?UTF-8?q?=20-=20Wbi=20=E7=AD=BE=E5=90=8D=E5=A2=9E=E5=8A=A0wts=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E3=80=82=20-=20=E7=BC=93=E5=AD=98=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=E4=B8=8E=E5=AD=98=E5=82=A8=E5=8E=BB=E6=8E=89=20wts=E4=B8=8Ew?= =?UTF-8?q?=5Frid=E3=80=82=20-=20=E9=9F=B3=E9=A2=91=20itag=20=E7=94=9F?= =?UTF-8?q?=E6=88=90=E4=B8=8D=E5=86=8D=E4=BD=BF=E7=94=A8=E9=A2=84=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=E3=80=82=20-=20PGC=20=E7=8B=AC=E7=AB=8B=E5=87=BA?= =?UTF-8?q?=E6=9D=A5=E5=AE=9E=E7=8E=B0=EF=BC=8C=E5=B7=B2=E5=BA=94=E5=AF=B9?= =?UTF-8?q?=E5=90=8E=E7=BB=AD=E5=8F=AF=E8=83=BD=E7=9A=84=E5=8F=98=E5=8C=96?= =?UTF-8?q?=E3=80=82=20-=20=E4=BF=AE=E5=A4=8D=E7=89=B9=E5=AE=9A=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E7=94=A8=E6=88=B7=E5=90=88=E9=9B=86=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 5112 ++++++++++-------- README.md | 23 +- 2 files changed, 2793 insertions(+), 2342 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index bd67634..7054488 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -15,9 +15,9 @@ // string GetLoginDesc() -> get desc for login dialog // string GetUserText() -> get user text for login dialog // string GetPasswordText() -> get password text for login dialog -// string ServerCheck(string User, string Pass) -> server check -// string ServerLogin(string User, string Pass) -> login -// void ServerLogout() -> logout +// string ServerCheck(string User, string Pass) -> server check +// string ServerLogin(string User, string Pass) -> login +// void ServerLogout() -> logout // string GetWebAccountUrl() -> login process by WebBrowser // string GetWebAccountDomain() -> transport cookie domain for login // string GetConfigFile() @@ -33,94 +33,177 @@ // string GetBroadcastListUrl() -> get broadcast list url // string GetBroadcastListScript() -> for WebView2::AddScriptToExecuteOnDocumentCreated for script process +uint status = 0; Config ConfigData; VideoIsUGCorPGC videoIsUGCorPGC; dictionary ResponseCache; +string MixinKey; +const string Host = "https://api.bilibili.com"; const string ConfigFileName = "Bilibili_Config.json"; -const array BilibiliDomains = {"bilibili.com", "bilivideo.com", "bilivideo.cn", "smtcdns.net"}; +const array BilibiliDomains = { "bilibili.com", "bilivideo.com", "bilivideo.cn", "smtcdns.net" }; +const string Referer = "https://www.bilibili.com"; +const string UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36 Edg/151.0.0.0"; const array knownP2pCdnDomainPattern = { - "302ppio", - "302kodo", - ".mcdn.bilivideo", - "szbdyd.com", - ".nexusedgeio.com", - ".ahdohpiechei.com", - "upos-sz-mirror14b.bilivideo.com" + "302ppio", + "302kodo", + ".mcdn.bilivideo", + "szbdyd.com", + ".nexusedgeio.com", + ".ahdohpiechei.com", + "upos-sz-mirror14b.bilivideo.com" }; -const string UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36 Edg/151.0.0.0"; -const string Referer = "https://www.bilibili.com"; +class VideoIsUGCorPGC { + string url = ""; + bool isUGCSeason = false; + bool isPGC = false; + string pgcURL = ""; +} -void OnInitialize() { - for (uint i = 0; i < BilibiliDomains.length(); i++) { - HostSetUrlUserAgentHTTP(BilibiliDomains[i], UserAgent); - HostSetUrlRefererHTTP(BilibiliDomains[i], Referer); - } +class ResponseCacheItem { + string response; + uint tick_count; + uint valid_time; +} - string configFile = HostGetScriptFolder() + ConfigFileName; - if (!HostFileExist(configFile)) { - HostMessageBox("配置文件不存在\n\n路径: " + configFile , "[BilibiliPotplayer] 配置文件不存在", 0, 0); - } - ConfigData = ReadConfigFile(configFile); - if (ConfigData.debug) { - HostOpenConsole(); - } +class QualityListItem { + string url; + string quality; + string qualityDetail; + string resolution; + string bitrate; + string format; + int itag = 0; + int fps = 0.0; + int type3D = 0; // 1:sbs, 2:t&b + bool is360 = false; + bool isHDR = false; + string audioName; + string audioCode; + bool audioIsDefault = false; + int bitrateVal = 0; + string va; + string referer; + bool videoIsDefault; + + dictionary toDictionary() { + dictionary ret; + + ret["url"] = url; + ret["quality"] = quality; + ret["qualityDetail"] = qualityDetail; + ret["resolution"] = resolution; + ret["bitrate"] = bitrate; + ret["format"] = format; + ret["itag"] = itag; + ret["fps"] = fps; + ret["type3D"] = type3D; + ret["is360"] = is360; + ret["isHDR"] = isHDR; + ret["audioName"] = audioName; + ret["audioCode"] = audioCode; + ret["audioIsDefault"] = audioIsDefault; + ret["bitrateVal"] = bitrateVal; + ret["va"] = va; + ret["referer"] = referer; + ret["videoIsDefault"] = videoIsDefault; + + return ret; + } +} + +class Config { + string fullConfig; + int uid = 0; + bool danmakuEnable = true; + string danmakuServer; + string danmakuFont; + float danmakuFontSize = 30.0; + float danmakuOpacity = 0.8; + float danmakuDisplayArea = 0.8; + float danmakuStayTime = 15.0; + bool showRecommendedVideos = true; + bool blockP2PCDN = true; + int cacheValidTime = 300; + bool enableSponsorBlock = false; + string sponsorBlockMirror; + bool disableAVC = false; + bool preferHDR = false; + bool debug = false; + + string danmakuUrl; + string subtitleUrl; + + int maxliveroom = 200; } -string host = "https://api.bilibili.com"; -string mixin_key; +void OnInitialize() { + for (uint i = 0; i < BilibiliDomains.length(); i++) { + HostSetUrlUserAgentHTTP(BilibiliDomains[i], UserAgent); + HostSetUrlRefererHTTP(BilibiliDomains[i], Referer); + } + + string configFile = HostGetScriptFolder() + ConfigFileName; + if (!HostFileExist(configFile)) { + HostMessageBox("配置文件不存在\n\n路径: " + configFile, "[BilibiliPotplayer] 配置文件不存在", 0, 0); + } + ConfigData = ReadConfigFile(configFile); + if (ConfigData.debug) { + HostOpenConsole(); + } +} string GetTitle() { - string title = "Bilibili"; - if (!HostFileExist(HostGetScriptFolder() + ConfigFileName)) { - return title + "(配置文件不存在)"; - } + string title = "Bilibili"; + if (!HostFileExist(HostGetScriptFolder() + ConfigFileName)) { + return title + "(配置文件不存在)"; + } - Config config; - uintptr fp = HostFileOpen(HostGetScriptFolder() + ConfigFileName); - config.fullConfig = HostFileRead(fp, HostFileLength(fp)); - HostFileClose(fp); + Config config; + uintptr fp = HostFileOpen(HostGetScriptFolder() + ConfigFileName); + config.fullConfig = HostFileRead(fp, HostFileLength(fp)); + HostFileClose(fp); - JsonReader reader; - JsonValue root; - if (!reader.parse(config.fullConfig, root) && !root.isObject()) { - return title + "(配置文件格式错误)"; - } + JsonReader reader; + JsonValue root; + if (!reader.parse(config.fullConfig, root) && !root.isObject()) { + return title + "(配置文件格式错误)"; + } - return title; + return title; } string GetVersion() { - return "2.6.11"; + return "2.6.12"; } string GetDesc() { - return "https://www.bilibili.com"; + return "https://www.bilibili.com"; } string GetConfigFile() { - return HostGetScriptFolder() + ConfigFileName; + return HostGetScriptFolder() + ConfigFileName; } void ApplyConfigFile() { - string msg; - Config config; - uintptr fp = HostFileOpen(HostGetScriptFolder() + ConfigFileName); - config.fullConfig = HostFileRead(fp, HostFileLength(fp)); - HostFileClose(fp); + string msg; + Config config; + uintptr fp = HostFileOpen(HostGetScriptFolder() + ConfigFileName); + config.fullConfig = HostFileRead(fp, HostFileLength(fp)); + HostFileClose(fp); - JsonReader reader; - JsonValue root; - if (!reader.parse(config.fullConfig, root) && !root.isObject()) { - msg = "配置文件存在问题"; - } + JsonReader reader; + JsonValue root; + if (!reader.parse(config.fullConfig, root) && !root.isObject()) { + msg = "配置文件存在问题"; + } - HostMessageBox(msg, "[BilibiliPotplayer] 配置文件错误", 0,1); + HostMessageBox(msg, "[BilibiliPotplayer] 配置文件错误", 0, 1); } string GetWebAccountUrl() { - return "https://passport.bilibili.com/login"; + return "https://passport.bilibili.com/login"; } string GetWebAccountDomain() { @@ -133,207 +216,152 @@ string GetWebAccountDomain() { return domains; } -class Config { - string fullConfig; - int uid = 0; - bool danmakuEnable = true; - string danmakuServer; - string danmakuFont; - float danmakuFontSize = 30.0; - float danmakuOpacity = 0.8; - float danmakuDisplayArea = 0.8; - float danmakuStayTime = 15.0; - bool showRecommendedVideos = true; - bool blockP2PCDN = true; - int cacheValidTime = 300; - bool enableSponsorBlock = false; - string sponsorBlockMirror; - bool disableAVC = false; - bool preferHDR = false; - bool debug = false; - - string danmakuUrl; - string subtitleUrl; - - int maxliveroom = 200; -}; - -class VideoIsUGCorPGC { - string url = ""; - bool isUGCSeason = false; - bool isPGC = false; - string pgcURL = ""; -}; +string GetStatus() { + string info = ""; + + switch(status) { + case 1: + info = "单视频检查"; + break; + case 2: + info = "合集检查"; + break; + case 3: + info = "解析视频合集"; + break; + case 4: + info = "解析视频信息"; + break; + case 5: + info = "请求空降助手接口"; + break; + case 6: + info = "解析真实播放地址"; + break; + default: + info = "请等待"; + } -class ResponseCacheItem { - string response; - uint tick_count; - uint valid_time; + return info; } -class QualityListItem { - string url; - string quality; - string qualityDetail; - string resolution; - string bitrate; - string format; - int itag = 0; - int fps = 0.0; - int type3D = 0; // 1:sbs, 2:t&b - bool is360 = false; - bool isHDR = false; - string audioName; - string audioCode; - bool audioIsDefault = false; - int bitrateVal = 0; - string va; - string referer; - bool videoIsDefault; - - dictionary toDictionary() { - dictionary ret; - - ret["url"] = url; - ret["quality"] = quality; - ret["qualityDetail"] = qualityDetail; - ret["resolution"] = resolution; - ret["bitrate"] = bitrate; - ret["format"] = format; - ret["itag"] = itag; - ret["fps"] = fps; - ret["type3D"] = type3D; - ret["is360"] = is360; - ret["isHDR"] = isHDR; - ret["audioName"] = audioName; - ret["audioCode"] = audioCode; - ret["audioIsDefault"] = audioIsDefault; - ret["bitrateVal"] = bitrateVal; - ret["va"] = va; - ret["referer"] = referer; - ret["videoIsDefault"] = videoIsDefault; - - return ret; - } -}; - Config ReadConfigFile(string file) { - Config config; - uintptr fp = HostFileOpen(file); - config.fullConfig = HostFileRead(fp, HostFileLength(fp)); - JsonReader reader; - JsonValue root; - if (reader.parse(config.fullConfig, root) && root.isObject()) { - if (root["maxliveroom"].isNumeric()) { - config.maxliveroom = root["maxliveroom"].asInt(); - } - if (root["danmaku"].isObject()) { - JsonValue danmaku = root["danmaku"]; - if (danmaku["enable"].isBool()) { - config.danmakuEnable = danmaku["enable"].asBool(); - } - if (danmaku["server"].isString() && !danmaku["server"].asString().empty()) { - config.danmakuServer = danmaku["server"].asString(); - } - if (danmaku["font"].isString()) { - config.danmakuFont = danmaku["font"].asString(); - } - if (danmaku["fontSize"].isNumeric()) { - config.danmakuFontSize = danmaku["fontSize"].asFloat(); - } - if (danmaku["opacity"].isNumeric()) { - config.danmakuOpacity = danmaku["opacity"].asFloat(); - } - if (danmaku["displayArea"].isNumeric()) { - config.danmakuDisplayArea = danmaku["displayArea"].asFloat(); - } - if (danmaku["stayTime"].isNumeric()) { - config.danmakuStayTime = danmaku["stayTime"].asFloat(); - } - } - if (root["showRecommendedVideos"].isBool()) { - config.showRecommendedVideos = root["showRecommendedVideos"].asBool(); - } - if (root["blockP2PCDN"].isBool()) { - config.blockP2PCDN = root["blockP2PCDN"].asBool(); - } - if (root["cacheValidTime"].isNumeric()) { - config.cacheValidTime = root["cacheValidTime"].asInt(); - } - if (root["enableSponsorBlock"].isBool()) { - config.enableSponsorBlock = root["enableSponsorBlock"].asBool(); - } - if (root["sponsorBlockMirror"].isString()) { - config.sponsorBlockMirror = root["sponsorBlockMirror"].asString(); - } - if (root["disableAVC"].isBool()) { - config.disableAVC = root["disableAVC"].asBool(); - } - if (root["debug"].isBool()) { - config.debug = root["debug"].asBool(); - } - if (!config.danmakuServer.empty()) { - config.danmakuUrl = config.danmakuServer + "/subtitle?font=" + HostUrlEncode(config.danmakuFont) + "&font_size=" + config.danmakuFontSize + "&alpha=" + config.danmakuOpacity + "&display_area=" + config.danmakuDisplayArea + "&duration_marquee=" + config.danmakuStayTime + "&duration_still=" + config.danmakuStayTime + "&cid="; - config.subtitleUrl = config.danmakuServer + "/subtitle?url="; - } - - } else{ - HostMessageBox("配置文件存在问题", "[BilibiliPotplayer] 配置文件错误", 0,1); - } - - HostFileClose(fp); + Config config; + uintptr fp = HostFileOpen(file); + config.fullConfig = HostFileRead(fp, HostFileLength(fp)); + JsonReader reader; + JsonValue root; + if (reader.parse(config.fullConfig, root) && root.isObject()) { + if (root["maxliveroom"].isNumeric()) { + config.maxliveroom = root["maxliveroom"].asInt(); + } + if (root["danmaku"].isObject()) { + JsonValue danmaku = root["danmaku"]; + if (danmaku["enable"].isBool()) { + config.danmakuEnable = danmaku["enable"].asBool(); + } + if (danmaku["server"].isString() && !danmaku["server"].asString().empty()) { + config.danmakuServer = danmaku["server"].asString(); + } + if (danmaku["font"].isString()) { + config.danmakuFont = danmaku["font"].asString(); + } + if (danmaku["fontSize"].isNumeric()) { + config.danmakuFontSize = danmaku["fontSize"].asFloat(); + } + if (danmaku["opacity"].isNumeric()) { + config.danmakuOpacity = danmaku["opacity"].asFloat(); + } + if (danmaku["displayArea"].isNumeric()) { + config.danmakuDisplayArea = danmaku["displayArea"].asFloat(); + } + if (danmaku["stayTime"].isNumeric()) { + config.danmakuStayTime = danmaku["stayTime"].asFloat(); + } + } + if (root["showRecommendedVideos"].isBool()) { + config.showRecommendedVideos = root["showRecommendedVideos"].asBool(); + } + if (root["blockP2PCDN"].isBool()) { + config.blockP2PCDN = root["blockP2PCDN"].asBool(); + } + if (root["cacheValidTime"].isNumeric()) { + config.cacheValidTime = root["cacheValidTime"].asInt(); + } + if (root["enableSponsorBlock"].isBool()) { + config.enableSponsorBlock = root["enableSponsorBlock"].asBool(); + } + if (root["sponsorBlockMirror"].isString()) { + config.sponsorBlockMirror = root["sponsorBlockMirror"].asString(); + } + if (root["disableAVC"].isBool()) { + config.disableAVC = root["disableAVC"].asBool(); + } + if (root["debug"].isBool()) { + config.debug = root["debug"].asBool(); + } + if (!config.danmakuServer.empty()) { + config.danmakuUrl = config.danmakuServer + "/subtitle?font=" + HostUrlEncode(config.danmakuFont) + "&font_size=" + config.danmakuFontSize + "&alpha=" + config.danmakuOpacity + "&display_area=" + config.danmakuDisplayArea + "&duration_marquee=" + config.danmakuStayTime + "&duration_still=" + config.danmakuStayTime + "&cid="; + config.subtitleUrl = config.danmakuServer + "/subtitle?url="; + } - return config; -} + } else { + HostMessageBox("配置文件存在问题", "[BilibiliPotplayer] 配置文件错误", 0, 1); + } -uint status = 0; -string GetStatus() { - string info = ""; - - switch (status) - { - case 1: - info = "单视频检查"; - break; - case 2: - info = "合集检查"; - break; - case 3: - info = "解析视频合集"; - break; - case 4: - info = "解析视频信息"; - break; - case 5: - info = "请求空降助手接口"; - break; - case 6: - info = "解析真实播放地址"; - break; - default: - info = "请等待"; - } + HostFileClose(fp); - return info; + return config; } - void log(string item) { - if (!ConfigData.debug) { - return; - } - HostPrintUTF8(item); + if (!ConfigData.debug) { + return; + } + HostPrintUTF8(item); } void log(string item, string info) { - log(item + ": " + info); + log(item + ": " + info); } void log(string item, int info) { - log(item + ": " + info); + log(item + ": " + info); +} + +string FormatDateTime(datetime&in dt) { + return formatInt(dt.get_year()) + "-" + (dt.get_month() < 10 ? "0" : "") + + formatInt(dt.get_month()) + "-" + (dt.get_day() < 10 ? "0" : "") + + formatInt(dt.get_day()) + " " + (dt.get_hour() < 10 ? "0" : "") + + formatInt(dt.get_hour()) + ":" + (dt.get_minute() < 10 ? "0" : "") + + formatInt(dt.get_minute()) + ":" + (dt.get_second() < 10 ? "0" : "") + + formatInt(dt.get_second()); } -string UnixTimeToDate(int64 t) { +int64 DatetimeToUnixTime(const string&in s) { + int year = parseInt(s.substr(0, 4)); + int month = parseInt(s.substr(5, 2)); + int day = parseInt(s.substr(8, 2)); + int hour = parseInt(s.substr(11, 2)); + int minute = parseInt(s.substr(14, 2)); + int second = parseInt(s.substr(17, 2)); + + int64 days = 0; + + for (int y = 1970; y < year; y++) + days += ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) ? 366 : 365; + + int[] daysInMonth = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + + for (int m = 1; m < month; m++) + days += daysInMonth[m - 1] + (m == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) ? 1 : 0); + + days += day - 1; + + return days * 86400 + hour * 3600 + minute * 60 + second; +} + +string UnixTimeToDateTime(int64 t) { int64 d = t / 86400; int s = int(t % 86400); int y = 1970, m = 1, md; @@ -356,789 +384,379 @@ string UnixTimeToDate(int64 t) { return formatInt(y) + "-" + formatInt(m + 100).substr(1) + "-" + formatInt(int(d) + 101).substr(1) + " " + formatInt(h + 100).substr(1) + ":" + formatInt(min + 100).substr(1) + ":" + formatInt(s + 100).substr(1); } -string post(string url, string data = "", string headers = "", bool debug = true) { - if (headers.empty()) headers = "User-Agent: " + UserAgent + "\r\n" + "Referer: " + Referer + "\r\n"; - if (debug) log("request url", url); - return HostUrlGetString(url, "", headers, data); +string getMixinKey() { + JsonReader Reader; + JsonValue Root; + string key = ""; + string res = apiPost("/x/web-interface/nav"); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].isInt()) { + JsonValue wbi_img = Root["data"]["wbi_img"]; + string img_url = wbi_img["img_url"].asString(); + string sub_url = wbi_img["sub_url"].asString(); + array parts = img_url.split("/"); + string img_value = parts[parts.length() - 1].split(".")[0]; + parts = sub_url.split("/"); + string sub_value = parts[parts.length() - 1].split(".")[0]; + string ae = img_value + sub_value; + array oe = { 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, 36, 20, 34, 44, 52 }; + for (uint i = 0; i < oe.length(); i++) { + key += ae.substr(oe[i], 1); + } + } + } + if (key.empty()) { + return key; + } + return key.substr(0, 32); } -string apiPost(string api, string data="") { - string key; - if (!data.empty()) { - key = api + "?" + data; - } else { - key = api; - } - - ResponseCacheItem item; - if (ResponseCache.get(key, item)) { - if (HostGetTickCount() - item.tick_count <= item.valid_time) { - log("Cache Hit, url", host + api); - return item.response; - } else { - log("Cache expire, url", host + api); - } - } else { - log("Cache not Hit, url", host + api); - } +string encWbi(string params) { + if (MixinKey.empty()) { + MixinKey = getMixinKey(); + } + array lst = params.split("&"); + lst.sortAsc(); + string newParams; + for (uint i = 0; i < lst.length(); i++) { + newParams += lst[i]; + if (i != lst.length() - 1) + newParams += "&"; + } + newParams += ("&wts=" + formatInt(DatetimeToUnixTime(FormatDateTime(datetime())))); - string resp = post(host + api, data); - if (resp.empty()) { - HostMessageBox("未获取到响应数据,请等待一段时间后重试一下\nurl: " + host + api, "请求失败"); - return ""; - } + return (newParams + "&w_rid=" + HostHashMD5(newParams + MixinKey)); +} - JsonReader Reader; - JsonValue Root; - if (!Reader.parse(resp, Root) || !Root.isObject()) { - HostMessageBox("未能解析响应数据\nurl: " + host + api, "请求失败"); - return ""; +string makeWebUrl(string path) { + array strs = path.split("?"); + if (strs.length() <= 1) { + return path; } - if (Root["code"].asInt() != 0) { - log("error code: " + Root["code"].asInt() + "\n" + "error message: " + Root["message"].asString() + "\n" + "url:" + host + api); - HostMessageBox("error code: " + Root["code"].asInt() + "\n" + "error message: " + Root["message"].asString() + "\n" + "url:" + host + api, Root["message"].asString()); - return ""; + string url = strs[0]; + string p = parse(path, "p"); + if (p.empty() || p == "1") { + return url; } - - item.response = resp; - item.tick_count = HostGetTickCount(); - item.valid_time = ConfigData.cacheValidTime * 1000; - ResponseCache[key] = item; - - return resp; + return url + "?p=" + p; } -array generateChapter(const string &in bvid) { - array chapter; - const float MIN_CHAPTER_DURATION = 1.0f; - dictionary typesToName = { - {"sponsor", "赞助"}, - {"selfpromo", "推广"}, - {"exclusive_access", "品牌合作"}, - {"interaction", "三连提醒"}, - {"poi_highlight", "精彩时刻"}, - {"intro", "开场动画"}, - {"outro", "片尾"}, - {"preview", "预览"}, - {"padding", "填充内容"}, - {"filler", "离题"}, - {"music_offtopic", "非音乐"} - }; - - string headers = "origin: https://github.com/frostnotfall/BilibiliPotPlayer\r\nx-ext-version: " + GetVersion() + "\r\n"; - string url = !ConfigData.sponsorBlockMirror.empty() ? ConfigData.sponsorBlockMirror + "/api/skipSegments?videoID=" + bvid : "https://bsbsb.top/api/skipSegments?videoID=" + bvid; +string post(string url, string data = "", string headers = "", bool debug = true) { + if (headers.empty()) headers = "User-Agent: " + UserAgent + "\r\n" + "Referer: " + Referer + "\r\n"; + if (debug) log("request url", url); + return HostUrlGetString(url, "", headers, data); +} + +string apiPost(string api, string data = "") { + string key; + ; + if (!data.empty()) { + key = HostRegExpRemove(HostRegExpRemove(api, "&w_rid=[^&]*"), "&wts=[^&]*") + "?" + data; + } else { + key = HostRegExpRemove(HostRegExpRemove(api, "&w_rid=[^&]*"), "&wts=[^&]*"); + ; + } - string resp; - resp = post(url, "", headers); + ResponseCacheItem item; + if (ResponseCache.get(key, item)) { + if (HostGetTickCount() - item.tick_count <= item.valid_time) { + log("Cache Hit, url", Host + api); + return item.response; + } else { + log("Cache expire, url", Host + api); + } + } else { + log("Cache not Hit, url", Host + api); + } - if (resp.empty()) { - log("SponsorBlock response is empty. url: " + url); - return chapter; + string resp = post(Host + api, data); + if (resp.empty()) { + HostMessageBox("未获取到响应数据,请等待一段时间后重试一下\nurl: " + Host + api, "请求失败"); + return ""; } JsonReader Reader; - JsonValue SponsorBlock; - - if (!Reader.parse(resp, SponsorBlock) || !SponsorBlock.isArray()) { - log("Failed to parse SponsorBlock response. url: " + url); - return chapter; + JsonValue Root; + if (!Reader.parse(resp, Root) || !Root.isObject()) { + HostMessageBox("未能解析响应数据\nurl: " + Host + api, "请求失败"); + return ""; } - - if (SponsorBlock.size() == 0) return chapter; - - array starts; - array ends; - array titles; - array times; - - for (int i = 0; i < SponsorBlock.size(); i++) { - JsonValue item = SponsorBlock[i]; - string category = item["category"].asString(); - - if (!typesToName.exists(category)) continue; - - float start = item["segment"][0].asFloat(); - float end = item["segment"][1].asFloat(); - - if (start >= end) continue; - - starts.insertLast(start); - ends.insertLast(end); - titles.insertLast(string(typesToName[category])); - - times.insertLast(start); - times.insertLast(end); + if (Root["code"].asInt() != 0) { + log("error code: " + Root["code"].asInt() + "\n" + "error message: " + Root["message"].asString() + "\n" + "url:" + Host + api); + HostMessageBox("error code: " + Root["code"].asInt() + "\n" + "error message: " + Root["message"].asString() + "\n" + "url:" + Host + api, Root["message"].asString()); + return ""; } - if (starts.size() == 0) return chapter; - - for (int i = 1; i < times.size(); i++) { - float value = times[i]; - int j = i - 1; + item.response = resp; + item.tick_count = HostGetTickCount(); + item.valid_time = ConfigData.cacheValidTime * 1000; + ResponseCache[key] = item; - while (j >= 0 && times[j] > value) { - times[j + 1] = times[j]; - j--; - } + return resp; +} - times[j + 1] = value; +string parse(string url, string key, string defaultValue = "") { + string value = HostRegExpParse(url, "\\?" + key + "=([^&]+)"); + if (!value.empty()) { + return value; } - - array sortedTimes; - - for (int i = 0; i < times.size(); i++) { - if (sortedTimes.size() == 0 || - sortedTimes[sortedTimes.size() - 1] != times[i]) { - sortedTimes.insertLast(times[i]); - } + value = HostRegExpParse(url, "&" + key + "=([^&]+)"); + if (!value.empty()) { + return value; } - array resultTimes; - array resultTitles; - string lastTitle; - - for (int i = 0; i < sortedTimes.size(); i++) { - float time = sortedTimes[i]; - - string currentTitle; - float selectedStart = -1; - - for (int j = 0; j < starts.size(); j++) { - if (starts[j] <= time && ends[j] > time) { - if (starts[j] > selectedStart) { - selectedStart = starts[j]; - currentTitle = titles[j]; - } - } - } - - if (currentTitle.empty()) currentTitle = "正片"; - if (currentTitle == lastTitle) continue; - - resultTimes.insertLast(time); - resultTitles.insertLast(currentTitle); - lastTitle = currentTitle; - } + value = defaultValue; + return value; +} - array filteredTimes; - array filteredTitles; +string parseBVId(string url) { + return HostRegExpParse(url, "(BV[a-zA-Z0-9]+)"); +} - for (int i = 0; i < resultTimes.size(); i++) { - if (i == 0) { - filteredTimes.insertLast(resultTimes[i]); - filteredTitles.insertLast(resultTitles[i]); - continue; - } +string parseAVId(string url) { + return HostRegExpParse(url, "av([0-9]+)"); +} - float duration = resultTimes[i] - resultTimes[i - 1]; +string parseEPId(string url) { + return HostRegExpParse(url, "ep([0-9]+)"); +} - if (duration < MIN_CHAPTER_DURATION) { - if (filteredTimes.size() > 0) { - filteredTimes.removeLast(); - filteredTitles.removeLast(); - } +string parseSSId(string url) { + return HostRegExpParse(url, "ss([0-9]+)"); +} - filteredTimes.insertLast(resultTimes[i]); - filteredTitles.insertLast(resultTitles[i]); - continue; - } +string parseMDId(string url) { + return HostRegExpParse(url, "md([0-9]+)"); +} - filteredTimes.insertLast(resultTimes[i]); - filteredTitles.insertLast(resultTitles[i]); +string parseFid(string path) { + string fid = parse(path, "fid"); + if (fid.empty()) { + fid = parse(path, "searchFid"); } + if (fid.empty()) { + fid = HostRegExpParse(path, "/medialist/detail/ml([0-9]+)"); + } + return fid; +} - array finalTimes; - array finalTitles; - - for (int i = 0; i < filteredTimes.size(); i++) { - if (finalTitles.size() > 0 && - finalTitles[finalTitles.size() - 1] == filteredTitles[i]) { - continue; +uint gettid(string path) { + array urls = { 'www.bilibili.com/v/anime/serial', 'www.bilibili.com/v/anime/finish', 'www.bilibili.com/v/anime/information', 'www.bilibili.com/v/anime/offical', 'www.bilibili.com/anime', 'www.bilibili.com/movie', 'www.bilibili.com/v/guochuang/chinese', 'www.bilibili.com/v/guochuang/original', 'www.bilibili.com/v/guochuang/puppetry', 'www.bilibili.com/v/guochuang/motioncomic', 'www.bilibili.com/v/guochuang/information', 'www.bilibili.com/guochuang', 'www.bilibili.com/tv', 'www.bilibili.com/documentary', 'www.bilibili.com/v/douga/mad', 'www.bilibili.com/v/douga/mmd', 'www.bilibili.com/v/douga/voice', 'www.bilibili.com/v/douga/garage_kit', 'www.bilibili.com/v/douga/tokusatsu', 'www.bilibili.com/v/douga/acgntalks', 'www.bilibili.com/v/douga/other', 'www.bilibili.com/v/douga', 'www.bilibili.com/v/game/stand_alone', 'www.bilibili.com/v/game/esports', 'www.bilibili.com/v/game/mobile', 'www.bilibili.com/v/game/online', 'www.bilibili.com/v/game/board', 'www.bilibili.com/v/game/gmv', 'www.bilibili.com/v/game/music', 'www.bilibili.com/v/game/mugen', 'www.bilibili.com/v/game', 'www.bilibili.com/v/kichiku/guide', 'www.bilibili.com/v/kichiku/mad', 'www.bilibili.com/v/kichiku/manual_vocaloid', 'www.bilibili.com/v/kichiku/theatre', 'www.bilibili.com/v/kichiku/course', 'www.bilibili.com/v/kichiku', 'www.bilibili.com/v/music/original', 'www.bilibili.com/v/music/cover', 'www.bilibili.com/v/music/perform', 'www.bilibili.com/v/music/vocaloid', 'www.bilibili.com/v/music/live', 'www.bilibili.com/v/music/mv', 'www.bilibili.com/v/music/commentary', 'www.bilibili.com/v/music/tutorial', 'www.bilibili.com/v/music/other', 'www.bilibili.com/v/music', 'www.bilibili.com/v/dance/otaku', 'www.bilibili.com/v/dance/hiphop', 'www.bilibili.com/v/dance/star', 'www.bilibili.com/v/dance/china', 'www.bilibili.com/v/dance/three_d', 'www.bilibili.com/v/dance/demo', 'www.bilibili.com/v/dance', 'www.bilibili.com/v/cinephile/cinecism', 'www.bilibili.com/v/cinephile/montage', 'www.bilibili.com/v/cinephile/shortfilm', 'www.bilibili.com/v/cinephile/trailer_info', 'www.bilibili.com/v/cinephile', 'www.bilibili.com/v/ent/variety', 'www.bilibili.com/v/ent/talker', 'www.bilibili.com/v/ent/fans', 'www.bilibili.com/v/ent/celebrity', 'www.bilibili.com/v/ent', 'www.bilibili.com/v/knowledge/science', 'www.bilibili.com/v/knowledge/social_science', 'www.bilibili.com/v/knowledge/humanity_history', 'www.bilibili.com/v/knowledge/business', 'www.bilibili.com/v/knowledge/campus', 'www.bilibili.com/v/knowledge/career', 'www.bilibili.com/v/knowledge/design', 'www.bilibili.com/v/knowledge/skill', 'www.bilibili.com/v/knowledge', 'www.bilibili.com/v/tech/digital', 'www.bilibili.com/v/tech/application', 'www.bilibili.com/v/tech/computer_tech', 'www.bilibili.com/v/tech/industry', 'www.bilibili.com/v/tech', 'www.bilibili.com/v/information/hotspot', 'www.bilibili.com/v/information/global', 'www.bilibili.com/v/information/social', 'www.bilibili.com/v/information/multiple', 'www.bilibili.com/v/information', 'www.bilibili.com/v/food/make', 'www.bilibili.com/v/food/detective', 'www.bilibili.com/v/food/measurement', 'www.bilibili.com/v/food/rural', 'www.bilibili.com/v/food/record', 'www.bilibili.com/v/food', 'www.bilibili.com/v/life/funny', 'www.bilibili.com/v/life/parenting', 'www.bilibili.com/v/life/travel', 'www.bilibili.com/v/life/rurallife', 'www.bilibili.com/v/life/home', 'www.bilibili.com/v/life/handmake', 'www.bilibili.com/v/life/painting', 'www.bilibili.com/v/life/daily', 'www.bilibili.com/v/life', 'www.bilibili.com/v/car/racing', 'www.bilibili.com/v/car/modifiedvehicle', 'www.bilibili.com/v/car/newenergyvehicle', 'www.bilibili.com/v/car/touringcar', 'www.bilibili.com/v/car/motorcycle', 'www.bilibili.com/v/car/strategy', 'www.bilibili.com/v/car/life', 'www.bilibili.com/v/car', 'www.bilibili.com/v/fashion/makeup', 'www.bilibili.com/v/fashion/cos', 'www.bilibili.com/v/fashion/clothing', 'www.bilibili.com/v/fashion/trend', 'www.bilibili.com/v/fashion', 'www.bilibili.com/v/sports/basketball', 'www.bilibili.com/v/sports/football', 'www.bilibili.com/v/sports/aerobics', 'www.bilibili.com/v/sports/athletic', 'www.bilibili.com/v/sports/culture', 'www.bilibili.com/v/sports/comprehensive', 'www.bilibili.com/v/sports', 'www.bilibili.com/v/animal/cat', 'www.bilibili.com/v/animal/dog', 'www.bilibili.com/v/animal/reptiles', 'www.bilibili.com/v/animal/wild_animal', 'www.bilibili.com/v/animal/second_edition', 'www.bilibili.com/v/animal/animal_composite', 'www.bilibili.com/v/animal', 'www.bilibili.com/v/life/funny', 'www.bilibili.com/v/game/stand_alone' }; + array tids = { 33, 32, 51, 152, 13, 23, 153, 168, 169, 195, 170, 167, 11, 177, 24, 25, 47, 210, 86, 253, 27, 1, 17, 171, 172, 65, 173, 121, 136, 19, 4, 22, 26, 126, 216, 127, 119, 28, 31, 59, 30, 29, 193, 243, 244, 130, 3, 20, 198, 199, 200, 154, 156, 129, 182, 183, 85, 184, 181, 71, 241, 242, 137, 5, 201, 124, 228, 207, 208, 209, 229, 122, 36, 95, 230, 231, 232, 188, 203, 204, 205, 206, 202, 76, 212, 213, 214, 215, 211, 138, 254, 250, 251, 239, 161, 162, 21, 160, 245, 246, 246, 248, 240, 227, 176, 223, 157, 252, 158, 159, 155, 235, 249, 164, 236, 237, 238, 234, 218, 219, 222, 221, 220, 75, 217, 138, 17 }; + // array names = { '连载动画', '完结动画', '资讯', '官方延伸', '番剧', '电影', '国产动画', '国产原创相关', '布袋戏', '动态漫·广播剧', '资讯', '国创', '电视剧', '纪录片', 'MAD·AMV', 'MMD·3D', '短片·手书·配音', '手办·模玩', '特摄', '动漫杂谈', '综合', '动画', '单机游戏', '电子竞技', '手机游戏', '网络游戏', '桌游棋牌', 'GMV', '音游', 'Mugen', '游戏', '鬼畜调教', '音MAD', '人力VOCALOID', '鬼畜剧场', '教程演示', '鬼畜', '原创音乐', '翻唱', '演奏', 'VOCALOID·UTAU', '音乐现场', 'MV', '乐评盘点', '音乐教学', '音乐综合', '音乐', '宅舞', '街舞', '明星舞蹈', '中国舞', '舞蹈综合', '舞蹈教程', '舞蹈', '影视杂谈', '影视剪辑', '小剧场', '预告·资讯', '影视', '综艺', '娱乐杂谈', '粉丝创作', '明星综合', '娱乐', '科学科普', '社科·法律·心理', '人 文历史', '财经商业', '校园学习', '职业职场', '设计·创意', '野生技能协会', '知识', '数码', '软件应用', '计算机技术', '科 工机械', '科技', '热点', '环球', '社会', '综合', '资讯', '美食制作', '美食侦探', '美食测评', '田园美食', '美食记录', '美食', '搞笑', '亲子', '出行', '三农', '家居房产', '手工', '绘画', '日常', '生活', '赛车', '改装玩车', '新能源车', '房车', '摩托车', '购车攻略', '汽车生活', '汽车', '美妆护肤', '仿妆cos', '穿搭', '时尚潮流', '时尚', '篮球', '足球', '健身', ' 竞技体育', '运动文化', '运动综合', '运动', '喵星人', '汪星人', '小宠异宠', '野生动物', '动物二创', '动物综合', '动物圈', '搞笑', '单机游戏' }; + for (uint i = 0; i < urls.size(); i++) { + if (path.find(urls[i]) >= 0) { + return tids[i]; } - - finalTimes.insertLast(filteredTimes[i]); - finalTitles.insertLast(filteredTitles[i]); } + return 0; +} - for (int i = 0; i < finalTimes.size(); i++) { - dictionary chapterItem; - - chapterItem["title"] = finalTitles[i]; - chapterItem["time"] = formatFloat(finalTimes[i] * 1000, "", 32, 0); - chapter.insertLast(chapterItem); +int parseTime(string s) { + array strs = s.split(":"); + int t = 0; + if (strs.length() == 1) { + t = parseInt(strs[0]) * 1000; + } else if (strs.length() == 2) { + t = (parseInt(strs[0]) * 60 + parseInt(strs[1])) * 1000; + } else if (strs.length() == 3) { + t = (parseInt(strs[0]) * 3600 + parseInt(strs[1]) * 60 + parseInt(strs[2])) * 1000; } - - return chapter; + return t; } -string getMixinKey() { - JsonReader Reader; - JsonValue Root; - string key = ""; - string res = apiPost("/x/web-interface/nav"); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].isInt()) { - JsonValue wbi_img = Root["data"]["wbi_img"]; - string img_url = wbi_img["img_url"].asString(); - string sub_url = wbi_img["sub_url"].asString(); - array parts = img_url.split("/"); - string img_value = parts[parts.length() - 1].split(".")[0]; - parts = sub_url.split("/"); - string sub_value = parts[parts.length() - 1].split(".")[0]; - string ae = img_value + sub_value; - array oe = {46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, 36, 20, 34, 44, 52}; - for (uint i = 0; i < oe.length(); i++) { - key += ae.substr(oe[i], 1); - } - } - } - if (key.empty()) { - return key; - } - return key.substr(0,32); +string md2ss(string mdid) { + JsonReader Reader; + JsonValue Root; + string ssid = ""; + string res = apiPost("/pgc/review/user?media_id=" + mdid); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + ssid = Root["result"]["media"]["season_id"].asString(); + } + } + return ssid; } -string encWbi(string params) { - if (mixin_key.empty()) { - mixin_key = getMixinKey(); - } - array lst = params.split("&"); - lst.sortAsc(); - string newParams; - for (uint i = 0; i < lst.length(); i++) - { - newParams += lst[i]; - if (i != lst.length() - 1) - newParams += "&"; - } - return HostHashMD5(newParams + mixin_key); -} - -uint gettid(string path) { - array urls = { 'www.bilibili.com/v/anime/serial', 'www.bilibili.com/v/anime/finish', 'www.bilibili.com/v/anime/information', 'www.bilibili.com/v/anime/offical', 'www.bilibili.com/anime', 'www.bilibili.com/movie', 'www.bilibili.com/v/guochuang/chinese', 'www.bilibili.com/v/guochuang/original', 'www.bilibili.com/v/guochuang/puppetry', 'www.bilibili.com/v/guochuang/motioncomic', 'www.bilibili.com/v/guochuang/information', 'www.bilibili.com/guochuang', 'www.bilibili.com/tv', 'www.bilibili.com/documentary', 'www.bilibili.com/v/douga/mad', 'www.bilibili.com/v/douga/mmd', 'www.bilibili.com/v/douga/voice', 'www.bilibili.com/v/douga/garage_kit', 'www.bilibili.com/v/douga/tokusatsu', 'www.bilibili.com/v/douga/acgntalks', 'www.bilibili.com/v/douga/other', 'www.bilibili.com/v/douga', 'www.bilibili.com/v/game/stand_alone', 'www.bilibili.com/v/game/esports', 'www.bilibili.com/v/game/mobile', 'www.bilibili.com/v/game/online', 'www.bilibili.com/v/game/board', 'www.bilibili.com/v/game/gmv', 'www.bilibili.com/v/game/music', 'www.bilibili.com/v/game/mugen', 'www.bilibili.com/v/game', 'www.bilibili.com/v/kichiku/guide', 'www.bilibili.com/v/kichiku/mad', 'www.bilibili.com/v/kichiku/manual_vocaloid', 'www.bilibili.com/v/kichiku/theatre', 'www.bilibili.com/v/kichiku/course', 'www.bilibili.com/v/kichiku', 'www.bilibili.com/v/music/original', 'www.bilibili.com/v/music/cover', 'www.bilibili.com/v/music/perform', 'www.bilibili.com/v/music/vocaloid', 'www.bilibili.com/v/music/live', 'www.bilibili.com/v/music/mv', 'www.bilibili.com/v/music/commentary', 'www.bilibili.com/v/music/tutorial', 'www.bilibili.com/v/music/other', 'www.bilibili.com/v/music', 'www.bilibili.com/v/dance/otaku', 'www.bilibili.com/v/dance/hiphop', 'www.bilibili.com/v/dance/star', 'www.bilibili.com/v/dance/china', 'www.bilibili.com/v/dance/three_d', 'www.bilibili.com/v/dance/demo', 'www.bilibili.com/v/dance', 'www.bilibili.com/v/cinephile/cinecism', 'www.bilibili.com/v/cinephile/montage', 'www.bilibili.com/v/cinephile/shortfilm', 'www.bilibili.com/v/cinephile/trailer_info', 'www.bilibili.com/v/cinephile', 'www.bilibili.com/v/ent/variety', 'www.bilibili.com/v/ent/talker', 'www.bilibili.com/v/ent/fans', 'www.bilibili.com/v/ent/celebrity', 'www.bilibili.com/v/ent', 'www.bilibili.com/v/knowledge/science', 'www.bilibili.com/v/knowledge/social_science', 'www.bilibili.com/v/knowledge/humanity_history', 'www.bilibili.com/v/knowledge/business', 'www.bilibili.com/v/knowledge/campus', 'www.bilibili.com/v/knowledge/career', 'www.bilibili.com/v/knowledge/design', 'www.bilibili.com/v/knowledge/skill', 'www.bilibili.com/v/knowledge', 'www.bilibili.com/v/tech/digital', 'www.bilibili.com/v/tech/application', 'www.bilibili.com/v/tech/computer_tech', 'www.bilibili.com/v/tech/industry', 'www.bilibili.com/v/tech', 'www.bilibili.com/v/information/hotspot', 'www.bilibili.com/v/information/global', 'www.bilibili.com/v/information/social', 'www.bilibili.com/v/information/multiple', 'www.bilibili.com/v/information', 'www.bilibili.com/v/food/make', 'www.bilibili.com/v/food/detective', 'www.bilibili.com/v/food/measurement', 'www.bilibili.com/v/food/rural', 'www.bilibili.com/v/food/record', 'www.bilibili.com/v/food', 'www.bilibili.com/v/life/funny', 'www.bilibili.com/v/life/parenting', 'www.bilibili.com/v/life/travel', 'www.bilibili.com/v/life/rurallife', 'www.bilibili.com/v/life/home', 'www.bilibili.com/v/life/handmake', 'www.bilibili.com/v/life/painting', 'www.bilibili.com/v/life/daily', 'www.bilibili.com/v/life', 'www.bilibili.com/v/car/racing', 'www.bilibili.com/v/car/modifiedvehicle', 'www.bilibili.com/v/car/newenergyvehicle', 'www.bilibili.com/v/car/touringcar', 'www.bilibili.com/v/car/motorcycle', 'www.bilibili.com/v/car/strategy', 'www.bilibili.com/v/car/life', 'www.bilibili.com/v/car', 'www.bilibili.com/v/fashion/makeup', 'www.bilibili.com/v/fashion/cos', 'www.bilibili.com/v/fashion/clothing', 'www.bilibili.com/v/fashion/trend', 'www.bilibili.com/v/fashion', 'www.bilibili.com/v/sports/basketball', 'www.bilibili.com/v/sports/football', 'www.bilibili.com/v/sports/aerobics', 'www.bilibili.com/v/sports/athletic', 'www.bilibili.com/v/sports/culture', 'www.bilibili.com/v/sports/comprehensive', 'www.bilibili.com/v/sports', 'www.bilibili.com/v/animal/cat', 'www.bilibili.com/v/animal/dog', 'www.bilibili.com/v/animal/reptiles', 'www.bilibili.com/v/animal/wild_animal', 'www.bilibili.com/v/animal/second_edition', 'www.bilibili.com/v/animal/animal_composite', 'www.bilibili.com/v/animal', 'www.bilibili.com/v/life/funny', 'www.bilibili.com/v/game/stand_alone' }; - array tids = { 33, 32, 51, 152, 13, 23, 153, 168, 169, 195, 170, 167, 11, 177, 24, 25, 47, 210, 86, 253, 27, 1, 17, 171, 172, 65, 173, 121, 136, 19, 4, 22, 26, 126, 216, 127, 119, 28, 31, 59, 30, 29, 193, 243, 244, 130, 3, 20, 198, 199, 200, 154, 156, 129, 182, 183, 85, 184, 181, 71, 241, 242, 137, 5, 201, 124, 228, 207, 208, 209, 229, 122, 36, 95, 230, 231, 232, 188, 203, 204, 205, 206, 202, 76, 212, 213, 214, 215, 211, 138, 254, 250, 251, 239, 161, 162, 21, 160, 245, 246, 246, 248, 240, 227, 176, 223, 157, 252, 158, 159, 155, 235, 249, 164, 236, 237, 238, 234, 218, 219, 222, 221, 220, 75, 217, 138, 17 }; - // array names = { '连载动画', '完结动画', '资讯', '官方延伸', '番剧', '电影', '国产动画', '国产原创相关', '布袋戏', '动态漫·广播剧', '资讯', '国创', '电视剧', '纪录片', 'MAD·AMV', 'MMD·3D', '短片·手书·配音', '手办·模玩', '特摄', '动漫杂谈', '综合', '动画', '单机游戏', '电子竞技', '手机游戏', '网络游戏', '桌游棋牌', 'GMV', '音游', 'Mugen', '游戏', '鬼畜调教', '音MAD', '人力VOCALOID', '鬼畜剧场', '教程演示', '鬼畜', '原创音乐', '翻唱', '演奏', 'VOCALOID·UTAU', '音乐现场', 'MV', '乐评盘点', '音乐教学', '音乐综合', '音乐', '宅舞', '街舞', '明星舞蹈', '中国舞', '舞蹈综合', '舞蹈教程', '舞蹈', '影视杂谈', '影视剪辑', '小剧场', '预告·资讯', '影视', '综艺', '娱乐杂谈', '粉丝创作', '明星综合', '娱乐', '科学科普', '社科·法律·心理', '人 文历史', '财经商业', '校园学习', '职业职场', '设计·创意', '野生技能协会', '知识', '数码', '软件应用', '计算机技术', '科 工机械', '科技', '热点', '环球', '社会', '综合', '资讯', '美食制作', '美食侦探', '美食测评', '田园美食', '美食记录', '美食', '搞笑', '亲子', '出行', '三农', '家居房产', '手工', '绘画', '日常', '生活', '赛车', '改装玩车', '新能源车', '房车', '摩托车', '购车攻略', '汽车生活', '汽车', '美妆护肤', '仿妆cos', '穿搭', '时尚潮流', '时尚', '篮球', '足球', '健身', ' 竞技体育', '运动文化', '运动综合', '运动', '喵星人', '汪星人', '小宠异宠', '野生动物', '动物二创', '动物综合', '动物圈', '搞笑', '单机游戏' }; - for (uint i = 0; i < urls.size(); i++) { - if (path.find(urls[i]) >= 0) { - return tids[i]; +int getVideoItag(int id, int codecid) { + array> videoItagMap = { + //240P + {6, 7, 133}, + {6, 12, 133}, + {6, 13, 395}, + // 360P + {16, 7, 134}, + {16, 12, 134}, + {16, 13, 396}, + // 480P + {32, 7, 135}, + {32, 12, 135}, + {32, 13, 397}, + // 720P + {64, 7, 136}, + {64, 12, 136}, + {64, 13, 398}, + // 720P60 + {74, 7, 298}, + {74, 12, 298}, + {74, 13, 398}, + // 1080P + {80, 7, 137}, + {80, 12, 137}, + {80, 13, 399}, + // 1080P+ + {112, 7, 137}, + {112, 12, 137}, + {112, 13, 399}, + // 1080P60 + {116, 7, 299}, + {116, 12, 299}, + {116, 13, 399}, + // 4K + {120, 7, 266}, + {120, 12, 266}, + {120, 13, 401}, + // HDR + {125, 7, 337}, + {125, 12, 337}, + {125, 13, 701}, + // 杜比视界 + {126, 7, 337}, + {126, 12, 337}, + {126, 13, 701}, + // 8K + {127, 7, 571}, + {127, 12, 571}, + {127, 13, 571}, + // HDR Vivid + {129, 7, 337}, + {129, 12, 337}, + {129, 13, 701} + }; + + for (int i = 0; i < videoItagMap.size(); i++) { + if (videoItagMap[i][0] == id && videoItagMap[i][1] == codecid) { + return videoItagMap[i][2]; } } - return 0; -} -string makeWebUrl(string path) { - array strs = path.split("?"); - if (strs.length() <= 1) { - return path; - } - return strs[0]; + return 0; } -array UGCSeason(const string &in path) { - array videos; - - string bvid = parseBVId(path); - string aid = parseAVId(path); - string params; - if (!bvid.empty()) params += "bvid=" + bvid; - if (!aid.empty()) params += "aid=" + aid; - if (bvid.empty() && aid.empty()) return videos; - - string res = apiPost("/x/web-interface/wbi/view/detail?" + params + "&w_rid=" + encWbi(params)); - - JsonReader Reader; - JsonValue Root; - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - if(!Root["data"]["View"].isObject()) { - log('Root["data"]["View"] is empty.'); - return videos; - } - - JsonValue sections = Root["data"]["View"]["ugc_season"]["sections"]; - if (sections.isArray()) { - string title; - for (int j = 0; j < sections.size(); j++) { - if (sections.size() > 1) title = "【" + sections[j]["title"].asString() + "】"; - JsonValue episodes = sections[j]["episodes"]; - for (int i = 0; i < episodes.size(); i++) { - JsonValue item = episodes[i]; - if (item.isObject()) { - dictionary video; - video["title"] = title + item["title"].asString(); - video["duration"] = item["arc"]["duration"].asInt() * 1000; - video["thumbnail"] = item["arc"]["pic"].asString(); - video["author"] = item["arc"]["author"]["name"].asString(); - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); - video["viewCount"] = item["arc"]["stat"]["view"].asString(); - video["likeCount"] = item["arc"]["stat"]["like"].asString(); - video["dislikeCount"] = item["arc"]["stat"]["dislike"].asString(); - video["date"] = UnixTimeToDate(item["arc"]["pubdate"].asInt()); - video["resolution"] = item["arc"]["dimension"]["width"].asInt() + "x" + item["arc"]["dimension"]["height"].asInt(); - if (item["bvid"].asString() == bvid || item["aid"].asString() == aid) video["current"] = "1"; - video["referer"] = "https://www.bilibili.com/video/" + Root["data"]["View"]["bvid"].asString(); - videos.insertLast(video); - } else { - log("item is empty"); - } - } - } - } else { - log('Root["data"]["View"]["ugc_season"]["sections"] is not array.'); - } - } else { - log("Video view API code != 0", Root["code"].asInt()); - log("Video view API message", Root["message"].asString()); - } - } else { - log("res parse failed or Root is empty."); - } - - return videos; +int getAudioItag(int id) { + // 增加 EC-3/E-AC3 和 flac 的 itag 映射,flac 没有对应的 itag,使用 AC3 替代 + array ids = { 30251, 30250, 30280, 30232, 30216 }; + array itags = { 258, 328, 327, 256, 139 }; + int idx = ids.find(id); + if (idx >= 0) { + return itags[idx]; + } + return id; } -array RelatedVideos(const string &in path) { - array videos; - - string bvid = parseBVId(path); - string aid = parseAVId(path); - string params; - if (!bvid.empty()) params += "bvid=" + bvid; - if (!aid.empty()) params += "aid=" + aid; - if (bvid.empty() && aid.empty()) return videos; - - string res = apiPost("/x/web-interface/wbi/view/detail?" + params + "&w_rid=" + encWbi(params)); - - JsonReader Reader; - JsonValue Root; - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - if(!Root["data"]["View"].isObject()) { - log('Root["data"]["View"] is empty.'); - return videos; - } - - JsonValue view = Root["data"]["View"]; - - dictionary video; - video["title"] = view["title"].asString(); - video["duration"] = view["duration"].asInt() * 1000; - video["thumbnail"] = view["pic"].asString(); - video["author"] = view["owner"]["name"].asString(); - video["url"] = "https://www.bilibili.com/video/" + bvid; - if (!view["desc"].asString().empty() || view["desc"].asString() != "-") video["content"] = view["desc"].asString(); - video["viewCount"] = view["stat"]["view"].asString(); - video["likeCount"] = view["stat"]["like"].asString(); - video["dislikeCount"] = view["stat"]["dislike"].asString(); - video["date"] = UnixTimeToDate(view["pubdate"].asInt()); - video["resolution"] = view["dimension"]["width"].asInt() + "x" + view["dimension"]["height"].asInt(); - video["current"] = "1"; - video["referer"] = "https://www.bilibili.com/video/" + view["bvid"].asString(); - videos.insertLast(video); - - if (!ConfigData.showRecommendedVideos) return videos; - - JsonValue related = Root["data"]["Related"]; - if (related.isArray()) { - for (int i = 0; i < related.size(); i++) { - JsonValue item = related[i]; - if (item.isObject()) { - dictionary video; - video["title"] = item["title"].asString(); - video["duration"] = item["duration"].asInt() * 1000; - video["thumbnail"] = item["pic"].asString(); - video["author"] = item["owner"]["name"].asString(); - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); - if (!item["desc"].asString().empty() || item["desc"].asString() != "-") video["content"] = item["desc"].asString(); - video["viewCount"] = item["stat"]["view"].asString(); - video["likeCount"] = item["stat"]["like"].asString(); - video["dislikeCount"] = item["stat"]["dislike"].asString(); - video["date"] = UnixTimeToDate(item["pubdate"].asInt()); - video["resolution"] = item["dimension"]["width"].asInt() + "x" + item["dimension"]["height"].asInt(); - video["referer"] = "https://www.bilibili.com/video/" + view["bvid"].asString(); - videos.insertLast(video); - } else { - log("item is not exists."); - } - } - } else { - log("no related videos"); - } - } else { - log("Video view API code != 0", Root["code"].asInt()); - log("Video view API message", Root["message"].asString()); - } - } else { - log("res parse failed or Root is empty."); - } - - return videos; +uint getUniItag() { + uint itag = 1; + while (HostExistITag(itag)) itag++; + HostSetITag(itag); + return itag; } -dictionary AppendAudioQualityList(JsonValue audio, string bvid) { - QualityListItem item; - string format; - - int itag = 0; - int audioid = audio["id"].asInt(); - item.itag = getAudioItag(audioid); - item.url = getFixedURL(audio); - - bool audioIsDefault = false; - if (audioid == 30250) { - item.quality = "杜比全景声"; - } else if (audioid == 30251) { - item.quality = "Hi-Res无损"; - audioIsDefault = true; - } else if (audio["codecs"].asString().MakeLower().find("mp4a") >= 0) { - item.quality = "AAC"; - } - item.qualityDetail = item.quality; - item.audioIsDefault = audioIsDefault; - - int bitrateVal = audio["bandwidth"].asInt(); - string bitrate = HostFormatBitrate(bitrateVal) + "bps"; - item.bitrateVal = bitrateVal; - item.bitrate = bitrate; - - string codec = audio["codecs"].asString().MakeLower(); - string mimeType = audio["mimeType"].asString().MakeLower(); - item.format = mimeType.substr(mimeType.findLast("/") + 1) + ", " + codec.substr(0, codec.find(".")) + ", " + bitrate; - - item.resolution = "audio only"; - item.va = "a"; - item.referer = "https://www.bilibili.com/video/" + bvid; - - return item.toDictionary(); +string getCodec(int codecid) { + array codecids = { 7, 12, 13 }; + array codec = { "avc", "hevc", "av1" }; + int idx = codecids.find(codecid); + if (idx >= 0) { + return codec[idx]; + } + return "未知"; } -JsonValue SortVideos(JsonValue &videos) { - array VideoIdOrder; - if (ConfigData.preferHDR) { - VideoIdOrder = {6, 16, 32, 64, 74, 80, 100, 112, 116, 120, 127, 125, 126, 129}; - } else { - VideoIdOrder = {6, 16, 32, 64, 74, 80, 100, 112, 116, 120, 125, 126, 127, 129}; - } - - JsonReader reader; - JsonValue sortedVideos; - reader.parse("[]", sortedVideos); - - array used(videos.size(), false); - - for (uint i = 0; i < videos.size(); i++) { - int minIndex = -1; - int minOrder; - - for (uint j = 0; j < videos.size(); j++) { - if (used[j]) continue; - - int codecid = videos[j]["codecid"].asInt(); +string GetM3u8RealURL(string url) { + string resp = post(url, "", "", false); + array lines = resp.split("\n"); - if (ConfigData.disableAVC && codecid == 7) continue; + for (uint i = 0; i < lines.size(); i++) { + string line = lines[i].Trim(); - int order = VideoIdOrder.length(); - int id = videos[j]["id"].asInt(); + if (line.find("#EXT-X-STREAM-INF:") == 0) { + if (i + 1 < lines.size()) { + string m3u8 = lines[i + 1].Trim(); - for (uint k = 0; k < VideoIdOrder.length(); k++) { - if (VideoIdOrder[k] == id) { - order = int(k); - break; + if (m3u8.find("http://") == 0 || m3u8.find("https://") == 0) { + return m3u8; } } - - if (minIndex == -1 || order < minOrder) { - minIndex = int(j); - minOrder = order; - } else if (order == minOrder && codecid < videos[minIndex]["codecid"].asInt()) { - minIndex = int(j); - } } - - if (minIndex == -1) break; - - sortedVideos[i] = videos[minIndex]; - used[minIndex] = true; } - return sortedVideos; + return url; } -string Video(string id, const string &in path, dictionary &MetaData, array &QualityList) { - log("==============================video============================="); - string res; - string bvid; - string aid; - string cid; - string title; - string url; - string params; - JsonReader reader; - JsonValue root; - int qn = 127; - array subtitle; - - if (id.find("BV") == 0) { - bvid = id; - params += "bvid=" + id; - } - if (id.find("av") == 0) { - aid = id; - params += "aid=" + id; - } - res = apiPost("/x/web-interface/wbi/view/detail?" + params + "&w_rid=" + encWbi(params)); - - if (reader.parse(res, root) && root.isObject()) { - if (root["code"].asInt() == 0) { - JsonValue data = root["data"]["View"]; - aid = data["aid"].asString(); - bvid = data["bvid"].asString(); - aid = data["aid"].asString(); - cid = data["cid"].asString(); - title = data["title"].asString(); - - if (@MetaData !is null) { - MetaData["title"] = title; - MetaData["duration"] = data["duration"].asInt() * 1000; - MetaData["thumbnail"] = data["pic"].asString(); - MetaData["author"] = data["owner"]["name"].asString(); - MetaData["content"] = data["desc"].asString(); - MetaData["webUrl"] = "https://www.bilibili.com/video/" + data["bvid"].asString(); - MetaData["viewCount"] = data["stat"]["view"].asString(); - MetaData["likeCount"] = data["stat"]["like"].asString(); - MetaData["dislikeCount"] = data["stat"]["dislike"].asString(); - MetaData["date"] = UnixTimeToDate(data["pubdate"].asInt()); - MetaData["resolution"] = data["dimension"]["width"].asInt() + "x" + data["dimension"]["height"].asInt(); - } - - if (ConfigData.enableSponsorBlock) { - status = 5; - array chapter = generateChapter(bvid); - if (!chapter.empty() && (@QualityList !is null)) MetaData["chapter"] = chapter; - status = 4; - } - if (ConfigData.danmakuEnable) { - dictionary dic; - dic["name"] = "【弹幕】" + title; - dic["url"] = ConfigData.danmakuUrl + cid; - subtitle.insertLast(dic); - } - if (!subtitle.empty()) { - MetaData["subtitle"] = subtitle; - } - } else { - log("Video view API code != 0", root["code"].asInt()); - log("Video view API message", root["message"].asString()); - return url; - } - } - - status = 6; - - params = "bvid=" + bvid + "&avid=" + aid + "&cid=" + cid + "&qn=" + qn + "&fnval=4048&fourk=1"; - res = apiPost("/x/player/wbi/playurl?" + params + "&w_rid=" + encWbi(params)); - if (reader.parse(res, root) && root.isObject()) { - if (root["code"].asInt() == 0) { - JsonValue data = root["data"]; - - if (data["dash"].isObject()) { - int itag = 0; - JsonValue videos = data["dash"]["video"]; - videos = SortVideos(videos); - - for (int i = 0; i < videos.size(); i++) { - if (@QualityList !is null) { - JsonValue video = videos[i]; - QualityListItem item; - - int quality = video["id"].asInt(); - int codecid = video["codecid"].asInt(); - url = getFixedURL(video); - item.url = url; - - itag = getVideoItag(quality, codecid); - if (itag <= 0 || HostExistITag(itag)) { - itag = HostGetITag(video["height"].asInt(), 0, true, false); - if (itag <= 0) itag = HostGetITag(video["height"].asInt(), 0, true, true); - } - while (HostExistITag(itag)) itag++; - HostSetITag(itag); - item.itag = itag; - - item.quality = getVideoquality(data["support_formats"], quality); - item.qualityDetail = item.quality; - item.resolution = formatInt(video["width"].asInt()) + "x" + formatInt(video["height"].asInt()); - item.isHDR = (quality == 125 || quality == 126 || quality == 129); - - int bitrateVal = video["bandwidth"].asInt(); - string bitrate = HostFormatBitrate(bitrateVal) + "bps"; - item.bitrateVal = bitrateVal; - item.bitrate = bitrate; - item.fps = parseInt(video["frameRate"].asString()); - - string mimeType = video["mimeType"].asString().MakeLower(); - item.format = mimeType.substr(mimeType.findLast("/") + 1) + ", " + getCodec(codecid) + ", " + bitrate; - - item.audioIsDefault = false; - item.va = "v"; - item.referer = "https://www.bilibili.com/video/" + bvid; - - if (i == videos.size() - 1) item.videoIsDefault = true; - - if (@QualityList !is null) QualityList.insertLast(item.toDictionary()); - } - } - - JsonValue audios; - JsonValue audio; - if (data["dash"]["audio"].isArray()) { - audios = data["dash"]["audio"]; - for (int i = 0; i < audios.size(); i++) { - audio = audios[i]; - if (@QualityList !is null) QualityList.insertLast(AppendAudioQualityList(audio, bvid)); - } - } - if (data["dash"]["dolby"]["audio"].isArray()){ - audios = data["dash"]["dolby"]["audio"]; - for (int i = 0; i < audios.size(); i++) { - audio = audios[i]; - if (@QualityList !is null) QualityList.insertLast(AppendAudioQualityList(audio, bvid)); - } - } - if (data["dash"]["flac"].isObject()){ - audio = data["dash"]["flac"]["audio"]; - if (@QualityList !is null) QualityList.insertLast(AppendAudioQualityList(audio, bvid)); - } - } - } else { - log("Video playurl response code != 0", root["code"].asInt()); - log("Video playurl response message", root["message"].asString()); - return url; - } - } - - log("bvid: " + bvid + " aid: " + aid + " cid: " + cid); - log("url", url); - // for (uint i = 0; i < QualityList.length(); i++) { - // log("QualityList[" + i + "] = " + string(QualityList[i]["quality"]) + " | " + int(QualityList[i]["itag"]) + " | " + string(QualityList[i]["url"])); - // } - return url; -} +bool isPlaylist(const string&in path) { + string bvid = parseBVId(path); + string aid = parseAVId(path); + string params; + if (!bvid.empty()) params += "bvid=" + bvid; + if (!aid.empty()) params += "aid=" + aid; + if (bvid.empty() && aid.empty()) return false; -array watchlater() { - array videos; - string res = apiPost("/x/v2/history/toview"); - JsonReader Reader; - JsonValue Root; - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue data = Root["data"]["list"]; - if (data.isArray()) { - for (int i = 0; i < data.size(); i++) { - JsonValue item = data[i]; - if (item.isObject()) { - dictionary video; - int p = item["page"]["page"].asInt(); - if (p == 1) { - video["title"] = item["title"].asString(); - } else { - video["title"] = item["title"].asString() + " | " + item["page"]["part"].asString(); - } - video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?p=" + p; - video["thumbnail"] = item["pic"].asString(); - video["author"] = item["owner"]["name"].asString(); - videos.insertLast(video); - } - } - } - } - } - return videos; -} + string res = apiPost("/x/web-interface/wbi/view/detail?" + encWbi(params)); -array History() { - array videos; - uint max = 0; - uint ps = 20; - string res = apiPost("/x/web-interface/history/cursor?max=" + max + "&ps=" + ps); - JsonReader Reader; - JsonValue Root; - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue data = Root["data"]["list"]; - if (data.isArray()) { - for (int i = 0; i < data.size(); i++) { - JsonValue item = data[i]; - string type = item["history"]["business"].asString(); - // archive live pgc - if (type == "archive" || type == "live") { - if (item.isObject()) { - dictionary video; - video["thumbnail"] = item["cover"].asString(); - video["author"] = item["author_name"].asString(); - if (type == "live") { - if (item["live_status"].asInt() != 1) { - continue; - } - video["title"] = "直播 | " + item["title"].asString(); - video["url"] = item["uri"].asString(); - } else if (type == "archive") { - int p = item["history"]["page"].asInt(); - if (p == 1) { - video["title"] = item["title"].asString(); - } else { - video["title"] = item["title"].asString() + " | " + item["history"]["part"].asString(); - } - video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["history"]["bvid"].asString() + "?p=" + p; - } else { - continue; - } - videos.insertLast(video); - } - } - } - } - } - } - return videos; + JsonReader Reader; + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue redirect_url = Root["data"]["View"]["redirect_url"]; + if (redirect_url.isString() && redirect_url.asString().find("bangumi/play/ep") >= 0) { + videoIsUGCorPGC.isPGC = true; + videoIsUGCorPGC.pgcURL = redirect_url.asString(); + return true; + } + if (Root["data"]["View"]["ugc_season"].isObject()) { + videoIsUGCorPGC.isUGCSeason = true; + return true; + } + } else { + log("Video view API code != 0", Root["code"].asInt()); + log("Video view API message", Root["message"].asString()); + } + } + return false; } -bool isP2PCDN(const string &in url) { - if (parse(url, "os") == "mcdn") - return true; +bool isP2PCDN(const string&in url) { + if (parse(url, "os") == "mcdn") return true; - array parts = url.split("://"); - string hostname = parts.length() > 1 ? parts[1] : parts[0]; + array parts = url.split("://"); + string hostname = parts.length() > 1 ? parts[1] : parts[0]; - int pos = hostname.findFirst("/"); - if (pos >= 0) - hostname = hostname.substr(0, pos); + int pos = hostname.findFirst("/"); + if (pos >= 0) + hostname = hostname.substr(0, pos); - pos = hostname.findFirst("?"); - if (pos >= 0) - hostname = hostname.substr(0, pos); + pos = hostname.findFirst("?"); + if (pos >= 0) + hostname = hostname.substr(0, pos); - pos = hostname.findFirst("#"); - if (pos >= 0) - hostname = hostname.substr(0, pos); + pos = hostname.findFirst("#"); + if (pos >= 0) + hostname = hostname.substr(0, pos); - pos = hostname.findFirst(":"); - if (pos >= 0) - hostname = hostname.substr(0, pos); + pos = hostname.findFirst(":"); + if (pos >= 0) + hostname = hostname.substr(0, pos); - for (uint i = 0; i < knownP2pCdnDomainPattern.length(); i++) { - if (hostname.find(knownP2pCdnDomainPattern[i]) >= 0) { - return true; - } - } + for (uint i = 0; i < knownP2pCdnDomainPattern.length(); i++) { + if (hostname.find(knownP2pCdnDomainPattern[i]) >= 0) { + return true; + } + } - string subdomain = hostname.split(".")[0]; - return subdomain.find("302") >= 0; + string subdomain = hostname.split(".")[0]; + return subdomain.find("302") >= 0; } -string getFixedURL(JsonValue &in data) { +string getFixedURL(JsonValue&in data) { string baseUrl = data["baseUrl"].asString(); if (!ConfigData.blockP2PCDN) { @@ -1167,1502 +785,2346 @@ string getFixedURL(JsonValue &in data) { return baseUrl; } -string parse(string url, string key, string defaultValue="") { - string value = HostRegExpParse(url, "\\?" + key + "=([^&]+)"); - if (!value.empty()) { - return value; - } - value = HostRegExpParse(url, "&" + key + "=([^&]+)"); - if (!value.empty()) { - return value; - } +string getLiveQuality(JsonValue g_qn_desc, int qn, int hdr_type, JsonValue video_color_info) { + int etof = 0; + if (video_color_info.isObject() && video_color_info["eotf"].isNumeric()) { + etof = video_color_info["eotf"].asInt(); + } - value = defaultValue; - return value; -} + if (!g_qn_desc.isArray() || g_qn_desc.size() == 0) { + log("getLiveQualityNew: g_qn_desc is not an array or is empty"); + return "未匹配画质"; + } -string parseBVId(string url) { - return HostRegExpParse(url, "(BV[a-zA-Z0-9]+)"); -} + for (int i = 0; i < g_qn_desc.size(); i++) { + JsonValue item = g_qn_desc[i]; + if (!item.isObject()) { + log("getLiveQualityNew item is not object, index", i); + continue; + } -string parseAVId(string url) { - return HostRegExpParse(url, "av([0-9]+)"); -} + int item_qn = item["qn"].asInt(); + int item_hdr_type = item["hdr_type"].asInt(); + int item_etof = item["eotf"].asInt(); -int parseTime(string s) { - array strs = s.split(":"); - int t = 0; - if (strs.length() == 1) { - t = parseInt(strs[0]) * 1000; - } - else if (strs.length() == 2) { - t = (parseInt(strs[0])*60 + parseInt(strs[1]))*1000; - } else if (strs.length() == 3) { - t = (parseInt(strs[0])*3600 + parseInt(strs[1])*60 + parseInt(strs[2]))*1000; - } - return t; -} + if (item_qn != qn || item_hdr_type != hdr_type || item["eotf"].asInt() != etof) { + continue; + } -array Channel(string path) { - array videos; - int ps = 100; - int pn = 1; - string uid = HostRegExpParse(path, "/([0-9]+)/lists"); - string sid = HostRegExpParse(path, "lists/([0-9]+)"); - if (sid.empty()) { - return videos; - } - string baseurl; - string type = parse(path, "type", "season"); - bool isCollection = type == "season"; - if (isCollection) { - baseurl = "/x/polymer/web-space/seasons_archives_list?mid=" + uid + "&season_id=" + sid + "&sort_reverse=" + parse(path, "sort_reverse", "false") + "&page_size=" + ps; - } else { - baseurl = "/x/series/archives?mid=" + uid + "&series_id=" + sid + "&sort=desc" + "&ps=" + ps; - } - while (true){ - string url; - if (isCollection) { - url = baseurl + "&page_num=" + pn; - } else { - url = baseurl + "&pn=" + pn; - } - string res = apiPost(url); - JsonReader Reader; - JsonValue Root; - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue data = Root["data"]["archives"]; - if (data.isArray()) { - for (int i = 0; i < data.size(); i++) { - JsonValue item = data[i]; - if (item.isObject()) { - dictionary video; - video["title"] = item["title"].asString(); - video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); - video["thumbnail"] = item["pic"].asString(); - videos.insertLast(video); - } - } - } - JsonValue page = Root["data"]["page"]; - if (isCollection) { - if (page["page_num"].asInt() * page["page_size"].asInt() >= page["total"].asInt()) { - break; - } - } else { - if (page["num"].asInt() * page["size"].asInt() >= page["total"].asInt()) { - break; - } - } - pn += 1; - } else { - return videos; - } - } - } + string fallback_desc = item["desc"].asString(); + JsonValue media_base_desc = item["media_base_desc"]; + if (!media_base_desc.isObject()) { + log("getLiveQualityNew media_base_desc missing, fallback desc, qn=" + qn + ", hdr_type=" + hdr_type + ", etof=" + etof); + return fallback_desc; + } - return videos; -} + JsonValue detail_desc = media_base_desc["detail_desc"]; + if (!detail_desc.isObject()) { + log("getLiveQualityNew detail_desc missing, fallback desc, qn=" + qn + ", hdr_type=" + hdr_type + ", etof=" + etof); + return fallback_desc; + } -array spaceVideo(string path) { - array videos; - int ps = 50; - int page = parseInt(parse(path, "pn", "1")); - int pn = page; - string baseurl = "/x/space/wbi/arc/search?"; - string params1; - string params2; - params1 += "keyword=" + parse(path, "keyword"); - params1 += "&mid=" + HostRegExpParse(path, "/([0-9]+)"); - params1 += "&order=" + parse(path, "order", "pubdate"); - - params2 += "&ps=" + ps; - params2 += "&tid=" + parse(path, "tid", "0"); - while (true) { - if (pn - page >= 10) { - break; - } - string params = params1 + "&pn=" + pn + params2; - string w_rid = encWbi(params); - params += "&w_rid=" + w_rid; - - string url = baseurl + params; - string res = apiPost(url); - JsonReader Reader; - JsonValue Root; - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue data = Root["data"]["list"]["vlist"]; - if (data.isArray()) { - for (int i = 0; i < data.size(); i++) { - JsonValue item = data[i]; - if (item.isObject()) { - dictionary video; - video["title"] = item["title"].asString(); - video["duration"] = parseTime(item["length"].asString()); - video["thumbnail"] = item["pic"].asString(); - video["author"] = item["author"].asString(); - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); - if (!item["description"].asString().empty() || item["description"].asString() != "-") video["content"] = item["description"].asString(); - video["viewCount"] = item["play"].asString(); - video["date"] = UnixTimeToDate(item["created"].asInt()); - videos.insertLast(video); - } - } - } - JsonValue page = Root["data"]["page"]; - if (page["pn"].asInt() * page["ps"].asInt() >= page["count"].asInt()) { - break; - } - pn += 1; - } else { - return videos; - } - } - } - return videos; -} + string main_desc = detail_desc["desc"].asString(); + if (main_desc.empty()) { + log("getLiveQualityNew detail_desc desc empty, fallback desc, qn=" + qn + ", hdr_type=" + hdr_type + ", etof=" + etof); + return fallback_desc; + } -array spaceAudio(string path) { - array audios; - int ps = 50; - int pn = 1; - string baseurl = "/audio/music-service/web/song/upper?"; - baseurl += "uid=" + HostRegExpParse(path, "/([0-9]+)"); - baseurl += "&ps=" + ps; - baseurl += "&order=" + parse(path, "order", "1"); - while (true) { - string url = baseurl + "&pn=" + pn; - string res = apiPost(url); - JsonReader Reader; - JsonValue Root; - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue data = Root["data"]["data"]; - if (data.isArray()) { - for (int i = 0; i < data.size(); i++) { - JsonValue item = data[i]; - if (item.isObject()) { - dictionary audio; - audio["title"] = item["title"].asString(); - audio["duration"] = item["duration"].asInt() * 1000; - audio["url"] = "https://www.bilibili.com/audio/au" + item["id"].asString(); - audio["thumbnail"] = item["cover"].asString(); - audios.insertLast(audio); - } - } - } - if (Root["data"]["curPage"].asInt() >= Root["data"]["pageCount"].asInt()) { - break; - } - pn += 1; - } else { - return audios; - } - } - } - return audios; -} + JsonValue tags = detail_desc["tag"]; + if (!tags.isArray()) { + return main_desc; + } -string parseFid(string path) { - string fid = parse(path, "fid"); - if (fid.empty()) { - fid = parse(path, "searchFid"); - } - if (fid.empty()) { - fid = HostRegExpParse(path, "/medialist/detail/ml([0-9]+)"); - } - return fid; -} + string tag_text = ""; + for (int t = 0; t < tags.size(); t++) { + if (!tag_text.empty()) { + tag_text += " "; + } + tag_text += tags[t].asString(); + } -array FavList(string path) { - JsonReader Reader; - array videos; - string fid = parseFid(path); - if (fid.empty()) { - string mid = HostRegExpParse(path, "bilibili.com/([0-9]+)"); - if (mid.empty()) { - mid = "" + ConfigData.uid; - } - string res = apiPost("/x/v3/fav/folder/created/list-all?up_mid=" + mid); - JsonValue Root; - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue data = Root["data"]["list"]; - if (data.isArray()) { - fid = "" + data[0]["id"].asInt(); - } - } - } - } - if (fid.empty()) { - return videos; - } - int pn = 1; - int ps = 20; - string baseurl; - string url; - string ftype = parse(path, "ftype"); - // 订阅和收藏 - if (ftype == "collect") { - baseurl = "/x/space/fav/season/list?season_id=" + fid; - } else { - baseurl = "/x/v3/fav/resource/list?media_id=" + fid + "&ps=" + ps; - baseurl += "&keyword=" + parse(path, "keyword"); - baseurl += "&order=" + parse(path, "order", "mtime"); - // url += "&type=" + parse(path, "type", "0"); - baseurl += "&tid=" + parse(path, "tid", "0"); - } - while (true) { - if (ftype == "collect") { - url = baseurl; - } else { - url = baseurl + "&pn=" + pn; - } - string res = apiPost(url); - JsonValue Root; - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue data = Root["data"]["medias"]; - if (data.isArray()) { - for (int i = 0; i < data.size(); i++) { - JsonValue item = data[i]; - if (item.isObject()) { - dictionary video; - video["title"] = item["title"].asString(); - video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); - video["thumbnail"] = item["cover"].asString(); - video["author"] = item["upper"]["name"].asString(); - videos.insertLast(video); - } - } - } - if (ftype == "collect") { - return videos; - } - int count = Root["data"]["info"]["media_count"].asInt(); - if (pn * ps >= count) { - break; - } - pn += 1; - } else { - return videos; - } - } - } - return videos; -} + return main_desc + " (" + tag_text + ")"; + } -array followingLive(uint page) { - array videos; - JsonReader Reader; - JsonValue Root; - string url = "https://api.live.bilibili.com/xlive/web-ucenter/user/following?page=" + page + "&page_size=10"; - string res = post(url); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue list = Root["data"]["list"]; - if (list.isArray()) { - for (int i = 0; i < list.size(); i++) { - JsonValue item = list[i]; - // 未开播 - if (item["live_status"].asInt() == 0) { - return videos; - } - dictionary video; - video["title"] = item["title"].asString(); - video["url"] = "https://live.bilibili.com/" + item["roomid"].asInt(); - video["thumbnail"] = item["face"].asString(); - video["author"] = item["uname"].asString(); - videos.insertLast(video); - } - if (page < Root["data"]["totalPage"].asUInt()) { - array videos2 = followingLive(page+1); - for (uint i = 0; i < videos2.size(); i++) { - videos.insertLast(videos2[i]); - } - } - } - } - } - return videos; + return "未匹配画质"; } -array liveCategory(uint page, string cateid, string parentAreaId, uint liveRoomCount) { - array videos; - JsonReader Reader; - JsonValue Root; - string params = "platform=web&parent_area_id=" + parentAreaId + "&area_id=" + cateid + "&page=" + page; - string w_rid = encWbi(params); - string url = "https://api.live.bilibili.com/xlive/web-interface/v1/second/getList?" + params + "&w_rid=" + w_rid; - string res = post(url); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue list = Root["data"]["list"]; - if (list.isArray()) { - for (int i = 0; i < list.size(); i++) { - JsonValue item = list[i]; - dictionary video; - video["title"] = item["title"].asString(); - video["url"] = "https://live.bilibili.com/" + item["roomid"].asInt(); - video["thumbnail"] = item["face"].asString(); - video["author"] = item["uname"].asString(); - videos.insertLast(video); - liveRoomCount += 1; - if (liveRoomCount >= ConfigData.maxliveroom ) { - return videos; - } - } - if (Root["data"]["has_more"].asBool()) { - array nextVideos = liveCategory(page + 1, cateid, parentAreaId, liveRoomCount); - for (uint i = 0; i < nextVideos.size(); i++) { - videos.insertLast(nextVideos[i]); - } - } - } - } - } - return videos; +string getVideoQuality(JsonValue support_formats, int quality) { + for (int i = 0; i <= support_formats.size(); i++) { + if (support_formats[i]["quality"].asInt() == quality) return support_formats[i]["new_description"].asString(); + } + return "未知"; } -array PopularHistory() { - array videos; - JsonReader Reader; - JsonValue Root; - string res = apiPost("/x/web-interface/popular/precious?page_size=100&page=1"); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() != 0) { - return videos; - } - JsonValue list = Root["data"]["list"]; - if (list.isArray()) { - for (int i = 0; i < list.size(); i++) { - JsonValue item = list[i]; - dictionary video; - video["title"] = item["title"].asString(); - video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); - video["thumbnail"] = item["pic"].asString(); - video["author"] = item["owner"]["name"].asString(); - videos.insertLast(video); - } - } - } - return videos; -} +void AppenVideoQualityList(string bvid, string aid, string cid, string& url, array& QualityList) { + status = 6; -array PopularWeekly(string path) { - array videos; - JsonReader Reader; - JsonValue Root; - string num = parse(path, "num"); - if (num.empty()) { - string res = apiPost("/x/web-interface/popular/series/list"); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() != 0) { - return videos; - } - JsonValue list = Root["data"]["list"]; - if (list.isArray()) { - num = "" + list[0]["number"].asInt(); - } - } - } - string res = apiPost("/x/web-interface/popular/series/one?number=" + num); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() != 0) { - return videos; - } - JsonValue list = Root["data"]["list"]; - if (list.isArray()) { - for (int i = 0; i < list.size(); i++) { - JsonValue item = list[i]; - dictionary video; - video["title"] = item["title"].asString(); - video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); - video["thumbnail"] = item["pic"].asString(); - video["author"] = item["owner"]["name"].asString(); - videos.insertLast(video); - } - } - } - return videos; + int qn = 127; + string params; + string res; + JsonReader reader; + JsonValue root; + + params = "bvid=" + bvid + "&avid=" + aid + "&cid=" + cid + "&qn=" + qn + "&fnval=4048&fourk=1"; + res = apiPost("/x/player/wbi/playurl?" + encWbi(params)); + if (reader.parse(res, root) && root.isObject()) { + if (root["code"].asInt() == 0) { + JsonValue data = root["data"]; + + if (data["dash"].isObject()) { + int itag = 0; + JsonValue videos = data["dash"]["video"]; + videos = SortVideos(videos); + + for (int i = 0; i < videos.size(); i++) { + if (@QualityList !is null) { + JsonValue video = videos[i]; + QualityListItem item; + + + int qn = video["id"].asInt(); + int codecid = video["codecid"].asInt(); + + url = getFixedURL(video); + string width = formatInt(video["width"].asInt()); + string height = formatInt(video["height"].asInt()); + int bitrateVal = video["bandwidth"].asInt(); + string bitrate = HostFormatBitrate(bitrateVal) + "bps"; + int fps = parseInt(video["frameRate"].asString()); + bool isHDR = (qn == 125 || qn == 126 || qn == 129); + string mimeType = video["mimeType"].asString().MakeLower(); + string format = mimeType.substr(mimeType.findLast("/") + 1) + ", " + getCodec(codecid) + ", " + bitrate; + string quality = getVideoQuality(data["support_formats"], qn); + itag = getVideoItag(qn, codecid); + if (itag <= 0 || HostExistITag(itag)) { + itag = HostGetITag(video["height"].asInt(), 0, true, false); + if (itag <= 0) itag = HostGetITag(video["height"].asInt(), 0, true, true); + } + while (HostExistITag(itag)) itag++; + HostSetITag(itag); + + item.url = url; + item.bitrateVal = bitrateVal; + item.bitrate = bitrate; + item.resolution = width + "x" + height; + item.fps = fps; + item.isHDR = isHDR; + item.format = format; + item.quality = quality; + item.qualityDetail = quality; + item.itag = itag; + item.audioIsDefault = false; + item.va = "v"; + item.referer = "https://www.bilibili.com/video/" + bvid; + if (i == videos.size() - 1) item.videoIsDefault = true; + + if (@QualityList !is null) QualityList.insertLast(item.toDictionary()); + } + } + + JsonValue audios; + JsonValue audio; + if (data["dash"]["audio"].isArray()) { + audios = data["dash"]["audio"]; + for (int i = 0; i < audios.size(); i++) { + audio = audios[i]; + AppendAudioQualityList(audio, bvid, QualityList); + } + } + if (data["dash"]["dolby"]["audio"].isArray()) { + audios = data["dash"]["dolby"]["audio"]; + for (int i = 0; i < audios.size(); i++) { + audio = audios[i]; + AppendAudioQualityList(audio, bvid, QualityList); + } + } + if (data["dash"]["flac"].isObject()) { + audio = data["dash"]["flac"]["audio"]; + AppendAudioQualityList(audio, bvid, QualityList); + } + } + } else { + log("Video playurl response code != 0", root["code"].asInt()); + log("Video playurl response message", root["message"].asString()); + } + } + + // for (uint i = 0; i < QualityList.length(); i++) { + // log("QualityList[" + i + "] = " + string(QualityList[i]["quality"]) + " | " + int(QualityList[i]["itag"]) + " | " + string(QualityList[i]["url"])); + // } + log("url", url); } -array Ranking(string path) { - array videos; - - array names = { "全站", "国创相关", "动画", "音乐", "舞蹈", "游戏", "知识", "科技", "运动", "汽车", "生活", "美食", "动物圈", "鬼畜", "时尚", "娱乐", "影视" }; - array urls = { "www.bilibili.com/v/popular/rank/all", "www.bilibili.com/v/popular/rank/guochuang", "www.bilibili.com/v/popular/rank/douga", "www.bilibili.com/v/popular/rank/music", "www.bilibili.com/v/popular/rank/dance", "www.bilibili.com/v/popular/rank/game", "www.bilibili.com/v/popular/rank/knowledge", "www.bilibili.com/v/popular/rank/tec", "www.bilibili.com/v/popular/rank/spor", "www.bilibili.com/v/popular/rank/car", "www.bilibili.com/v/popular/rank/life", "www.bilibili.com/v/popular/rank/food", "www.bilibili.com/v/popular/rank/animal", "www.bilibili.com/v/popular/rank/kichiku", "www.bilibili.com/v/popular/rank/fashion", "www.bilibili.com/v/popular/rank/en", "www.bilibili.com/v/popular/rank/cinephile" }; - array ids = { 0, 168, 1, 3, 129, 4, 36, 188, 234, 223, 160, 211, 217, 119, 155, 5, 181 }; - int pos = -1; - for (uint i = 0; i < urls.size(); i++) { - if (path.find(urls[i]) >= 0) { - pos = i; - break; - } - } - if (pos < 0) { - return videos; - } +void AppendAudioQualityList(JsonValue audio, string bvid, array& QualityList) { + QualityListItem item; - JsonReader Reader; - JsonValue Root; + int itag = 0; + string quality; + bool audioIsDefault = false; + int audioid = audio["id"].asInt(); - string res = apiPost("/x/web-interface/ranking/v2?rid=" + ids[pos]); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() != 0) { - return videos; - } - JsonValue list = Root["data"]["list"]; - if (list.isArray()) { - for (int i = 0; i < list.size(); i++) { - JsonValue item = list[i]; - dictionary video; - video["title"] = item["title"].asString(); - video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); - video["thumbnail"] = item["pic"].asString(); - video["author"] = item["owner"]["name"].asString(); - videos.insertLast(video); - } - } - } - return videos; -} + string url = getFixedURL(audio); + + if (audioid == 30250) { + quality = "杜比全景声"; + } else if (audioid == 30251) { + quality = "Hi-Res无损"; + audioIsDefault = true; + } else if (audio["codecs"].asString().MakeLower().find("mp4a") >= 0) { + quality = "AAC"; + } -array Dynamic(uint tid) { - array videos; - JsonReader Reader; - JsonValue Root; - string res = apiPost("/x/web-interface/dynamic/region?pn=1&ps=50&rid=" + tid); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() != 0) { - return videos; - } - JsonValue list = Root["data"]["archives"]; - if (list.isArray()) { - for (int i = 0; i < list.size(); i++) { - JsonValue item = list[i]; - dictionary video; - video["title"] = item["title"].asString(); - video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); - video["thumbnail"] = item["pic"].asString(); - video["author"] = item["owner"]["name"].asString(); - videos.insertLast(video); - } - } - } - return videos; -} + int bitrateVal = audio["bandwidth"].asInt(); + string bitrate = HostFormatBitrate(bitrateVal) + "bps"; + + // item.itag = getAudioItag(audioid); + if (itag <= 0 || HostExistITag(itag)) { + itag = HostGetITag(0, int(bitrateVal / 1000.0), true, false); + if (itag <= 0) itag = HostGetITag(0, int(bitrateVal / 1000.0), true, true); + } + while (HostExistITag(itag)) itag++; + HostSetITag(itag); -string md2ss(string mdid) { - JsonReader Reader; - JsonValue Root; - string ssid = ""; - string res = apiPost("/pgc/review/user?media_id=" + mdid); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - ssid = Root["result"]["media"]["season_id"].asString(); - } - } - return ssid; -} - -// type: meida_id/season_id/ep_id -array Banggumi(string id, string type) { - log("============================Banggumi============================"); - array videos; - JsonReader Reader; - JsonValue Root; - if (type == "media_id") { - id = md2ss(id); - if (id.empty()) { - return videos; - } - type = "season_id"; - } - string url = "/pgc/view/web/season?" + type + "=" + id; - string res = apiPost(url); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() != 0) { - log("Banggumi code != 0", Root["code"].asInt()); - log("Banggumi message", Root["message"].asString()); - return videos; - } - JsonValue episodes = Root["result"]["episodes"]; - if (episodes.isArray()) { - for (int i = 0; i < episodes.size(); i++) { - JsonValue item = episodes[i]; - dictionary video; - if (item["badge"].asString().empty()) { - video["title"] = item["show_title"].asString(); - } else { - video["title"] = "【" + item["badge"].asString() + "】" + item["show_title"].asString(); - } - video["duration"] = item["duration"].asInt(); - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?cid=" + item["cid"].asString(); - video["thumbnail"] = item["cover"].asString(); - if (item["ep_id"].asString() == id) video["current"] = "1"; - videos.insertLast(video); - } - } - } - return videos; + string codec = audio["codecs"].asString().MakeLower(); + string mimeType = audio["mimeType"].asString().MakeLower(); + string format = mimeType.substr(mimeType.findLast("/") + 1) + ", " + codec.substr(0, codec.find(".")) + ", " + bitrate; + + item.url = url; + item.bitrateVal = bitrateVal; + item.bitrate = bitrate; + item.resolution = "audio only"; + item.format = format; + item.quality = quality; + item.qualityDetail = item.quality; + item.itag = itag; + item.audioIsDefault = audioIsDefault; + item.va = "a"; + item.referer = "https://www.bilibili.com/video/" + bvid; + + if (@QualityList !is null) QualityList.insertLast(item.toDictionary()); } -array AudioList(string path) { - array audios; - JsonReader Reader; - JsonValue Root; - string id = HostRegExpParse(path, "www.bilibili.com/audio/am([0-9]+)"); - if (id.empty()) { - return audios; - } - string url = "https://www.bilibili.com/audio/music-service-c/web/song/of-menu?pn=1&ps=100&sid=" + id; - string res = post(url); - res = HostDecompress(res); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() != 0) { - return audios; - } - JsonValue data = Root["data"]["data"]; - if (data.isArray()) { - for (int i = 0; i < data.size(); i++) { - JsonValue item = data[i]; - dictionary audio; - audio["title"] = item["title"].asString(); - audio["duration"] = item["duration"].asInt() * 1000; - audio["url"] = "https://www.bilibili.com/audio/au" + item["statistic"]["sid"].asInt(); - audio["thumbnail"] = item["cover"].asString(); - if (item["author"].isString()) { - audio["author"] = item["author"].asString(); - } - audios.insertLast(audio); - } - } - } - return audios; +array generateChapter(const string&in bvid, const array&in chapter, const float duration) { + array result; + + const float MIN_CHAPTER_DURATION = 1.0f; + const float END_TOLERANCE = 2.0f; + + dictionary typesToName = { + { "sponsor", "赞助" }, + { "selfpromo", "推广" }, + { "exclusive_access", "品牌合作" }, + { "interaction", "三连提醒" }, + { "poi_highlight", "精彩时刻" }, + { "intro", "开场动画" }, + { "outro", "片尾" }, + { "preview", "预览" }, + { "padding", "填充内容" }, + { "filler", "离题" }, + { "music_offtopic", "非音乐" } + }; + + string headers = "origin: https://github.com/frostnotfall/BilibiliPotPlayer\r\nx-ext-version: " + GetVersion() + "\r\n"; + string url = !ConfigData.sponsorBlockMirror.empty() ? ConfigData.sponsorBlockMirror + "/api/skipSegments?videoID=" + bvid : "https://bsbsb.top/api/skipSegments?videoID=" + bvid; + + string resp = post(url, "", headers); + + if (resp.empty()) { + log("SponsorBlock response is empty. url: " + url); + return chapter; + } + + JsonReader Reader; + JsonValue SponsorBlock; + + if (!Reader.parse(resp, SponsorBlock) || !SponsorBlock.isArray()) { + log("Failed to parse SponsorBlock response. url: " + url); + return chapter; + } + + if (SponsorBlock.size() == 0) return chapter; + + if (chapter.size() == 0) { + array starts; + array ends; + array titles; + array times; + + for (int i = 0; i < SponsorBlock.size(); i++) { + JsonValue item = SponsorBlock[i]; + + string category = item["category"].asString(); + + if (!typesToName.exists(category)) continue; + + float start = item["segment"][0].asFloat(); + float end = item["segment"][1].asFloat(); + + if (start >= end) continue; + + float videoDuration = duration / 1000.0f; + + if (start < 0) + start = 0; + + if (end > videoDuration) + end = videoDuration; + + if (end > videoDuration - END_TOLERANCE) + end = videoDuration; + + if (start >= end) continue; + + starts.insertLast(start); + ends.insertLast(end); + titles.insertLast(string(typesToName[category])); + + times.insertLast(start); + times.insertLast(end); + } + + if (starts.size() == 0) return chapter; + + for (int i = 1; i < times.size(); i++) { + float value = times[i]; + int j = i - 1; + + while (j >= 0 && times[j] > value) { + times[j + 1] = times[j]; + j--; + } + + times[j + 1] = value; + } + + array sortedTimes; + + for (int i = 0; i < times.size(); i++) { + if (sortedTimes.size() == 0 || + sortedTimes[sortedTimes.size() - 1] != times[i]) { + + sortedTimes.insertLast(times[i]); + } + } + + array resultTimes; + array resultTitles; + + string lastTitle; + + for (int i = 0; i < sortedTimes.size(); i++) { + float time = sortedTimes[i]; + + string currentTitle; + float selectedStart = -1; + + for (int j = 0; j < starts.size(); j++) { + if (starts[j] <= time && ends[j] > time) { + if (starts[j] > selectedStart) { + selectedStart = starts[j]; + currentTitle = titles[j]; + } + } + } + + if (currentTitle.empty()) currentTitle = "正片"; + + if (currentTitle == lastTitle) continue; + + resultTimes.insertLast(time); + resultTitles.insertLast(currentTitle); + + lastTitle = currentTitle; + } + + array filteredTimes; + array filteredTitles; + + for (int i = 0; i < resultTimes.size(); i++) { + if (i == 0) { + filteredTimes.insertLast(resultTimes[i]); + filteredTitles.insertLast(resultTitles[i]); + continue; + } + + float chapterDuration = resultTimes[i] - resultTimes[i - 1]; + + if (chapterDuration < MIN_CHAPTER_DURATION) { + if (filteredTimes.size() > 0) { + filteredTimes.removeLast(); + filteredTitles.removeLast(); + } + + filteredTimes.insertLast(resultTimes[i]); + filteredTitles.insertLast(resultTitles[i]); + + continue; + } + + filteredTimes.insertLast(resultTimes[i]); + filteredTitles.insertLast(resultTitles[i]); + } + + array finalTimes; + array finalTitles; + + for (int i = 0; i < filteredTimes.size(); i++) { + if (finalTitles.size() > 0 && + finalTitles[finalTitles.size() - 1] == filteredTitles[i]) { + + continue; + } + + finalTimes.insertLast(filteredTimes[i]); + finalTitles.insertLast(filteredTitles[i]); + } + + for (int i = 0; i < finalTimes.size(); i++) { + dictionary item; + + item["title"] = finalTitles[i]; + item["time"] = formatFloat(finalTimes[i] * 1000, "", 32, 0); + + result.insertLast(item); + } + + return result; + } + + bool hasIntro = false; + bool hasOutro = false; + + float videoDuration = duration / 1000.0f; + + array chapterStarts; + array chapterEnds; + array chapterTitles; + + for (int i = 0; i < chapter.size(); i++) { + string title = string(chapter[i]["title"]); + string timeString = string(chapter[i]["time"]); + + float start = 0; + + float factor = 1.0f; + bool decimal = false; + float decimalFactor = 0.1f; + + for (int k = 0; k < timeString.length(); k++) { + uint8 c = timeString[k]; + + if (c >= 48 && c <= 57) { + if (!decimal) { + start = start * 10.0f + float(c - 48); + } else { + start += float(c - 48) * decimalFactor; + decimalFactor *= 0.1f; + } + } else if (c == 46) { + decimal = true; + } + } + + start /= 1000.0f; + + float end = videoDuration; + + if (i + 1 < chapter.size()) { + string nextTimeString = string(chapter[i + 1]["time"]); + + float nextTime = 0; + bool nextDecimal = false; + float nextDecimalFactor = 0.1f; + + for (int k = 0; k < nextTimeString.length(); k++) { + uint8 c = nextTimeString[k]; + + if (c >= 48 && c <= 57) { + if (!nextDecimal) { + nextTime = nextTime * 10.0f + float(c - 48); + } else { + nextTime += float(c - 48) * nextDecimalFactor; + nextDecimalFactor *= 0.1f; + } + } else if (c == 46) { + nextDecimal = true; + } + } + + end = nextTime / 1000.0f; + } + + // if (title == "开场动画") hasIntro = true; + // if (title == "片尾") hasOutro = true; + if (start >= end) continue; + + chapterStarts.insertLast(start); + chapterEnds.insertLast(end); + chapterTitles.insertLast(title); + } + + array sponsorStarts; + array sponsorEnds; + array sponsorTitles; + + for (int i = 0; i < SponsorBlock.size(); i++) { + JsonValue item = SponsorBlock[i]; + + string category = item["category"].asString(); + + if (!typesToName.exists(category)) continue; + + if (category == "intro" && hasIntro) continue; + + if (category == "outro" && hasOutro) continue; + + float start = item["segment"][0].asFloat(); + float end = item["segment"][1].asFloat(); + + if (start >= end) continue; + + if (start < 0) + start = 0; + + if (end > videoDuration) + end = videoDuration; + + if (end > videoDuration - END_TOLERANCE) + end = videoDuration; + + if (start >= end) continue; + + sponsorStarts.insertLast(start); + sponsorEnds.insertLast(end); + sponsorTitles.insertLast(string(typesToName[category])); + } + + if (sponsorStarts.size() == 0) return chapter; + + array times; + + for (int i = 0; i < chapterStarts.size(); i++) { + times.insertLast(chapterStarts[i]); + times.insertLast(chapterEnds[i]); + } + + for (int i = 0; i < sponsorStarts.size(); i++) { + times.insertLast(sponsorStarts[i]); + times.insertLast(sponsorEnds[i]); + } + + for (int i = 1; i < times.size(); i++) { + float value = times[i]; + int j = i - 1; + + while (j >= 0 && times[j] > value) { + times[j + 1] = times[j]; + j--; + } + + times[j + 1] = value; + } + + array sortedTimes; + + for (int i = 0; i < times.size(); i++) { + if (sortedTimes.size() == 0 || + sortedTimes[sortedTimes.size() - 1] != times[i]) { + sortedTimes.insertLast(times[i]); + } + } + + array resultTimes; + array resultTitles; + string lastTitle; + + for (int i = 0; i < sortedTimes.size() - 1; i++) { + float start = sortedTimes[i]; + float end = sortedTimes[i + 1]; + + if (start >= end) continue; + + string currentTitle; + int selectedChapter = -1; + + for (int j = 0; j < chapterStarts.size(); j++) { + if (chapterStarts[j] <= start && + chapterEnds[j] > start) { + + selectedChapter = j; + break; + } + } + + if (selectedChapter >= 0) { + string chapterTitle = chapterTitles[selectedChapter]; + if (chapterTitle != "正片") currentTitle = chapterTitle; + } + + if (currentTitle.empty()) { + int selectedSponsor = -1; + float selectedStart = -1; + + for (int j = 0; j < sponsorStarts.size(); j++) { + if (sponsorStarts[j] <= start && + sponsorEnds[j] > start) { + + if (sponsorStarts[j] > selectedStart) { + selectedStart = sponsorStarts[j]; + selectedSponsor = j; + } + } + } + + if (selectedSponsor >= 0) currentTitle = sponsorTitles[selectedSponsor]; else if (selectedChapter >= 0) { + currentTitle = chapterTitles[selectedChapter]; + } else { + currentTitle = "正片"; + } + } + + if (currentTitle == lastTitle) continue; + + resultTimes.insertLast(start); + resultTitles.insertLast(currentTitle); + + lastTitle = currentTitle; + } + + array filteredTimes; + array filteredTitles; + + for (int i = 0; i < resultTimes.size(); i++) { + if (i == 0) { + filteredTimes.insertLast(resultTimes[i]); + filteredTitles.insertLast(resultTitles[i]); + continue; + } + + float chapterDuration = resultTimes[i] - resultTimes[i - 1]; + + if (chapterDuration < MIN_CHAPTER_DURATION) { + if (filteredTimes.size() > 0) { + filteredTimes.removeLast(); + filteredTitles.removeLast(); + } + + filteredTimes.insertLast(resultTimes[i]); + filteredTitles.insertLast(resultTitles[i]); + + continue; + } + + filteredTimes.insertLast(resultTimes[i]); + filteredTitles.insertLast(resultTitles[i]); + } + + array finalTimes; + array finalTitles; + + for (int i = 0; i < filteredTimes.size(); i++) { + if (finalTitles.size() > 0 && + finalTitles[finalTitles.size() - 1] == filteredTitles[i]) { + continue; + } + + finalTimes.insertLast(filteredTimes[i]); + finalTitles.insertLast(filteredTitles[i]); + } + + for (int i = 0; i < finalTimes.size(); i++) { + dictionary item; + + item["title"] = finalTitles[i]; + item["time"] = formatFloat(finalTimes[i] * 1000, "", 32, 0); + result.insertLast(item); + } + + return result; } -array Search(string path) { - array videos; - JsonReader Reader; - JsonValue Root; - string kw; - if (path.find("?WithCaption") >= 0) { - path.replace("?WithCaption", ""); - kw = HostUrlEncode(parse(path, "keyword")); - } else { - kw = parse(path, "keyword"); - } - if (kw.empty()) { - return videos; - } - string type = HostRegExpParse(path, "search.bilibili.com/([a-zA-Z0-9]+)"); - string url; - if (type == "all") { - url = "/x/web-interface/search/all/v2?keyword=" + kw; - } else if (type == "video") { - url = "/x/web-interface/search/type?search_type=video&keyword=" + kw; +JsonValue SortVideos(JsonValue& videos) { + array VideoIdOrder; + if (ConfigData.preferHDR) { + VideoIdOrder = { 6, 16, 32, 64, 74, 80, 100, 112, 116, 120, 127, 125, 126, 129 }; } else { - return videos; + VideoIdOrder = { 6, 16, 32, 64, 74, 80, 100, 112, 116, 120, 125, 126, 127, 129 }; } - string res = apiPost(url); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() != 0) { - return videos; - } - JsonValue list; - if (type == "all") { - for (int i = 0; i < Root["data"]["result"].size(); i++) { - if (Root["data"]["result"][i]["result_type"].asString() == "video") { - list = Root["data"]["result"][i]["data"]; + + JsonReader reader; + JsonValue sortedVideos; + reader.parse("[]", sortedVideos); + + array used(videos.size(), false); + + for (uint i = 0; i < videos.size(); i++) { + int minIndex = -1; + int minOrder = 0; + + for (uint j = 0; j < videos.size(); j++) { + if (used[j]) continue; + + int codecid = videos[j]["codecid"].asInt(); + int id = videos[j]["id"].asInt(); + + int order = int(VideoIdOrder.length()); + + for (uint k = 0; k < VideoIdOrder.length(); k++) { + if (VideoIdOrder[k] == id) { + order = int(k); break; } } - } else if (type == "video") { - list = Root["data"]["result"]; - } else { - return videos; - } - for (int i = 0; i < list.size(); i++) { - JsonValue item = list[i]; - dictionary video; - string title = item["title"].asString(); - title.replace("", ''); - title.replace("", ''); - video["title"] = title; - video["content"] = title; - video["duration"] = parseTime(item["duration"].asString()); - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); - video["thumbnail"] = "https:" + item["pic"].asString(); - video["author"] = item["author"].asString(); - videos.insertLast(video); - } - } - return videos; -} -array webDynamic(string path) { - array videos; - JsonReader Reader; - JsonValue Root; - string type = parse(path, "tab"); - if (type != "video") { - type = "all"; - } - int nums = 5; - string offset; - string baseurl ="/x/polymer/web-dynamic/v1/feed/all?timezone_offset=-480&type=" + type; - for (int i = 1; i <= nums; i++) { - string url = baseurl + "&page=" + i; - if (!offset.empty()) { - url += "&offset=" + offset; - } - string res = apiPost(url); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() != 0) { - return videos; - } - JsonValue list = Root["data"]["items"]; - if (list.isArray()) { - offset = Root["data"]["offset"].asString(); - for (int j = 0; j < list.size(); j++) { - JsonValue dynamic = list[j]["modules"]["module_dynamic"]; - if (dynamic.isObject()) { - JsonValue major = dynamic["major"]; - if (!major.isObject()) { - continue; - } - string author = list[j]["modules"]["module_author"]["name"].asString(); - JsonValue archive = major["archive"]; - if (archive.isObject()) { - if (archive["bvid"].isString() && !archive["bvid"].asString().empty()) { - string bvid = archive["bvid"].asString(); - dictionary video; - video["title"] = "视频 | " + archive["title"].asString(); - video["duration"] = parseTime(archive["duration_text"].asString()); - video["url"] = "https://www.bilibili.com/video/" + bvid; - video["thumbnail"] = archive["cover"].asString(); - video["author"] = author; - videos.insertLast(video); - } - continue; - } - JsonValue live_rcmd = major["live_rcmd"]; - if (live_rcmd.isObject()) { - string content_str = live_rcmd["content"].asString(); - JsonValue content; - if (Reader.parse(content_str, content) && content.isObject()) { - if (content["live_play_info"]["live_status"].asInt() == 1) { - dictionary live; - live["title"] = "直播 | " + content["live_play_info"]["title"].asString(); - live["url"] = "https://live.bilibili.com/" + content["live_play_info"]["room_id"].asString(); - live["thumbnail"] = content["live_play_info"]["cover"].asString(); - live["author"] = author; - videos.insertLast(live); - } - } - continue; - } + if (ConfigData.disableAVC && codecid == 7) { + bool hasOtherCodec = false; + + for (uint k = 0; k < videos.size(); k++) { + if (k != j && !used[k] && videos[k]["id"].asInt() == id && videos[k]["codecid"].asInt() != 7) { + hasOtherCodec = true; + break; } } - if (!Root["data"]["has_more"].asBool()) { - break; - } - } - } - } - return videos; -} -array Recommend(uint page) { - array videos; - JsonReader Reader; - JsonValue Root; - const uint nums = 5; - string url = "/x/web-interface/wbi/index/top/feed/rcmd?y_num=3&fresh_type=4&feed_version=V8&fresh_idx_1h="+page+"&fetch_row="+(3*page+1)+"&fresh_idx="+page+"&brush="+page+"&homepage_ver=1&ps=12&last_y_num=4&outside_trigger="; - string res = apiPost(url); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() != 0) { - return videos; - } - JsonValue list = Root["data"]["item"]; - if (list.isArray()) { - for (int i = 0; i < list.size(); i++) { - JsonValue item = list[i]; - if (item["bvid"].asString().empty()) { + if (hasOtherCodec) { continue; } - dictionary video; - video["thumbnail"] = item["pic"].asString(); - video["author"] = item["owner"]["name"].asString(); - if (item["uri"].asString().find("live.bilibili.com") >= 0) { - video["title"] = "直播 | " + item["title"].asString(); - video["url"] = item["uri"].asString(); - } else { - video["title"] = item["title"].asString(); - video["duration"] = item["duration"].asInt() * 1000; - video["url"] = item["uri"].asString(); - } - videos.insertLast(video); - } - } - } - if (page < nums) { - array videos2 = Recommend(page+1); - for (uint i = 0; i < videos2.size(); i++) { - videos.insertLast(videos2[i]); - } - } - return videos; -} - -int getItag(int qn) { - array qns = {30000, 25000, 20000, 10000, 400, 250, 150, 80}; - int idx = qns.find(qn); - if (idx >= 0) { - return idx; - } - return qn; -} - -int getVideoItag(int id, int codecid) { - array> videoItagMap = { - //240P - {6, 7, 133}, - {6, 12, 133}, - {6, 13, 395}, - // 360P - {16, 7, 134}, - {16, 12, 134}, - {16, 13, 396}, - // 480P - {32, 7, 135}, - {32, 12, 135}, - {32, 13, 397}, - // 720P - {64, 7, 136}, - {64, 12, 136}, - {64, 13, 398}, - // 720P60 - {74, 7, 298}, - {74, 12, 298}, - {74, 13, 398}, - // 1080P - {80, 7, 137}, - {80, 12, 137}, - {80, 13, 399}, - // 1080P+ - {112, 7, 137}, - {112, 12, 137}, - {112, 13, 399}, - // 1080P60 - {116, 7, 299}, - {116, 12, 299}, - {116, 13, 399}, - // 4K - {120, 7, 266}, - {120, 12, 266}, - {120, 13, 401}, - // HDR - {125, 7, 337}, - {125, 12, 337}, - {125, 13, 701}, - // 杜比视界 - {126, 7, 337}, - {126, 12, 337}, - {126, 13, 701}, - // 8K - {127, 7, 571}, - {127, 12, 571}, - {127, 13, 571}, - // HDR Vivid - {129, 7, 337}, - {129, 12, 337}, - {129, 13, 701} - }; - - for (int i = 0; i < videoItagMap.size(); i++) { - if (videoItagMap[i][0] == id && videoItagMap[i][1] == codecid) { - return videoItagMap[i][2]; + } + + if (minIndex == -1 || order < minOrder) { + minIndex = int(j); + minOrder = order; + } else if (order == minOrder && codecid < videos[minIndex]["codecid"].asInt()) { + minIndex = int(j); + } } - } - return 0; -} + if (minIndex == -1) break; -int getTrueItag(int itag) { - array itags = {1282,1283,1272,1273,1262,1263,1207,1212,1213,1167,1172,1173,1127,1132,1133,807,812,813,647,652,653,327,332,333,167,172,173,67,72,73}; - array tis = {102,571,101,702,266,701,138,272,401,299,303,699,264,271,400,137,248,399,136,247,398,135,244,397,134,243,396,133,242,395}; - int idx = itags.find(itag); - if (idx >= 0) { - return tis[idx]; + sortedVideos[i] = videos[minIndex]; + used[minIndex] = true; } - return itag; -} -int getAudioItag(int id) { - // 增加 EC-3/E-AC3 和 flac 的 itag 映射,flac 没有对应的 itag,使用 AC3 替代 - array ids = {30251, 30250, 30280, 30232, 30216}; - array itags = {258, 328, 327, 256, 139}; - int idx = ids.find(id); - if (idx >= 0) { - return itags[idx]; - } - return id; + return sortedVideos; } -uint getUniItag() -{ - uint itag = 1; - while (HostExistITag(itag)) itag++; - HostSetITag(itag); - return itag; -} +array BangumiEpisodes(string id, string type) { + log("============================BangumiEpisodes============================"); + array videos; -string getVideoquality(JsonValue support_formats, int quality) { - for (int i = 0; i <= support_formats.size(); i++) { - if (support_formats[i]["quality"].asInt() == quality) return support_formats[i]["new_description"].asString(); - } - return "未知"; -} + if (type == "media_id") { + id = md2ss(id); + if (id.empty()) return videos; + type = "season_id"; + } -string getCodec(int codecid) { - array codecids = {7, 12, 13}; - array codec = {"avc", "hevc", "av1"}; - int idx = codecids.find(codecid); - if (idx >= 0) { - return codec[idx]; - } - return "未知"; -} + string res = apiPost("/pgc/view/web/ep/list?" + type + "=" + id); + JsonReader Reader; + JsonValue Root; + + Reader.parse(res, Root); + JsonValue episodes = Root["result"]["episodes"]; + if (!episodes.isArray()) return videos; + + for (int j = 0; j < episodes.size(); j++) { + JsonValue episode = episodes[j]; + if (episode["badge_type"].asInt() == 1) return videos; + + dictionary video; + video["title"] = episode["show_title"].asString(); + video["duration"] = episode["duration"].asString(); + video["thumbnail"] = episode["cover"].asString(); + // video["author"] = episode["owner"]["name"].asString(); + video["url"] = episode["link"].asString(); + // if (!episode["desc"].asString().empty() || episode["desc"].asString() != "-") video["content"] = view["desc"].asString(); + video["viewCount"] = episode["stat"]["play"].asString(); + video["likeCount"] = episode["stat"]["likes"].asString(); + // video["dislikeCount"] = episode["stat"]["dislike"].asString(); + video["date"] = UnixTimeToDateTime(episode["pub_time"].asInt64()); + if (episode["ep_id"].asString() == id) video["current"] = "1"; + if (type == "season_id") video["referer"] = "www.bilibili.com/bangumi/play/ss" + id; + if (type == "ep_id") video["referer"] = "www.bilibili.com/bangumi/play/ep" + id; + + videos.insertLast(video); + } -string getLiveQuality(JsonValue g_qn_desc, int qn, int hdr_type, JsonValue video_color_info) { - int etof = 0; - if (video_color_info.isObject() && video_color_info["eotf"].isNumeric()) { - etof = video_color_info["eotf"].asInt(); - } + return videos; +} - if (!g_qn_desc.isArray() || g_qn_desc.size() == 0) { - log("getLiveQualityNew: g_qn_desc is not an array or is empty"); - return "未匹配画质"; - } +array UGCSeason(const string&in path) { + array videos; - for (int i = 0; i < g_qn_desc.size(); i++) { - JsonValue item = g_qn_desc[i]; - if (!item.isObject()) { - log("getLiveQualityNew item is not object, index", i); - continue; - } + string bvid = parseBVId(path); + string aid = parseAVId(path); + string cid; + string p = parse(path, "p", "1"); + string params; + if (!bvid.empty()) params += "bvid=" + bvid; + if (!aid.empty()) params += "aid=" + aid; + if (bvid.empty() && aid.empty()) return videos; - int item_qn = item["qn"].asInt(); - int item_hdr_type = item["hdr_type"].asInt(); - int item_etof = item["eotf"].asInt(); + string res = apiPost("/x/web-interface/wbi/view/detail?" + encWbi(params)); - if (item_qn != qn || item_hdr_type != hdr_type || item["eotf"].asInt() != etof) { - continue; + JsonReader Reader; + JsonValue Root; + Reader.parse(res, Root); + + JsonValue sections = Root["data"]["View"]["ugc_season"]["sections"]; + if (!sections.isArray()) return videos; + + string title; + for (int i = 0; i < sections.size(); i++) { + JsonValue section = sections[i]; + if (sections.size() > 1) title = "【" + section["title"].asString() + "】"; + + JsonValue episodes = section["episodes"]; + if (!episodes.isArray()) continue; + + for (int j = 0; j < episodes.size(); j++) { + JsonValue episode = episodes[j]; + if (!episode.isObject()) continue; + + JsonValue pages = episode["pages"]; + if (! pages.isArray()) continue; + + for (int k = 0; k < pages.size(); k++) { + JsonValue page = pages[k]; + dictionary video; + + if (pages.size() == 1) { + video["title"] = title + episode["title"].asString(); + } else { + video["title"] = title + page["part"].asString(); + } + video["duration"] = page["duration"].asInt() * 1000; + video["thumbnail"] = episode["arc"]["pic"].asString(); + video["author"] = episode["arc"]["author"]["name"].asString(); + video["url"] = "https://www.bilibili.com/video/" + episode["bvid"].asString() + "?p=" + page["page"].asString(); + video["viewCount"] = episode["arc"]["stat"]["view"].asString(); + video["likeCount"] = episode["arc"]["stat"]["like"].asString(); + video["dislikeCount"] = episode["arc"]["stat"]["dislike"].asString(); + video["date"] = UnixTimeToDateTime(episode["arc"]["pubdate"].asInt64()); + if ((episode["bvid"].asString() == bvid || episode["aid"].asString() == aid) && page["page"].asString() == p) video["current"] = "1"; + video["referer"] = "https://www.bilibili.com/video/" + episode["bvid"].asString(); + videos.insertLast(video); + } } + } - string fallback_desc = item["desc"].asString(); - JsonValue media_base_desc = item["media_base_desc"]; - if (!media_base_desc.isObject()) { - log("getLiveQualityNew media_base_desc missing, fallback desc, qn=" + qn + ", hdr_type=" + hdr_type + ", etof=" + etof); - return fallback_desc; - } + return videos; +} - JsonValue detail_desc = media_base_desc["detail_desc"]; - if (!detail_desc.isObject()) { - log("getLiveQualityNew detail_desc missing, fallback desc, qn=" + qn + ", hdr_type=" + hdr_type + ", etof=" + etof); - return fallback_desc; - } +array RelatedVideos(const string&in path) { + array videos; - string main_desc = detail_desc["desc"].asString(); - if (main_desc.empty()) { - log("getLiveQualityNew detail_desc desc empty, fallback desc, qn=" + qn + ", hdr_type=" + hdr_type + ", etof=" + etof); - return fallback_desc; - } + string bvid = parseBVId(path); + string aid = parseAVId(path); + string params; + if (!bvid.empty()) params += "bvid=" + bvid; + if (!aid.empty()) params += "aid=" + aid; + if (bvid.empty() && aid.empty()) return videos; - JsonValue tags = detail_desc["tag"]; - if (!tags.isArray()) { - return main_desc; - } + string res = apiPost("/x/web-interface/wbi/view/detail?" + encWbi(params)); - string tag_text = ""; - for (int t = 0; t < tags.size(); t++) { - if (!tag_text.empty()) { - tag_text += " "; - } - tag_text += tags[t].asString(); - } + JsonReader Reader; + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + if (!Root["data"]["View"].isObject()) { + log('Root["data"]["View"] is empty.'); + return videos; + } - return main_desc + " (" + tag_text + ")"; + JsonValue view = Root["data"]["View"]; + + dictionary video; + video["title"] = view["title"].asString(); + video["duration"] = view["duration"].asInt() * 1000; + video["thumbnail"] = view["pic"].asString(); + video["author"] = view["owner"]["name"].asString(); + video["url"] = "https://www.bilibili.com/video/" + bvid; + if (!view["desc"].asString().empty() || view["desc"].asString() != "-") video["content"] = view["desc"].asString(); + video["viewCount"] = view["stat"]["view"].asString(); + video["likeCount"] = view["stat"]["like"].asString(); + video["dislikeCount"] = view["stat"]["dislike"].asString(); + video["date"] = UnixTimeToDateTime(view["pubdate"].asInt64()); + video["current"] = "1"; + video["referer"] = "https://www.bilibili.com/video/" + view["bvid"].asString(); + videos.insertLast(video); + + if (!ConfigData.showRecommendedVideos) return videos; + + JsonValue related = Root["data"]["Related"]; + if (related.isArray()) { + for (int i = 0; i < related.size(); i++) { + JsonValue item = related[i]; + if (item.isObject()) { + dictionary video; + video["title"] = item["title"].asString(); + video["duration"] = item["duration"].asInt() * 1000; + video["thumbnail"] = item["pic"].asString(); + video["author"] = item["owner"]["name"].asString(); + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + if (!item["desc"].asString().empty() || item["desc"].asString() != "-") video["content"] = item["desc"].asString(); + video["viewCount"] = item["stat"]["view"].asString(); + video["likeCount"] = item["stat"]["like"].asString(); + video["dislikeCount"] = item["stat"]["dislike"].asString(); + video["date"] = UnixTimeToDateTime(item["pubdate"].asInt64()); + video["referer"] = "https://www.bilibili.com/video/" + view["bvid"].asString(); + videos.insertLast(video); + } else { + log("item is not exists."); + } + } + } else { + log("no related videos"); + } + } else { + log("Video view API code != 0", Root["code"].asInt()); + log("Video view API message", Root["message"].asString()); + } + } else { + log("res parse failed or Root is empty."); } - return "未匹配画质"; + return videos; } -string Audio(const string &in path, dictionary &MetaData, array &QualityList) { - string id = HostRegExpParse(path, "/audio/au([0-9]+)"); - JsonReader Reader; - JsonValue Root; - string url; - string res; - - res = post("https://www.bilibili.com/audio/music-service-c/web/song/info?sid=" + id); - res = HostDecompress(res); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() != 0) { - return ""; - } - JsonValue data = Root["data"]; - MetaData["title"] = data["title"].asString(); - MetaData["thumbnail"] = data["cover"].asString(); - if (data["author"].isString()) { - MetaData["author"] = data["author"].asString(); - } - } +array FavList(string path) { + JsonReader Reader; + array videos; + string fid = parseFid(path); + if (fid.empty()) { + string mid = HostRegExpParse(path, "bilibili.com/([0-9]+)"); + if (mid.empty()) { + mid = "" + ConfigData.uid; + } + string res = apiPost("/x/v3/fav/folder/created/list-all?up_mid=" + mid); + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue data = Root["data"]["list"]; + if (data.isArray()) { + fid = "" + data[0]["id"].asInt(); + } + } + } + } + if (fid.empty()) { + return videos; + } + int pn = 1; + int ps = 20; + string baseurl; + string url; + string ftype = parse(path, "ftype"); + // 订阅和收藏 + if (ftype == "collect") { + baseurl = "/x/space/fav/season/list?season_id=" + fid; + } else { + baseurl = "/x/v3/fav/resource/list?media_id=" + fid + "&ps=" + ps; + baseurl += "&keyword=" + parse(path, "keyword"); + baseurl += "&order=" + parse(path, "order", "mtime"); + // url += "&type=" + parse(path, "type", "0"); + baseurl += "&tid=" + parse(path, "tid", "0"); + } + while (true) { + if (ftype == "collect") { + url = baseurl; + } else { + url = baseurl + "&pn=" + pn; + } + string res = apiPost(url); + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue data = Root["data"]["medias"]; + if (data.isArray()) { + for (int i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + if (item.isObject()) { + dictionary video; + video["title"] = item["title"].asString(); + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + video["thumbnail"] = item["cover"].asString(); + video["author"] = item["upper"]["name"].asString(); + videos.insertLast(video); + } + } + } + if (ftype == "collect") { + return videos; + } + int count = Root["data"]["info"]["media_count"].asInt(); + if (pn * ps >= count) { + break; + } + pn += 1; + } else { + return videos; + } + } + } + return videos; +} - status = 6; - res = post("https://www.bilibili.com/audio/music-service-c/web/url?privilege=2&quality=2&sid=" + id); - res = HostDecompress(res); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() != 0) { - return ""; - } - JsonValue data = Root["data"]["cdns"]; - if (data.isArray()) { - return data[0].asString(); - } - } - return url; +array AudioList(string path) { + array audios; + JsonReader Reader; + JsonValue Root; + string id = HostRegExpParse(path, "www.bilibili.com/audio/am([0-9]+)"); + if (id.empty()) { + return audios; + } + string url = "https://www.bilibili.com/audio/music-service-c/web/song/of-menu?pn=1&ps=100&sid=" + id; + string res = post(url); + res = HostDecompress(res); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return audios; + } + JsonValue data = Root["data"]["data"]; + if (data.isArray()) { + for (int i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + dictionary audio; + audio["title"] = item["title"].asString(); + audio["duration"] = item["duration"].asInt() * 1000; + audio["url"] = "https://www.bilibili.com/audio/au" + item["statistic"]["sid"].asInt(); + audio["thumbnail"] = item["cover"].asString(); + if (item["author"].isString()) { + audio["author"] = item["author"].asString(); + } + audios.insertLast(audio); + } + } + } + return audios; } -string GetM3u8RealURL(string url) { - string resp = post(url, "", "", false); - array lines = resp.split("\n"); +string Bangumi(const string&in path, dictionary& MetaData, array& QualityList) { + log("==============================Bangumi============================="); + string url; + string aid; + string bvid; + string cid; + string epid = parseEPId(path); + + string params = "ep_id=" + epid; + string res = apiPost("/pgc/view/web/ep/page?" + encWbi(params)); + JsonReader Reader; + JsonValue Root; + + Reader.parse(res, Root); + epid = Root["result"]["locator"]["target_ep_id"].asString(); + JsonValue sections = Root["result"]["sections"]; + + if (!sections.isArray()) return url; + JsonValue section = sections[0]; + if (!section["pages"].isArray()) return url; + + for (int i = 0; i < section["pages"].size(); i++) { + JsonValue page = section["pages"][i]; + if (!page.isObject()) continue; + JsonValue episodes = page["episodes"]; + if (!episodes.isArray()) continue; + for (int j = 0; j < episodes.size(); j++) { + JsonValue episode = episodes[j]; + if (episode["ep_id"].asString() != epid) continue; + + aid = episode["aid"].asString(); + bvid = episode["bvid"].asString(); + cid = episode["cid"].asString(); + + if (@MetaData !is null) { + MetaData["vid"] = join({bvid, cid}, "|"); + string title = episode["show_title"].asString(); + MetaData["title"] = title; + MetaData["duration"] = episode["duration"].asString(); + MetaData["thumbnail"] = episode["cover"].asString(); + MetaData["webUrl"] = episode["link"].asString(); + MetaData["date"] = UnixTimeToDateTime(episode["pub_time"].asInt64()); + MetaData["fileExt"] = "mp4"; + + if (episode["skip"].isObject()) { + array chapter; + dictionary item; + + if (episode["skip"]["op"].isObject() && episode["skip"]["op"]["end"].asInt() != 0) { + item["title"] = "开场动画"; + item["time"] = formatFloat(episode["skip"]["op"]["start"].asFloat() * 1000, "", 32, 0); + chapter.insertLast(item); + + item["title"] = "正片"; + item["time"] = formatFloat(episode["skip"]["op"]["end"].asFloat() * 1000, "", 32, 0); + chapter.insertLast(item); + } + if (episode["skip"]["ed"].isObject() && episode["skip"]["ed"]["start"].asInt() != 0 && episode["skip"]["ed"]["end"].asInt() != 0) { + item["title"] = "片尾"; + item["time"] = formatFloat(episode["skip"]["ed"]["start"].asFloat() * 1000, "", 32, 0); + chapter.insertLast(item); + + if (episode["skip"]["ed"]["end"].asFloat() * 1000 < episode["duration"].asFloat()) { + item["title"] = "正片"; + item["time"] = formatFloat(episode["skip"]["ed"]["end"].asFloat() * 1000, "", 32, 0); + chapter.insertLast(item); + } + } + + if (ConfigData.enableSponsorBlock) { + status = 5; + chapter = generateChapter(bvid, chapter, episode["duration"].asFloat()); + status = 4; + } + + if (!chapter.empty()) MetaData["chapter"] = chapter; + } - for (uint i = 0; i < lines.size(); i++) { - string line = lines[i].Trim(); + array subtitle; + if (ConfigData.danmakuEnable) { + dictionary dic; + dic["name"] = "【弹幕】" + title; + dic["url"] = ConfigData.danmakuUrl + cid; + subtitle.insertLast(dic); + if (!subtitle.empty()) MetaData["subtitle"] = subtitle; + } - if (line.find("#EXT-X-STREAM-INF:") == 0) { - if (i + 1 < lines.size()) { - string m3u8 = lines[i + 1].Trim(); + res = apiPost("/pgc/season/episode/web/info?ep_id=" + epid); + Reader.parse(res, Root); - if (m3u8.find("http://") == 0 || m3u8.find("https://") == 0) { - return m3u8; + array author; + if (Root["data"]["related_up"].isArray()) { + for (int i = 0; i < Root["data"]["related_up"].size(); i++) { + author.insertLast(Root["data"]["related_up"][i]["uname"].asString()); + } } + MetaData["author"] = join(author, ","); + MetaData["viewCount"] = Root["data"]["stat"]["reply"].asString(); + MetaData["likeCount"] = Root["data"]["stat"]["like"].asString(); } + break; } } + AppenVideoQualityList(bvid, aid, cid, url, QualityList); + return url; } -string Live(string id, const string &in path, dictionary &MetaData, array &QualityList) { - log("==============================live=============================="); - string url; - string res; - - res = post("https://api.live.bilibili.com/xlive/web-room/v1/index/getInfoByRoom?room_id=" + id); - JsonReader Reader; - JsonValue Root; - if (!Reader.parse(res, Root) || !Root.isObject() || Root["code"].asInt() != 0) { - return url; - } +string Video(string id, const string&in path, dictionary& MetaData, array& QualityList) { + log("==============================video============================="); + string res; + string bvid; + string aid; + string cid; + string title; + string url; + string params; + JsonReader reader; + JsonValue Root; + array subtitle; + array chapter; + + int p = parseInt(parse(path, "p", "1")); + + if (id.find("BV") == 0) { + bvid = id; + params += "bvid=" + id; + } + if (id.find("av") == 0) { + aid = id; + params += "aid=" + id; + } + res = apiPost("/x/web-interface/wbi/view/detail?" + encWbi(params)); + reader.parse(res, Root); + JsonValue view = Root["data"]["View"]; - JsonValue data = Root["data"]["room_info"]; + if (view["redirect_url"].isString()) return Bangumi(view["redirect_url"].asString(), MetaData, QualityList); - if (@MetaData !is null) { - MetaData["title"] = data["title"].asString(); - MetaData["thumbnail"] = data["cover"].asString(); - MetaData["author"] = Root["data"]["anchor_info"]["base_info"]["uname"].asString(); - MetaData["content"] = data["description"].asString(); - MetaData["webUrl"] = makeWebUrl(path); - MetaData["viewCount"] = Root["watched_show"]["num"].asString(); - MetaData["likeCount"] = Root["like_info_v3"]["like"].asString(); - } + bvid = view["bvid"].asString(); + aid = view["aid"].asString(); - status = 6; + if (@MetaData !is null) { + cid = view["pages"][p-1]["cid"].asString(); + title = view["pages"][p-1]["part"].asString(); + if (title.isEmpty()) title = view["title"].asString(); + + MetaData["vid"] = join({bvid, cid}, "|"); + MetaData["title"] = title; + MetaData["duration"] = formatInt(view["duration"].asInt() * 1000); + MetaData["thumbnail"] = view["pic"].asString(); + MetaData["author"] = view["owner"]["name"].asString(); + MetaData["content"] = view["desc"].asString(); + MetaData["webUrl"] = makeWebUrl(path); + MetaData["viewCount"] = view["stat"]["view"].asString(); + MetaData["likeCount"] = view["stat"]["like"].asString(); + MetaData["dislikeCount"] = view["stat"]["dislike"].asString(); + MetaData["date"] = UnixTimeToDateTime(view["pubdate"].asInt64()); + MetaData["fileExt"] = "mp4"; + + if (ConfigData.enableSponsorBlock) { + status = 5; + chapter = generateChapter(bvid, chapter, view["duration"].asInt() * 1000.0); + status = 4; + } + if (!chapter.empty()) MetaData["chapter"] = chapter; + + if (ConfigData.danmakuEnable) { + dictionary dic; + dic["name"] = "【弹幕】" + title; + dic["url"] = ConfigData.danmakuUrl + cid; + subtitle.insertLast(dic); + if (!subtitle.empty()) MetaData["subtitle"] = subtitle; + } + } + + AppenVideoQualityList(bvid, aid, cid, url, QualityList); - array accept_qns; - string default_format; - string room_id = data["room_id"].asInt(); - int qn = 30000; + return url; +} - res = post("https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo?room_id=" + room_id + "&qn=" + qn + "&codec=0,1,2&format=0,1,2&mask=0&no_playurl=0&platform=web&protocol=0,1&eotf=0,1,2"); - if (!Reader.parse(res, Root) || !Root.isObject() || Root["code"].asInt() != 0) { - return url; - } +string Live(string id, const string&in path, dictionary& MetaData, array& QualityList) { + log("==============================live=============================="); + string url; + string res; - JsonValue playurl = Root["data"]["playurl_info"]["playurl"]; - if (!playurl.isObject()) { - log('Root["data"]["playurl_info"]["playurl"] is not exists.'); - return url; - } + res = post("https://api.live.bilibili.com/xlive/web-room/v1/index/getInfoByRoom?room_id=" + id); + JsonReader Reader; + JsonValue Root; + if (!Reader.parse(res, Root) || !Root.isObject() || Root["code"].asInt() != 0) { + return url; + } - JsonValue g_qn_desc = playurl["g_qn_desc"]; - if (!g_qn_desc.isArray()) { - log('Root["data"]["playurl_info"]["playurl"]["g_qn_desc"] is not array.'); - return url; - } + JsonValue data = Root["data"]["room_info"]; - JsonValue streams = playurl["stream"]; - if (!streams.isArray()) { - log('streams is not array.'); - return url; - } + if (@MetaData !is null) { + MetaData["title"] = data["title"].asString(); + MetaData["thumbnail"] = data["cover"].asString(); + MetaData["author"] = Root["data"]["anchor_info"]["base_info"]["uname"].asString(); + MetaData["content"] = data["description"].asString(); + MetaData["webUrl"] = makeWebUrl(path); + MetaData["viewCount"] = Root["watched_show"]["num"].asString(); + MetaData["likeCount"] = Root["like_info_v3"]["like"].asString(); + } + + status = 6; + + array accept_qns; + string default_format; + string room_id = data["room_id"].asInt(); + int qn = 30000; + + res = post("https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo?room_id=" + room_id + "&qn=" + qn + "&codec=0,1,2&format=0,1,2&mask=0&no_playurl=0&platform=web&protocol=0,1&eotf=0,1,2"); + if (!Reader.parse(res, Root) || !Root.isObject() || Root["code"].asInt() != 0) { + return url; + } - for (int s = 0; s < streams.size(); s++) { - if (streams[s]["protocol_name"].asString() != "http_hls") { - continue; - } + JsonValue playurl = Root["data"]["playurl_info"]["playurl"]; + if (!playurl.isObject()) { + log('Root["data"]["playurl_info"]["playurl"] is not exists.'); + return url; + } - JsonValue formats = streams[s]["format"]; - if (!formats.isArray()) { - continue; - } + JsonValue g_qn_desc = playurl["g_qn_desc"]; + if (!g_qn_desc.isArray()) { + log('Root["data"]["playurl_info"]["playurl"]["g_qn_desc"] is not array.'); + return url; + } + + JsonValue streams = playurl["stream"]; + if (!streams.isArray()) { + log('streams is not array.'); + return url; + } + + for (int s = 0; s < streams.size(); s++) { + if (streams[s]["protocol_name"].asString() != "http_hls") { + continue; + } + + JsonValue formats = streams[s]["format"]; + if (!formats.isArray()) { + continue; + } // 一些小主播不提供 fmp4,优先选择 fmp4,其次 ts - for (int a = 0; a < formats.size(); a++) { - string format_name_candidate = formats[a]["format_name"].asString(); - if (format_name_candidate == "fmp4") { - default_format = "fmp4"; - break; - } - if (format_name_candidate == "ts") { - default_format = "ts"; - } - } - if (default_format.empty()) { - log("formats(fmp4 and ts) is not exists."); - continue; - } + for (int a = 0; a < formats.size(); a++) { + string format_name_candidate = formats[a]["format_name"].asString(); + if (format_name_candidate == "fmp4") { + default_format = "fmp4"; + break; + } + if (format_name_candidate == "ts") { + default_format = "ts"; + } + } + if (default_format.empty()) { + log("formats(fmp4 and ts) is not exists."); + continue; + } - for (int f = 0; f < formats.size(); f++) { - if (formats[f]["format_name"].asString() != default_format) { - continue; - } + for (int f = 0; f < formats.size(); f++) { + if (formats[f]["format_name"].asString() != default_format) { + continue; + } - JsonValue codecs = formats[f]["codec"]; - if (!codecs.isArray()) { - continue; - } + JsonValue codecs = formats[f]["codec"]; + if (!codecs.isArray()) { + continue; + } - for (int i = 0; i < codecs.size(); i++) { - JsonValue codec = codecs[i]; + for (int i = 0; i < codecs.size(); i++) { + JsonValue codec = codecs[i]; - JsonValue qnValue = codec["accept_qn"]; - if (qnValue.isArray()) { - for (int j = 0; j < qnValue.size(); j++) { - int qn = qnValue[j].asInt(); + JsonValue qnValue = codec["accept_qn"]; + if (qnValue.isArray()) { + for (int j = 0; j < qnValue.size(); j++) { + int qn = qnValue[j].asInt(); - if (accept_qns.find(qn) < 0) { - accept_qns.insertLast(qn); - } - } - } - } - } - } + if (accept_qns.find(qn) < 0) { + accept_qns.insertLast(qn); + } + } + } + } + } + } - int best_qn = 0; - accept_qns.sortAsc(); - for (int i = 0; i < accept_qns.size(); i++) { - if (best_qn < accept_qns[i]) { - best_qn = accept_qns[i]; - } - } + int best_qn = 0; + accept_qns.sortAsc(); + for (int i = 0; i < accept_qns.size(); i++) { + if (best_qn < accept_qns[i]) { + best_qn = accept_qns[i]; + } + } + + int itag = 0; + for (int i = 0; i < accept_qns.size(); i++) { + qn = accept_qns[i]; + res = post("https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo?room_id=" + room_id + "&qn=" + accept_qns[i] + "&codec=0,1,2&format=0,1,2&mask=0&no_playurl=0&platform=web&protocol=0,1&eotf=0,1,2"); + + if (!Reader.parse(res, Root) || !Root.isObject() || Root["code"].asInt() != 0) { + return url; + } - int itag = 0; - for (int i = 0; i < accept_qns.size(); i++) { - qn = accept_qns[i]; - res = post("https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo?room_id=" + room_id + "&qn=" + accept_qns[i] + "&codec=0,1,2&format=0,1,2&mask=0&no_playurl=0&platform=web&protocol=0,1&eotf=0,1,2"); + JsonValue playurl = Root["data"]["playurl_info"]["playurl"]; + if (!playurl.isObject()) { + log('Root["data"]["playurl_info"]["playurl"] is not exists.'); + return url; + } + + g_qn_desc = playurl["g_qn_desc"]; + if (!g_qn_desc.isArray()) { + log('Root["data"]["playurl_info"]["playurl"]["g_qn_desc"] is not array.'); + return url; + } + + JsonValue streams = playurl["stream"]; + if (!streams.isArray()) { + log('streams is not array.'); + return url; + } + + for (int s = 0; s < streams.size(); s++) { + if (streams[s]["protocol_name"].asString() != "http_hls") { + continue; + } + + JsonValue formats = streams[s]["format"]; + if (!formats.isArray()) { + continue; + } + + for (int f = 0; f < formats.size(); f++) { + if (formats[f]["format_name"].asString() != default_format) { + continue; + } + + JsonValue codecs = formats[f]["codec"]; + if (!codecs.isArray()) { + continue; + } + + for (int i = 0; i < codecs.size(); i++) { + JsonValue codec = codecs[i]; + string codec_name = codec["codec_name"].asString(); + + if (codec["current_qn"].asInt() != qn) { + continue; + } + + JsonValue url_infos = codec["url_info"]; + if (!url_infos.isArray() || url_infos.size() == 0) { + continue; + } + + for (int j = 0; j < url_infos.size(); j++) { + string url_info_url = codec["url_info"][j]["host"].asString() + codec["base_url"].asString() + codec["url_info"][j]["extra"].asString(); + url_info_url = GetM3u8RealURL(url_info_url); + + if (best_qn == codec["current_qn"].asInt()) url = url_info_url; + + if (@QualityList !is null) { + for (int k = 0; k < QualityList.size(); k++) { + QualityList[i].get("url", url); + if (url == url_info_url) continue; + } + + JsonValue video_color_info = codec["video_color_info"]; + int width = codec["media_info"]["width"].asInt(); + int height = codec["media_info"]["height"].asInt(); + int bitrateVal = parseInt(HostRegExpParse(url_info_url, "(?:[?&]origin_bitrate=)(\\d+)(?:&|$)")); + string bitrate = HostFormatBitrate(bitrateVal * 1000.0) + "bps"; + bool isHDR = (codec["hdr_type"].asInt() == 1); + string format = codec_name + ", " + bitrate; + string quality = getLiveQuality(g_qn_desc, codec["current_qn"].asInt(), codec["hdr_type"].asInt(), video_color_info); + string qualityDetail; + if (j == 0) qualityDetail = quality + " - 主 "; + if (j > 0) { + string backup = " - 备 "; + if (j > 1) { + backup += j - 1; + } + qualityDetail = quality + backup; + } + if (itag <= 0 || HostExistITag(itag)) itag = HostGetITag(height, 0, true, true); + while (HostExistITag(itag)) itag++; + HostSetITag(itag); + + QualityListItem item; + + item.url = url_info_url; + item.bitrateVal = bitrateVal; + item.bitrate = bitrate; + item.resolution = width + "x" + height; + ; + item.isHDR = isHDR; + item.format = format; + item.quality = quality; + item.qualityDetail = qualityDetail; + item.itag = itag; + + QualityList.insertLast(item.toDictionary()); + } + } + } + } + } + } + + log("url", url); + // log("Quality items", QualityList.length()); + // for (uint i = 0; i < QualityList.length(); i++) { + // log("QualityList[" + i + "] = " + string(QualityList[i]["quality"]) + " | " + int(QualityList[i]["itag"]) + " | " + string(QualityList[i]["url"])); + // } + return url; +} + +string Audio(const string&in path, dictionary& MetaData, array& QualityList) { + string id = HostRegExpParse(path, "/audio/au([0-9]+)"); + JsonReader Reader; + JsonValue Root; + string url; + string res; + + res = post("https://www.bilibili.com/audio/music-service-c/web/song/info?sid=" + id); + res = HostDecompress(res); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return ""; + } + JsonValue data = Root["data"]; + MetaData["title"] = data["title"].asString(); + MetaData["thumbnail"] = data["cover"].asString(); + if (data["author"].isString()) { + MetaData["author"] = data["author"].asString(); + } + } + + status = 6; + res = post("https://www.bilibili.com/audio/music-service-c/web/url?privilege=2&quality=2&sid=" + id); + res = HostDecompress(res); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return ""; + } + JsonValue data = Root["data"]["cdns"]; + if (data.isArray()) { + return data[0].asString(); + } + } + return url; +} + +array watchlater() { + array videos; + string res = apiPost("/x/v2/history/toview"); + JsonReader Reader; + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue data = Root["data"]["list"]; + if (data.isArray()) { + for (int i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + if (item.isObject()) { + dictionary video; + int p = item["page"]["page"].asInt(); + if (p == 1) { + video["title"] = item["title"].asString(); + } else { + video["title"] = item["title"].asString() + " | " + item["page"]["part"].asString(); + } + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?p=" + p; + video["thumbnail"] = item["pic"].asString(); + video["author"] = item["owner"]["name"].asString(); + videos.insertLast(video); + } + } + } + } + } + return videos; +} + +array History() { + array videos; + uint max = 0; + uint ps = 20; + string res = apiPost("/x/web-interface/history/cursor?max=" + max + "&ps=" + ps); + JsonReader Reader; + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue data = Root["data"]["list"]; + if (data.isArray()) { + for (int i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + string type = item["history"]["business"].asString(); + // archive live pgc + if (type == "archive" || type == "live") { + if (item.isObject()) { + dictionary video; + video["thumbnail"] = item["cover"].asString(); + video["author"] = item["author_name"].asString(); + if (type == "live") { + if (item["live_status"].asInt() != 1) { + continue; + } + video["title"] = "直播 | " + item["title"].asString(); + video["url"] = item["uri"].asString(); + } else if (type == "archive") { + int p = item["history"]["page"].asInt(); + if (p == 1) { + video["title"] = item["title"].asString(); + } else { + video["title"] = item["title"].asString() + " | " + item["history"]["part"].asString(); + } + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["history"]["bvid"].asString() + "?p=" + p; + } else { + continue; + } + videos.insertLast(video); + } + } + } + } + } + } + return videos; +} + +array spaceSeason(string path) { + array videos; + int page_size = 20; + int page_num = 1; + string uid = HostRegExpParse(path, "/([0-9]+)/lists"); + string sid = HostRegExpParse(path, "lists/([0-9]+)"); + string baseurl; + bool isCollection = parse(path, "type") == "season"; + if (isCollection) { + baseurl = "/x/polymer/web-space/seasons_archives_list?mid=" + uid + "&season_id=" + sid + "&sort_reverse=" + parse(path, "sort_reverse", "false") + "&page_size=" + page_size; + while (true) { + string url; + url = baseurl + "&page_num=" + page_num; + string res = apiPost(url); + JsonReader Reader; + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue data = Root["data"]["archives"]; + if (data.isArray()) { + for (int i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + if (item.isObject()) { + dictionary video; + video["title"] = item["title"].asString(); + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + video["thumbnail"] = item["pic"].asString(); + video["date"] = UnixTimeToDateTime(item["pubdate"].asInt64()); + videos.insertLast(video); + } + } + } + JsonValue page = Root["data"]["page"]; + if (page["page_num"].asInt() * page["page_size"].asInt() >= page["total"].asInt()) { + break; + } + page_num += 1; + } else { + return videos; + } + } + } + } else { + baseurl = "/x/polymer/web-space/seasons_series_list?mid=" + uid + "&page_size=" + page_size; + while (true) { + string url; + url = baseurl + "&page_num=" + page_num; + string res = apiPost(url); + JsonReader Reader; + JsonValue Root; + Reader.parse(res, Root); + JsonValue seasons_lists = Root["data"]["items_lists"]["seasons_list"]; + if (seasons_lists.isArray()) { + for (int j = 0; j < seasons_lists.size(); j++) { + JsonValue seasons_list = seasons_lists[j]; + string title = seasons_list["meta"]["name"].asString(); + JsonValue data = seasons_list["archives"]; + if (data.isArray()) { + for (int i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + if (item.isObject()) { + dictionary video; + video["title"] = "【" + title + "】-" + item["title"].asString(); + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + video["thumbnail"] = item["pic"].asString(); + video["date"] = UnixTimeToDateTime(item["pubdate"].asInt64()); + videos.insertLast(video); + } + } + } + } + } + JsonValue page = Root["data"]["items_lists"]["page"]; + if (page["page_num"].asInt() * page["page_size"].asInt() >= page["total"].asInt()) { + break; + } + page_num += 1; + } + } - if (!Reader.parse(res, Root) || !Root.isObject() || Root["code"].asInt() != 0) { - return url; - } + return videos; +} - JsonValue playurl = Root["data"]["playurl_info"]["playurl"]; - if (!playurl.isObject()) { - log('Root["data"]["playurl_info"]["playurl"] is not exists.'); - return url; - } +array spaceVideo(string path) { + array videos; + int ps = 50; + int page = parseInt(parse(path, "pn", "1")); + int pn = page; + string baseurl = "/x/space/wbi/arc/search?"; + string params1; + string params2; + params1 += "keyword=" + parse(path, "keyword"); + params1 += "&mid=" + HostRegExpParse(path, "/([0-9]+)"); + params1 += "&order=" + parse(path, "order", "pubdate"); + + params2 += "&ps=" + ps; + params2 += "&tid=" + parse(path, "tid", "0"); + while (true) { + if (pn - page >= 10) { + break; + } + string params = params1 + "&pn=" + pn + params2; + string url = baseurl + encWbi(params); + string res = apiPost(url); + JsonReader Reader; + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue data = Root["data"]["list"]["vlist"]; + if (data.isArray()) { + for (int i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + if (item.isObject()) { + dictionary video; + video["title"] = item["title"].asString(); + video["duration"] = parseTime(item["length"].asString()); + video["thumbnail"] = item["pic"].asString(); + video["author"] = item["author"].asString(); + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + if (!item["description"].asString().empty() || item["description"].asString() != "-") video["content"] = item["description"].asString(); + video["viewCount"] = item["play"].asString(); + video["date"] = UnixTimeToDateTime(item["created"].asInt64()); + videos.insertLast(video); + } + } + } + JsonValue page = Root["data"]["page"]; + if (page["pn"].asInt() * page["ps"].asInt() >= page["count"].asInt()) { + break; + } + pn += 1; + } else { + return videos; + } + } + } + return videos; +} - g_qn_desc = playurl["g_qn_desc"]; - if (!g_qn_desc.isArray()) { - log('Root["data"]["playurl_info"]["playurl"]["g_qn_desc"] is not array.'); - return url; - } +array spaceAudio(string path) { + array audios; + int ps = 50; + int pn = 1; + string baseurl = "/audio/music-service/web/song/upper?"; + baseurl += "uid=" + HostRegExpParse(path, "/([0-9]+)"); + baseurl += "&ps=" + ps; + baseurl += "&order=" + parse(path, "order", "1"); + while (true) { + string url = baseurl + "&pn=" + pn; + string res = apiPost(url); + JsonReader Reader; + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue data = Root["data"]["data"]; + if (data.isArray()) { + for (int i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + if (item.isObject()) { + dictionary audio; + audio["title"] = item["title"].asString(); + audio["duration"] = item["duration"].asInt() * 1000; + audio["url"] = "https://www.bilibili.com/audio/au" + item["id"].asString(); + audio["thumbnail"] = item["cover"].asString(); + audios.insertLast(audio); + } + } + } + if (Root["data"]["curPage"].asInt() >= Root["data"]["pageCount"].asInt()) { + break; + } + pn += 1; + } else { + return audios; + } + } + } + return audios; +} - JsonValue streams = playurl["stream"]; - if (!streams.isArray()) { - log('streams is not array.'); - return url; - } +array followingLive(uint page) { + array videos; + JsonReader Reader; + JsonValue Root; + string url = "https://api.live.bilibili.com/xlive/web-ucenter/user/following?page=" + page + "&page_size=10"; + string res = post(url); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue list = Root["data"]["list"]; + if (list.isArray()) { + for (int i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + // 未开播 + if (item["live_status"].asInt() == 0) { + return videos; + } + dictionary video; + video["title"] = item["title"].asString(); + video["url"] = "https://live.bilibili.com/" + item["roomid"].asInt(); + video["thumbnail"] = item["face"].asString(); + video["author"] = item["uname"].asString(); + videos.insertLast(video); + } + if (page < Root["data"]["totalPage"].asUInt()) { + array videos2 = followingLive(page + 1); + for (uint i = 0; i < videos2.size(); i++) { + videos.insertLast(videos2[i]); + } + } + } + } + } + return videos; +} - for (int s = 0; s < streams.size(); s++) { - if (streams[s]["protocol_name"].asString() != "http_hls") { - continue; - } - - JsonValue formats = streams[s]["format"]; - if (!formats.isArray()) { - continue; - } +array liveCategory(uint page, string cateid, string parentAreaId, uint liveRoomCount) { + array videos; + JsonReader Reader; + JsonValue Root; + string params = "platform=web&parent_area_id=" + parentAreaId + "&area_id=" + cateid + "&page=" + page; + string url = "https://api.live.bilibili.com/xlive/web-interface/v1/second/getList?" + encWbi(params); + string res = post(url); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue list = Root["data"]["list"]; + if (list.isArray()) { + for (int i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + dictionary video; + video["title"] = item["title"].asString(); + video["url"] = "https://live.bilibili.com/" + item["roomid"].asInt(); + video["thumbnail"] = item["face"].asString(); + video["author"] = item["uname"].asString(); + videos.insertLast(video); + liveRoomCount += 1; + if (liveRoomCount >= ConfigData.maxliveroom) { + return videos; + } + } + if (Root["data"]["has_more"].asBool()) { + array nextVideos = liveCategory(page + 1, cateid, parentAreaId, liveRoomCount); + for (uint i = 0; i < nextVideos.size(); i++) { + videos.insertLast(nextVideos[i]); + } + } + } + } + } + return videos; +} - for (int f = 0; f < formats.size(); f++) { - if (formats[f]["format_name"].asString() != default_format) { - continue; - } +array PopularHistory() { + array videos; + JsonReader Reader; + JsonValue Root; + string res = apiPost("/x/web-interface/popular/precious?page_size=100&page=1"); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return videos; + } + JsonValue list = Root["data"]["list"]; + if (list.isArray()) { + for (int i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + dictionary video; + video["title"] = item["title"].asString(); + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + video["thumbnail"] = item["pic"].asString(); + video["author"] = item["owner"]["name"].asString(); + videos.insertLast(video); + } + } + } + return videos; +} - JsonValue codecs = formats[f]["codec"]; - if (!codecs.isArray()) { - continue; - } +array PopularWeekly(string path) { + array videos; + JsonReader Reader; + JsonValue Root; + string num = parse(path, "num"); + if (num.empty()) { + string res = apiPost("/x/web-interface/popular/series/list"); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return videos; + } + JsonValue list = Root["data"]["list"]; + if (list.isArray()) { + num = "" + list[0]["number"].asInt(); + } + } + } + string res = apiPost("/x/web-interface/popular/series/one?number=" + num); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return videos; + } + JsonValue list = Root["data"]["list"]; + if (list.isArray()) { + for (int i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + dictionary video; + video["title"] = item["title"].asString(); + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + video["thumbnail"] = item["pic"].asString(); + video["author"] = item["owner"]["name"].asString(); + videos.insertLast(video); + } + } + } + return videos; +} - for (int i = 0; i < codecs.size(); i++) { - JsonValue codec = codecs[i]; - string codec_name = codec["codec_name"].asString(); +array Ranking(string path) { + array videos; + + array names = { "全站", "国创相关", "动画", "音乐", "舞蹈", "游戏", "知识", "科技", "运动", "汽车", "生活", "美食", "动物圈", "鬼畜", "时尚", "娱乐", "影视" }; + array urls = { "www.bilibili.com/v/popular/rank/all", "www.bilibili.com/v/popular/rank/guochuang", "www.bilibili.com/v/popular/rank/douga", "www.bilibili.com/v/popular/rank/music", "www.bilibili.com/v/popular/rank/dance", "www.bilibili.com/v/popular/rank/game", "www.bilibili.com/v/popular/rank/knowledge", "www.bilibili.com/v/popular/rank/tec", "www.bilibili.com/v/popular/rank/spor", "www.bilibili.com/v/popular/rank/car", "www.bilibili.com/v/popular/rank/life", "www.bilibili.com/v/popular/rank/food", "www.bilibili.com/v/popular/rank/animal", "www.bilibili.com/v/popular/rank/kichiku", "www.bilibili.com/v/popular/rank/fashion", "www.bilibili.com/v/popular/rank/en", "www.bilibili.com/v/popular/rank/cinephile" }; + array ids = { 0, 168, 1, 3, 129, 4, 36, 188, 234, 223, 160, 211, 217, 119, 155, 5, 181 }; + int pos = -1; + for (uint i = 0; i < urls.size(); i++) { + if (path.find(urls[i]) >= 0) { + pos = i; + break; + } + } + if (pos < 0) { + return videos; + } - if (codec["current_qn"].asInt() != qn) { - continue; - } + JsonReader Reader; + JsonValue Root; - JsonValue url_infos = codec["url_info"]; - if (!url_infos.isArray() || url_infos.size() == 0) { - continue; - } + string res = apiPost("/x/web-interface/ranking/v2?rid=" + ids[pos]); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return videos; + } + JsonValue list = Root["data"]["list"]; + if (list.isArray()) { + for (int i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + dictionary video; + video["title"] = item["title"].asString(); + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + video["thumbnail"] = item["pic"].asString(); + video["author"] = item["owner"]["name"].asString(); + videos.insertLast(video); + } + } + } + return videos; +} - for (int j = 0; j < url_infos.size(); j++) { - string url_info_url = codec["url_info"][j]["host"].asString() + codec["base_url"].asString() + codec["url_info"][j]["extra"].asString(); - url_info_url = GetM3u8RealURL(url_info_url); - - if (best_qn == codec["current_qn"].asInt()) url = url_info_url; +array Dynamic(uint tid) { + array videos; + JsonReader Reader; + JsonValue Root; + string res = apiPost("/x/web-interface/dynamic/region?pn=1&ps=50&rid=" + tid); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return videos; + } + JsonValue list = Root["data"]["archives"]; + if (list.isArray()) { + for (int i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + dictionary video; + video["title"] = item["title"].asString(); + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + video["thumbnail"] = item["pic"].asString(); + video["author"] = item["owner"]["name"].asString(); + videos.insertLast(video); + } + } + } + return videos; +} - if (@QualityList !is null) { - for (int k = 0; k < QualityList.size(); k++) { - QualityList[i].get("url", url); - if (url == url_info_url) continue; - } - - JsonValue video_color_info = codec["video_color_info"]; - string quality = getLiveQuality(g_qn_desc, codec["current_qn"].asInt(), codec["hdr_type"].asInt(), video_color_info); - - string qualityDetail; - if (j == 0) qualityDetail = quality + " - 主 "; - if (j > 0) { - string backup = " - 备 "; - if (j > 1) { - backup += j - 1; - } - qualityDetail = quality + backup; - } - - int width = codec["media_info"]["width"].asInt(); - int height = codec["media_info"]["height"].asInt(); - string resolution = width + "x" + height; - - int bitrateVal = parseInt(HostRegExpParse(url_info_url, "(?:[?&]origin_bitrate=)(\\d+)(?:&|$)")); - string bitrate = HostFormatBitrate(bitrateVal * 1000.0) + "bps"; - - string format = codec_name + ", " + bitrate; - if (itag <= 0 || HostExistITag(itag)) itag = HostGetITag(height, 0, true, true); - while (HostExistITag(itag)) itag++; - HostSetITag(itag); - - QualityListItem item; - - item.itag = itag; - item.url = url_info_url; - item.quality = quality; - item.qualityDetail = qualityDetail; - item.bitrateVal = bitrateVal; - item.bitrate = HostFormatBitrate(item.bitrateVal * 1000.0) + "bps"; - item.format = format; - item.resolution = resolution; - item.isHDR = (codec["hdr_type"].asInt() == 1); - - QualityList.insertLast(item.toDictionary()); - } - } - } - } - } - } +array Search(string path) { + array videos; + JsonReader Reader; + JsonValue Root; + string kw; + if (path.find("?WithCaption") >= 0) { + path.replace("?WithCaption", ""); + kw = HostUrlEncode(parse(path, "keyword")); + } else { + kw = parse(path, "keyword"); + } + if (kw.empty()) { + return videos; + } + string type = HostRegExpParse(path, "search.bilibili.com/([a-zA-Z0-9]+)"); + string url; + if (type == "all") { + url = "/x/web-interface/search/all/v2?keyword=" + kw; + } else if (type == "video") { + url = "/x/web-interface/search/type?search_type=video&keyword=" + kw; + } else { + return videos; + } + string res = apiPost(url); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return videos; + } + JsonValue list; + if (type == "all") { + for (int i = 0; i < Root["data"]["result"].size(); i++) { + if (Root["data"]["result"][i]["result_type"].asString() == "video") { + list = Root["data"]["result"][i]["data"]; + break; + } + } + } else if (type == "video") { + list = Root["data"]["result"]; + } else { + return videos; + } + for (int i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + dictionary video; + string title = item["title"].asString(); + title.replace("", ''); + title.replace("", ''); + video["title"] = title; + video["content"] = title; + video["duration"] = parseTime(item["duration"].asString()); + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + video["thumbnail"] = "https:" + item["pic"].asString(); + video["author"] = item["author"].asString(); + videos.insertLast(video); + } + } + return videos; +} - log("url", url); - // log("Quality items", QualityList.length()); - // for (uint i = 0; i < QualityList.length(); i++) { - // log("QualityList[" + i + "] = " + string(QualityList[i]["quality"]) + " | " + int(QualityList[i]["itag"]) + " | " + string(QualityList[i]["url"])); - // } - return url; -} - -bool isPlaylist(const string &in path) { - string bvid = parseBVId(path); - string aid = parseAVId(path); - string params; - if (!bvid.empty()) params += "bvid=" + bvid; - if (!aid.empty()) params += "aid=" + aid; - if (bvid.empty() && aid.empty()) return false; - - string res = apiPost("/x/web-interface/wbi/view/detail?" + params + "&w_rid=" + encWbi(params)); - - JsonReader Reader; - JsonValue Root; - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue redirect_url = Root["data"]["View"]["redirect_url"]; - if (redirect_url.isString() && redirect_url.asString().find("bangumi/play/ep") >= 0) { - videoIsUGCorPGC.isPGC = true; - videoIsUGCorPGC.pgcURL = redirect_url.asString(); - return true; - } - if (Root["data"]["View"]["ugc_season"].isObject()) { - videoIsUGCorPGC.isUGCSeason = true; - return true; - } - } else { - log("Video view API code != 0", Root["code"].asInt()); - log("Video view API message", Root["message"].asString()); - } - } - return false; +array webDynamic(string path) { + array videos; + JsonReader Reader; + JsonValue Root; + string type = parse(path, "tab"); + if (type != "video") { + type = "all"; + } + int nums = 5; + string offset; + string baseurl = "/x/polymer/web-dynamic/v1/feed/all?timezone_offset=-480&type=" + type; + for (int i = 1; i <= nums; i++) { + string url = baseurl + "&page=" + i; + if (!offset.empty()) { + url += "&offset=" + offset; + } + string res = apiPost(url); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return videos; + } + JsonValue list = Root["data"]["items"]; + if (list.isArray()) { + offset = Root["data"]["offset"].asString(); + for (int j = 0; j < list.size(); j++) { + JsonValue dynamic = list[j]["modules"]["module_dynamic"]; + if (dynamic.isObject()) { + JsonValue major = dynamic["major"]; + if (!major.isObject()) { + continue; + } + string author = list[j]["modules"]["module_author"]["name"].asString(); + JsonValue archive = major["archive"]; + if (archive.isObject()) { + if (archive["bvid"].isString() && !archive["bvid"].asString().empty()) { + string bvid = archive["bvid"].asString(); + dictionary video; + video["title"] = "视频 | " + archive["title"].asString(); + video["duration"] = parseTime(archive["duration_text"].asString()); + video["url"] = "https://www.bilibili.com/video/" + bvid; + video["thumbnail"] = archive["cover"].asString(); + video["author"] = author; + videos.insertLast(video); + } + continue; + } + JsonValue live_rcmd = major["live_rcmd"]; + if (live_rcmd.isObject()) { + string content_str = live_rcmd["content"].asString(); + JsonValue content; + if (Reader.parse(content_str, content) && content.isObject()) { + if (content["live_play_info"]["live_status"].asInt() == 1) { + dictionary live; + live["title"] = "直播 | " + content["live_play_info"]["title"].asString(); + live["url"] = "https://live.bilibili.com/" + content["live_play_info"]["room_id"].asString(); + live["thumbnail"] = content["live_play_info"]["cover"].asString(); + live["author"] = author; + videos.insertLast(live); + } + } + continue; + } + } + } + if (!Root["data"]["has_more"].asBool()) { + break; + } + } + } + } + return videos; } -bool PlayitemCheck(const string &in path) { - log("PlayitemCheck - path", path); - status = 1; +array Recommend(uint page) { + array videos; + JsonReader Reader; + JsonValue Root; + const uint nums = 5; + string url = "/x/web-interface/wbi/index/top/feed/rcmd?y_num=3&fresh_type=4&feed_version=V8&fresh_idx_1h=" + page + "&fetch_row=" + (3 * page + 1) + "&fresh_idx=" + page + "&brush=" + page + "&homepage_ver=1&ps=12&last_y_num=4&outside_trigger="; + string res = apiPost(url); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return videos; + } + JsonValue list = Root["data"]["item"]; + if (list.isArray()) { + for (int i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + if (item["bvid"].asString().empty()) { + continue; + } + dictionary video; + video["thumbnail"] = item["pic"].asString(); + video["author"] = item["owner"]["name"].asString(); + if (item["uri"].asString().find("live.bilibili.com") >= 0) { + video["title"] = "直播 | " + item["title"].asString(); + video["url"] = item["uri"].asString(); + } else { + video["title"] = item["title"].asString(); + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = item["uri"].asString(); + } + videos.insertLast(video); + } + } + } + if (page < nums) { + array videos2 = Recommend(page + 1); + for (uint i = 0; i < videos2.size(); i++) { + videos.insertLast(videos2[i]); + } + } + return videos; +} - if (path.find("bilibili.com") < 0) { - return false; - } +bool PlayitemCheck(const string&in path) { + // log("PlayitemCheck - path", path); + status = 1; - if (path.find("/video/BV") >= 0) { - return true; - } - if (path.find("/video/av") >= 0) { - return true; - } + if (path.find("bilibili.com") < 0) { + return false; + } - if (path.find("live.bilibili.com") >= 0) { - return true; - } - if (path.find("www.bilibili.com/audio/au") >= 0) { - return true; - } - log("PlayitemCheck", "false"); - return false; + if (path.find("/video/BV") >= 0) { + return true; + } + if (path.find("/video/av") >= 0) { + return true; + } + + if (path.find("/bangumi/media/md") >= 0) { + return true; + } + if (path.find("/bangumi/play/") >= 0) { + return true; + } + if (path.find("live.bilibili.com") >= 0) { + return true; + } + if (path.find("www.bilibili.com/audio/au") >= 0) { + return true; + } + // log("PlayitemCheck", "false"); + return false; } -bool PlaylistCheck(const string &in path) { - log("PlaylistCheck - path: ", path); - status = 2; - if (path.find("bilibili.com") < 0) { - return false; - } - if (isPlaylist(path)) { - return true; - } - if (!parseBVId(path).empty() || !parseAVId(path).empty()) { - return true; - } - if (path.find("search.bilibili.com") >= 0) { - return true; - } - if (path.find("/watchlater") >= 0) { - return true; - } - if (path.find("/account/history") >= 0) { - return true; - } - if (path.find("space.bilibili.com") >= 0) { - if (path.find("/video") >= 0) { - return true; - } - else if (path.find("/audio") >= 0) { - return true; - } - else if (path.find("/favlist") >= 0) { - return true; - } - else if (path.find("lists") >= 0) { - return true; - } - else if (HostRegExpParse(path, "/([0-9]+)/[a-zA-Z0-9]").empty()) { - return true; - } - else { - return false; - } - } - if (path.find("/medialist/detail/ml") >= 0) { - return true; - } - if (path.find("link.bilibili.com") >= 0 && path.find("/user-center/follow") >= 0) { - return true; - } - if(path.find("live.bilibili.com") >= 0){ - if(path.find("areaId") >= 0 || path.find("lol") >= 0 || path.find("hpjy") >= 0){ - return true; - } - } - if (path.find("www.bilibili.com") >= 0 && HostRegExpParse(path, "www.bilibili.com/([a-zA-Z0-9]+)").empty()) { - return true; - } - if (path.find("bangumi/media/md") >= 0) { - return true; - } - if (path.find("bangumi/play/") >= 0) { - log("PlaylistCheck - bangumi/play/"); - return true; - } - if (path.find("www.bilibili.com/v/popular/rank") >= 0) { - return true; - } - if (path.find("www.bilibili.com/v/popular/history") >= 0) { - return true; - } - if (path.find("www.bilibili.com/v/popular/weekly") >= 0) { - return true; - } - if (gettid(path) > 0) { - return true; - } - if (path.find("www.bilibili.com/audio/am") >= 0) { - return true; - } - if (path.find("t.bilibili.com") >= 0) { - return true; - } +bool PlaylistCheck(const string&in path) { + // log("PlaylistCheck - path", path); + status = 2; + if (path.find("bilibili.com") < 0) { + return false; + } + if (isPlaylist(path)) { + return true; + } + if (!parseBVId(path).empty() || !parseAVId(path).empty()) { + return true; + } + if (path.find("search.bilibili.com") >= 0) { + return true; + } + if (path.find("/watchlater") >= 0) { + return true; + } + if (path.find("/account/history") >= 0) { + return true; + } + if (path.find("space.bilibili.com") >= 0) { + if (path.find("/video") >= 0) { + return true; + } else if (path.find("/audio") >= 0) { + return true; + } else if (path.find("/favlist") >= 0) { + return true; + } else if (path.find("lists") >= 0) { + return true; + } else if (HostRegExpParse(path, "/([0-9]+)/[a-zA-Z0-9]").empty()) { + return true; + } else { + return false; + } + } + if (path.find("/medialist/detail/ml") >= 0) { + return true; + } + if (path.find("link.bilibili.com") >= 0 && path.find("/user-center/follow") >= 0) { + return true; + } + if (path.find("live.bilibili.com") >= 0) { + if (path.find("areaId") >= 0 || path.find("lol") >= 0 || path.find("hpjy") >= 0) { + return true; + } + } + if (path.find("www.bilibili.com") >= 0 && HostRegExpParse(path, "www.bilibili.com/([a-zA-Z0-9]+)").empty()) { + return true; + } + if (path.find("bangumi/media/md") >= 0) { + return true; + } + if (path.find("bangumi/play/") >= 0) { + return true; + } + if (path.find("www.bilibili.com/v/popular/rank") >= 0) { + return true; + } + if (path.find("www.bilibili.com/v/popular/history") >= 0) { + return true; + } + if (path.find("www.bilibili.com/v/popular/weekly") >= 0) { + return true; + } + if (gettid(path) > 0) { + return true; + } + if (path.find("www.bilibili.com/audio/am") >= 0) { + return true; + } + if (path.find("t.bilibili.com") >= 0) { + return true; + } - log("PlaylistCheck", "false"); - return false; + // log("PlaylistCheck", "false"); + return false; } -array PlaylistParse(const string &in url) { - string path = url; - log("PlaylistParse - path", path); - status = 3; - array result; +array PlaylistParse(const string&in url) { + string path = url; + // log("PlaylistParse - path", path); + status = 3; + array result; - if (videoIsUGCorPGC.isPGC) path = videoIsUGCorPGC.pgcURL; - if (videoIsUGCorPGC.isUGCSeason) return UGCSeason(path); + if (videoIsUGCorPGC.isPGC) path = videoIsUGCorPGC.pgcURL; + if (videoIsUGCorPGC.isUGCSeason) return UGCSeason(path); - string bvid = parseBVId(path); - if (!bvid.empty()) { - return RelatedVideos(path); - } - string avid = parseAVId(path); - if (!avid.empty()) { - return RelatedVideos(path); - } - if (path.find("/watchlater") >= 0) { - return watchlater(); - } - if (path.find("/account/history") >= 0) { - return History(); - } - if (path.find("search.bilibili.com") >= 0) { - return Search(path); - } - if (path.find("space.bilibili.com") >= 0) { - if (path.find("/video") >= 0) { - return spaceVideo(path); - } - else if (path.find("/audio") >= 0) { - return spaceAudio(path); - } - else if (path.find("/favlist") >= 0) { - return FavList(path); - } - else if (path.find("lists") >= 0) { - return Channel(path); - } - else if (HostRegExpParse(path, "/([0-9]+)/[a-zA-Z0-9]").empty()) { - return spaceVideo(path); - } - } - if (path.find("/medialist/detail/ml") >= 0) { - return FavList(path); - } - if (path.find("link.bilibili.com") >= 0 && path.find("/user-center/follow") >= 0) { - return followingLive(1); - } - if(path.find("live.bilibili.com") >= 0) { - if(path.find("areaId") >= 0){ - return liveCategory(1,HostRegExpParse(path, "areaId=([0-9]+)"), HostRegExpParse(path, "parentAreaId=([0-9]+)"), 0); - } - if(path.find("lol") >= 0){ - return liveCategory(1,"86","2", 0); - } - if(path.find("hpjy") >= 0){ - return liveCategory(1,"256","3", 0); - } - } - if (path.find("www.bilibili.com") >= 0 && HostRegExpParse(path, "www.bilibili.com/([a-zA-Z0-9]+)").empty()) { - return Recommend(1); - } - if (path.find("bangumi/media/md") >= 0) { - return Banggumi(HostRegExpParse(path, "bangumi/media/md([0-9]+)"), "media_id"); - } - if (path.find("bangumi/play/ep") >= 0) { - return Banggumi(HostRegExpParse(path, "bangumi/play/ep([0-9]+)"), "ep_id"); - } - if (path.find("bangumi/play/ss") >= 0) { - return Banggumi(HostRegExpParse(path, "bangumi/play/ss([0-9]+)"), "season_id"); - } - if (path.find("www.bilibili.com/v/popular/rank") >= 0) { - return Ranking(path); - } - if (path.find("www.bilibili.com/v/popular/history") >= 0) { - return PopularHistory(); - } - if (path.find("www.bilibili.com/v/popular/weekly") >= 0) { - return PopularWeekly(path); - } - if (path.find("www.bilibili.com/audio/am") >= 0) { - return AudioList(path); - } - uint tid = gettid(path); - if (tid > 0) { - return Dynamic(tid); - } - if (path.find("t.bilibili.com") >= 0) { - return webDynamic(path); - } + string bvid = parseBVId(path); + if (!bvid.empty()) { + return RelatedVideos(path); + } + string avid = parseAVId(path); + if (!avid.empty()) { + return RelatedVideos(path); + } + if (path.find("/watchlater") >= 0) { + return watchlater(); + } + if (path.find("/history") >= 0) { + return History(); + } + if (path.find("search.bilibili.com") >= 0) { + return Search(path); + } + if (path.find("space.bilibili.com") >= 0) { + if (path.find("/video") >= 0) { + return spaceVideo(path); + } else if (path.find("/audio") >= 0) { + return spaceAudio(path); + } else if (path.find("/favlist") >= 0) { + return FavList(path); + } else if (path.find("lists") >= 0) { + return spaceSeason(path); + } else if (HostRegExpParse(path, "/([0-9]+)/[a-zA-Z0-9]").empty()) { + return spaceVideo(path); + } + } + if (path.find("/medialist/detail/ml") >= 0) { + return FavList(path); + } + if (path.find("link.bilibili.com") >= 0 && path.find("/user-center/follow") >= 0) { + return followingLive(1); + } + if (path.find("live.bilibili.com") >= 0) { + if (path.find("areaId") >= 0) { + return liveCategory(1, HostRegExpParse(path, "areaId=([0-9]+)"), HostRegExpParse(path, "parentAreaId=([0-9]+)"), 0); + } + if (path.find("lol") >= 0) { + return liveCategory(1, "86", "2", 0); + } + if (path.find("hpjy") >= 0) { + return liveCategory(1, "256", "3", 0); + } + } + if (path.find("www.bilibili.com") >= 0 && HostRegExpParse(path, "www.bilibili.com/([a-zA-Z0-9]+)").empty()) { + return Recommend(1); + } + if (path.find("bangumi/media/md") >= 0) { + return BangumiEpisodes(parseMDId(path), "media_id"); + } + if (path.find("bangumi/play/ep") >= 0) { + return BangumiEpisodes(parseEPId(path), "ep_id"); + } + if (path.find("bangumi/play/ss") >= 0) { + return BangumiEpisodes(parseSSId(path), "season_id"); + } + if (path.find("www.bilibili.com/v/popular/rank") >= 0) { + return Ranking(path); + } + if (path.find("www.bilibili.com/v/popular/history") >= 0) { + return PopularHistory(); + } + if (path.find("www.bilibili.com/v/popular/weekly") >= 0) { + return PopularWeekly(path); + } + if (path.find("www.bilibili.com/audio/am") >= 0) { + return AudioList(path); + } + uint tid = gettid(path); + if (tid > 0) { + return Dynamic(tid); + } + if (path.find("t.bilibili.com") >= 0) { + return webDynamic(path); + } - return result; + return result; } -string PlayitemParse(const string &in path, dictionary &MetaData, array &QualityList) { - log("PlayitemParse - path", path); - status = 4; +string PlayitemParse(const string&in path, dictionary& MetaData, array& QualityList) { + // log("PlayitemParse - path", path); + status = 4; - if (path.find("/video/BV") >= 0 ) { - string bvid = parseBVId(path); - return Video(bvid, path, MetaData, QualityList); - } - if (path.find("/video/av") >= 0) { - string aid = parseAVId(path); - return Video(aid, path, MetaData, QualityList); - } - if (path.find("live.bilibili.com") >= 0) { - string id = HostRegExpParse(path, "live.bilibili.com/([0-9]+)"); - if (!id.empty()) { - return Live(id, path, MetaData, QualityList); - } - } - if (path.find("www.bilibili.com/audio/au") >= 0) { - return Audio(path, MetaData, QualityList); - } + if (path.find("/video/BV") >= 0) { + string bvid = parseBVId(path); + return Video(bvid, path, MetaData, QualityList); + } + if (path.find("/video/av") >= 0) { + string aid = parseAVId(path); + return Video(aid, path, MetaData, QualityList); + } + if (path.find("bangumi/media/md") >= 0) { + return Bangumi(path, MetaData, QualityList); + } + if (path.find("bangumi/play") >= 0) { + return Bangumi(path, MetaData, QualityList); + } + if (path.find("live.bilibili.com") >= 0) { + string id = HostRegExpParse(path, "live.bilibili.com/([0-9]+)"); + if (!id.empty()) { + return Live(id, path, MetaData, QualityList); + } + } + if (path.find("www.bilibili.com/audio/au") >= 0) { + return Audio(path, MetaData, QualityList); + } - return path; + return path; } \ No newline at end of file diff --git a/README.md b/README.md index 007f857..ab5790b 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ ### 🔧 整体优化 - 本地缓存响应数据,降低 API 请求次数。可在配置文件中设置,默认300s。 -- 清理无用代码。 +- 清理无用代码,较为激进,有问题请提issue。 - 换用新的 itag 选择机制。 ### 📺 直播 @@ -68,20 +68,6 @@ 一些问题的解决办法,[wiki](https://github.com/frostnotfall/BilibiliPotPlayer/wiki/%E4%B8%80%E4%BA%9B%E5%8F%AF%E8%83%BD%E7%9A%84%E9%97%AE%E9%A2%98%E5%8F%8A%E9%83%A8%E5%88%86%E8%A7%A3%E5%86%B3%E5%8A%9E%E6%B3%95) -## 油猴脚本 - -由于从 PotPlayer 内部实现精准空降存在一定难度[1](#关于精准空降),因此目前采用外部油猴脚本的方式实现其功能。 - -目前修改版脚本 [BilibiliPotPlayer-改](https://greasyfork.org/zh-CN/scripts/593353-bilibilipotplayer-改) 支持: - -* **精准空降**:将网页端指定的播放时间传递给 PotPlayer,实现精准跳转。 - -* **打开 PotPlayer 时自动暂停网页端视频**:启动 PotPlayer 播放后,自动暂停 Bilibili 网页端正在播放的视频,避免音视频重复播放。 - -### 油猴脚本声明 - -修改版脚本 `BilibiliPotPlayer-改` [https://greasyfork.org/zh-CN/scripts/593353-bilibilipotplayer-改](https://greasyfork.org/zh-CN/scripts/593353-bilibilipotplayer-%E6%94%B9)) 基于`原版油猴脚本` [油猴脚本https://greasyfork.org/zh-CN/scripts/461800-bilibilipotplayer](https://greasyfork.org/zh-CN/scripts/461800-bilibilipotplayer),并保留原作者及原项目相关信息。如原作者对本脚本的发布或再分发存在异议,并要求停止发布,本人将配合下架本脚本。 - ## 安装插件 [下载项目](https://github.com/frostnotfall/BilibiliPotPlayer/archive/refs/heads/master.zip) @@ -164,14 +150,17 @@ ## 油猴脚本 -由于从 PotPlayer 内部实现精准空降存在一定难度[2](#关于精准空降),因此目前采用外部油猴脚本的方式实现其功能。 +由于从 PotPlayer 内部实现精准空降存在一定难度[1](#关于精准空降),因此目前采用外部油猴脚本的方式实现其功能。 目前修改版脚本 [BilibiliPotPlayer-改](https://greasyfork.org/zh-CN/scripts/593353-bilibilipotplayer-改) 支持: * **精准空降**:将网页端指定的播放时间传递给 PotPlayer,实现精准跳转。 * **打开 PotPlayer 时自动暂停网页端视频**:启动 PotPlayer 播放后,自动暂停 Bilibili 网页端正在播放的视频,避免音视频重复播放。 -对本脚本的发布或再分发存在异议,并要求停止发布,本人将配合下架本脚本。 + +### 油猴脚本声明 + +修改版脚本 `BilibiliPotPlayer-改` [https://greasyfork.org/zh-CN/scripts/593353-bilibilipotplayer-改](https://greasyfork.org/zh-CN/scripts/593353-bilibilipotplayer-%E6%94%B9)) 基于`原版油猴脚本` [油猴脚本https://greasyfork.org/zh-CN/scripts/461800-bilibilipotplayer](https://greasyfork.org/zh-CN/scripts/461800-bilibilipotplayer),并保留原作者及原项目相关信息。如原作者对本脚本的发布或再分发存在异议,并要求停止发布,本人将配合下架本脚本。 ## 关于精准空降 From 578d474530ff8eee0439f54304b82e2547387409 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Sat, 5 Sep 2026 23:03:22 +0800 Subject: [PATCH 110/132] add issue templates --- .../bug-\345\217\215\351\246\210.yml" | 53 +++++++++++++++++++ .github/ISSUE_TEMPLATE/config.yml | 1 + ...7\350\203\275\350\257\267\346\261\202.yml" | 50 +++++++++++++++++ 3 files changed, 104 insertions(+) create mode 100644 ".github/ISSUE_TEMPLATE/bug-\345\217\215\351\246\210.yml" create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 ".github/ISSUE_TEMPLATE/\345\212\237\350\203\275\350\257\267\346\261\202.yml" diff --git "a/.github/ISSUE_TEMPLATE/bug-\345\217\215\351\246\210.yml" "b/.github/ISSUE_TEMPLATE/bug-\345\217\215\351\246\210.yml" new file mode 100644 index 0000000..af995f6 --- /dev/null +++ "b/.github/ISSUE_TEMPLATE/bug-\345\217\215\351\246\210.yml" @@ -0,0 +1,53 @@ +name: Bug 反馈 +description: 报告播放或脚本相关问题 +title: "[Bug]: " +labels: + - bug + +body: + - type: textarea + id: description + attributes: + label: 问题描述 + description: 请详细描述遇到的问题,包括实际行为和预期行为。 + placeholder: | + 请描述: + - 什么情况下出现问题 + - 实际发生了什么 + - 预期应该是什么 + validations: + required: true + + - type: input + id: url + attributes: + label: 视频链接 + description: 如果是特定视频无法播放,请提供对应的 Bilibili 视频链接。 + placeholder: https://www.bilibili.com/... + validations: + required: false + + - type: input + id: potplayer + attributes: + label: PotPlayer 版本 + placeholder: 例如 250xxx + validations: + required: true + + - type: input + id: plugin + attributes: + label: BilibiliPotPlayer 版本 + description: 请填写使用的版本号或 Commit。 + placeholder: 例如 v1.0.0 或 commit SHA + validations: + required: true + + - type: textarea + id: additional + attributes: + label: 其他信息 + description: 其他可能有帮助的信息,例如日志、错误信息等。 + placeholder: | + 如有相关日志,请粘贴在这里。 \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..ec4bb38 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1 @@ +blank_issues_enabled: false \ No newline at end of file diff --git "a/.github/ISSUE_TEMPLATE/\345\212\237\350\203\275\350\257\267\346\261\202.yml" "b/.github/ISSUE_TEMPLATE/\345\212\237\350\203\275\350\257\267\346\261\202.yml" new file mode 100644 index 0000000..20726b3 --- /dev/null +++ "b/.github/ISSUE_TEMPLATE/\345\212\237\350\203\275\350\257\267\346\261\202.yml" @@ -0,0 +1,50 @@ +name: 功能请求 +description: 提议新的功能或改进 +title: "[Feature]: " +labels: + - enhancement + +body: + - type: textarea + id: feature + attributes: + label: 功能描述 + description: 请描述希望增加或改进的功能。 + placeholder: | + 请描述: + - 希望增加什么功能 + - 具体希望如何工作 + validations: + required: true + + - type: textarea + id: reason + attributes: + label: 使用场景 + description: 请说明为什么需要这个功能,以及它解决了什么问题。 + placeholder: | + 请描述具体的使用场景或遇到的问题。 + validations: + required: true + + - type: textarea + id: reference + attributes: + label: 参考信息 + description: 如果有相关项目、接口、实现方式或其他参考资料,请提供。 + placeholder: | + 可以提供: + - 相关项目 + - API 文档 + - 示例链接 + - 其他实现方案 + validations: + required: false + + - type: textarea + id: additional + attributes: + label: 其他信息 + description: 其他可能有帮助的信息。 + placeholder: | + 如有其他补充信息,请填写在这里。 \ No newline at end of file From d96c448d911763c844dd89da1b8bde724964dba8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Sun, 6 Sep 2026 00:07:23 +0800 Subject: [PATCH 111/132] update README.md --- README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ab5790b..6dfc52c 100644 --- a/README.md +++ b/README.md @@ -47,8 +47,8 @@ - 播放番剧,电视剧等其它PGC合集或用户合集时,正确定位当前视频,不会出现从第一集开始播放的问题 - 支持AV播放地址 - 优化 Bilibili 音频画质选项显示: - - `EC-3` → **杜比全景声 EC-3** - - `FLAC` → **Hi-Res 无损 FLAC** + - `EC-3` → **杜比全景声** + - `FLAC` → **Hi-Res 无损** - 当同时存在杜比全景声与Hi-Res无损时,默认使用Hi-Res无损。 - 视频与播放列表增加多项属性,如果你足够细心的话,就可以发现。 - 增加 [空降助手](https://github.com/hanydd/BilibiliSponsorBlock) 支持。通过配置文件设置,默认禁用。 @@ -58,10 +58,13 @@ - 换用新的画质选项名称生成逻辑,现在动态获取,与官方名称一致。 - 画质选项增加更多属性。 - 增加 disableAVC 和 preferHDR 设置。 +- 音频 itag 生成不再使用预定义。 +- 支持历史播放记录。(使用场景:potplayer 重新启动后直接播放或从播放列表中播放)。 +- 增加番剧官方开场动画与片尾,可与空降助手合并。 ## TODO -* ~~支持精准空降(视 PotPlayer 是否提供相关支持)~~,目前搭配油猴脚本实现。 +* ~~支持精准空降(视 PotPlayer 是否提供相关支持)~~,目前搭配[油猴脚本](#油猴脚本)实现。 * ~~支持空降助手~~。 ## wiki From af71ed4ba61d716ae529741b4a3d60347b5e6c32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Sun, 6 Sep 2026 07:44:11 +0800 Subject: [PATCH 112/132] =?UTF-8?q?1.=20=E5=A2=9E=E5=8A=A0=20=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E7=9C=9F=E5=AE=9E=20M3U8=20=E5=BC=80=E5=85=B3?= =?UTF-8?q?=E3=80=82=202.=20=E5=A2=9E=E5=8A=A0=20potplayer=20=E6=94=B6?= =?UTF-8?q?=E5=8F=91=E5=BC=B9=E5=B9=95=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 115 +++++++++++++++---- README.md | 3 +- 2 files changed, 96 insertions(+), 22 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 7054488..cd7eaba 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -128,6 +128,8 @@ class Config { int cacheValidTime = 300; bool enableSponsorBlock = false; string sponsorBlockMirror; + bool parseM3u8RealUrl = false; + string bilibiliDanmujiServer; bool disableAVC = false; bool preferHDR = false; bool debug = false; @@ -233,10 +235,13 @@ string GetStatus() { info = "解析视频信息"; break; case 5: - info = "请求空降助手接口"; + info = "解析真实播放地址"; break; case 6: - info = "解析真实播放地址"; + info = "请求空降助手接口"; + break; + case 7: + info = "解析真实M3U8地址"; break; default: info = "请等待"; @@ -245,6 +250,13 @@ string GetStatus() { return info; } +void OnFinalize() { + if (!ConfigData.bilibiliDanmujiServer.isEmpty()) { + string unixTime = formatInt(DatetimeToUnixTime(FormatDateTime(datetime()))); + post(ConfigData.bilibiliDanmujiServer + "/disconnectRoom?_=" + unixTime); + } +} + Config ReadConfigFile(string file) { Config config; uintptr fp = HostFileOpen(file); @@ -294,6 +306,12 @@ Config ReadConfigFile(string file) { if (root["sponsorBlockMirror"].isString()) { config.sponsorBlockMirror = root["sponsorBlockMirror"].asString(); } + if (root["parseM3u8RealUrl"].isBool()) { + config.parseM3u8RealUrl = root["parseM3u8RealUrl"].asBool(); + } + if (root["bilibiliDanmujiServer"].isString()) { + config.bilibiliDanmujiServer = root["bilibiliDanmujiServer"].asString(); + } if (root["disableAVC"].isBool()) { config.disableAVC = root["disableAVC"].asBool(); } @@ -447,9 +465,10 @@ string post(string url, string data = "", string headers = "", bool debug = true return HostUrlGetString(url, "", headers, data); } -string apiPost(string api, string data = "") { +string apiPost(string api, string data = "", string host=Host) { + host = host.isEmpty() ? Host : host; string key; - ; + if (!data.empty()) { key = HostRegExpRemove(HostRegExpRemove(api, "&w_rid=[^&]*"), "&wts=[^&]*") + "?" + data; } else { @@ -460,25 +479,25 @@ string apiPost(string api, string data = "") { ResponseCacheItem item; if (ResponseCache.get(key, item)) { if (HostGetTickCount() - item.tick_count <= item.valid_time) { - log("Cache Hit, url", Host + api); + log("Cache Hit, url", host + api); return item.response; } else { - log("Cache expire, url", Host + api); + log("Cache expire"); } } else { - log("Cache not Hit, url", Host + api); + log("Cache not Hit"); } - string resp = post(Host + api, data); + string resp = post(host + api, data); if (resp.empty()) { - HostMessageBox("未获取到响应数据,请等待一段时间后重试一下\nurl: " + Host + api, "请求失败"); + HostMessageBox("未获取到响应数据,请等待一段时间后重试一下\nurl: " + host + api, "请求失败"); return ""; } JsonReader Reader; JsonValue Root; if (!Reader.parse(resp, Root) || !Root.isObject()) { - HostMessageBox("未能解析响应数据\nurl: " + Host + api, "请求失败"); + HostMessageBox("未能解析响应数据\nurl: " + host + api, "请求失败"); return ""; } if (Root["code"].asInt() != 0) { @@ -672,7 +691,11 @@ string getCodec(int codecid) { } string GetM3u8RealURL(string url) { - string resp = post(url, "", "", false); + status = 7; + uint tickCount = HostGetTickCount(); + string resp = post(url, "", "", true); + HostIncTimeOut(HostGetTickCount() - tickCount); + array lines = resp.split("\n"); for (uint i = 0; i < lines.size(); i++) { @@ -689,6 +712,7 @@ string GetM3u8RealURL(string url) { } } + status = 5; return url; } @@ -857,7 +881,7 @@ string getVideoQuality(JsonValue support_formats, int quality) { } void AppenVideoQualityList(string bvid, string aid, string cid, string& url, array& QualityList) { - status = 6; + status = 5; int qn = 127; string params; @@ -1508,6 +1532,45 @@ JsonValue SortVideos(JsonValue& videos) { return sortedVideos; } +string getChatUrl(const string room_id, string server) { + string chatUrl; + uint tickCount; + JsonReader Reader; + JsonValue Root; + + tickCount = HostGetTickCount(); + + string unixTime; + unixTime = formatInt(DatetimeToUnixTime(FormatDateTime(datetime()))); + post(server + "/disconnectRoom?_=" + unixTime); + + HostIncTimeOut(HostGetTickCount() - tickCount); + + tickCount = HostGetTickCount(); + + unixTime = formatInt(DatetimeToUnixTime(FormatDateTime(datetime()))); + string res = post(server + "/connectRoom?roomid=" + room_id + "&_=" + unixTime); + + HostIncTimeOut(HostGetTickCount() - tickCount); + + if (!Reader.parse(res, Root) || !Root.isObject()) { + log('getChatUrl - connectRoom failed', '!Reader.parse(res, Root) || !Root.isObject()'); + return chatUrl; + } + + if (Root["code"].asString() != "200") { + log("getChatUrl - connectRoom failed, code: " + Root["code"].asString() + ", msg: " + Root["msg"].asString()); + + return chatUrl; + } + + string host = HostRegExpParse(server, "^https?://([^/]+)"); + + chatUrl = host + "/danmu_widget?sub=ws://" + host + "/danmu/sub"; + + return chatUrl; +} + array BangumiEpisodes(string id, string type) { log("============================BangumiEpisodes============================"); array videos; @@ -1873,7 +1936,7 @@ string Bangumi(const string&in path, dictionary& MetaData, array& Qu } if (ConfigData.enableSponsorBlock) { - status = 5; + status = 6; chapter = generateChapter(bvid, chapter, episode["duration"].asFloat()); status = 4; } @@ -1964,7 +2027,7 @@ string Video(string id, const string&in path, dictionary& MetaData, array accept_qns; string default_format; - string room_id = data["room_id"].asInt(); + int qn = 30000; - res = post("https://api.live.bilibili.com/xlive/web-room/v2/index/getRoomPlayInfo?room_id=" + room_id + "&qn=" + qn + "&codec=0,1,2&format=0,1,2&mask=0&no_playurl=0&platform=web&protocol=0,1&eotf=0,1,2"); + res = apiPost("/xlive/web-room/v2/index/getRoomPlayInfo?room_id=" + room_id + "&qn=" + qn + "&codec=0,1,2&format=0,1,2&mask=0&no_playurl=0&platform=web&protocol=0,1&eotf=0,1,2", "", "https://api.live.bilibili.com"); if (!Reader.parse(res, Root) || !Root.isObject() || Root["code"].asInt() != 0) { return url; } @@ -2102,7 +2173,7 @@ string Live(string id, const string&in path, dictionary& MetaData, array& Qual } } - status = 6; + status = 5; res = post("https://www.bilibili.com/audio/music-service-c/web/url?privilege=2&quality=2&sid=" + id); res = HostDecompress(res); if (Reader.parse(res, Root) && Root.isObject()) { @@ -2974,6 +3046,7 @@ bool PlaylistCheck(const string&in path) { if (path.find("areaId") >= 0 || path.find("lol") >= 0 || path.find("hpjy") >= 0) { return true; } + return true; } if (path.find("www.bilibili.com") >= 0 && HostRegExpParse(path, "www.bilibili.com/([a-zA-Z0-9]+)").empty()) { return true; diff --git a/README.md b/README.md index 6dfc52c..fdd4e9b 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,8 @@ - 默认使用低延迟的 HLS/fMP4 流,无法提供时回退至 HLS/TS。 - 支持直播备用地址。 - 动态生成直播画质选项。 -- 规避画质选项 potplayer 自动覆盖成 HLS 的问题。 +- 增加 解析真实 M3U8 开关。规避画质选项 potplayer 自动覆盖成 HLS 的问题。详见配置项注释。 +- 支持 [Bilibili_Danmuji](https://github.com/BanqiJane/Bilibili_Danmuji),增加 potplayer 收发弹幕功能。需自建 Bilibili_Danmuji 服务,详见配置项注释。 ### ▶️ 点播 From 9e703eb93c31c3342b55f9d63bf9eb731e82e698 Mon Sep 17 00:00:00 2001 From: frostnotfall <38377709+frostnotfall@users.noreply.github.com> Date: Sun, 6 Sep 2026 10:45:07 +0800 Subject: [PATCH 113/132] Revise README for installation and usage instructions Updated installation instructions and removed outdated content related to previous login methods and features. Added links to relevant tutorials and clarified usage methods. --- README.md | 84 +------------------------------------------------------ 1 file changed, 1 insertion(+), 83 deletions(-) diff --git a/README.md b/README.md index fdd4e9b..e3317a2 100644 --- a/README.md +++ b/README.md @@ -74,83 +74,7 @@ ## 安装插件 -[下载项目](https://github.com/frostnotfall/BilibiliPotPlayer/archive/refs/heads/master.zip) - -将项目 `Media/PlayParse` 路径下的 `MediaPlayParse - Bilibili.as`、`MediaPlayParse - Bilibili.ico` 和 `Bilibili_Config.json` 三个文件复制到 `{PotPlayer 安装路径}\Extension\Media\PlayParse` 文件夹下。 - -`MediaPlayParse - Bilibili.as` 提供了解析 `Bilibili` 链接的功能。 - -将项目 `Media/UrlList` 路径下的 `MediaUrlList - Bilibili.as` 和 `MediaUrlList - Bilibili.ico` 两个文件复制到 `{PotPlayer 安装路径}\Extension\Media\UrlList` 文件夹下。 - -`MediaUrlList - Bilibili.as` 提供了列出 `Bilibili` 常用链接的功能,使用方式为按下 ctrl + U 并选择要播放的项目,如下图所示 - -![UrlList](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/urllist.png) - -## 新登录方式(旧cookie方式已弃用) - -打开 PotPlayer,按 F5 打开选项,点击`扩展功能`,此时有两种登录方式,任选其一即可: - -* 第一种,点击`媒体播放列表/项目`,再点击 `Bilibili`,然后点击`设置`,此时弹出一个网页进程,按照正常网页端登录即可。 - -![login_1](public/login_1.png) - -* 第二种,点击右方向右箭头,找到`网络账户`并点击,然后点击`Bilibili`,最后点击`管理账户`,同样会弹出一个网页进程,按照正常网页端登录即可。 - -![login_2](/public/login_2.png) - -### 网页登陆界面 -注:窗口大小可手动调整 -![login_web](/public/login_web.png) - -## 使用方法 - -### 播放视频/直播 - -将 Bilibili 链接拖到 PotPlayer,或者按 ctrl + U 粘贴 Bilibili 链接即可播放。可参考[视频](https://www.bilibili.com/video/BV1mM41177kT) - -### 搜索 - -按 ctrl + U,在文件地址列表中选择`搜索`,然后到上面的输入框中替换关键词,最后回车即可 - -![Search](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/search.png) - -### 跳过片头片尾(通过空降助手) - -对于一些电视剧、番剧,能够跳过片头和片尾。具体设置为:在 PotPlayer 上点击鼠标右键,选择`播放`-`跳略播放`-`跳略播放设置` - -![Skip_Settings](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/skip_1.png) - -勾选`跳略播放`和`章节名称`,并在名称列表中追加片段名称(例如:`开场动画`和`片尾`),每一项之间用英文分号`;`隔开,所有片段名称如下: - -- `赞助` -- `推广` -- `品牌合作` -- `三连提醒` -- `精彩时刻` -- `开场动画` -- `片尾` -- `预览` -- `填充内容` -- `离题` -- `非音乐` - -**注**:是否存在这些片段跳过取决于 [空降助手](https://github.com/hanydd/BilibiliSponsorBlock) 服务端是否有该视频对应的数据,而数据需要用户手动上传。网页端可安装 [浏览器扩展](https://chromewebstore.google.com/detail/%E5%B0%8F%E7%94%B5%E8%A7%86%E7%A9%BA%E9%99%8D%E5%8A%A9%E6%89%8B/eaoelafamejbnggahofapllmfhlhajdd),欢迎添加片段。 - -![Skip_Settings](/public/skip_2.png) - -### 在列表中显示缩略图 - -按 F6 打开播放列表,点击鼠标右键,点击`样式`,选择`显示缩略图`,即可显示视频的缩略图。 - -![Thumbnail](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/thumbnail.png) - -### 创建自动更新的播放列表 - -按 F6 打开播放列表,点击新建专辑,起一个合适的专辑名称,选择外部播放列表,并填写相应的链接,再点击确定即可。这样就得到一个可以自动更新的列表。 - -![Create_Playlist](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/create_playlist_1.png) - -![Create_Playlist](https://cdn.jsdelivr.net/gh/chen310/BilibiliPotPlayer/public/create_playlist_2.png) +参考 [安装及基本使用教程](https://github.com/frostnotfall/BilibiliPotPlayer/wiki/%E5%AE%89%E8%A3%85%E5%8F%8A%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B) ## 油猴脚本 @@ -166,12 +90,6 @@ 修改版脚本 `BilibiliPotPlayer-改` [https://greasyfork.org/zh-CN/scripts/593353-bilibilipotplayer-改](https://greasyfork.org/zh-CN/scripts/593353-bilibilipotplayer-%E6%94%B9)) 基于`原版油猴脚本` [油猴脚本https://greasyfork.org/zh-CN/scripts/461800-bilibilipotplayer](https://greasyfork.org/zh-CN/scripts/461800-bilibilipotplayer),并保留原作者及原项目相关信息。如原作者对本脚本的发布或再分发存在异议,并要求停止发布,本人将配合下架本脚本。 -## 关于精准空降 - -目前发现 PotPlayer 播放 youtube 可支持精准空降,但分析研究 `MediaPlayParse - YouTube.as`,未找到其相关控制代码。 - -目前精准空降的实现是通过搭配的[修改版油猴脚本](#油猴脚本)实现。 - # 声明 - 致敬原作者:[chen310/BilibiliPotPlayer](https://github.com/chen310/BilibiliPotPlayer) - 致敬上游作者:[juening2000/BilibiliPotPlayer](https://github.com/juening2000/BilibiliPotPlayer) From cb8522223658a1b581e666f1b8738ec2bddd0bd6 Mon Sep 17 00:00:00 2001 From: frostnotfall <38377709+frostnotfall@users.noreply.github.com> Date: Sun, 6 Sep 2026 10:46:14 +0800 Subject: [PATCH 114/132] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e3317a2..412ee8c 100644 --- a/README.md +++ b/README.md @@ -74,7 +74,7 @@ ## 安装插件 -参考 [安装及基本使用教程](https://github.com/frostnotfall/BilibiliPotPlayer/wiki/%E5%AE%89%E8%A3%85%E5%8F%8A%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B) +参考 [安装及基本使用教程](https://github.com/frostnotfall/BilibiliPotPlayer/wiki/%E5%AE%89%E8%A3%85%E5%8F%8A%E5%9F%BA%E6%9C%AC%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B),[进阶教程](https://github.com/frostnotfall/BilibiliPotPlayer/wiki/%E8%BF%9B%E9%98%B6%E6%95%99%E7%A8%8B)。 ## 油猴脚本 From a7c273b76911c0287da940a9b7ef998849123fc4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Sun, 6 Sep 2026 21:32:07 +0800 Subject: [PATCH 115/132] =?UTF-8?q?1.=20=E7=9B=B4=E6=92=AD=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E5=B1=8F=E8=94=BDP2PCDN=E6=A3=80=E6=B5=8B=202.=20bugf?= =?UTF-8?q?ix=20-=20=E4=BF=AE=E5=A4=8D=E6=89=93=E5=BC=80=E7=9B=B4=E6=92=AD?= =?UTF-8?q?=E5=88=86=E5=8C=BA=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 28 +++++++++++++++----- README.md | 2 +- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index cd7eaba..0f332f6 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -2230,9 +2230,13 @@ string Live(string id, const string&in path, dictionary& MetaData, array watchlater() { array History() { array videos; uint max = 0; - uint ps = 20; + uint ps = 30; string res = apiPost("/x/web-interface/history/cursor?max=" + max + "&ps=" + ps); JsonReader Reader; JsonValue Root; @@ -2626,11 +2630,21 @@ array followingLive(uint page) { return videos; } -array liveCategory(uint page, string cateid, string parentAreaId, uint liveRoomCount) { +array liveCategory(string path, uint page, string cateid, string parentAreaId, uint liveRoomCount) { + JsonReader Reader; + JsonValue Root; + + string renderData = HostRegExpParse(post(path), "window\\._render_data_\\s*=\\s*(\\{\"access_id\":\"[^\"]+\"\\})"); + if (!Reader.parse(renderData, Root) || !Root.isObject()) return array(); + + return liveCategory(page, cateid, parentAreaId, liveRoomCount, Root["access_id"].asString()); +} + +array liveCategory(uint page, string cateid, string parentAreaId, uint liveRoomCount, string w_webid) { array videos; JsonReader Reader; JsonValue Root; - string params = "platform=web&parent_area_id=" + parentAreaId + "&area_id=" + cateid + "&page=" + page; + string params = "platform=web&parent_area_id=" + parentAreaId + "&area_id=" + cateid + "&page=" + page + "&w_webid=" + w_webid; string url = "https://api.live.bilibili.com/xlive/web-interface/v1/second/getList?" + encWbi(params); string res = post(url); if (Reader.parse(res, Root) && Root.isObject()) { @@ -2651,7 +2665,7 @@ array liveCategory(uint page, string cateid, string parentAreaId, ui } } if (Root["data"]["has_more"].asBool()) { - array nextVideos = liveCategory(page + 1, cateid, parentAreaId, liveRoomCount); + array nextVideos = liveCategory(page + 1, cateid, parentAreaId, liveRoomCount, w_webid); for (uint i = 0; i < nextVideos.size(); i++) { videos.insertLast(nextVideos[i]); } @@ -3127,13 +3141,13 @@ array PlaylistParse(const string&in url) { } if (path.find("live.bilibili.com") >= 0) { if (path.find("areaId") >= 0) { - return liveCategory(1, HostRegExpParse(path, "areaId=([0-9]+)"), HostRegExpParse(path, "parentAreaId=([0-9]+)"), 0); + return liveCategory(path, 1, HostRegExpParse(path, "areaId=([0-9]+)"), HostRegExpParse(path, "parentAreaId=([0-9]+)"), 0); } if (path.find("lol") >= 0) { - return liveCategory(1, "86", "2", 0); + return liveCategory(path, 1, "86", "2", 0); } if (path.find("hpjy") >= 0) { - return liveCategory(1, "256", "3", 0); + return liveCategory(path, 1, "256", "3", 0); } } if (path.find("www.bilibili.com") >= 0 && HostRegExpParse(path, "www.bilibili.com/([a-zA-Z0-9]+)").empty()) { diff --git a/README.md b/README.md index 412ee8c..6311094 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ - 本地缓存响应数据,降低 API 请求次数。可在配置文件中设置,默认300s。 - 清理无用代码,较为激进,有问题请提issue。 - 换用新的 itag 选择机制。 +- 支持屏蔽 P2PCDN,可通过配置文件调整,默认屏蔽 ### 📺 直播 @@ -39,7 +40,6 @@ ### ▶️ 点播 -- 支持屏蔽 P2PCDN,可通过配置文件调整,默认屏蔽 - 修复部分 Host 为 `upos` 的点播 URL 播放失败的问题 - Bilibili 点播更换新接口,尽量使用wbi签名认证防止接口失效 - 重新支持用户合集视频,并支持多合集,potplayer 播放列表( 快捷键 F6 ) 正确显示合集视频。 From 8339116605f440bd1e666fe0d3813ca036976698 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Mon, 7 Sep 2026 03:45:15 +0800 Subject: [PATCH 116/132] =?UTF-8?q?1.=20=E8=A1=A5=E5=85=85=E6=92=AD?= =?UTF-8?q?=E6=94=BE=E5=88=97=E8=A1=A8=E5=B1=9E=E6=80=A7=202.=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=90=88=E9=9B=86=E5=92=8C=E5=88=86P=E5=90=8D?= =?UTF-8?q?=E7=A7=B0=E6=98=BE=E7=A4=BA=203.=20bugfix=20-=20=E5=85=A5?= =?UTF-8?q?=E7=AB=99=E5=BF=85=E5=88=B7=E5=8F=98=E6=88=90=E5=8E=86=E5=8F=B2?= =?UTF-8?q?=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 111 ++++++++++++------- 1 file changed, 73 insertions(+), 38 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 0f332f6..68785e2 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -473,7 +473,6 @@ string apiPost(string api, string data = "", string host=Host) { key = HostRegExpRemove(HostRegExpRemove(api, "&w_rid=[^&]*"), "&wts=[^&]*") + "?" + data; } else { key = HostRegExpRemove(HostRegExpRemove(api, "&w_rid=[^&]*"), "&wts=[^&]*"); - ; } ResponseCacheItem item; @@ -781,32 +780,32 @@ bool isP2PCDN(const string&in url) { } string getFixedURL(JsonValue&in data) { - string baseUrl = data["baseUrl"].asString(); + string base_url = data["base_url"].asString(); if (!ConfigData.blockP2PCDN) { - return baseUrl; + return base_url; } - if (!isP2PCDN(baseUrl)) { - return baseUrl; + if (!isP2PCDN(base_url)) { + return base_url; } - if (data["backupUrl"].isString()) { - string backupUrl = data["backupUrl"].asString(); - if (!isP2PCDN(backupUrl)) { - return backupUrl; + if (data["backup_url"].isString()) { + string backup_url = data["backup_url"].asString(); + if (!isP2PCDN(backup_url)) { + return backup_url; } - } else if (data["backupUrl"].isArray()) { - for (uint j = 0; j < data["backupUrl"].size(); j++) { - string backupUrl = data["backupUrl"][j].asString(); + } else if (data["backup_url"].isArray()) { + for (uint j = 0; j < data["backup_url"].size(); j++) { + string backup_url = data["backup_url"][j].asString(); - if (!isP2PCDN(backupUrl)) { - return backupUrl; + if (!isP2PCDN(backup_url)) { + return backup_url; } } } - return baseUrl; + return base_url; } string getLiveQuality(JsonValue g_qn_desc, int qn, int hdr_type, JsonValue video_color_info) { @@ -880,7 +879,7 @@ string getVideoQuality(JsonValue support_formats, int quality) { return "未知"; } -void AppenVideoQualityList(string bvid, string aid, string cid, string& url, array& QualityList) { +void AppendVideoQualityList(string bvid, string aid, string cid, string& url, array& QualityList) { status = 5; int qn = 127; @@ -914,10 +913,10 @@ void AppenVideoQualityList(string bvid, string aid, string cid, string& url, arr string height = formatInt(video["height"].asInt()); int bitrateVal = video["bandwidth"].asInt(); string bitrate = HostFormatBitrate(bitrateVal) + "bps"; - int fps = parseInt(video["frameRate"].asString()); + int fps = parseInt(video["frame_rate"].asString()); bool isHDR = (qn == 125 || qn == 126 || qn == 129); - string mimeType = video["mimeType"].asString().MakeLower(); - string format = mimeType.substr(mimeType.findLast("/") + 1) + ", " + getCodec(codecid) + ", " + bitrate; + string mime_type = video["mime_type"].asString().MakeLower(); + string format = mime_type.substr(mime_type.findLast("/") + 1) + ", " + getCodec(codecid) + ", " + bitrate; string quality = getVideoQuality(data["support_formats"], qn); itag = getVideoItag(qn, codecid); if (itag <= 0 || HostExistITag(itag)) { @@ -1010,8 +1009,8 @@ void AppendAudioQualityList(JsonValue audio, string bvid, array& Qua HostSetITag(itag); string codec = audio["codecs"].asString().MakeLower(); - string mimeType = audio["mimeType"].asString().MakeLower(); - string format = mimeType.substr(mimeType.findLast("/") + 1) + ", " + codec.substr(0, codec.find(".")) + ", " + bitrate; + string mime_type = audio["mime_type"].asString().MakeLower(); + string format = mime_type.substr(mime_type.findLast("/") + 1) + ", " + codec.substr(0, codec.find(".")) + ", " + bitrate; item.url = url; item.bitrateVal = bitrateVal; @@ -1574,6 +1573,10 @@ string getChatUrl(const string room_id, string server) { array BangumiEpisodes(string id, string type) { log("============================BangumiEpisodes============================"); array videos; + JsonReader Reader; + JsonValue Root; + string res; + string author; if (type == "media_id") { id = md2ss(id); @@ -1581,10 +1584,15 @@ array BangumiEpisodes(string id, string type) { type = "season_id"; } - string res = apiPost("/pgc/view/web/ep/list?" + type + "=" + id); - JsonReader Reader; - JsonValue Root; + if (type == "season_id") { + res = apiPost("/pgc/view/web/simple/season?season_id=" + id); + Reader.parse(res, Root); + author = Root["result"]["up_info"]["uname"].asString(); + } + + // TODO: type 为 ep_id 时获取 author。 + res = apiPost("/pgc/view/web/ep/list?" + type + "=" + id); Reader.parse(res, Root); JsonValue episodes = Root["result"]["episodes"]; if (!episodes.isArray()) return videos; @@ -1597,7 +1605,7 @@ array BangumiEpisodes(string id, string type) { video["title"] = episode["show_title"].asString(); video["duration"] = episode["duration"].asString(); video["thumbnail"] = episode["cover"].asString(); - // video["author"] = episode["owner"]["name"].asString(); + if (!author.isEmpty()) video["author"] = author; video["url"] = episode["link"].asString(); // if (!episode["desc"].asString().empty() || episode["desc"].asString() != "-") video["content"] = view["desc"].asString(); video["viewCount"] = episode["stat"]["play"].asString(); @@ -1635,30 +1643,50 @@ array UGCSeason(const string&in path) { JsonValue sections = Root["data"]["View"]["ugc_season"]["sections"]; if (!sections.isArray()) return videos; - string title; + // 单/多分组合集 + bool multiSection = (sections.size() > 1) ? true : false; for (int i = 0; i < sections.size(); i++) { JsonValue section = sections[i]; - if (sections.size() > 1) title = "【" + section["title"].asString() + "】"; + if (!section.isObject()) continue; + string sectionTitle; + if (multiSection) sectionTitle = "【" + section["title"].asString() + "】"; + JsonValue episodes = section["episodes"]; + if (!episodes.isArray()) continue; for (int j = 0; j < episodes.size(); j++) { JsonValue episode = episodes[j]; if (!episode.isObject()) continue; - + + string episodeTitle = episode["arc"]["title"].asString(); + JsonValue pages = episode["pages"]; if (! pages.isArray()) continue; + // 单/多P视频 + bool multiPages = (pages.size() > 1) ? true : false; for (int k = 0; k < pages.size(); k++) { JsonValue page = pages[k]; dictionary video; + string finalTitle; - if (pages.size() == 1) { - video["title"] = title + episode["title"].asString(); + if (multiPages) { + if (sectionTitle.isEmpty()) { + finalTitle = episodeTitle + " ▶ " + page["part"].asString(); + } else { + finalTitle = sectionTitle + " ▶ " + episodeTitle + " ▶ " + page["part"].asString(); + } } else { - video["title"] = title + page["part"].asString(); + if (sectionTitle.isEmpty()) { + finalTitle = episodeTitle; + } else { + finalTitle = sectionTitle + " ▶ " + episodeTitle; + } } + + video["title"] = finalTitle; video["duration"] = page["duration"].asInt() * 1000; video["thumbnail"] = episode["arc"]["pic"].asString(); video["author"] = episode["arc"]["author"]["name"].asString(); @@ -1970,7 +1998,7 @@ string Bangumi(const string&in path, dictionary& MetaData, array& Qu } } - AppenVideoQualityList(bvid, aid, cid, url, QualityList); + AppendVideoQualityList(bvid, aid, cid, url, QualityList); return url; } @@ -2010,8 +2038,12 @@ string Video(string id, const string&in path, dictionary& MetaData, array watchlater() { } } } + if (videos.size() == 0) { + HostMessageBox("你的 [稍后再看] 列表是空的,刷点别的视频吧。", "[稍后再看] 为空", 2,0); + } return videos; } @@ -3114,9 +3149,6 @@ array PlaylistParse(const string&in url) { if (path.find("/watchlater") >= 0) { return watchlater(); } - if (path.find("/history") >= 0) { - return History(); - } if (path.find("search.bilibili.com") >= 0) { return Search(path); } @@ -3171,6 +3203,9 @@ array PlaylistParse(const string&in url) { if (path.find("www.bilibili.com/v/popular/weekly") >= 0) { return PopularWeekly(path); } + if (path.find("/history") >= 0) { + return History(); + } if (path.find("www.bilibili.com/audio/am") >= 0) { return AudioList(path); } From abece9dc91e08e5b093e3756e7ca7200f86132d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Mon, 7 Sep 2026 03:46:45 +0800 Subject: [PATCH 117/132] update version --- Media/PlayParse/MediaPlayParse - Bilibili.as | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 68785e2..e7d9a89 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -177,7 +177,7 @@ string GetTitle() { } string GetVersion() { - return "2.6.12"; + return "2.6.14"; } string GetDesc() { From d70e76af5df0d85b6c29186b63f2a1092132bd17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Tue, 8 Sep 2026 00:16:28 +0800 Subject: [PATCH 118/132] git commit -m "style: convert indentation to tabs" --- Media/PlayParse/MediaPlayParse - Bilibili.as | 5242 +++++++++--------- 1 file changed, 2621 insertions(+), 2621 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index e7d9a89..9609e9f 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -45,405 +45,405 @@ const array BilibiliDomains = { "bilibili.com", "bilivideo.com", "bilivi const string Referer = "https://www.bilibili.com"; const string UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36 Edg/151.0.0.0"; const array knownP2pCdnDomainPattern = { - "302ppio", - "302kodo", - ".mcdn.bilivideo", - "szbdyd.com", - ".nexusedgeio.com", - ".ahdohpiechei.com", - "upos-sz-mirror14b.bilivideo.com" + "302ppio", + "302kodo", + ".mcdn.bilivideo", + "szbdyd.com", + ".nexusedgeio.com", + ".ahdohpiechei.com", + "upos-sz-mirror14b.bilivideo.com" }; class VideoIsUGCorPGC { - string url = ""; - bool isUGCSeason = false; - bool isPGC = false; - string pgcURL = ""; + string url = ""; + bool isUGCSeason = false; + bool isPGC = false; + string pgcURL = ""; } class ResponseCacheItem { - string response; - uint tick_count; - uint valid_time; + string response; + uint tick_count; + uint valid_time; } class QualityListItem { - string url; - string quality; - string qualityDetail; - string resolution; - string bitrate; - string format; - int itag = 0; - int fps = 0.0; - int type3D = 0; // 1:sbs, 2:t&b - bool is360 = false; - bool isHDR = false; - string audioName; - string audioCode; - bool audioIsDefault = false; - int bitrateVal = 0; - string va; - string referer; - bool videoIsDefault; - - dictionary toDictionary() { - dictionary ret; - - ret["url"] = url; - ret["quality"] = quality; - ret["qualityDetail"] = qualityDetail; - ret["resolution"] = resolution; - ret["bitrate"] = bitrate; - ret["format"] = format; - ret["itag"] = itag; - ret["fps"] = fps; - ret["type3D"] = type3D; - ret["is360"] = is360; - ret["isHDR"] = isHDR; - ret["audioName"] = audioName; - ret["audioCode"] = audioCode; - ret["audioIsDefault"] = audioIsDefault; - ret["bitrateVal"] = bitrateVal; - ret["va"] = va; - ret["referer"] = referer; - ret["videoIsDefault"] = videoIsDefault; - - return ret; - } + string url; + string quality; + string qualityDetail; + string resolution; + string bitrate; + string format; + int itag = 0; + int fps = 0.0; + int type3D = 0; // 1:sbs, 2:t&b + bool is360 = false; + bool isHDR = false; + string audioName; + string audioCode; + bool audioIsDefault = false; + int bitrateVal = 0; + string va; + string referer; + bool videoIsDefault; + + dictionary toDictionary() { + dictionary ret; + + ret["url"] = url; + ret["quality"] = quality; + ret["qualityDetail"] = qualityDetail; + ret["resolution"] = resolution; + ret["bitrate"] = bitrate; + ret["format"] = format; + ret["itag"] = itag; + ret["fps"] = fps; + ret["type3D"] = type3D; + ret["is360"] = is360; + ret["isHDR"] = isHDR; + ret["audioName"] = audioName; + ret["audioCode"] = audioCode; + ret["audioIsDefault"] = audioIsDefault; + ret["bitrateVal"] = bitrateVal; + ret["va"] = va; + ret["referer"] = referer; + ret["videoIsDefault"] = videoIsDefault; + + return ret; + } } class Config { - string fullConfig; - int uid = 0; - bool danmakuEnable = true; - string danmakuServer; - string danmakuFont; - float danmakuFontSize = 30.0; - float danmakuOpacity = 0.8; - float danmakuDisplayArea = 0.8; - float danmakuStayTime = 15.0; - bool showRecommendedVideos = true; - bool blockP2PCDN = true; - int cacheValidTime = 300; - bool enableSponsorBlock = false; - string sponsorBlockMirror; - bool parseM3u8RealUrl = false; - string bilibiliDanmujiServer; - bool disableAVC = false; - bool preferHDR = false; - bool debug = false; - - string danmakuUrl; - string subtitleUrl; - - int maxliveroom = 200; + string fullConfig; + int uid = 0; + bool danmakuEnable = true; + string danmakuServer; + string danmakuFont; + float danmakuFontSize = 30.0; + float danmakuOpacity = 0.8; + float danmakuDisplayArea = 0.8; + float danmakuStayTime = 15.0; + bool showRecommendedVideos = true; + bool blockP2PCDN = true; + int cacheValidTime = 300; + bool enableSponsorBlock = false; + string sponsorBlockMirror; + bool parseM3u8RealUrl = false; + string bilibiliDanmujiServer; + bool disableAVC = false; + bool preferHDR = false; + bool debug = false; + + string danmakuUrl; + string subtitleUrl; + + int maxliveroom = 200; } void OnInitialize() { - for (uint i = 0; i < BilibiliDomains.length(); i++) { - HostSetUrlUserAgentHTTP(BilibiliDomains[i], UserAgent); - HostSetUrlRefererHTTP(BilibiliDomains[i], Referer); - } + for (uint i = 0; i < BilibiliDomains.length(); i++) { + HostSetUrlUserAgentHTTP(BilibiliDomains[i], UserAgent); + HostSetUrlRefererHTTP(BilibiliDomains[i], Referer); + } - string configFile = HostGetScriptFolder() + ConfigFileName; - if (!HostFileExist(configFile)) { - HostMessageBox("配置文件不存在\n\n路径: " + configFile, "[BilibiliPotplayer] 配置文件不存在", 0, 0); - } - ConfigData = ReadConfigFile(configFile); - if (ConfigData.debug) { - HostOpenConsole(); - } + string configFile = HostGetScriptFolder() + ConfigFileName; + if (!HostFileExist(configFile)) { + HostMessageBox("配置文件不存在\n\n路径: " + configFile, "[BilibiliPotplayer] 配置文件不存在", 0, 0); + } + ConfigData = ReadConfigFile(configFile); + if (ConfigData.debug) { + HostOpenConsole(); + } } string GetTitle() { - string title = "Bilibili"; - if (!HostFileExist(HostGetScriptFolder() + ConfigFileName)) { - return title + "(配置文件不存在)"; - } - - Config config; - uintptr fp = HostFileOpen(HostGetScriptFolder() + ConfigFileName); - config.fullConfig = HostFileRead(fp, HostFileLength(fp)); - HostFileClose(fp); + string title = "Bilibili"; + if (!HostFileExist(HostGetScriptFolder() + ConfigFileName)) { + return title + "(配置文件不存在)"; + } + + Config config; + uintptr fp = HostFileOpen(HostGetScriptFolder() + ConfigFileName); + config.fullConfig = HostFileRead(fp, HostFileLength(fp)); + HostFileClose(fp); - JsonReader reader; - JsonValue root; - if (!reader.parse(config.fullConfig, root) && !root.isObject()) { - return title + "(配置文件格式错误)"; - } + JsonReader reader; + JsonValue root; + if (!reader.parse(config.fullConfig, root) && !root.isObject()) { + return title + "(配置文件格式错误)"; + } - return title; + return title; } string GetVersion() { - return "2.6.14"; + return "2.6.14"; } string GetDesc() { - return "https://www.bilibili.com"; + return "https://www.bilibili.com"; } string GetConfigFile() { - return HostGetScriptFolder() + ConfigFileName; + return HostGetScriptFolder() + ConfigFileName; } void ApplyConfigFile() { - string msg; - Config config; - uintptr fp = HostFileOpen(HostGetScriptFolder() + ConfigFileName); - config.fullConfig = HostFileRead(fp, HostFileLength(fp)); - HostFileClose(fp); + string msg; + Config config; + uintptr fp = HostFileOpen(HostGetScriptFolder() + ConfigFileName); + config.fullConfig = HostFileRead(fp, HostFileLength(fp)); + HostFileClose(fp); - JsonReader reader; - JsonValue root; - if (!reader.parse(config.fullConfig, root) && !root.isObject()) { - msg = "配置文件存在问题"; - } + JsonReader reader; + JsonValue root; + if (!reader.parse(config.fullConfig, root) && !root.isObject()) { + msg = "配置文件存在问题"; + } - HostMessageBox(msg, "[BilibiliPotplayer] 配置文件错误", 0, 1); + HostMessageBox(msg, "[BilibiliPotplayer] 配置文件错误", 0, 1); } string GetWebAccountUrl() { - return "https://passport.bilibili.com/login"; + return "https://passport.bilibili.com/login"; } string GetWebAccountDomain() { - string domains = ""; - for (uint i = 0; i < BilibiliDomains.length(); i++) { - if (i > 0) - domains += ";"; - domains += BilibiliDomains[i]; - } - return domains; + string domains = ""; + for (uint i = 0; i < BilibiliDomains.length(); i++) { + if (i > 0) + domains += ";"; + domains += BilibiliDomains[i]; + } + return domains; } string GetStatus() { - string info = ""; - - switch(status) { - case 1: - info = "单视频检查"; - break; - case 2: - info = "合集检查"; - break; - case 3: - info = "解析视频合集"; - break; - case 4: - info = "解析视频信息"; - break; - case 5: - info = "解析真实播放地址"; - break; - case 6: - info = "请求空降助手接口"; - break; - case 7: - info = "解析真实M3U8地址"; - break; - default: - info = "请等待"; - } - - return info; + string info = ""; + + switch(status) { + case 1: + info = "单视频检查"; + break; + case 2: + info = "合集检查"; + break; + case 3: + info = "解析视频合集"; + break; + case 4: + info = "解析视频信息"; + break; + case 5: + info = "解析真实播放地址"; + break; + case 6: + info = "请求空降助手接口"; + break; + case 7: + info = "解析真实M3U8地址"; + break; + default: + info = "请等待"; + } + + return info; } void OnFinalize() { - if (!ConfigData.bilibiliDanmujiServer.isEmpty()) { - string unixTime = formatInt(DatetimeToUnixTime(FormatDateTime(datetime()))); - post(ConfigData.bilibiliDanmujiServer + "/disconnectRoom?_=" + unixTime); - } + if (!ConfigData.bilibiliDanmujiServer.isEmpty()) { + string unixTime = formatInt(DatetimeToUnixTime(FormatDateTime(datetime()))); + post(ConfigData.bilibiliDanmujiServer + "/disconnectRoom?_=" + unixTime); + } } Config ReadConfigFile(string file) { - Config config; - uintptr fp = HostFileOpen(file); - config.fullConfig = HostFileRead(fp, HostFileLength(fp)); - JsonReader reader; - JsonValue root; - if (reader.parse(config.fullConfig, root) && root.isObject()) { - if (root["maxliveroom"].isNumeric()) { - config.maxliveroom = root["maxliveroom"].asInt(); - } - if (root["danmaku"].isObject()) { - JsonValue danmaku = root["danmaku"]; - if (danmaku["enable"].isBool()) { - config.danmakuEnable = danmaku["enable"].asBool(); - } - if (danmaku["server"].isString() && !danmaku["server"].asString().empty()) { - config.danmakuServer = danmaku["server"].asString(); - } - if (danmaku["font"].isString()) { - config.danmakuFont = danmaku["font"].asString(); - } - if (danmaku["fontSize"].isNumeric()) { - config.danmakuFontSize = danmaku["fontSize"].asFloat(); - } - if (danmaku["opacity"].isNumeric()) { - config.danmakuOpacity = danmaku["opacity"].asFloat(); - } - if (danmaku["displayArea"].isNumeric()) { - config.danmakuDisplayArea = danmaku["displayArea"].asFloat(); - } - if (danmaku["stayTime"].isNumeric()) { - config.danmakuStayTime = danmaku["stayTime"].asFloat(); - } - } - if (root["showRecommendedVideos"].isBool()) { - config.showRecommendedVideos = root["showRecommendedVideos"].asBool(); - } - if (root["blockP2PCDN"].isBool()) { - config.blockP2PCDN = root["blockP2PCDN"].asBool(); - } - if (root["cacheValidTime"].isNumeric()) { - config.cacheValidTime = root["cacheValidTime"].asInt(); - } - if (root["enableSponsorBlock"].isBool()) { - config.enableSponsorBlock = root["enableSponsorBlock"].asBool(); - } - if (root["sponsorBlockMirror"].isString()) { - config.sponsorBlockMirror = root["sponsorBlockMirror"].asString(); - } - if (root["parseM3u8RealUrl"].isBool()) { - config.parseM3u8RealUrl = root["parseM3u8RealUrl"].asBool(); - } - if (root["bilibiliDanmujiServer"].isString()) { - config.bilibiliDanmujiServer = root["bilibiliDanmujiServer"].asString(); - } - if (root["disableAVC"].isBool()) { - config.disableAVC = root["disableAVC"].asBool(); - } - if (root["debug"].isBool()) { - config.debug = root["debug"].asBool(); - } - if (!config.danmakuServer.empty()) { - config.danmakuUrl = config.danmakuServer + "/subtitle?font=" + HostUrlEncode(config.danmakuFont) + "&font_size=" + config.danmakuFontSize + "&alpha=" + config.danmakuOpacity + "&display_area=" + config.danmakuDisplayArea + "&duration_marquee=" + config.danmakuStayTime + "&duration_still=" + config.danmakuStayTime + "&cid="; - config.subtitleUrl = config.danmakuServer + "/subtitle?url="; - } - - } else { - HostMessageBox("配置文件存在问题", "[BilibiliPotplayer] 配置文件错误", 0, 1); - } - - HostFileClose(fp); - - return config; + Config config; + uintptr fp = HostFileOpen(file); + config.fullConfig = HostFileRead(fp, HostFileLength(fp)); + JsonReader reader; + JsonValue root; + if (reader.parse(config.fullConfig, root) && root.isObject()) { + if (root["maxliveroom"].isNumeric()) { + config.maxliveroom = root["maxliveroom"].asInt(); + } + if (root["danmaku"].isObject()) { + JsonValue danmaku = root["danmaku"]; + if (danmaku["enable"].isBool()) { + config.danmakuEnable = danmaku["enable"].asBool(); + } + if (danmaku["server"].isString() && !danmaku["server"].asString().empty()) { + config.danmakuServer = danmaku["server"].asString(); + } + if (danmaku["font"].isString()) { + config.danmakuFont = danmaku["font"].asString(); + } + if (danmaku["fontSize"].isNumeric()) { + config.danmakuFontSize = danmaku["fontSize"].asFloat(); + } + if (danmaku["opacity"].isNumeric()) { + config.danmakuOpacity = danmaku["opacity"].asFloat(); + } + if (danmaku["displayArea"].isNumeric()) { + config.danmakuDisplayArea = danmaku["displayArea"].asFloat(); + } + if (danmaku["stayTime"].isNumeric()) { + config.danmakuStayTime = danmaku["stayTime"].asFloat(); + } + } + if (root["showRecommendedVideos"].isBool()) { + config.showRecommendedVideos = root["showRecommendedVideos"].asBool(); + } + if (root["blockP2PCDN"].isBool()) { + config.blockP2PCDN = root["blockP2PCDN"].asBool(); + } + if (root["cacheValidTime"].isNumeric()) { + config.cacheValidTime = root["cacheValidTime"].asInt(); + } + if (root["enableSponsorBlock"].isBool()) { + config.enableSponsorBlock = root["enableSponsorBlock"].asBool(); + } + if (root["sponsorBlockMirror"].isString()) { + config.sponsorBlockMirror = root["sponsorBlockMirror"].asString(); + } + if (root["parseM3u8RealUrl"].isBool()) { + config.parseM3u8RealUrl = root["parseM3u8RealUrl"].asBool(); + } + if (root["bilibiliDanmujiServer"].isString()) { + config.bilibiliDanmujiServer = root["bilibiliDanmujiServer"].asString(); + } + if (root["disableAVC"].isBool()) { + config.disableAVC = root["disableAVC"].asBool(); + } + if (root["debug"].isBool()) { + config.debug = root["debug"].asBool(); + } + if (!config.danmakuServer.empty()) { + config.danmakuUrl = config.danmakuServer + "/subtitle?font=" + HostUrlEncode(config.danmakuFont) + "&font_size=" + config.danmakuFontSize + "&alpha=" + config.danmakuOpacity + "&display_area=" + config.danmakuDisplayArea + "&duration_marquee=" + config.danmakuStayTime + "&duration_still=" + config.danmakuStayTime + "&cid="; + config.subtitleUrl = config.danmakuServer + "/subtitle?url="; + } + + } else { + HostMessageBox("配置文件存在问题", "[BilibiliPotplayer] 配置文件错误", 0, 1); + } + + HostFileClose(fp); + + return config; } void log(string item) { - if (!ConfigData.debug) { - return; - } - HostPrintUTF8(item); + if (!ConfigData.debug) { + return; + } + HostPrintUTF8(item); } void log(string item, string info) { - log(item + ": " + info); + log(item + ": " + info); } void log(string item, int info) { - log(item + ": " + info); + log(item + ": " + info); } string FormatDateTime(datetime&in dt) { - return formatInt(dt.get_year()) + "-" + (dt.get_month() < 10 ? "0" : "") + - formatInt(dt.get_month()) + "-" + (dt.get_day() < 10 ? "0" : "") + - formatInt(dt.get_day()) + " " + (dt.get_hour() < 10 ? "0" : "") + - formatInt(dt.get_hour()) + ":" + (dt.get_minute() < 10 ? "0" : "") + - formatInt(dt.get_minute()) + ":" + (dt.get_second() < 10 ? "0" : "") + - formatInt(dt.get_second()); + return formatInt(dt.get_year()) + "-" + (dt.get_month() < 10 ? "0" : "") + + formatInt(dt.get_month()) + "-" + (dt.get_day() < 10 ? "0" : "") + + formatInt(dt.get_day()) + " " + (dt.get_hour() < 10 ? "0" : "") + + formatInt(dt.get_hour()) + ":" + (dt.get_minute() < 10 ? "0" : "") + + formatInt(dt.get_minute()) + ":" + (dt.get_second() < 10 ? "0" : "") + + formatInt(dt.get_second()); } int64 DatetimeToUnixTime(const string&in s) { - int year = parseInt(s.substr(0, 4)); - int month = parseInt(s.substr(5, 2)); - int day = parseInt(s.substr(8, 2)); - int hour = parseInt(s.substr(11, 2)); - int minute = parseInt(s.substr(14, 2)); - int second = parseInt(s.substr(17, 2)); + int year = parseInt(s.substr(0, 4)); + int month = parseInt(s.substr(5, 2)); + int day = parseInt(s.substr(8, 2)); + int hour = parseInt(s.substr(11, 2)); + int minute = parseInt(s.substr(14, 2)); + int second = parseInt(s.substr(17, 2)); - int64 days = 0; + int64 days = 0; - for (int y = 1970; y < year; y++) - days += ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) ? 366 : 365; + for (int y = 1970; y < year; y++) + days += ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) ? 366 : 365; - int[] daysInMonth = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + int[] daysInMonth = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; - for (int m = 1; m < month; m++) - days += daysInMonth[m - 1] + (m == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) ? 1 : 0); + for (int m = 1; m < month; m++) + days += daysInMonth[m - 1] + (m == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) ? 1 : 0); - days += day - 1; + days += day - 1; - return days * 86400 + hour * 3600 + minute * 60 + second; + return days * 86400 + hour * 3600 + minute * 60 + second; } string UnixTimeToDateTime(int64 t) { - int64 d = t / 86400; - int s = int(t % 86400); - int y = 1970, m = 1, md; - while (true) { - int dy = ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) ? 366 : 365; - if (d < dy) break; - d -= dy; - y++; - } - bool leap = (y % 4 == 0 && y % 100 != 0) || y % 400 == 0; - while (true) { - md = m == 2 ? (leap ? 29 : 28) : (m == 4 || m == 6 || m == 9 || m == 11 ? 30 : 31); - if (d < md) break; - d -= md; - m++; - } - int h = s / 3600; - int min = s % 3600 / 60; - s %= 60; - return formatInt(y) + "-" + formatInt(m + 100).substr(1) + "-" + formatInt(int(d) + 101).substr(1) + " " + formatInt(h + 100).substr(1) + ":" + formatInt(min + 100).substr(1) + ":" + formatInt(s + 100).substr(1); + int64 d = t / 86400; + int s = int(t % 86400); + int y = 1970, m = 1, md; + while (true) { + int dy = ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) ? 366 : 365; + if (d < dy) break; + d -= dy; + y++; + } + bool leap = (y % 4 == 0 && y % 100 != 0) || y % 400 == 0; + while (true) { + md = m == 2 ? (leap ? 29 : 28) : (m == 4 || m == 6 || m == 9 || m == 11 ? 30 : 31); + if (d < md) break; + d -= md; + m++; + } + int h = s / 3600; + int min = s % 3600 / 60; + s %= 60; + return formatInt(y) + "-" + formatInt(m + 100).substr(1) + "-" + formatInt(int(d) + 101).substr(1) + " " + formatInt(h + 100).substr(1) + ":" + formatInt(min + 100).substr(1) + ":" + formatInt(s + 100).substr(1); } string getMixinKey() { - JsonReader Reader; - JsonValue Root; - string key = ""; - string res = apiPost("/x/web-interface/nav"); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].isInt()) { - JsonValue wbi_img = Root["data"]["wbi_img"]; - string img_url = wbi_img["img_url"].asString(); - string sub_url = wbi_img["sub_url"].asString(); - array parts = img_url.split("/"); - string img_value = parts[parts.length() - 1].split(".")[0]; - parts = sub_url.split("/"); - string sub_value = parts[parts.length() - 1].split(".")[0]; - string ae = img_value + sub_value; - array oe = { 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, 36, 20, 34, 44, 52 }; - for (uint i = 0; i < oe.length(); i++) { - key += ae.substr(oe[i], 1); - } - } - } - if (key.empty()) { - return key; - } - return key.substr(0, 32); + JsonReader Reader; + JsonValue Root; + string key = ""; + string res = apiPost("/x/web-interface/nav"); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].isInt()) { + JsonValue wbi_img = Root["data"]["wbi_img"]; + string img_url = wbi_img["img_url"].asString(); + string sub_url = wbi_img["sub_url"].asString(); + array parts = img_url.split("/"); + string img_value = parts[parts.length() - 1].split(".")[0]; + parts = sub_url.split("/"); + string sub_value = parts[parts.length() - 1].split(".")[0]; + string ae = img_value + sub_value; + array oe = { 46, 47, 18, 2, 53, 8, 23, 32, 15, 50, 10, 31, 58, 3, 45, 35, 27, 43, 5, 49, 33, 9, 42, 19, 29, 28, 14, 39, 12, 38, 41, 13, 37, 48, 7, 16, 24, 55, 40, 61, 26, 17, 0, 1, 60, 51, 30, 4, 22, 25, 54, 21, 56, 59, 6, 63, 57, 62, 11, 36, 20, 34, 44, 52 }; + for (uint i = 0; i < oe.length(); i++) { + key += ae.substr(oe[i], 1); + } + } + } + if (key.empty()) { + return key; + } + return key.substr(0, 32); } string encWbi(string params) { - if (MixinKey.empty()) { - MixinKey = getMixinKey(); - } - array lst = params.split("&"); - lst.sortAsc(); - string newParams; - for (uint i = 0; i < lst.length(); i++) { - newParams += lst[i]; - if (i != lst.length() - 1) - newParams += "&"; - } - newParams += ("&wts=" + formatInt(DatetimeToUnixTime(FormatDateTime(datetime())))); - - return (newParams + "&w_rid=" + HostHashMD5(newParams + MixinKey)); + if (MixinKey.empty()) { + MixinKey = getMixinKey(); + } + array lst = params.split("&"); + lst.sortAsc(); + string newParams; + for (uint i = 0; i < lst.length(); i++) { + newParams += lst[i]; + if (i != lst.length() - 1) + newParams += "&"; + } + newParams += ("&wts=" + formatInt(DatetimeToUnixTime(FormatDateTime(datetime())))); + + return (newParams + "&w_rid=" + HostHashMD5(newParams + MixinKey)); } string makeWebUrl(string path) { @@ -460,140 +460,140 @@ string makeWebUrl(string path) { } string post(string url, string data = "", string headers = "", bool debug = true) { - if (headers.empty()) headers = "User-Agent: " + UserAgent + "\r\n" + "Referer: " + Referer + "\r\n"; - if (debug) log("request url", url); - return HostUrlGetString(url, "", headers, data); + if (headers.empty()) headers = "User-Agent: " + UserAgent + "\r\n" + "Referer: " + Referer + "\r\n"; + if (debug) log("request url", url); + return HostUrlGetString(url, "", headers, data); } string apiPost(string api, string data = "", string host=Host) { - host = host.isEmpty() ? Host : host; - string key; - - if (!data.empty()) { - key = HostRegExpRemove(HostRegExpRemove(api, "&w_rid=[^&]*"), "&wts=[^&]*") + "?" + data; - } else { - key = HostRegExpRemove(HostRegExpRemove(api, "&w_rid=[^&]*"), "&wts=[^&]*"); - } - - ResponseCacheItem item; - if (ResponseCache.get(key, item)) { - if (HostGetTickCount() - item.tick_count <= item.valid_time) { - log("Cache Hit, url", host + api); - return item.response; - } else { - log("Cache expire"); - } - } else { - log("Cache not Hit"); - } - - string resp = post(host + api, data); - if (resp.empty()) { - HostMessageBox("未获取到响应数据,请等待一段时间后重试一下\nurl: " + host + api, "请求失败"); - return ""; - } - - JsonReader Reader; - JsonValue Root; - if (!Reader.parse(resp, Root) || !Root.isObject()) { - HostMessageBox("未能解析响应数据\nurl: " + host + api, "请求失败"); - return ""; - } - if (Root["code"].asInt() != 0) { - log("error code: " + Root["code"].asInt() + "\n" + "error message: " + Root["message"].asString() + "\n" + "url:" + Host + api); - HostMessageBox("error code: " + Root["code"].asInt() + "\n" + "error message: " + Root["message"].asString() + "\n" + "url:" + Host + api, Root["message"].asString()); - return ""; - } - - item.response = resp; - item.tick_count = HostGetTickCount(); - item.valid_time = ConfigData.cacheValidTime * 1000; - ResponseCache[key] = item; - - return resp; + host = host.isEmpty() ? Host : host; + string key; + + if (!data.empty()) { + key = HostRegExpRemove(HostRegExpRemove(api, "&w_rid=[^&]*"), "&wts=[^&]*") + "?" + data; + } else { + key = HostRegExpRemove(HostRegExpRemove(api, "&w_rid=[^&]*"), "&wts=[^&]*"); + } + + ResponseCacheItem item; + if (ResponseCache.get(key, item)) { + if (HostGetTickCount() - item.tick_count <= item.valid_time) { + log("Cache Hit, url", host + api); + return item.response; + } else { + log("Cache expire"); + } + } else { + log("Cache not Hit"); + } + + string resp = post(host + api, data); + if (resp.empty()) { + HostMessageBox("未获取到响应数据,请等待一段时间后重试一下\nurl: " + host + api, "请求失败"); + return ""; + } + + JsonReader Reader; + JsonValue Root; + if (!Reader.parse(resp, Root) || !Root.isObject()) { + HostMessageBox("未能解析响应数据\nurl: " + host + api, "请求失败"); + return ""; + } + if (Root["code"].asInt() != 0) { + log("error code: " + Root["code"].asInt() + "\n" + "error message: " + Root["message"].asString() + "\n" + "url:" + Host + api); + HostMessageBox("error code: " + Root["code"].asInt() + "\n" + "error message: " + Root["message"].asString() + "\n" + "url:" + Host + api, Root["message"].asString()); + return ""; + } + + item.response = resp; + item.tick_count = HostGetTickCount(); + item.valid_time = ConfigData.cacheValidTime * 1000; + ResponseCache[key] = item; + + return resp; } string parse(string url, string key, string defaultValue = "") { - string value = HostRegExpParse(url, "\\?" + key + "=([^&]+)"); - if (!value.empty()) { - return value; - } - value = HostRegExpParse(url, "&" + key + "=([^&]+)"); - if (!value.empty()) { - return value; - } + string value = HostRegExpParse(url, "\\?" + key + "=([^&]+)"); + if (!value.empty()) { + return value; + } + value = HostRegExpParse(url, "&" + key + "=([^&]+)"); + if (!value.empty()) { + return value; + } - value = defaultValue; - return value; + value = defaultValue; + return value; } string parseBVId(string url) { - return HostRegExpParse(url, "(BV[a-zA-Z0-9]+)"); + return HostRegExpParse(url, "(BV[a-zA-Z0-9]+)"); } string parseAVId(string url) { - return HostRegExpParse(url, "av([0-9]+)"); + return HostRegExpParse(url, "av([0-9]+)"); } string parseEPId(string url) { - return HostRegExpParse(url, "ep([0-9]+)"); + return HostRegExpParse(url, "ep([0-9]+)"); } string parseSSId(string url) { - return HostRegExpParse(url, "ss([0-9]+)"); + return HostRegExpParse(url, "ss([0-9]+)"); } string parseMDId(string url) { - return HostRegExpParse(url, "md([0-9]+)"); + return HostRegExpParse(url, "md([0-9]+)"); } string parseFid(string path) { - string fid = parse(path, "fid"); - if (fid.empty()) { - fid = parse(path, "searchFid"); - } - if (fid.empty()) { - fid = HostRegExpParse(path, "/medialist/detail/ml([0-9]+)"); - } - return fid; + string fid = parse(path, "fid"); + if (fid.empty()) { + fid = parse(path, "searchFid"); + } + if (fid.empty()) { + fid = HostRegExpParse(path, "/medialist/detail/ml([0-9]+)"); + } + return fid; } uint gettid(string path) { - array urls = { 'www.bilibili.com/v/anime/serial', 'www.bilibili.com/v/anime/finish', 'www.bilibili.com/v/anime/information', 'www.bilibili.com/v/anime/offical', 'www.bilibili.com/anime', 'www.bilibili.com/movie', 'www.bilibili.com/v/guochuang/chinese', 'www.bilibili.com/v/guochuang/original', 'www.bilibili.com/v/guochuang/puppetry', 'www.bilibili.com/v/guochuang/motioncomic', 'www.bilibili.com/v/guochuang/information', 'www.bilibili.com/guochuang', 'www.bilibili.com/tv', 'www.bilibili.com/documentary', 'www.bilibili.com/v/douga/mad', 'www.bilibili.com/v/douga/mmd', 'www.bilibili.com/v/douga/voice', 'www.bilibili.com/v/douga/garage_kit', 'www.bilibili.com/v/douga/tokusatsu', 'www.bilibili.com/v/douga/acgntalks', 'www.bilibili.com/v/douga/other', 'www.bilibili.com/v/douga', 'www.bilibili.com/v/game/stand_alone', 'www.bilibili.com/v/game/esports', 'www.bilibili.com/v/game/mobile', 'www.bilibili.com/v/game/online', 'www.bilibili.com/v/game/board', 'www.bilibili.com/v/game/gmv', 'www.bilibili.com/v/game/music', 'www.bilibili.com/v/game/mugen', 'www.bilibili.com/v/game', 'www.bilibili.com/v/kichiku/guide', 'www.bilibili.com/v/kichiku/mad', 'www.bilibili.com/v/kichiku/manual_vocaloid', 'www.bilibili.com/v/kichiku/theatre', 'www.bilibili.com/v/kichiku/course', 'www.bilibili.com/v/kichiku', 'www.bilibili.com/v/music/original', 'www.bilibili.com/v/music/cover', 'www.bilibili.com/v/music/perform', 'www.bilibili.com/v/music/vocaloid', 'www.bilibili.com/v/music/live', 'www.bilibili.com/v/music/mv', 'www.bilibili.com/v/music/commentary', 'www.bilibili.com/v/music/tutorial', 'www.bilibili.com/v/music/other', 'www.bilibili.com/v/music', 'www.bilibili.com/v/dance/otaku', 'www.bilibili.com/v/dance/hiphop', 'www.bilibili.com/v/dance/star', 'www.bilibili.com/v/dance/china', 'www.bilibili.com/v/dance/three_d', 'www.bilibili.com/v/dance/demo', 'www.bilibili.com/v/dance', 'www.bilibili.com/v/cinephile/cinecism', 'www.bilibili.com/v/cinephile/montage', 'www.bilibili.com/v/cinephile/shortfilm', 'www.bilibili.com/v/cinephile/trailer_info', 'www.bilibili.com/v/cinephile', 'www.bilibili.com/v/ent/variety', 'www.bilibili.com/v/ent/talker', 'www.bilibili.com/v/ent/fans', 'www.bilibili.com/v/ent/celebrity', 'www.bilibili.com/v/ent', 'www.bilibili.com/v/knowledge/science', 'www.bilibili.com/v/knowledge/social_science', 'www.bilibili.com/v/knowledge/humanity_history', 'www.bilibili.com/v/knowledge/business', 'www.bilibili.com/v/knowledge/campus', 'www.bilibili.com/v/knowledge/career', 'www.bilibili.com/v/knowledge/design', 'www.bilibili.com/v/knowledge/skill', 'www.bilibili.com/v/knowledge', 'www.bilibili.com/v/tech/digital', 'www.bilibili.com/v/tech/application', 'www.bilibili.com/v/tech/computer_tech', 'www.bilibili.com/v/tech/industry', 'www.bilibili.com/v/tech', 'www.bilibili.com/v/information/hotspot', 'www.bilibili.com/v/information/global', 'www.bilibili.com/v/information/social', 'www.bilibili.com/v/information/multiple', 'www.bilibili.com/v/information', 'www.bilibili.com/v/food/make', 'www.bilibili.com/v/food/detective', 'www.bilibili.com/v/food/measurement', 'www.bilibili.com/v/food/rural', 'www.bilibili.com/v/food/record', 'www.bilibili.com/v/food', 'www.bilibili.com/v/life/funny', 'www.bilibili.com/v/life/parenting', 'www.bilibili.com/v/life/travel', 'www.bilibili.com/v/life/rurallife', 'www.bilibili.com/v/life/home', 'www.bilibili.com/v/life/handmake', 'www.bilibili.com/v/life/painting', 'www.bilibili.com/v/life/daily', 'www.bilibili.com/v/life', 'www.bilibili.com/v/car/racing', 'www.bilibili.com/v/car/modifiedvehicle', 'www.bilibili.com/v/car/newenergyvehicle', 'www.bilibili.com/v/car/touringcar', 'www.bilibili.com/v/car/motorcycle', 'www.bilibili.com/v/car/strategy', 'www.bilibili.com/v/car/life', 'www.bilibili.com/v/car', 'www.bilibili.com/v/fashion/makeup', 'www.bilibili.com/v/fashion/cos', 'www.bilibili.com/v/fashion/clothing', 'www.bilibili.com/v/fashion/trend', 'www.bilibili.com/v/fashion', 'www.bilibili.com/v/sports/basketball', 'www.bilibili.com/v/sports/football', 'www.bilibili.com/v/sports/aerobics', 'www.bilibili.com/v/sports/athletic', 'www.bilibili.com/v/sports/culture', 'www.bilibili.com/v/sports/comprehensive', 'www.bilibili.com/v/sports', 'www.bilibili.com/v/animal/cat', 'www.bilibili.com/v/animal/dog', 'www.bilibili.com/v/animal/reptiles', 'www.bilibili.com/v/animal/wild_animal', 'www.bilibili.com/v/animal/second_edition', 'www.bilibili.com/v/animal/animal_composite', 'www.bilibili.com/v/animal', 'www.bilibili.com/v/life/funny', 'www.bilibili.com/v/game/stand_alone' }; - array tids = { 33, 32, 51, 152, 13, 23, 153, 168, 169, 195, 170, 167, 11, 177, 24, 25, 47, 210, 86, 253, 27, 1, 17, 171, 172, 65, 173, 121, 136, 19, 4, 22, 26, 126, 216, 127, 119, 28, 31, 59, 30, 29, 193, 243, 244, 130, 3, 20, 198, 199, 200, 154, 156, 129, 182, 183, 85, 184, 181, 71, 241, 242, 137, 5, 201, 124, 228, 207, 208, 209, 229, 122, 36, 95, 230, 231, 232, 188, 203, 204, 205, 206, 202, 76, 212, 213, 214, 215, 211, 138, 254, 250, 251, 239, 161, 162, 21, 160, 245, 246, 246, 248, 240, 227, 176, 223, 157, 252, 158, 159, 155, 235, 249, 164, 236, 237, 238, 234, 218, 219, 222, 221, 220, 75, 217, 138, 17 }; + array urls = { 'www.bilibili.com/v/anime/serial', 'www.bilibili.com/v/anime/finish', 'www.bilibili.com/v/anime/information', 'www.bilibili.com/v/anime/offical', 'www.bilibili.com/anime', 'www.bilibili.com/movie', 'www.bilibili.com/v/guochuang/chinese', 'www.bilibili.com/v/guochuang/original', 'www.bilibili.com/v/guochuang/puppetry', 'www.bilibili.com/v/guochuang/motioncomic', 'www.bilibili.com/v/guochuang/information', 'www.bilibili.com/guochuang', 'www.bilibili.com/tv', 'www.bilibili.com/documentary', 'www.bilibili.com/v/douga/mad', 'www.bilibili.com/v/douga/mmd', 'www.bilibili.com/v/douga/voice', 'www.bilibili.com/v/douga/garage_kit', 'www.bilibili.com/v/douga/tokusatsu', 'www.bilibili.com/v/douga/acgntalks', 'www.bilibili.com/v/douga/other', 'www.bilibili.com/v/douga', 'www.bilibili.com/v/game/stand_alone', 'www.bilibili.com/v/game/esports', 'www.bilibili.com/v/game/mobile', 'www.bilibili.com/v/game/online', 'www.bilibili.com/v/game/board', 'www.bilibili.com/v/game/gmv', 'www.bilibili.com/v/game/music', 'www.bilibili.com/v/game/mugen', 'www.bilibili.com/v/game', 'www.bilibili.com/v/kichiku/guide', 'www.bilibili.com/v/kichiku/mad', 'www.bilibili.com/v/kichiku/manual_vocaloid', 'www.bilibili.com/v/kichiku/theatre', 'www.bilibili.com/v/kichiku/course', 'www.bilibili.com/v/kichiku', 'www.bilibili.com/v/music/original', 'www.bilibili.com/v/music/cover', 'www.bilibili.com/v/music/perform', 'www.bilibili.com/v/music/vocaloid', 'www.bilibili.com/v/music/live', 'www.bilibili.com/v/music/mv', 'www.bilibili.com/v/music/commentary', 'www.bilibili.com/v/music/tutorial', 'www.bilibili.com/v/music/other', 'www.bilibili.com/v/music', 'www.bilibili.com/v/dance/otaku', 'www.bilibili.com/v/dance/hiphop', 'www.bilibili.com/v/dance/star', 'www.bilibili.com/v/dance/china', 'www.bilibili.com/v/dance/three_d', 'www.bilibili.com/v/dance/demo', 'www.bilibili.com/v/dance', 'www.bilibili.com/v/cinephile/cinecism', 'www.bilibili.com/v/cinephile/montage', 'www.bilibili.com/v/cinephile/shortfilm', 'www.bilibili.com/v/cinephile/trailer_info', 'www.bilibili.com/v/cinephile', 'www.bilibili.com/v/ent/variety', 'www.bilibili.com/v/ent/talker', 'www.bilibili.com/v/ent/fans', 'www.bilibili.com/v/ent/celebrity', 'www.bilibili.com/v/ent', 'www.bilibili.com/v/knowledge/science', 'www.bilibili.com/v/knowledge/social_science', 'www.bilibili.com/v/knowledge/humanity_history', 'www.bilibili.com/v/knowledge/business', 'www.bilibili.com/v/knowledge/campus', 'www.bilibili.com/v/knowledge/career', 'www.bilibili.com/v/knowledge/design', 'www.bilibili.com/v/knowledge/skill', 'www.bilibili.com/v/knowledge', 'www.bilibili.com/v/tech/digital', 'www.bilibili.com/v/tech/application', 'www.bilibili.com/v/tech/computer_tech', 'www.bilibili.com/v/tech/industry', 'www.bilibili.com/v/tech', 'www.bilibili.com/v/information/hotspot', 'www.bilibili.com/v/information/global', 'www.bilibili.com/v/information/social', 'www.bilibili.com/v/information/multiple', 'www.bilibili.com/v/information', 'www.bilibili.com/v/food/make', 'www.bilibili.com/v/food/detective', 'www.bilibili.com/v/food/measurement', 'www.bilibili.com/v/food/rural', 'www.bilibili.com/v/food/record', 'www.bilibili.com/v/food', 'www.bilibili.com/v/life/funny', 'www.bilibili.com/v/life/parenting', 'www.bilibili.com/v/life/travel', 'www.bilibili.com/v/life/rurallife', 'www.bilibili.com/v/life/home', 'www.bilibili.com/v/life/handmake', 'www.bilibili.com/v/life/painting', 'www.bilibili.com/v/life/daily', 'www.bilibili.com/v/life', 'www.bilibili.com/v/car/racing', 'www.bilibili.com/v/car/modifiedvehicle', 'www.bilibili.com/v/car/newenergyvehicle', 'www.bilibili.com/v/car/touringcar', 'www.bilibili.com/v/car/motorcycle', 'www.bilibili.com/v/car/strategy', 'www.bilibili.com/v/car/life', 'www.bilibili.com/v/car', 'www.bilibili.com/v/fashion/makeup', 'www.bilibili.com/v/fashion/cos', 'www.bilibili.com/v/fashion/clothing', 'www.bilibili.com/v/fashion/trend', 'www.bilibili.com/v/fashion', 'www.bilibili.com/v/sports/basketball', 'www.bilibili.com/v/sports/football', 'www.bilibili.com/v/sports/aerobics', 'www.bilibili.com/v/sports/athletic', 'www.bilibili.com/v/sports/culture', 'www.bilibili.com/v/sports/comprehensive', 'www.bilibili.com/v/sports', 'www.bilibili.com/v/animal/cat', 'www.bilibili.com/v/animal/dog', 'www.bilibili.com/v/animal/reptiles', 'www.bilibili.com/v/animal/wild_animal', 'www.bilibili.com/v/animal/second_edition', 'www.bilibili.com/v/animal/animal_composite', 'www.bilibili.com/v/animal', 'www.bilibili.com/v/life/funny', 'www.bilibili.com/v/game/stand_alone' }; + array tids = { 33, 32, 51, 152, 13, 23, 153, 168, 169, 195, 170, 167, 11, 177, 24, 25, 47, 210, 86, 253, 27, 1, 17, 171, 172, 65, 173, 121, 136, 19, 4, 22, 26, 126, 216, 127, 119, 28, 31, 59, 30, 29, 193, 243, 244, 130, 3, 20, 198, 199, 200, 154, 156, 129, 182, 183, 85, 184, 181, 71, 241, 242, 137, 5, 201, 124, 228, 207, 208, 209, 229, 122, 36, 95, 230, 231, 232, 188, 203, 204, 205, 206, 202, 76, 212, 213, 214, 215, 211, 138, 254, 250, 251, 239, 161, 162, 21, 160, 245, 246, 246, 248, 240, 227, 176, 223, 157, 252, 158, 159, 155, 235, 249, 164, 236, 237, 238, 234, 218, 219, 222, 221, 220, 75, 217, 138, 17 }; // array names = { '连载动画', '完结动画', '资讯', '官方延伸', '番剧', '电影', '国产动画', '国产原创相关', '布袋戏', '动态漫·广播剧', '资讯', '国创', '电视剧', '纪录片', 'MAD·AMV', 'MMD·3D', '短片·手书·配音', '手办·模玩', '特摄', '动漫杂谈', '综合', '动画', '单机游戏', '电子竞技', '手机游戏', '网络游戏', '桌游棋牌', 'GMV', '音游', 'Mugen', '游戏', '鬼畜调教', '音MAD', '人力VOCALOID', '鬼畜剧场', '教程演示', '鬼畜', '原创音乐', '翻唱', '演奏', 'VOCALOID·UTAU', '音乐现场', 'MV', '乐评盘点', '音乐教学', '音乐综合', '音乐', '宅舞', '街舞', '明星舞蹈', '中国舞', '舞蹈综合', '舞蹈教程', '舞蹈', '影视杂谈', '影视剪辑', '小剧场', '预告·资讯', '影视', '综艺', '娱乐杂谈', '粉丝创作', '明星综合', '娱乐', '科学科普', '社科·法律·心理', '人 文历史', '财经商业', '校园学习', '职业职场', '设计·创意', '野生技能协会', '知识', '数码', '软件应用', '计算机技术', '科 工机械', '科技', '热点', '环球', '社会', '综合', '资讯', '美食制作', '美食侦探', '美食测评', '田园美食', '美食记录', '美食', '搞笑', '亲子', '出行', '三农', '家居房产', '手工', '绘画', '日常', '生活', '赛车', '改装玩车', '新能源车', '房车', '摩托车', '购车攻略', '汽车生活', '汽车', '美妆护肤', '仿妆cos', '穿搭', '时尚潮流', '时尚', '篮球', '足球', '健身', ' 竞技体育', '运动文化', '运动综合', '运动', '喵星人', '汪星人', '小宠异宠', '野生动物', '动物二创', '动物综合', '动物圈', '搞笑', '单机游戏' }; - for (uint i = 0; i < urls.size(); i++) { - if (path.find(urls[i]) >= 0) { - return tids[i]; - } - } - return 0; + for (uint i = 0; i < urls.size(); i++) { + if (path.find(urls[i]) >= 0) { + return tids[i]; + } + } + return 0; } int parseTime(string s) { - array strs = s.split(":"); - int t = 0; - if (strs.length() == 1) { - t = parseInt(strs[0]) * 1000; - } else if (strs.length() == 2) { - t = (parseInt(strs[0]) * 60 + parseInt(strs[1])) * 1000; - } else if (strs.length() == 3) { - t = (parseInt(strs[0]) * 3600 + parseInt(strs[1]) * 60 + parseInt(strs[2])) * 1000; - } - return t; + array strs = s.split(":"); + int t = 0; + if (strs.length() == 1) { + t = parseInt(strs[0]) * 1000; + } else if (strs.length() == 2) { + t = (parseInt(strs[0]) * 60 + parseInt(strs[1])) * 1000; + } else if (strs.length() == 3) { + t = (parseInt(strs[0]) * 3600 + parseInt(strs[1]) * 60 + parseInt(strs[2])) * 1000; + } + return t; } string md2ss(string mdid) { - JsonReader Reader; - JsonValue Root; - string ssid = ""; - string res = apiPost("/pgc/review/user?media_id=" + mdid); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - ssid = Root["result"]["media"]["season_id"].asString(); - } - } - return ssid; + JsonReader Reader; + JsonValue Root; + string ssid = ""; + string res = apiPost("/pgc/review/user?media_id=" + mdid); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + ssid = Root["result"]["media"]["season_id"].asString(); + } + } + return ssid; } int getVideoItag(int id, int codecid) { @@ -663,807 +663,807 @@ int getVideoItag(int id, int codecid) { int getAudioItag(int id) { // 增加 EC-3/E-AC3 和 flac 的 itag 映射,flac 没有对应的 itag,使用 AC3 替代 - array ids = { 30251, 30250, 30280, 30232, 30216 }; - array itags = { 258, 328, 327, 256, 139 }; - int idx = ids.find(id); - if (idx >= 0) { - return itags[idx]; - } - return id; + array ids = { 30251, 30250, 30280, 30232, 30216 }; + array itags = { 258, 328, 327, 256, 139 }; + int idx = ids.find(id); + if (idx >= 0) { + return itags[idx]; + } + return id; } uint getUniItag() { - uint itag = 1; - while (HostExistITag(itag)) itag++; - HostSetITag(itag); - return itag; + uint itag = 1; + while (HostExistITag(itag)) itag++; + HostSetITag(itag); + return itag; } string getCodec(int codecid) { - array codecids = { 7, 12, 13 }; - array codec = { "avc", "hevc", "av1" }; - int idx = codecids.find(codecid); - if (idx >= 0) { - return codec[idx]; - } - return "未知"; + array codecids = { 7, 12, 13 }; + array codec = { "avc", "hevc", "av1" }; + int idx = codecids.find(codecid); + if (idx >= 0) { + return codec[idx]; + } + return "未知"; } string GetM3u8RealURL(string url) { - status = 7; - uint tickCount = HostGetTickCount(); - string resp = post(url, "", "", true); - HostIncTimeOut(HostGetTickCount() - tickCount); + status = 7; + uint tickCount = HostGetTickCount(); + string resp = post(url, "", "", true); + HostIncTimeOut(HostGetTickCount() - tickCount); - array lines = resp.split("\n"); + array lines = resp.split("\n"); - for (uint i = 0; i < lines.size(); i++) { - string line = lines[i].Trim(); + for (uint i = 0; i < lines.size(); i++) { + string line = lines[i].Trim(); - if (line.find("#EXT-X-STREAM-INF:") == 0) { - if (i + 1 < lines.size()) { - string m3u8 = lines[i + 1].Trim(); + if (line.find("#EXT-X-STREAM-INF:") == 0) { + if (i + 1 < lines.size()) { + string m3u8 = lines[i + 1].Trim(); - if (m3u8.find("http://") == 0 || m3u8.find("https://") == 0) { - return m3u8; - } - } - } - } + if (m3u8.find("http://") == 0 || m3u8.find("https://") == 0) { + return m3u8; + } + } + } + } - status = 5; - return url; + status = 5; + return url; } bool isPlaylist(const string&in path) { - string bvid = parseBVId(path); - string aid = parseAVId(path); - string params; - if (!bvid.empty()) params += "bvid=" + bvid; - if (!aid.empty()) params += "aid=" + aid; - if (bvid.empty() && aid.empty()) return false; - - string res = apiPost("/x/web-interface/wbi/view/detail?" + encWbi(params)); - - JsonReader Reader; - JsonValue Root; - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue redirect_url = Root["data"]["View"]["redirect_url"]; - if (redirect_url.isString() && redirect_url.asString().find("bangumi/play/ep") >= 0) { - videoIsUGCorPGC.isPGC = true; - videoIsUGCorPGC.pgcURL = redirect_url.asString(); - return true; - } - if (Root["data"]["View"]["ugc_season"].isObject()) { - videoIsUGCorPGC.isUGCSeason = true; - return true; - } - } else { - log("Video view API code != 0", Root["code"].asInt()); - log("Video view API message", Root["message"].asString()); - } - } - return false; + string bvid = parseBVId(path); + string aid = parseAVId(path); + string params; + if (!bvid.empty()) params += "bvid=" + bvid; + if (!aid.empty()) params += "aid=" + aid; + if (bvid.empty() && aid.empty()) return false; + + string res = apiPost("/x/web-interface/wbi/view/detail?" + encWbi(params)); + + JsonReader Reader; + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue redirect_url = Root["data"]["View"]["redirect_url"]; + if (redirect_url.isString() && redirect_url.asString().find("bangumi/play/ep") >= 0) { + videoIsUGCorPGC.isPGC = true; + videoIsUGCorPGC.pgcURL = redirect_url.asString(); + return true; + } + if (Root["data"]["View"]["ugc_season"].isObject()) { + videoIsUGCorPGC.isUGCSeason = true; + return true; + } + } else { + log("Video view API code != 0", Root["code"].asInt()); + log("Video view API message", Root["message"].asString()); + } + } + return false; } bool isP2PCDN(const string&in url) { - if (parse(url, "os") == "mcdn") return true; + if (parse(url, "os") == "mcdn") return true; - array parts = url.split("://"); - string hostname = parts.length() > 1 ? parts[1] : parts[0]; + array parts = url.split("://"); + string hostname = parts.length() > 1 ? parts[1] : parts[0]; - int pos = hostname.findFirst("/"); - if (pos >= 0) - hostname = hostname.substr(0, pos); + int pos = hostname.findFirst("/"); + if (pos >= 0) + hostname = hostname.substr(0, pos); - pos = hostname.findFirst("?"); - if (pos >= 0) - hostname = hostname.substr(0, pos); + pos = hostname.findFirst("?"); + if (pos >= 0) + hostname = hostname.substr(0, pos); - pos = hostname.findFirst("#"); - if (pos >= 0) - hostname = hostname.substr(0, pos); + pos = hostname.findFirst("#"); + if (pos >= 0) + hostname = hostname.substr(0, pos); - pos = hostname.findFirst(":"); - if (pos >= 0) - hostname = hostname.substr(0, pos); + pos = hostname.findFirst(":"); + if (pos >= 0) + hostname = hostname.substr(0, pos); - for (uint i = 0; i < knownP2pCdnDomainPattern.length(); i++) { - if (hostname.find(knownP2pCdnDomainPattern[i]) >= 0) { - return true; - } - } + for (uint i = 0; i < knownP2pCdnDomainPattern.length(); i++) { + if (hostname.find(knownP2pCdnDomainPattern[i]) >= 0) { + return true; + } + } - string subdomain = hostname.split(".")[0]; - return subdomain.find("302") >= 0; + string subdomain = hostname.split(".")[0]; + return subdomain.find("302") >= 0; } string getFixedURL(JsonValue&in data) { - string base_url = data["base_url"].asString(); + string base_url = data["base_url"].asString(); - if (!ConfigData.blockP2PCDN) { - return base_url; - } + if (!ConfigData.blockP2PCDN) { + return base_url; + } - if (!isP2PCDN(base_url)) { - return base_url; - } + if (!isP2PCDN(base_url)) { + return base_url; + } - if (data["backup_url"].isString()) { - string backup_url = data["backup_url"].asString(); - if (!isP2PCDN(backup_url)) { - return backup_url; - } - } else if (data["backup_url"].isArray()) { - for (uint j = 0; j < data["backup_url"].size(); j++) { - string backup_url = data["backup_url"][j].asString(); + if (data["backup_url"].isString()) { + string backup_url = data["backup_url"].asString(); + if (!isP2PCDN(backup_url)) { + return backup_url; + } + } else if (data["backup_url"].isArray()) { + for (uint j = 0; j < data["backup_url"].size(); j++) { + string backup_url = data["backup_url"][j].asString(); - if (!isP2PCDN(backup_url)) { - return backup_url; - } - } - } + if (!isP2PCDN(backup_url)) { + return backup_url; + } + } + } - return base_url; + return base_url; } string getLiveQuality(JsonValue g_qn_desc, int qn, int hdr_type, JsonValue video_color_info) { - int etof = 0; - if (video_color_info.isObject() && video_color_info["eotf"].isNumeric()) { - etof = video_color_info["eotf"].asInt(); - } - - if (!g_qn_desc.isArray() || g_qn_desc.size() == 0) { - log("getLiveQualityNew: g_qn_desc is not an array or is empty"); - return "未匹配画质"; - } - - for (int i = 0; i < g_qn_desc.size(); i++) { - JsonValue item = g_qn_desc[i]; - if (!item.isObject()) { - log("getLiveQualityNew item is not object, index", i); - continue; - } - - int item_qn = item["qn"].asInt(); - int item_hdr_type = item["hdr_type"].asInt(); - int item_etof = item["eotf"].asInt(); - - if (item_qn != qn || item_hdr_type != hdr_type || item["eotf"].asInt() != etof) { - continue; - } - - string fallback_desc = item["desc"].asString(); - JsonValue media_base_desc = item["media_base_desc"]; - if (!media_base_desc.isObject()) { - log("getLiveQualityNew media_base_desc missing, fallback desc, qn=" + qn + ", hdr_type=" + hdr_type + ", etof=" + etof); - return fallback_desc; - } - - JsonValue detail_desc = media_base_desc["detail_desc"]; - if (!detail_desc.isObject()) { - log("getLiveQualityNew detail_desc missing, fallback desc, qn=" + qn + ", hdr_type=" + hdr_type + ", etof=" + etof); - return fallback_desc; - } - - string main_desc = detail_desc["desc"].asString(); - if (main_desc.empty()) { - log("getLiveQualityNew detail_desc desc empty, fallback desc, qn=" + qn + ", hdr_type=" + hdr_type + ", etof=" + etof); - return fallback_desc; - } - - JsonValue tags = detail_desc["tag"]; - if (!tags.isArray()) { - return main_desc; - } - - string tag_text = ""; - for (int t = 0; t < tags.size(); t++) { - if (!tag_text.empty()) { - tag_text += " "; - } - tag_text += tags[t].asString(); - } - - return main_desc + " (" + tag_text + ")"; - } - - return "未匹配画质"; + int etof = 0; + if (video_color_info.isObject() && video_color_info["eotf"].isNumeric()) { + etof = video_color_info["eotf"].asInt(); + } + + if (!g_qn_desc.isArray() || g_qn_desc.size() == 0) { + log("getLiveQualityNew: g_qn_desc is not an array or is empty"); + return "未匹配画质"; + } + + for (int i = 0; i < g_qn_desc.size(); i++) { + JsonValue item = g_qn_desc[i]; + if (!item.isObject()) { + log("getLiveQualityNew item is not object, index", i); + continue; + } + + int item_qn = item["qn"].asInt(); + int item_hdr_type = item["hdr_type"].asInt(); + int item_etof = item["eotf"].asInt(); + + if (item_qn != qn || item_hdr_type != hdr_type || item["eotf"].asInt() != etof) { + continue; + } + + string fallback_desc = item["desc"].asString(); + JsonValue media_base_desc = item["media_base_desc"]; + if (!media_base_desc.isObject()) { + log("getLiveQualityNew media_base_desc missing, fallback desc, qn=" + qn + ", hdr_type=" + hdr_type + ", etof=" + etof); + return fallback_desc; + } + + JsonValue detail_desc = media_base_desc["detail_desc"]; + if (!detail_desc.isObject()) { + log("getLiveQualityNew detail_desc missing, fallback desc, qn=" + qn + ", hdr_type=" + hdr_type + ", etof=" + etof); + return fallback_desc; + } + + string main_desc = detail_desc["desc"].asString(); + if (main_desc.empty()) { + log("getLiveQualityNew detail_desc desc empty, fallback desc, qn=" + qn + ", hdr_type=" + hdr_type + ", etof=" + etof); + return fallback_desc; + } + + JsonValue tags = detail_desc["tag"]; + if (!tags.isArray()) { + return main_desc; + } + + string tag_text = ""; + for (int t = 0; t < tags.size(); t++) { + if (!tag_text.empty()) { + tag_text += " "; + } + tag_text += tags[t].asString(); + } + + return main_desc + " (" + tag_text + ")"; + } + + return "未匹配画质"; } string getVideoQuality(JsonValue support_formats, int quality) { - for (int i = 0; i <= support_formats.size(); i++) { - if (support_formats[i]["quality"].asInt() == quality) return support_formats[i]["new_description"].asString(); - } - return "未知"; + for (int i = 0; i <= support_formats.size(); i++) { + if (support_formats[i]["quality"].asInt() == quality) return support_formats[i]["new_description"].asString(); + } + return "未知"; } void AppendVideoQualityList(string bvid, string aid, string cid, string& url, array& QualityList) { - status = 5; - - int qn = 127; - string params; - string res; - JsonReader reader; - JsonValue root; - - params = "bvid=" + bvid + "&avid=" + aid + "&cid=" + cid + "&qn=" + qn + "&fnval=4048&fourk=1"; - res = apiPost("/x/player/wbi/playurl?" + encWbi(params)); - if (reader.parse(res, root) && root.isObject()) { - if (root["code"].asInt() == 0) { - JsonValue data = root["data"]; - - if (data["dash"].isObject()) { - int itag = 0; - JsonValue videos = data["dash"]["video"]; - videos = SortVideos(videos); - - for (int i = 0; i < videos.size(); i++) { - if (@QualityList !is null) { - JsonValue video = videos[i]; - QualityListItem item; - - - int qn = video["id"].asInt(); - int codecid = video["codecid"].asInt(); - - url = getFixedURL(video); - string width = formatInt(video["width"].asInt()); - string height = formatInt(video["height"].asInt()); - int bitrateVal = video["bandwidth"].asInt(); - string bitrate = HostFormatBitrate(bitrateVal) + "bps"; - int fps = parseInt(video["frame_rate"].asString()); - bool isHDR = (qn == 125 || qn == 126 || qn == 129); - string mime_type = video["mime_type"].asString().MakeLower(); - string format = mime_type.substr(mime_type.findLast("/") + 1) + ", " + getCodec(codecid) + ", " + bitrate; - string quality = getVideoQuality(data["support_formats"], qn); - itag = getVideoItag(qn, codecid); - if (itag <= 0 || HostExistITag(itag)) { - itag = HostGetITag(video["height"].asInt(), 0, true, false); - if (itag <= 0) itag = HostGetITag(video["height"].asInt(), 0, true, true); - } - while (HostExistITag(itag)) itag++; - HostSetITag(itag); + status = 5; + + int qn = 127; + string params; + string res; + JsonReader reader; + JsonValue root; + + params = "bvid=" + bvid + "&avid=" + aid + "&cid=" + cid + "&qn=" + qn + "&fnval=4048&fourk=1"; + res = apiPost("/x/player/wbi/playurl?" + encWbi(params)); + if (reader.parse(res, root) && root.isObject()) { + if (root["code"].asInt() == 0) { + JsonValue data = root["data"]; + + if (data["dash"].isObject()) { + int itag = 0; + JsonValue videos = data["dash"]["video"]; + videos = SortVideos(videos); + + for (int i = 0; i < videos.size(); i++) { + if (@QualityList !is null) { + JsonValue video = videos[i]; + QualityListItem item; + + + int qn = video["id"].asInt(); + int codecid = video["codecid"].asInt(); + + url = getFixedURL(video); + string width = formatInt(video["width"].asInt()); + string height = formatInt(video["height"].asInt()); + int bitrateVal = video["bandwidth"].asInt(); + string bitrate = HostFormatBitrate(bitrateVal) + "bps"; + int fps = parseInt(video["frame_rate"].asString()); + bool isHDR = (qn == 125 || qn == 126 || qn == 129); + string mime_type = video["mime_type"].asString().MakeLower(); + string format = mime_type.substr(mime_type.findLast("/") + 1) + ", " + getCodec(codecid) + ", " + bitrate; + string quality = getVideoQuality(data["support_formats"], qn); + itag = getVideoItag(qn, codecid); + if (itag <= 0 || HostExistITag(itag)) { + itag = HostGetITag(video["height"].asInt(), 0, true, false); + if (itag <= 0) itag = HostGetITag(video["height"].asInt(), 0, true, true); + } + while (HostExistITag(itag)) itag++; + HostSetITag(itag); - item.url = url; - item.bitrateVal = bitrateVal; - item.bitrate = bitrate; - item.resolution = width + "x" + height; - item.fps = fps; - item.isHDR = isHDR; - item.format = format; - item.quality = quality; - item.qualityDetail = quality; - item.itag = itag; - item.audioIsDefault = false; - item.va = "v"; - item.referer = "https://www.bilibili.com/video/" + bvid; - if (i == videos.size() - 1) item.videoIsDefault = true; + item.url = url; + item.bitrateVal = bitrateVal; + item.bitrate = bitrate; + item.resolution = width + "x" + height; + item.fps = fps; + item.isHDR = isHDR; + item.format = format; + item.quality = quality; + item.qualityDetail = quality; + item.itag = itag; + item.audioIsDefault = false; + item.va = "v"; + item.referer = "https://www.bilibili.com/video/" + bvid; + if (i == videos.size() - 1) item.videoIsDefault = true; - if (@QualityList !is null) QualityList.insertLast(item.toDictionary()); - } - } - - JsonValue audios; - JsonValue audio; - if (data["dash"]["audio"].isArray()) { - audios = data["dash"]["audio"]; - for (int i = 0; i < audios.size(); i++) { - audio = audios[i]; - AppendAudioQualityList(audio, bvid, QualityList); - } - } - if (data["dash"]["dolby"]["audio"].isArray()) { - audios = data["dash"]["dolby"]["audio"]; - for (int i = 0; i < audios.size(); i++) { - audio = audios[i]; - AppendAudioQualityList(audio, bvid, QualityList); - } - } - if (data["dash"]["flac"].isObject()) { - audio = data["dash"]["flac"]["audio"]; - AppendAudioQualityList(audio, bvid, QualityList); - } - } - } else { - log("Video playurl response code != 0", root["code"].asInt()); - log("Video playurl response message", root["message"].asString()); - } - } + if (@QualityList !is null) QualityList.insertLast(item.toDictionary()); + } + } + + JsonValue audios; + JsonValue audio; + if (data["dash"]["audio"].isArray()) { + audios = data["dash"]["audio"]; + for (int i = 0; i < audios.size(); i++) { + audio = audios[i]; + AppendAudioQualityList(audio, bvid, QualityList); + } + } + if (data["dash"]["dolby"]["audio"].isArray()) { + audios = data["dash"]["dolby"]["audio"]; + for (int i = 0; i < audios.size(); i++) { + audio = audios[i]; + AppendAudioQualityList(audio, bvid, QualityList); + } + } + if (data["dash"]["flac"].isObject()) { + audio = data["dash"]["flac"]["audio"]; + AppendAudioQualityList(audio, bvid, QualityList); + } + } + } else { + log("Video playurl response code != 0", root["code"].asInt()); + log("Video playurl response message", root["message"].asString()); + } + } // for (uint i = 0; i < QualityList.length(); i++) { // log("QualityList[" + i + "] = " + string(QualityList[i]["quality"]) + " | " + int(QualityList[i]["itag"]) + " | " + string(QualityList[i]["url"])); // } - log("url", url); + log("url", url); } void AppendAudioQualityList(JsonValue audio, string bvid, array& QualityList) { - QualityListItem item; + QualityListItem item; - int itag = 0; - string quality; - bool audioIsDefault = false; - int audioid = audio["id"].asInt(); + int itag = 0; + string quality; + bool audioIsDefault = false; + int audioid = audio["id"].asInt(); - string url = getFixedURL(audio); + string url = getFixedURL(audio); - if (audioid == 30250) { - quality = "杜比全景声"; - } else if (audioid == 30251) { - quality = "Hi-Res无损"; - audioIsDefault = true; - } else if (audio["codecs"].asString().MakeLower().find("mp4a") >= 0) { - quality = "AAC"; - } - - int bitrateVal = audio["bandwidth"].asInt(); - string bitrate = HostFormatBitrate(bitrateVal) + "bps"; + if (audioid == 30250) { + quality = "杜比全景声"; + } else if (audioid == 30251) { + quality = "Hi-Res无损"; + audioIsDefault = true; + } else if (audio["codecs"].asString().MakeLower().find("mp4a") >= 0) { + quality = "AAC"; + } + + int bitrateVal = audio["bandwidth"].asInt(); + string bitrate = HostFormatBitrate(bitrateVal) + "bps"; // item.itag = getAudioItag(audioid); - if (itag <= 0 || HostExistITag(itag)) { - itag = HostGetITag(0, int(bitrateVal / 1000.0), true, false); - if (itag <= 0) itag = HostGetITag(0, int(bitrateVal / 1000.0), true, true); - } - while (HostExistITag(itag)) itag++; - HostSetITag(itag); - - string codec = audio["codecs"].asString().MakeLower(); - string mime_type = audio["mime_type"].asString().MakeLower(); - string format = mime_type.substr(mime_type.findLast("/") + 1) + ", " + codec.substr(0, codec.find(".")) + ", " + bitrate; - - item.url = url; - item.bitrateVal = bitrateVal; - item.bitrate = bitrate; - item.resolution = "audio only"; - item.format = format; - item.quality = quality; - item.qualityDetail = item.quality; - item.itag = itag; - item.audioIsDefault = audioIsDefault; - item.va = "a"; - item.referer = "https://www.bilibili.com/video/" + bvid; - - if (@QualityList !is null) QualityList.insertLast(item.toDictionary()); -} + if (itag <= 0 || HostExistITag(itag)) { + itag = HostGetITag(0, int(bitrateVal / 1000.0), true, false); + if (itag <= 0) itag = HostGetITag(0, int(bitrateVal / 1000.0), true, true); + } + while (HostExistITag(itag)) itag++; + HostSetITag(itag); -array generateChapter(const string&in bvid, const array&in chapter, const float duration) { - array result; + string codec = audio["codecs"].asString().MakeLower(); + string mime_type = audio["mime_type"].asString().MakeLower(); + string format = mime_type.substr(mime_type.findLast("/") + 1) + ", " + codec.substr(0, codec.find(".")) + ", " + bitrate; + + item.url = url; + item.bitrateVal = bitrateVal; + item.bitrate = bitrate; + item.resolution = "audio only"; + item.format = format; + item.quality = quality; + item.qualityDetail = item.quality; + item.itag = itag; + item.audioIsDefault = audioIsDefault; + item.va = "a"; + item.referer = "https://www.bilibili.com/video/" + bvid; - const float MIN_CHAPTER_DURATION = 1.0f; - const float END_TOLERANCE = 2.0f; + if (@QualityList !is null) QualityList.insertLast(item.toDictionary()); +} - dictionary typesToName = { - { "sponsor", "赞助" }, - { "selfpromo", "推广" }, - { "exclusive_access", "品牌合作" }, - { "interaction", "三连提醒" }, - { "poi_highlight", "精彩时刻" }, - { "intro", "开场动画" }, - { "outro", "片尾" }, - { "preview", "预览" }, - { "padding", "填充内容" }, - { "filler", "离题" }, - { "music_offtopic", "非音乐" } - }; +array generateChapter(const string&in bvid, const array&in chapter, const float duration) { + array result; + + const float MIN_CHAPTER_DURATION = 1.0f; + const float END_TOLERANCE = 2.0f; + + dictionary typesToName = { + { "sponsor", "赞助" }, + { "selfpromo", "推广" }, + { "exclusive_access", "品牌合作" }, + { "interaction", "三连提醒" }, + { "poi_highlight", "精彩时刻" }, + { "intro", "开场动画" }, + { "outro", "片尾" }, + { "preview", "预览" }, + { "padding", "填充内容" }, + { "filler", "离题" }, + { "music_offtopic", "非音乐" } + }; - string headers = "origin: https://github.com/frostnotfall/BilibiliPotPlayer\r\nx-ext-version: " + GetVersion() + "\r\n"; - string url = !ConfigData.sponsorBlockMirror.empty() ? ConfigData.sponsorBlockMirror + "/api/skipSegments?videoID=" + bvid : "https://bsbsb.top/api/skipSegments?videoID=" + bvid; + string headers = "origin: https://github.com/frostnotfall/BilibiliPotPlayer\r\nx-ext-version: " + GetVersion() + "\r\n"; + string url = !ConfigData.sponsorBlockMirror.empty() ? ConfigData.sponsorBlockMirror + "/api/skipSegments?videoID=" + bvid : "https://bsbsb.top/api/skipSegments?videoID=" + bvid; - string resp = post(url, "", headers); + string resp = post(url, "", headers); - if (resp.empty()) { - log("SponsorBlock response is empty. url: " + url); - return chapter; - } + if (resp.empty()) { + log("SponsorBlock response is empty. url: " + url); + return chapter; + } - JsonReader Reader; - JsonValue SponsorBlock; + JsonReader Reader; + JsonValue SponsorBlock; - if (!Reader.parse(resp, SponsorBlock) || !SponsorBlock.isArray()) { - log("Failed to parse SponsorBlock response. url: " + url); - return chapter; - } + if (!Reader.parse(resp, SponsorBlock) || !SponsorBlock.isArray()) { + log("Failed to parse SponsorBlock response. url: " + url); + return chapter; + } - if (SponsorBlock.size() == 0) return chapter; + if (SponsorBlock.size() == 0) return chapter; - if (chapter.size() == 0) { - array starts; - array ends; - array titles; - array times; + if (chapter.size() == 0) { + array starts; + array ends; + array titles; + array times; - for (int i = 0; i < SponsorBlock.size(); i++) { - JsonValue item = SponsorBlock[i]; + for (int i = 0; i < SponsorBlock.size(); i++) { + JsonValue item = SponsorBlock[i]; - string category = item["category"].asString(); + string category = item["category"].asString(); - if (!typesToName.exists(category)) continue; + if (!typesToName.exists(category)) continue; - float start = item["segment"][0].asFloat(); - float end = item["segment"][1].asFloat(); + float start = item["segment"][0].asFloat(); + float end = item["segment"][1].asFloat(); - if (start >= end) continue; + if (start >= end) continue; - float videoDuration = duration / 1000.0f; + float videoDuration = duration / 1000.0f; - if (start < 0) - start = 0; + if (start < 0) + start = 0; - if (end > videoDuration) - end = videoDuration; + if (end > videoDuration) + end = videoDuration; - if (end > videoDuration - END_TOLERANCE) - end = videoDuration; + if (end > videoDuration - END_TOLERANCE) + end = videoDuration; - if (start >= end) continue; + if (start >= end) continue; - starts.insertLast(start); - ends.insertLast(end); - titles.insertLast(string(typesToName[category])); + starts.insertLast(start); + ends.insertLast(end); + titles.insertLast(string(typesToName[category])); - times.insertLast(start); - times.insertLast(end); - } + times.insertLast(start); + times.insertLast(end); + } - if (starts.size() == 0) return chapter; + if (starts.size() == 0) return chapter; - for (int i = 1; i < times.size(); i++) { - float value = times[i]; - int j = i - 1; + for (int i = 1; i < times.size(); i++) { + float value = times[i]; + int j = i - 1; - while (j >= 0 && times[j] > value) { - times[j + 1] = times[j]; - j--; - } + while (j >= 0 && times[j] > value) { + times[j + 1] = times[j]; + j--; + } - times[j + 1] = value; - } + times[j + 1] = value; + } - array sortedTimes; + array sortedTimes; - for (int i = 0; i < times.size(); i++) { - if (sortedTimes.size() == 0 || - sortedTimes[sortedTimes.size() - 1] != times[i]) { + for (int i = 0; i < times.size(); i++) { + if (sortedTimes.size() == 0 || + sortedTimes[sortedTimes.size() - 1] != times[i]) { - sortedTimes.insertLast(times[i]); - } - } + sortedTimes.insertLast(times[i]); + } + } - array resultTimes; - array resultTitles; + array resultTimes; + array resultTitles; - string lastTitle; + string lastTitle; - for (int i = 0; i < sortedTimes.size(); i++) { - float time = sortedTimes[i]; + for (int i = 0; i < sortedTimes.size(); i++) { + float time = sortedTimes[i]; - string currentTitle; - float selectedStart = -1; + string currentTitle; + float selectedStart = -1; - for (int j = 0; j < starts.size(); j++) { - if (starts[j] <= time && ends[j] > time) { - if (starts[j] > selectedStart) { - selectedStart = starts[j]; - currentTitle = titles[j]; - } - } - } + for (int j = 0; j < starts.size(); j++) { + if (starts[j] <= time && ends[j] > time) { + if (starts[j] > selectedStart) { + selectedStart = starts[j]; + currentTitle = titles[j]; + } + } + } - if (currentTitle.empty()) currentTitle = "正片"; + if (currentTitle.empty()) currentTitle = "正片"; - if (currentTitle == lastTitle) continue; + if (currentTitle == lastTitle) continue; - resultTimes.insertLast(time); - resultTitles.insertLast(currentTitle); + resultTimes.insertLast(time); + resultTitles.insertLast(currentTitle); - lastTitle = currentTitle; - } + lastTitle = currentTitle; + } - array filteredTimes; - array filteredTitles; + array filteredTimes; + array filteredTitles; - for (int i = 0; i < resultTimes.size(); i++) { - if (i == 0) { - filteredTimes.insertLast(resultTimes[i]); - filteredTitles.insertLast(resultTitles[i]); - continue; - } + for (int i = 0; i < resultTimes.size(); i++) { + if (i == 0) { + filteredTimes.insertLast(resultTimes[i]); + filteredTitles.insertLast(resultTitles[i]); + continue; + } - float chapterDuration = resultTimes[i] - resultTimes[i - 1]; + float chapterDuration = resultTimes[i] - resultTimes[i - 1]; - if (chapterDuration < MIN_CHAPTER_DURATION) { - if (filteredTimes.size() > 0) { - filteredTimes.removeLast(); - filteredTitles.removeLast(); - } + if (chapterDuration < MIN_CHAPTER_DURATION) { + if (filteredTimes.size() > 0) { + filteredTimes.removeLast(); + filteredTitles.removeLast(); + } - filteredTimes.insertLast(resultTimes[i]); - filteredTitles.insertLast(resultTitles[i]); + filteredTimes.insertLast(resultTimes[i]); + filteredTitles.insertLast(resultTitles[i]); - continue; - } + continue; + } - filteredTimes.insertLast(resultTimes[i]); - filteredTitles.insertLast(resultTitles[i]); - } + filteredTimes.insertLast(resultTimes[i]); + filteredTitles.insertLast(resultTitles[i]); + } - array finalTimes; - array finalTitles; + array finalTimes; + array finalTitles; - for (int i = 0; i < filteredTimes.size(); i++) { - if (finalTitles.size() > 0 && - finalTitles[finalTitles.size() - 1] == filteredTitles[i]) { + for (int i = 0; i < filteredTimes.size(); i++) { + if (finalTitles.size() > 0 && + finalTitles[finalTitles.size() - 1] == filteredTitles[i]) { - continue; - } + continue; + } - finalTimes.insertLast(filteredTimes[i]); - finalTitles.insertLast(filteredTitles[i]); - } + finalTimes.insertLast(filteredTimes[i]); + finalTitles.insertLast(filteredTitles[i]); + } - for (int i = 0; i < finalTimes.size(); i++) { - dictionary item; + for (int i = 0; i < finalTimes.size(); i++) { + dictionary item; - item["title"] = finalTitles[i]; - item["time"] = formatFloat(finalTimes[i] * 1000, "", 32, 0); + item["title"] = finalTitles[i]; + item["time"] = formatFloat(finalTimes[i] * 1000, "", 32, 0); - result.insertLast(item); - } + result.insertLast(item); + } - return result; - } + return result; + } - bool hasIntro = false; - bool hasOutro = false; + bool hasIntro = false; + bool hasOutro = false; - float videoDuration = duration / 1000.0f; + float videoDuration = duration / 1000.0f; - array chapterStarts; - array chapterEnds; - array chapterTitles; + array chapterStarts; + array chapterEnds; + array chapterTitles; - for (int i = 0; i < chapter.size(); i++) { - string title = string(chapter[i]["title"]); - string timeString = string(chapter[i]["time"]); + for (int i = 0; i < chapter.size(); i++) { + string title = string(chapter[i]["title"]); + string timeString = string(chapter[i]["time"]); - float start = 0; + float start = 0; - float factor = 1.0f; - bool decimal = false; - float decimalFactor = 0.1f; + float factor = 1.0f; + bool decimal = false; + float decimalFactor = 0.1f; - for (int k = 0; k < timeString.length(); k++) { - uint8 c = timeString[k]; + for (int k = 0; k < timeString.length(); k++) { + uint8 c = timeString[k]; - if (c >= 48 && c <= 57) { - if (!decimal) { - start = start * 10.0f + float(c - 48); - } else { - start += float(c - 48) * decimalFactor; - decimalFactor *= 0.1f; - } - } else if (c == 46) { - decimal = true; - } - } + if (c >= 48 && c <= 57) { + if (!decimal) { + start = start * 10.0f + float(c - 48); + } else { + start += float(c - 48) * decimalFactor; + decimalFactor *= 0.1f; + } + } else if (c == 46) { + decimal = true; + } + } - start /= 1000.0f; + start /= 1000.0f; - float end = videoDuration; + float end = videoDuration; - if (i + 1 < chapter.size()) { - string nextTimeString = string(chapter[i + 1]["time"]); + if (i + 1 < chapter.size()) { + string nextTimeString = string(chapter[i + 1]["time"]); - float nextTime = 0; - bool nextDecimal = false; - float nextDecimalFactor = 0.1f; + float nextTime = 0; + bool nextDecimal = false; + float nextDecimalFactor = 0.1f; - for (int k = 0; k < nextTimeString.length(); k++) { - uint8 c = nextTimeString[k]; + for (int k = 0; k < nextTimeString.length(); k++) { + uint8 c = nextTimeString[k]; - if (c >= 48 && c <= 57) { - if (!nextDecimal) { - nextTime = nextTime * 10.0f + float(c - 48); - } else { - nextTime += float(c - 48) * nextDecimalFactor; - nextDecimalFactor *= 0.1f; - } - } else if (c == 46) { - nextDecimal = true; - } - } + if (c >= 48 && c <= 57) { + if (!nextDecimal) { + nextTime = nextTime * 10.0f + float(c - 48); + } else { + nextTime += float(c - 48) * nextDecimalFactor; + nextDecimalFactor *= 0.1f; + } + } else if (c == 46) { + nextDecimal = true; + } + } - end = nextTime / 1000.0f; - } + end = nextTime / 1000.0f; + } // if (title == "开场动画") hasIntro = true; // if (title == "片尾") hasOutro = true; - if (start >= end) continue; + if (start >= end) continue; - chapterStarts.insertLast(start); - chapterEnds.insertLast(end); - chapterTitles.insertLast(title); - } + chapterStarts.insertLast(start); + chapterEnds.insertLast(end); + chapterTitles.insertLast(title); + } - array sponsorStarts; - array sponsorEnds; - array sponsorTitles; + array sponsorStarts; + array sponsorEnds; + array sponsorTitles; - for (int i = 0; i < SponsorBlock.size(); i++) { - JsonValue item = SponsorBlock[i]; + for (int i = 0; i < SponsorBlock.size(); i++) { + JsonValue item = SponsorBlock[i]; - string category = item["category"].asString(); + string category = item["category"].asString(); - if (!typesToName.exists(category)) continue; + if (!typesToName.exists(category)) continue; - if (category == "intro" && hasIntro) continue; + if (category == "intro" && hasIntro) continue; - if (category == "outro" && hasOutro) continue; + if (category == "outro" && hasOutro) continue; - float start = item["segment"][0].asFloat(); - float end = item["segment"][1].asFloat(); + float start = item["segment"][0].asFloat(); + float end = item["segment"][1].asFloat(); - if (start >= end) continue; + if (start >= end) continue; - if (start < 0) - start = 0; + if (start < 0) + start = 0; - if (end > videoDuration) - end = videoDuration; + if (end > videoDuration) + end = videoDuration; - if (end > videoDuration - END_TOLERANCE) - end = videoDuration; + if (end > videoDuration - END_TOLERANCE) + end = videoDuration; - if (start >= end) continue; + if (start >= end) continue; - sponsorStarts.insertLast(start); - sponsorEnds.insertLast(end); - sponsorTitles.insertLast(string(typesToName[category])); - } + sponsorStarts.insertLast(start); + sponsorEnds.insertLast(end); + sponsorTitles.insertLast(string(typesToName[category])); + } - if (sponsorStarts.size() == 0) return chapter; + if (sponsorStarts.size() == 0) return chapter; - array times; + array times; - for (int i = 0; i < chapterStarts.size(); i++) { - times.insertLast(chapterStarts[i]); - times.insertLast(chapterEnds[i]); - } + for (int i = 0; i < chapterStarts.size(); i++) { + times.insertLast(chapterStarts[i]); + times.insertLast(chapterEnds[i]); + } - for (int i = 0; i < sponsorStarts.size(); i++) { - times.insertLast(sponsorStarts[i]); - times.insertLast(sponsorEnds[i]); - } + for (int i = 0; i < sponsorStarts.size(); i++) { + times.insertLast(sponsorStarts[i]); + times.insertLast(sponsorEnds[i]); + } - for (int i = 1; i < times.size(); i++) { - float value = times[i]; - int j = i - 1; + for (int i = 1; i < times.size(); i++) { + float value = times[i]; + int j = i - 1; - while (j >= 0 && times[j] > value) { - times[j + 1] = times[j]; - j--; - } + while (j >= 0 && times[j] > value) { + times[j + 1] = times[j]; + j--; + } - times[j + 1] = value; - } + times[j + 1] = value; + } - array sortedTimes; + array sortedTimes; - for (int i = 0; i < times.size(); i++) { - if (sortedTimes.size() == 0 || - sortedTimes[sortedTimes.size() - 1] != times[i]) { - sortedTimes.insertLast(times[i]); - } - } + for (int i = 0; i < times.size(); i++) { + if (sortedTimes.size() == 0 || + sortedTimes[sortedTimes.size() - 1] != times[i]) { + sortedTimes.insertLast(times[i]); + } + } - array resultTimes; - array resultTitles; - string lastTitle; + array resultTimes; + array resultTitles; + string lastTitle; - for (int i = 0; i < sortedTimes.size() - 1; i++) { - float start = sortedTimes[i]; - float end = sortedTimes[i + 1]; + for (int i = 0; i < sortedTimes.size() - 1; i++) { + float start = sortedTimes[i]; + float end = sortedTimes[i + 1]; - if (start >= end) continue; + if (start >= end) continue; - string currentTitle; - int selectedChapter = -1; + string currentTitle; + int selectedChapter = -1; - for (int j = 0; j < chapterStarts.size(); j++) { - if (chapterStarts[j] <= start && - chapterEnds[j] > start) { + for (int j = 0; j < chapterStarts.size(); j++) { + if (chapterStarts[j] <= start && + chapterEnds[j] > start) { - selectedChapter = j; - break; - } - } + selectedChapter = j; + break; + } + } - if (selectedChapter >= 0) { - string chapterTitle = chapterTitles[selectedChapter]; - if (chapterTitle != "正片") currentTitle = chapterTitle; - } + if (selectedChapter >= 0) { + string chapterTitle = chapterTitles[selectedChapter]; + if (chapterTitle != "正片") currentTitle = chapterTitle; + } - if (currentTitle.empty()) { - int selectedSponsor = -1; - float selectedStart = -1; + if (currentTitle.empty()) { + int selectedSponsor = -1; + float selectedStart = -1; - for (int j = 0; j < sponsorStarts.size(); j++) { - if (sponsorStarts[j] <= start && - sponsorEnds[j] > start) { + for (int j = 0; j < sponsorStarts.size(); j++) { + if (sponsorStarts[j] <= start && + sponsorEnds[j] > start) { - if (sponsorStarts[j] > selectedStart) { - selectedStart = sponsorStarts[j]; - selectedSponsor = j; - } - } - } + if (sponsorStarts[j] > selectedStart) { + selectedStart = sponsorStarts[j]; + selectedSponsor = j; + } + } + } - if (selectedSponsor >= 0) currentTitle = sponsorTitles[selectedSponsor]; else if (selectedChapter >= 0) { - currentTitle = chapterTitles[selectedChapter]; - } else { - currentTitle = "正片"; - } - } + if (selectedSponsor >= 0) currentTitle = sponsorTitles[selectedSponsor]; else if (selectedChapter >= 0) { + currentTitle = chapterTitles[selectedChapter]; + } else { + currentTitle = "正片"; + } + } - if (currentTitle == lastTitle) continue; + if (currentTitle == lastTitle) continue; - resultTimes.insertLast(start); - resultTitles.insertLast(currentTitle); + resultTimes.insertLast(start); + resultTitles.insertLast(currentTitle); - lastTitle = currentTitle; - } + lastTitle = currentTitle; + } - array filteredTimes; - array filteredTitles; + array filteredTimes; + array filteredTitles; - for (int i = 0; i < resultTimes.size(); i++) { - if (i == 0) { - filteredTimes.insertLast(resultTimes[i]); - filteredTitles.insertLast(resultTitles[i]); - continue; - } + for (int i = 0; i < resultTimes.size(); i++) { + if (i == 0) { + filteredTimes.insertLast(resultTimes[i]); + filteredTitles.insertLast(resultTitles[i]); + continue; + } - float chapterDuration = resultTimes[i] - resultTimes[i - 1]; + float chapterDuration = resultTimes[i] - resultTimes[i - 1]; - if (chapterDuration < MIN_CHAPTER_DURATION) { - if (filteredTimes.size() > 0) { - filteredTimes.removeLast(); - filteredTitles.removeLast(); - } + if (chapterDuration < MIN_CHAPTER_DURATION) { + if (filteredTimes.size() > 0) { + filteredTimes.removeLast(); + filteredTitles.removeLast(); + } - filteredTimes.insertLast(resultTimes[i]); - filteredTitles.insertLast(resultTitles[i]); + filteredTimes.insertLast(resultTimes[i]); + filteredTitles.insertLast(resultTitles[i]); - continue; - } + continue; + } - filteredTimes.insertLast(resultTimes[i]); - filteredTitles.insertLast(resultTitles[i]); - } + filteredTimes.insertLast(resultTimes[i]); + filteredTitles.insertLast(resultTitles[i]); + } - array finalTimes; - array finalTitles; + array finalTimes; + array finalTitles; - for (int i = 0; i < filteredTimes.size(); i++) { - if (finalTitles.size() > 0 && - finalTitles[finalTitles.size() - 1] == filteredTitles[i]) { - continue; - } + for (int i = 0; i < filteredTimes.size(); i++) { + if (finalTitles.size() > 0 && + finalTitles[finalTitles.size() - 1] == filteredTitles[i]) { + continue; + } - finalTimes.insertLast(filteredTimes[i]); - finalTitles.insertLast(filteredTitles[i]); - } + finalTimes.insertLast(filteredTimes[i]); + finalTitles.insertLast(filteredTitles[i]); + } - for (int i = 0; i < finalTimes.size(); i++) { - dictionary item; + for (int i = 0; i < finalTimes.size(); i++) { + dictionary item; - item["title"] = finalTitles[i]; - item["time"] = formatFloat(finalTimes[i] * 1000, "", 32, 0); - result.insertLast(item); - } + item["title"] = finalTitles[i]; + item["time"] = formatFloat(finalTimes[i] * 1000, "", 32, 0); + result.insertLast(item); + } - return result; + return result; } JsonValue SortVideos(JsonValue& videos) { @@ -1532,1721 +1532,1721 @@ JsonValue SortVideos(JsonValue& videos) { } string getChatUrl(const string room_id, string server) { - string chatUrl; - uint tickCount; - JsonReader Reader; - JsonValue Root; + string chatUrl; + uint tickCount; + JsonReader Reader; + JsonValue Root; - tickCount = HostGetTickCount(); + tickCount = HostGetTickCount(); - string unixTime; - unixTime = formatInt(DatetimeToUnixTime(FormatDateTime(datetime()))); - post(server + "/disconnectRoom?_=" + unixTime); - - HostIncTimeOut(HostGetTickCount() - tickCount); + string unixTime; + unixTime = formatInt(DatetimeToUnixTime(FormatDateTime(datetime()))); + post(server + "/disconnectRoom?_=" + unixTime); + + HostIncTimeOut(HostGetTickCount() - tickCount); - tickCount = HostGetTickCount(); + tickCount = HostGetTickCount(); - unixTime = formatInt(DatetimeToUnixTime(FormatDateTime(datetime()))); - string res = post(server + "/connectRoom?roomid=" + room_id + "&_=" + unixTime); + unixTime = formatInt(DatetimeToUnixTime(FormatDateTime(datetime()))); + string res = post(server + "/connectRoom?roomid=" + room_id + "&_=" + unixTime); - HostIncTimeOut(HostGetTickCount() - tickCount); + HostIncTimeOut(HostGetTickCount() - tickCount); - if (!Reader.parse(res, Root) || !Root.isObject()) { - log('getChatUrl - connectRoom failed', '!Reader.parse(res, Root) || !Root.isObject()'); - return chatUrl; - } + if (!Reader.parse(res, Root) || !Root.isObject()) { + log('getChatUrl - connectRoom failed', '!Reader.parse(res, Root) || !Root.isObject()'); + return chatUrl; + } - if (Root["code"].asString() != "200") { - log("getChatUrl - connectRoom failed, code: " + Root["code"].asString() + ", msg: " + Root["msg"].asString()); - - return chatUrl; - } + if (Root["code"].asString() != "200") { + log("getChatUrl - connectRoom failed, code: " + Root["code"].asString() + ", msg: " + Root["msg"].asString()); + + return chatUrl; + } - string host = HostRegExpParse(server, "^https?://([^/]+)"); + string host = HostRegExpParse(server, "^https?://([^/]+)"); - chatUrl = host + "/danmu_widget?sub=ws://" + host + "/danmu/sub"; - - return chatUrl; + chatUrl = host + "/danmu_widget?sub=ws://" + host + "/danmu/sub"; + + return chatUrl; } array BangumiEpisodes(string id, string type) { - log("============================BangumiEpisodes============================"); - array videos; - JsonReader Reader; - JsonValue Root; - string res; - string author; - - if (type == "media_id") { - id = md2ss(id); - if (id.empty()) return videos; - type = "season_id"; - } - - if (type == "season_id") { - res = apiPost("/pgc/view/web/simple/season?season_id=" + id); - Reader.parse(res, Root); - author = Root["result"]["up_info"]["uname"].asString(); - } - - // TODO: type 为 ep_id 时获取 author。 - - res = apiPost("/pgc/view/web/ep/list?" + type + "=" + id); - Reader.parse(res, Root); - JsonValue episodes = Root["result"]["episodes"]; - if (!episodes.isArray()) return videos; - - for (int j = 0; j < episodes.size(); j++) { - JsonValue episode = episodes[j]; - if (episode["badge_type"].asInt() == 1) return videos; - - dictionary video; - video["title"] = episode["show_title"].asString(); - video["duration"] = episode["duration"].asString(); - video["thumbnail"] = episode["cover"].asString(); + log("============================BangumiEpisodes============================"); + array videos; + JsonReader Reader; + JsonValue Root; + string res; + string author; + + if (type == "media_id") { + id = md2ss(id); + if (id.empty()) return videos; + type = "season_id"; + } + + if (type == "season_id") { + res = apiPost("/pgc/view/web/simple/season?season_id=" + id); + Reader.parse(res, Root); + author = Root["result"]["up_info"]["uname"].asString(); + } + + // TODO: type 为 ep_id 时获取 author。 + + res = apiPost("/pgc/view/web/ep/list?" + type + "=" + id); + Reader.parse(res, Root); + JsonValue episodes = Root["result"]["episodes"]; + if (!episodes.isArray()) return videos; + + for (int j = 0; j < episodes.size(); j++) { + JsonValue episode = episodes[j]; + if (episode["badge_type"].asInt() == 1) return videos; + + dictionary video; + video["title"] = episode["show_title"].asString(); + video["duration"] = episode["duration"].asString(); + video["thumbnail"] = episode["cover"].asString(); if (!author.isEmpty()) video["author"] = author; - video["url"] = episode["link"].asString(); + video["url"] = episode["link"].asString(); // if (!episode["desc"].asString().empty() || episode["desc"].asString() != "-") video["content"] = view["desc"].asString(); - video["viewCount"] = episode["stat"]["play"].asString(); - video["likeCount"] = episode["stat"]["likes"].asString(); + video["viewCount"] = episode["stat"]["play"].asString(); + video["likeCount"] = episode["stat"]["likes"].asString(); // video["dislikeCount"] = episode["stat"]["dislike"].asString(); - video["date"] = UnixTimeToDateTime(episode["pub_time"].asInt64()); - if (episode["ep_id"].asString() == id) video["current"] = "1"; - if (type == "season_id") video["referer"] = "www.bilibili.com/bangumi/play/ss" + id; - if (type == "ep_id") video["referer"] = "www.bilibili.com/bangumi/play/ep" + id; + video["date"] = UnixTimeToDateTime(episode["pub_time"].asInt64()); + if (episode["ep_id"].asString() == id) video["current"] = "1"; + if (type == "season_id") video["referer"] = "www.bilibili.com/bangumi/play/ss" + id; + if (type == "ep_id") video["referer"] = "www.bilibili.com/bangumi/play/ep" + id; - videos.insertLast(video); - } + videos.insertLast(video); + } - return videos; + return videos; } array UGCSeason(const string&in path) { - array videos; - - string bvid = parseBVId(path); - string aid = parseAVId(path); - string cid; - string p = parse(path, "p", "1"); - string params; - if (!bvid.empty()) params += "bvid=" + bvid; - if (!aid.empty()) params += "aid=" + aid; - if (bvid.empty() && aid.empty()) return videos; - - string res = apiPost("/x/web-interface/wbi/view/detail?" + encWbi(params)); - - JsonReader Reader; - JsonValue Root; - Reader.parse(res, Root); - - JsonValue sections = Root["data"]["View"]["ugc_season"]["sections"]; - if (!sections.isArray()) return videos; - - // 单/多分组合集 - bool multiSection = (sections.size() > 1) ? true : false; - for (int i = 0; i < sections.size(); i++) { - JsonValue section = sections[i]; - if (!section.isObject()) continue; - - string sectionTitle; - if (multiSection) sectionTitle = "【" + section["title"].asString() + "】"; - - JsonValue episodes = section["episodes"]; - - if (!episodes.isArray()) continue; - - for (int j = 0; j < episodes.size(); j++) { - JsonValue episode = episodes[j]; - if (!episode.isObject()) continue; - - string episodeTitle = episode["arc"]["title"].asString(); - - JsonValue pages = episode["pages"]; - if (! pages.isArray()) continue; - - // 单/多P视频 - bool multiPages = (pages.size() > 1) ? true : false; - for (int k = 0; k < pages.size(); k++) { - JsonValue page = pages[k]; - dictionary video; - string finalTitle; - - if (multiPages) { - if (sectionTitle.isEmpty()) { - finalTitle = episodeTitle + " ▶ " + page["part"].asString(); - } else { - finalTitle = sectionTitle + " ▶ " + episodeTitle + " ▶ " + page["part"].asString(); - } - } else { - if (sectionTitle.isEmpty()) { - finalTitle = episodeTitle; - } else { - finalTitle = sectionTitle + " ▶ " + episodeTitle; - } - } - - video["title"] = finalTitle; - video["duration"] = page["duration"].asInt() * 1000; - video["thumbnail"] = episode["arc"]["pic"].asString(); - video["author"] = episode["arc"]["author"]["name"].asString(); - video["url"] = "https://www.bilibili.com/video/" + episode["bvid"].asString() + "?p=" + page["page"].asString(); - video["viewCount"] = episode["arc"]["stat"]["view"].asString(); - video["likeCount"] = episode["arc"]["stat"]["like"].asString(); - video["dislikeCount"] = episode["arc"]["stat"]["dislike"].asString(); - video["date"] = UnixTimeToDateTime(episode["arc"]["pubdate"].asInt64()); - if ((episode["bvid"].asString() == bvid || episode["aid"].asString() == aid) && page["page"].asString() == p) video["current"] = "1"; - video["referer"] = "https://www.bilibili.com/video/" + episode["bvid"].asString(); - videos.insertLast(video); - } - } - } - - return videos; + array videos; + + string bvid = parseBVId(path); + string aid = parseAVId(path); + string cid; + string p = parse(path, "p", "1"); + string params; + if (!bvid.empty()) params += "bvid=" + bvid; + if (!aid.empty()) params += "aid=" + aid; + if (bvid.empty() && aid.empty()) return videos; + + string res = apiPost("/x/web-interface/wbi/view/detail?" + encWbi(params)); + + JsonReader Reader; + JsonValue Root; + Reader.parse(res, Root); + + JsonValue sections = Root["data"]["View"]["ugc_season"]["sections"]; + if (!sections.isArray()) return videos; + + // 单/多分组合集 + bool multiSection = (sections.size() > 1) ? true : false; + for (int i = 0; i < sections.size(); i++) { + JsonValue section = sections[i]; + if (!section.isObject()) continue; + + string sectionTitle; + if (multiSection) sectionTitle = "【" + section["title"].asString() + "】"; + + JsonValue episodes = section["episodes"]; + + if (!episodes.isArray()) continue; + + for (int j = 0; j < episodes.size(); j++) { + JsonValue episode = episodes[j]; + if (!episode.isObject()) continue; + + string episodeTitle = episode["arc"]["title"].asString(); + + JsonValue pages = episode["pages"]; + if (! pages.isArray()) continue; + + // 单/多P视频 + bool multiPages = (pages.size() > 1) ? true : false; + for (int k = 0; k < pages.size(); k++) { + JsonValue page = pages[k]; + dictionary video; + string finalTitle; + + if (multiPages) { + if (sectionTitle.isEmpty()) { + finalTitle = episodeTitle + " ▶ " + page["part"].asString(); + } else { + finalTitle = sectionTitle + " ▶ " + episodeTitle + " ▶ " + page["part"].asString(); + } + } else { + if (sectionTitle.isEmpty()) { + finalTitle = episodeTitle; + } else { + finalTitle = sectionTitle + " ▶ " + episodeTitle; + } + } + + video["title"] = finalTitle; + video["duration"] = page["duration"].asInt() * 1000; + video["thumbnail"] = episode["arc"]["pic"].asString(); + video["author"] = episode["arc"]["author"]["name"].asString(); + video["url"] = "https://www.bilibili.com/video/" + episode["bvid"].asString() + "?p=" + page["page"].asString(); + video["viewCount"] = episode["arc"]["stat"]["view"].asString(); + video["likeCount"] = episode["arc"]["stat"]["like"].asString(); + video["dislikeCount"] = episode["arc"]["stat"]["dislike"].asString(); + video["date"] = UnixTimeToDateTime(episode["arc"]["pubdate"].asInt64()); + if ((episode["bvid"].asString() == bvid || episode["aid"].asString() == aid) && page["page"].asString() == p) video["current"] = "1"; + video["referer"] = "https://www.bilibili.com/video/" + episode["bvid"].asString(); + videos.insertLast(video); + } + } + } + + return videos; } array RelatedVideos(const string&in path) { - array videos; - - string bvid = parseBVId(path); - string aid = parseAVId(path); - string params; - if (!bvid.empty()) params += "bvid=" + bvid; - if (!aid.empty()) params += "aid=" + aid; - if (bvid.empty() && aid.empty()) return videos; - - string res = apiPost("/x/web-interface/wbi/view/detail?" + encWbi(params)); - - JsonReader Reader; - JsonValue Root; - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - if (!Root["data"]["View"].isObject()) { - log('Root["data"]["View"] is empty.'); - return videos; - } - - JsonValue view = Root["data"]["View"]; + array videos; + + string bvid = parseBVId(path); + string aid = parseAVId(path); + string params; + if (!bvid.empty()) params += "bvid=" + bvid; + if (!aid.empty()) params += "aid=" + aid; + if (bvid.empty() && aid.empty()) return videos; + + string res = apiPost("/x/web-interface/wbi/view/detail?" + encWbi(params)); + + JsonReader Reader; + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + if (!Root["data"]["View"].isObject()) { + log('Root["data"]["View"] is empty.'); + return videos; + } + + JsonValue view = Root["data"]["View"]; - dictionary video; - video["title"] = view["title"].asString(); - video["duration"] = view["duration"].asInt() * 1000; - video["thumbnail"] = view["pic"].asString(); - video["author"] = view["owner"]["name"].asString(); - video["url"] = "https://www.bilibili.com/video/" + bvid; - if (!view["desc"].asString().empty() || view["desc"].asString() != "-") video["content"] = view["desc"].asString(); - video["viewCount"] = view["stat"]["view"].asString(); - video["likeCount"] = view["stat"]["like"].asString(); - video["dislikeCount"] = view["stat"]["dislike"].asString(); - video["date"] = UnixTimeToDateTime(view["pubdate"].asInt64()); - video["current"] = "1"; - video["referer"] = "https://www.bilibili.com/video/" + view["bvid"].asString(); - videos.insertLast(video); - - if (!ConfigData.showRecommendedVideos) return videos; - - JsonValue related = Root["data"]["Related"]; - if (related.isArray()) { - for (int i = 0; i < related.size(); i++) { - JsonValue item = related[i]; - if (item.isObject()) { - dictionary video; - video["title"] = item["title"].asString(); - video["duration"] = item["duration"].asInt() * 1000; - video["thumbnail"] = item["pic"].asString(); - video["author"] = item["owner"]["name"].asString(); - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); - if (!item["desc"].asString().empty() || item["desc"].asString() != "-") video["content"] = item["desc"].asString(); - video["viewCount"] = item["stat"]["view"].asString(); - video["likeCount"] = item["stat"]["like"].asString(); - video["dislikeCount"] = item["stat"]["dislike"].asString(); - video["date"] = UnixTimeToDateTime(item["pubdate"].asInt64()); - video["referer"] = "https://www.bilibili.com/video/" + view["bvid"].asString(); - videos.insertLast(video); - } else { - log("item is not exists."); - } - } - } else { - log("no related videos"); - } - } else { - log("Video view API code != 0", Root["code"].asInt()); - log("Video view API message", Root["message"].asString()); - } - } else { - log("res parse failed or Root is empty."); - } - - return videos; + dictionary video; + video["title"] = view["title"].asString(); + video["duration"] = view["duration"].asInt() * 1000; + video["thumbnail"] = view["pic"].asString(); + video["author"] = view["owner"]["name"].asString(); + video["url"] = "https://www.bilibili.com/video/" + bvid; + if (!view["desc"].asString().empty() || view["desc"].asString() != "-") video["content"] = view["desc"].asString(); + video["viewCount"] = view["stat"]["view"].asString(); + video["likeCount"] = view["stat"]["like"].asString(); + video["dislikeCount"] = view["stat"]["dislike"].asString(); + video["date"] = UnixTimeToDateTime(view["pubdate"].asInt64()); + video["current"] = "1"; + video["referer"] = "https://www.bilibili.com/video/" + view["bvid"].asString(); + videos.insertLast(video); + + if (!ConfigData.showRecommendedVideos) return videos; + + JsonValue related = Root["data"]["Related"]; + if (related.isArray()) { + for (int i = 0; i < related.size(); i++) { + JsonValue item = related[i]; + if (item.isObject()) { + dictionary video; + video["title"] = item["title"].asString(); + video["duration"] = item["duration"].asInt() * 1000; + video["thumbnail"] = item["pic"].asString(); + video["author"] = item["owner"]["name"].asString(); + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + if (!item["desc"].asString().empty() || item["desc"].asString() != "-") video["content"] = item["desc"].asString(); + video["viewCount"] = item["stat"]["view"].asString(); + video["likeCount"] = item["stat"]["like"].asString(); + video["dislikeCount"] = item["stat"]["dislike"].asString(); + video["date"] = UnixTimeToDateTime(item["pubdate"].asInt64()); + video["referer"] = "https://www.bilibili.com/video/" + view["bvid"].asString(); + videos.insertLast(video); + } else { + log("item is not exists."); + } + } + } else { + log("no related videos"); + } + } else { + log("Video view API code != 0", Root["code"].asInt()); + log("Video view API message", Root["message"].asString()); + } + } else { + log("res parse failed or Root is empty."); + } + + return videos; } array FavList(string path) { - JsonReader Reader; - array videos; - string fid = parseFid(path); - if (fid.empty()) { - string mid = HostRegExpParse(path, "bilibili.com/([0-9]+)"); - if (mid.empty()) { - mid = "" + ConfigData.uid; - } - string res = apiPost("/x/v3/fav/folder/created/list-all?up_mid=" + mid); - JsonValue Root; - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue data = Root["data"]["list"]; - if (data.isArray()) { - fid = "" + data[0]["id"].asInt(); - } - } - } - } - if (fid.empty()) { - return videos; - } - int pn = 1; - int ps = 20; - string baseurl; - string url; - string ftype = parse(path, "ftype"); + JsonReader Reader; + array videos; + string fid = parseFid(path); + if (fid.empty()) { + string mid = HostRegExpParse(path, "bilibili.com/([0-9]+)"); + if (mid.empty()) { + mid = "" + ConfigData.uid; + } + string res = apiPost("/x/v3/fav/folder/created/list-all?up_mid=" + mid); + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue data = Root["data"]["list"]; + if (data.isArray()) { + fid = "" + data[0]["id"].asInt(); + } + } + } + } + if (fid.empty()) { + return videos; + } + int pn = 1; + int ps = 20; + string baseurl; + string url; + string ftype = parse(path, "ftype"); // 订阅和收藏 - if (ftype == "collect") { - baseurl = "/x/space/fav/season/list?season_id=" + fid; - } else { - baseurl = "/x/v3/fav/resource/list?media_id=" + fid + "&ps=" + ps; - baseurl += "&keyword=" + parse(path, "keyword"); - baseurl += "&order=" + parse(path, "order", "mtime"); + if (ftype == "collect") { + baseurl = "/x/space/fav/season/list?season_id=" + fid; + } else { + baseurl = "/x/v3/fav/resource/list?media_id=" + fid + "&ps=" + ps; + baseurl += "&keyword=" + parse(path, "keyword"); + baseurl += "&order=" + parse(path, "order", "mtime"); // url += "&type=" + parse(path, "type", "0"); - baseurl += "&tid=" + parse(path, "tid", "0"); - } - while (true) { - if (ftype == "collect") { - url = baseurl; - } else { - url = baseurl + "&pn=" + pn; - } - string res = apiPost(url); - JsonValue Root; - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue data = Root["data"]["medias"]; - if (data.isArray()) { - for (int i = 0; i < data.size(); i++) { - JsonValue item = data[i]; - if (item.isObject()) { - dictionary video; - video["title"] = item["title"].asString(); - video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); - video["thumbnail"] = item["cover"].asString(); - video["author"] = item["upper"]["name"].asString(); - videos.insertLast(video); - } - } - } - if (ftype == "collect") { - return videos; - } - int count = Root["data"]["info"]["media_count"].asInt(); - if (pn * ps >= count) { - break; - } - pn += 1; - } else { - return videos; - } - } - } - return videos; + baseurl += "&tid=" + parse(path, "tid", "0"); + } + while (true) { + if (ftype == "collect") { + url = baseurl; + } else { + url = baseurl + "&pn=" + pn; + } + string res = apiPost(url); + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue data = Root["data"]["medias"]; + if (data.isArray()) { + for (int i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + if (item.isObject()) { + dictionary video; + video["title"] = item["title"].asString(); + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + video["thumbnail"] = item["cover"].asString(); + video["author"] = item["upper"]["name"].asString(); + videos.insertLast(video); + } + } + } + if (ftype == "collect") { + return videos; + } + int count = Root["data"]["info"]["media_count"].asInt(); + if (pn * ps >= count) { + break; + } + pn += 1; + } else { + return videos; + } + } + } + return videos; } array AudioList(string path) { - array audios; - JsonReader Reader; - JsonValue Root; - string id = HostRegExpParse(path, "www.bilibili.com/audio/am([0-9]+)"); - if (id.empty()) { - return audios; - } - string url = "https://www.bilibili.com/audio/music-service-c/web/song/of-menu?pn=1&ps=100&sid=" + id; - string res = post(url); - res = HostDecompress(res); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() != 0) { - return audios; - } - JsonValue data = Root["data"]["data"]; - if (data.isArray()) { - for (int i = 0; i < data.size(); i++) { - JsonValue item = data[i]; - dictionary audio; - audio["title"] = item["title"].asString(); - audio["duration"] = item["duration"].asInt() * 1000; - audio["url"] = "https://www.bilibili.com/audio/au" + item["statistic"]["sid"].asInt(); - audio["thumbnail"] = item["cover"].asString(); - if (item["author"].isString()) { - audio["author"] = item["author"].asString(); - } - audios.insertLast(audio); - } - } - } - return audios; + array audios; + JsonReader Reader; + JsonValue Root; + string id = HostRegExpParse(path, "www.bilibili.com/audio/am([0-9]+)"); + if (id.empty()) { + return audios; + } + string url = "https://www.bilibili.com/audio/music-service-c/web/song/of-menu?pn=1&ps=100&sid=" + id; + string res = post(url); + res = HostDecompress(res); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return audios; + } + JsonValue data = Root["data"]["data"]; + if (data.isArray()) { + for (int i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + dictionary audio; + audio["title"] = item["title"].asString(); + audio["duration"] = item["duration"].asInt() * 1000; + audio["url"] = "https://www.bilibili.com/audio/au" + item["statistic"]["sid"].asInt(); + audio["thumbnail"] = item["cover"].asString(); + if (item["author"].isString()) { + audio["author"] = item["author"].asString(); + } + audios.insertLast(audio); + } + } + } + return audios; } string Bangumi(const string&in path, dictionary& MetaData, array& QualityList) { - log("==============================Bangumi============================="); - string url; - string aid; - string bvid; - string cid; - string epid = parseEPId(path); - - string params = "ep_id=" + epid; - string res = apiPost("/pgc/view/web/ep/page?" + encWbi(params)); - JsonReader Reader; - JsonValue Root; - - Reader.parse(res, Root); - epid = Root["result"]["locator"]["target_ep_id"].asString(); - JsonValue sections = Root["result"]["sections"]; - - if (!sections.isArray()) return url; - JsonValue section = sections[0]; - if (!section["pages"].isArray()) return url; - - for (int i = 0; i < section["pages"].size(); i++) { - JsonValue page = section["pages"][i]; - if (!page.isObject()) continue; - JsonValue episodes = page["episodes"]; - if (!episodes.isArray()) continue; - for (int j = 0; j < episodes.size(); j++) { - JsonValue episode = episodes[j]; - if (episode["ep_id"].asString() != epid) continue; - - aid = episode["aid"].asString(); - bvid = episode["bvid"].asString(); - cid = episode["cid"].asString(); - - if (@MetaData !is null) { - MetaData["vid"] = join({bvid, cid}, "|"); - string title = episode["show_title"].asString(); - MetaData["title"] = title; - MetaData["duration"] = episode["duration"].asString(); - MetaData["thumbnail"] = episode["cover"].asString(); - MetaData["webUrl"] = episode["link"].asString(); - MetaData["date"] = UnixTimeToDateTime(episode["pub_time"].asInt64()); - MetaData["fileExt"] = "mp4"; - - if (episode["skip"].isObject()) { - array chapter; - dictionary item; - - if (episode["skip"]["op"].isObject() && episode["skip"]["op"]["end"].asInt() != 0) { - item["title"] = "开场动画"; - item["time"] = formatFloat(episode["skip"]["op"]["start"].asFloat() * 1000, "", 32, 0); - chapter.insertLast(item); - - item["title"] = "正片"; - item["time"] = formatFloat(episode["skip"]["op"]["end"].asFloat() * 1000, "", 32, 0); - chapter.insertLast(item); - } - if (episode["skip"]["ed"].isObject() && episode["skip"]["ed"]["start"].asInt() != 0 && episode["skip"]["ed"]["end"].asInt() != 0) { - item["title"] = "片尾"; - item["time"] = formatFloat(episode["skip"]["ed"]["start"].asFloat() * 1000, "", 32, 0); - chapter.insertLast(item); - - if (episode["skip"]["ed"]["end"].asFloat() * 1000 < episode["duration"].asFloat()) { - item["title"] = "正片"; - item["time"] = formatFloat(episode["skip"]["ed"]["end"].asFloat() * 1000, "", 32, 0); - chapter.insertLast(item); - } - } - - if (ConfigData.enableSponsorBlock) { - status = 6; - chapter = generateChapter(bvid, chapter, episode["duration"].asFloat()); - status = 4; - } - - if (!chapter.empty()) MetaData["chapter"] = chapter; - } - - array subtitle; - if (ConfigData.danmakuEnable) { - dictionary dic; - dic["name"] = "【弹幕】" + title; - dic["url"] = ConfigData.danmakuUrl + cid; - subtitle.insertLast(dic); - if (!subtitle.empty()) MetaData["subtitle"] = subtitle; - } - - res = apiPost("/pgc/season/episode/web/info?ep_id=" + epid); - Reader.parse(res, Root); - - array author; - if (Root["data"]["related_up"].isArray()) { - for (int i = 0; i < Root["data"]["related_up"].size(); i++) { - author.insertLast(Root["data"]["related_up"][i]["uname"].asString()); - } - } - MetaData["author"] = join(author, ","); - MetaData["viewCount"] = Root["data"]["stat"]["reply"].asString(); - MetaData["likeCount"] = Root["data"]["stat"]["like"].asString(); - } - break; - } - } - - AppendVideoQualityList(bvid, aid, cid, url, QualityList); + log("==============================Bangumi============================="); + string url; + string aid; + string bvid; + string cid; + string epid = parseEPId(path); - return url; -} + string params = "ep_id=" + epid; + string res = apiPost("/pgc/view/web/ep/page?" + encWbi(params)); + JsonReader Reader; + JsonValue Root; + + Reader.parse(res, Root); + epid = Root["result"]["locator"]["target_ep_id"].asString(); + JsonValue sections = Root["result"]["sections"]; + + if (!sections.isArray()) return url; + JsonValue section = sections[0]; + if (!section["pages"].isArray()) return url; + + for (int i = 0; i < section["pages"].size(); i++) { + JsonValue page = section["pages"][i]; + if (!page.isObject()) continue; + JsonValue episodes = page["episodes"]; + if (!episodes.isArray()) continue; + for (int j = 0; j < episodes.size(); j++) { + JsonValue episode = episodes[j]; + if (episode["ep_id"].asString() != epid) continue; + + aid = episode["aid"].asString(); + bvid = episode["bvid"].asString(); + cid = episode["cid"].asString(); + + if (@MetaData !is null) { + MetaData["vid"] = join({bvid, cid}, "|"); + string title = episode["show_title"].asString(); + MetaData["title"] = title; + MetaData["duration"] = episode["duration"].asString(); + MetaData["thumbnail"] = episode["cover"].asString(); + MetaData["webUrl"] = episode["link"].asString(); + MetaData["date"] = UnixTimeToDateTime(episode["pub_time"].asInt64()); + MetaData["fileExt"] = "mp4"; + + if (episode["skip"].isObject()) { + array chapter; + dictionary item; + + if (episode["skip"]["op"].isObject() && episode["skip"]["op"]["end"].asInt() != 0) { + item["title"] = "开场动画"; + item["time"] = formatFloat(episode["skip"]["op"]["start"].asFloat() * 1000, "", 32, 0); + chapter.insertLast(item); + + item["title"] = "正片"; + item["time"] = formatFloat(episode["skip"]["op"]["end"].asFloat() * 1000, "", 32, 0); + chapter.insertLast(item); + } + if (episode["skip"]["ed"].isObject() && episode["skip"]["ed"]["start"].asInt() != 0 && episode["skip"]["ed"]["end"].asInt() != 0) { + item["title"] = "片尾"; + item["time"] = formatFloat(episode["skip"]["ed"]["start"].asFloat() * 1000, "", 32, 0); + chapter.insertLast(item); + + if (episode["skip"]["ed"]["end"].asFloat() * 1000 < episode["duration"].asFloat()) { + item["title"] = "正片"; + item["time"] = formatFloat(episode["skip"]["ed"]["end"].asFloat() * 1000, "", 32, 0); + chapter.insertLast(item); + } + } -string Video(string id, const string&in path, dictionary& MetaData, array& QualityList) { - log("==============================video============================="); - string res; - string bvid; - string aid; - string cid; - string title; - string url; - string params; - JsonReader reader; - JsonValue Root; - array subtitle; - array chapter; - - int p = parseInt(parse(path, "p", "1")); - - if (id.find("BV") == 0) { - bvid = id; - params += "bvid=" + id; - } - if (id.find("av") == 0) { - aid = id; - params += "aid=" + id; - } - res = apiPost("/x/web-interface/wbi/view/detail?" + encWbi(params)); - reader.parse(res, Root); - JsonValue view = Root["data"]["View"]; - - if (view["redirect_url"].isString()) return Bangumi(view["redirect_url"].asString(), MetaData, QualityList); - - bvid = view["bvid"].asString(); - aid = view["aid"].asString(); + if (ConfigData.enableSponsorBlock) { + status = 6; + chapter = generateChapter(bvid, chapter, episode["duration"].asFloat()); + status = 4; + } + + if (!chapter.empty()) MetaData["chapter"] = chapter; + } + + array subtitle; + if (ConfigData.danmakuEnable) { + dictionary dic; + dic["name"] = "【弹幕】" + title; + dic["url"] = ConfigData.danmakuUrl + cid; + subtitle.insertLast(dic); + if (!subtitle.empty()) MetaData["subtitle"] = subtitle; + } + + res = apiPost("/pgc/season/episode/web/info?ep_id=" + epid); + Reader.parse(res, Root); + + array author; + if (Root["data"]["related_up"].isArray()) { + for (int i = 0; i < Root["data"]["related_up"].size(); i++) { + author.insertLast(Root["data"]["related_up"][i]["uname"].asString()); + } + } + MetaData["author"] = join(author, ","); + MetaData["viewCount"] = Root["data"]["stat"]["reply"].asString(); + MetaData["likeCount"] = Root["data"]["stat"]["like"].asString(); + } + break; + } + } + + AppendVideoQualityList(bvid, aid, cid, url, QualityList); - if (@MetaData !is null) { - cid = view["pages"][p-1]["cid"].asString(); - - if (view["pages"].size() == 1) { - title = view["title"].asString(); - } else { - title = view["pages"][p-1]["part"].asString(); - } - - MetaData["vid"] = join({bvid, cid}, "|"); - MetaData["title"] = title; - MetaData["duration"] = formatInt(view["duration"].asInt() * 1000); - MetaData["thumbnail"] = view["pic"].asString(); - MetaData["author"] = view["owner"]["name"].asString(); - MetaData["content"] = view["desc"].asString(); - MetaData["webUrl"] = makeWebUrl(path); - MetaData["viewCount"] = view["stat"]["view"].asString(); - MetaData["likeCount"] = view["stat"]["like"].asString(); - MetaData["dislikeCount"] = view["stat"]["dislike"].asString(); - MetaData["date"] = UnixTimeToDateTime(view["pubdate"].asInt64()); - MetaData["fileExt"] = "mp4"; - - if (ConfigData.enableSponsorBlock) { - status = 6; - chapter = generateChapter(bvid, chapter, view["duration"].asInt() * 1000.0); - status = 4; - } - if (!chapter.empty()) MetaData["chapter"] = chapter; + return url; +} + +string Video(string id, const string&in path, dictionary& MetaData, array& QualityList) { + log("==============================video============================="); + string res; + string bvid; + string aid; + string cid; + string title; + string url; + string params; + JsonReader reader; + JsonValue Root; + array subtitle; + array chapter; + + int p = parseInt(parse(path, "p", "1")); + + if (id.find("BV") == 0) { + bvid = id; + params += "bvid=" + id; + } + if (id.find("av") == 0) { + aid = id; + params += "aid=" + id; + } + res = apiPost("/x/web-interface/wbi/view/detail?" + encWbi(params)); + reader.parse(res, Root); + JsonValue view = Root["data"]["View"]; + + if (view["redirect_url"].isString()) return Bangumi(view["redirect_url"].asString(), MetaData, QualityList); + + bvid = view["bvid"].asString(); + aid = view["aid"].asString(); + + if (@MetaData !is null) { + cid = view["pages"][p-1]["cid"].asString(); + + if (view["pages"].size() == 1) { + title = view["title"].asString(); + } else { + title = view["pages"][p-1]["part"].asString(); + } - if (ConfigData.danmakuEnable) { - dictionary dic; - dic["name"] = "【弹幕】" + title; - dic["url"] = ConfigData.danmakuUrl + cid; - subtitle.insertLast(dic); - if (!subtitle.empty()) MetaData["subtitle"] = subtitle; - } - } - - AppendVideoQualityList(bvid, aid, cid, url, QualityList); + MetaData["vid"] = join({bvid, cid}, "|"); + MetaData["title"] = title; + MetaData["duration"] = formatInt(view["duration"].asInt() * 1000); + MetaData["thumbnail"] = view["pic"].asString(); + MetaData["author"] = view["owner"]["name"].asString(); + MetaData["content"] = view["desc"].asString(); + MetaData["webUrl"] = makeWebUrl(path); + MetaData["viewCount"] = view["stat"]["view"].asString(); + MetaData["likeCount"] = view["stat"]["like"].asString(); + MetaData["dislikeCount"] = view["stat"]["dislike"].asString(); + MetaData["date"] = UnixTimeToDateTime(view["pubdate"].asInt64()); + MetaData["fileExt"] = "mp4"; + + if (ConfigData.enableSponsorBlock) { + status = 6; + chapter = generateChapter(bvid, chapter, view["duration"].asInt() * 1000.0); + status = 4; + } + if (!chapter.empty()) MetaData["chapter"] = chapter; + + if (ConfigData.danmakuEnable) { + dictionary dic; + dic["name"] = "【弹幕】" + title; + dic["url"] = ConfigData.danmakuUrl + cid; + subtitle.insertLast(dic); + if (!subtitle.empty()) MetaData["subtitle"] = subtitle; + } + } + + AppendVideoQualityList(bvid, aid, cid, url, QualityList); - return url; + return url; } string Live(string id, const string&in path, dictionary& MetaData, array& QualityList) { - log("==============================live=============================="); - string url; - string res; - - res = apiPost("/xlive/web-room/v1/index/getInfoByRoom?room_id=" + id, "", "https://api.live.bilibili.com"); - JsonReader Reader; - JsonValue Root; - if (!Reader.parse(res, Root) || !Root.isObject() || Root["code"].asInt() != 0) { - return url; - } - - JsonValue data = Root["data"]["room_info"]; - string room_id = data["room_id"].asInt(); - - if (@MetaData !is null) { - MetaData["title"] = data["title"].asString(); - MetaData["thumbnail"] = data["cover"].asString(); - MetaData["author"] = Root["data"]["anchor_info"]["base_info"]["uname"].asString(); - MetaData["content"] = data["description"].asString(); - MetaData["webUrl"] = makeWebUrl(path); - MetaData["viewCount"] = Root["watched_show"]["num"].asString(); - MetaData["likeCount"] = Root["like_info_v3"]["like"].asString(); - MetaData["fileExt"] = "mp4"; - - if (!ConfigData.bilibiliDanmujiServer.isEmpty()) { - string chatUrl = getChatUrl(room_id, ConfigData.bilibiliDanmujiServer); - log('chatUrl', chatUrl); - MetaData["chatUrl"] = chatUrl; - } - } + log("==============================live=============================="); + string url; + string res; + + res = apiPost("/xlive/web-room/v1/index/getInfoByRoom?room_id=" + id, "", "https://api.live.bilibili.com"); + JsonReader Reader; + JsonValue Root; + if (!Reader.parse(res, Root) || !Root.isObject() || Root["code"].asInt() != 0) { + return url; + } + + JsonValue data = Root["data"]["room_info"]; + string room_id = data["room_id"].asInt(); + + if (@MetaData !is null) { + MetaData["title"] = data["title"].asString(); + MetaData["thumbnail"] = data["cover"].asString(); + MetaData["author"] = Root["data"]["anchor_info"]["base_info"]["uname"].asString(); + MetaData["content"] = data["description"].asString(); + MetaData["webUrl"] = makeWebUrl(path); + MetaData["viewCount"] = Root["watched_show"]["num"].asString(); + MetaData["likeCount"] = Root["like_info_v3"]["like"].asString(); + MetaData["fileExt"] = "mp4"; + + if (!ConfigData.bilibiliDanmujiServer.isEmpty()) { + string chatUrl = getChatUrl(room_id, ConfigData.bilibiliDanmujiServer); + log('chatUrl', chatUrl); + MetaData["chatUrl"] = chatUrl; + } + } + + status = 5; - status = 5; + array accept_qns; + string default_format; - array accept_qns; - string default_format; - - int qn = 30000; - - res = apiPost("/xlive/web-room/v2/index/getRoomPlayInfo?room_id=" + room_id + "&qn=" + qn + "&codec=0,1,2&format=0,1,2&mask=0&no_playurl=0&platform=web&protocol=0,1&eotf=0,1,2", "", "https://api.live.bilibili.com"); - if (!Reader.parse(res, Root) || !Root.isObject() || Root["code"].asInt() != 0) { - return url; - } - - JsonValue playurl = Root["data"]["playurl_info"]["playurl"]; - if (!playurl.isObject()) { - log('Root["data"]["playurl_info"]["playurl"] is not exists.'); - return url; - } - - JsonValue g_qn_desc = playurl["g_qn_desc"]; - if (!g_qn_desc.isArray()) { - log('Root["data"]["playurl_info"]["playurl"]["g_qn_desc"] is not array.'); - return url; - } - - JsonValue streams = playurl["stream"]; - if (!streams.isArray()) { - log('streams is not array.'); - return url; - } - - for (int s = 0; s < streams.size(); s++) { - if (streams[s]["protocol_name"].asString() != "http_hls") { - continue; - } - - JsonValue formats = streams[s]["format"]; - if (!formats.isArray()) { - continue; - } + int qn = 30000; + + res = apiPost("/xlive/web-room/v2/index/getRoomPlayInfo?room_id=" + room_id + "&qn=" + qn + "&codec=0,1,2&format=0,1,2&mask=0&no_playurl=0&platform=web&protocol=0,1&eotf=0,1,2", "", "https://api.live.bilibili.com"); + if (!Reader.parse(res, Root) || !Root.isObject() || Root["code"].asInt() != 0) { + return url; + } + + JsonValue playurl = Root["data"]["playurl_info"]["playurl"]; + if (!playurl.isObject()) { + log('Root["data"]["playurl_info"]["playurl"] is not exists.'); + return url; + } + + JsonValue g_qn_desc = playurl["g_qn_desc"]; + if (!g_qn_desc.isArray()) { + log('Root["data"]["playurl_info"]["playurl"]["g_qn_desc"] is not array.'); + return url; + } + + JsonValue streams = playurl["stream"]; + if (!streams.isArray()) { + log('streams is not array.'); + return url; + } + + for (int s = 0; s < streams.size(); s++) { + if (streams[s]["protocol_name"].asString() != "http_hls") { + continue; + } + + JsonValue formats = streams[s]["format"]; + if (!formats.isArray()) { + continue; + } // 一些小主播不提供 fmp4,优先选择 fmp4,其次 ts - for (int a = 0; a < formats.size(); a++) { - string format_name_candidate = formats[a]["format_name"].asString(); - if (format_name_candidate == "fmp4") { - default_format = "fmp4"; - break; - } - if (format_name_candidate == "ts") { - default_format = "ts"; - } - } - if (default_format.empty()) { - log("formats(fmp4 and ts) is not exists."); - continue; - } - - for (int f = 0; f < formats.size(); f++) { - if (formats[f]["format_name"].asString() != default_format) { - continue; - } - - JsonValue codecs = formats[f]["codec"]; - if (!codecs.isArray()) { - continue; - } - - for (int i = 0; i < codecs.size(); i++) { - JsonValue codec = codecs[i]; - - JsonValue qnValue = codec["accept_qn"]; - if (qnValue.isArray()) { - for (int j = 0; j < qnValue.size(); j++) { - int qn = qnValue[j].asInt(); - - if (accept_qns.find(qn) < 0) { - accept_qns.insertLast(qn); - } - } - } - } - } - } - - int best_qn = 0; - accept_qns.sortAsc(); - for (int i = 0; i < accept_qns.size(); i++) { - if (best_qn < accept_qns[i]) { - best_qn = accept_qns[i]; - } - } - - int itag = 0; - for (int i = 0; i < accept_qns.size(); i++) { - qn = accept_qns[i]; - res = apiPost("/xlive/web-room/v2/index/getRoomPlayInfo?room_id=" + room_id + "&qn=" + accept_qns[i] + "&codec=0,1,2&format=0,1,2&mask=0&no_playurl=0&platform=web&protocol=0,1&eotf=0,1,2", "", "https://api.live.bilibili.com"); - - if (!Reader.parse(res, Root) || !Root.isObject() || Root["code"].asInt() != 0) { - return url; - } - - JsonValue playurl = Root["data"]["playurl_info"]["playurl"]; - if (!playurl.isObject()) { - log('Root["data"]["playurl_info"]["playurl"] is not exists.'); - return url; - } - - g_qn_desc = playurl["g_qn_desc"]; - if (!g_qn_desc.isArray()) { - log('Root["data"]["playurl_info"]["playurl"]["g_qn_desc"] is not array.'); - return url; - } - - JsonValue streams = playurl["stream"]; - if (!streams.isArray()) { - log('streams is not array.'); - return url; - } - - for (int s = 0; s < streams.size(); s++) { - if (streams[s]["protocol_name"].asString() != "http_hls") { - continue; - } + for (int a = 0; a < formats.size(); a++) { + string format_name_candidate = formats[a]["format_name"].asString(); + if (format_name_candidate == "fmp4") { + default_format = "fmp4"; + break; + } + if (format_name_candidate == "ts") { + default_format = "ts"; + } + } + if (default_format.empty()) { + log("formats(fmp4 and ts) is not exists."); + continue; + } + + for (int f = 0; f < formats.size(); f++) { + if (formats[f]["format_name"].asString() != default_format) { + continue; + } + + JsonValue codecs = formats[f]["codec"]; + if (!codecs.isArray()) { + continue; + } + + for (int i = 0; i < codecs.size(); i++) { + JsonValue codec = codecs[i]; + + JsonValue qnValue = codec["accept_qn"]; + if (qnValue.isArray()) { + for (int j = 0; j < qnValue.size(); j++) { + int qn = qnValue[j].asInt(); + + if (accept_qns.find(qn) < 0) { + accept_qns.insertLast(qn); + } + } + } + } + } + } + + int best_qn = 0; + accept_qns.sortAsc(); + for (int i = 0; i < accept_qns.size(); i++) { + if (best_qn < accept_qns[i]) { + best_qn = accept_qns[i]; + } + } + + int itag = 0; + for (int i = 0; i < accept_qns.size(); i++) { + qn = accept_qns[i]; + res = apiPost("/xlive/web-room/v2/index/getRoomPlayInfo?room_id=" + room_id + "&qn=" + accept_qns[i] + "&codec=0,1,2&format=0,1,2&mask=0&no_playurl=0&platform=web&protocol=0,1&eotf=0,1,2", "", "https://api.live.bilibili.com"); + + if (!Reader.parse(res, Root) || !Root.isObject() || Root["code"].asInt() != 0) { + return url; + } + + JsonValue playurl = Root["data"]["playurl_info"]["playurl"]; + if (!playurl.isObject()) { + log('Root["data"]["playurl_info"]["playurl"] is not exists.'); + return url; + } + + g_qn_desc = playurl["g_qn_desc"]; + if (!g_qn_desc.isArray()) { + log('Root["data"]["playurl_info"]["playurl"]["g_qn_desc"] is not array.'); + return url; + } + + JsonValue streams = playurl["stream"]; + if (!streams.isArray()) { + log('streams is not array.'); + return url; + } + + for (int s = 0; s < streams.size(); s++) { + if (streams[s]["protocol_name"].asString() != "http_hls") { + continue; + } - JsonValue formats = streams[s]["format"]; - if (!formats.isArray()) { - continue; - } + JsonValue formats = streams[s]["format"]; + if (!formats.isArray()) { + continue; + } - for (int f = 0; f < formats.size(); f++) { - if (formats[f]["format_name"].asString() != default_format) { - continue; - } + for (int f = 0; f < formats.size(); f++) { + if (formats[f]["format_name"].asString() != default_format) { + continue; + } - JsonValue codecs = formats[f]["codec"]; - if (!codecs.isArray()) { - continue; - } + JsonValue codecs = formats[f]["codec"]; + if (!codecs.isArray()) { + continue; + } - for (int i = 0; i < codecs.size(); i++) { - JsonValue codec = codecs[i]; - string codec_name = codec["codec_name"].asString(); + for (int i = 0; i < codecs.size(); i++) { + JsonValue codec = codecs[i]; + string codec_name = codec["codec_name"].asString(); - if (codec["current_qn"].asInt() != qn) { - continue; - } + if (codec["current_qn"].asInt() != qn) { + continue; + } - JsonValue url_infos = codec["url_info"]; - if (!url_infos.isArray() || url_infos.size() == 0) { - continue; - } + JsonValue url_infos = codec["url_info"]; + if (!url_infos.isArray() || url_infos.size() == 0) { + continue; + } - for (int j = 0; j < url_infos.size(); j++) { + for (int j = 0; j < url_infos.size(); j++) { - string url_info_url = codec["url_info"][j]["host"].asString() + codec["base_url"].asString() + codec["url_info"][j]["extra"].asString(); + string url_info_url = codec["url_info"][j]["host"].asString() + codec["base_url"].asString() + codec["url_info"][j]["extra"].asString(); - if (isP2PCDN(url_info_url)) continue; + if (isP2PCDN(url_info_url)) continue; - if (ConfigData.parseM3u8RealUrl) url_info_url = GetM3u8RealURL(url_info_url); + if (ConfigData.parseM3u8RealUrl) url_info_url = GetM3u8RealURL(url_info_url); - if (best_qn == codec["current_qn"].asInt()) url = url_info_url; + if (best_qn == codec["current_qn"].asInt()) url = url_info_url; - if (@QualityList !is null) { - for (int k = 0; k < QualityList.size(); k++) { - QualityList[i].get("url", url); - if (url == url_info_url) continue; - } + if (@QualityList !is null) { + for (int k = 0; k < QualityList.size(); k++) { + QualityList[i].get("url", url); + if (url == url_info_url) continue; + } - JsonValue video_color_info = codec["video_color_info"]; - int width = codec["media_info"]["width"].asInt(); - int height = codec["media_info"]["height"].asInt(); - int bitrateVal = parseInt(HostRegExpParse(url_info_url, "(?:[?&]origin_bitrate=)(\\d+)(?:&|$)")); - string bitrate = HostFormatBitrate(bitrateVal * 1000.0) + "bps"; - bool isHDR = (codec["hdr_type"].asInt() == 1); - string format = codec_name + ", " + bitrate; - string quality = getLiveQuality(g_qn_desc, codec["current_qn"].asInt(), codec["hdr_type"].asInt(), video_color_info); - string qualityDetail; - if (j == 0) qualityDetail = quality + " - 主 "; - if (j > 0) { - string backup = " - 备 "; - if (j > 1) { - backup += j - 1; - } - qualityDetail = quality + backup; - } - if (itag <= 0 || HostExistITag(itag)) itag = HostGetITag(height, 0, true, true); - while (HostExistITag(itag)) itag++; - HostSetITag(itag); - - QualityListItem item; - - item.url = url_info_url; - item.bitrateVal = bitrateVal; - item.bitrate = bitrate; - item.resolution = width + "x" + height; - ; - item.isHDR = isHDR; - item.format = format; - item.quality = quality; - item.qualityDetail = qualityDetail; - item.itag = itag; - - QualityList.insertLast(item.toDictionary()); - } - } - } - } - } - } - - log("url", url); + JsonValue video_color_info = codec["video_color_info"]; + int width = codec["media_info"]["width"].asInt(); + int height = codec["media_info"]["height"].asInt(); + int bitrateVal = parseInt(HostRegExpParse(url_info_url, "(?:[?&]origin_bitrate=)(\\d+)(?:&|$)")); + string bitrate = HostFormatBitrate(bitrateVal * 1000.0) + "bps"; + bool isHDR = (codec["hdr_type"].asInt() == 1); + string format = codec_name + ", " + bitrate; + string quality = getLiveQuality(g_qn_desc, codec["current_qn"].asInt(), codec["hdr_type"].asInt(), video_color_info); + string qualityDetail; + if (j == 0) qualityDetail = quality + " - 主 "; + if (j > 0) { + string backup = " - 备 "; + if (j > 1) { + backup += j - 1; + } + qualityDetail = quality + backup; + } + if (itag <= 0 || HostExistITag(itag)) itag = HostGetITag(height, 0, true, true); + while (HostExistITag(itag)) itag++; + HostSetITag(itag); + + QualityListItem item; + + item.url = url_info_url; + item.bitrateVal = bitrateVal; + item.bitrate = bitrate; + item.resolution = width + "x" + height; + ; + item.isHDR = isHDR; + item.format = format; + item.quality = quality; + item.qualityDetail = qualityDetail; + item.itag = itag; + + QualityList.insertLast(item.toDictionary()); + } + } + } + } + } + } + + log("url", url); // log("Quality items", QualityList.length()); // for (uint i = 0; i < QualityList.length(); i++) { // log("QualityList[" + i + "] = " + string(QualityList[i]["quality"]) + " | " + int(QualityList[i]["itag"]) + " | " + string(QualityList[i]["url"])); // } - return url; + return url; } string Audio(const string&in path, dictionary& MetaData, array& QualityList) { - string id = HostRegExpParse(path, "/audio/au([0-9]+)"); - JsonReader Reader; - JsonValue Root; - string url; - string res; - - res = post("https://www.bilibili.com/audio/music-service-c/web/song/info?sid=" + id); - res = HostDecompress(res); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() != 0) { - return ""; - } - JsonValue data = Root["data"]; - MetaData["title"] = data["title"].asString(); - MetaData["thumbnail"] = data["cover"].asString(); - if (data["author"].isString()) { - MetaData["author"] = data["author"].asString(); - } - } - - status = 5; - res = post("https://www.bilibili.com/audio/music-service-c/web/url?privilege=2&quality=2&sid=" + id); - res = HostDecompress(res); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() != 0) { - return ""; - } - JsonValue data = Root["data"]["cdns"]; - if (data.isArray()) { - return data[0].asString(); - } - } - return url; + string id = HostRegExpParse(path, "/audio/au([0-9]+)"); + JsonReader Reader; + JsonValue Root; + string url; + string res; + + res = post("https://www.bilibili.com/audio/music-service-c/web/song/info?sid=" + id); + res = HostDecompress(res); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return ""; + } + JsonValue data = Root["data"]; + MetaData["title"] = data["title"].asString(); + MetaData["thumbnail"] = data["cover"].asString(); + if (data["author"].isString()) { + MetaData["author"] = data["author"].asString(); + } + } + + status = 5; + res = post("https://www.bilibili.com/audio/music-service-c/web/url?privilege=2&quality=2&sid=" + id); + res = HostDecompress(res); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return ""; + } + JsonValue data = Root["data"]["cdns"]; + if (data.isArray()) { + return data[0].asString(); + } + } + return url; } array watchlater() { - array videos; - string res = apiPost("/x/v2/history/toview"); - JsonReader Reader; - JsonValue Root; - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue data = Root["data"]["list"]; - if (data.isArray()) { - for (int i = 0; i < data.size(); i++) { - JsonValue item = data[i]; - if (item.isObject()) { - dictionary video; - int p = item["page"]["page"].asInt(); - if (p == 1) { - video["title"] = item["title"].asString(); - } else { - video["title"] = item["title"].asString() + " | " + item["page"]["part"].asString(); - } - video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?p=" + p; - video["thumbnail"] = item["pic"].asString(); - video["author"] = item["owner"]["name"].asString(); - videos.insertLast(video); - } - } - } - } - } - if (videos.size() == 0) { - HostMessageBox("你的 [稍后再看] 列表是空的,刷点别的视频吧。", "[稍后再看] 为空", 2,0); - } - return videos; + array videos; + string res = apiPost("/x/v2/history/toview"); + JsonReader Reader; + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue data = Root["data"]["list"]; + if (data.isArray()) { + for (int i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + if (item.isObject()) { + dictionary video; + int p = item["page"]["page"].asInt(); + if (p == 1) { + video["title"] = item["title"].asString(); + } else { + video["title"] = item["title"].asString() + " | " + item["page"]["part"].asString(); + } + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?p=" + p; + video["thumbnail"] = item["pic"].asString(); + video["author"] = item["owner"]["name"].asString(); + videos.insertLast(video); + } + } + } + } + } + if (videos.size() == 0) { + HostMessageBox("你的 [稍后再看] 列表是空的,刷点别的视频吧。", "[稍后再看] 为空", 2,0); + } + return videos; } array History() { - array videos; - uint max = 0; - uint ps = 30; - string res = apiPost("/x/web-interface/history/cursor?max=" + max + "&ps=" + ps); - JsonReader Reader; - JsonValue Root; - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue data = Root["data"]["list"]; - if (data.isArray()) { - for (int i = 0; i < data.size(); i++) { - JsonValue item = data[i]; - string type = item["history"]["business"].asString(); + array videos; + uint max = 0; + uint ps = 30; + string res = apiPost("/x/web-interface/history/cursor?max=" + max + "&ps=" + ps); + JsonReader Reader; + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue data = Root["data"]["list"]; + if (data.isArray()) { + for (int i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + string type = item["history"]["business"].asString(); // archive live pgc - if (type == "archive" || type == "live") { - if (item.isObject()) { - dictionary video; - video["thumbnail"] = item["cover"].asString(); - video["author"] = item["author_name"].asString(); - if (type == "live") { - if (item["live_status"].asInt() != 1) { - continue; - } - video["title"] = "直播 | " + item["title"].asString(); - video["url"] = item["uri"].asString(); - } else if (type == "archive") { - int p = item["history"]["page"].asInt(); - if (p == 1) { - video["title"] = item["title"].asString(); - } else { - video["title"] = item["title"].asString() + " | " + item["history"]["part"].asString(); - } - video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["history"]["bvid"].asString() + "?p=" + p; - } else { - continue; - } - videos.insertLast(video); - } - } - } - } - } - } - return videos; + if (type == "archive" || type == "live") { + if (item.isObject()) { + dictionary video; + video["thumbnail"] = item["cover"].asString(); + video["author"] = item["author_name"].asString(); + if (type == "live") { + if (item["live_status"].asInt() != 1) { + continue; + } + video["title"] = "直播 | " + item["title"].asString(); + video["url"] = item["uri"].asString(); + } else if (type == "archive") { + int p = item["history"]["page"].asInt(); + if (p == 1) { + video["title"] = item["title"].asString(); + } else { + video["title"] = item["title"].asString() + " | " + item["history"]["part"].asString(); + } + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["history"]["bvid"].asString() + "?p=" + p; + } else { + continue; + } + videos.insertLast(video); + } + } + } + } + } + } + return videos; } array spaceSeason(string path) { - array videos; - int page_size = 20; - int page_num = 1; - string uid = HostRegExpParse(path, "/([0-9]+)/lists"); - string sid = HostRegExpParse(path, "lists/([0-9]+)"); - string baseurl; - bool isCollection = parse(path, "type") == "season"; - if (isCollection) { - baseurl = "/x/polymer/web-space/seasons_archives_list?mid=" + uid + "&season_id=" + sid + "&sort_reverse=" + parse(path, "sort_reverse", "false") + "&page_size=" + page_size; - while (true) { - string url; - url = baseurl + "&page_num=" + page_num; - string res = apiPost(url); - JsonReader Reader; - JsonValue Root; - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue data = Root["data"]["archives"]; - if (data.isArray()) { - for (int i = 0; i < data.size(); i++) { - JsonValue item = data[i]; - if (item.isObject()) { - dictionary video; - video["title"] = item["title"].asString(); - video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); - video["thumbnail"] = item["pic"].asString(); - video["date"] = UnixTimeToDateTime(item["pubdate"].asInt64()); - videos.insertLast(video); - } - } - } - JsonValue page = Root["data"]["page"]; - if (page["page_num"].asInt() * page["page_size"].asInt() >= page["total"].asInt()) { - break; - } - page_num += 1; - } else { - return videos; - } - } - } - } else { - baseurl = "/x/polymer/web-space/seasons_series_list?mid=" + uid + "&page_size=" + page_size; - while (true) { - string url; - url = baseurl + "&page_num=" + page_num; - string res = apiPost(url); - JsonReader Reader; - JsonValue Root; - Reader.parse(res, Root); - JsonValue seasons_lists = Root["data"]["items_lists"]["seasons_list"]; - if (seasons_lists.isArray()) { - for (int j = 0; j < seasons_lists.size(); j++) { - JsonValue seasons_list = seasons_lists[j]; - string title = seasons_list["meta"]["name"].asString(); - JsonValue data = seasons_list["archives"]; - if (data.isArray()) { - for (int i = 0; i < data.size(); i++) { - JsonValue item = data[i]; - if (item.isObject()) { - dictionary video; - video["title"] = "【" + title + "】-" + item["title"].asString(); - video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); - video["thumbnail"] = item["pic"].asString(); - video["date"] = UnixTimeToDateTime(item["pubdate"].asInt64()); - videos.insertLast(video); - } - } - } - } - } - JsonValue page = Root["data"]["items_lists"]["page"]; - if (page["page_num"].asInt() * page["page_size"].asInt() >= page["total"].asInt()) { - break; - } - page_num += 1; - } - } - - return videos; + array videos; + int page_size = 20; + int page_num = 1; + string uid = HostRegExpParse(path, "/([0-9]+)/lists"); + string sid = HostRegExpParse(path, "lists/([0-9]+)"); + string baseurl; + bool isCollection = parse(path, "type") == "season"; + if (isCollection) { + baseurl = "/x/polymer/web-space/seasons_archives_list?mid=" + uid + "&season_id=" + sid + "&sort_reverse=" + parse(path, "sort_reverse", "false") + "&page_size=" + page_size; + while (true) { + string url; + url = baseurl + "&page_num=" + page_num; + string res = apiPost(url); + JsonReader Reader; + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue data = Root["data"]["archives"]; + if (data.isArray()) { + for (int i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + if (item.isObject()) { + dictionary video; + video["title"] = item["title"].asString(); + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + video["thumbnail"] = item["pic"].asString(); + video["date"] = UnixTimeToDateTime(item["pubdate"].asInt64()); + videos.insertLast(video); + } + } + } + JsonValue page = Root["data"]["page"]; + if (page["page_num"].asInt() * page["page_size"].asInt() >= page["total"].asInt()) { + break; + } + page_num += 1; + } else { + return videos; + } + } + } + } else { + baseurl = "/x/polymer/web-space/seasons_series_list?mid=" + uid + "&page_size=" + page_size; + while (true) { + string url; + url = baseurl + "&page_num=" + page_num; + string res = apiPost(url); + JsonReader Reader; + JsonValue Root; + Reader.parse(res, Root); + JsonValue seasons_lists = Root["data"]["items_lists"]["seasons_list"]; + if (seasons_lists.isArray()) { + for (int j = 0; j < seasons_lists.size(); j++) { + JsonValue seasons_list = seasons_lists[j]; + string title = seasons_list["meta"]["name"].asString(); + JsonValue data = seasons_list["archives"]; + if (data.isArray()) { + for (int i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + if (item.isObject()) { + dictionary video; + video["title"] = "【" + title + "】-" + item["title"].asString(); + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + video["thumbnail"] = item["pic"].asString(); + video["date"] = UnixTimeToDateTime(item["pubdate"].asInt64()); + videos.insertLast(video); + } + } + } + } + } + JsonValue page = Root["data"]["items_lists"]["page"]; + if (page["page_num"].asInt() * page["page_size"].asInt() >= page["total"].asInt()) { + break; + } + page_num += 1; + } + } + + return videos; } array spaceVideo(string path) { - array videos; - int ps = 50; - int page = parseInt(parse(path, "pn", "1")); - int pn = page; - string baseurl = "/x/space/wbi/arc/search?"; - string params1; - string params2; - params1 += "keyword=" + parse(path, "keyword"); - params1 += "&mid=" + HostRegExpParse(path, "/([0-9]+)"); - params1 += "&order=" + parse(path, "order", "pubdate"); - - params2 += "&ps=" + ps; - params2 += "&tid=" + parse(path, "tid", "0"); - while (true) { - if (pn - page >= 10) { - break; - } - string params = params1 + "&pn=" + pn + params2; - string url = baseurl + encWbi(params); - string res = apiPost(url); - JsonReader Reader; - JsonValue Root; - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue data = Root["data"]["list"]["vlist"]; - if (data.isArray()) { - for (int i = 0; i < data.size(); i++) { - JsonValue item = data[i]; - if (item.isObject()) { - dictionary video; - video["title"] = item["title"].asString(); - video["duration"] = parseTime(item["length"].asString()); - video["thumbnail"] = item["pic"].asString(); - video["author"] = item["author"].asString(); - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); - if (!item["description"].asString().empty() || item["description"].asString() != "-") video["content"] = item["description"].asString(); - video["viewCount"] = item["play"].asString(); - video["date"] = UnixTimeToDateTime(item["created"].asInt64()); - videos.insertLast(video); - } - } - } - JsonValue page = Root["data"]["page"]; - if (page["pn"].asInt() * page["ps"].asInt() >= page["count"].asInt()) { - break; - } - pn += 1; - } else { - return videos; - } - } - } - return videos; + array videos; + int ps = 50; + int page = parseInt(parse(path, "pn", "1")); + int pn = page; + string baseurl = "/x/space/wbi/arc/search?"; + string params1; + string params2; + params1 += "keyword=" + parse(path, "keyword"); + params1 += "&mid=" + HostRegExpParse(path, "/([0-9]+)"); + params1 += "&order=" + parse(path, "order", "pubdate"); + + params2 += "&ps=" + ps; + params2 += "&tid=" + parse(path, "tid", "0"); + while (true) { + if (pn - page >= 10) { + break; + } + string params = params1 + "&pn=" + pn + params2; + string url = baseurl + encWbi(params); + string res = apiPost(url); + JsonReader Reader; + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue data = Root["data"]["list"]["vlist"]; + if (data.isArray()) { + for (int i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + if (item.isObject()) { + dictionary video; + video["title"] = item["title"].asString(); + video["duration"] = parseTime(item["length"].asString()); + video["thumbnail"] = item["pic"].asString(); + video["author"] = item["author"].asString(); + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + if (!item["description"].asString().empty() || item["description"].asString() != "-") video["content"] = item["description"].asString(); + video["viewCount"] = item["play"].asString(); + video["date"] = UnixTimeToDateTime(item["created"].asInt64()); + videos.insertLast(video); + } + } + } + JsonValue page = Root["data"]["page"]; + if (page["pn"].asInt() * page["ps"].asInt() >= page["count"].asInt()) { + break; + } + pn += 1; + } else { + return videos; + } + } + } + return videos; } array spaceAudio(string path) { - array audios; - int ps = 50; - int pn = 1; - string baseurl = "/audio/music-service/web/song/upper?"; - baseurl += "uid=" + HostRegExpParse(path, "/([0-9]+)"); - baseurl += "&ps=" + ps; - baseurl += "&order=" + parse(path, "order", "1"); - while (true) { - string url = baseurl + "&pn=" + pn; - string res = apiPost(url); - JsonReader Reader; - JsonValue Root; - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue data = Root["data"]["data"]; - if (data.isArray()) { - for (int i = 0; i < data.size(); i++) { - JsonValue item = data[i]; - if (item.isObject()) { - dictionary audio; - audio["title"] = item["title"].asString(); - audio["duration"] = item["duration"].asInt() * 1000; - audio["url"] = "https://www.bilibili.com/audio/au" + item["id"].asString(); - audio["thumbnail"] = item["cover"].asString(); - audios.insertLast(audio); - } - } - } - if (Root["data"]["curPage"].asInt() >= Root["data"]["pageCount"].asInt()) { - break; - } - pn += 1; - } else { - return audios; - } - } - } - return audios; + array audios; + int ps = 50; + int pn = 1; + string baseurl = "/audio/music-service/web/song/upper?"; + baseurl += "uid=" + HostRegExpParse(path, "/([0-9]+)"); + baseurl += "&ps=" + ps; + baseurl += "&order=" + parse(path, "order", "1"); + while (true) { + string url = baseurl + "&pn=" + pn; + string res = apiPost(url); + JsonReader Reader; + JsonValue Root; + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue data = Root["data"]["data"]; + if (data.isArray()) { + for (int i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + if (item.isObject()) { + dictionary audio; + audio["title"] = item["title"].asString(); + audio["duration"] = item["duration"].asInt() * 1000; + audio["url"] = "https://www.bilibili.com/audio/au" + item["id"].asString(); + audio["thumbnail"] = item["cover"].asString(); + audios.insertLast(audio); + } + } + } + if (Root["data"]["curPage"].asInt() >= Root["data"]["pageCount"].asInt()) { + break; + } + pn += 1; + } else { + return audios; + } + } + } + return audios; } array followingLive(uint page) { - array videos; - JsonReader Reader; - JsonValue Root; - string url = "https://api.live.bilibili.com/xlive/web-ucenter/user/following?page=" + page + "&page_size=10"; - string res = post(url); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue list = Root["data"]["list"]; - if (list.isArray()) { - for (int i = 0; i < list.size(); i++) { - JsonValue item = list[i]; + array videos; + JsonReader Reader; + JsonValue Root; + string url = "https://api.live.bilibili.com/xlive/web-ucenter/user/following?page=" + page + "&page_size=10"; + string res = post(url); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue list = Root["data"]["list"]; + if (list.isArray()) { + for (int i = 0; i < list.size(); i++) { + JsonValue item = list[i]; // 未开播 - if (item["live_status"].asInt() == 0) { - return videos; - } - dictionary video; - video["title"] = item["title"].asString(); - video["url"] = "https://live.bilibili.com/" + item["roomid"].asInt(); - video["thumbnail"] = item["face"].asString(); - video["author"] = item["uname"].asString(); - videos.insertLast(video); - } - if (page < Root["data"]["totalPage"].asUInt()) { - array videos2 = followingLive(page + 1); - for (uint i = 0; i < videos2.size(); i++) { - videos.insertLast(videos2[i]); - } - } - } - } - } - return videos; + if (item["live_status"].asInt() == 0) { + return videos; + } + dictionary video; + video["title"] = item["title"].asString(); + video["url"] = "https://live.bilibili.com/" + item["roomid"].asInt(); + video["thumbnail"] = item["face"].asString(); + video["author"] = item["uname"].asString(); + videos.insertLast(video); + } + if (page < Root["data"]["totalPage"].asUInt()) { + array videos2 = followingLive(page + 1); + for (uint i = 0; i < videos2.size(); i++) { + videos.insertLast(videos2[i]); + } + } + } + } + } + return videos; } array liveCategory(string path, uint page, string cateid, string parentAreaId, uint liveRoomCount) { - JsonReader Reader; - JsonValue Root; - - string renderData = HostRegExpParse(post(path), "window\\._render_data_\\s*=\\s*(\\{\"access_id\":\"[^\"]+\"\\})"); - if (!Reader.parse(renderData, Root) || !Root.isObject()) return array(); + JsonReader Reader; + JsonValue Root; + + string renderData = HostRegExpParse(post(path), "window\\._render_data_\\s*=\\s*(\\{\"access_id\":\"[^\"]+\"\\})"); + if (!Reader.parse(renderData, Root) || !Root.isObject()) return array(); - return liveCategory(page, cateid, parentAreaId, liveRoomCount, Root["access_id"].asString()); + return liveCategory(page, cateid, parentAreaId, liveRoomCount, Root["access_id"].asString()); } array liveCategory(uint page, string cateid, string parentAreaId, uint liveRoomCount, string w_webid) { - array videos; - JsonReader Reader; - JsonValue Root; - string params = "platform=web&parent_area_id=" + parentAreaId + "&area_id=" + cateid + "&page=" + page + "&w_webid=" + w_webid; - string url = "https://api.live.bilibili.com/xlive/web-interface/v1/second/getList?" + encWbi(params); - string res = post(url); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue list = Root["data"]["list"]; - if (list.isArray()) { - for (int i = 0; i < list.size(); i++) { - JsonValue item = list[i]; - dictionary video; - video["title"] = item["title"].asString(); - video["url"] = "https://live.bilibili.com/" + item["roomid"].asInt(); - video["thumbnail"] = item["face"].asString(); - video["author"] = item["uname"].asString(); - videos.insertLast(video); - liveRoomCount += 1; - if (liveRoomCount >= ConfigData.maxliveroom) { - return videos; - } - } - if (Root["data"]["has_more"].asBool()) { - array nextVideos = liveCategory(page + 1, cateid, parentAreaId, liveRoomCount, w_webid); - for (uint i = 0; i < nextVideos.size(); i++) { - videos.insertLast(nextVideos[i]); - } - } - } - } - } - return videos; + array videos; + JsonReader Reader; + JsonValue Root; + string params = "platform=web&parent_area_id=" + parentAreaId + "&area_id=" + cateid + "&page=" + page + "&w_webid=" + w_webid; + string url = "https://api.live.bilibili.com/xlive/web-interface/v1/second/getList?" + encWbi(params); + string res = post(url); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + JsonValue list = Root["data"]["list"]; + if (list.isArray()) { + for (int i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + dictionary video; + video["title"] = item["title"].asString(); + video["url"] = "https://live.bilibili.com/" + item["roomid"].asInt(); + video["thumbnail"] = item["face"].asString(); + video["author"] = item["uname"].asString(); + videos.insertLast(video); + liveRoomCount += 1; + if (liveRoomCount >= ConfigData.maxliveroom) { + return videos; + } + } + if (Root["data"]["has_more"].asBool()) { + array nextVideos = liveCategory(page + 1, cateid, parentAreaId, liveRoomCount, w_webid); + for (uint i = 0; i < nextVideos.size(); i++) { + videos.insertLast(nextVideos[i]); + } + } + } + } + } + return videos; } array PopularHistory() { - array videos; - JsonReader Reader; - JsonValue Root; - string res = apiPost("/x/web-interface/popular/precious?page_size=100&page=1"); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() != 0) { - return videos; - } - JsonValue list = Root["data"]["list"]; - if (list.isArray()) { - for (int i = 0; i < list.size(); i++) { - JsonValue item = list[i]; - dictionary video; - video["title"] = item["title"].asString(); - video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); - video["thumbnail"] = item["pic"].asString(); - video["author"] = item["owner"]["name"].asString(); - videos.insertLast(video); - } - } - } - return videos; + array videos; + JsonReader Reader; + JsonValue Root; + string res = apiPost("/x/web-interface/popular/precious?page_size=100&page=1"); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return videos; + } + JsonValue list = Root["data"]["list"]; + if (list.isArray()) { + for (int i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + dictionary video; + video["title"] = item["title"].asString(); + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + video["thumbnail"] = item["pic"].asString(); + video["author"] = item["owner"]["name"].asString(); + videos.insertLast(video); + } + } + } + return videos; } array PopularWeekly(string path) { - array videos; - JsonReader Reader; - JsonValue Root; - string num = parse(path, "num"); - if (num.empty()) { - string res = apiPost("/x/web-interface/popular/series/list"); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() != 0) { - return videos; - } - JsonValue list = Root["data"]["list"]; - if (list.isArray()) { - num = "" + list[0]["number"].asInt(); - } - } - } - string res = apiPost("/x/web-interface/popular/series/one?number=" + num); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() != 0) { - return videos; - } - JsonValue list = Root["data"]["list"]; - if (list.isArray()) { - for (int i = 0; i < list.size(); i++) { - JsonValue item = list[i]; - dictionary video; - video["title"] = item["title"].asString(); - video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); - video["thumbnail"] = item["pic"].asString(); - video["author"] = item["owner"]["name"].asString(); - videos.insertLast(video); - } - } - } - return videos; + array videos; + JsonReader Reader; + JsonValue Root; + string num = parse(path, "num"); + if (num.empty()) { + string res = apiPost("/x/web-interface/popular/series/list"); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return videos; + } + JsonValue list = Root["data"]["list"]; + if (list.isArray()) { + num = "" + list[0]["number"].asInt(); + } + } + } + string res = apiPost("/x/web-interface/popular/series/one?number=" + num); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return videos; + } + JsonValue list = Root["data"]["list"]; + if (list.isArray()) { + for (int i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + dictionary video; + video["title"] = item["title"].asString(); + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + video["thumbnail"] = item["pic"].asString(); + video["author"] = item["owner"]["name"].asString(); + videos.insertLast(video); + } + } + } + return videos; } array Ranking(string path) { - array videos; - - array names = { "全站", "国创相关", "动画", "音乐", "舞蹈", "游戏", "知识", "科技", "运动", "汽车", "生活", "美食", "动物圈", "鬼畜", "时尚", "娱乐", "影视" }; - array urls = { "www.bilibili.com/v/popular/rank/all", "www.bilibili.com/v/popular/rank/guochuang", "www.bilibili.com/v/popular/rank/douga", "www.bilibili.com/v/popular/rank/music", "www.bilibili.com/v/popular/rank/dance", "www.bilibili.com/v/popular/rank/game", "www.bilibili.com/v/popular/rank/knowledge", "www.bilibili.com/v/popular/rank/tec", "www.bilibili.com/v/popular/rank/spor", "www.bilibili.com/v/popular/rank/car", "www.bilibili.com/v/popular/rank/life", "www.bilibili.com/v/popular/rank/food", "www.bilibili.com/v/popular/rank/animal", "www.bilibili.com/v/popular/rank/kichiku", "www.bilibili.com/v/popular/rank/fashion", "www.bilibili.com/v/popular/rank/en", "www.bilibili.com/v/popular/rank/cinephile" }; - array ids = { 0, 168, 1, 3, 129, 4, 36, 188, 234, 223, 160, 211, 217, 119, 155, 5, 181 }; - int pos = -1; - for (uint i = 0; i < urls.size(); i++) { - if (path.find(urls[i]) >= 0) { - pos = i; - break; - } - } - if (pos < 0) { - return videos; - } - - JsonReader Reader; - JsonValue Root; - - string res = apiPost("/x/web-interface/ranking/v2?rid=" + ids[pos]); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() != 0) { - return videos; - } - JsonValue list = Root["data"]["list"]; - if (list.isArray()) { - for (int i = 0; i < list.size(); i++) { - JsonValue item = list[i]; - dictionary video; - video["title"] = item["title"].asString(); - video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); - video["thumbnail"] = item["pic"].asString(); - video["author"] = item["owner"]["name"].asString(); - videos.insertLast(video); - } - } - } - return videos; + array videos; + + array names = { "全站", "国创相关", "动画", "音乐", "舞蹈", "游戏", "知识", "科技", "运动", "汽车", "生活", "美食", "动物圈", "鬼畜", "时尚", "娱乐", "影视" }; + array urls = { "www.bilibili.com/v/popular/rank/all", "www.bilibili.com/v/popular/rank/guochuang", "www.bilibili.com/v/popular/rank/douga", "www.bilibili.com/v/popular/rank/music", "www.bilibili.com/v/popular/rank/dance", "www.bilibili.com/v/popular/rank/game", "www.bilibili.com/v/popular/rank/knowledge", "www.bilibili.com/v/popular/rank/tec", "www.bilibili.com/v/popular/rank/spor", "www.bilibili.com/v/popular/rank/car", "www.bilibili.com/v/popular/rank/life", "www.bilibili.com/v/popular/rank/food", "www.bilibili.com/v/popular/rank/animal", "www.bilibili.com/v/popular/rank/kichiku", "www.bilibili.com/v/popular/rank/fashion", "www.bilibili.com/v/popular/rank/en", "www.bilibili.com/v/popular/rank/cinephile" }; + array ids = { 0, 168, 1, 3, 129, 4, 36, 188, 234, 223, 160, 211, 217, 119, 155, 5, 181 }; + int pos = -1; + for (uint i = 0; i < urls.size(); i++) { + if (path.find(urls[i]) >= 0) { + pos = i; + break; + } + } + if (pos < 0) { + return videos; + } + + JsonReader Reader; + JsonValue Root; + + string res = apiPost("/x/web-interface/ranking/v2?rid=" + ids[pos]); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return videos; + } + JsonValue list = Root["data"]["list"]; + if (list.isArray()) { + for (int i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + dictionary video; + video["title"] = item["title"].asString(); + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + video["thumbnail"] = item["pic"].asString(); + video["author"] = item["owner"]["name"].asString(); + videos.insertLast(video); + } + } + } + return videos; } array Dynamic(uint tid) { - array videos; - JsonReader Reader; - JsonValue Root; - string res = apiPost("/x/web-interface/dynamic/region?pn=1&ps=50&rid=" + tid); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() != 0) { - return videos; - } - JsonValue list = Root["data"]["archives"]; - if (list.isArray()) { - for (int i = 0; i < list.size(); i++) { - JsonValue item = list[i]; - dictionary video; - video["title"] = item["title"].asString(); - video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); - video["thumbnail"] = item["pic"].asString(); - video["author"] = item["owner"]["name"].asString(); - videos.insertLast(video); - } - } - } - return videos; + array videos; + JsonReader Reader; + JsonValue Root; + string res = apiPost("/x/web-interface/dynamic/region?pn=1&ps=50&rid=" + tid); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return videos; + } + JsonValue list = Root["data"]["archives"]; + if (list.isArray()) { + for (int i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + dictionary video; + video["title"] = item["title"].asString(); + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + video["thumbnail"] = item["pic"].asString(); + video["author"] = item["owner"]["name"].asString(); + videos.insertLast(video); + } + } + } + return videos; } array Search(string path) { - array videos; - JsonReader Reader; - JsonValue Root; - string kw; - if (path.find("?WithCaption") >= 0) { - path.replace("?WithCaption", ""); - kw = HostUrlEncode(parse(path, "keyword")); - } else { - kw = parse(path, "keyword"); - } - if (kw.empty()) { - return videos; - } - string type = HostRegExpParse(path, "search.bilibili.com/([a-zA-Z0-9]+)"); - string url; - if (type == "all") { - url = "/x/web-interface/search/all/v2?keyword=" + kw; - } else if (type == "video") { - url = "/x/web-interface/search/type?search_type=video&keyword=" + kw; - } else { - return videos; - } - string res = apiPost(url); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() != 0) { - return videos; - } - JsonValue list; - if (type == "all") { - for (int i = 0; i < Root["data"]["result"].size(); i++) { - if (Root["data"]["result"][i]["result_type"].asString() == "video") { - list = Root["data"]["result"][i]["data"]; - break; - } - } - } else if (type == "video") { - list = Root["data"]["result"]; - } else { - return videos; - } - for (int i = 0; i < list.size(); i++) { - JsonValue item = list[i]; - dictionary video; - string title = item["title"].asString(); - title.replace("", ''); - title.replace("", ''); - video["title"] = title; - video["content"] = title; - video["duration"] = parseTime(item["duration"].asString()); - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); - video["thumbnail"] = "https:" + item["pic"].asString(); - video["author"] = item["author"].asString(); - videos.insertLast(video); - } - } - return videos; + array videos; + JsonReader Reader; + JsonValue Root; + string kw; + if (path.find("?WithCaption") >= 0) { + path.replace("?WithCaption", ""); + kw = HostUrlEncode(parse(path, "keyword")); + } else { + kw = parse(path, "keyword"); + } + if (kw.empty()) { + return videos; + } + string type = HostRegExpParse(path, "search.bilibili.com/([a-zA-Z0-9]+)"); + string url; + if (type == "all") { + url = "/x/web-interface/search/all/v2?keyword=" + kw; + } else if (type == "video") { + url = "/x/web-interface/search/type?search_type=video&keyword=" + kw; + } else { + return videos; + } + string res = apiPost(url); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return videos; + } + JsonValue list; + if (type == "all") { + for (int i = 0; i < Root["data"]["result"].size(); i++) { + if (Root["data"]["result"][i]["result_type"].asString() == "video") { + list = Root["data"]["result"][i]["data"]; + break; + } + } + } else if (type == "video") { + list = Root["data"]["result"]; + } else { + return videos; + } + for (int i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + dictionary video; + string title = item["title"].asString(); + title.replace("", ''); + title.replace("", ''); + video["title"] = title; + video["content"] = title; + video["duration"] = parseTime(item["duration"].asString()); + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + video["thumbnail"] = "https:" + item["pic"].asString(); + video["author"] = item["author"].asString(); + videos.insertLast(video); + } + } + return videos; } array webDynamic(string path) { - array videos; - JsonReader Reader; - JsonValue Root; - string type = parse(path, "tab"); - if (type != "video") { - type = "all"; - } - int nums = 5; - string offset; - string baseurl = "/x/polymer/web-dynamic/v1/feed/all?timezone_offset=-480&type=" + type; - for (int i = 1; i <= nums; i++) { - string url = baseurl + "&page=" + i; - if (!offset.empty()) { - url += "&offset=" + offset; - } - string res = apiPost(url); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() != 0) { - return videos; - } - JsonValue list = Root["data"]["items"]; - if (list.isArray()) { - offset = Root["data"]["offset"].asString(); - for (int j = 0; j < list.size(); j++) { - JsonValue dynamic = list[j]["modules"]["module_dynamic"]; - if (dynamic.isObject()) { - JsonValue major = dynamic["major"]; - if (!major.isObject()) { - continue; - } - string author = list[j]["modules"]["module_author"]["name"].asString(); - JsonValue archive = major["archive"]; - if (archive.isObject()) { - if (archive["bvid"].isString() && !archive["bvid"].asString().empty()) { - string bvid = archive["bvid"].asString(); - dictionary video; - video["title"] = "视频 | " + archive["title"].asString(); - video["duration"] = parseTime(archive["duration_text"].asString()); - video["url"] = "https://www.bilibili.com/video/" + bvid; - video["thumbnail"] = archive["cover"].asString(); - video["author"] = author; - videos.insertLast(video); - } - continue; - } - JsonValue live_rcmd = major["live_rcmd"]; - if (live_rcmd.isObject()) { - string content_str = live_rcmd["content"].asString(); - JsonValue content; - if (Reader.parse(content_str, content) && content.isObject()) { - if (content["live_play_info"]["live_status"].asInt() == 1) { - dictionary live; - live["title"] = "直播 | " + content["live_play_info"]["title"].asString(); - live["url"] = "https://live.bilibili.com/" + content["live_play_info"]["room_id"].asString(); - live["thumbnail"] = content["live_play_info"]["cover"].asString(); - live["author"] = author; - videos.insertLast(live); - } - } - continue; - } - } - } - if (!Root["data"]["has_more"].asBool()) { - break; - } - } - } - } - return videos; + array videos; + JsonReader Reader; + JsonValue Root; + string type = parse(path, "tab"); + if (type != "video") { + type = "all"; + } + int nums = 5; + string offset; + string baseurl = "/x/polymer/web-dynamic/v1/feed/all?timezone_offset=-480&type=" + type; + for (int i = 1; i <= nums; i++) { + string url = baseurl + "&page=" + i; + if (!offset.empty()) { + url += "&offset=" + offset; + } + string res = apiPost(url); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return videos; + } + JsonValue list = Root["data"]["items"]; + if (list.isArray()) { + offset = Root["data"]["offset"].asString(); + for (int j = 0; j < list.size(); j++) { + JsonValue dynamic = list[j]["modules"]["module_dynamic"]; + if (dynamic.isObject()) { + JsonValue major = dynamic["major"]; + if (!major.isObject()) { + continue; + } + string author = list[j]["modules"]["module_author"]["name"].asString(); + JsonValue archive = major["archive"]; + if (archive.isObject()) { + if (archive["bvid"].isString() && !archive["bvid"].asString().empty()) { + string bvid = archive["bvid"].asString(); + dictionary video; + video["title"] = "视频 | " + archive["title"].asString(); + video["duration"] = parseTime(archive["duration_text"].asString()); + video["url"] = "https://www.bilibili.com/video/" + bvid; + video["thumbnail"] = archive["cover"].asString(); + video["author"] = author; + videos.insertLast(video); + } + continue; + } + JsonValue live_rcmd = major["live_rcmd"]; + if (live_rcmd.isObject()) { + string content_str = live_rcmd["content"].asString(); + JsonValue content; + if (Reader.parse(content_str, content) && content.isObject()) { + if (content["live_play_info"]["live_status"].asInt() == 1) { + dictionary live; + live["title"] = "直播 | " + content["live_play_info"]["title"].asString(); + live["url"] = "https://live.bilibili.com/" + content["live_play_info"]["room_id"].asString(); + live["thumbnail"] = content["live_play_info"]["cover"].asString(); + live["author"] = author; + videos.insertLast(live); + } + } + continue; + } + } + } + if (!Root["data"]["has_more"].asBool()) { + break; + } + } + } + } + return videos; } array Recommend(uint page) { - array videos; - JsonReader Reader; - JsonValue Root; - const uint nums = 5; - string url = "/x/web-interface/wbi/index/top/feed/rcmd?y_num=3&fresh_type=4&feed_version=V8&fresh_idx_1h=" + page + "&fetch_row=" + (3 * page + 1) + "&fresh_idx=" + page + "&brush=" + page + "&homepage_ver=1&ps=12&last_y_num=4&outside_trigger="; - string res = apiPost(url); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() != 0) { - return videos; - } - JsonValue list = Root["data"]["item"]; - if (list.isArray()) { - for (int i = 0; i < list.size(); i++) { - JsonValue item = list[i]; - if (item["bvid"].asString().empty()) { - continue; - } - dictionary video; - video["thumbnail"] = item["pic"].asString(); - video["author"] = item["owner"]["name"].asString(); - if (item["uri"].asString().find("live.bilibili.com") >= 0) { - video["title"] = "直播 | " + item["title"].asString(); - video["url"] = item["uri"].asString(); - } else { - video["title"] = item["title"].asString(); - video["duration"] = item["duration"].asInt() * 1000; - video["url"] = item["uri"].asString(); - } - videos.insertLast(video); - } - } - } - if (page < nums) { - array videos2 = Recommend(page + 1); - for (uint i = 0; i < videos2.size(); i++) { - videos.insertLast(videos2[i]); - } - } - return videos; + array videos; + JsonReader Reader; + JsonValue Root; + const uint nums = 5; + string url = "/x/web-interface/wbi/index/top/feed/rcmd?y_num=3&fresh_type=4&feed_version=V8&fresh_idx_1h=" + page + "&fetch_row=" + (3 * page + 1) + "&fresh_idx=" + page + "&brush=" + page + "&homepage_ver=1&ps=12&last_y_num=4&outside_trigger="; + string res = apiPost(url); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return videos; + } + JsonValue list = Root["data"]["item"]; + if (list.isArray()) { + for (int i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + if (item["bvid"].asString().empty()) { + continue; + } + dictionary video; + video["thumbnail"] = item["pic"].asString(); + video["author"] = item["owner"]["name"].asString(); + if (item["uri"].asString().find("live.bilibili.com") >= 0) { + video["title"] = "直播 | " + item["title"].asString(); + video["url"] = item["uri"].asString(); + } else { + video["title"] = item["title"].asString(); + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = item["uri"].asString(); + } + videos.insertLast(video); + } + } + } + if (page < nums) { + array videos2 = Recommend(page + 1); + for (uint i = 0; i < videos2.size(); i++) { + videos.insertLast(videos2[i]); + } + } + return videos; } bool PlayitemCheck(const string&in path) { // log("PlayitemCheck - path", path); - status = 1; - - if (path.find("bilibili.com") < 0) { - return false; - } - - if (path.find("/video/BV") >= 0) { - return true; - } - if (path.find("/video/av") >= 0) { - return true; - } + status = 1; + + if (path.find("bilibili.com") < 0) { + return false; + } + + if (path.find("/video/BV") >= 0) { + return true; + } + if (path.find("/video/av") >= 0) { + return true; + } - if (path.find("/bangumi/media/md") >= 0) { - return true; - } - if (path.find("/bangumi/play/") >= 0) { - return true; - } - if (path.find("live.bilibili.com") >= 0) { - return true; - } - if (path.find("www.bilibili.com/audio/au") >= 0) { - return true; - } + if (path.find("/bangumi/media/md") >= 0) { + return true; + } + if (path.find("/bangumi/play/") >= 0) { + return true; + } + if (path.find("live.bilibili.com") >= 0) { + return true; + } + if (path.find("www.bilibili.com/audio/au") >= 0) { + return true; + } // log("PlayitemCheck", "false"); - return false; + return false; } bool PlaylistCheck(const string&in path) { // log("PlaylistCheck - path", path); - status = 2; - if (path.find("bilibili.com") < 0) { - return false; - } - if (isPlaylist(path)) { - return true; - } - if (!parseBVId(path).empty() || !parseAVId(path).empty()) { - return true; - } - if (path.find("search.bilibili.com") >= 0) { - return true; - } - if (path.find("/watchlater") >= 0) { - return true; - } - if (path.find("/account/history") >= 0) { - return true; - } - if (path.find("space.bilibili.com") >= 0) { - if (path.find("/video") >= 0) { - return true; - } else if (path.find("/audio") >= 0) { - return true; - } else if (path.find("/favlist") >= 0) { - return true; - } else if (path.find("lists") >= 0) { - return true; - } else if (HostRegExpParse(path, "/([0-9]+)/[a-zA-Z0-9]").empty()) { - return true; - } else { - return false; - } - } - if (path.find("/medialist/detail/ml") >= 0) { - return true; - } - if (path.find("link.bilibili.com") >= 0 && path.find("/user-center/follow") >= 0) { - return true; - } - if (path.find("live.bilibili.com") >= 0) { - if (path.find("areaId") >= 0 || path.find("lol") >= 0 || path.find("hpjy") >= 0) { - return true; - } - return true; - } - if (path.find("www.bilibili.com") >= 0 && HostRegExpParse(path, "www.bilibili.com/([a-zA-Z0-9]+)").empty()) { - return true; - } - if (path.find("bangumi/media/md") >= 0) { - return true; - } - if (path.find("bangumi/play/") >= 0) { - return true; - } - if (path.find("www.bilibili.com/v/popular/rank") >= 0) { - return true; - } - if (path.find("www.bilibili.com/v/popular/history") >= 0) { - return true; - } - if (path.find("www.bilibili.com/v/popular/weekly") >= 0) { - return true; - } - if (gettid(path) > 0) { - return true; - } - if (path.find("www.bilibili.com/audio/am") >= 0) { - return true; - } - if (path.find("t.bilibili.com") >= 0) { - return true; - } + status = 2; + if (path.find("bilibili.com") < 0) { + return false; + } + if (isPlaylist(path)) { + return true; + } + if (!parseBVId(path).empty() || !parseAVId(path).empty()) { + return true; + } + if (path.find("search.bilibili.com") >= 0) { + return true; + } + if (path.find("/watchlater") >= 0) { + return true; + } + if (path.find("/account/history") >= 0) { + return true; + } + if (path.find("space.bilibili.com") >= 0) { + if (path.find("/video") >= 0) { + return true; + } else if (path.find("/audio") >= 0) { + return true; + } else if (path.find("/favlist") >= 0) { + return true; + } else if (path.find("lists") >= 0) { + return true; + } else if (HostRegExpParse(path, "/([0-9]+)/[a-zA-Z0-9]").empty()) { + return true; + } else { + return false; + } + } + if (path.find("/medialist/detail/ml") >= 0) { + return true; + } + if (path.find("link.bilibili.com") >= 0 && path.find("/user-center/follow") >= 0) { + return true; + } + if (path.find("live.bilibili.com") >= 0) { + if (path.find("areaId") >= 0 || path.find("lol") >= 0 || path.find("hpjy") >= 0) { + return true; + } + return true; + } + if (path.find("www.bilibili.com") >= 0 && HostRegExpParse(path, "www.bilibili.com/([a-zA-Z0-9]+)").empty()) { + return true; + } + if (path.find("bangumi/media/md") >= 0) { + return true; + } + if (path.find("bangumi/play/") >= 0) { + return true; + } + if (path.find("www.bilibili.com/v/popular/rank") >= 0) { + return true; + } + if (path.find("www.bilibili.com/v/popular/history") >= 0) { + return true; + } + if (path.find("www.bilibili.com/v/popular/weekly") >= 0) { + return true; + } + if (gettid(path) > 0) { + return true; + } + if (path.find("www.bilibili.com/audio/am") >= 0) { + return true; + } + if (path.find("t.bilibili.com") >= 0) { + return true; + } // log("PlaylistCheck", "false"); - return false; + return false; } array PlaylistParse(const string&in url) { - string path = url; + string path = url; // log("PlaylistParse - path", path); - status = 3; - array result; - - if (videoIsUGCorPGC.isPGC) path = videoIsUGCorPGC.pgcURL; - if (videoIsUGCorPGC.isUGCSeason) return UGCSeason(path); - - string bvid = parseBVId(path); - if (!bvid.empty()) { - return RelatedVideos(path); - } - string avid = parseAVId(path); - if (!avid.empty()) { - return RelatedVideos(path); - } - if (path.find("/watchlater") >= 0) { - return watchlater(); - } - if (path.find("search.bilibili.com") >= 0) { - return Search(path); - } - if (path.find("space.bilibili.com") >= 0) { - if (path.find("/video") >= 0) { - return spaceVideo(path); - } else if (path.find("/audio") >= 0) { - return spaceAudio(path); - } else if (path.find("/favlist") >= 0) { - return FavList(path); - } else if (path.find("lists") >= 0) { - return spaceSeason(path); - } else if (HostRegExpParse(path, "/([0-9]+)/[a-zA-Z0-9]").empty()) { - return spaceVideo(path); - } - } - if (path.find("/medialist/detail/ml") >= 0) { - return FavList(path); - } - if (path.find("link.bilibili.com") >= 0 && path.find("/user-center/follow") >= 0) { - return followingLive(1); - } - if (path.find("live.bilibili.com") >= 0) { - if (path.find("areaId") >= 0) { - return liveCategory(path, 1, HostRegExpParse(path, "areaId=([0-9]+)"), HostRegExpParse(path, "parentAreaId=([0-9]+)"), 0); - } - if (path.find("lol") >= 0) { - return liveCategory(path, 1, "86", "2", 0); - } - if (path.find("hpjy") >= 0) { - return liveCategory(path, 1, "256", "3", 0); - } - } - if (path.find("www.bilibili.com") >= 0 && HostRegExpParse(path, "www.bilibili.com/([a-zA-Z0-9]+)").empty()) { - return Recommend(1); - } - if (path.find("bangumi/media/md") >= 0) { - return BangumiEpisodes(parseMDId(path), "media_id"); - } - if (path.find("bangumi/play/ep") >= 0) { - return BangumiEpisodes(parseEPId(path), "ep_id"); - } - if (path.find("bangumi/play/ss") >= 0) { - return BangumiEpisodes(parseSSId(path), "season_id"); - } - if (path.find("www.bilibili.com/v/popular/rank") >= 0) { - return Ranking(path); - } - if (path.find("www.bilibili.com/v/popular/history") >= 0) { - return PopularHistory(); - } - if (path.find("www.bilibili.com/v/popular/weekly") >= 0) { - return PopularWeekly(path); - } - if (path.find("/history") >= 0) { - return History(); - } - if (path.find("www.bilibili.com/audio/am") >= 0) { - return AudioList(path); - } - uint tid = gettid(path); - if (tid > 0) { - return Dynamic(tid); - } - if (path.find("t.bilibili.com") >= 0) { - return webDynamic(path); - } - - return result; + status = 3; + array result; + + if (videoIsUGCorPGC.isPGC) path = videoIsUGCorPGC.pgcURL; + if (videoIsUGCorPGC.isUGCSeason) return UGCSeason(path); + + string bvid = parseBVId(path); + if (!bvid.empty()) { + return RelatedVideos(path); + } + string avid = parseAVId(path); + if (!avid.empty()) { + return RelatedVideos(path); + } + if (path.find("/watchlater") >= 0) { + return watchlater(); + } + if (path.find("search.bilibili.com") >= 0) { + return Search(path); + } + if (path.find("space.bilibili.com") >= 0) { + if (path.find("/video") >= 0) { + return spaceVideo(path); + } else if (path.find("/audio") >= 0) { + return spaceAudio(path); + } else if (path.find("/favlist") >= 0) { + return FavList(path); + } else if (path.find("lists") >= 0) { + return spaceSeason(path); + } else if (HostRegExpParse(path, "/([0-9]+)/[a-zA-Z0-9]").empty()) { + return spaceVideo(path); + } + } + if (path.find("/medialist/detail/ml") >= 0) { + return FavList(path); + } + if (path.find("link.bilibili.com") >= 0 && path.find("/user-center/follow") >= 0) { + return followingLive(1); + } + if (path.find("live.bilibili.com") >= 0) { + if (path.find("areaId") >= 0) { + return liveCategory(path, 1, HostRegExpParse(path, "areaId=([0-9]+)"), HostRegExpParse(path, "parentAreaId=([0-9]+)"), 0); + } + if (path.find("lol") >= 0) { + return liveCategory(path, 1, "86", "2", 0); + } + if (path.find("hpjy") >= 0) { + return liveCategory(path, 1, "256", "3", 0); + } + } + if (path.find("www.bilibili.com") >= 0 && HostRegExpParse(path, "www.bilibili.com/([a-zA-Z0-9]+)").empty()) { + return Recommend(1); + } + if (path.find("bangumi/media/md") >= 0) { + return BangumiEpisodes(parseMDId(path), "media_id"); + } + if (path.find("bangumi/play/ep") >= 0) { + return BangumiEpisodes(parseEPId(path), "ep_id"); + } + if (path.find("bangumi/play/ss") >= 0) { + return BangumiEpisodes(parseSSId(path), "season_id"); + } + if (path.find("www.bilibili.com/v/popular/rank") >= 0) { + return Ranking(path); + } + if (path.find("www.bilibili.com/v/popular/history") >= 0) { + return PopularHistory(); + } + if (path.find("www.bilibili.com/v/popular/weekly") >= 0) { + return PopularWeekly(path); + } + if (path.find("/history") >= 0) { + return History(); + } + if (path.find("www.bilibili.com/audio/am") >= 0) { + return AudioList(path); + } + uint tid = gettid(path); + if (tid > 0) { + return Dynamic(tid); + } + if (path.find("t.bilibili.com") >= 0) { + return webDynamic(path); + } + + return result; } string PlayitemParse(const string&in path, dictionary& MetaData, array& QualityList) { // log("PlayitemParse - path", path); - status = 4; - - if (path.find("/video/BV") >= 0) { - string bvid = parseBVId(path); - return Video(bvid, path, MetaData, QualityList); - } - if (path.find("/video/av") >= 0) { - string aid = parseAVId(path); - return Video(aid, path, MetaData, QualityList); - } - if (path.find("bangumi/media/md") >= 0) { - return Bangumi(path, MetaData, QualityList); - } - if (path.find("bangumi/play") >= 0) { - return Bangumi(path, MetaData, QualityList); - } - if (path.find("live.bilibili.com") >= 0) { - string id = HostRegExpParse(path, "live.bilibili.com/([0-9]+)"); - if (!id.empty()) { - return Live(id, path, MetaData, QualityList); - } - } - if (path.find("www.bilibili.com/audio/au") >= 0) { - return Audio(path, MetaData, QualityList); - } - - return path; + status = 4; + + if (path.find("/video/BV") >= 0) { + string bvid = parseBVId(path); + return Video(bvid, path, MetaData, QualityList); + } + if (path.find("/video/av") >= 0) { + string aid = parseAVId(path); + return Video(aid, path, MetaData, QualityList); + } + if (path.find("bangumi/media/md") >= 0) { + return Bangumi(path, MetaData, QualityList); + } + if (path.find("bangumi/play") >= 0) { + return Bangumi(path, MetaData, QualityList); + } + if (path.find("live.bilibili.com") >= 0) { + string id = HostRegExpParse(path, "live.bilibili.com/([0-9]+)"); + if (!id.empty()) { + return Live(id, path, MetaData, QualityList); + } + } + if (path.find("www.bilibili.com/audio/au") >= 0) { + return Audio(path, MetaData, QualityList); + } + + return path; } \ No newline at end of file From ab49a5e59d52d3a1b9b53c53116b6166affc38ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Tue, 8 Sep 2026 14:06:49 +0800 Subject: [PATCH 119/132] =?UTF-8?q?*=20MediaPlayParse=20-=20Bilibili.as=20?= =?UTF-8?q?=20=20=20=20-=20=E2=80=9C=E6=88=91=E7=9A=84=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E2=80=9D=E3=80=81"=E9=A6=96=E9=A1=B5=E6=8E=A8=E8=8D=90"?= =?UTF-8?q?=E3=80=81"=E5=8E=86=E5=8F=B2=E8=AE=B0=E5=BD=95"=E3=80=81?= =?UTF-8?q?=E2=80=9C=E7=BB=BC=E5=90=88=E7=83=AD=E9=97=A8=E2=80=9D=E3=80=81?= =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E2=80=9C=E7=A9=BA=E9=97=B4=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E2=80=9D=EF=BC=8C=E6=94=AF=E6=8C=81=E8=AE=BE=E5=AE=9A=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E6=95=B0=E9=87=8F=E3=80=82=20=20=20=20=20-=20?= =?UTF-8?q?=E4=BB=8E=E6=90=9C=E7=B4=A2=E5=92=8C=E7=95=AA=E5=89=A7=E5=AA=92?= =?UTF-8?q?=E4=BD=93=E7=95=8C=E9=9D=A2=E6=89=93=E5=BC=80=E6=97=B6=EF=BC=8C?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=A0=B9=E6=8D=AE=E8=A7=82=E7=9C=8B=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E5=AE=9A=E4=BD=8D=E5=88=B0=E5=BD=93=E5=89=8D=E8=A7=82?= =?UTF-8?q?=E7=9C=8B=E7=9A=84=E5=89=A7=E9=9B=86=EF=BC=88potplayer=E7=9A=84?= =?UTF-8?q?=E8=A7=82=E7=9C=8B=E8=AE=B0=E5=BD=95=EF=BC=89=E3=80=82=20=20=20?= =?UTF-8?q?=20=20-=20"=E6=88=91=E5=85=B3=E6=B3=A8=E7=9A=84=E7=9B=B4?= =?UTF-8?q?=E6=92=AD=E9=97=B4"=E5=BD=93=E6=97=A0=E4=BA=BA=E5=BC=80?= =?UTF-8?q?=E6=92=AD=E6=97=B6=EF=BC=8C=E5=BC=B9=E5=87=BA=E5=AF=B9=E8=AF=9D?= =?UTF-8?q?=E6=A1=86=E6=8F=90=E9=86=92=E3=80=82=20=20=20=20=20-=20?= =?UTF-8?q?=E6=94=AF=E6=8C=81"=E7=BB=BC=E5=90=88=E7=83=AD=E9=97=A8"?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E3=80=82=20=20=20=20=20-=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0"=E7=83=AD=E9=97=A8-=E6=8E=92=E8=A1=8C=E6=A6=9C-PGC"?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E6=94=AF=E6=8C=81=E3=80=82=20=20=20=20=20-?= =?UTF-8?q?=20=E6=90=9C=E7=B4=A2=E5=8A=9F=E8=83=BD=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E3=80=82=20=20=20=20=20-=20=E5=A2=9E=E5=8A=A0UP=E4=B8=BB?= =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E7=A9=BA=E9=97=B4=E5=8A=A8=E6=80=81=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E6=94=AF=E6=8C=81=E3=80=82=20=20=20=20=20-=20?= =?UTF-8?q?=E5=90=84=E7=B1=BB=E7=94=9F=E6=88=90=E7=9A=84=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E5=88=97=E8=A1=A8=EF=BC=8C=E6=97=A5=E6=9C=9F=E5=9F=BA=E6=9C=AC?= =?UTF-8?q?=E4=B8=8A=E5=B7=B2=E5=85=A8=E9=83=A8=E6=98=BE=E7=A4=BA=E3=80=82?= =?UTF-8?q?=20=20=20=20=20-=20=E7=BB=86=E8=8A=82=E4=BC=98=E5=8C=96.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * MediaUrlList - Bilibili.as - "Potplayer - 打开链接",类别重新整理命名。 - 排行榜适配B站新分区。 - 增加 PGC 内容类别。 * 附带预生成播放列表文件 按需使用,路径:{Potplayer 根目录}/Playlist --- Media/PlayParse/MediaPlayParse - Bilibili.as | 1043 +++++++++++------ Media/UrlList/MediaUrlList - Bilibili.as | 281 ++++- ...0\346\200\201\351\246\226\351\241\265.dpl" | 3 + ...0\347\232\204\347\233\264\346\222\255.dpl" | 3 + ...5\345\220\216\345\206\215\347\234\213.dpl" | 3 + ...6\351\241\265\346\216\250\350\215\220.dpl" | 3 + ...4\345\220\210\347\203\255\351\227\250.dpl" | 3 + ...7\345\221\250\345\277\205\347\234\213.dpl" | 3 + ...5\347\253\231\345\277\205\345\210\267.dpl" | 3 + ....\346\216\222\350\241\214\346\246\234.dpl" | 3 + ...6\345\217\262\350\256\260\345\275\225.dpl" | 3 + README.md | 16 +- 12 files changed, 979 insertions(+), 388 deletions(-) create mode 100644 "Playlist/1.\345\212\250\346\200\201\351\246\226\351\241\265.dpl" create mode 100644 "Playlist/2.\346\210\221\345\205\263\346\263\250\347\232\204\347\233\264\346\222\255.dpl" create mode 100644 "Playlist/3.\347\250\215\345\220\216\345\206\215\347\234\213.dpl" create mode 100644 "Playlist/4.\351\246\226\351\241\265\346\216\250\350\215\220.dpl" create mode 100644 "Playlist/5.\347\273\274\345\220\210\347\203\255\351\227\250.dpl" create mode 100644 "Playlist/6.\346\257\217\345\221\250\345\277\205\347\234\213.dpl" create mode 100644 "Playlist/7.\345\205\245\347\253\231\345\277\205\345\210\267.dpl" create mode 100644 "Playlist/8.\346\216\222\350\241\214\346\246\234.dpl" create mode 100644 "Playlist/9.\345\216\206\345\217\262\350\256\260\345\275\225.dpl" diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 9609e9f..b81aeb8 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -41,7 +41,7 @@ string MixinKey; const string Host = "https://api.bilibili.com"; const string ConfigFileName = "Bilibili_Config.json"; -const array BilibiliDomains = { "bilibili.com", "bilivideo.com", "bilivideo.cn", "smtcdns.net" }; +const array BilibiliDomains = { "bilibili.com", "bilivideo.com", "bilivideo.cn", "smtcdns.net", "hdslb.com" }; const string Referer = "https://www.bilibili.com"; const string UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36 Edg/151.0.0.0"; const array knownP2pCdnDomainPattern = { @@ -54,92 +54,6 @@ const array knownP2pCdnDomainPattern = { "upos-sz-mirror14b.bilivideo.com" }; -class VideoIsUGCorPGC { - string url = ""; - bool isUGCSeason = false; - bool isPGC = false; - string pgcURL = ""; -} - -class ResponseCacheItem { - string response; - uint tick_count; - uint valid_time; -} - -class QualityListItem { - string url; - string quality; - string qualityDetail; - string resolution; - string bitrate; - string format; - int itag = 0; - int fps = 0.0; - int type3D = 0; // 1:sbs, 2:t&b - bool is360 = false; - bool isHDR = false; - string audioName; - string audioCode; - bool audioIsDefault = false; - int bitrateVal = 0; - string va; - string referer; - bool videoIsDefault; - - dictionary toDictionary() { - dictionary ret; - - ret["url"] = url; - ret["quality"] = quality; - ret["qualityDetail"] = qualityDetail; - ret["resolution"] = resolution; - ret["bitrate"] = bitrate; - ret["format"] = format; - ret["itag"] = itag; - ret["fps"] = fps; - ret["type3D"] = type3D; - ret["is360"] = is360; - ret["isHDR"] = isHDR; - ret["audioName"] = audioName; - ret["audioCode"] = audioCode; - ret["audioIsDefault"] = audioIsDefault; - ret["bitrateVal"] = bitrateVal; - ret["va"] = va; - ret["referer"] = referer; - ret["videoIsDefault"] = videoIsDefault; - - return ret; - } -} - -class Config { - string fullConfig; - int uid = 0; - bool danmakuEnable = true; - string danmakuServer; - string danmakuFont; - float danmakuFontSize = 30.0; - float danmakuOpacity = 0.8; - float danmakuDisplayArea = 0.8; - float danmakuStayTime = 15.0; - bool showRecommendedVideos = true; - bool blockP2PCDN = true; - int cacheValidTime = 300; - bool enableSponsorBlock = false; - string sponsorBlockMirror; - bool parseM3u8RealUrl = false; - string bilibiliDanmujiServer; - bool disableAVC = false; - bool preferHDR = false; - bool debug = false; - - string danmakuUrl; - string subtitleUrl; - - int maxliveroom = 200; -} - void OnInitialize() { for (uint i = 0; i < BilibiliDomains.length(); i++) { HostSetUrlUserAgentHTTP(BilibiliDomains[i], UserAgent); @@ -257,6 +171,97 @@ void OnFinalize() { } } +class VideoIsUGCorPGC { + string url = ""; + bool isUGCSeason = false; + bool isPGC = false; + string pgcURL = ""; +} + +class ResponseCacheItem { + string response; + uint tick_count; + uint valid_time; +} + +class QualityListItem { + string url; + string quality; + string qualityDetail; + string resolution; + string bitrate; + string format; + int itag = 0; + int fps = 0.0; + int type3D = 0; // 1:sbs, 2:t&b + bool is360 = false; + bool isHDR = false; + string audioName; + string audioCode; + bool audioIsDefault = false; + int bitrateVal = 0; + string va; + string referer; + bool videoIsDefault; + + dictionary toDictionary() { + dictionary ret; + + ret["url"] = url; + ret["quality"] = quality; + ret["qualityDetail"] = qualityDetail; + ret["resolution"] = resolution; + ret["bitrate"] = bitrate; + ret["format"] = format; + ret["itag"] = itag; + ret["fps"] = fps; + ret["type3D"] = type3D; + ret["is360"] = is360; + ret["isHDR"] = isHDR; + ret["audioName"] = audioName; + ret["audioCode"] = audioCode; + ret["audioIsDefault"] = audioIsDefault; + ret["bitrateVal"] = bitrateVal; + ret["va"] = va; + ret["referer"] = referer; + ret["videoIsDefault"] = videoIsDefault; + + return ret; + } +} + +class Config { + string fullConfig; + int uid = 0; + bool danmakuEnable = true; + string danmakuServer; + string danmakuFont; + float danmakuFontSize = 30.0; + float danmakuOpacity = 0.8; + float danmakuDisplayArea = 0.8; + float danmakuStayTime = 15.0; + bool showRecommendedVideos = true; + bool blockP2PCDN = true; + int cacheValidTime = 300; + bool enableSponsorBlock = false; + string sponsorBlockMirror; + bool parseM3u8RealUrl = false; + string bilibiliDanmujiServer; + int webDynamicPages = 5; + int recommendVideoNums = 30; + int historyVideoNums = 30; + int popularAllPages = 1; + int spaceDynamicVideoNums = 30; + bool disableAVC = false; + bool preferHDR = false; + bool debug = false; + + string danmakuUrl; + string subtitleUrl; + + int maxliveroom = 200; +} + Config ReadConfigFile(string file) { Config config; uintptr fp = HostFileOpen(file); @@ -312,6 +317,24 @@ Config ReadConfigFile(string file) { if (root["bilibiliDanmujiServer"].isString()) { config.bilibiliDanmujiServer = root["bilibiliDanmujiServer"].asString(); } + if (root["videoNums"].isObject()) { + JsonValue videoNums = root["videoNums"]; + if (videoNums["webDynamicPages"].isNumeric()) { + config.webDynamicPages = videoNums["webDynamicPages"].asInt(); + } + if (videoNums["recommendVideoNums"].isNumeric()) { + config.recommendVideoNums = videoNums["recommendVideoNums"].asInt(); + } + if (videoNums["historyVideoNums"].isNumeric()) { + config.historyVideoNums = videoNums["historyVideoNums"].asInt(); + } + if (videoNums["popularAllPages"].isNumeric()) { + config.popularAllPages = videoNums["popularAllPages"].asInt(); + } + if (videoNums["spaceDynamicVideoNums"].isNumeric()) { + config.spaceDynamicVideoNums = videoNums["spaceDynamicVideoNums"].asInt(); + } + } if (root["disableAVC"].isBool()) { config.disableAVC = root["disableAVC"].asBool(); } @@ -429,7 +452,7 @@ string getMixinKey() { return key.substr(0, 32); } -string encWbi(string params) { +string encWbi(string params, bool useWts = true) { if (MixinKey.empty()) { MixinKey = getMixinKey(); } @@ -441,7 +464,8 @@ string encWbi(string params) { if (i != lst.length() - 1) newParams += "&"; } - newParams += ("&wts=" + formatInt(DatetimeToUnixTime(FormatDateTime(datetime())))); + + if (useWts) newParams += ("&wts=" + formatInt(DatetimeToUnixTime(FormatDateTime(datetime())))); return (newParams + "&w_rid=" + HostHashMD5(newParams + MixinKey)); } @@ -460,31 +484,45 @@ string makeWebUrl(string path) { } string post(string url, string data = "", string headers = "", bool debug = true) { + uint tickCount = HostGetTickCount(); + if (headers.empty()) headers = "User-Agent: " + UserAgent + "\r\n" + "Referer: " + Referer + "\r\n"; if (debug) log("request url", url); - return HostUrlGetString(url, "", headers, data); + string res = HostUrlGetString(url, "", headers, data); + + HostIncTimeOut(HostGetTickCount() - tickCount); + return res; } -string apiPost(string api, string data = "", string host=Host) { - host = host.isEmpty() ? Host : host; - string key; +string apiPost(string api, bool useCache = true) { + return apiPost(api, "", Host, useCache); +} - if (!data.empty()) { - key = HostRegExpRemove(HostRegExpRemove(api, "&w_rid=[^&]*"), "&wts=[^&]*") + "?" + data; - } else { - key = HostRegExpRemove(HostRegExpRemove(api, "&w_rid=[^&]*"), "&wts=[^&]*"); - } +string apiPost(string api, string data, bool useCache = true) { + return apiPost(api, data, Host, useCache); +} +string apiPost(string api, string data, string host, bool useCache = true) { ResponseCacheItem item; - if (ResponseCache.get(key, item)) { - if (HostGetTickCount() - item.tick_count <= item.valid_time) { - log("Cache Hit, url", host + api); - return item.response; + string key; + + if (useCache) { + if (!data.empty()) { + key = HostRegExpRemove(HostRegExpRemove(api, "&w_rid=[^&]*"), "&wts=[^&]*") + "?" + data; } else { - log("Cache expire"); + key = HostRegExpRemove(HostRegExpRemove(api, "&w_rid=[^&]*"), "&wts=[^&]*"); + } + + if (ResponseCache.get(key, item)) { + if (HostGetTickCount() - item.tick_count <= item.valid_time) { + log("Cache Hit, url", host + api); + return item.response; + } else { + log("Cache expire"); + } + } else { + log("Cache not Hit"); } - } else { - log("Cache not Hit"); } string resp = post(host + api, data); @@ -504,11 +542,12 @@ string apiPost(string api, string data = "", string host=Host) { HostMessageBox("error code: " + Root["code"].asInt() + "\n" + "error message: " + Root["message"].asString() + "\n" + "url:" + Host + api, Root["message"].asString()); return ""; } - - item.response = resp; - item.tick_count = HostGetTickCount(); - item.valid_time = ConfigData.cacheValidTime * 1000; - ResponseCache[key] = item; + if (useCache) { + item.response = resp; + item.tick_count = HostGetTickCount(); + item.valid_time = ConfigData.cacheValidTime * 1000; + ResponseCache[key] = item; + } return resp; } @@ -558,6 +597,19 @@ string parseFid(string path) { return fid; } +string md2ss(string mdid) { + JsonReader Reader; + JsonValue Root; + string ssid = ""; + string res = apiPost("/pgc/review/user?media_id=" + mdid); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() == 0) { + ssid = Root["result"]["media"]["season_id"].asString(); + } + } + return ssid; +} + uint gettid(string path) { array urls = { 'www.bilibili.com/v/anime/serial', 'www.bilibili.com/v/anime/finish', 'www.bilibili.com/v/anime/information', 'www.bilibili.com/v/anime/offical', 'www.bilibili.com/anime', 'www.bilibili.com/movie', 'www.bilibili.com/v/guochuang/chinese', 'www.bilibili.com/v/guochuang/original', 'www.bilibili.com/v/guochuang/puppetry', 'www.bilibili.com/v/guochuang/motioncomic', 'www.bilibili.com/v/guochuang/information', 'www.bilibili.com/guochuang', 'www.bilibili.com/tv', 'www.bilibili.com/documentary', 'www.bilibili.com/v/douga/mad', 'www.bilibili.com/v/douga/mmd', 'www.bilibili.com/v/douga/voice', 'www.bilibili.com/v/douga/garage_kit', 'www.bilibili.com/v/douga/tokusatsu', 'www.bilibili.com/v/douga/acgntalks', 'www.bilibili.com/v/douga/other', 'www.bilibili.com/v/douga', 'www.bilibili.com/v/game/stand_alone', 'www.bilibili.com/v/game/esports', 'www.bilibili.com/v/game/mobile', 'www.bilibili.com/v/game/online', 'www.bilibili.com/v/game/board', 'www.bilibili.com/v/game/gmv', 'www.bilibili.com/v/game/music', 'www.bilibili.com/v/game/mugen', 'www.bilibili.com/v/game', 'www.bilibili.com/v/kichiku/guide', 'www.bilibili.com/v/kichiku/mad', 'www.bilibili.com/v/kichiku/manual_vocaloid', 'www.bilibili.com/v/kichiku/theatre', 'www.bilibili.com/v/kichiku/course', 'www.bilibili.com/v/kichiku', 'www.bilibili.com/v/music/original', 'www.bilibili.com/v/music/cover', 'www.bilibili.com/v/music/perform', 'www.bilibili.com/v/music/vocaloid', 'www.bilibili.com/v/music/live', 'www.bilibili.com/v/music/mv', 'www.bilibili.com/v/music/commentary', 'www.bilibili.com/v/music/tutorial', 'www.bilibili.com/v/music/other', 'www.bilibili.com/v/music', 'www.bilibili.com/v/dance/otaku', 'www.bilibili.com/v/dance/hiphop', 'www.bilibili.com/v/dance/star', 'www.bilibili.com/v/dance/china', 'www.bilibili.com/v/dance/three_d', 'www.bilibili.com/v/dance/demo', 'www.bilibili.com/v/dance', 'www.bilibili.com/v/cinephile/cinecism', 'www.bilibili.com/v/cinephile/montage', 'www.bilibili.com/v/cinephile/shortfilm', 'www.bilibili.com/v/cinephile/trailer_info', 'www.bilibili.com/v/cinephile', 'www.bilibili.com/v/ent/variety', 'www.bilibili.com/v/ent/talker', 'www.bilibili.com/v/ent/fans', 'www.bilibili.com/v/ent/celebrity', 'www.bilibili.com/v/ent', 'www.bilibili.com/v/knowledge/science', 'www.bilibili.com/v/knowledge/social_science', 'www.bilibili.com/v/knowledge/humanity_history', 'www.bilibili.com/v/knowledge/business', 'www.bilibili.com/v/knowledge/campus', 'www.bilibili.com/v/knowledge/career', 'www.bilibili.com/v/knowledge/design', 'www.bilibili.com/v/knowledge/skill', 'www.bilibili.com/v/knowledge', 'www.bilibili.com/v/tech/digital', 'www.bilibili.com/v/tech/application', 'www.bilibili.com/v/tech/computer_tech', 'www.bilibili.com/v/tech/industry', 'www.bilibili.com/v/tech', 'www.bilibili.com/v/information/hotspot', 'www.bilibili.com/v/information/global', 'www.bilibili.com/v/information/social', 'www.bilibili.com/v/information/multiple', 'www.bilibili.com/v/information', 'www.bilibili.com/v/food/make', 'www.bilibili.com/v/food/detective', 'www.bilibili.com/v/food/measurement', 'www.bilibili.com/v/food/rural', 'www.bilibili.com/v/food/record', 'www.bilibili.com/v/food', 'www.bilibili.com/v/life/funny', 'www.bilibili.com/v/life/parenting', 'www.bilibili.com/v/life/travel', 'www.bilibili.com/v/life/rurallife', 'www.bilibili.com/v/life/home', 'www.bilibili.com/v/life/handmake', 'www.bilibili.com/v/life/painting', 'www.bilibili.com/v/life/daily', 'www.bilibili.com/v/life', 'www.bilibili.com/v/car/racing', 'www.bilibili.com/v/car/modifiedvehicle', 'www.bilibili.com/v/car/newenergyvehicle', 'www.bilibili.com/v/car/touringcar', 'www.bilibili.com/v/car/motorcycle', 'www.bilibili.com/v/car/strategy', 'www.bilibili.com/v/car/life', 'www.bilibili.com/v/car', 'www.bilibili.com/v/fashion/makeup', 'www.bilibili.com/v/fashion/cos', 'www.bilibili.com/v/fashion/clothing', 'www.bilibili.com/v/fashion/trend', 'www.bilibili.com/v/fashion', 'www.bilibili.com/v/sports/basketball', 'www.bilibili.com/v/sports/football', 'www.bilibili.com/v/sports/aerobics', 'www.bilibili.com/v/sports/athletic', 'www.bilibili.com/v/sports/culture', 'www.bilibili.com/v/sports/comprehensive', 'www.bilibili.com/v/sports', 'www.bilibili.com/v/animal/cat', 'www.bilibili.com/v/animal/dog', 'www.bilibili.com/v/animal/reptiles', 'www.bilibili.com/v/animal/wild_animal', 'www.bilibili.com/v/animal/second_edition', 'www.bilibili.com/v/animal/animal_composite', 'www.bilibili.com/v/animal', 'www.bilibili.com/v/life/funny', 'www.bilibili.com/v/game/stand_alone' }; array tids = { 33, 32, 51, 152, 13, 23, 153, 168, 169, 195, 170, 167, 11, 177, 24, 25, 47, 210, 86, 253, 27, 1, 17, 171, 172, 65, 173, 121, 136, 19, 4, 22, 26, 126, 216, 127, 119, 28, 31, 59, 30, 29, 193, 243, 244, 130, 3, 20, 198, 199, 200, 154, 156, 129, 182, 183, 85, 184, 181, 71, 241, 242, 137, 5, 201, 124, 228, 207, 208, 209, 229, 122, 36, 95, 230, 231, 232, 188, 203, 204, 205, 206, 202, 76, 212, 213, 214, 215, 211, 138, 254, 250, 251, 239, 161, 162, 21, 160, 245, 246, 246, 248, 240, 227, 176, 223, 157, 252, 158, 159, 155, 235, 249, 164, 236, 237, 238, 234, 218, 219, 222, 221, 220, 75, 217, 138, 17 }; @@ -583,19 +635,6 @@ int parseTime(string s) { return t; } -string md2ss(string mdid) { - JsonReader Reader; - JsonValue Root; - string ssid = ""; - string res = apiPost("/pgc/review/user?media_id=" + mdid); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - ssid = Root["result"]["media"]["season_id"].asString(); - } - } - return ssid; -} - int getVideoItag(int id, int codecid) { array> videoItagMap = { //240P @@ -1577,6 +1616,7 @@ array BangumiEpisodes(string id, string type) { JsonValue Root; string res; string author; + string target_ep_id; if (type == "media_id") { id = md2ss(id); @@ -1587,7 +1627,11 @@ array BangumiEpisodes(string id, string type) { if (type == "season_id") { res = apiPost("/pgc/view/web/simple/season?season_id=" + id); Reader.parse(res, Root); - author = Root["result"]["up_info"]["uname"].asString(); + author = Root["result"]["up_info"]["uname"].asString(); + + res = apiPost("/pgc/view/web/ep/page?season_id=" + id); + Reader.parse(res, Root); + target_ep_id = Root["result"]["locator"]["target_ep_id"].asString(); } // TODO: type 为 ep_id 时获取 author。 @@ -1612,7 +1656,7 @@ array BangumiEpisodes(string id, string type) { video["likeCount"] = episode["stat"]["likes"].asString(); // video["dislikeCount"] = episode["stat"]["dislike"].asString(); video["date"] = UnixTimeToDateTime(episode["pub_time"].asInt64()); - if (episode["ep_id"].asString() == id) video["current"] = "1"; + if (episode["ep_id"].asString() == id || episode["ep_id"].asString() == target_ep_id ) video["current"] = "1"; if (type == "season_id") video["referer"] = "www.bilibili.com/bangumi/play/ss" + id; if (type == "ep_id") video["referer"] = "www.bilibili.com/bangumi/play/ep" + id; @@ -1790,7 +1834,7 @@ array FavList(string path) { if (mid.empty()) { mid = "" + ConfigData.uid; } - string res = apiPost("/x/v3/fav/folder/created/list-all?up_mid=" + mid); + string res = apiPost("/x/v3/fav/folder/created/list-all?up_mid=" + mid, false); JsonValue Root; if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() == 0) { @@ -1897,13 +1941,25 @@ array AudioList(string path) { string Bangumi(const string&in path, dictionary& MetaData, array& QualityList) { log("==============================Bangumi============================="); string url; + string res; string aid; string bvid; string cid; + string ssid; string epid = parseEPId(path); + + if (epid.isEmpty()) { + ssid = parseSSId(path); + if (ssid.isEmpty()) { + string mdid = parseMDId(path); + if (mdid.isEmpty()) return url; + ssid = md2ss(mdid); + } + } + + string params = !epid.isEmpty() ? ("ep_id=" + epid) : ("season_id=" + ssid); + res = apiPost("/pgc/view/web/ep/page?" + encWbi(params)); - string params = "ep_id=" + epid; - string res = apiPost("/pgc/view/web/ep/page?" + encWbi(params)); JsonReader Reader; JsonValue Root; @@ -1929,9 +1985,15 @@ string Bangumi(const string&in path, dictionary& MetaData, array& Qu cid = episode["cid"].asString(); if (@MetaData !is null) { - MetaData["vid"] = join({bvid, cid}, "|"); - string title = episode["show_title"].asString(); + string title; + if (!ssid.isEmpty()) { + title = episode["share_copy"].asString(); + } else { + title = episode["show_title"].asString(); + } + MetaData["title"] = title; + MetaData["vid"] = bvid; MetaData["duration"] = episode["duration"].asString(); MetaData["thumbnail"] = episode["cover"].asString(); MetaData["webUrl"] = episode["link"].asString(); @@ -2367,7 +2429,7 @@ string Audio(const string&in path, dictionary& MetaData, array& Qual array watchlater() { array videos; - string res = apiPost("/x/v2/history/toview"); + string res = apiPost("/x/v2/history/toview/web", false); JsonReader Reader; JsonValue Root; if (Reader.parse(res, Root) && Root.isObject()) { @@ -2388,6 +2450,7 @@ array watchlater() { video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?p=" + p; video["thumbnail"] = item["pic"].asString(); video["author"] = item["owner"]["name"].asString(); + video["date"] = UnixTimeToDateTime(item["pubdate"].asInt64()); videos.insertLast(video); } } @@ -2402,49 +2465,69 @@ array watchlater() { array History() { array videos; - uint max = 0; - uint ps = 30; - string res = apiPost("/x/web-interface/history/cursor?max=" + max + "&ps=" + ps); - JsonReader Reader; - JsonValue Root; - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue data = Root["data"]["list"]; - if (data.isArray()) { - for (int i = 0; i < data.size(); i++) { - JsonValue item = data[i]; - string type = item["history"]["business"].asString(); - // archive live pgc - if (type == "archive" || type == "live") { - if (item.isObject()) { - dictionary video; - video["thumbnail"] = item["cover"].asString(); - video["author"] = item["author_name"].asString(); - if (type == "live") { - if (item["live_status"].asInt() != 1) { - continue; - } - video["title"] = "直播 | " + item["title"].asString(); - video["url"] = item["uri"].asString(); - } else if (type == "archive") { - int p = item["history"]["page"].asInt(); - if (p == 1) { - video["title"] = item["title"].asString(); - } else { - video["title"] = item["title"].asString() + " | " + item["history"]["part"].asString(); - } - video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["history"]["bvid"].asString() + "?p=" + p; - } else { - continue; - } - videos.insertLast(video); - } - } - } - } - } - } + int ps = 30; + string max = "0"; + int view_at = 0; + string business = ""; + + while (videos.size() < ConfigData.historyVideoNums) { + string res = apiPost("/x/web-interface/history/cursor?max=" + max + "&view_at=" + formatInt(view_at) + "&business=" + business + "&ps=" + ps + "&type=all", false); + + JsonReader Reader; + JsonValue Root; + + if (!Reader.parse(res, Root) || !Root.isObject()) break; + if (Root["code"].asInt() != 0) break; + + JsonValue cursor = Root["data"]["cursor"]; + + string max = cursor["max"].asString(); + int view_at = cursor["view_at"].asInt(); + string business = cursor["business"].asString(); + + JsonValue data = Root["data"]["list"]; + + if (!data.isArray() || data.size() == 0) break; + + for (int i = 0; i < data.size(); i++) { + JsonValue item = data[i]; + if (!item.isObject()) continue; + + string type = item["history"]["business"].asString(); + // archive / live + if (type == "archive" || type == "live") { + dictionary video; + + video["thumbnail"] = item["cover"].asString(); + video["author"] = item["author_name"].asString(); + + if (type == "live") { + if (item["live_status"].asInt() != 1) continue; + + video["title"] = "直播 | " + item["title"].asString(); + video["url"] = item["uri"].asString(); + + } else if (type == "archive") { + int p = item["history"]["page"].asInt(); + + if (p == 1) { + video["title"] = item["title"].asString(); + } else { + video["title"] = item["title"].asString() + " | " + item["history"]["part"].asString(); + } + + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["history"]["bvid"].asString() + "?p=" + p; + video["date"] = UnixTimeToDateTime(item["view_at"].asInt64()); + } + + videos.insertLast(video); + } + } + + if (videos.size() >= ConfigData.historyVideoNums) break; + } + return videos; } @@ -2634,34 +2717,30 @@ array followingLive(uint page) { array videos; JsonReader Reader; JsonValue Root; - string url = "https://api.live.bilibili.com/xlive/web-ucenter/user/following?page=" + page + "&page_size=10"; - string res = post(url); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue list = Root["data"]["list"]; - if (list.isArray()) { - for (int i = 0; i < list.size(); i++) { - JsonValue item = list[i]; - // 未开播 - if (item["live_status"].asInt() == 0) { - return videos; - } - dictionary video; - video["title"] = item["title"].asString(); - video["url"] = "https://live.bilibili.com/" + item["roomid"].asInt(); - video["thumbnail"] = item["face"].asString(); - video["author"] = item["uname"].asString(); - videos.insertLast(video); - } - if (page < Root["data"]["totalPage"].asUInt()) { - array videos2 = followingLive(page + 1); - for (uint i = 0; i < videos2.size(); i++) { - videos.insertLast(videos2[i]); - } - } + + string url = "/xlive/web-ucenter/v1/xfetter/GetWebList"; + string res = apiPost(url, "", "https://api.live.bilibili.com", false); + Reader.parse(res, Root); + + JsonValue rooms = Root["data"]["rooms"]; + if (rooms.isArray()) { + if (rooms.size() != 0) { + for (int i = 0; i < rooms.size(); i++) { + JsonValue room = rooms[i]; + dictionary video; + video["title"] = room["title"].asString(); + video["url"] = room["link"].asString(); + video["thumbnail"] = room["face"].asString(); + video["author"] = room["uname"].asString(); + videos.insertLast(video); } } } + + if (videos.size() == 0) { + HostMessageBox("你 [关注的直播] 列表是空的,刷点别的视频吧。", "[关注的直播] 为空", 2,0); + } + return videos; } @@ -2711,29 +2790,40 @@ array liveCategory(uint page, string cateid, string parentAreaId, ui return videos; } -array PopularHistory() { +array PopularAll() { array videos; - JsonReader Reader; - JsonValue Root; - string res = apiPost("/x/web-interface/popular/precious?page_size=100&page=1"); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() != 0) { - return videos; - } - JsonValue list = Root["data"]["list"]; - if (list.isArray()) { - for (int i = 0; i < list.size(); i++) { - JsonValue item = list[i]; - dictionary video; - video["title"] = item["title"].asString(); - video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); - video["thumbnail"] = item["pic"].asString(); - video["author"] = item["owner"]["name"].asString(); - videos.insertLast(video); + int ps = 50; + int pn = 1; + + while(pn <= ConfigData.popularAllPages) { + JsonReader Reader; + JsonValue Root; + + string param = "ps=" + ps + "&pn=" + pn; + string res = apiPost("/x/web-interface/popular?" + encWbi(param, false), false); + if (Reader.parse(res, Root) && Root.isObject()) { + if (Root["code"].asInt() != 0) { + return videos; + } + JsonValue list = Root["data"]["list"]; + if (list.isArray()) { + for (int i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + dictionary video; + video["title"] = item["title"].asString(); + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + video["thumbnail"] = item["pic"].asString(); + video["author"] = item["owner"]["name"].asString(); + video["date"] = UnixTimeToDateTime(item["pubdate"].asInt64()); + videos.insertLast(video); + } } } + + pn++; } + return videos; } @@ -2743,7 +2833,7 @@ array PopularWeekly(string path) { JsonValue Root; string num = parse(path, "num"); if (num.empty()) { - string res = apiPost("/x/web-interface/popular/series/list"); + string res = apiPost("/x/web-interface/popular/series/list", false); if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() != 0) { return videos; @@ -2754,7 +2844,7 @@ array PopularWeekly(string path) { } } } - string res = apiPost("/x/web-interface/popular/series/one?number=" + num); + string res = apiPost("/x/web-interface/popular/series/one?number=" + num, false); if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() != 0) { return videos; @@ -2769,6 +2859,7 @@ array PopularWeekly(string path) { video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); video["thumbnail"] = item["pic"].asString(); video["author"] = item["owner"]["name"].asString(); + video["date"] = UnixTimeToDateTime(item["pubdate"].asInt64()); videos.insertLast(video); } } @@ -2776,27 +2867,11 @@ array PopularWeekly(string path) { return videos; } -array Ranking(string path) { +array PopularHistory() { array videos; - - array names = { "全站", "国创相关", "动画", "音乐", "舞蹈", "游戏", "知识", "科技", "运动", "汽车", "生活", "美食", "动物圈", "鬼畜", "时尚", "娱乐", "影视" }; - array urls = { "www.bilibili.com/v/popular/rank/all", "www.bilibili.com/v/popular/rank/guochuang", "www.bilibili.com/v/popular/rank/douga", "www.bilibili.com/v/popular/rank/music", "www.bilibili.com/v/popular/rank/dance", "www.bilibili.com/v/popular/rank/game", "www.bilibili.com/v/popular/rank/knowledge", "www.bilibili.com/v/popular/rank/tec", "www.bilibili.com/v/popular/rank/spor", "www.bilibili.com/v/popular/rank/car", "www.bilibili.com/v/popular/rank/life", "www.bilibili.com/v/popular/rank/food", "www.bilibili.com/v/popular/rank/animal", "www.bilibili.com/v/popular/rank/kichiku", "www.bilibili.com/v/popular/rank/fashion", "www.bilibili.com/v/popular/rank/en", "www.bilibili.com/v/popular/rank/cinephile" }; - array ids = { 0, 168, 1, 3, 129, 4, 36, 188, 234, 223, 160, 211, 217, 119, 155, 5, 181 }; - int pos = -1; - for (uint i = 0; i < urls.size(); i++) { - if (path.find(urls[i]) >= 0) { - pos = i; - break; - } - } - if (pos < 0) { - return videos; - } - JsonReader Reader; JsonValue Root; - - string res = apiPost("/x/web-interface/ranking/v2?rid=" + ids[pos]); + string res = apiPost("/x/web-interface/popular/precious?page_size=100&page=1", false); if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() != 0) { return videos; @@ -2811,6 +2886,7 @@ array Ranking(string path) { video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); video["thumbnail"] = item["pic"].asString(); video["author"] = item["owner"]["name"].asString(); + video["date"] = UnixTimeToDateTime(item["pubdate"].asInt64()); videos.insertLast(video); } } @@ -2818,11 +2894,139 @@ array Ranking(string path) { return videos; } +array Ranking(string path) { + array videos; + + string key = HostRegExpParse(path, "/v/popular/rank/([^/?#]+)"); + if (key.empty()) { + return videos; + } + + string configJson = '{' + '"all": {"title":"全部", "api":"/x/web-interface/ranking/v2", "rid":0},' + '"anime": {"title":"番剧", "api":"/pgc/web/rank/list", "season_type":1},' + '"guochuang": {"title":"国创", "api":"/pgc/season/rank/web/list", "season_type":4},' + '"documentary": {"title":"纪录片", "api":"/pgc/season/rank/web/list", "season_type":3},' + '"movie": {"title":"电影", "api":"/pgc/season/rank/web/list", "season_type":2},' + '"tv": {"title":"电视剧", "api":"/pgc/season/rank/web/list", "season_type":5},' + '"variety": {"title":"综艺", "api":"/pgc/season/rank/web/list", "season_type":7},' + + '"douga": {"title":"动画", "api":"/x/web-interface/ranking/v2", "rid":1005},' + '"game": {"title":"游戏", "api":"/x/web-interface/ranking/v2", "rid":1008},' + '"kichiku": {"title":"鬼畜", "api":"/x/web-interface/ranking/v2", "rid":1007},' + '"music": {"title":"音乐", "api":"/x/web-interface/ranking/v2", "rid":1003},' + '"dance": {"title":"舞蹈", "api":"/x/web-interface/ranking/v2", "rid":1004},' + '"cinephile": {"title":"影视", "api":"/x/web-interface/ranking/v2", "rid":1001},' + '"ent": {"title":"娱乐", "api":"/x/web-interface/ranking/v2", "rid":1002},' + '"knowledge": {"title":"知识", "api":"/x/web-interface/ranking/v2", "rid":1010},' + '"tech": {"title":"科技数码", "api":"/x/web-interface/ranking/v2", "rid":1012},' + '"food": {"title":"美食", "api":"/x/web-interface/ranking/v2", "rid":1020},' + '"car": {"title":"汽车", "api":"/x/web-interface/ranking/v2", "rid":1013},' + '"fashion": {"title":"时尚美妆", "api":"/x/web-interface/ranking/v2", "rid":1014},' + '"sports": {"title":"体育运动", "api":"/x/web-interface/ranking/v2", "rid":1018},' + '"animal": {"title":"动物", "api":"/x/web-interface/ranking/v2", "rid":1024}' + '}'; + + JsonReader Reader; + JsonValue Config; + + if (!Reader.parse(configJson, Config) || !Config.isObject()) { + return videos; + } + + JsonValue config = Config[key]; + + if (!config.isObject()) { + return videos; + } + + string api = config["api"].asString(); + JsonValue Root; + string params; + + if (api == "/x/web-interface/ranking/v2") { + params = "rid=" + config["rid"].asInt() + "&type=all&web_location=0.0"; + string res = apiPost(api + "?" + encWbi(params), false); + + if (!Reader.parse(res, Root) || !Root.isObject()) return videos; + if (Root["code"].asInt() != 0) return videos; + + JsonValue list = Root["data"]["list"]; + if (!list.isArray()) return videos; + + for (int i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + dictionary video; + + video["title"] = item["title"].asString(); + video["duration"] = item["duration"].asInt() * 1000; + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + video["thumbnail"] = item["pic"].asString(); + video["author"] = item["owner"]["name"].asString(); + video["date"] = UnixTimeToDateTime(item["pubdate"].asInt64()); + + videos.insertLast(video); + } + } + else if (api == "/pgc/web/rank/list") { + params = "day=3&season_type=" + config["season_type"].asInt() + "&web_location=0.0"; + string res = apiPost(api + "?" + encWbi(params), false); + + if (!Reader.parse(res, Root) || !Root.isObject()) return videos; + if (Root["code"].asInt() != 0) return videos; + + JsonValue list = Root["result"]["list"]; + if (!list.isArray()) return videos; + + for (int i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + dictionary video; + + video["title"] = item["title"].asString(); + // video["duration"] = item["duration"].asInt() * 1000; + video["url"] = item["url"].asString(); + video["thumbnail"] = item["ss_horizontal_cover"].asString(); + // video["author"] = item["owner"]["name"].asString(); + // video["date"] = UnixTimeToDateTime(item["pubdate"].asInt64()); + video["viewCount"] = item["stat"]["view"].asString(); + + videos.insertLast(video); + } + } + else if (api == "/pgc/season/rank/web/list") { + params = "day=3&season_type=" + config["season_type"].asInt() + "&web_location=0.0"; + string res = apiPost(api + "?" + encWbi(params), false); + + if (!Reader.parse(res, Root) || !Root.isObject()) return videos; + if (Root["code"].asInt() != 0) return videos; + + JsonValue list = Root["data"]["list"]; + if (!list.isArray()) return videos; + + for (int i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + dictionary video; + + video["title"] = item["title"].asString(); + // video["duration"] = item["duration"].asInt() * 1000; + video["url"] = item["url"].asString(); + video["thumbnail"] = item["ss_horizontal_cover"].asString(); + // video["author"] = item["owner"]["name"].asString(); + // video["date"] = UnixTimeToDateTime(item["pubdate"].asInt64()); + video["viewCount"] = item["stat"]["view"].asString(); + + videos.insertLast(video); + } + } + + return videos; +} + array Dynamic(uint tid) { array videos; JsonReader Reader; JsonValue Root; - string res = apiPost("/x/web-interface/dynamic/region?pn=1&ps=50&rid=" + tid); + string res = apiPost("/x/web-interface/dynamic/region?pn=1&ps=50&rid=" + tid, false); if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() != 0) { return videos; @@ -2845,29 +3049,35 @@ array Dynamic(uint tid) { } array Search(string path) { + log("================================Search==========================="); array videos; JsonReader Reader; JsonValue Root; string kw; + + path = HostUrlDecode(path); + if (path.find("?WithCaption") >= 0) { path.replace("?WithCaption", ""); - kw = HostUrlEncode(parse(path, "keyword")); + kw = parse(path, "keyword"); } else { kw = parse(path, "keyword"); } if (kw.empty()) { return videos; } + kw = HostUrlEncode(kw); + string type = HostRegExpParse(path, "search.bilibili.com/([a-zA-Z0-9]+)"); string url; if (type == "all") { - url = "/x/web-interface/search/all/v2?keyword=" + kw; + url = "/x/web-interface/wbi/search/all/v2?keyword=" + kw; } else if (type == "video") { - url = "/x/web-interface/search/type?search_type=video&keyword=" + kw; + url = "/x/web-interface/wbi/search/type?search_type=video&keyword=" + kw; } else { return videos; } - string res = apiPost(url); + string res = apiPost(url, false); if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() != 0) { return videos; @@ -2897,6 +3107,7 @@ array Search(string path) { video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); video["thumbnail"] = "https:" + item["pic"].asString(); video["author"] = item["author"].asString(); + video["date"] = UnixTimeToDateTime(item["pubdate"].asInt64()); videos.insertLast(video); } } @@ -2911,7 +3122,7 @@ array webDynamic(string path) { if (type != "video") { type = "all"; } - int nums = 5; + int nums = ConfigData.webDynamicPages; string offset; string baseurl = "/x/polymer/web-dynamic/v1/feed/all?timezone_offset=-480&type=" + type; for (int i = 1; i <= nums; i++) { @@ -2919,7 +3130,7 @@ array webDynamic(string path) { if (!offset.empty()) { url += "&offset=" + offset; } - string res = apiPost(url); + string res = apiPost(url, false); if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() != 0) { return videos; @@ -2931,10 +3142,11 @@ array webDynamic(string path) { JsonValue dynamic = list[j]["modules"]["module_dynamic"]; if (dynamic.isObject()) { JsonValue major = dynamic["major"]; - if (!major.isObject()) { - continue; - } + if (!major.isObject()) continue; + string author = list[j]["modules"]["module_author"]["name"].asString(); + string date = UnixTimeToDateTime(parseInt(list[j]["modules"]["module_author"]["pub_ts"].asString())); + JsonValue archive = major["archive"]; if (archive.isObject()) { if (archive["bvid"].isString() && !archive["bvid"].asString().empty()) { @@ -2945,6 +3157,7 @@ array webDynamic(string path) { video["url"] = "https://www.bilibili.com/video/" + bvid; video["thumbnail"] = archive["cover"].asString(); video["author"] = author; + video["date"] = date; videos.insertLast(video); } continue; @@ -2976,24 +3189,99 @@ array webDynamic(string path) { return videos; } -array Recommend(uint page) { +array spaceDynamic(string path) { + log("==================================spaceDynamic===================================="); array videos; JsonReader Reader; JsonValue Root; - const uint nums = 5; - string url = "/x/web-interface/wbi/index/top/feed/rcmd?y_num=3&fresh_type=4&feed_version=V8&fresh_idx_1h=" + page + "&fetch_row=" + (3 * page + 1) + "&fresh_idx=" + page + "&brush=" + page + "&homepage_ver=1&ps=12&last_y_num=4&outside_trigger="; - string res = apiPost(url); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() != 0) { - return videos; + string host_mid; + string offset; + + host_mid = HostRegExpParse(path, "/([0-9]+)/[a-zA-Z0-9]"); + if (host_mid.isEmpty()) return videos; + + while(videos.size() < ConfigData.spaceDynamicVideoNums) { + string params = "offset=" + offset + "&host_mid=" + host_mid + "&timezone_offset=-480"; + string url = "/x/polymer/web-dynamic/v1/feed/space?" + encWbi(params); + string res = apiPost(url, false); + if (!Reader.parse(res, Root) || !Root.isObject()) return videos; + if (Root["code"].asInt() != 0) return videos; + + JsonValue list = Root["data"]["items"]; + if (!list.isArray()) return videos; + + for (int j = 0; j < list.size(); j++) { + JsonValue dynamic = list[j]["modules"]["module_dynamic"]; + if (dynamic.isObject()) { + JsonValue major = dynamic["major"]; + if (!major.isObject()) continue; + + string author = list[j]["modules"]["module_author"]["name"].asString(); + string date = UnixTimeToDateTime(parseInt(list[j]["modules"]["module_author"]["pub_ts"].asString())); + + JsonValue archive = major["archive"]; + if (archive.isObject()) { + if (archive["bvid"].isString() && !archive["bvid"].asString().empty()) { + string bvid = archive["bvid"].asString(); + dictionary video; + video["title"] = "视频 | " + archive["title"].asString(); + video["duration"] = parseTime(archive["duration_text"].asString()); + video["url"] = "https://www.bilibili.com/video/" + bvid; + video["thumbnail"] = archive["cover"].asString(); + video["author"] = author; + video["date"] = date; + videos.insertLast(video); + } + continue; + } + JsonValue live_rcmd = major["live_rcmd"]; + if (live_rcmd.isObject()) { + string content_str = live_rcmd["content"].asString(); + JsonValue content; + if (Reader.parse(content_str, content) && content.isObject()) { + if (content["live_play_info"]["live_status"].asInt() == 1) { + dictionary live; + live["title"] = "直播 | " + content["live_play_info"]["title"].asString(); + live["url"] = "https://live.bilibili.com/" + content["live_play_info"]["room_id"].asString(); + live["thumbnail"] = content["live_play_info"]["cover"].asString(); + live["author"] = author; + videos.insertLast(live); + } + } + continue; + } + } } + + if (offset == Root["data"]["offset"].asString()) break; + offset = Root["data"]["offset"].asString(); + } + + return videos; +} + +array Recommend() { + array videos; + int ps = 30; + int page = 1; + + while (videos.size() < ConfigData.recommendVideoNums) { + string url = "/x/web-interface/wbi/index/top/feed/rcmd?web_location=1430650&y_num=3&fresh_type=4&feed_version=V8&fresh_idx_1h=" + page + "&fetch_row=" + (3 * page + 1) + "&fresh_idx=" + page + "&brush=" + page + "&device=win&homepage_ver=1&ps=" + ps + "&last_y_num=5"; + + string res = apiPost(url, false); + + JsonReader Reader; + JsonValue Root; + + if (!Reader.parse(res, Root) || !Root.isObject()) break; + if (Root["code"].asInt() != 0) break; + JsonValue list = Root["data"]["item"]; if (list.isArray()) { for (int i = 0; i < list.size(); i++) { JsonValue item = list[i]; - if (item["bvid"].asString().empty()) { - continue; - } + if (item["bvid"].asString().empty()) continue; + dictionary video; video["thumbnail"] = item["pic"].asString(); video["author"] = item["owner"]["name"].asString(); @@ -3004,17 +3292,16 @@ array Recommend(uint page) { video["title"] = item["title"].asString(); video["duration"] = item["duration"].asInt() * 1000; video["url"] = item["uri"].asString(); + video["date"] = UnixTimeToDateTime(item["pubdate"].asInt64()); } videos.insertLast(video); } } + + page++; + if (videos.size() >= ConfigData.recommendVideoNums) break; } - if (page < nums) { - array videos2 = Recommend(page + 1); - for (uint i = 0; i < videos2.size(); i++) { - videos.insertLast(videos2[i]); - } - } + return videos; } @@ -3026,68 +3313,62 @@ bool PlayitemCheck(const string&in path) { return false; } - if (path.find("/video/BV") >= 0) { - return true; - } - if (path.find("/video/av") >= 0) { + if (path.find("live.bilibili.com") >= 0) { return true; } - + if (path.find("/bangumi/media/md") >= 0) { return true; } if (path.find("/bangumi/play/") >= 0) { return true; } - if (path.find("live.bilibili.com") >= 0) { + if (path.find("www.bilibili.com/audio/au") >= 0) { return true; } - if (path.find("www.bilibili.com/audio/au") >= 0) { + + if (path.find("/video/BV") >= 0) { + return true; + } + if (path.find("/video/av") >= 0) { return true; } - // log("PlayitemCheck", "false"); + + log("PlayitemCheck", "false"); return false; } bool PlaylistCheck(const string&in path) { - // log("PlaylistCheck - path", path); + log("PlaylistCheck - path", path); status = 2; if (path.find("bilibili.com") < 0) { return false; } - if (isPlaylist(path)) { - return true; - } - if (!parseBVId(path).empty() || !parseAVId(path).empty()) { + + // domain + if (path.find("t.bilibili.com") >= 0) { return true; } if (path.find("search.bilibili.com") >= 0) { return true; } - if (path.find("/watchlater") >= 0) { - return true; - } - if (path.find("/account/history") >= 0) { - return true; - } if (path.find("space.bilibili.com") >= 0) { - if (path.find("/video") >= 0) { - return true; - } else if (path.find("/audio") >= 0) { - return true; - } else if (path.find("/favlist") >= 0) { - return true; - } else if (path.find("lists") >= 0) { - return true; - } else if (HostRegExpParse(path, "/([0-9]+)/[a-zA-Z0-9]").empty()) { - return true; - } else { - return false; + if (!HostRegExpParse(path, "/([0-9]+)/[a-zA-Z0-9]").empty()) { + if (path.find("/upload/video") >= 0) { + return true; + } else if (path.find("/dynamic") >= 0) { + return true; + } else if (path.find("/audio") >= 0) { + return true; + } else if (path.find("/favlist") >= 0) { + return true; + } else if (path.find("/bangumi") >= 0) { + return false; + } else { + return true; + } } } - if (path.find("/medialist/detail/ml") >= 0) { - return true; - } if (path.find("link.bilibili.com") >= 0 && path.find("/user-center/follow") >= 0) { return true; } @@ -3097,77 +3378,87 @@ bool PlaylistCheck(const string&in path) { } return true; } - if (path.find("www.bilibili.com") >= 0 && HostRegExpParse(path, "www.bilibili.com/([a-zA-Z0-9]+)").empty()) { + + // path + if (path.find("www.bilibili.com/v/popular/all") >= 0) { return true; } - if (path.find("bangumi/media/md") >= 0) { + if (path.find("www.bilibili.com/v/popular/weekly") >= 0) { return true; } - if (path.find("bangumi/play/") >= 0) { + if (path.find("www.bilibili.com/v/popular/history") >= 0) { return true; } if (path.find("www.bilibili.com/v/popular/rank") >= 0) { return true; } - if (path.find("www.bilibili.com/v/popular/history") >= 0) { + if (path.find("/watchlater") >= 0) { return true; } - if (path.find("www.bilibili.com/v/popular/weekly") >= 0) { + if (path.find("/history") >= 0) { return true; } - if (gettid(path) > 0) { + if (path.find("/medialist/detail/ml") >= 0) { + return true; + } + if (path.find("bangumi/media/md") >= 0) { + return true; + } + if (path.find("bangumi/play/") >= 0) { return true; } if (path.find("www.bilibili.com/audio/am") >= 0) { return true; } - if (path.find("t.bilibili.com") >= 0) { + if (path.find("www.bilibili.com") >= 0 && HostRegExpParse(path, "www.bilibili.com/([a-zA-Z0-9]+)").empty()) { return true; } - // log("PlaylistCheck", "false"); + if (isPlaylist(path)) { + return true; + } + if (!parseBVId(path).empty() || !parseAVId(path).empty()) { + return true; + } + if (gettid(path) > 0) { + return true; + } + + log("PlaylistCheck", "false"); return false; } array PlaylistParse(const string&in url) { string path = url; - // log("PlaylistParse - path", path); + log("PlaylistParse - path", path); status = 3; array result; - if (videoIsUGCorPGC.isPGC) path = videoIsUGCorPGC.pgcURL; - if (videoIsUGCorPGC.isUGCSeason) return UGCSeason(path); - - string bvid = parseBVId(path); - if (!bvid.empty()) { - return RelatedVideos(path); - } - string avid = parseAVId(path); - if (!avid.empty()) { - return RelatedVideos(path); - } - if (path.find("/watchlater") >= 0) { - return watchlater(); + // domain + if (path.find("t.bilibili.com") >= 0) { + return webDynamic(path); } if (path.find("search.bilibili.com") >= 0) { + log('path.find("search.bilibili.com") >= 0'); return Search(path); } if (path.find("space.bilibili.com") >= 0) { - if (path.find("/video") >= 0) { - return spaceVideo(path); - } else if (path.find("/audio") >= 0) { - return spaceAudio(path); - } else if (path.find("/favlist") >= 0) { - return FavList(path); - } else if (path.find("lists") >= 0) { - return spaceSeason(path); - } else if (HostRegExpParse(path, "/([0-9]+)/[a-zA-Z0-9]").empty()) { - return spaceVideo(path); + if (!HostRegExpParse(path, "/([0-9]+)/[a-zA-Z0-9]").empty()) { + if (path.find("/upload/video") >= 0) { + return spaceVideo(path); + } else if (path.find("/dynamic") >= 0) { + return spaceDynamic(path); + } else if (path.find("/audio") >= 0) { + return spaceAudio(path); + } else if (path.find("/favlist") >= 0) { + return FavList(path); + } else if (path.find("lists") >= 0) { + return spaceSeason(path); + } else { + return spaceVideo(path); + } } } - if (path.find("/medialist/detail/ml") >= 0) { - return FavList(path); - } if (path.find("link.bilibili.com") >= 0 && path.find("/user-center/follow") >= 0) { return followingLive(1); } @@ -3182,71 +3473,95 @@ array PlaylistParse(const string&in url) { return liveCategory(path, 1, "256", "3", 0); } } - if (path.find("www.bilibili.com") >= 0 && HostRegExpParse(path, "www.bilibili.com/([a-zA-Z0-9]+)").empty()) { - return Recommend(1); - } - if (path.find("bangumi/media/md") >= 0) { - return BangumiEpisodes(parseMDId(path), "media_id"); + + // path + if (path.find("www.bilibili.com/v/popular/all") >= 0) { + return PopularAll(); } - if (path.find("bangumi/play/ep") >= 0) { - return BangumiEpisodes(parseEPId(path), "ep_id"); + if (path.find("www.bilibili.com/v/popular/weekly") >= 0) { + return PopularWeekly(path); } - if (path.find("bangumi/play/ss") >= 0) { - return BangumiEpisodes(parseSSId(path), "season_id"); + if (path.find("www.bilibili.com/v/popular/history") >= 0) { + return PopularHistory(); } if (path.find("www.bilibili.com/v/popular/rank") >= 0) { return Ranking(path); } - if (path.find("www.bilibili.com/v/popular/history") >= 0) { - return PopularHistory(); - } - if (path.find("www.bilibili.com/v/popular/weekly") >= 0) { - return PopularWeekly(path); + if (path.find("/watchlater") >= 0) { + return watchlater(); } if (path.find("/history") >= 0) { return History(); } + if (path.find("/medialist/detail/ml") >= 0) { + return FavList(path); + } if (path.find("www.bilibili.com/audio/am") >= 0) { return AudioList(path); } + if (path.find("www.bilibili.com") >= 0 && HostRegExpParse(path, "www.bilibili.com/([a-zA-Z0-9]+)").empty()) { + return Recommend(); + } + + // playlist + if (videoIsUGCorPGC.isPGC) path = videoIsUGCorPGC.pgcURL; + if (videoIsUGCorPGC.isUGCSeason) return UGCSeason(path); + + if (path.find("bangumi/media/md") >= 0) { + return BangumiEpisodes(parseMDId(path), "media_id"); + } + if (path.find("bangumi/play/ep") >= 0) { + return BangumiEpisodes(parseEPId(path), "ep_id"); + } + if (path.find("bangumi/play/ss") >= 0) { + return BangumiEpisodes(parseSSId(path), "season_id"); + } + string bvid = parseBVId(path); + if (!bvid.empty()) { + return RelatedVideos(path); + } + string avid = parseAVId(path); + if (!avid.empty()) { + return RelatedVideos(path); + } + uint tid = gettid(path); if (tid > 0) { return Dynamic(tid); } - if (path.find("t.bilibili.com") >= 0) { - return webDynamic(path); - } return result; } string PlayitemParse(const string&in path, dictionary& MetaData, array& QualityList) { - // log("PlayitemParse - path", path); + log("PlayitemParse - path", path); status = 4; - if (path.find("/video/BV") >= 0) { - string bvid = parseBVId(path); - return Video(bvid, path, MetaData, QualityList); - } - if (path.find("/video/av") >= 0) { - string aid = parseAVId(path); - return Video(aid, path, MetaData, QualityList); + if (path.find("live.bilibili.com") >= 0) { + string id = HostRegExpParse(path, "live.bilibili.com/([0-9]+)"); + if (!id.empty()) { + return Live(id, path, MetaData, QualityList); + } } + if (path.find("bangumi/media/md") >= 0) { return Bangumi(path, MetaData, QualityList); } if (path.find("bangumi/play") >= 0) { return Bangumi(path, MetaData, QualityList); } - if (path.find("live.bilibili.com") >= 0) { - string id = HostRegExpParse(path, "live.bilibili.com/([0-9]+)"); - if (!id.empty()) { - return Live(id, path, MetaData, QualityList); - } - } if (path.find("www.bilibili.com/audio/au") >= 0) { return Audio(path, MetaData, QualityList); } + if (path.find("/video/BV") >= 0) { + string bvid = parseBVId(path); + return Video(bvid, path, MetaData, QualityList); + } + if (path.find("/video/av") >= 0) { + string aid = parseAVId(path); + return Video(aid, path, MetaData, QualityList); + } + return path; } \ No newline at end of file diff --git a/Media/UrlList/MediaUrlList - Bilibili.as b/Media/UrlList/MediaUrlList - Bilibili.as index 4537298..37e1115 100644 --- a/Media/UrlList/MediaUrlList - Bilibili.as +++ b/Media/UrlList/MediaUrlList - Bilibili.as @@ -44,26 +44,226 @@ string post(string url, string data="") { array Ranking() { return { - { { "title", "全站" }, { "url", "https://www.bilibili.com/v/popular/rank/all" } }, - { { "title", "国创相关" }, { "url", "https://www.bilibili.com/v/popular/rank/guochuang" } }, + { { "title", "全部" }, { "url", "https://www.bilibili.com/v/popular/rank/all" } }, + { { "title", "番剧" }, { "url", "https://www.bilibili.com/v/popular/rank/anime" } }, + { { "title", "国创" }, { "url", "https://www.bilibili.com/v/popular/rank/guochuang" } }, + { { "title", "纪录片" }, { "url", "https://www.bilibili.com/v/popular/rank/documentary" } }, + { { "title", "电影" }, { "url", "https://www.bilibili.com/v/popular/rank/movie" } }, + { { "title", "电视剧" }, { "url", "https://www.bilibili.com/v/popular/rank/tv" } }, + { { "title", "综艺" }, { "url", "https://www.bilibili.com/v/popular/rank/variety" } }, { { "title", "动画" }, { "url", "https://www.bilibili.com/v/popular/rank/douga" } }, + { { "title", "游戏" }, { "url", "https://www.bilibili.com/v/popular/rank/game" } }, + { { "title", "鬼畜" }, { "url", "https://www.bilibili.com/v/popular/rank/kichiku" } }, { { "title", "音乐" }, { "url", "https://www.bilibili.com/v/popular/rank/music" } }, { { "title", "舞蹈" }, { "url", "https://www.bilibili.com/v/popular/rank/dance" } }, - { { "title", "游戏" }, { "url", "https://www.bilibili.com/v/popular/rank/game" } }, + { { "title", "影视" }, { "url", "https://www.bilibili.com/v/popular/rank/cinephile" } }, + { { "title", "娱乐" }, { "url", "https://www.bilibili.com/v/popular/rank/ent" } }, { { "title", "知识" }, { "url", "https://www.bilibili.com/v/popular/rank/knowledge" } }, - { { "title", "科技" }, { "url", "https://www.bilibili.com/v/popular/rank/tec" } }, - { { "title", "运动" }, { "url", "https://www.bilibili.com/v/popular/rank/spor" } }, - { { "title", "汽车" }, { "url", "https://www.bilibili.com/v/popular/rank/car" } }, - { { "title", "生活" }, { "url", "https://www.bilibili.com/v/popular/rank/life" } }, + { { "title", "科技数码" }, { "url", "https://www.bilibili.com/v/popular/rank/tech" } }, { { "title", "美食" }, { "url", "https://www.bilibili.com/v/popular/rank/food" } }, - { { "title", "动物圈" }, { "url", "https://www.bilibili.com/v/popular/rank/animal" } }, - { { "title", "鬼畜" }, { "url", "https://www.bilibili.com/v/popular/rank/kichiku" } }, - { { "title", "时尚" }, { "url", "https://www.bilibili.com/v/popular/rank/fashion" } }, - { { "title", "娱乐" }, { "url", "https://www.bilibili.com/v/popular/rank/en" } }, - { { "title", "影视" }, { "url", "https://www.bilibili.com/v/popular/rank/cinephile" } }, + { { "title", "汽车" }, { "url", "https://www.bilibili.com/v/popular/rank/car" } }, + { { "title", "时尚美妆" }, { "url", "https://www.bilibili.com/v/popular/rank/fashion" } }, + { { "title", "体育运动" }, { "url", "https://www.bilibili.com/v/popular/rank/sports" } }, + { { "title", "动物" }, { "url", "https://www.bilibili.com/v/popular/rank/animal" } }, }; } +array RankingPgc(string path) { + array videos; + + string key = HostRegExpParse(path, "/v/popular/rank/([^/?#]+)"); + if (key.empty()) { + return videos; + } + + string configJson = '{' + '"all": {"title":"全部", "api":"/x/web-interface/ranking/v2", "rid":0},' + '"anime": {"title":"番剧", "api":"/pgc/web/rank/list", "season_type":1},' + '"guochuang": {"title":"国创", "api":"/pgc/season/rank/web/list", "season_type":4},' + '"documentary": {"title":"纪录片", "api":"/pgc/season/rank/web/list", "season_type":3},' + '"movie": {"title":"电影", "api":"/pgc/season/rank/web/list", "season_type":2},' + '"tv": {"title":"电视剧", "api":"/pgc/season/rank/web/list", "season_type":5},' + '"variety": {"title":"综艺", "api":"/pgc/season/rank/web/list", "season_type":7},' + + '"douga": {"title":"动画", "api":"/x/web-interface/ranking/v2", "rid":1005},' + '"game": {"title":"游戏", "api":"/x/web-interface/ranking/v2", "rid":1008},' + '"kichiku": {"title":"鬼畜", "api":"/x/web-interface/ranking/v2", "rid":1007},' + '"music": {"title":"音乐", "api":"/x/web-interface/ranking/v2", "rid":1003},' + '"dance": {"title":"舞蹈", "api":"/x/web-interface/ranking/v2", "rid":1004},' + '"cinephile": {"title":"影视", "api":"/x/web-interface/ranking/v2", "rid":1001},' + '"ent": {"title":"娱乐", "api":"/x/web-interface/ranking/v2", "rid":1002},' + '"knowledge": {"title":"知识", "api":"/x/web-interface/ranking/v2", "rid":1010},' + '"tech": {"title":"科技数码", "api":"/x/web-interface/ranking/v2", "rid":1012},' + '"food": {"title":"美食", "api":"/x/web-interface/ranking/v2", "rid":1020},' + '"car": {"title":"汽车", "api":"/x/web-interface/ranking/v2", "rid":1013},' + '"fashion": {"title":"时尚美妆", "api":"/x/web-interface/ranking/v2", "rid":1014},' + '"sports": {"title":"体育运动", "api":"/x/web-interface/ranking/v2", "rid":1018},' + '"animal": {"title":"动物", "api":"/x/web-interface/ranking/v2", "rid":1024}' + '}'; + + JsonReader Reader; + JsonValue Config; + + if (!Reader.parse(configJson, Config) || !Config.isObject()) { + return videos; + } + + JsonValue config = Config[key]; + + if (!config.isObject()) { + return videos; + } + + string api = config["api"].asString(); + JsonValue Root; + string params; + + if (api == "/x/web-interface/ranking/v2") { + params = "rid=" + config["rid"].asInt() + "&type=all&web_location=0.0"; + string res = post("https://api.bilibili.com" + api + "?" + params); + + if (!Reader.parse(res, Root) || !Root.isObject()) return videos; + if (Root["code"].asInt() != 0) return videos; + + JsonValue list = Root["data"]["list"]; + if (!list.isArray()) return videos; + + for (int i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + dictionary video; + + video["title"] = item["title"].asString(); + video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); + // video["duration"] = item["duration"].asInt() * 1000; + // video["thumbnail"] = item["pic"].asString(); + // video["author"] = item["owner"]["name"].asString(); + // video["date"] = UnixTimeToDateTime(item["pubdate"].asInt64()); + + videos.insertLast(video); + } + } + else if (api == "/pgc/web/rank/list") { + params = "day=3&season_type=" + config["season_type"].asInt() + "&web_location=0.0"; + string res = post("https://api.bilibili.com" + api + "?" + params); + + if (!Reader.parse(res, Root) || !Root.isObject()) return videos; + if (Root["code"].asInt() != 0) return videos; + + JsonValue list = Root["result"]["list"]; + if (!list.isArray()) return videos; + + for (int i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + dictionary video; + + video["title"] = item["title"].asString(); + video["url"] = item["url"].asString(); + // video["duration"] = item["duration"].asInt() * 1000; + // video["thumbnail"] = item["ss_horizontal_cover"].asString(); + // video["author"] = item["owner"]["name"].asString(); + // video["date"] = UnixTimeToDateTime(item["pubdate"].asInt64()); + // video["viewCount"] = item["stat"]["view"].asString(); + + videos.insertLast(video); + } + } + else if (api == "/pgc/season/rank/web/list") { + params = "day=3&season_type=" + config["season_type"].asInt() + "&web_location=0.0"; + string res = post("https://api.bilibili.com" + api + "?" + params); + + if (!Reader.parse(res, Root) || !Root.isObject()) return videos; + if (Root["code"].asInt() != 0) return videos; + + JsonValue list = Root["data"]["list"]; + if (!list.isArray()) return videos; + + for (int i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + dictionary video; + + video["title"] = item["title"].asString(); + video["url"] = item["url"].asString(); + // video["duration"] = item["duration"].asInt() * 1000; + // video["thumbnail"] = item["ss_horizontal_cover"].asString(); + // video["author"] = item["owner"]["name"].asString(); + // video["date"] = UnixTimeToDateTime(item["pubdate"].asInt64()); + // video["viewCount"] = item["stat"]["view"].asString(); + + videos.insertLast(video); + } + } + + return videos; +} + +array RankingBangumi() { + return RankingPgc("/v/popular/rank/anime"); +} + +array RankingGuochuang() { + return RankingPgc("/v/popular/rank/guochuang"); +} + +array RankingDocumentary() { + return RankingPgc("/v/popular/rank/documentary"); +} + +array RankingMovie() { + return RankingPgc("/v/popular/rank/movie"); +} + +array RankingTV() { + return RankingPgc("/v/popular/rank/tv"); +} + +array RankingVariety() { + return RankingPgc("/v/popular/rank/variety"); +} + +// array Dynamic() { +// return { +// { { "title", "番剧" }, { "url", "https://www.bilibili.com/anime/" } }, +// { { "title", "电影" }, { "url", "https://www.bilibili.com/movie/" } }, +// { { "title", "国创" }, { "url", "https://www.bilibili.com/guochuang/" } }, +// { { "title", "电视剧" }, { "url", "https://www.bilibili.com/tv/" } }, +// { { "title", "综艺" }, { "url", "https://www.bilibili.com/variety/" } }, +// { { "title", "纪录片" }, { "url", "https://www.bilibili.com/documentary/" } }, +// { { "title", "动画" }, { "url", "https://www.bilibili.com/c/douga/" } }, +// { { "title", "游戏" }, { "url", "https://www.bilibili.com/c/game/" } }, +// { { "title", "鬼畜" }, { "url", "https://www.bilibili.com/c/kichiku/" } }, +// { { "title", "音乐" }, { "url", "https://www.bilibili.com/c/music/" } }, +// { { "title", "舞蹈" }, { "url", "https://www.bilibili.com/c/dance/" } }, +// { { "title", "影视" }, { "url", "https://www.bilibili.com/c/cinephile/" } }, +// { { "title", "娱乐" }, { "url", "https://www.bilibili.com/c/ent/" } }, +// { { "title", "知识" }, { "url", "https://www.bilibili.com/c/knowledge/" } }, +// { { "title", "科技数码" }, { "url", "https://www.bilibili.com/c/tech/" } }, +// { { "title", "资讯" }, { "url", "https://www.bilibili.com/c/information/" } }, +// { { "title", "美食" }, { "url", "https://www.bilibili.com/c/food/" } }, +// { { "title", "小剧场" }, { "url", "https://www.bilibili.com/c/shortplay/" } }, +// { { "title", "汽车" }, { "url", "https://www.bilibili.com/c/car" } }, +// { { "title", "时尚美妆" }, { "url", "https://www.bilibili.com/c/fashion/" } }, +// { { "title", "体育运动" }, { "url", "https://www.bilibili.com/c/sports/" } }, +// { { "title", "动物" }, { "url", "https://www.bilibili.com/c/animal/" } }, +// { { "title", "vlog" }, { "url", "https://www.bilibili.com/c/vlog/" } }, +// { { "title", "绘画" }, { "url", "https://www.bilibili.com/c/painting/" } }, +// { { "title", "人工智能" }, { "url", "https://www.bilibili.com/c/ai/" } }, +// { { "title", "家装房产" }, { "url", "https://www.bilibili.com/c/home/" } }, +// { { "title", "户外潮流" }, { "url", "https://www.bilibili.com/c/outdoors/" } }, +// { { "title", "健身" }, { "url", "https://www.bilibili.com/c/gym/" } }, +// { { "title", "手工" }, { "url", "https://www.bilibili.com/c/handmake/" } }, +// { { "title", "旅游出行" }, { "url", "https://www.bilibili.com/c/travel/" } }, +// { { "title", "三农" }, { "url", "https://www.bilibili.com/c/rural/" } }, +// { { "title", "亲子" }, { "url", "https://www.bilibili.com/c/parenting/" } }, +// { { "title", "健康" }, { "url", "https://www.bilibili.com/c/health/" } }, +// { { "title", "情感" }, { "url", "https://www.bilibili.com/c/emotion/" } }, +// { { "title", "生活兴趣" }, { "url", "https://www.bilibili.com/c/life_joy/" } }, +// { { "title", "生活经验" }, { "url", "https://www.bilibili.com/c/life_experience/" } }, +// { { "title", "公益" }, { "url", "https://love.bilibili.com" } }, +// { { "title", "超高清" }, { "url", "https://www.bilibili.com/blackboard/era/Vp41b8bsU9Wkog3X.html" } }, +// { { "title", "视频播客" }, { "url", "https://www.bilibili.com/blackboard/era/jpyPhRRrMn3fmZ2B.html" } }, +// }; +// } + array Dynamic() { return { { { "title", "番剧" }, { "url", "https://www.bilibili.com/anime/" } }, @@ -196,6 +396,16 @@ array Dynamic() { }; } + +array Popular() { + return { + { { "title", "综合热门" }, { "url", "https://www.bilibili.com/v/popular/all" } }, + { { "title", "每周必看(最新一期)" }, { "url", "https://www.bilibili.com/v/popular/weekly" } }, + { { "title", "入站必刷" }, { "url", "https://www.bilibili.com/v/popular/history" } }, + { { "title", "排行榜(全部)" }, { "url", "https://www.bilibili.com/v/popular/rank/all" } }, + }; +} + array PopularHistory() { array ret; string res = post("https://api.bilibili.com/x/web-interface/popular/series/list"); @@ -223,40 +433,65 @@ array PopularHistory() { array Other() { return { - { { "title", "首页推荐" }, { "url", "https://www.bilibili.com" } }, + { { "title", "动态首页" }, { "url", "https://t.bilibili.com" } }, { { "title", "我关注的直播" }, { "url", "https://link.bilibili.com/p/center/index#/user-center/follow/1" } }, - { { "title", "入站必刷" }, { "url", "https://www.bilibili.com/v/popular/history/" } }, + { { "title", "首页推荐" }, { "url", "https://www.bilibili.com" } }, { { "title", "搜索" }, { "url", "https://search.bilibili.com/video?keyword=陈奕迅" } }, { { "title", "稍后再看" }, { "url", "https://www.bilibili.com/watchlater/#/list" } }, { { "title", "历史记录" }, { "url", "https://www.bilibili.com/account/history" } }, - { { "title", "动态首页" }, { "url", "https://t.bilibili.com" } }, }; } -array GetCategorys() -{ +array GetCategorys() { return { - { { "title", "分区 - 排行榜" }, { "Category", "Ranking" } }, - { { "title", "分区 - 最新投稿" }, { "Category", "Dynamic" } }, - { { "title", "每周必看" }, { "Category", "PopularHistory" } }, - { { "title", "其他" }, { "Category", "Other" } }, + { { "title", "主要" }, { "Category", "Other" } }, + { { "title", "热门" }, { "Category", "Popular" } }, + { { "title", "热门 - 每周必看(历史分期)" }, { "Category", "PopularHistory" } }, + { { "title", "热门 - 排行榜(分区)" }, { "Category", "Ranking" } }, + { { "title", "排行榜 - 番剧" }, { "Category", "RankingBangumi" } }, + { { "title", "排行榜 - 国创" }, { "Category", "RankingGuochuang" } }, + { { "title", "排行榜 - 纪录片" }, { "Category", "RankingDocumentary" } }, + { { "title", "排行榜 - 电影" }, { "Category", "RankingMovie" } }, + { { "title", "排行榜 - 电视剧" }, { "Category", "RankingTV" } }, + { { "title", "排行榜 - 综艺" }, { "Category", "RankingVariety" } }, + // { { "title", "分区 - 最新投稿" }, { "Category", "Dynamic" } }, }; } -array GetUrlList(string Category, string Extra, string PathToken, string Query, string PageToken) -{ +array GetUrlList(string Category, string Extra, string PathToken, string Query, string PageToken) { if (Category == "Ranking") { return Ranking(); } if (Category == "Dynamic") { return Dynamic(); } + if (Category == "Popular") { + return Popular(); + } if (Category == "PopularHistory") { return PopularHistory(); } if (Category == "Other") { return Other(); } + if (Category == "RankingBangumi") { + return RankingBangumi(); + } + if (Category == "RankingGuochuang") { + return RankingGuochuang(); + } + if (Category == "RankingDocumentary") { + return RankingDocumentary(); + } + if (Category == "RankingMovie") { + return RankingMovie(); + } + if (Category == "RankingTV") { + return RankingTV(); + } + if (Category == "RankingVariety") { + return RankingVariety(); + } array ret; return ret; diff --git "a/Playlist/1.\345\212\250\346\200\201\351\246\226\351\241\265.dpl" "b/Playlist/1.\345\212\250\346\200\201\351\246\226\351\241\265.dpl" new file mode 100644 index 0000000..0e2122d --- /dev/null +++ "b/Playlist/1.\345\212\250\346\200\201\351\246\226\351\241\265.dpl" @@ -0,0 +1,3 @@ +DAUMPLAYLIST +topindex=0 +extplaylist=https://t.bilibili.com diff --git "a/Playlist/2.\346\210\221\345\205\263\346\263\250\347\232\204\347\233\264\346\222\255.dpl" "b/Playlist/2.\346\210\221\345\205\263\346\263\250\347\232\204\347\233\264\346\222\255.dpl" new file mode 100644 index 0000000..ec982da --- /dev/null +++ "b/Playlist/2.\346\210\221\345\205\263\346\263\250\347\232\204\347\233\264\346\222\255.dpl" @@ -0,0 +1,3 @@ +DAUMPLAYLIST +topindex=0 +extplaylist=https://link.bilibili.com/p/center/index#/user-center/follow/1 diff --git "a/Playlist/3.\347\250\215\345\220\216\345\206\215\347\234\213.dpl" "b/Playlist/3.\347\250\215\345\220\216\345\206\215\347\234\213.dpl" new file mode 100644 index 0000000..af9b925 --- /dev/null +++ "b/Playlist/3.\347\250\215\345\220\216\345\206\215\347\234\213.dpl" @@ -0,0 +1,3 @@ +DAUMPLAYLIST +topindex=0 +extplaylist=https://www.bilibili.com/watchlater/#/list diff --git "a/Playlist/4.\351\246\226\351\241\265\346\216\250\350\215\220.dpl" "b/Playlist/4.\351\246\226\351\241\265\346\216\250\350\215\220.dpl" new file mode 100644 index 0000000..414ba90 --- /dev/null +++ "b/Playlist/4.\351\246\226\351\241\265\346\216\250\350\215\220.dpl" @@ -0,0 +1,3 @@ +DAUMPLAYLIST +topindex=0 +extplaylist=https://www.bilibili.com diff --git "a/Playlist/5.\347\273\274\345\220\210\347\203\255\351\227\250.dpl" "b/Playlist/5.\347\273\274\345\220\210\347\203\255\351\227\250.dpl" new file mode 100644 index 0000000..55a1835 --- /dev/null +++ "b/Playlist/5.\347\273\274\345\220\210\347\203\255\351\227\250.dpl" @@ -0,0 +1,3 @@ +DAUMPLAYLIST +topindex=0 +extplaylist=https://www.bilibili.com/v/popular/all diff --git "a/Playlist/6.\346\257\217\345\221\250\345\277\205\347\234\213.dpl" "b/Playlist/6.\346\257\217\345\221\250\345\277\205\347\234\213.dpl" new file mode 100644 index 0000000..3a3b595 --- /dev/null +++ "b/Playlist/6.\346\257\217\345\221\250\345\277\205\347\234\213.dpl" @@ -0,0 +1,3 @@ +DAUMPLAYLIST +topindex=0 +extplaylist=https://www.bilibili.com/v/popular/weekly diff --git "a/Playlist/7.\345\205\245\347\253\231\345\277\205\345\210\267.dpl" "b/Playlist/7.\345\205\245\347\253\231\345\277\205\345\210\267.dpl" new file mode 100644 index 0000000..44b478f --- /dev/null +++ "b/Playlist/7.\345\205\245\347\253\231\345\277\205\345\210\267.dpl" @@ -0,0 +1,3 @@ +DAUMPLAYLIST +topindex=0 +extplaylist=https://www.bilibili.com/v/popular/history/ diff --git "a/Playlist/8.\346\216\222\350\241\214\346\246\234.dpl" "b/Playlist/8.\346\216\222\350\241\214\346\246\234.dpl" new file mode 100644 index 0000000..0a176e3 --- /dev/null +++ "b/Playlist/8.\346\216\222\350\241\214\346\246\234.dpl" @@ -0,0 +1,3 @@ +DAUMPLAYLIST +topindex=0 +extplaylist=https://www.bilibili.com/v/popular/rank/all diff --git "a/Playlist/9.\345\216\206\345\217\262\350\256\260\345\275\225.dpl" "b/Playlist/9.\345\216\206\345\217\262\350\256\260\345\275\225.dpl" new file mode 100644 index 0000000..1413f20 --- /dev/null +++ "b/Playlist/9.\345\216\206\345\217\262\350\256\260\345\275\225.dpl" @@ -0,0 +1,3 @@ +DAUMPLAYLIST +topindex=0 +extplaylist=https://www.bilibili.com/account/history diff --git a/README.md b/README.md index 6311094..30dda7a 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,7 @@ - 本地缓存响应数据,降低 API 请求次数。可在配置文件中设置,默认300s。 - 清理无用代码,较为激进,有问题请提issue。 - 换用新的 itag 选择机制。 -- 支持屏蔽 P2PCDN,可通过配置文件调整,默认屏蔽 +- 支持屏蔽 P2PCDN,可通过配置文件调整,默认屏蔽。 ### 📺 直播 @@ -62,6 +62,20 @@ - 音频 itag 生成不再使用预定义。 - 支持历史播放记录。(使用场景:potplayer 重新启动后直接播放或从播放列表中播放)。 - 增加番剧官方开场动画与片尾,可与空降助手合并。 +- 从搜索和番剧媒体界面打开时,支持根据观看记录定位到当前观看的剧集(potplayer的观看记录)。 + +### 播放列表 +- "我关注的直播间"当无人开播时,弹出对话框提醒。 +- “我的动态”、"首页推荐"、"历史记录"、“综合热门”、个人“空间动态”,支持设定视频数量。 +- 支持"综合热门"页面。 +- 增加"热门-排行榜-PGC"页面支持。 +- 增加UP主个人空间动态页面支持。 +- 各类生成的播放列表,日期基本上已全部显示。 + +## 打开链接 +- "Potplayer - 打开链接",类别重新整理命名。 +- 排行榜适配B站新分区。 +- 增加 PGC 内容类别。 ## TODO From b505e9e0b4abc477ab4ad8d6c4de53bcb9ba373b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Tue, 8 Sep 2026 14:07:55 +0800 Subject: [PATCH 120/132] update version --- Media/PlayParse/MediaPlayParse - Bilibili.as | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index b81aeb8..7ad7635 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -91,7 +91,7 @@ string GetTitle() { } string GetVersion() { - return "2.6.14"; + return "2.6.15"; } string GetDesc() { From 36746b30b9bee3ca889532c142aca6c134bdd3b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Tue, 8 Sep 2026 20:52:23 +0800 Subject: [PATCH 121/132] =?UTF-8?q?update=20bug-=E5=8F=8D=E9=A6=88.yml?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bug-\345\217\215\351\246\210.yml" | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git "a/.github/ISSUE_TEMPLATE/bug-\345\217\215\351\246\210.yml" "b/.github/ISSUE_TEMPLATE/bug-\345\217\215\351\246\210.yml" index af995f6..f0ab714 100644 --- "a/.github/ISSUE_TEMPLATE/bug-\345\217\215\351\246\210.yml" +++ "b/.github/ISSUE_TEMPLATE/bug-\345\217\215\351\246\210.yml" @@ -28,15 +28,16 @@ body: required: false - type: input - id: potplayer + id: config attributes: - label: PotPlayer 版本 - placeholder: 例如 250xxx + label: 配置文件 + description: 贴出你的配置 + placeholder: 将你的配置文件内容贴出来 validations: required: true - type: input - id: plugin + id: bilibilipotPlayer attributes: label: BilibiliPotPlayer 版本 description: 请填写使用的版本号或 Commit。 @@ -44,10 +45,18 @@ body: validations: required: true + - type: input + id: potplayer + attributes: + label: PotPlayer 版本 + placeholder: 例如 250xxx + validations: + required: true + - type: textarea id: additional attributes: label: 其他信息 - description: 其他可能有帮助的信息,例如日志、错误信息等。 + description: 其他可能有帮助的信息,例如日志、错误信息等。可将 debug 设为 true,potplayer 播放失败后将调试窗口内容完整贴出。 placeholder: | 如有相关日志,请粘贴在这里。 \ No newline at end of file From d09d6ac184c43bddaf6a75028543e9d36cb96478 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Wed, 9 Sep 2026 16:25:55 +0800 Subject: [PATCH 122/132] =?UTF-8?q?*=20=E9=A6=96=E9=A1=B5=E6=8E=A8?= =?UTF-8?q?=E8=8D=90=E3=80=81=E4=B8=AA=E4=BA=BA=E5=8A=A8=E6=80=81=E3=80=81?= =?UTF-8?q?=E7=94=A8=E6=88=B7=E7=A9=BA=E9=97=B4=E5=8A=A8=E6=80=81=E3=80=81?= =?UTF-8?q?=E7=A8=8D=E5=90=8E=E5=86=8D=E7=9C=8B=E3=80=81=E5=8E=86=E5=8F=B2?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E4=BF=9D=E6=8C=81=E5=AE=9E=E6=97=B6=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=EF=BC=8C=E5=85=B6=E4=BD=99=E6=8E=A5=E5=8F=A3=E5=9F=BA?= =?UTF-8?q?=E6=9C=AC=E9=87=87=E7=94=A8=E7=BC=93=E5=AD=98=E3=80=82=20*=20?= =?UTF-8?q?=E5=B0=BD=E5=8F=AF=E8=83=BD=E4=BD=BF=E7=94=A8=E9=89=B4=E6=9D=83?= =?UTF-8?q?=E8=AF=B7=E6=B1=82=E3=80=82=20*=20=E4=BF=AE=E5=A4=8D=E5=A4=9A?= =?UTF-8?q?=E5=A4=84=E7=BB=86=E8=8A=82=20BUG=EF=BC=8C=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E9=83=A8=E5=88=86=E9=80=BB=E8=BE=91=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 396 +++++++++++-------- 1 file changed, 232 insertions(+), 164 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 7ad7635..7710b6a 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -61,17 +61,18 @@ void OnInitialize() { } string configFile = HostGetScriptFolder() + ConfigFileName; - if (!HostFileExist(configFile)) { + if (HostFileExist(configFile)) { + ConfigData = ReadConfigFile(configFile); + if (ConfigData.debug) { + HostOpenConsole(); + } + } else { HostMessageBox("配置文件不存在\n\n路径: " + configFile, "[BilibiliPotplayer] 配置文件不存在", 0, 0); } - ConfigData = ReadConfigFile(configFile); - if (ConfigData.debug) { - HostOpenConsole(); - } } string GetTitle() { - string title = "Bilibili"; + string title = "BiliBili"; if (!HostFileExist(HostGetScriptFolder() + ConfigFileName)) { return title + "(配置文件不存在)"; } @@ -83,7 +84,7 @@ string GetTitle() { JsonReader reader; JsonValue root; - if (!reader.parse(config.fullConfig, root) && !root.isObject()) { + if (!reader.parse(config.fullConfig, root) || !root.isObject()) { return title + "(配置文件格式错误)"; } @@ -91,7 +92,7 @@ string GetTitle() { } string GetVersion() { - return "2.6.15"; + return "2.6.16"; } string GetDesc() { @@ -103,7 +104,6 @@ string GetConfigFile() { } void ApplyConfigFile() { - string msg; Config config; uintptr fp = HostFileOpen(HostGetScriptFolder() + ConfigFileName); config.fullConfig = HostFileRead(fp, HostFileLength(fp)); @@ -111,11 +111,9 @@ void ApplyConfigFile() { JsonReader reader; JsonValue root; - if (!reader.parse(config.fullConfig, root) && !root.isObject()) { - msg = "配置文件存在问题"; + if (!reader.parse(config.fullConfig, root) || !root.isObject()) { + HostMessageBox("配置文件存在问题", "[BilibiliPotplayer] 配置文件错误", 0, 1); } - - HostMessageBox(msg, "[BilibiliPotplayer] 配置文件错误", 0, 1); } string GetWebAccountUrl() { @@ -164,8 +162,35 @@ string GetStatus() { return info; } +string GetBroadcastListUrl() { + log('GetBroadcastListUrl()'); + return "https://www.bilibili.com/;https://live.bilibili.com/"; +} + +string GetBroadcastListScript(){ + log('GetBroadcastListUrl()'); + return ""; +} + void OnFinalize() { - if (!ConfigData.bilibiliDanmujiServer.isEmpty()) { + log("OnFinalize()"); + if (!ConfigData.bilibiliDanmujiServer.isEmpty() && ConfigData.usingDanmuji) { + string unixTime = formatInt(DatetimeToUnixTime(FormatDateTime(datetime()))); + post(ConfigData.bilibiliDanmujiServer + "/disconnectRoom?_=" + unixTime); + } +} + +void PlayitemCancel() { + log("PlayitemCancel()"); + if (!ConfigData.bilibiliDanmujiServer.isEmpty() && ConfigData.usingDanmuji) { + string unixTime = formatInt(DatetimeToUnixTime(FormatDateTime(datetime()))); + post(ConfigData.bilibiliDanmujiServer + "/disconnectRoom?_=" + unixTime); + } +} + +void PlaylistCancel() { + log("PlaylistCancel()"); + if (!ConfigData.bilibiliDanmujiServer.isEmpty() && ConfigData.usingDanmuji) { string unixTime = formatInt(DatetimeToUnixTime(FormatDateTime(datetime()))); post(ConfigData.bilibiliDanmujiServer + "/disconnectRoom?_=" + unixTime); } @@ -247,7 +272,7 @@ class Config { string sponsorBlockMirror; bool parseM3u8RealUrl = false; string bilibiliDanmujiServer; - int webDynamicPages = 5; + int webDynamicVideoNums = 50; int recommendVideoNums = 30; int historyVideoNums = 30; int popularAllPages = 1; @@ -258,8 +283,9 @@ class Config { string danmakuUrl; string subtitleUrl; + bool usingDanmuji = false; - int maxliveroom = 200; + int maxliveroom = 100; } Config ReadConfigFile(string file) { @@ -319,8 +345,8 @@ Config ReadConfigFile(string file) { } if (root["videoNums"].isObject()) { JsonValue videoNums = root["videoNums"]; - if (videoNums["webDynamicPages"].isNumeric()) { - config.webDynamicPages = videoNums["webDynamicPages"].asInt(); + if (videoNums["webDynamicVideoNums"].isNumeric()) { + config.webDynamicVideoNums = videoNums["webDynamicVideoNums"].asInt(); } if (videoNums["recommendVideoNums"].isNumeric()) { config.recommendVideoNums = videoNums["recommendVideoNums"].asInt(); @@ -338,6 +364,9 @@ Config ReadConfigFile(string file) { if (root["disableAVC"].isBool()) { config.disableAVC = root["disableAVC"].asBool(); } + if (root["preferHDR"].isBool()) { + config.preferHDR = root["preferHDR"].asBool(); + } if (root["debug"].isBool()) { config.debug = root["debug"].asBool(); } @@ -731,7 +760,7 @@ string getCodec(int codecid) { string GetM3u8RealURL(string url) { status = 7; uint tickCount = HostGetTickCount(); - string resp = post(url, "", "", true); + string resp = post(url, "", "", false); HostIncTimeOut(HostGetTickCount() - tickCount); array lines = resp.split("\n"); @@ -819,7 +848,7 @@ bool isP2PCDN(const string&in url) { } string getFixedURL(JsonValue&in data) { - string base_url = data["base_url"].asString(); + string base_url = ( data["base_url"].isString() ) ? data["base_url"].asString() : data["baseUrl"].asString(); if (!ConfigData.blockP2PCDN) { return base_url; @@ -829,8 +858,8 @@ string getFixedURL(JsonValue&in data) { return base_url; } - if (data["backup_url"].isString()) { - string backup_url = data["backup_url"].asString(); + if (data["backup_url"].isString() || data["backupUrl"].isString()) { + string backup_url = ( data["backup_url"].isString() ) ? data["backup_url"].asString() : data["backupUrl"].asString(); if (!isP2PCDN(backup_url)) { return backup_url; } @@ -842,8 +871,15 @@ string getFixedURL(JsonValue&in data) { return backup_url; } } - } + } else if (data["backupUrl"].isArray()) { + for (uint j = 0; j < data["backupUrl"].size(); j++) { + string backup_url = data["backupUrl"][j].asString(); + if (!isP2PCDN(backup_url)) { + return backup_url; + } + } + } return base_url; } @@ -912,7 +948,7 @@ string getLiveQuality(JsonValue g_qn_desc, int qn, int hdr_type, JsonValue video } string getVideoQuality(JsonValue support_formats, int quality) { - for (int i = 0; i <= support_formats.size(); i++) { + for (int i = 0; i < support_formats.size(); i++) { if (support_formats[i]["quality"].asInt() == quality) return support_formats[i]["new_description"].asString(); } return "未知"; @@ -939,49 +975,47 @@ void AppendVideoQualityList(string bvid, string aid, string cid, string& url, ar videos = SortVideos(videos); for (int i = 0; i < videos.size(); i++) { - if (@QualityList !is null) { - JsonValue video = videos[i]; - QualityListItem item; - - - int qn = video["id"].asInt(); - int codecid = video["codecid"].asInt(); - - url = getFixedURL(video); - string width = formatInt(video["width"].asInt()); - string height = formatInt(video["height"].asInt()); - int bitrateVal = video["bandwidth"].asInt(); - string bitrate = HostFormatBitrate(bitrateVal) + "bps"; - int fps = parseInt(video["frame_rate"].asString()); - bool isHDR = (qn == 125 || qn == 126 || qn == 129); - string mime_type = video["mime_type"].asString().MakeLower(); - string format = mime_type.substr(mime_type.findLast("/") + 1) + ", " + getCodec(codecid) + ", " + bitrate; - string quality = getVideoQuality(data["support_formats"], qn); - itag = getVideoItag(qn, codecid); - if (itag <= 0 || HostExistITag(itag)) { - itag = HostGetITag(video["height"].asInt(), 0, true, false); - if (itag <= 0) itag = HostGetITag(video["height"].asInt(), 0, true, true); - } - while (HostExistITag(itag)) itag++; - HostSetITag(itag); + JsonValue video = videos[i]; + + int qn = video["id"].asInt(); + int codecid = video["codecid"].asInt(); + + url = getFixedURL(video); + string width = formatInt(video["width"].asInt()); + string height = formatInt(video["height"].asInt()); + int bitrateVal = video["bandwidth"].asInt(); + string bitrate = HostFormatBitrate(bitrateVal) + "bps"; + int fps = ( video["frame_rate"].isString() ) ? parseInt(video["frame_rate"].asString()) : parseInt(video["frameRate"].asString()); + bool isHDR = (qn == 125 || qn == 126 || qn == 129); + string mime_type = ( video["mime_type"].isString() ) ? video["mime_type"].asString().MakeLower() : video["mimeType"].asString().MakeLower(); + string format = mime_type.substr(mime_type.findLast("/") + 1) + ", " + getCodec(codecid) + ", " + bitrate; + string quality = getVideoQuality(data["support_formats"], qn); + itag = getVideoItag(qn, codecid); + if (itag <= 0 || HostExistITag(itag)) { + itag = HostGetITag(video["height"].asInt(), 0, true, false); + if (itag <= 0) itag = HostGetITag(video["height"].asInt(), 0, true, true); + } + while (HostExistITag(itag)) itag++; + HostSetITag(itag); - item.url = url; - item.bitrateVal = bitrateVal; - item.bitrate = bitrate; - item.resolution = width + "x" + height; - item.fps = fps; - item.isHDR = isHDR; - item.format = format; - item.quality = quality; - item.qualityDetail = quality; - item.itag = itag; - item.audioIsDefault = false; - item.va = "v"; - item.referer = "https://www.bilibili.com/video/" + bvid; - if (i == videos.size() - 1) item.videoIsDefault = true; + QualityListItem item; + + item.url = url; + item.bitrateVal = bitrateVal; + item.bitrate = bitrate; + item.resolution = width + "x" + height; + item.fps = fps; + item.isHDR = isHDR; + item.format = format; + item.quality = quality; + item.qualityDetail = quality; + item.itag = itag; + item.audioIsDefault = false; + item.va = "v"; + item.referer = "https://www.bilibili.com/video/" + bvid; + if (i == videos.size() - 1) item.videoIsDefault = true; - if (@QualityList !is null) QualityList.insertLast(item.toDictionary()); - } + if (@QualityList !is null) QualityList.insertLast(item.toDictionary()); } JsonValue audios; @@ -1004,6 +1038,9 @@ void AppendVideoQualityList(string bvid, string aid, string cid, string& url, ar audio = data["dash"]["flac"]["audio"]; AppendAudioQualityList(audio, bvid, QualityList); } + } else if (data["durl"].isArray()) { + log('/x/player/wbi/playurl has data["durl"]!!!'); + HostMessageBox('告知我一下, /x/player/wbi/playurl has data["durl"]', "告知我一下", 0, 0); } } else { log("Video playurl response code != 0", root["code"].asInt()); @@ -1539,16 +1576,20 @@ JsonValue SortVideos(JsonValue& videos) { } if (ConfigData.disableAVC && codecid == 7) { - bool hasOtherCodec = false; + bool hasHevcOrAv1 = false; for (uint k = 0; k < videos.size(); k++) { - if (k != j && !used[k] && videos[k]["id"].asInt() == id && videos[k]["codecid"].asInt() != 7) { - hasOtherCodec = true; + if (k == j) continue; + if (videos[k]["id"].asInt() != id) continue; + + int otherCodecId = videos[k]["codecid"].asInt(); + if (otherCodecId == 12 || otherCodecId == 13) { + hasHevcOrAv1 = true; break; } } - if (hasOtherCodec) { + if (hasHevcOrAv1) { continue; } } @@ -1572,22 +1613,25 @@ JsonValue SortVideos(JsonValue& videos) { string getChatUrl(const string room_id, string server) { string chatUrl; + string unixTime; uint tickCount; JsonReader Reader; JsonValue Root; - - tickCount = HostGetTickCount(); - - string unixTime; - unixTime = formatInt(DatetimeToUnixTime(FormatDateTime(datetime()))); - post(server + "/disconnectRoom?_=" + unixTime); - HostIncTimeOut(HostGetTickCount() - tickCount); + if (ConfigData.usingDanmuji) { + tickCount = HostGetTickCount(); + + unixTime = formatInt(DatetimeToUnixTime(FormatDateTime(datetime()))); + post(server + "/disconnectRoom?_=" + unixTime); + + HostIncTimeOut(HostGetTickCount() - tickCount); + } tickCount = HostGetTickCount(); unixTime = formatInt(DatetimeToUnixTime(FormatDateTime(datetime()))); string res = post(server + "/connectRoom?roomid=" + room_id + "&_=" + unixTime); + ConfigData.usingDanmuji = true; HostIncTimeOut(HostGetTickCount() - tickCount); @@ -1667,6 +1711,7 @@ array BangumiEpisodes(string id, string type) { } array UGCSeason(const string&in path) { + log("============================UGCSeason============================"); array videos; string bvid = parseBVId(path); @@ -1750,6 +1795,7 @@ array UGCSeason(const string&in path) { } array RelatedVideos(const string&in path) { + log("============================RelatedVideos============================"); array videos; string bvid = parseBVId(path); @@ -1778,7 +1824,7 @@ array RelatedVideos(const string&in path) { video["thumbnail"] = view["pic"].asString(); video["author"] = view["owner"]["name"].asString(); video["url"] = "https://www.bilibili.com/video/" + bvid; - if (!view["desc"].asString().empty() || view["desc"].asString() != "-") video["content"] = view["desc"].asString(); + if (!view["desc"].asString().empty() && view["desc"].asString() != "-") video["content"] = view["desc"].asString(); video["viewCount"] = view["stat"]["view"].asString(); video["likeCount"] = view["stat"]["like"].asString(); video["dislikeCount"] = view["stat"]["dislike"].asString(); @@ -1800,7 +1846,7 @@ array RelatedVideos(const string&in path) { video["thumbnail"] = item["pic"].asString(); video["author"] = item["owner"]["name"].asString(); video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); - if (!item["desc"].asString().empty() || item["desc"].asString() != "-") video["content"] = item["desc"].asString(); + if (!item["desc"].asString().empty() && item["desc"].asString() != "-") video["content"] = item["desc"].asString(); video["viewCount"] = item["stat"]["view"].asString(); video["likeCount"] = item["stat"]["like"].asString(); video["dislikeCount"] = item["stat"]["dislike"].asString(); @@ -1834,7 +1880,7 @@ array FavList(string path) { if (mid.empty()) { mid = "" + ConfigData.uid; } - string res = apiPost("/x/v3/fav/folder/created/list-all?up_mid=" + mid, false); + string res = apiPost("/x/v3/fav/folder/created/list-all?up_mid=" + mid); JsonValue Root; if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() == 0) { @@ -1878,6 +1924,8 @@ array FavList(string path) { for (int i = 0; i < data.size(); i++) { JsonValue item = data[i]; if (item.isObject()) { + if (item["attr"].asInt() == 9) continue; + dictionary video; video["title"] = item["title"].asString(); video["duration"] = item["duration"].asInt() * 1000; @@ -2067,46 +2115,57 @@ string Bangumi(const string&in path, dictionary& MetaData, array& Qu string Video(string id, const string&in path, dictionary& MetaData, array& QualityList) { log("==============================video============================="); + string url; string res; string bvid; string aid; string cid; string title; - string url; string params; JsonReader reader; JsonValue Root; array subtitle; array chapter; - - int p = parseInt(parse(path, "p", "1")); if (id.find("BV") == 0) { bvid = id; params += "bvid=" + id; } - if (id.find("av") == 0) { - aid = id; - params += "aid=" + id; + string parsedAid = parseAVId(path); + if (!parsedAid.empty()) { + aid = parsedAid; + params += "aid=" + parsedAid; } + res = apiPost("/x/web-interface/wbi/view/detail?" + encWbi(params)); - reader.parse(res, Root); + if (!reader.parse(res, Root) || !Root.isObject()) return url; JsonValue view = Root["data"]["View"]; - if (view["redirect_url"].isString()) return Bangumi(view["redirect_url"].asString(), MetaData, QualityList); bvid = view["bvid"].asString(); aid = view["aid"].asString(); - if (@MetaData !is null) { - cid = view["pages"][p-1]["cid"].asString(); - - if (view["pages"].size() == 1) { - title = view["title"].asString(); - } else { - title = view["pages"][p-1]["part"].asString(); + title = view["title"].asString(); + cid = view["cid"].asString(); + + if (view["pages"].isArray() && view["pages"].size() > 0) { + int p = parseInt(parse(path, "p", "1")); + if (p <= 0 || p > view["pages"].size()) { + p = 1; } - + + JsonValue page = view["pages"][p - 1]; + + if (page["cid"].isString() && !page["cid"].asString().empty()) { + cid = page["cid"].asString(); + } + + if (view["pages"].size() > 1) { + title = view["title"].asString() + " > " + page["part"].asString(); + } + } + + if (@MetaData !is null) { MetaData["vid"] = join({bvid, cid}, "|"); MetaData["title"] = title; MetaData["duration"] = formatInt(view["duration"].asInt() * 1000); @@ -2157,13 +2216,14 @@ string Live(string id, const string&in path, dictionary& MetaData, array 0) { - string backup = " - 备 "; - if (j > 1) { - backup += j - 1; + string temp_url; + QualityList[k].get("url", temp_url); + if (temp_url == url_info_url) { + urlExists = true; + break; } - qualityDetail = quality + backup; } - if (itag <= 0 || HostExistITag(itag)) itag = HostGetITag(height, 0, true, true); - while (HostExistITag(itag)) itag++; - HostSetITag(itag); - - QualityListItem item; - - item.url = url_info_url; - item.bitrateVal = bitrateVal; - item.bitrate = bitrate; - item.resolution = width + "x" + height; - ; - item.isHDR = isHDR; - item.format = format; - item.quality = quality; - item.qualityDetail = qualityDetail; - item.itag = itag; - - QualityList.insertLast(item.toDictionary()); } + if (urlExists) continue; + + if (isP2PCDN(url_info_url)) continue; + if (ConfigData.parseM3u8RealUrl) url_info_url = GetM3u8RealURL(url_info_url); + url = url_info_url; + + JsonValue video_color_info = codec["video_color_info"]; + int width = codec["media_info"]["width"].asInt(); + int height = codec["media_info"]["height"].asInt(); + int bitrateVal = parseInt(HostRegExpParse(url_info_url, "(?:[?&]origin_bitrate=)(\\d+)(?:&|$)")); + string bitrate = HostFormatBitrate(bitrateVal * 1000.0) + "bps"; + bool isHDR = (codec["hdr_type"].asInt() == 1); + string format = codec_name + ", " + bitrate; + string quality = getLiveQuality(g_qn_desc, codec["current_qn"].asInt(), codec["hdr_type"].asInt(), video_color_info); + string qualityDetail; + if (j == 0) qualityDetail = quality + " - 主 "; + if (j > 0) { + string backup = " - 备 "; + if (j > 1) { + backup += j - 1; + } + qualityDetail = quality + backup; + } + if (itag <= 0 || HostExistITag(itag)) itag = HostGetITag(height, 0, true, true); + while (HostExistITag(itag)) itag++; + HostSetITag(itag); + bool videoIsDefault = ( best_qn == codec["current_qn"].asInt() && i == codecs.size() - 1 && j == 0) ? true : false; + + QualityListItem item; + + item.url = url_info_url; + item.bitrateVal = bitrateVal; + item.bitrate = bitrate; + item.resolution = width + "x" + height; + item.isHDR = isHDR; + item.format = format; + item.quality = quality; + item.qualityDetail = qualityDetail; + item.itag = itag; + item.videoIsDefault = videoIsDefault; + + if (@QualityList !is null) QualityList.insertLast(item.toDictionary()); } } } @@ -2481,9 +2544,9 @@ array History() { JsonValue cursor = Root["data"]["cursor"]; - string max = cursor["max"].asString(); - int view_at = cursor["view_at"].asInt(); - string business = cursor["business"].asString(); + max = cursor["max"].asString(); + view_at = cursor["view_at"].asInt(); + business = cursor["business"].asString(); JsonValue data = Root["data"]["list"]; @@ -2652,7 +2715,7 @@ array spaceVideo(string path) { video["thumbnail"] = item["pic"].asString(); video["author"] = item["author"].asString(); video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString(); - if (!item["description"].asString().empty() || item["description"].asString() != "-") video["content"] = item["description"].asString(); + if (!item["description"].asString().empty() && item["description"].asString() != "-") video["content"] = item["description"].asString(); video["viewCount"] = item["play"].asString(); video["date"] = UnixTimeToDateTime(item["created"].asInt64()); videos.insertLast(video); @@ -2833,7 +2896,8 @@ array PopularWeekly(string path) { JsonValue Root; string num = parse(path, "num"); if (num.empty()) { - string res = apiPost("/x/web-interface/popular/series/list", false); + string params = "web_location=0.0"; + string res = apiPost("/x/web-interface/popular/series/list?" + encWbi(params), false); if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() != 0) { return videos; @@ -2844,7 +2908,8 @@ array PopularWeekly(string path) { } } } - string res = apiPost("/x/web-interface/popular/series/one?number=" + num, false); + string params = "number=" + num; + string res = apiPost("/x/web-interface/popular/series/one?" + encWbi(params), false); if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() != 0) { return videos; @@ -2871,7 +2936,8 @@ array PopularHistory() { array videos; JsonReader Reader; JsonValue Root; - string res = apiPost("/x/web-interface/popular/precious?page_size=100&page=1", false); + string params = "page_size=100&page=1"; + string res = apiPost("/x/web-interface/popular/precious?" + encWbi(params), false); if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() != 0) { return videos; @@ -3071,13 +3137,15 @@ array Search(string path) { string type = HostRegExpParse(path, "search.bilibili.com/([a-zA-Z0-9]+)"); string url; if (type == "all") { - url = "/x/web-interface/wbi/search/all/v2?keyword=" + kw; + string params = "keyword=" + kw; + url = "/x/web-interface/wbi/search/all/v2?" + encWbi(params); } else if (type == "video") { - url = "/x/web-interface/wbi/search/type?search_type=video&keyword=" + kw; + string params = "search_type=video&keyword=" + kw; + url = "/x/web-interface/wbi/search/type?" + encWbi(params); } else { return videos; } - string res = apiPost(url, false); + string res = apiPost(url); if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() != 0) { return videos; @@ -3116,20 +3184,16 @@ array Search(string path) { array webDynamic(string path) { array videos; + string offset; JsonReader Reader; JsonValue Root; string type = parse(path, "tab"); if (type != "video") { type = "all"; } - int nums = ConfigData.webDynamicPages; - string offset; - string baseurl = "/x/polymer/web-dynamic/v1/feed/all?timezone_offset=-480&type=" + type; - for (int i = 1; i <= nums; i++) { - string url = baseurl + "&page=" + i; - if (!offset.empty()) { - url += "&offset=" + offset; - } + + while(videos.size() < ConfigData.webDynamicVideoNums) { + string url = "/x/polymer/web-dynamic/v1/feed/all?timezone_offset=-480&type=" + type + "&offset=" + offset; string res = apiPost(url, false); if (Reader.parse(res, Root) && Root.isObject()) { if (Root["code"].asInt() != 0) { @@ -3180,9 +3244,6 @@ array webDynamic(string path) { } } } - if (!Root["data"]["has_more"].asBool()) { - break; - } } } } @@ -3266,7 +3327,8 @@ array Recommend() { int page = 1; while (videos.size() < ConfigData.recommendVideoNums) { - string url = "/x/web-interface/wbi/index/top/feed/rcmd?web_location=1430650&y_num=3&fresh_type=4&feed_version=V8&fresh_idx_1h=" + page + "&fetch_row=" + (3 * page + 1) + "&fresh_idx=" + page + "&brush=" + page + "&device=win&homepage_ver=1&ps=" + ps + "&last_y_num=5"; + string params = "web_location=1430650&y_num=3&fresh_type=4&feed_version=V8&fresh_idx_1h=" + page + "&fetch_row=" + (3 * page + 1) + "&fresh_idx=" + page + "&brush=" + page + "&device=win&homepage_ver=1&ps=" + ps + "&last_y_num=5"; + string url = "/x/web-interface/wbi/index/top/feed/rcmd?" + encWbi(params); string res = apiPost(url, false); @@ -3469,6 +3531,12 @@ array PlaylistParse(const string&in url) { if (path.find("lol") >= 0) { return liveCategory(path, 1, "86", "2", 0); } + if (path.find("pubg") >= 0) { + return liveCategory(path, 1, "80", "2", 0); + } + if (path.find("cf") >= 0) { + return liveCategory(path, 1, "88", "2", 0); + } if (path.find("hpjy") >= 0) { return liveCategory(path, 1, "256", "3", 0); } From 7624d8cd9feab35e88a2d6e4cb083cac422d411d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Thu, 10 Sep 2026 13:24:53 +0800 Subject: [PATCH 123/132] =?UTF-8?q?=E5=A4=9A=E9=A1=B9=E9=9A=90=E5=BD=A2BUG?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 161 ++++++++++++------- 1 file changed, 103 insertions(+), 58 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 7710b6a..23c8e2e 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -272,6 +272,7 @@ class Config { string sponsorBlockMirror; bool parseM3u8RealUrl = false; string bilibiliDanmujiServer; + int maxliveroom = 100; int webDynamicVideoNums = 50; int recommendVideoNums = 30; int historyVideoNums = 30; @@ -284,8 +285,6 @@ class Config { string danmakuUrl; string subtitleUrl; bool usingDanmuji = false; - - int maxliveroom = 100; } Config ReadConfigFile(string file) { @@ -524,14 +523,18 @@ string post(string url, string data = "", string headers = "", bool debug = true } string apiPost(string api, bool useCache = true) { - return apiPost(api, "", Host, useCache); + return apiPost(api, "", Host, "", useCache); } string apiPost(string api, string data, bool useCache = true) { - return apiPost(api, data, Host, useCache); + return apiPost(api, data, Host, "", useCache); } string apiPost(string api, string data, string host, bool useCache = true) { + return apiPost(api, data, host, "", useCache); +} + +string apiPost(string api, string data, string host, string headers, bool useCache = true) { ResponseCacheItem item; string key; @@ -554,9 +557,9 @@ string apiPost(string api, string data, string host, bool useCache = true) { } } - string resp = post(host + api, data); + string resp = post(host + api, data, headers); if (resp.empty()) { - HostMessageBox("未获取到响应数据,请等待一段时间后重试一下\nurl: " + host + api, "请求失败"); + HostMessageBox("未获取到响应数据,请等待一段时间后重试一下\n\nurl: " + host + api, "请求失败"); return ""; } @@ -567,8 +570,8 @@ string apiPost(string api, string data, string host, bool useCache = true) { return ""; } if (Root["code"].asInt() != 0) { - log("error code: " + Root["code"].asInt() + "\n" + "error message: " + Root["message"].asString() + "\n" + "url:" + Host + api); - HostMessageBox("error code: " + Root["code"].asInt() + "\n" + "error message: " + Root["message"].asString() + "\n" + "url:" + Host + api, Root["message"].asString()); + log("error code: " + Root["code"].asInt() + ", " + "error message: " + Root["message"].asString() + ", " + "url:" + Host + api); + HostMessageBox("error code: " + Root["code"].asInt() + "\n" + "error message: " + Root["message"].asString() + "\n\n" + "url:" + Host + api, Root["message"].asString()); return ""; } if (useCache) { @@ -758,7 +761,6 @@ string getCodec(int codecid) { } string GetM3u8RealURL(string url) { - status = 7; uint tickCount = HostGetTickCount(); string resp = post(url, "", "", false); HostIncTimeOut(HostGetTickCount() - tickCount); @@ -778,18 +780,19 @@ string GetM3u8RealURL(string url) { } } } - - status = 5; return url; } bool isPlaylist(const string&in path) { string bvid = parseBVId(path); string aid = parseAVId(path); - string params; - if (!bvid.empty()) params += "bvid=" + bvid; - if (!aid.empty()) params += "aid=" + aid; - if (bvid.empty() && aid.empty()) return false; + + array queryParts; + if (!bvid.empty()) queryParts.insertLast("bvid=" + bvid); + if (!aid.empty()) queryParts.insertLast("aid=" + aid); + + string params = join(queryParts, "&"); + if (params.empty()) return false; string res = apiPost("/x/web-interface/wbi/view/detail?" + encWbi(params)); @@ -960,6 +963,7 @@ void AppendVideoQualityList(string bvid, string aid, string cid, string& url, ar int qn = 127; string params; string res; + string referer; JsonReader reader; JsonValue root; @@ -997,6 +1001,7 @@ void AppendVideoQualityList(string bvid, string aid, string cid, string& url, ar } while (HostExistITag(itag)) itag++; HostSetITag(itag); + referer = "https://www.bilibili.com/video/" + bvid; QualityListItem item; @@ -1012,7 +1017,7 @@ void AppendVideoQualityList(string bvid, string aid, string cid, string& url, ar item.itag = itag; item.audioIsDefault = false; item.va = "v"; - item.referer = "https://www.bilibili.com/video/" + bvid; + item.referer = referer; if (i == videos.size() - 1) item.videoIsDefault = true; if (@QualityList !is null) QualityList.insertLast(item.toDictionary()); @@ -1024,19 +1029,19 @@ void AppendVideoQualityList(string bvid, string aid, string cid, string& url, ar audios = data["dash"]["audio"]; for (int i = 0; i < audios.size(); i++) { audio = audios[i]; - AppendAudioQualityList(audio, bvid, QualityList); + AppendAudioQualityList(audio, referer, QualityList); } } if (data["dash"]["dolby"]["audio"].isArray()) { audios = data["dash"]["dolby"]["audio"]; for (int i = 0; i < audios.size(); i++) { audio = audios[i]; - AppendAudioQualityList(audio, bvid, QualityList); + AppendAudioQualityList(audio, referer, QualityList); } } if (data["dash"]["flac"].isObject()) { audio = data["dash"]["flac"]["audio"]; - AppendAudioQualityList(audio, bvid, QualityList); + AppendAudioQualityList(audio, referer, QualityList); } } else if (data["durl"].isArray()) { log('/x/player/wbi/playurl has data["durl"]!!!'); @@ -1054,7 +1059,7 @@ void AppendVideoQualityList(string bvid, string aid, string cid, string& url, ar log("url", url); } -void AppendAudioQualityList(JsonValue audio, string bvid, array& QualityList) { +void AppendAudioQualityList(JsonValue audio, string referer, array& QualityList) { QualityListItem item; int itag = 0; @@ -1098,7 +1103,7 @@ void AppendAudioQualityList(JsonValue audio, string bvid, array& Qua item.itag = itag; item.audioIsDefault = audioIsDefault; item.va = "a"; - item.referer = "https://www.bilibili.com/video/" + bvid; + item.referer = referer; if (@QualityList !is null) QualityList.insertLast(item.toDictionary()); } @@ -1631,7 +1636,6 @@ string getChatUrl(const string room_id, string server) { unixTime = formatInt(DatetimeToUnixTime(FormatDateTime(datetime()))); string res = post(server + "/connectRoom?roomid=" + room_id + "&_=" + unixTime); - ConfigData.usingDanmuji = true; HostIncTimeOut(HostGetTickCount() - tickCount); @@ -1647,8 +1651,8 @@ string getChatUrl(const string room_id, string server) { } string host = HostRegExpParse(server, "^https?://([^/]+)"); - - chatUrl = host + "/danmu_widget?sub=ws://" + host + "/danmu/sub"; + chatUrl = server + "/danmu_widget?sub=ws://" + host + "/danmu/sub"; + ConfigData.usingDanmuji = true; return chatUrl; } @@ -1687,7 +1691,7 @@ array BangumiEpisodes(string id, string type) { for (int j = 0; j < episodes.size(); j++) { JsonValue episode = episodes[j]; - if (episode["badge_type"].asInt() == 1) return videos; + if (episode["badge_type"].asInt() == 1) continue; dictionary video; video["title"] = episode["show_title"].asString(); @@ -1718,10 +1722,13 @@ array UGCSeason(const string&in path) { string aid = parseAVId(path); string cid; string p = parse(path, "p", "1"); - string params; - if (!bvid.empty()) params += "bvid=" + bvid; - if (!aid.empty()) params += "aid=" + aid; - if (bvid.empty() && aid.empty()) return videos; + + array queryParts; + if (!bvid.empty()) queryParts.insertLast("bvid=" + bvid); + if (!aid.empty()) queryParts.insertLast("aid=" + aid); + + string params = join(queryParts, "&"); + if (params.empty()) return videos; string res = apiPost("/x/web-interface/wbi/view/detail?" + encWbi(params)); @@ -1800,10 +1807,13 @@ array RelatedVideos(const string&in path) { string bvid = parseBVId(path); string aid = parseAVId(path); - string params; - if (!bvid.empty()) params += "bvid=" + bvid; - if (!aid.empty()) params += "aid=" + aid; - if (bvid.empty() && aid.empty()) return videos; + + array queryParts; + if (!bvid.empty()) queryParts.insertLast("bvid=" + bvid); + if (!aid.empty()) queryParts.insertLast("aid=" + aid); + + string params = join(queryParts, "&"); + if (params.empty()) return videos; string res = apiPost("/x/web-interface/wbi/view/detail?" + encWbi(params)); @@ -1823,7 +1833,7 @@ array RelatedVideos(const string&in path) { video["duration"] = view["duration"].asInt() * 1000; video["thumbnail"] = view["pic"].asString(); video["author"] = view["owner"]["name"].asString(); - video["url"] = "https://www.bilibili.com/video/" + bvid; + video["url"] = "https://www.bilibili.com/video/" + view["bvid"].asString(); if (!view["desc"].asString().empty() && view["desc"].asString() != "-") video["content"] = view["desc"].asString(); video["viewCount"] = view["stat"]["view"].asString(); video["likeCount"] = view["stat"]["like"].asString(); @@ -2109,6 +2119,7 @@ string Bangumi(const string&in path, dictionary& MetaData, array& Qu } AppendVideoQualityList(bvid, aid, cid, url, QualityList); + // AppendBangumiQualityList(epid, url, QualityList); return url; } @@ -2126,17 +2137,20 @@ string Video(string id, const string&in path, dictionary& MetaData, array subtitle; array chapter; - + array queryParts; + if (id.find("BV") == 0) { bvid = id; - params += "bvid=" + id; + queryParts.insertLast("bvid=" + id); } string parsedAid = parseAVId(path); if (!parsedAid.empty()) { aid = parsedAid; - params += "aid=" + parsedAid; + queryParts.insertLast("aid=" + parsedAid); } + params = join(queryParts, "&"); + res = apiPost("/x/web-interface/wbi/view/detail?" + encWbi(params)); if (!reader.parse(res, Root) || !Root.isObject()) return url; JsonValue view = Root["data"]["View"]; @@ -2228,8 +2242,8 @@ string Live(string id, const string&in path, dictionary& MetaData, array followingLive(uint page) { JsonReader Reader; JsonValue Root; - string url = "/xlive/web-ucenter/v1/xfetter/GetWebList"; - string res = apiPost(url, "", "https://api.live.bilibili.com", false); - Reader.parse(res, Root); + while (true) { + string url = "/xlive/web-ucenter/user/following?page=" + page; + string res = apiPost(url, "", "https://api.live.bilibili.com", false); - JsonValue rooms = Root["data"]["rooms"]; - if (rooms.isArray()) { - if (rooms.size() != 0) { - for (int i = 0; i < rooms.size(); i++) { - JsonValue room = rooms[i]; - dictionary video; - video["title"] = room["title"].asString(); - video["url"] = room["link"].asString(); - video["thumbnail"] = room["face"].asString(); - video["author"] = room["uname"].asString(); - videos.insertLast(video); + if (!Reader.parse(res, Root) || !Root.isObject() || Root["code"].asInt() != 0) + break; + + JsonValue data = Root["data"]; + JsonValue list = data["list"]; + + if (!list.isArray()) + break; + + bool hasOffline = false; + + for (int i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + + // 接口优先返回正在开播的用户,后面均为未开播 + if (item["live_status"].asInt() == 0) { + hasOffline = true; + break; } + + dictionary video; + video["title"] = item["title"].asString(); + video["url"] = "https://live.bilibili.com/" + item["roomid"].asString(); + video["thumbnail"] = item["face"].asString(); + video["author"] = item["uname"].asString(); + + videos.insertLast(video); } + + // 当前页已经出现未开播用户,后续页面无需请求 + if (hasOffline) + break; + + uint totalPage = data["totalPage"].asUInt(); + + if (page >= totalPage) + break; + + page++; } if (videos.size() == 0) { - HostMessageBox("你 [关注的直播] 列表是空的,刷点别的视频吧。", "[关注的直播] 为空", 2,0); + HostMessageBox("[我关注的直播] 列表是空的,刷点别的视频吧。", "[关注的直播] 为空", 2, 0); } return videos; @@ -3201,7 +3243,6 @@ array webDynamic(string path) { } JsonValue list = Root["data"]["items"]; if (list.isArray()) { - offset = Root["data"]["offset"].asString(); for (int j = 0; j < list.size(); j++) { JsonValue dynamic = list[j]["modules"]["module_dynamic"]; if (dynamic.isObject()) { @@ -3246,6 +3287,9 @@ array webDynamic(string path) { } } } + + if (offset == Root["data"]["offset"].asString()) break; + offset = Root["data"]["offset"].asString(); } return videos; } @@ -3323,10 +3367,11 @@ array spaceDynamic(string path) { array Recommend() { array videos; + int maxPage = 10; int ps = 30; int page = 1; - while (videos.size() < ConfigData.recommendVideoNums) { + while (videos.size() < ConfigData.recommendVideoNums && page <= maxPage) { string params = "web_location=1430650&y_num=3&fresh_type=4&feed_version=V8&fresh_idx_1h=" + page + "&fetch_row=" + (3 * page + 1) + "&fresh_idx=" + page + "&brush=" + page + "&device=win&homepage_ver=1&ps=" + ps + "&last_y_num=5"; string url = "/x/web-interface/wbi/index/top/feed/rcmd?" + encWbi(params); From e6b6ee17386a46ea683ca978e01ef32078318e78 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Thu, 10 Sep 2026 13:25:53 +0800 Subject: [PATCH 124/132] change version --- Media/PlayParse/MediaPlayParse - Bilibili.as | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 23c8e2e..31d4db1 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -92,7 +92,7 @@ string GetTitle() { } string GetVersion() { - return "2.6.16"; + return "2.6.17"; } string GetDesc() { From e7d86b0bf841dd8b41d360ff2a461a1a1fbb4872 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Thu, 10 Sep 2026 23:18:19 +0800 Subject: [PATCH 125/132] =?UTF-8?q?-=20=E5=A2=9E=E5=8A=A0=E7=95=AA?= =?UTF-8?q?=E5=89=A7=E9=A2=84=E5=91=8A=E5=BC=80=E5=85=B3=20-=20=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6=E6=96=B0=E5=A2=9E=20live=20?= =?UTF-8?q?=E9=A1=B9=EF=BC=8C=E7=9B=B4=E6=92=AD=E7=9B=B8=E5=85=B3=E9=83=BD?= =?UTF-8?q?=E7=A7=BB=E5=88=B0=E8=BF=99=E9=87=8C=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=20=E7=9B=B4=E6=92=AD=E7=BC=A9=E7=95=A5=E5=9B=BE=E5=85=B3?= =?UTF-8?q?=E9=94=AE=E5=B8=A7=E6=88=AA=E5=9B=BE=E5=BC=80=E5=85=B3=E3=80=82?= =?UTF-8?q?=20-=20=E8=A7=A3=E5=86=B3=E4=B9=8B=E5=89=8D=E7=89=B9=E6=AE=8APG?= =?UTF-8?q?C=E5=86=85=E5=AE=B9=E4=B8=8D=E8=83=BD=E6=92=AD=E6=94=BE?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=E3=80=82=20-=20=E7=9B=B4=E6=92=AD?= =?UTF-8?q?=E6=A0=87=E9=A2=98=20=E5=A2=9E=E5=8A=A0=E8=AF=A6=E7=BB=86?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=20-=20=E7=9B=B4=E6=92=AD=E6=AD=A3=E7=A1=AE?= =?UTF-8?q?=E5=A4=84=E7=90=86=E6=9C=AA=E5=BC=80=E6=92=AD=E6=83=85=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 361 ++++++++++++++----- 1 file changed, 274 insertions(+), 87 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 31d4db1..d5f47d5 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -266,18 +266,23 @@ class Config { float danmakuDisplayArea = 0.8; float danmakuStayTime = 15.0; bool showRecommendedVideos = true; + bool showTrailer = true; + bool blockP2PCDN = true; int cacheValidTime = 300; bool enableSponsorBlock = false; string sponsorBlockMirror; - bool parseM3u8RealUrl = false; - string bilibiliDanmujiServer; - int maxliveroom = 100; + int webDynamicVideoNums = 50; int recommendVideoNums = 30; int historyVideoNums = 30; int popularAllPages = 1; int spaceDynamicVideoNums = 30; + + bool parseM3u8RealUrl = false; + string bilibiliDanmujiServer; + int maxliveroom = 20; + bool useSystemCover = false; bool disableAVC = false; bool preferHDR = false; bool debug = false; @@ -294,9 +299,6 @@ Config ReadConfigFile(string file) { JsonReader reader; JsonValue root; if (reader.parse(config.fullConfig, root) && root.isObject()) { - if (root["maxliveroom"].isNumeric()) { - config.maxliveroom = root["maxliveroom"].asInt(); - } if (root["danmaku"].isObject()) { JsonValue danmaku = root["danmaku"]; if (danmaku["enable"].isBool()) { @@ -324,6 +326,9 @@ Config ReadConfigFile(string file) { if (root["showRecommendedVideos"].isBool()) { config.showRecommendedVideos = root["showRecommendedVideos"].asBool(); } + if (root["showTrailer"].isBool()) { + config.showTrailer = root["showTrailer"].asBool(); + } if (root["blockP2PCDN"].isBool()) { config.blockP2PCDN = root["blockP2PCDN"].asBool(); } @@ -336,12 +341,6 @@ Config ReadConfigFile(string file) { if (root["sponsorBlockMirror"].isString()) { config.sponsorBlockMirror = root["sponsorBlockMirror"].asString(); } - if (root["parseM3u8RealUrl"].isBool()) { - config.parseM3u8RealUrl = root["parseM3u8RealUrl"].asBool(); - } - if (root["bilibiliDanmujiServer"].isString()) { - config.bilibiliDanmujiServer = root["bilibiliDanmujiServer"].asString(); - } if (root["videoNums"].isObject()) { JsonValue videoNums = root["videoNums"]; if (videoNums["webDynamicVideoNums"].isNumeric()) { @@ -360,6 +359,21 @@ Config ReadConfigFile(string file) { config.spaceDynamicVideoNums = videoNums["spaceDynamicVideoNums"].asInt(); } } + if (root["live"].isObject()) { + JsonValue live = root["live"]; + if (live["parseM3u8RealUrl"].isBool()) { + config.parseM3u8RealUrl = live["parseM3u8RealUrl"].asBool(); + } + if (live["bilibiliDanmujiServer"].isString()) { + config.bilibiliDanmujiServer = live["bilibiliDanmujiServer"].asString(); + } + if (live["maxliveroom"].isNumeric()) { + config.maxliveroom = live["maxliveroom"].asInt(); + } + if (live["useSystemCover"].isBool()) { + config.useSystemCover = live["useSystemCover"].asBool(); + } + } if (root["disableAVC"].isBool()) { config.disableAVC = root["disableAVC"].asBool(); } @@ -369,11 +383,22 @@ Config ReadConfigFile(string file) { if (root["debug"].isBool()) { config.debug = root["debug"].asBool(); } + + // 兼容性配置 + if (root["parseM3u8RealUrl"].isBool()) { + config.parseM3u8RealUrl = root["parseM3u8RealUrl"].asBool(); + } + if (root["bilibiliDanmujiServer"].isString()) { + config.bilibiliDanmujiServer = root["bilibiliDanmujiServer"].asString(); + } + if (root["maxliveroom"].isNumeric()) { + config.maxliveroom = root["maxliveroom"].asInt(); + } + if (!config.danmakuServer.empty()) { config.danmakuUrl = config.danmakuServer + "/subtitle?font=" + HostUrlEncode(config.danmakuFont) + "&font_size=" + config.danmakuFontSize + "&alpha=" + config.danmakuOpacity + "&display_area=" + config.danmakuDisplayArea + "&duration_marquee=" + config.danmakuStayTime + "&duration_still=" + config.danmakuStayTime + "&cid="; config.subtitleUrl = config.danmakuServer + "/subtitle?url="; } - } else { HostMessageBox("配置文件存在问题", "[BilibiliPotplayer] 配置文件错误", 0, 1); } @@ -761,6 +786,7 @@ string getCodec(int codecid) { } string GetM3u8RealURL(string url) { + status = 7; uint tickCount = HostGetTickCount(); string resp = post(url, "", "", false); HostIncTimeOut(HostGetTickCount() - tickCount); @@ -775,11 +801,13 @@ string GetM3u8RealURL(string url) { string m3u8 = lines[i + 1].Trim(); if (m3u8.find("http://") == 0 || m3u8.find("https://") == 0) { + status = 5; return m3u8; } } } } + status = 5; return url; } @@ -851,7 +879,7 @@ bool isP2PCDN(const string&in url) { } string getFixedURL(JsonValue&in data) { - string base_url = ( data["base_url"].isString() ) ? data["base_url"].asString() : data["baseUrl"].asString(); + string base_url = data["url"].isString() ? data["url"].asString() : (data["base_url"].isString() ? data["base_url"].asString() : data["baseUrl"].asString()); if (!ConfigData.blockP2PCDN) { return base_url; @@ -957,6 +985,144 @@ string getVideoQuality(JsonValue support_formats, int quality) { return "未知"; } +void AppendBangumiQualityList(const string epid, const string path, string& url, array& QualityList) { + status = 5; + + string res; + string referer; + JsonReader Reader; + JsonValue Root; + + string html = post(path); + string prefix = "const playurlSSRData ="; + array lines = html.split("\n"); + + for (uint i = 0; i < lines.length(); i++) { + string line = lines[i].Trim(); + if (line.find(prefix) == 0) { + res = line.substr(prefix.length()).Trim(); + break; + } + } + + if (res.empty()) return; + if (!Reader.parse(res, Root) || !Root.isObject()) return; + if (!Root["data"].isObject()) return; + if (!Root["data"]["result"].isObject()) return; + + string play_video_type = Root["data"]["result"]["play_video_type"].asString(); + if (play_video_type != "whole") { + if (play_video_type == "preview") { + HostMessageBox("应版权方要求,本片需购买,当前为试看片段", "试看片段", 0, 0); + } + } + + if (!Root["data"]["result"]["video_info"].isObject()) return; + + JsonValue support_formats = Root["data"]["result"]["video_info"]["support_formats"]; + JsonValue dash = Root["data"]["result"]["video_info"]["dash"]; + + + if (dash.isObject()) { + JsonValue videos = dash["video"]; + if (!videos.isArray()) return; + videos = SortVideos(videos); + + int itag = 0; + for (int i = 0; i < videos.size(); i++) { + JsonValue video = videos[i]; + + int qn = video["id"].asInt(); + int codecid = video["codecid"].asInt(); + + url = getFixedURL(video); + string width = formatInt(video["width"].asInt()); + string height = formatInt(video["height"].asInt()); + int bitrateVal = video["bandwidth"].asInt(); + string bitrate = HostFormatBitrate(bitrateVal) + "bps"; + int fps = parseInt(video["frame_rate"].asString()); + bool isHDR = (qn == 125 || qn == 126 || qn == 129); + string mime_type = video["mime_type"].asString().MakeLower(); + string format = mime_type.substr(mime_type.findLast("/") + 1) + ", " + getCodec(codecid) + ", " + bitrate; + string quality = getVideoQuality(support_formats, qn); + itag = getVideoItag(qn, codecid); + if (itag <= 0 || HostExistITag(itag)) { + itag = HostGetITag(video["height"].asInt(), 0, true, false); + if (itag <= 0) itag = HostGetITag(video["height"].asInt(), 0, true, true); + } + while (HostExistITag(itag)) itag++; + HostSetITag(itag); + referer = path; + + QualityListItem item; + + item.url = url; + item.bitrateVal = bitrateVal; + item.bitrate = bitrate; + item.resolution = width + "x" + height; + item.fps = fps; + item.isHDR = isHDR; + item.format = format; + item.quality = quality; + item.qualityDetail = quality; + item.itag = itag; + item.audioIsDefault = false; + item.va = "v"; + item.referer = referer; + if (i == videos.size() - 1) item.videoIsDefault = true; + + if (@QualityList !is null) QualityList.insertLast(item.toDictionary()); + } + + JsonValue audios; + JsonValue audio; + if (dash["audio"].isArray()) { + audios = dash["audio"]; + for (int i = 0; i < audios.size(); i++) { + audio = audios[i]; + AppendAudioQualityList(audio, referer, QualityList); + } + } + if (dash["dolby"]["audio"].isArray()) { + audios = dash["dolby"]["audio"]; + for (int i = 0; i < audios.size(); i++) { + audio = audios[i]; + AppendAudioQualityList(audio, referer, QualityList); + } + } + if (dash["flac"].isObject()) { + audio = dash["flac"]["audio"]; + AppendAudioQualityList(audio, referer, QualityList); + } + + } else if (Root["data"]["result"]["video_info"]["durls"].isArray()) { + JsonValue durls = Root["data"]["result"]["video_info"]["durls"]; + int itag; + for (uint i = 0; i < durls.size(); i++) { + JsonValue durl = durls[i]; + int qn = durl["quality"].asInt(); + + url = getFixedURL(durl["durl"][0]); + string quality = getVideoQuality(support_formats, qn); + int itag = getUniItag(); + referer = path; + + QualityListItem item; + + item.url = url; + item.quality = quality; + item.qualityDetail = quality; + item.itag = itag; + item.va = "v"; + item.referer = referer; + + if (@QualityList !is null) QualityList.insertLast(item.toDictionary()); + } + } + + log("url", url); +} + void AppendVideoQualityList(string bvid, string aid, string cid, string& url, array& QualityList) { status = 5; @@ -1053,9 +1219,6 @@ void AppendVideoQualityList(string bvid, string aid, string cid, string& url, ar } } - // for (uint i = 0; i < QualityList.length(); i++) { - // log("QualityList[" + i + "] = " + string(QualityList[i]["quality"]) + " | " + int(QualityList[i]["itag"]) + " | " + string(QualityList[i]["url"])); - // } log("url", url); } @@ -1691,10 +1854,10 @@ array BangumiEpisodes(string id, string type) { for (int j = 0; j < episodes.size(); j++) { JsonValue episode = episodes[j]; - if (episode["badge_type"].asInt() == 1) continue; + if (!ConfigData.showTrailer && episode["badge_type"].asInt() == 1) continue; dictionary video; - video["title"] = episode["show_title"].asString(); + video["title"] = episode["share_copy"].asString() + "\n" + episode["show_title"].asString(); video["duration"] = episode["duration"].asString(); video["thumbnail"] = episode["cover"].asString(); if (!author.isEmpty()) video["author"] = author; @@ -1827,7 +1990,7 @@ array RelatedVideos(const string&in path) { } JsonValue view = Root["data"]["View"]; - + dictionary video; video["title"] = view["title"].asString(); video["duration"] = view["duration"].asInt() * 1000; @@ -2043,12 +2206,7 @@ string Bangumi(const string&in path, dictionary& MetaData, array& Qu cid = episode["cid"].asString(); if (@MetaData !is null) { - string title; - if (!ssid.isEmpty()) { - title = episode["share_copy"].asString(); - } else { - title = episode["show_title"].asString(); - } + string title = episode["share_copy"].asString() + "\n" + episode["show_title"].asString(); MetaData["title"] = title; MetaData["vid"] = bvid; @@ -2118,8 +2276,7 @@ string Bangumi(const string&in path, dictionary& MetaData, array& Qu } } - AppendVideoQualityList(bvid, aid, cid, url, QualityList); - // AppendBangumiQualityList(epid, url, QualityList); + AppendBangumiQualityList(epid, path, url, QualityList); return url; } @@ -2229,24 +2386,36 @@ string Live(string id, const string&in path, dictionary& MetaData, array accept_qns; @@ -2415,9 +2584,7 @@ string Live(string id, const string&in path, dictionary& MetaData, array spaceAudio(string path) { return audios; } -array followingLive(uint page) { +array followingLive() { array videos; JsonReader Reader; JsonValue Root; - + int page = 1; + while (true) { - string url = "/xlive/web-ucenter/user/following?page=" + page; + string url = "/xlive/web-ucenter/user/following?page=" + page + "&page_size=10"; string res = apiPost(url, "", "https://api.live.bilibili.com", false); if (!Reader.parse(res, Root) || !Root.isObject() || Root["code"].asInt() != 0) @@ -2849,49 +3013,85 @@ array followingLive(uint page) { return videos; } -array liveCategory(string path, uint page, string cateid, string parentAreaId, uint liveRoomCount) { +array liveCategory(string path) { JsonReader Reader; JsonValue Root; string renderData = HostRegExpParse(post(path), "window\\._render_data_\\s*=\\s*(\\{\"access_id\":\"[^\"]+\"\\})"); if (!Reader.parse(renderData, Root) || !Root.isObject()) return array(); + string w_webid = Root["access_id"].asString(); - return liveCategory(page, cateid, parentAreaId, liveRoomCount, Root["access_id"].asString()); + int parentAreaId = parseInt(HostRegExpParse(path, "parentAreaId=([0-9]+)")); + int areaId = parseInt(HostRegExpParse(path, "areaId=([0-9]+)")); + + if (path.find("lol") >= 0) { + return liveCategory(86, 2, w_webid); + } + if (path.find("pubg") >= 0) { + return liveCategory(80, 2, w_webid); + } + if (path.find("cf") >= 0) { + return liveCategory(88, 2, w_webid); + } + if (path.find("hpjy") >= 0) { + return liveCategory(256, 3, w_webid); + } + + return liveCategory(areaId, parentAreaId, w_webid); } -array liveCategory(uint page, string cateid, string parentAreaId, uint liveRoomCount, string w_webid) { +array liveCategory(int cateid, int parentAreaId, string w_webid) { array videos; JsonReader Reader; JsonValue Root; - string params = "platform=web&parent_area_id=" + parentAreaId + "&area_id=" + cateid + "&page=" + page + "&w_webid=" + w_webid; - string url = "https://api.live.bilibili.com/xlive/web-interface/v1/second/getList?" + encWbi(params); - string res = post(url); - if (Reader.parse(res, Root) && Root.isObject()) { - if (Root["code"].asInt() == 0) { - JsonValue list = Root["data"]["list"]; - if (list.isArray()) { - for (int i = 0; i < list.size(); i++) { - JsonValue item = list[i]; - dictionary video; - video["title"] = item["title"].asString(); - video["url"] = "https://live.bilibili.com/" + item["roomid"].asInt(); - video["thumbnail"] = item["face"].asString(); - video["author"] = item["uname"].asString(); - videos.insertLast(video); - liveRoomCount += 1; - if (liveRoomCount >= ConfigData.maxliveroom) { - return videos; - } - } - if (Root["data"]["has_more"].asBool()) { - array nextVideos = liveCategory(page + 1, cateid, parentAreaId, liveRoomCount, w_webid); - for (uint i = 0; i < nextVideos.size(); i++) { - videos.insertLast(nextVideos[i]); - } + int page = 1; + + while (videos.size() < ConfigData.maxliveroom) { + string params = "platform=web&parent_area_id=" + parentAreaId + "&area_id=" + cateid + "&page=" + page + "&w_webid=" + w_webid; + string url = "https://api.live.bilibili.com/xlive/web-interface/v1/second/getList?" + encWbi(params); + string res = post(url); + if (!Reader.parse(res, Root) || !Root.isObject()) return videos; + if (Root["code"].asInt() != 0) return videos; + + JsonValue list = Root["data"]["list"]; + if (!list.isArray()) return videos; + + for (int i = 0; i < list.size(); i++) { + JsonValue item = list[i]; + string title; + string area_title; + string pendant_title; + + area_title = item["parent_name"].asString().isEmpty() ? item["area_name"].asString() : item["area_name"].asString().isEmpty() ? item["parent_name"].asString() : item["parent_name"].asString() + " (" + item["area_name"].asString() + ")"; + + if (item["pendant_info"].isObject()) { + array pendant_infos; + array keys = item["pendant_info"].getKeys(); + + for (int j = 0; j < keys.size(); j++) { + pendant_infos.insertLast(item["pendant_info"][keys[j]]["content"].asString().isEmpty() ? item["pendant_info"][keys[j]]["name"].asString() : item["pendant_info"][keys[j]]["content"].asString()); } + + pendant_title = join(pendant_infos, " | "); } + + array titles; + if (!area_title.isEmpty()) titles.insertLast(area_title); + titles.insertLast(item["title"].asString()); + if (!pendant_title.isEmpty())titles.insertLast(pendant_title); + + dictionary video; + video["title"] = join(titles, "\n\n"); + video["url"] = "https://live.bilibili.com/" + item["roomid"].asInt(); + video["thumbnail"] = ConfigData.useSystemCover ? item["system_cover"].asString() : item["cover"].asString() ; + video["author"] = item["uname"].asString(); + videos.insertLast(video); + } + + if (Root["data"]["has_more"].asInt() != 1) return videos; } + return videos; } @@ -3441,12 +3641,12 @@ bool PlayitemCheck(const string&in path) { return true; } - log("PlayitemCheck", "false"); + // log("PlayitemCheck", "false"); return false; } bool PlaylistCheck(const string&in path) { - log("PlaylistCheck - path", path); + // log("PlaylistCheck - path", path); status = 2; if (path.find("bilibili.com") < 0) { return false; @@ -3531,7 +3731,7 @@ bool PlaylistCheck(const string&in path) { return true; } - log("PlaylistCheck", "false"); + // log("PlaylistCheck", "false"); return false; } @@ -3546,7 +3746,6 @@ array PlaylistParse(const string&in url) { return webDynamic(path); } if (path.find("search.bilibili.com") >= 0) { - log('path.find("search.bilibili.com") >= 0'); return Search(path); } if (path.find("space.bilibili.com") >= 0) { @@ -3567,23 +3766,11 @@ array PlaylistParse(const string&in url) { } } if (path.find("link.bilibili.com") >= 0 && path.find("/user-center/follow") >= 0) { - return followingLive(1); + return followingLive(); } if (path.find("live.bilibili.com") >= 0) { if (path.find("areaId") >= 0) { - return liveCategory(path, 1, HostRegExpParse(path, "areaId=([0-9]+)"), HostRegExpParse(path, "parentAreaId=([0-9]+)"), 0); - } - if (path.find("lol") >= 0) { - return liveCategory(path, 1, "86", "2", 0); - } - if (path.find("pubg") >= 0) { - return liveCategory(path, 1, "80", "2", 0); - } - if (path.find("cf") >= 0) { - return liveCategory(path, 1, "88", "2", 0); - } - if (path.find("hpjy") >= 0) { - return liveCategory(path, 1, "256", "3", 0); + return liveCategory(path); } } From 036b28638cf7f595d9413de6515e552753422b0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Thu, 10 Sep 2026 23:19:01 +0800 Subject: [PATCH 126/132] change version --- Media/PlayParse/MediaPlayParse - Bilibili.as | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index d5f47d5..a5be1e9 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -92,7 +92,7 @@ string GetTitle() { } string GetVersion() { - return "2.6.17"; + return "2.6.18"; } string GetDesc() { From 9826a740352b2e10e39e72f6c4b944be5027d384 Mon Sep 17 00:00:00 2001 From: frostnotfall <38377709+frostnotfall@users.noreply.github.com> Date: Fri, 11 Sep 2026 12:33:36 +0800 Subject: [PATCH 127/132] Revise README with new features and bug fixes Updated features and fixed issues related to live streaming, video playback, and user interface enhancements. --- README.md | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 30dda7a..c3b2803 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,7 @@ - 清理无用代码,较为激进,有问题请提issue。 - 换用新的 itag 选择机制。 - 支持屏蔽 P2PCDN,可通过配置文件调整,默认屏蔽。 +- 优化风控策略。 ### 📺 直播 @@ -36,22 +37,17 @@ - 支持直播备用地址。 - 动态生成直播画质选项。 - 增加 解析真实 M3U8 开关。规避画质选项 potplayer 自动覆盖成 HLS 的问题。详见配置项注释。 -- 支持 [Bilibili_Danmuji](https://github.com/BanqiJane/Bilibili_Danmuji),增加 potplayer 收发弹幕功能。需自建 Bilibili_Danmuji 服务,详见配置项注释。 +- 支持收发弹幕(依赖自建 [Bilibili_Danmuji](https://github.com/BanqiJane/Bilibili_Danmuji) 服务, [Bilibili_Danmuji接入教程](https://github.com/frostnotfall/BilibiliPotPlayer/wiki/%E8%BF%9B%E9%98%B6%E6%95%99%E7%A8%8B#%E6%8E%A5%E5%85%A5-bilibili_danmuji-%E6%9C%8D%E5%8A%A1))。 +- 遇到未开播的情况,弹出对话框提醒。 ### ▶️ 点播 -- 修复部分 Host 为 `upos` 的点播 URL 播放失败的问题 -- Bilibili 点播更换新接口,尽量使用wbi签名认证防止接口失效 - 重新支持用户合集视频,并支持多合集,potplayer 播放列表( 快捷键 F6 ) 正确显示合集视频。 - 当存在用户视频合集时,播放列表里只展示合集视频。 - 当只存在单个视频时,播放列表里包含当前视频与推荐视频(是否包含推荐视频取决于配置文件`showRecommendedVideos`开关) -- 播放番剧,电视剧等其它PGC合集或用户合集时,正确定位当前视频,不会出现从第一集开始播放的问题 -- 支持AV播放地址 -- 优化 Bilibili 音频画质选项显示: - - `EC-3` → **杜比全景声** - - `FLAC` → **Hi-Res 无损** -- 当同时存在杜比全景声与Hi-Res无损时,默认使用Hi-Res无损。 -- 视频与播放列表增加多项属性,如果你足够细心的话,就可以发现。 +- 播放番剧,电视剧等其它PGC合集或用户合集时,正确定位当前视频,不会出现从第一集开始播放的问题。 +- 支持AV播放地址。 +- 当同时存在 杜比全景声 与 Hi-Res无损 时,默认使用 Hi-Res无损。 - 增加 [空降助手](https://github.com/hanydd/BilibiliSponsorBlock) 支持。通过配置文件设置,默认禁用。 另外支持指定镜像站点,以解决主站访问不稳定的问题。(由于目前主站访问不稳定,镜像站是临时的,所以默认禁用。) @@ -60,27 +56,31 @@ - 画质选项增加更多属性。 - 增加 disableAVC 和 preferHDR 设置。 - 音频 itag 生成不再使用预定义。 -- 支持历史播放记录。(使用场景:potplayer 重新启动后直接播放或从播放列表中播放)。 -- 增加番剧官方开场动画与片尾,可与空降助手合并。 -- 从搜索和番剧媒体界面打开时,支持根据观看记录定位到当前观看的剧集(potplayer的观看记录)。 +- 增加番剧官方开场动画与片尾支持,可与空降助手合并。 +- 正确定位视频剧集。 +- 当播放付费 PGC 内容时,弹出对话框提醒。 +- 增加番剧预告开关。 ### 播放列表 -- "我关注的直播间"当无人开播时,弹出对话框提醒。 - “我的动态”、"首页推荐"、"历史记录"、“综合热门”、个人“空间动态”,支持设定视频数量。 -- 支持"综合热门"页面。 -- 增加"热门-排行榜-PGC"页面支持。 -- 增加UP主个人空间动态页面支持。 - 各类生成的播放列表,日期基本上已全部显示。 +- "我关注的直播间"当无人开播时,弹出对话框提醒。 +- 直接从直播分区页面打开时: + - 打开支持关键帧截图。 + - 增加分区信息。 + - 支持荣誉称号显示。 +- "稍后再看" 无内容时,弹出对话框提醒。 +- 直播 支持缩略图使用关键帧截图。 ## 打开链接 - "Potplayer - 打开链接",类别重新整理命名。 -- 排行榜适配B站新分区。 -- 增加 PGC 内容类别。 - -## TODO + - 增加 PGC 内容类别。 +- 直接打开各类 + - 页面支持"综合热门"页面。 + - 增加"热门-排行榜-PGC"页面支持。 + - 增加UP主个人空间动态页面支持。 + - 排行榜适配B站新分区。 -* ~~支持精准空降(视 PotPlayer 是否提供相关支持)~~,目前搭配[油猴脚本](#油猴脚本)实现。 -* ~~支持空降助手~~。 ## wiki From fef7bac45ce78553f434780cb58e0c86a9021617 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Fri, 11 Sep 2026 20:07:08 +0800 Subject: [PATCH 128/132] =?UTF-8?q?1.=20bugfix=20-=20=E7=BA=AF=E5=88=86P?= =?UTF-8?q?=E8=A7=86=E9=A2=91=E6=94=AF=E6=8C=81=E3=80=82=202.=20=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=20"=E8=A7=A3=E6=9E=90=E7=9C=9F=E5=AE=9EM3U8=E5=BF=AB?= =?UTF-8?q?=E9=80=9F=E6=A8=A1=E5=BC=8F"=20=E5=BC=80=E5=85=B3(parseM3u8Real?= =?UTF-8?q?UrlFastMode)=EF=BC=8C=E5=BD=93=E6=AD=A4=E9=A1=B9=E5=BC=80?= =?UTF-8?q?=E5=90=AF=EF=BC=8C=E4=B8=94=20m3u8RedirectDomains=20=E4=B8=8D?= =?UTF-8?q?=E4=B8=BA=E7=A9=BA=E6=97=B6=EF=BC=8C=E5=8F=AA=E5=AF=B9=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E4=B8=AD=E7=9A=84=E5=9F=9F=E5=90=8D=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E7=9C=9F=E5=AE=9E=20M3U8=20=E5=9C=B0=E5=9D=80=E3=80=82(?= =?UTF-8?q?=E5=87=86=E7=A1=AE=E6=80=A7=E5=8F=96=E5=86=B3=E4=BA=8Em3u8Redir?= =?UTF-8?q?ectDomains=20=E6=98=AF=E5=90=A6=E6=9C=89=E6=95=88=E4=B8=94?= =?UTF-8?q?=E5=85=A8=E9=9D=A2)=E3=80=82=203.=20=E5=A2=9E=E5=8A=A0=E5=85=85?= =?UTF-8?q?=E7=94=B5=E8=A7=86=E9=A2=91=E6=94=AF=E6=8C=81=E3=80=82=204.=20b?= =?UTF-8?q?ugfix=20-=20=E4=BF=AE=E5=A4=8D=E9=83=A8=E5=88=86=E5=85=B7?= =?UTF-8?q?=E6=9C=89=E5=8D=95=E7=8B=AC=E5=9C=B0=E5=9D=80=E7=9A=84=E5=88=86?= =?UTF-8?q?=E5=8C=BA=E9=A1=B5=E9=9D=A2=E4=B8=8D=E8=83=BD=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E7=9A=84=E6=83=85=E5=86=B5=EF=BC=88=E5=A6=82=E8=8B=B1=E9=9B=84?= =?UTF-8?q?=E8=81=94=E7=9B=9F=E5=88=86=E5=8C=BA=EF=BC=9Ahttps://live.bilib?= =?UTF-8?q?ili.com/lol=EF=BC=8C=E9=9D=9E=20https://live.bilibili.com/p/ede?= =?UTF-8?q?n/area-tags=3FparentAreaId=3D{x}&areaId=3D{xx}=E8=BF=99?= =?UTF-8?q?=E7=A7=8D=E5=B8=B8=E8=A7=84=E5=9C=B0=E5=9D=80=EF=BC=89=E3=80=82?= =?UTF-8?q?=EF=BC=88=E5=8F=AA=E8=83=BD=E4=B8=80=E4=B8=AA=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=EF=BC=8C=E5=A6=82=E9=81=87=E6=AD=A4=E7=A7=8D?= =?UTF-8?q?=E6=83=85=E5=86=B5=E8=AF=B7=E6=8F=90issue=E3=80=82=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 266 ++++++++++++------- 1 file changed, 169 insertions(+), 97 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index a5be1e9..3d33a41 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -92,7 +92,7 @@ string GetTitle() { } string GetVersion() { - return "2.6.18"; + return "2.6.19"; } string GetDesc() { @@ -280,9 +280,12 @@ class Config { int spaceDynamicVideoNums = 30; bool parseM3u8RealUrl = false; + bool parseM3u8RealUrlFastMode = false; + array m3u8RedirectDomains; string bilibiliDanmujiServer; int maxliveroom = 20; bool useSystemCover = false; + bool disableAVC = false; bool preferHDR = false; bool debug = false; @@ -361,8 +364,21 @@ Config ReadConfigFile(string file) { } if (root["live"].isObject()) { JsonValue live = root["live"]; - if (live["parseM3u8RealUrl"].isBool()) { - config.parseM3u8RealUrl = live["parseM3u8RealUrl"].asBool(); + if (live["parseM3u8RealUrl"].isObject()) { + JsonValue parseM3u8RealUrl = live["parseM3u8RealUrl"]; + if (parseM3u8RealUrl["enable"].isBool()) { + config.parseM3u8RealUrl = parseM3u8RealUrl["enable"].asBool(); + if ( config.parseM3u8RealUrl && parseM3u8RealUrl["fastMode"].isBool() && parseM3u8RealUrl["fastMode"].asBool() && parseM3u8RealUrl["m3u8RedirectDomains"].size() > 0 ) { + config.parseM3u8RealUrlFastMode = true; + for (uint i = 0; i < parseM3u8RealUrl["m3u8RedirectDomains"].size(); i++) { + config.m3u8RedirectDomains.insertLast(parseM3u8RealUrl["m3u8RedirectDomains"][i].asString()); + } + } + } + // 兼容性配置 + if (live["parseM3u8RealUrl"].isBool()) { + config.parseM3u8RealUrl = live["parseM3u8RealUrl"].asBool(); + } } if (live["bilibiliDanmujiServer"].isString()) { config.bilibiliDanmujiServer = live["bilibiliDanmujiServer"].asString(); @@ -787,26 +803,36 @@ string getCodec(int codecid) { string GetM3u8RealURL(string url) { status = 7; + + if (!ConfigData.m3u8RedirectDomains.isEmpty()) { + bool matched = false; + + for (uint j = 0; j < ConfigData.m3u8RedirectDomains.size(); j++) { + if (url.find(ConfigData.m3u8RedirectDomains[j]) >= 0) { + matched = true; + break; + } + } + + if (!matched) { + status = 5; + return url; + } + } + uint tickCount = HostGetTickCount(); string resp = post(url, "", "", false); HostIncTimeOut(HostGetTickCount() - tickCount); array lines = resp.split("\n"); - for (uint i = 0; i < lines.size(); i++) { - string line = lines[i].Trim(); - - if (line.find("#EXT-X-STREAM-INF:") == 0) { - if (i + 1 < lines.size()) { - string m3u8 = lines[i + 1].Trim(); - - if (m3u8.find("http://") == 0 || m3u8.find("https://") == 0) { - status = 5; - return m3u8; - } - } - } + for (uint j = 0; j + 1 < lines.size(); j++) { + string line = lines[j].Trim(); + if (line.find("#EXT-X-STREAM-INF:") != 0) continue; + status = 5; + return lines[j + 1].Trim(); } + status = 5; return url; } @@ -837,6 +863,9 @@ bool isPlaylist(const string&in path) { if (Root["data"]["View"]["ugc_season"].isObject()) { videoIsUGCorPGC.isUGCSeason = true; return true; + } else if (Root["data"]["View"]["pages"].size() > 1) { + videoIsUGCorPGC.isUGCSeason = true; + return true; } } else { log("Video view API code != 0", Root["code"].asInt()); @@ -989,7 +1018,6 @@ void AppendBangumiQualityList(const string epid, const string path, string& url, status = 5; string res; - string referer; JsonReader Reader; JsonValue Root; @@ -1021,7 +1049,7 @@ void AppendBangumiQualityList(const string epid, const string path, string& url, JsonValue support_formats = Root["data"]["result"]["video_info"]["support_formats"]; JsonValue dash = Root["data"]["result"]["video_info"]["dash"]; - + string referer = path; if (dash.isObject()) { JsonValue videos = dash["video"]; @@ -1052,7 +1080,6 @@ void AppendBangumiQualityList(const string epid, const string path, string& url, } while (HostExistITag(itag)) itag++; HostSetITag(itag); - referer = path; QualityListItem item; @@ -1100,9 +1127,8 @@ void AppendBangumiQualityList(const string epid, const string path, string& url, int itag; for (uint i = 0; i < durls.size(); i++) { JsonValue durl = durls[i]; - int qn = durl["quality"].asInt(); - url = getFixedURL(durl["durl"][0]); + int qn = durl["quality"].asInt(); string quality = getVideoQuality(support_formats, qn); int itag = getUniItag(); referer = path; @@ -1138,6 +1164,7 @@ void AppendVideoQualityList(string bvid, string aid, string cid, string& url, ar if (reader.parse(res, root) && root.isObject()) { if (root["code"].asInt() == 0) { JsonValue data = root["data"]; + referer = "https://www.bilibili.com/video/" + bvid; if (data["dash"].isObject()) { int itag = 0; @@ -1167,7 +1194,6 @@ void AppendVideoQualityList(string bvid, string aid, string cid, string& url, ar } while (HostExistITag(itag)) itag++; HostSetITag(itag); - referer = "https://www.bilibili.com/video/" + bvid; QualityListItem item; @@ -1210,8 +1236,16 @@ void AppendVideoQualityList(string bvid, string aid, string cid, string& url, ar AppendAudioQualityList(audio, referer, QualityList); } } else if (data["durl"].isArray()) { - log('/x/player/wbi/playurl has data["durl"]!!!'); - HostMessageBox('告知我一下, /x/player/wbi/playurl has data["durl"]', "告知我一下", 0, 0); + JsonValue durl = data["durl"][0]; + url = getFixedURL(durl); + int itag = getUniItag(); + + QualityListItem item; + item.url = url; + item.itag = itag; + item.va = "v"; + item.referer = referer; + if (@QualityList !is null) QualityList.insertLast(item.toDictionary()); } } else { log("Video playurl response code != 0", root["code"].asInt()); @@ -1856,8 +1890,10 @@ array BangumiEpisodes(string id, string type) { JsonValue episode = episodes[j]; if (!ConfigData.showTrailer && episode["badge_type"].asInt() == 1) continue; + string title = (episode["badge"].isString() ? "【" + episode["badge"].asString() + "】" : "") + episode["share_copy"].asString() + "\n" + episode["show_title"].asString(); + dictionary video; - video["title"] = episode["share_copy"].asString() + "\n" + episode["show_title"].asString(); + video["title"] = title; video["duration"] = episode["duration"].asString(); video["thumbnail"] = episode["cover"].asString(); if (!author.isEmpty()) video["author"] = author; @@ -1899,66 +1935,85 @@ array UGCSeason(const string&in path) { JsonValue Root; Reader.parse(res, Root); - JsonValue sections = Root["data"]["View"]["ugc_season"]["sections"]; - if (!sections.isArray()) return videos; + if (Root["data"]["View"]["ugc_season"].isObject()) { + JsonValue sections = Root["data"]["View"]["ugc_season"]["sections"]; + if (!sections.isArray()) return videos; - // 单/多分组合集 - bool multiSection = (sections.size() > 1) ? true : false; - for (int i = 0; i < sections.size(); i++) { - JsonValue section = sections[i]; - if (!section.isObject()) continue; - - string sectionTitle; - if (multiSection) sectionTitle = "【" + section["title"].asString() + "】"; + // 单/多分组合集 + bool multiSection = (sections.size() > 1) ? true : false; + for (int i = 0; i < sections.size(); i++) { + JsonValue section = sections[i]; + if (!section.isObject()) continue; + + string sectionTitle; + if (multiSection) sectionTitle = "【" + section["title"].asString() + "】"; - JsonValue episodes = section["episodes"]; + JsonValue episodes = section["episodes"]; - if (!episodes.isArray()) continue; + if (!episodes.isArray()) continue; - for (int j = 0; j < episodes.size(); j++) { - JsonValue episode = episodes[j]; - if (!episode.isObject()) continue; + for (int j = 0; j < episodes.size(); j++) { + JsonValue episode = episodes[j]; + if (!episode.isObject()) continue; - string episodeTitle = episode["arc"]["title"].asString(); + string episodeTitle = episode["arc"]["title"].asString(); - JsonValue pages = episode["pages"]; - if (! pages.isArray()) continue; - - // 单/多P视频 - bool multiPages = (pages.size() > 1) ? true : false; - for (int k = 0; k < pages.size(); k++) { - JsonValue page = pages[k]; - dictionary video; - string finalTitle; + JsonValue pages = episode["pages"]; + if (! pages.isArray()) continue; + + // 单/多P视频 + bool multiPages = (pages.size() > 1) ? true : false; + for (int k = 0; k < pages.size(); k++) { + JsonValue page = pages[k]; + dictionary video; + string finalTitle; - if (multiPages) { - if (sectionTitle.isEmpty()) { - finalTitle = episodeTitle + " ▶ " + page["part"].asString(); - } else { - finalTitle = sectionTitle + " ▶ " + episodeTitle + " ▶ " + page["part"].asString(); - } - } else { - if (sectionTitle.isEmpty()) { - finalTitle = episodeTitle; + if (multiPages) { + if (sectionTitle.isEmpty()) { + finalTitle = episodeTitle + "\n\n" + page["part"].asString(); + } else { + finalTitle = sectionTitle + "\n\n" + episodeTitle + "\n\n" + page["part"].asString(); + } } else { - finalTitle = sectionTitle + " ▶ " + episodeTitle; + if (sectionTitle.isEmpty()) { + finalTitle = episodeTitle; + } else { + finalTitle = sectionTitle + "\n\n" + episodeTitle; + } } - } - video["title"] = finalTitle; - video["duration"] = page["duration"].asInt() * 1000; - video["thumbnail"] = episode["arc"]["pic"].asString(); - video["author"] = episode["arc"]["author"]["name"].asString(); - video["url"] = "https://www.bilibili.com/video/" + episode["bvid"].asString() + "?p=" + page["page"].asString(); - video["viewCount"] = episode["arc"]["stat"]["view"].asString(); - video["likeCount"] = episode["arc"]["stat"]["like"].asString(); - video["dislikeCount"] = episode["arc"]["stat"]["dislike"].asString(); - video["date"] = UnixTimeToDateTime(episode["arc"]["pubdate"].asInt64()); - if ((episode["bvid"].asString() == bvid || episode["aid"].asString() == aid) && page["page"].asString() == p) video["current"] = "1"; - video["referer"] = "https://www.bilibili.com/video/" + episode["bvid"].asString(); - videos.insertLast(video); + video["title"] = finalTitle; + video["duration"] = page["duration"].asInt() * 1000; + video["thumbnail"] = episode["arc"]["pic"].asString(); + video["author"] = episode["arc"]["author"]["name"].asString(); + video["url"] = "https://www.bilibili.com/video/" + episode["bvid"].asString() + "?p=" + page["page"].asString(); + video["viewCount"] = episode["arc"]["stat"]["view"].asString(); + video["likeCount"] = episode["arc"]["stat"]["like"].asString(); + video["dislikeCount"] = episode["arc"]["stat"]["dislike"].asString(); + video["date"] = UnixTimeToDateTime(episode["arc"]["pubdate"].asInt64()); + if ((episode["bvid"].asString() == bvid || episode["aid"].asString() == aid) && page["page"].asString() == p) video["current"] = "1"; + video["referer"] = path; + videos.insertLast(video); + } } } + } if (Root["data"]["View"]["pages"].isArray()) { + JsonValue pages = Root["data"]["View"]["pages"]; + + for (int i = 0; i < pages.size(); i++) { + JsonValue page = pages[i]; + + dictionary video; + video["title"] = Root["data"]["View"]["title"].asString() + "\n\n" + page["part"].asString(); + video["duration"] = page["duration"].asInt() * 1000; + video["thumbnail"] = page["first_frame"].asString(); + video["author"] = Root["data"]["View"]["owner"]["name"].asString(); + video["url"] = "https://www.bilibili.com/video/" + Root["data"]["View"]["bvid"].asString() + "?p=" + page["page"].asString(); + video["date"] = UnixTimeToDateTime(page["ctime"].asInt64()); + if (parse(path, "p", "1") == page["page"].asString()) video["current"] = "1"; + video["referer"] = path; + videos.insertLast(video); + } } return videos; @@ -2204,10 +2259,10 @@ string Bangumi(const string&in path, dictionary& MetaData, array& Qu aid = episode["aid"].asString(); bvid = episode["bvid"].asString(); cid = episode["cid"].asString(); + + string title = (episode["badge"].isString() ? "【" + episode["badge"].asString() + "】" : "") + episode["share_copy"].asString() + "\n" + episode["show_title"].asString(); if (@MetaData !is null) { - string title = episode["share_copy"].asString() + "\n" + episode["show_title"].asString(); - MetaData["title"] = title; MetaData["vid"] = bvid; MetaData["duration"] = episode["duration"].asString(); @@ -2327,15 +2382,18 @@ string Video(string id, const string&in path, dictionary& MetaData, array 1) { - title = view["title"].asString() + " > " + page["part"].asString(); + title = view["title"].asString() + "\n\n" + page["part"].asString(); } } + bool is_upower_exclusive = view["is_upower_exclusive"].asBool(); + bool is_upower_preview = view["is_upower_preview"].asBool(); + if (@MetaData !is null) { MetaData["vid"] = join({bvid, cid}, "|"); MetaData["title"] = title; @@ -2366,6 +2424,16 @@ string Video(string id, const string&in path, dictionary& MetaData, array followingLive() { return videos; } -array liveCategory(string path) { +array liveCategory(string path, int areaId = 0, int parentAreaId = 0) { JsonReader Reader; JsonValue Root; @@ -3021,33 +3089,20 @@ array liveCategory(string path) { if (!Reader.parse(renderData, Root) || !Root.isObject()) return array(); string w_webid = Root["access_id"].asString(); - int parentAreaId = parseInt(HostRegExpParse(path, "parentAreaId=([0-9]+)")); - int areaId = parseInt(HostRegExpParse(path, "areaId=([0-9]+)")); - - if (path.find("lol") >= 0) { - return liveCategory(86, 2, w_webid); - } - if (path.find("pubg") >= 0) { - return liveCategory(80, 2, w_webid); - } - if (path.find("cf") >= 0) { - return liveCategory(88, 2, w_webid); - } - if (path.find("hpjy") >= 0) { - return liveCategory(256, 3, w_webid); - } + if (parentAreaId == 0) parentAreaId = parseInt(HostRegExpParse(path, "parentAreaId=([0-9]+)")); + if (areaId == 0) areaId = parseInt(HostRegExpParse(path, "areaId=([0-9]+)")); return liveCategory(areaId, parentAreaId, w_webid); } -array liveCategory(int cateid, int parentAreaId, string w_webid) { +array liveCategory(int areaId, int parentAreaId, string w_webid) { array videos; JsonReader Reader; JsonValue Root; int page = 1; while (videos.size() < ConfigData.maxliveroom) { - string params = "platform=web&parent_area_id=" + parentAreaId + "&area_id=" + cateid + "&page=" + page + "&w_webid=" + w_webid; + string params = "platform=web&parent_area_id=" + parentAreaId + "&area_id=" + areaId + "&page=" + page + "&w_webid=" + w_webid; string url = "https://api.live.bilibili.com/xlive/web-interface/v1/second/getList?" + encWbi(params); string res = post(url); if (!Reader.parse(res, Root) || !Root.isObject()) return videos; @@ -3456,8 +3511,11 @@ array webDynamic(string path) { if (archive.isObject()) { if (archive["bvid"].isString() && !archive["bvid"].asString().empty()) { string bvid = archive["bvid"].asString(); + string title = archive["title"].asString(); + string badge_text = archive["badge"]["text"].asString(); + dictionary video; - video["title"] = "视频 | " + archive["title"].asString(); + video["title"] = badge_text + " | " + archive["title"].asString(); video["duration"] = parseTime(archive["duration_text"].asString()); video["url"] = "https://www.bilibili.com/video/" + bvid; video["thumbnail"] = archive["cover"].asString(); @@ -3772,6 +3830,18 @@ array PlaylistParse(const string&in url) { if (path.find("areaId") >= 0) { return liveCategory(path); } + if (path.find("lol") >= 0) { + return liveCategory(path, 86, 2); + } + if (path.find("pubg") >= 0) { + return liveCategory(path, 80, 2); + } + if (path.find("cf") >= 0) { + return liveCategory(path, 88, 2); + } + if (path.find("hpjy") >= 0) { + return liveCategory(path, 256, 3); + } } // path @@ -3805,7 +3875,9 @@ array PlaylistParse(const string&in url) { // playlist if (videoIsUGCorPGC.isPGC) path = videoIsUGCorPGC.pgcURL; - if (videoIsUGCorPGC.isUGCSeason) return UGCSeason(path); + if (videoIsUGCorPGC.isUGCSeason) { + return UGCSeason(path); + } if (path.find("bangumi/media/md") >= 0) { return BangumiEpisodes(parseMDId(path), "media_id"); From 092fb584b12626aada1a9a1c8c64931beecc284e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Sat, 12 Sep 2026 22:20:53 +0800 Subject: [PATCH 129/132] =?UTF-8?q?1.=20=E5=A2=9E=E5=8A=A0=20=E5=85=B3?= =?UTF-8?q?=E9=97=AD=E7=9B=B4=E6=92=AD=E5=90=8E=EF=BC=8C=E5=AF=B9=20Bilibi?= =?UTF-8?q?li=5FDanmuji=E7=9A=84=E5=90=8E=E7=BB=AD=E6=96=AD=E5=BC=80?= =?UTF-8?q?=E5=A4=84=E7=90=86=E3=80=82=202.=20=E5=8A=A8=E6=80=81=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=20PGC=20=E5=86=85=E5=AE=B9=E3=80=82=203.=20=E5=85=B6?= =?UTF-8?q?=E5=AE=83=E7=BB=86=E8=8A=82=E5=AE=8C=E5=96=84=E4=B8=8E=E7=A8=B3?= =?UTF-8?q?=E5=AE=9A=E6=80=A7=E4=BF=AE=E6=94=B9=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 552 +++++++++++------- .../PlaybackStatistics - Bilibili.as | 145 +++++ 2 files changed, 484 insertions(+), 213 deletions(-) create mode 100644 Playback/Statistics/PlaybackStatistics - Bilibili.as diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index 3d33a41..d03a7da 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -92,7 +92,7 @@ string GetTitle() { } string GetVersion() { - return "2.6.19"; + return "2.6.20"; } string GetDesc() { @@ -123,8 +123,7 @@ string GetWebAccountUrl() { string GetWebAccountDomain() { string domains = ""; for (uint i = 0; i < BilibiliDomains.length(); i++) { - if (i > 0) - domains += ";"; + if (i > 0) domains += ";"; domains += BilibiliDomains[i]; } return domains; @@ -155,6 +154,9 @@ string GetStatus() { case 7: info = "解析真实M3U8地址"; break; + case 8: + info = "获取 Bilibili_Danmuji 地址"; + break; default: info = "请等待"; } @@ -168,31 +170,31 @@ string GetBroadcastListUrl() { } string GetBroadcastListScript(){ - log('GetBroadcastListUrl()'); + log('GetBroadcastListScript()'); return ""; } void OnFinalize() { log("OnFinalize()"); - if (!ConfigData.bilibiliDanmujiServer.isEmpty() && ConfigData.usingDanmuji) { - string unixTime = formatInt(DatetimeToUnixTime(FormatDateTime(datetime()))); - post(ConfigData.bilibiliDanmujiServer + "/disconnectRoom?_=" + unixTime); + if (!ConfigData.GetDanmujiServer().isEmpty() && ConfigData.GetDanmujiStatus()) { + string unixTime = formatInt(DateTimeToUnixTime(FormatDateTime(datetime()))); + post(ConfigData.GetDanmujiServer() + "/disconnectRoom?_=" + unixTime); } } void PlayitemCancel() { log("PlayitemCancel()"); - if (!ConfigData.bilibiliDanmujiServer.isEmpty() && ConfigData.usingDanmuji) { - string unixTime = formatInt(DatetimeToUnixTime(FormatDateTime(datetime()))); - post(ConfigData.bilibiliDanmujiServer + "/disconnectRoom?_=" + unixTime); + if (!ConfigData.GetDanmujiServer().isEmpty() && ConfigData.GetDanmujiStatus()) { + string unixTime = formatInt(DateTimeToUnixTime(FormatDateTime(datetime()))); + post(ConfigData.GetDanmujiServer() + "/disconnectRoom?_=" + unixTime); } } void PlaylistCancel() { log("PlaylistCancel()"); - if (!ConfigData.bilibiliDanmujiServer.isEmpty() && ConfigData.usingDanmuji) { - string unixTime = formatInt(DatetimeToUnixTime(FormatDateTime(datetime()))); - post(ConfigData.bilibiliDanmujiServer + "/disconnectRoom?_=" + unixTime); + if (!ConfigData.GetDanmujiServer().isEmpty() && ConfigData.GetDanmujiStatus()) { + string unixTime = formatInt(DateTimeToUnixTime(FormatDateTime(datetime()))); + post(ConfigData.GetDanmujiServer() + "/disconnectRoom?_=" + unixTime); } } @@ -257,7 +259,9 @@ class QualityListItem { class Config { string fullConfig; + int uid = 0; + bool danmakuEnable = true; string danmakuServer; string danmakuFont; @@ -265,6 +269,7 @@ class Config { float danmakuOpacity = 0.8; float danmakuDisplayArea = 0.8; float danmakuStayTime = 15.0; + bool showRecommendedVideos = true; bool showTrailer = true; @@ -282,8 +287,7 @@ class Config { bool parseM3u8RealUrl = false; bool parseM3u8RealUrlFastMode = false; array m3u8RedirectDomains; - string bilibiliDanmujiServer; - int maxliveroom = 20; + int maxliveroom = 40; bool useSystemCover = false; bool disableAVC = false; @@ -292,143 +296,167 @@ class Config { string danmakuUrl; string subtitleUrl; - bool usingDanmuji = false; + + string DANMUJI_STATUS = "BilibiliPotPlayer.DanmujiStatus()"; + string DANMUJI_SERVER = "BilibiliPotPlayer.DanmujiServer()"; + + void SetDanmujiStatus(bool value) { + HostSaveInteger(DANMUJI_STATUS, value ? 1 : 0); + } + bool GetDanmujiStatus() { + return HostLoadInteger(DANMUJI_STATUS) != 0; + } + void SetDanmujiServer(const string&in server) { + HostSaveString(DANMUJI_SERVER, server); + } + string GetDanmujiServer() { + return HostLoadString(DANMUJI_SERVER); + } } Config ReadConfigFile(string file) { Config config; + uintptr fp = HostFileOpen(file); config.fullConfig = HostFileRead(fp, HostFileLength(fp)); + HostFileClose(fp); + JsonReader reader; JsonValue root; - if (reader.parse(config.fullConfig, root) && root.isObject()) { - if (root["danmaku"].isObject()) { - JsonValue danmaku = root["danmaku"]; - if (danmaku["enable"].isBool()) { - config.danmakuEnable = danmaku["enable"].asBool(); - } - if (danmaku["server"].isString() && !danmaku["server"].asString().empty()) { - config.danmakuServer = danmaku["server"].asString(); - } - if (danmaku["font"].isString()) { - config.danmakuFont = danmaku["font"].asString(); - } - if (danmaku["fontSize"].isNumeric()) { - config.danmakuFontSize = danmaku["fontSize"].asFloat(); - } - if (danmaku["opacity"].isNumeric()) { - config.danmakuOpacity = danmaku["opacity"].asFloat(); - } - if (danmaku["displayArea"].isNumeric()) { - config.danmakuDisplayArea = danmaku["displayArea"].asFloat(); - } - if (danmaku["stayTime"].isNumeric()) { - config.danmakuStayTime = danmaku["stayTime"].asFloat(); - } + if (!reader.parse(config.fullConfig, root) || !root.isObject()) { + HostMessageBox("配置文件存在问题", "[BilibiliPotPlayer] 配置文件错误", 0, 1); + } + + if (root["danmaku"].isObject()) { + JsonValue danmaku = root["danmaku"]; + if (danmaku["enable"].isBool()) { + config.danmakuEnable = danmaku["enable"].asBool(); } - if (root["showRecommendedVideos"].isBool()) { - config.showRecommendedVideos = root["showRecommendedVideos"].asBool(); + if (danmaku["server"].isString() && !danmaku["server"].asString().empty()) { + config.danmakuServer = danmaku["server"].asString(); } - if (root["showTrailer"].isBool()) { - config.showTrailer = root["showTrailer"].asBool(); + if (danmaku["font"].isString()) { + config.danmakuFont = danmaku["font"].asString(); } - if (root["blockP2PCDN"].isBool()) { - config.blockP2PCDN = root["blockP2PCDN"].asBool(); + if (danmaku["fontSize"].isNumeric()) { + config.danmakuFontSize = danmaku["fontSize"].asFloat(); } - if (root["cacheValidTime"].isNumeric()) { - config.cacheValidTime = root["cacheValidTime"].asInt(); + if (danmaku["opacity"].isNumeric()) { + config.danmakuOpacity = danmaku["opacity"].asFloat(); } - if (root["enableSponsorBlock"].isBool()) { - config.enableSponsorBlock = root["enableSponsorBlock"].asBool(); + if (danmaku["displayArea"].isNumeric()) { + config.danmakuDisplayArea = danmaku["displayArea"].asFloat(); } - if (root["sponsorBlockMirror"].isString()) { - config.sponsorBlockMirror = root["sponsorBlockMirror"].asString(); + if (danmaku["stayTime"].isNumeric()) { + config.danmakuStayTime = danmaku["stayTime"].asFloat(); } - if (root["videoNums"].isObject()) { - JsonValue videoNums = root["videoNums"]; - if (videoNums["webDynamicVideoNums"].isNumeric()) { - config.webDynamicVideoNums = videoNums["webDynamicVideoNums"].asInt(); - } - if (videoNums["recommendVideoNums"].isNumeric()) { - config.recommendVideoNums = videoNums["recommendVideoNums"].asInt(); - } - if (videoNums["historyVideoNums"].isNumeric()) { - config.historyVideoNums = videoNums["historyVideoNums"].asInt(); - } - if (videoNums["popularAllPages"].isNumeric()) { - config.popularAllPages = videoNums["popularAllPages"].asInt(); - } - if (videoNums["spaceDynamicVideoNums"].isNumeric()) { - config.spaceDynamicVideoNums = videoNums["spaceDynamicVideoNums"].asInt(); - } + } + + if (root["showRecommendedVideos"].isBool()) { + config.showRecommendedVideos = root["showRecommendedVideos"].asBool(); + } + if (root["showTrailer"].isBool()) { + config.showTrailer = root["showTrailer"].asBool(); + } + if (root["blockP2PCDN"].isBool()) { + config.blockP2PCDN = root["blockP2PCDN"].asBool(); + } + if (root["cacheValidTime"].isNumeric()) { + config.cacheValidTime = root["cacheValidTime"].asInt(); + } + if (root["enableSponsorBlock"].isBool()) { + config.enableSponsorBlock = root["enableSponsorBlock"].asBool(); + } + if (root["sponsorBlockMirror"].isString()) { + config.sponsorBlockMirror = root["sponsorBlockMirror"].asString(); + } + + if (root["videoNums"].isObject()) { + JsonValue videoNums = root["videoNums"]; + if (videoNums["webDynamicVideoNums"].isNumeric()) { + config.webDynamicVideoNums = videoNums["webDynamicVideoNums"].asInt(); } - if (root["live"].isObject()) { - JsonValue live = root["live"]; - if (live["parseM3u8RealUrl"].isObject()) { - JsonValue parseM3u8RealUrl = live["parseM3u8RealUrl"]; - if (parseM3u8RealUrl["enable"].isBool()) { - config.parseM3u8RealUrl = parseM3u8RealUrl["enable"].asBool(); - if ( config.parseM3u8RealUrl && parseM3u8RealUrl["fastMode"].isBool() && parseM3u8RealUrl["fastMode"].asBool() && parseM3u8RealUrl["m3u8RedirectDomains"].size() > 0 ) { - config.parseM3u8RealUrlFastMode = true; - for (uint i = 0; i < parseM3u8RealUrl["m3u8RedirectDomains"].size(); i++) { - config.m3u8RedirectDomains.insertLast(parseM3u8RealUrl["m3u8RedirectDomains"][i].asString()); - } + if (videoNums["recommendVideoNums"].isNumeric()) { + config.recommendVideoNums = videoNums["recommendVideoNums"].asInt(); + } + if (videoNums["historyVideoNums"].isNumeric()) { + config.historyVideoNums = videoNums["historyVideoNums"].asInt(); + } + if (videoNums["popularAllPages"].isNumeric()) { + config.popularAllPages = videoNums["popularAllPages"].asInt(); + } + if (videoNums["spaceDynamicVideoNums"].isNumeric()) { + config.spaceDynamicVideoNums = videoNums["spaceDynamicVideoNums"].asInt(); + } + } + + if (root["live"].isObject()) { + JsonValue live = root["live"]; + if (live["parseM3u8RealUrl"].isObject()) { + JsonValue parseM3u8RealUrl = live["parseM3u8RealUrl"]; + if (parseM3u8RealUrl["enable"].isBool()) { + config.parseM3u8RealUrl = parseM3u8RealUrl["enable"].asBool(); + if ( config.parseM3u8RealUrl && parseM3u8RealUrl["fastMode"].isBool() && parseM3u8RealUrl["fastMode"].asBool() && parseM3u8RealUrl["m3u8RedirectDomains"].size() > 0 ) { + config.parseM3u8RealUrlFastMode = true; + for (uint i = 0; i < parseM3u8RealUrl["m3u8RedirectDomains"].size(); i++) { + config.m3u8RedirectDomains.insertLast(parseM3u8RealUrl["m3u8RedirectDomains"][i].asString()); } } - // 兼容性配置 - if (live["parseM3u8RealUrl"].isBool()) { - config.parseM3u8RealUrl = live["parseM3u8RealUrl"].asBool(); - } - } - if (live["bilibiliDanmujiServer"].isString()) { - config.bilibiliDanmujiServer = live["bilibiliDanmujiServer"].asString(); } - if (live["maxliveroom"].isNumeric()) { - config.maxliveroom = live["maxliveroom"].asInt(); - } - if (live["useSystemCover"].isBool()) { - config.useSystemCover = live["useSystemCover"].asBool(); + // 兼容性配置 + if (live["parseM3u8RealUrl"].isBool()) { + config.parseM3u8RealUrl = live["parseM3u8RealUrl"].asBool(); } } - if (root["disableAVC"].isBool()) { - config.disableAVC = root["disableAVC"].asBool(); + if (live["bilibiliDanmujiServer"].isString()) { + config.SetDanmujiServer(live["bilibiliDanmujiServer"].asString()); + + if (config.GetDanmujiStatus()) { + string unixTime = formatInt(DateTimeToUnixTime(FormatDateTime(datetime()))); + post(config.GetDanmujiServer() + "/disconnectRoom?_=" + unixTime); + config.SetDanmujiStatus(false); + } } - if (root["preferHDR"].isBool()) { - config.preferHDR = root["preferHDR"].asBool(); + if (live["maxliveroom"].isNumeric()) { + config.maxliveroom = live["maxliveroom"].asInt(); } - if (root["debug"].isBool()) { - config.debug = root["debug"].asBool(); + if (live["useSystemCover"].isBool()) { + config.useSystemCover = live["useSystemCover"].asBool(); } + } - // 兼容性配置 - if (root["parseM3u8RealUrl"].isBool()) { - config.parseM3u8RealUrl = root["parseM3u8RealUrl"].asBool(); - } - if (root["bilibiliDanmujiServer"].isString()) { - config.bilibiliDanmujiServer = root["bilibiliDanmujiServer"].asString(); - } - if (root["maxliveroom"].isNumeric()) { - config.maxliveroom = root["maxliveroom"].asInt(); - } + if (root["disableAVC"].isBool()) { + config.disableAVC = root["disableAVC"].asBool(); + } + if (root["preferHDR"].isBool()) { + config.preferHDR = root["preferHDR"].asBool(); + } + if (root["debug"].isBool()) { + config.debug = root["debug"].asBool(); + } - if (!config.danmakuServer.empty()) { - config.danmakuUrl = config.danmakuServer + "/subtitle?font=" + HostUrlEncode(config.danmakuFont) + "&font_size=" + config.danmakuFontSize + "&alpha=" + config.danmakuOpacity + "&display_area=" + config.danmakuDisplayArea + "&duration_marquee=" + config.danmakuStayTime + "&duration_still=" + config.danmakuStayTime + "&cid="; - config.subtitleUrl = config.danmakuServer + "/subtitle?url="; - } - } else { - HostMessageBox("配置文件存在问题", "[BilibiliPotplayer] 配置文件错误", 0, 1); + // 兼容性配置 + if (root["parseM3u8RealUrl"].isBool()) { + config.parseM3u8RealUrl = root["parseM3u8RealUrl"].asBool(); + } + if (root["bilibiliDanmujiServer"].isString()) { + config.GetDanmujiServer() = root["bilibiliDanmujiServer"].asString(); + } + if (root["maxliveroom"].isNumeric()) { + config.maxliveroom = root["maxliveroom"].asInt(); } - HostFileClose(fp); + if (!config.danmakuServer.empty()) { + config.danmakuUrl = config.danmakuServer + "/subtitle?font=" + HostUrlEncode(config.danmakuFont) + "&font_size=" + config.danmakuFontSize + "&alpha=" + config.danmakuOpacity + "&display_area=" + config.danmakuDisplayArea + "&duration_marquee=" + config.danmakuStayTime + "&duration_still=" + config.danmakuStayTime + "&cid="; + config.subtitleUrl = config.danmakuServer + "/subtitle?url="; + } return config; } void log(string item) { - if (!ConfigData.debug) { - return; - } - HostPrintUTF8(item); + if (!ConfigData.debug) return; + HostPrintUTF8("[" + formatFloat(HostGetTickCount() / 1000.0, "", 3, 3) + "] - " + item); } void log(string item, string info) { @@ -448,7 +476,7 @@ string FormatDateTime(datetime&in dt) { formatInt(dt.get_second()); } -int64 DatetimeToUnixTime(const string&in s) { +int64 DateTimeToUnixTime(const string&in s) { int year = parseInt(s.substr(0, 4)); int month = parseInt(s.substr(5, 2)); int day = parseInt(s.substr(8, 2)); @@ -472,26 +500,34 @@ int64 DatetimeToUnixTime(const string&in s) { } string UnixTimeToDateTime(int64 t) { - int64 d = t / 86400; - int s = int(t % 86400); - int y = 1970, m = 1, md; - while (true) { - int dy = ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) ? 366 : 365; - if (d < dy) break; - d -= dy; - y++; - } - bool leap = (y % 4 == 0 && y % 100 != 0) || y % 400 == 0; - while (true) { - md = m == 2 ? (leap ? 29 : 28) : (m == 4 || m == 6 || m == 9 || m == 11 ? 30 : 31); - if (d < md) break; - d -= md; - m++; - } - int h = s / 3600; - int min = s % 3600 / 60; - s %= 60; - return formatInt(y) + "-" + formatInt(m + 100).substr(1) + "-" + formatInt(int(d) + 101).substr(1) + " " + formatInt(h + 100).substr(1) + ":" + formatInt(min + 100).substr(1) + ":" + formatInt(s + 100).substr(1); + t += 8 * 3600; // UTC -> UTC+8 + + int64 d = t / 86400; + int s = int(t % 86400); + + int y = 1970, m = 1, md; + + while (true) { + int dy = ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) ? 366 : 365; + if (d < dy) break; + d -= dy; + y++; + } + + bool leap = (y % 4 == 0 && y % 100 != 0) || y % 400 == 0; + + while (true) { + md = m == 2 ? (leap ? 29 : 28) : (m == 4 || m == 6 || m == 9 || m == 11 ? 30 : 31); + if (d < md) break; + d -= md; + m++; + } + + int h = s / 3600; + int min = s % 3600 / 60; + s %= 60; + + return formatInt(y) + "-" + formatInt(m + 100).substr(1) + "-" + formatInt(int(d) + 101).substr(1) + " " + formatInt(h + 100).substr(1) + ":" + formatInt(min + 100).substr(1) + ":" + formatInt(s + 100).substr(1); } string getMixinKey() { @@ -534,7 +570,7 @@ string encWbi(string params, bool useWts = true) { newParams += "&"; } - if (useWts) newParams += ("&wts=" + formatInt(DatetimeToUnixTime(FormatDateTime(datetime())))); + if (useWts) newParams += ("&wts=" + formatInt(DateTimeToUnixTime(FormatDateTime(datetime())))); return (newParams + "&w_rid=" + HostHashMD5(newParams + MixinKey)); } @@ -544,22 +580,41 @@ string makeWebUrl(string path) { if (strs.length() <= 1) { return path; } + string url = strs[0]; string p = parse(path, "p"); - if (p.empty() || p == "1") { + string t = parse(path, "t"); + + string query = ""; + + if (!t.empty()) { + query += "t=" + t; + } + + if (!p.empty() && p != "0" && p != "1") { + if (!query.empty()) { + query += "&"; + } + query += "p=" + p; + } + + if (query.empty()) { return url; } - return url + "?p=" + p; + + return url + "?" + query; } string post(string url, string data = "", string headers = "", bool debug = true) { - uint tickCount = HostGetTickCount(); - if (headers.empty()) headers = "User-Agent: " + UserAgent + "\r\n" + "Referer: " + Referer + "\r\n"; - if (debug) log("request url", url); + + uint start = HostGetTickCount(); string res = HostUrlGetString(url, "", headers, data); + uint end = HostGetTickCount(); + HostIncTimeOut(end - start); + + if (debug) log("Request time: " + formatFloat((end - start) / 1000.0, "", 3, 3) + "s" + ", url: " + url); - HostIncTimeOut(HostGetTickCount() - tickCount); return res; } @@ -577,9 +632,12 @@ string apiPost(string api, string data, string host, bool useCache = true) { string apiPost(string api, string data, string host, string headers, bool useCache = true) { ResponseCacheItem item; + bool debug = true; string key; + string cacheStatus = ""; if (useCache) { + debug = false; if (!data.empty()) { key = HostRegExpRemove(HostRegExpRemove(api, "&w_rid=[^&]*"), "&wts=[^&]*") + "?" + data; } else { @@ -591,14 +649,21 @@ string apiPost(string api, string data, string host, string headers, bool useCac log("Cache Hit, url", host + api); return item.response; } else { - log("Cache expire"); + cacheStatus = "Cache expire"; } } else { - log("Cache not Hit"); + cacheStatus = "Cache not Hit"; } } - string resp = post(host + api, data, headers); + uint start = HostGetTickCount(); + string resp = post(host + api, data, headers, debug); + uint end = HostGetTickCount(); + + if (!cacheStatus.empty()) { + log(cacheStatus + ", request time: " + formatFloat((end - start) / 1000.0, "", 3, 3) +"s, url: " + host + api); + } + if (resp.empty()) { HostMessageBox("未获取到响应数据,请等待一段时间后重试一下\n\nurl: " + host + api, "请求失败"); return ""; @@ -820,15 +885,20 @@ string GetM3u8RealURL(string url) { } } - uint tickCount = HostGetTickCount(); string resp = post(url, "", "", false); - HostIncTimeOut(HostGetTickCount() - tickCount); - array lines = resp.split("\n"); for (uint j = 0; j + 1 < lines.size(); j++) { string line = lines[j].Trim(); if (line.find("#EXT-X-STREAM-INF:") != 0) continue; + bool found = false; + for (uint k = 0; k < ConfigData.m3u8RedirectDomains.size(); k++) { + if (lines[j + 1].Trim().find(ConfigData.m3u8RedirectDomains[k]) >= 0) { + found = true; + break; + } + } + if (!found) log("!-------------------found redirect m3u8, origin url", url); status = 5; return lines[j + 1].Trim(); } @@ -1131,19 +1201,28 @@ void AppendBangumiQualityList(const string epid, const string path, string& url, int qn = durl["quality"].asInt(); string quality = getVideoQuality(support_formats, qn); int itag = getUniItag(); - referer = path; + referer = referer; QualityListItem item; - item.url = url; item.quality = quality; item.qualityDetail = quality; item.itag = itag; item.va = "v"; item.referer = referer; - if (@QualityList !is null) QualityList.insertLast(item.toDictionary()); } + } else if (Root["data"]["result"]["video_info"]["durl"].isArray()) { + JsonValue durl = Root["data"]["result"]["video_info"]["durl"][0]; + url = getFixedURL(durl); + int itag = getUniItag(); + + QualityListItem item; + item.url = url; + item.itag = itag; + item.va = "v"; + item.referer = referer; + if (@QualityList !is null) QualityList.insertLast(item.toDictionary()); } log("url", url); @@ -1164,6 +1243,7 @@ void AppendVideoQualityList(string bvid, string aid, string cid, string& url, ar if (reader.parse(res, root) && root.isObject()) { if (root["code"].asInt() == 0) { JsonValue data = root["data"]; + JsonValue support_formats = data["support_formats"]; referer = "https://www.bilibili.com/video/" + bvid; if (data["dash"].isObject()) { @@ -1235,6 +1315,26 @@ void AppendVideoQualityList(string bvid, string aid, string cid, string& url, ar audio = data["dash"]["flac"]["audio"]; AppendAudioQualityList(audio, referer, QualityList); } + } else if (data["durls"].isArray()) { + JsonValue durls = data["durls"]; + int itag; + for (uint i = 0; i < durls.size(); i++) { + JsonValue durl = durls[i]; + url = getFixedURL(durl["durl"][0]); + int qn = durl["quality"].asInt(); + string quality = getVideoQuality(support_formats, qn); + int itag = getUniItag(); + referer = referer; + + QualityListItem item; + item.url = url; + item.quality = quality; + item.qualityDetail = quality; + item.itag = itag; + item.va = "v"; + item.referer = referer; + if (@QualityList !is null) QualityList.insertLast(item.toDictionary()); + } } else if (data["durl"].isArray()) { JsonValue durl = data["durl"][0]; url = getFixedURL(durl); @@ -1247,9 +1347,6 @@ void AppendVideoQualityList(string bvid, string aid, string cid, string& url, ar item.referer = referer; if (@QualityList !is null) QualityList.insertLast(item.toDictionary()); } - } else { - log("Video playurl response code != 0", root["code"].asInt()); - log("Video playurl response message", root["message"].asString()); } } @@ -1288,7 +1385,7 @@ void AppendAudioQualityList(JsonValue audio, string referer, array& string codec = audio["codecs"].asString().MakeLower(); string mime_type = audio["mime_type"].asString().MakeLower(); - string format = mime_type.substr(mime_type.findLast("/") + 1) + ", " + codec.substr(0, codec.find(".")) + ", " + bitrate; + string format = mime_type.substr(mime_type.findLast("/") + 1) + ", " + (codec.find(".") >= 0 ? codec.substr(0, codec.find(".")) : codec) + ", " + bitrate; item.url = url; item.bitrateVal = bitrateVal; @@ -1814,26 +1911,24 @@ JsonValue SortVideos(JsonValue& videos) { } string getChatUrl(const string room_id, string server) { + status = 8; + string chatUrl; string unixTime; uint tickCount; JsonReader Reader; JsonValue Root; - if (ConfigData.usingDanmuji) { + if (ConfigData.GetDanmujiStatus()) { + unixTime = formatInt(DateTimeToUnixTime(FormatDateTime(datetime()))); tickCount = HostGetTickCount(); - - unixTime = formatInt(DatetimeToUnixTime(FormatDateTime(datetime()))); - post(server + "/disconnectRoom?_=" + unixTime); - + post(server + "/disconnectRoom?_=" + unixTime); HostIncTimeOut(HostGetTickCount() - tickCount); } + unixTime = formatInt(DateTimeToUnixTime(FormatDateTime(datetime()))); tickCount = HostGetTickCount(); - - unixTime = formatInt(DatetimeToUnixTime(FormatDateTime(datetime()))); string res = post(server + "/connectRoom?roomid=" + room_id + "&_=" + unixTime); - HostIncTimeOut(HostGetTickCount() - tickCount); if (!Reader.parse(res, Root) || !Root.isObject()) { @@ -1843,13 +1938,12 @@ string getChatUrl(const string room_id, string server) { if (Root["code"].asString() != "200") { log("getChatUrl - connectRoom failed, code: " + Root["code"].asString() + ", msg: " + Root["msg"].asString()); - return chatUrl; } string host = HostRegExpParse(server, "^https?://([^/]+)"); chatUrl = server + "/danmu_widget?sub=ws://" + host + "/danmu/sub"; - ConfigData.usingDanmuji = true; + ConfigData.SetDanmujiStatus(true); return chatUrl; } @@ -1889,8 +1983,7 @@ array BangumiEpisodes(string id, string type) { for (int j = 0; j < episodes.size(); j++) { JsonValue episode = episodes[j]; if (!ConfigData.showTrailer && episode["badge_type"].asInt() == 1) continue; - - string title = (episode["badge"].isString() ? "【" + episode["badge"].asString() + "】" : "") + episode["share_copy"].asString() + "\n" + episode["show_title"].asString(); + string title = ((episode["badge"].isString() && !episode["badge"].asString().empty()) ? "【" + episode["badge"].asString() + "】\n" : "") + episode["share_copy"].asString() + "\n" + episode["show_title"].asString(); dictionary video; video["title"] = title; @@ -1941,6 +2034,7 @@ array UGCSeason(const string&in path) { // 单/多分组合集 bool multiSection = (sections.size() > 1) ? true : false; + for (int i = 0; i < sections.size(); i++) { JsonValue section = sections[i]; if (!section.isObject()) continue; @@ -1949,7 +2043,6 @@ array UGCSeason(const string&in path) { if (multiSection) sectionTitle = "【" + section["title"].asString() + "】"; JsonValue episodes = section["episodes"]; - if (!episodes.isArray()) continue; for (int j = 0; j < episodes.size(); j++) { @@ -1959,56 +2052,61 @@ array UGCSeason(const string&in path) { string episodeTitle = episode["arc"]["title"].asString(); JsonValue pages = episode["pages"]; - if (! pages.isArray()) continue; + if (!pages.isArray()) continue; // 单/多P视频 bool multiPages = (pages.size() > 1) ? true : false; + for (int k = 0; k < pages.size(); k++) { JsonValue page = pages[k]; - dictionary video; + if (!page.isObject()) continue; + string finalTitle; if (multiPages) { if (sectionTitle.isEmpty()) { - finalTitle = episodeTitle + "\n\n" + page["part"].asString(); + finalTitle = episodeTitle + "\n" + page["part"].asString(); } else { - finalTitle = sectionTitle + "\n\n" + episodeTitle + "\n\n" + page["part"].asString(); + finalTitle = sectionTitle + "\n" + episodeTitle + "\n" + page["part"].asString(); } } else { if (sectionTitle.isEmpty()) { finalTitle = episodeTitle; } else { - finalTitle = sectionTitle + "\n\n" + episodeTitle; + finalTitle = sectionTitle + "\n" + episodeTitle; } } + bool isCurrent = ((episode["bvid"].asString() == bvid || episode["aid"].asString() == aid) && page["page"].asString() == p) ? true : false; + + dictionary video; video["title"] = finalTitle; video["duration"] = page["duration"].asInt() * 1000; video["thumbnail"] = episode["arc"]["pic"].asString(); video["author"] = episode["arc"]["author"]["name"].asString(); - video["url"] = "https://www.bilibili.com/video/" + episode["bvid"].asString() + "?p=" + page["page"].asString(); + video["url"] = isCurrent ? makeWebUrl(path) : makeWebUrl("https://www.bilibili.com/video/" + episode["bvid"].asString() + "?p=" + page["page"].asString()); video["viewCount"] = episode["arc"]["stat"]["view"].asString(); video["likeCount"] = episode["arc"]["stat"]["like"].asString(); video["dislikeCount"] = episode["arc"]["stat"]["dislike"].asString(); video["date"] = UnixTimeToDateTime(episode["arc"]["pubdate"].asInt64()); - if ((episode["bvid"].asString() == bvid || episode["aid"].asString() == aid) && page["page"].asString() == p) video["current"] = "1"; + if (isCurrent) video["current"] = "1"; video["referer"] = path; videos.insertLast(video); } } } - } if (Root["data"]["View"]["pages"].isArray()) { + } else if (Root["data"]["View"]["pages"].isArray()) { JsonValue pages = Root["data"]["View"]["pages"]; for (int i = 0; i < pages.size(); i++) { JsonValue page = pages[i]; dictionary video; - video["title"] = Root["data"]["View"]["title"].asString() + "\n\n" + page["part"].asString(); + video["title"] = Root["data"]["View"]["title"].asString() + "\n" + page["part"].asString(); video["duration"] = page["duration"].asInt() * 1000; video["thumbnail"] = page["first_frame"].asString(); video["author"] = Root["data"]["View"]["owner"]["name"].asString(); - video["url"] = "https://www.bilibili.com/video/" + Root["data"]["View"]["bvid"].asString() + "?p=" + page["page"].asString(); + video["url"] = makeWebUrl("https://www.bilibili.com/video/" + Root["data"]["View"]["bvid"].asString() + "?p=" + page["page"].asString()); video["date"] = UnixTimeToDateTime(page["ctime"].asInt64()); if (parse(path, "p", "1") == page["page"].asString()) video["current"] = "1"; video["referer"] = path; @@ -2051,14 +2149,14 @@ array RelatedVideos(const string&in path) { video["duration"] = view["duration"].asInt() * 1000; video["thumbnail"] = view["pic"].asString(); video["author"] = view["owner"]["name"].asString(); - video["url"] = "https://www.bilibili.com/video/" + view["bvid"].asString(); + video["url"] = makeWebUrl(path); if (!view["desc"].asString().empty() && view["desc"].asString() != "-") video["content"] = view["desc"].asString(); video["viewCount"] = view["stat"]["view"].asString(); video["likeCount"] = view["stat"]["like"].asString(); video["dislikeCount"] = view["stat"]["dislike"].asString(); video["date"] = UnixTimeToDateTime(view["pubdate"].asInt64()); video["current"] = "1"; - video["referer"] = "https://www.bilibili.com/video/" + view["bvid"].asString(); + video["referer"] = makeWebUrl(path); videos.insertLast(video); if (!ConfigData.showRecommendedVideos) return videos; @@ -2079,7 +2177,7 @@ array RelatedVideos(const string&in path) { video["likeCount"] = item["stat"]["like"].asString(); video["dislikeCount"] = item["stat"]["dislike"].asString(); video["date"] = UnixTimeToDateTime(item["pubdate"].asInt64()); - video["referer"] = "https://www.bilibili.com/video/" + view["bvid"].asString(); + video["referer"] = makeWebUrl(path); videos.insertLast(video); } else { log("item is not exists."); @@ -2260,14 +2358,14 @@ string Bangumi(const string&in path, dictionary& MetaData, array& Qu bvid = episode["bvid"].asString(); cid = episode["cid"].asString(); - string title = (episode["badge"].isString() ? "【" + episode["badge"].asString() + "】" : "") + episode["share_copy"].asString() + "\n" + episode["show_title"].asString(); + string title = ((episode["badge"].isString() && !episode["badge"].asString().empty()) ? "【" + episode["badge"].asString() + "】\n" : "") + episode["share_copy"].asString() + "\n" + episode["show_title"].asString(); if (@MetaData !is null) { MetaData["title"] = title; MetaData["vid"] = bvid; MetaData["duration"] = episode["duration"].asString(); MetaData["thumbnail"] = episode["cover"].asString(); - MetaData["webUrl"] = episode["link"].asString(); + MetaData["webUrl"] = makeWebUrl(path); MetaData["date"] = UnixTimeToDateTime(episode["pub_time"].asInt64()); MetaData["fileExt"] = "mp4"; @@ -2387,19 +2485,31 @@ string Video(string id, const string&in path, dictionary& MetaData, array 1) { - title = view["title"].asString() + "\n\n" + page["part"].asString(); + title = view["title"].asString() + "\n" + page["part"].asString(); } } + string author; + array staff; + if (view["staff"].isArray() && view["staff"].size() > 0) { + for (uint i = 0; i < view["staff"].size(); i++) { + staff.insertLast(view["staff"][i]["name"].asString()); + } + author = join(staff, ", "); + } else { + author = view["owner"]["name"].asString(); + } + bool is_upower_exclusive = view["is_upower_exclusive"].asBool(); bool is_upower_preview = view["is_upower_preview"].asBool(); + if (is_upower_exclusive) title = "【充电专属】\n" + title; - if (@MetaData !is null) { - MetaData["vid"] = join({bvid, cid}, "|"); + if (@MetaData !is null) { + MetaData["vid"] = cid; MetaData["title"] = title; MetaData["duration"] = formatInt(view["duration"].asInt() * 1000); MetaData["thumbnail"] = view["pic"].asString(); - MetaData["author"] = view["owner"]["name"].asString(); + MetaData["author"] = author; MetaData["content"] = view["desc"].asString(); MetaData["webUrl"] = makeWebUrl(path); MetaData["viewCount"] = view["stat"]["view"].asString(); @@ -2456,7 +2566,7 @@ string Live(string id, const string&in path, dictionary& MetaData, array watchlater() { video["title"] = item["title"].asString() + " | " + item["page"]["part"].asString(); } video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["bvid"].asString() + "?p=" + p; + video["url"] = makeWebUrl("https://www.bilibili.com/video/" + item["bvid"].asString() + "?p=" + p); video["thumbnail"] = item["pic"].asString(); video["author"] = item["owner"]["name"].asString(); video["date"] = UnixTimeToDateTime(item["pubdate"].asInt64()); @@ -2768,7 +2878,7 @@ array watchlater() { } } if (videos.size() == 0) { - HostMessageBox("你的 [稍后再看] 列表是空的,刷点别的视频吧。", "[稍后再看] 为空", 2,0); + HostMessageBox("[稍后再看] 列表是空的,刷点别的视频吧。", "[稍后再看] 为空", 2,0); } return videos; } @@ -2827,7 +2937,7 @@ array History() { } video["duration"] = item["duration"].asInt() * 1000; - video["url"] = "https://www.bilibili.com/video/" + item["history"]["bvid"].asString() + "?p=" + p; + video["url"] = makeWebUrl("https://www.bilibili.com/video/" + item["history"]["bvid"].asString() + "?p=" + p); video["date"] = UnixTimeToDateTime(item["view_at"].asInt64()); } @@ -3030,7 +3140,7 @@ array followingLive() { int page = 1; while (true) { - string url = "/xlive/web-ucenter/user/following?page=" + page + "&page_size=10"; + string url = "/xlive/web-ucenter/user/following?page=" + page + "&page_size=10&hit_ab=true"; string res = apiPost(url, "", "https://api.live.bilibili.com", false); if (!Reader.parse(res, Root) || !Root.isObject() || Root["code"].asInt() != 0) @@ -3047,22 +3157,19 @@ array followingLive() { for (int i = 0; i < list.size(); i++) { JsonValue item = list[i]; - // 接口优先返回正在开播的用户,后面均为未开播 if (item["live_status"].asInt() == 0) { hasOffline = true; break; } dictionary video; - video["title"] = item["title"].asString(); + video["title"] = item["area_name_v2"].asString() + "\n" + item["title"].asString(); video["url"] = "https://live.bilibili.com/" + item["roomid"].asString(); - video["thumbnail"] = item["face"].asString(); + video["thumbnail"] = item["room_cover"].asString(); video["author"] = item["uname"].asString(); - videos.insertLast(video); } - // 当前页已经出现未开播用户,后续页面无需请求 if (hasOffline) break; @@ -3075,7 +3182,7 @@ array followingLive() { } if (videos.size() == 0) { - HostMessageBox("[我关注的直播] 列表是空的,刷点别的视频吧。", "[关注的直播] 为空", 2, 0); + HostMessageBox("[我关注的直播] 列表是空的,刷点别的视频吧。", "[我关注的直播] 为空", 2, 0); } return videos; @@ -3096,6 +3203,7 @@ array liveCategory(string path, int areaId = 0, int parentAreaId = 0 } array liveCategory(int areaId, int parentAreaId, string w_webid) { + log("============================== liveCategory =============================="); array videos; JsonReader Reader; JsonValue Root; @@ -3126,7 +3234,6 @@ array liveCategory(int areaId, int parentAreaId, string w_webid) { for (int j = 0; j < keys.size(); j++) { pendant_infos.insertLast(item["pendant_info"][keys[j]]["content"].asString().isEmpty() ? item["pendant_info"][keys[j]]["name"].asString() : item["pendant_info"][keys[j]]["content"].asString()); } - pendant_title = join(pendant_infos, " | "); } @@ -3136,14 +3243,13 @@ array liveCategory(int areaId, int parentAreaId, string w_webid) { if (!pendant_title.isEmpty())titles.insertLast(pendant_title); dictionary video; - video["title"] = join(titles, "\n\n"); + video["title"] = join(titles, "\n"); video["url"] = "https://live.bilibili.com/" + item["roomid"].asInt(); video["thumbnail"] = ConfigData.useSystemCover ? item["system_cover"].asString() : item["cover"].asString() ; video["author"] = item["uname"].asString(); videos.insertLast(video); - } - + page++; if (Root["data"]["has_more"].asInt() != 1) return videos; } @@ -3505,17 +3611,18 @@ array webDynamic(string path) { if (!major.isObject()) continue; string author = list[j]["modules"]["module_author"]["name"].asString(); - string date = UnixTimeToDateTime(parseInt(list[j]["modules"]["module_author"]["pub_ts"].asString())); + // string date = UnixTimeToDateTime(parseInt(list[j]["modules"]["module_author"]["pub_ts"].asString())); + string date = list[j]["modules"]["module_author"]["pub_time"].asString(); JsonValue archive = major["archive"]; if (archive.isObject()) { if (archive["bvid"].isString() && !archive["bvid"].asString().empty()) { string bvid = archive["bvid"].asString(); string title = archive["title"].asString(); - string badge_text = archive["badge"]["text"].asString(); + string badge_text = "【" + archive["badge"]["text"].asString() + "】"; dictionary video; - video["title"] = badge_text + " | " + archive["title"].asString(); + video["title"] = badge_text + "\n" + archive["title"].asString(); video["duration"] = parseTime(archive["duration_text"].asString()); video["url"] = "https://www.bilibili.com/video/" + bvid; video["thumbnail"] = archive["cover"].asString(); @@ -3531,16 +3638,35 @@ array webDynamic(string path) { JsonValue content; if (Reader.parse(content_str, content) && content.isObject()) { if (content["live_play_info"]["live_status"].asInt() == 1) { + string parent_area_name = content["live_play_info"]["parent_area_name"].asString(); + string area_name = content["live_play_info"]["area_name"].asString(); + dictionary live; - live["title"] = "直播 | " + content["live_play_info"]["title"].asString(); + live["title"] = "【直播】" + "\n" + parent_area_name + " (" + area_name + ") " + "\n" + content["live_play_info"]["title"].asString(); live["url"] = "https://live.bilibili.com/" + content["live_play_info"]["room_id"].asString(); live["thumbnail"] = content["live_play_info"]["cover"].asString(); live["author"] = author; + live["date"] = UnixTimeToDateTime(content["live_play_info"]["live_start_time"].asInt64()); videos.insertLast(live); } } continue; } + JsonValue pgc = major["pgc"]; + if (pgc.isObject()) { + if (pgc["epid"].isString() && !pgc["epid"].asString().empty()) { + string title = pgc["title"].asString(); + string badge_text = "【" + pgc["badge"]["text"].asString() + "】"; + dictionary pgc_video; + pgc_video["title"] = badge_text + "\n" + pgc["title"].asString(); + pgc_video["url"] = pgc["jump_url"].asString(); + pgc_video["thumbnail"] = pgc["cover"].asString(); + pgc_video["author"] = author; + pgc_video["date"] = list[j]["modules"]["module_author"]["pub_time"].asString(); + videos.insertLast(pgc_video); + } + continue; + } } } } diff --git a/Playback/Statistics/PlaybackStatistics - Bilibili.as b/Playback/Statistics/PlaybackStatistics - Bilibili.as new file mode 100644 index 0000000..0374a01 --- /dev/null +++ b/Playback/Statistics/PlaybackStatistics - Bilibili.as @@ -0,0 +1,145 @@ +// void OnInitialize() +// void OnFinalize() +// string GetTitle() -> get title for UI +// string GetVersion -> get version for manage +// string GetDesc() -> get detail information +//------------------------------------------------------------------------------------------------ +// void PlaybackOpen(const string &in) +// void PlaybackStart(const string &in, int) +// void PlaybackTime(const string &in, int, int) +// void PlaybackPause(const string &in) +// void PlaybackResume(const string &in) +// void PlaybackComplete(const string &in) +// void PlaybackClose(const string &in) + +const string DANMUJI_STATUS = "BilibiliPotPlayer.DanmujiStatus()"; +const string DANMUJI_SERVER = "BilibiliPotPlayer.DanmujiServer()"; + + +void OnInitialize() { + // HostOpenConsole(); +} + +string GetTitle() { + return "BiliBili"; +} +string GetVersion() { + return "1"; +} + +string GetDesc() { + return "https://www.bilibili.com"; +} + +void log(string item) { + HostPrintUTF8("[" + formatFloat(HostGetTickCount() / 1000.0, "", 3, 3) + "] - " + item); +} + +void log(string item, string info) { + log(item + ": " + info); +} + +void log(string item, int info) { + log(item + ": " + info); +} + +string post(string url, string data = "", string headers = "", bool debug = true) { + uint start = HostGetTickCount(); + string res = HostUrlGetString(url, "", headers, data); + uint end = HostGetTickCount(); + HostIncTimeOut(end - start); + if (debug) log("Request time: " + formatFloat((end - start) / 1000.0, "", 3, 3) + "s" + ", url: " + url); + + return res; +} + +string FormatDateTime(datetime&in dt) { + return formatInt(dt.get_year()) + "-" + (dt.get_month() < 10 ? "0" : "") + + formatInt(dt.get_month()) + "-" + (dt.get_day() < 10 ? "0" : "") + + formatInt(dt.get_day()) + " " + (dt.get_hour() < 10 ? "0" : "") + + formatInt(dt.get_hour()) + ":" + (dt.get_minute() < 10 ? "0" : "") + + formatInt(dt.get_minute()) + ":" + (dt.get_second() < 10 ? "0" : "") + + formatInt(dt.get_second()); +} + +int64 DateTimeToUnixTime(const string&in s) { + int year = parseInt(s.substr(0, 4)); + int month = parseInt(s.substr(5, 2)); + int day = parseInt(s.substr(8, 2)); + int hour = parseInt(s.substr(11, 2)); + int minute = parseInt(s.substr(14, 2)); + int second = parseInt(s.substr(17, 2)); + + int64 days = 0; + + for (int y = 1970; y < year; y++) + days += ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) ? 366 : 365; + + int[] daysInMonth = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + + for (int m = 1; m < month; m++) + days += daysInMonth[m - 1] + (m == 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) ? 1 : 0); + + days += day - 1; + + return days * 86400 + hour * 3600 + minute * 60 + second; +} + +void SetDanmujiStatus(bool value) { + HostSaveInteger(DANMUJI_STATUS, value ? 1 : 0); +} +bool GetDanmujiStatus() { + return HostLoadInteger(DANMUJI_STATUS) != 0; +} + +void SetDanmujiServer(const string&in server) { + HostSaveString(DANMUJI_SERVER, server); +} +string GetDanmujiServer() { + return HostLoadString(DANMUJI_SERVER); +} + + +void PlaybackOpen(const string &in path) { + // log("PlaybackOpen()", path); +} + +void PlaybackStart(const string &in path, int) { + // log("PlaybackStart()", path); +} + +void PlaybackTime(const string &in path, int, int) { + // log("PlaybackTime()", path); +} + +void PlaybackPause(const string &in path) { + // log("PlaybackPause()", path); +} + +void PlaybackResume(const string &in path) { + // log("PlaybackResume()", path); +} + +void PlaybackComplete(const string &in path) { + log("PlaybackComplete()", path); + + string id = HostRegExpParse(path, "live.bilibili.com/([0-9]+)"); + if (id.empty()) return; + + if (!GetDanmujiServer().isEmpty() && GetDanmujiStatus()) { + string unixTime = formatInt(DateTimeToUnixTime(FormatDateTime(datetime()))); + post(GetDanmujiServer() + "/disconnectRoom?_=" + unixTime); + } +} + +void PlaybackClose(const string &in path) { + log("PlaybackClose()", path); + + string id = HostRegExpParse(path, "live.bilibili.com/([0-9]+)"); + if (id.empty()) return; + + if (!GetDanmujiServer().isEmpty() && GetDanmujiStatus()) { + string unixTime = formatInt(DateTimeToUnixTime(FormatDateTime(datetime()))); + post(GetDanmujiServer() + "/disconnectRoom?_=" + unixTime); + } +} \ No newline at end of file From 8ea5c02002ea8b5c1bae3654654b2897c9089bd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Sun, 13 Sep 2026 00:27:55 +0800 Subject: [PATCH 130/132] SetDanmujiStatus(false) --- Playback/Statistics/PlaybackStatistics - Bilibili.as | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Playback/Statistics/PlaybackStatistics - Bilibili.as b/Playback/Statistics/PlaybackStatistics - Bilibili.as index 0374a01..68610c3 100644 --- a/Playback/Statistics/PlaybackStatistics - Bilibili.as +++ b/Playback/Statistics/PlaybackStatistics - Bilibili.as @@ -32,7 +32,7 @@ string GetDesc() { } void log(string item) { - HostPrintUTF8("[" + formatFloat(HostGetTickCount() / 1000.0, "", 3, 3) + "] - " + item); + HostPrintUTF8("[" + formatFloat(HostGetTickCount() / 1000.0, "", 3, 3) + "] - " + "PlaybackStatistics - Bilibili - " + item); } void log(string item, string info) { @@ -121,7 +121,7 @@ void PlaybackResume(const string &in path) { } void PlaybackComplete(const string &in path) { - log("PlaybackComplete()", path); + // log("PlaybackComplete()", path); string id = HostRegExpParse(path, "live.bilibili.com/([0-9]+)"); if (id.empty()) return; @@ -129,11 +129,12 @@ void PlaybackComplete(const string &in path) { if (!GetDanmujiServer().isEmpty() && GetDanmujiStatus()) { string unixTime = formatInt(DateTimeToUnixTime(FormatDateTime(datetime()))); post(GetDanmujiServer() + "/disconnectRoom?_=" + unixTime); + SetDanmujiStatus(false); } } void PlaybackClose(const string &in path) { - log("PlaybackClose()", path); + // log("PlaybackClose()", path); string id = HostRegExpParse(path, "live.bilibili.com/([0-9]+)"); if (id.empty()) return; @@ -141,5 +142,6 @@ void PlaybackClose(const string &in path) { if (!GetDanmujiServer().isEmpty() && GetDanmujiStatus()) { string unixTime = formatInt(DateTimeToUnixTime(FormatDateTime(datetime()))); post(GetDanmujiServer() + "/disconnectRoom?_=" + unixTime); + SetDanmujiStatus(false); } } \ No newline at end of file From 6a6181a678be78183df077d317a2fa159e6456ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Sun, 13 Sep 2026 00:52:28 +0800 Subject: [PATCH 131/132] =?UTF-8?q?1.=20=E5=A2=9E=E5=8A=A0=E6=8F=8F?= =?UTF-8?q?=E8=BF=B0=E4=BF=A1=E6=81=AF=202.=E4=BC=98=E5=8C=96Bilibili=5FDa?= =?UTF-8?q?nmiji=20=E6=96=AD=E5=BC=80=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Media/PlayParse/MediaPlayParse - Bilibili.as | 32 ++++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/Media/PlayParse/MediaPlayParse - Bilibili.as b/Media/PlayParse/MediaPlayParse - Bilibili.as index d03a7da..b66d99f 100644 --- a/Media/PlayParse/MediaPlayParse - Bilibili.as +++ b/Media/PlayParse/MediaPlayParse - Bilibili.as @@ -72,7 +72,7 @@ void OnInitialize() { } string GetTitle() { - string title = "BiliBili"; + string title = "BiliBili @" + GetVersion(); if (!HostFileExist(HostGetScriptFolder() + ConfigFileName)) { return title + "(配置文件不存在)"; } @@ -96,7 +96,18 @@ string GetVersion() { } string GetDesc() { - return "https://www.bilibili.com"; + const string GitHub_Link = "https://github.com/frostnotfall/BilibiliPotPlayer"; + const string GitHub_OriginalLink = "https://sponsor.ajay.app/"; + string info = + "BilibiliPotPlayer 版本: " + GetVersion() + "" + "\r\n" + "教程: " + "安装及基本使用教程, " + "进阶教程\r\n" + "\r\n" + "基于原项目BilibiliPotPlayer\r\n" + " "; + return info; } string GetConfigFile() { @@ -1918,18 +1929,19 @@ string getChatUrl(const string room_id, string server) { uint tickCount; JsonReader Reader; JsonValue Root; - - if (ConfigData.GetDanmujiStatus()) { - unixTime = formatInt(DateTimeToUnixTime(FormatDateTime(datetime()))); - tickCount = HostGetTickCount(); - post(server + "/disconnectRoom?_=" + unixTime); - HostIncTimeOut(HostGetTickCount() - tickCount); + + tickCount = HostGetTickCount(); + while (ConfigData.GetDanmujiStatus()) { + if (HostGetTickCount() - tickCount > 5000) { + post(server + "/disconnectRoom?_=" + unixTime); + ConfigData.SetDanmujiStatus(false); + break; + } + HostSleep(100); } unixTime = formatInt(DateTimeToUnixTime(FormatDateTime(datetime()))); - tickCount = HostGetTickCount(); string res = post(server + "/connectRoom?roomid=" + room_id + "&_=" + unixTime); - HostIncTimeOut(HostGetTickCount() - tickCount); if (!Reader.parse(res, Root) || !Root.isObject()) { log('getChatUrl - connectRoom failed', '!Reader.parse(res, Root) || !Root.isObject()'); From fadbca18a08a2e1dc6b6948a13167fa2330e682f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=AF=92=EF=BC=88Frost=20Lee=EF=BC=89=28lihan02?= =?UTF-8?q?=29?= Date: Sun, 13 Sep 2026 16:00:19 +0800 Subject: [PATCH 132/132] update config --- Media/PlayParse/Bilibili_Config.json | 74 ++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 Media/PlayParse/Bilibili_Config.json diff --git a/Media/PlayParse/Bilibili_Config.json b/Media/PlayParse/Bilibili_Config.json new file mode 100644 index 0000000..8560fd7 --- /dev/null +++ b/Media/PlayParse/Bilibili_Config.json @@ -0,0 +1,74 @@ +{ + "danmaku": { + // 控制是否接收弹幕。按 Alt+H 可显示/隐藏弹幕 + "enable": true, + "server": "", + // 字体 + "font": "微软雅黑 Light", + // 字号 + "fontSize": 24.0, + // 弹幕不透明度,取值范围 0.0 ~ 1.0 + "opacity": 0.3, + // 弹幕显示区域大小,取值范围 0.0 ~ 1.0 + "displayArea": 0.8, + // 弹幕显示时间 + "stayTime": 15.0 + }, + + // 播放单个视频时是否显示推荐的视频 + "showRecommendedVideos": true, + + // 是否显示番剧/电影预告片。 + "showTrailer": false, + + // 是否屏蔽 P2P CDN + "blockP2PCDN": true, + + // 设定请求缓存的时间,单位(s) + "cacheValidTime": 300, + + // 启用空降助手,其域名 ipv6 地址波动较大,如遇到 potplayer 超时问题先禁用 + "enableSponsorBlock": false, + // 空降助手镜像地址 + "sponsorBlockMirror": "", + + // 各类页面的视频生成数量。数字越大视频越多,但会增加加载时间,极端情况会因超时而加载失败,以及触发风控,需谨慎设置。 + "videoNums": { + // “我的动态”页数,默认 50。从 “我的动态” 页面(每次查询20个)过滤出视频,最终数量可能会大于设置的值。 + "webDynamicVideoNums": 50, + // "首页推荐"视频数量,默认 30。从 “推荐” 页面获取的视频数量,最终数量可能会大于设置的值。 + "recommendVideoNums": 30, + // "历史记录"视频数量,默认 30。从 “历史记录” 页面获取的视频数量,最终数量可能会大于设置的值。 + "historyVideoNums": 30, + // “综合热门” 页数,默认 1。(每页查询50个)。 + "popularAllPages": 1, + // 个人“空间动态” 视频数量,默认 30。从 个人“空间动态” 页面获取的视频数量,最终数量可能会大于设置的值。 + "spaceDynamicVideoNums": 30 + }, + + // 直播 + "live": { + // 解析真实 M3U8 地址。不开启,当出现 M3U8 redirect 时,potplayer 会将该播放流名称覆盖为 HLS;若开启,则会尝试解析真实的 M3U8 地址,但会造成额外的请求延迟。当出现 "解析真实M3U8地址" 时间过长时,可以尝试关闭此项。 + "parseM3u8RealUrl": { + "enable": true, + // 快速模式,只对 m3u8RedirectDomain 列表中的域名解析真实 M3U8 地址, 若遇到不在 M3U8 redirect 的域名时,会失效。 + "fastMode": true, + "m3u8RedirectDomains": ["gotcha204b.bilivideo.com"] + }, + // BBilibili_Danmuji 地址。,若存在,观看直播时 potplayer 播放列表侧会出现 Bilibili_Danmuji 窗口,不再需要登录网页收发弹幕。注:需自己部署 Bilibili_Danmuji 服务。 + "bilibiliDanmujiServer": "", + // 直播分区页面查询的最大房间数。 + "maxliveroom": 50, + // 直播 缩略图 使用关键帧截图,仅适用于打开直播分区页面的情况。 + "useSystemCover": true + }, + + // 废弃,经测试对画质选择无影响。 + // 默认:false。少数情况会出现低画质流 itag 高于高画质流的情况,禁用 AVC 可绝对避免此种情况。 + "disableAVC": false, + + // HDR优先。默认:false。跟随官方设定,“8K超高清” itag 高于 “HDR/杜比视界”。设为 true:“杜比视界/HDR真彩色” itag 高于“8K超高清”。 + "preferHDR": true, + + "debug": false +}