diff --git a/packages/backend/src/lib/adapters/bilibili.ts b/packages/backend/src/lib/adapters/bilibili.ts index 749ab54..2ea0a41 100644 --- a/packages/backend/src/lib/adapters/bilibili.ts +++ b/packages/backend/src/lib/adapters/bilibili.ts @@ -1,6 +1,13 @@ import type { ContentItem, PlatformAdapter } from "@muse/shared"; import { tikhubFetch } from "../tikhub"; +/** Ensure Bilibili URLs use https:// (API may return protocol-relative "//..." or http) */ +function normalizeUrl(url: string): string { + if (url.startsWith("//")) return `https:${url}`; + if (url.startsWith("http://")) return url.replace("http://", "https://"); + return url; +} + export class BilibiliAdapter implements PlatformAdapter { async fetchTrending(count: number): Promise { // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -44,10 +51,10 @@ export class BilibiliAdapter implements PlatformAdapter { return { id: String(aid || bvid), title: raw?.title || "无标题", - cover_url: raw?.pic || undefined, + cover_url: raw?.pic ? normalizeUrl(raw.pic) : undefined, video_url: undefined, author_name: owner?.name || raw?.author || "未知作者", - author_avatar: owner?.face || undefined, + author_avatar: owner?.face ? normalizeUrl(owner.face) : undefined, play_count: stat?.view ?? undefined, like_count: stat?.like ?? undefined, collect_count: stat?.favorite ?? undefined, diff --git a/packages/frontend/src/components/card/ContentCard.tsx b/packages/frontend/src/components/card/ContentCard.tsx index 3ff62fa..e91f4c5 100644 --- a/packages/frontend/src/components/card/ContentCard.tsx +++ b/packages/frontend/src/components/card/ContentCard.tsx @@ -35,6 +35,7 @@ export function ContentCard({ item }: ContentCardProps) { alt={item.title} fill unoptimized + referrerPolicy="no-referrer" className="object-cover" loading="lazy" sizes="(max-width: 640px) 100vw, (max-width: 960px) 50vw, (max-width: 1240px) 33vw, 25vw" @@ -84,6 +85,7 @@ export function ContentCard({ item }: ContentCardProps) { width={20} height={20} unoptimized + referrerPolicy="no-referrer" className="rounded-full object-cover" onError={(e) => { (e.target as HTMLImageElement).style.display = "none"; diff --git a/packages/frontend/src/components/detail/DetailPanel.tsx b/packages/frontend/src/components/detail/DetailPanel.tsx index b58f8ba..6bbf0d7 100644 --- a/packages/frontend/src/components/detail/DetailPanel.tsx +++ b/packages/frontend/src/components/detail/DetailPanel.tsx @@ -46,6 +46,7 @@ export function DetailPanel({ item }: DetailPanelProps) { alt={item.title} fill unoptimized + referrerPolicy="no-referrer" className="object-cover" priority sizes="(max-width: 768px) 100vw, 768px" @@ -87,6 +88,7 @@ export function DetailPanel({ item }: DetailPanelProps) { width={40} height={40} unoptimized + referrerPolicy="no-referrer" className="rounded-full object-cover" onError={(e) => { (e.target as HTMLImageElement).style.display = "none";