48 lines
1.2 KiB
TypeScript
48 lines
1.2 KiB
TypeScript
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||
|
||
import { parseString } from 'xml2js';
|
||
|
||
export interface NFOMetadata {
|
||
tmdbId?: number;
|
||
title?: string;
|
||
originalTitle?: string;
|
||
year?: number;
|
||
plot?: string;
|
||
rating?: number;
|
||
genres?: string[];
|
||
mediaType: 'movie' | 'tv';
|
||
}
|
||
|
||
/**
|
||
* 解析 NFO 文件(XML 格式)
|
||
*/
|
||
export async function parseNFO(xmlContent: string): Promise<NFOMetadata | null> {
|
||
return new Promise((resolve) => {
|
||
parseString(xmlContent, { explicitArray: false }, (err, result) => {
|
||
if (err || !result) {
|
||
resolve(null);
|
||
return;
|
||
}
|
||
|
||
const data = result.movie || result.tvshow;
|
||
if (!data) {
|
||
resolve(null);
|
||
return;
|
||
}
|
||
|
||
const metadata: NFOMetadata = {
|
||
tmdbId: data.tmdbid ? parseInt(data.tmdbid) : undefined,
|
||
title: data.title,
|
||
originalTitle: data.originaltitle,
|
||
year: data.year ? parseInt(data.year) : undefined,
|
||
plot: data.plot,
|
||
rating: data.rating ? parseFloat(data.rating) : undefined,
|
||
genres: Array.isArray(data.genre) ? data.genre : data.genre ? [data.genre] : [],
|
||
mediaType: result.movie ? 'movie' : 'tv',
|
||
};
|
||
|
||
resolve(metadata);
|
||
});
|
||
});
|
||
}
|