mirror of
https://github.com/truewhile/MeBox.git
synced 2026-11-16 04:44:23 +08:00
59 lines
2.4 KiB
TypeScript
59 lines
2.4 KiB
TypeScript
import type { Media } from '../types'
|
|
import { isRemoteEmbyID } from './remoteEmby'
|
|
import { getSeriesKey, isEpisodeLike, pathLooksEpisodic } from './groupSeries'
|
|
|
|
export function mediaSearchLink(query: string, page = 1): string {
|
|
const params = new URLSearchParams({ q: query.trim() })
|
|
if (page > 1) params.set('page', String(page))
|
|
return `/search?${params}`
|
|
}
|
|
|
|
export function mediaSearchReturnPath(state: unknown): string | undefined {
|
|
if (!state || typeof state !== 'object' || !('from' in state)) return undefined
|
|
return typeof state.from === 'string' && state.from.startsWith('/search?') ? state.from : undefined
|
|
}
|
|
|
|
function pathLooksLikeMovie(media: Media): boolean {
|
|
const path = (media.path || media.display_library_path || media.library_path || '').toLowerCase()
|
|
return /[\\/](?:movie|movies|film|films|电影)[\\/]/i.test(path)
|
|
}
|
|
|
|
function isRemoteEmbyLibrarySeries(media: Media): boolean {
|
|
if (!isRemoteEmbyID(media.id) || isEpisodeLike(media)) return false
|
|
const libraryID = media.display_library_id || media.library_id
|
|
if (!libraryID) return false
|
|
return !pathLooksLikeMovie(media)
|
|
}
|
|
|
|
/** Whether opening the library series detail view is a better target than /media/:id. */
|
|
export function prefersLibrarySeriesView(media: Media): boolean {
|
|
if (isEpisodeLike(media)) return true
|
|
if (pathLooksEpisodic(media)) return true
|
|
if (media.series_id) return true
|
|
if (isRemoteEmbyLibrarySeries(media)) return true
|
|
return false
|
|
}
|
|
|
|
/** Series key used by /library/:id?series=... for both local and remote libraries. */
|
|
export function resolveLibrarySeriesKey(media: Media): string {
|
|
if (isRemoteEmbyID(media.id) && !isEpisodeLike(media)) {
|
|
return media.id
|
|
}
|
|
return getSeriesKey(media)
|
|
}
|
|
|
|
/** Best library URL for a media item, or null when /media/:id is preferred. */
|
|
export function mediaLibraryTarget(media: Media): string | null {
|
|
const libraryID = media.display_library_id || media.library_id
|
|
if (!libraryID || !prefersLibrarySeriesView(media)) return null
|
|
|
|
const seriesKey = resolveLibrarySeriesKey(media)
|
|
const base = `/library/${encodeURIComponent(libraryID)}`
|
|
return seriesKey ? `${base}?series=${encodeURIComponent(seriesKey)}` : base
|
|
}
|
|
|
|
/** Link target for favourites / cards that should open the library series view when possible. */
|
|
export function favouriteMediaLink(media: Media): string {
|
|
return mediaLibraryTarget(media) ?? `/media/${media.id}`
|
|
}
|