From ea894bf2fafd6c3fbb7e7eda689adf1ee33d1d0c Mon Sep 17 00:00:00 2001 From: Dale Wahl Date: Tue, 18 Nov 2025 15:36:25 +0100 Subject: [PATCH 1/4] bilibili initial --- images/platform-icons/bilibili.png | Bin 0 -> 674 bytes manifest.json | 1 + modules/bilibili.js | 66 +++++++++++++++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 images/platform-icons/bilibili.png create mode 100644 modules/bilibili.js diff --git a/images/platform-icons/bilibili.png b/images/platform-icons/bilibili.png new file mode 100644 index 0000000000000000000000000000000000000000..3162d266c926043d78182ce351b14f764be29f68 GIT binary patch literal 674 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7e6l0AZa85pY67#JE_7#My5g&JNk zFq9fFFuY1&V6d9Oz#v{QXIG#NP@*)zC&cyt|NjgNuhA0$ZIs-xM;GV-)si5;UxsnHi}|O&M11W#1k}Ko21szvLF;R+CwMwJsGXbk)_1y1Y`qJ{|rY$WsTvH40G(Qg(xo^FzZ`C{}1_ni=KLI98DsvK2HTcq146br2 zpK)$ux!WC=t-4``dVHgg+-50-h=l=`bz>_^8 zd+9M-KDBv$S$8(pCME?vF{{&m<2`$M*4yQkh8I)kJ-PLN4!isvN5lPs%zm0Xkxq!^40j7)V64RsAILJSS9j4iB;EVK;_tPBixIctLAShWPEAvZrIGp!Q0 phSPEr8-N-#;2KIYb5n~;5_1c1>zTv7As(oQ!PC{xWt~$(69E5^0}}uM literal 0 HcmV?d00001 diff --git a/manifest.json b/manifest.json index c1d4638..ef52bc2 100644 --- a/manifest.json +++ b/manifest.json @@ -38,6 +38,7 @@ "inc/he.js", "js/lib.js", "js/zs-background.js", + "modules/bilibili.js", "modules/tiktok.js", "modules/tiktok-comments.js", "modules/instagram.js", diff --git a/modules/bilibili.js b/modules/bilibili.js new file mode 100644 index 0000000..bf44d62 --- /dev/null +++ b/modules/bilibili.js @@ -0,0 +1,66 @@ +zeeschuimer.register_module( + 'Bilibili', + 'bilibili.com', + function (response, source_platform_url, source_url) { + let domain = source_platform_url.split("/")[2].toLowerCase().replace(/^www\./, ''); + if (!["bilibili.com"].includes(domain)) { + return []; + } + + if (!response) { + return []; + } + + let data; + try { + data = JSON.parse(response); + } catch (SyntaxError) { + return []; + } + + let found_items; + let type_of_item; + if (typeof data !== 'object' || !("data" in data) || typeof data["data"] !== 'object' ) { + return []; + // some Bilibili API responses use "item", some "archives" + } else if (("item" in data["data"]) && Array.isArray(data["data"]["item"])) { + // Main display items array + type_of_item = "main item array"; + found_items = data["data"]["item"]; + } else if (("archives" in data["data"]) && Array.isArray(data["data"]["archives"])) { + // Main display items array; on channel pages + type_of_item = "main archives array"; + found_items = data["data"]["archives"]; + } else if (("items" in data["data"]) && Array.isArray(data["data"]["items"])) { + // "Hot" cards that are added to the main display items array + // It appears that only one is used from the array, but not always the first... + type_of_item = "hot item array"; + found_items = data["data"]["items"]; + } else if (("recommend_room_list" in data["data"]) && Array.isArray(data["data"]["recommend_room_list"])) { + // Live room recommendations added to the main display items array + // Also appears that only one item in the array is used, but randomly + type_of_item = "recommend room list array"; + found_items = []; + for (let item of data["data"]["recommend_room_list"]) { + item["id"] = item["roomid"]; + found_items.push(item); + } + } else { + // No recognized items found + return []; + } + console.log(`Bilibili module found (${type_of_item}) items in ${source_url}:`); + + i = 0; + for (let item of found_items) { + i++; + if (typeof item == 'object' || ('title' in item)) { + console.log(`${i}: ${item['title']}`); + } else { + console.log(`Invalid item ${i} in ${type_of_item}:`); + console.log(item); + } + } + return found_items; + } +); \ No newline at end of file From 89b2de9b114c8d72a2578bc6fa2c9f8b13376bab Mon Sep 17 00:00:00 2001 From: Dale Wahl Date: Tue, 18 Nov 2025 15:39:43 +0100 Subject: [PATCH 2/4] not on HTML extraction --- modules/bilibili.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/bilibili.js b/modules/bilibili.js index bf44d62..96de562 100644 --- a/modules/bilibili.js +++ b/modules/bilibili.js @@ -11,6 +11,8 @@ zeeschuimer.register_module( return []; } + // TODO parse initial HTML? No embedded JSON, but first few items are in the HTML and a really gross script tag with JS variables + let data; try { data = JSON.parse(response); From 866034f1cadb0dbc2dcd1aa5c67338ed0c66c327 Mon Sep 17 00:00:00 2001 From: Dale Wahl Date: Thu, 20 Nov 2025 15:16:41 +0100 Subject: [PATCH 3/4] pinia parser! extract embedded video data from pinia function --- manifest.json | 1 + modules/bilibili.js | 34 ++- modules/bilibili_pinia_parser.js | 398 +++++++++++++++++++++++++++++++ 3 files changed, 430 insertions(+), 3 deletions(-) create mode 100644 modules/bilibili_pinia_parser.js diff --git a/manifest.json b/manifest.json index ef52bc2..532d4a4 100644 --- a/manifest.json +++ b/manifest.json @@ -38,6 +38,7 @@ "inc/he.js", "js/lib.js", "js/zs-background.js", + "modules/bilibili_pinia_parser.js", "modules/bilibili.js", "modules/tiktok.js", "modules/tiktok-comments.js", diff --git a/modules/bilibili.js b/modules/bilibili.js index 96de562..d891c83 100644 --- a/modules/bilibili.js +++ b/modules/bilibili.js @@ -11,17 +11,45 @@ zeeschuimer.register_module( return []; } - // TODO parse initial HTML? No embedded JSON, but first few items are in the HTML and a really gross script tag with JS variables + let found_items; + let type_of_item; + // Try to parse as JSON first (API responses) let data; try { data = JSON.parse(response); } catch (SyntaxError) { + // Not JSON - might be HTML with embedded __pinia data + if (typeof response === 'string' && response.includes('window.__pinia')) { + console.log('Bilibili module: Detected HTML with __pinia, attempting to parse'); + + // Extract the script tag or line containing window.__pinia + // Look for the line - it should be in a