nfowriter.ts
1 import { Item } from './jellyfin.js'; 2 import * as xmlbuilder2 from 'xmlbuilder2'; 3 4 function rootNfoElemName(itemType: string) { 5 switch (itemType) { 6 case "Movie": 7 return "movie"; 8 case "Series": 9 return "tvshow"; 10 case "Season": 11 return "season"; 12 case "Episode": 13 return "episodedetails"; 14 15 default: 16 throw `Cannot make Nfo for ${itemType}`; 17 } 18 } 19 20 export function makeNfo(item: Item) { 21 const doc = xmlbuilder2.create({ version: '1.0', encoding: 'utf-8' }); 22 const root = doc.ele(rootNfoElemName(item.Type!)); 23 root.ele("plot").txt(item.Overview ?? ""); 24 root.ele("title").txt(item.Name ?? ""); 25 item.OriginalTitle && root.ele("originaltitle").txt(item.OriginalTitle); 26 item.ProductionYear && root.ele("year").txt(item.ProductionYear.toString()); 27 item.ProviderIds?.Tvdb && root.ele("tvdbid").txt(item.ProviderIds?.Tvdb); 28 item.ProviderIds?.Imdb && root.ele(item.Type === "Series" ? "imdb_id" : "imdbid").txt(item.ProviderIds?.Imdb); 29 item.ProviderIds?.TvRage && root.ele("tvrageid").txt(item.ProviderIds?.TvRage); 30 item.ProviderIds?.Tmdb && root.ele("tmdbid").txt(item.ProviderIds?.Tmdb); 31 item.DisplayOrder && root.ele("displayorder").txt(item.DisplayOrder); 32 33 switch (item.Type) { 34 case "Series": 35 root.ele("season").txt("-1"); 36 root.ele("episode").txt("-1"); 37 break; 38 case "Season": 39 root.ele("seasonnumber").txt(item.IndexNumber!.toString()); 40 break; 41 case "Episode": 42 root.ele("season").txt(item.ParentIndexNumber!.toString()); 43 item.IndexNumber && root.ele("episode").txt(item.IndexNumber.toString()); 44 item.IndexNumberEnd && root.ele("episodenumberend").txt(item.IndexNumberEnd.toString()); 45 item.AirsAfterSeasonNumber && root.ele("airsafter_season").txt(item.AirsAfterSeasonNumber.toString()); 46 item.AirsBeforeEpisodeNumber && root.ele("airbefore_episode").txt(item.AirsBeforeEpisodeNumber.toString()); 47 item.AirsBeforeSeasonNumber && root.ele("airsbefore_season").txt(item.AirsBeforeSeasonNumber.toString()); 48 break; 49 case "Movie": 50 break; 51 default: 52 break; 53 } 54 return doc.end({ prettyPrint: true }); 55 }