feat: Update nhiều thứ

This commit is contained in:
ngthanhvu
2026-07-28 21:55:39 -04:00
parent 72bc657d86
commit 1c92c0d50b
14 changed files with 173 additions and 129 deletions
+4 -6
View File
@@ -45,13 +45,11 @@ export default defineEventHandler(async (event) => {
if ('customServers' in body) {
updates.customServers = Array.isArray(body.customServers) && body.customServers.length
? body.customServers
.filter((server: any) => server.name?.trim())
.map((server: any) => ({
name: server.name.trim(),
? body.customServers.map((server: any) => ({
name: server.name?.trim() || `Server ${body.customServers.indexOf(server) + 1}`,
episodes: Array.isArray(server.episodes)
? server.episodes.filter((ep: any) => ep.name?.trim()).map((ep: any) => ({
name: ep.name.trim(),
? server.episodes.filter((ep: any) => ep.linkEmbed?.trim() || ep.linkM3u8?.trim() || ep.name?.trim()).map((ep: any) => ({
name: ep.name?.trim() || '',
linkEmbed: ep.linkEmbed?.trim() || null,
linkM3u8: ep.linkM3u8?.trim() || null,
}))
+7 -4
View File
@@ -3,10 +3,13 @@ import { eq, and } from 'drizzle-orm'
import type { MovieDetail, NormalizedServer } from '../../utils/movies'
function mapCustomServers(movie: any): NormalizedServer[] {
const servers = movie.customServers || movie.custom_servers
if (!Array.isArray(servers) || !servers.length) return []
let raw = movie.customServers ?? movie.custom_servers
if (typeof raw === 'string') {
try { raw = JSON.parse(raw) } catch { raw = null }
}
if (!Array.isArray(raw) || !raw.length) return []
return servers.map((server: any) => ({
return raw.map((server: any) => ({
name: String(server.name || 'Server'),
source: movie.source,
sourceSlug: movie.slug,
@@ -14,7 +17,7 @@ function mapCustomServers(movie: any): NormalizedServer[] {
name: String(ep.name || ''),
linkEmbed: ep.linkEmbed || undefined,
linkM3u8: ep.linkM3u8 || undefined,
})).filter((ep: any) => ep.name || ep.linkEmbed || ep.linkM3u8),
})).filter((ep: any) => ep.linkEmbed || ep.linkM3u8 || ep.name),
})).filter((server: any) => server.episodes.length)
}
+30 -1
View File
@@ -27,6 +27,8 @@ export interface MovieSourceRef {
source: Source
slug: string
name?: string
episode?: string
episodeTotal?: string
}
export interface NormalizedEpisode {
@@ -179,6 +181,8 @@ function movieSourceRef(movie: NormalizedMovie): MovieSourceRef {
source: movie.source,
slug: movie.slug,
name: movie.name,
episode: movie.episode,
episodeTotal: movie.episodeTotal,
}
}
@@ -200,6 +204,16 @@ function interleaveMovies(groups: NormalizedMovie[][]) {
return interleaved
}
function extractEpisodeNumber(value?: string): number {
if (!value) return 0
const match = value.match(/(\d+)(?:\/\d+)?\s*$/)
if (!match) {
const anyNumber = value.match(/\d+/)
return anyNumber ? Number(anyNumber[0]) : 0
}
return Number(match[1])
}
export function groupMovies(items: NormalizedMovie[]) {
const groups = new Map<string, NormalizedMovie>()
const exactAliases = new Map<string, string>()
@@ -243,7 +257,11 @@ export function groupMovies(items: NormalizedMovie[]) {
continue
}
if (!existing.sources?.some((source) => source.source === movie.source && source.slug === movie.slug)) {
const existingRef = existing.sources?.find((source) => source.source === movie.source && source.slug === movie.slug)
if (existingRef) {
existingRef.episode = movie.episode
existingRef.episodeTotal = movie.episodeTotal
} else {
existing.sources = [...(existing.sources || []), movieSourceRef(movie)]
}
@@ -257,6 +275,17 @@ export function groupMovies(items: NormalizedMovie[]) {
? (new Date(existing.updatedAt).getTime() > new Date(movie.updatedAt).getTime() ? existing.updatedAt : movie.updatedAt)
: existing.updatedAt || movie.updatedAt
const existingCurrent = extractEpisodeNumber(existing.episode)
const newCurrent = extractEpisodeNumber(movie.episode)
if (newCurrent > existingCurrent) {
existing.episode = movie.episode
}
const existingTotal = extractEpisodeNumber(existing.episodeTotal)
const newTotal = extractEpisodeNumber(movie.episodeTotal)
if (newTotal > existingTotal) {
existing.episodeTotal = movie.episodeTotal
}
for (const alias of aliases) {
if (movie.year) exactAliases.set(`${alias}:${movie.year}`, groupKey)
rememberLooseAlias(alias, groupKey)