增加桜色动漫数据源

This commit is contained in:
mtvpls
2026-07-21 15:51:40 +08:00
parent f7e0529394
commit d54cf65927
10 changed files with 99 additions and 28 deletions
+35 -15
View File
@@ -1,6 +1,26 @@
'use client';
export type AnimeDataSource = 'direct' | 'server-proxy' | 'custom-baseurl';
export type AnimeDataSource =
| 'direct'
| 'server-proxy'
| 'custom-baseurl'
| 'sakura';
/** 桜色镜像站:全域名镜像 bgm.tv → bangumi.lol */
export const BANGUMI_SAKURA_API_BASE_URL = 'https://api.bangumi.lol';
export const BANGUMI_SAKURA_SITE_URL = 'https://bangumi.lol';
export const BANGUMI_OFFICIAL_SITE_URL = 'https://bgm.tv';
export function isValidAnimeDataSource(
value: string | null | undefined
): value is AnimeDataSource {
return (
value === 'direct' ||
value === 'server-proxy' ||
value === 'custom-baseurl' ||
value === 'sakura'
);
}
export interface BangumiCalendarData {
weekday: {
@@ -63,22 +83,14 @@ function getPrimaryAnimeDataSource(): AnimeDataSource {
const saved = localStorage.getItem(
'animeDataSource'
) as AnimeDataSource | null;
if (
saved === 'direct' ||
saved === 'server-proxy' ||
saved === 'custom-baseurl'
) {
if (isValidAnimeDataSource(saved)) {
return saved;
}
const runtimeValue = getRuntimeConfig().BANGUMI_DATA_SOURCE as
| AnimeDataSource
| undefined;
if (
runtimeValue === 'direct' ||
runtimeValue === 'server-proxy' ||
runtimeValue === 'custom-baseurl'
) {
if (isValidAnimeDataSource(runtimeValue)) {
return runtimeValue;
}
@@ -94,10 +106,7 @@ function getBackupAnimeDataSource(
const saved = localStorage.getItem(
'animeDataSourceBackup'
) as AnimeDataSource | null;
const backup =
saved === 'direct' || saved === 'server-proxy' || saved === 'custom-baseurl'
? saved
: 'server-proxy';
const backup = isValidAnimeDataSource(saved) ? saved : 'server-proxy';
return backup === primary ? null : backup;
}
@@ -120,12 +129,23 @@ function buildBangumiUrl(source: AnimeDataSource, path: string): string {
}
return `${customBaseUrl}${normalizedPath}`;
}
case 'sakura':
return `${BANGUMI_SAKURA_API_BASE_URL}${normalizedPath}`;
case 'direct':
default:
return `${BANGUMI_OFFICIAL_BASE_URL}${normalizedPath}`;
}
}
/** 按当前动漫数据源生成 Bangumi 条目外链(桜色镜像站 → bangumi.lol */
export function getBangumiSubjectUrl(id: string | number): string {
const origin =
getPrimaryAnimeDataSource() === 'sakura'
? BANGUMI_SAKURA_SITE_URL
: BANGUMI_OFFICIAL_SITE_URL;
return `${origin}/subject/${encodeURIComponent(String(id))}`;
}
async function fetchBangumiJson<T>(
source: AnimeDataSource,
path: string