From 9fdcd652331fb90e12324b8115316e315952f3ff Mon Sep 17 00:00:00 2001 From: huangxd- <649924757@qq.com> Date: Sat, 20 Sep 2025 09:51:07 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=AF=B7=E6=B1=82renren?= =?UTF-8?q?=E5=A4=B1=E8=B4=A5=E7=9B=B4=E6=8E=A5=E4=B8=8D=E8=BF=94=E5=9B=9E?= =?UTF-8?q?=E5=85=B6=E4=BB=96=E7=AB=99=E7=82=B9=E4=BF=A1=E6=81=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 --- danmu_api/worker.js | 69 +++++++++++++++++++++------------------- danmu_api/worker.test.js | 66 +++++++++++++++++++------------------- 2 files changed, 70 insertions(+), 65 deletions(-) diff --git a/danmu_api/worker.js b/danmu_api/worker.js index d9c3da3..8632f4a 100644 --- a/danmu_api/worker.js +++ b/danmu_api/worker.js @@ -2206,40 +2206,45 @@ async function performNetworkSearch( minInterval = 500 // 默认节流间隔(毫秒) } = {} ) { - const url = `https://api.rrmj.plus/m-station/search/drama`; - const params = { keywords: keyword, size: 20, order: "match", search_after: "", isExecuteVipActivity: true }; + try { + const url = `https://api.rrmj.plus/m-station/search/drama`; + const params = { keywords: keyword, size: 20, order: "match", search_after: "", isExecuteVipActivity: true }; - // 🔒 锁逻辑(可选) - if (lockRef) { - while (lockRef.value) await new Promise(r => setTimeout(r, 50)); - lockRef.value = true; + // 🔒 锁逻辑(可选) + if (lockRef) { + while (lockRef.value) await new Promise(r => setTimeout(r, 50)); + lockRef.value = true; + } + + // ⏱️ 节流逻辑(依赖 lastRequestTimeRef) + const now = Date.now(); + const dt = now - lastRequestTimeRef.value; + if (dt < minInterval) await new Promise(r => setTimeout(r, minInterval - dt)); + + const resp = await renrenRequest("GET", url, params); + lastRequestTimeRef.value = Date.now(); // 更新引用 + + if (lockRef) lockRef.value = false; + + if (!resp.data) return []; + + const decoded = autoDecode(resp.data); + const list = decoded?.data?.searchDramaList || []; + return list.map((item, idx) => ({ + provider: "renren", + mediaId: String(item.id), + title: String(item.title || "").replace(/<[^>]+>/g, "").replace(/:/g, ":"), + type: "tv_series", + season: null, + year: item.year, + imageUrl: item.cover, + episodeCount: item.episodeTotal, + currentEpisodeIndex: episodeInfo?.episode ?? null, + })); + } catch (error) { + log("error", `getRenrenAnimes error: ${error.message}`); + return []; } - - // ⏱️ 节流逻辑(依赖 lastRequestTimeRef) - const now = Date.now(); - const dt = now - lastRequestTimeRef.value; - if (dt < minInterval) await new Promise(r => setTimeout(r, minInterval - dt)); - - const resp = await renrenRequest("GET", url, params); - lastRequestTimeRef.value = Date.now(); // 更新引用 - - if (lockRef) lockRef.value = false; - - if (!resp.data) return []; - - const decoded = autoDecode(resp.data); - const list = decoded?.data?.searchDramaList || []; - return list.map((item, idx) => ({ - provider: "renren", - mediaId: String(item.id), - title: String(item.title || "").replace(/<[^>]+>/g, "").replace(/:/g, ":"), - type: "tv_series", - season: null, - year: item.year, - imageUrl: item.cover, - episodeCount: item.episodeTotal, - currentEpisodeIndex: episodeInfo?.episode ?? null, - })); } // --------------------- diff --git a/danmu_api/worker.test.js b/danmu_api/worker.test.js index 1d6608c..3136f7d 100644 --- a/danmu_api/worker.test.js +++ b/danmu_api/worker.test.js @@ -52,10 +52,10 @@ test('worker.js API endpoints', async (t) => { // assert(res.length > 2, `Expected res.length > 2, but got ${res.length}`); // }); - await t.test('GET bilibili danmu', async () => { - const res = await fetchBilibili("https://www.bilibili.com/bangumi/play/ep1231564"); - assert(res.length > 2, `Expected res.length > 2, but got ${res.length}`); - }); + // await t.test('GET bilibili danmu', async () => { + // const res = await fetchBilibili("https://www.bilibili.com/bangumi/play/ep1231564"); + // assert(res.length > 2, `Expected res.length > 2, but got ${res.length}`); + // }); // await t.test('GET youku danmu', async () => { // const res = await fetchYouku("https://v.youku.com/v_show/id_XNjQ3ODMyNjU3Mg==.html"); @@ -67,35 +67,35 @@ test('worker.js API endpoints', async (t) => { // assert(res.length > 2, `Expected res.length > 2, but got ${res.length}`); // }); - // await t.test('GET realistic danmu', async () => { - // // tencent - // // const keyword = "子夜归"; - // // iqiyi - // // const keyword = "赴山海"; - // // mango - // // const keyword = "锦月如歌"; - // // bilibili - // // const keyword = "国王排名"; - // // youku - // // const keyword = "黑白局"; - // // renren - // const keyword = "瑞克和莫蒂"; - // - // const searchUrl = new URL(`${urlPrefix}/${token}/api/v2/search/anime?keyword=${keyword}`); - // const searchRes = await searchAnime(searchUrl); - // const searchData = await searchRes.json(); - // assert(searchData.animes.length > 0, `Expected searchData.animes.length > 0, but got ${searchData.animes.length}`); - // - // const bangumiUrl = new URL(`${urlPrefix}/${token}/api/v2/bangumi/${searchData.animes[0].animeId}`); - // const bangumiRes = await getBangumi(bangumiUrl.pathname); - // const bangumiData = await bangumiRes.json(); - // assert(bangumiData.bangumi.episodes.length > 0, `Expected bangumiData.bangumi.episodes.length > 0, but got ${bangumiData.bangumi.episodes.length}`); - // - // const commentUrl = new URL(`${urlPrefix}/${token}/api/v2/comment/${bangumiData.bangumi.episodes[0].episodeId}?withRelated=true&chConvert=1`); - // const commentRes = await getComment(commentUrl.pathname); - // const commentData = await commentRes.json(); - // assert(commentData.count > 0, `Expected commentData.count > 0, but got ${commentData.count}`); - // }); + await t.test('GET realistic danmu', async () => { + // tencent + // const keyword = "子夜归"; + // iqiyi + // const keyword = "赴山海"; + // mango + // const keyword = "锦月如歌"; + // bilibili + // const keyword = "国王排名"; + // youku + // const keyword = "黑白局"; + // renren + const keyword = "瑞克和莫蒂"; + + const searchUrl = new URL(`${urlPrefix}/${token}/api/v2/search/anime?keyword=${keyword}`); + const searchRes = await searchAnime(searchUrl); + const searchData = await searchRes.json(); + assert(searchData.animes.length > 0, `Expected searchData.animes.length > 0, but got ${searchData.animes.length}`); + + const bangumiUrl = new URL(`${urlPrefix}/${token}/api/v2/bangumi/${searchData.animes[0].animeId}`); + const bangumiRes = await getBangumi(bangumiUrl.pathname); + const bangumiData = await bangumiRes.json(); + assert(bangumiData.bangumi.episodes.length > 0, `Expected bangumiData.bangumi.episodes.length > 0, but got ${bangumiData.bangumi.episodes.length}`); + + const commentUrl = new URL(`${urlPrefix}/${token}/api/v2/comment/${bangumiData.bangumi.episodes[0].episodeId}?withRelated=true&chConvert=1`); + const commentRes = await getComment(commentUrl.pathname); + const commentData = await commentRes.json(); + assert(commentData.count > 0, `Expected commentData.count > 0, but got ${commentData.count}`); + }); // // 测试 POST /api/v2/match 接口 // await t.test('POST /api/v2/match for matching anime', async () => {