/ src / nfowriter.ts
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  }