Files
MeBox/web/src/pages/librariesPageModel.ts
T
truewhile 54b0e33968 优化
2026-10-22 00:44:37 +08:00

55 lines
1.9 KiB
TypeScript

import type { Library, Media } from '../types'
import { artworkScore, groupSeries, type SeriesCard } from '../utils/groupSeries'
export type LibraryPreview = {
library: Library
items?: Media[]
total: number
cards: SeriesCard[]
}
export function isSeriesLibraryType(type?: string) {
return type === 'tv' || type === 'anime' || type === 'variety'
}
export function latestLibraryCards(items: Media[]): SeriesCard[] {
return groupSeries(items)
.sort((a, b) => mediaTime(b.rep) - mediaTime(a.rep) || artworkScore(b.rep) - artworkScore(a.rep))
.slice(0, 10)
}
export function mediaTime(media: Media): number {
const releaseTime = Date.parse(media.release_date || '')
if (releaseTime) return releaseTime
if (media.year > 0) return Date.UTC(media.year, 11, 31)
return Date.parse(media.updated_at || media.created_at || '') || 0
}
export function libraryArtworkItems(cards: SeriesCard[] = []): Array<{ src: string; version?: string }> {
return [...cards]
.sort((a, b) => artworkScore(b.rep) - artworkScore(a.rep) || mediaTime(b.rep) - mediaTime(a.rep))
.map((card) => ({
src: card.rep.poster_url || card.rep.backdrop_url || '',
version: card.rep.updated_at,
}))
.filter((item) => Boolean(item.src))
.slice(0, 2)
}
export function getLibraryArtworks(
library: Library,
cards: SeriesCard[] = [],
): Array<{ src: string; version?: string }> {
if (library.cover_url) {
return [{ src: library.cover_url, version: library.updated_at }]
}
// 服务端生成的库封面(成员海报竖切拼图):所有客户端共用一张图,
// 不再由前端拿两张卡片自己拼格子。
// version 里带一个版次后缀:接口地址是固定的,靠它让浏览器在拼图规则
// 调整(如田字格改成竖切)后丢掉旧缓存重新拉图。
if (library.cover_image_url) {
return [{ src: library.cover_image_url, version: `${library.updated_at}-c3` }]
}
return libraryArtworkItems(cards)
}