Browse Source

reorganize metadata parsing; only attempt to parse appropriate media type based on media source configuration

pull/9/head
Jason Dove 6 years ago
parent
commit
993d943041
  1. 106
      ErsatzTV.Core/Metadata/LocalMetadataProvider.cs

106
ErsatzTV.Core/Metadata/LocalMetadataProvider.cs

@ -1,6 +1,5 @@
using System; using System;
using System.IO; using System.IO;
using System.Text.RegularExpressions;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Xml.Serialization; using System.Xml.Serialization;
using ErsatzTV.Core.Domain; using ErsatzTV.Core.Domain;
@ -13,6 +12,9 @@ namespace ErsatzTV.Core.Metadata
{ {
public class LocalMetadataProvider : ILocalMetadataProvider public class LocalMetadataProvider : ILocalMetadataProvider
{ {
private static readonly XmlSerializer MovieSerializer = new(typeof(MovieNfo));
private static readonly XmlSerializer TvShowSerializer = new(typeof(TvShowEpisodeNfo));
private readonly IMediaItemRepository _mediaItemRepository; private readonly IMediaItemRepository _mediaItemRepository;
public LocalMetadataProvider(IMediaItemRepository mediaItemRepository) => public LocalMetadataProvider(IMediaItemRepository mediaItemRepository) =>
@ -53,51 +55,65 @@ namespace ErsatzTV.Core.Metadata
return None; return None;
} }
var tvShowSerializer = new XmlSerializer(typeof(TvShowEpisodeNfo)); if (!(mediaItem.Source is LocalMediaSource localMediaSource))
var movieSerializer = new XmlSerializer(typeof(MovieNfo)); {
return None;
TryAsync<object> tvShowAttempt = TryAsync( }
async () =>
{ return localMediaSource.MediaType switch
await using FileStream fileStream = File.Open(nfoFileName, FileMode.Open); {
return tvShowSerializer.Deserialize(fileStream); MediaType.Movie => await LoadMovieMetadata(nfoFileName),
}); MediaType.TvShow => await LoadTvShowMetadata(nfoFileName),
TryAsync<object> movieAttempt = TryAsync( _ => None
async () => };
{ }
await using FileStream fileStream = File.Open(nfoFileName, FileMode.Open);
return movieSerializer.Deserialize(fileStream); private static async Task<Option<MediaMetadata>> LoadTvShowMetadata(string nfoFileName)
}); {
return await choice(tvShowAttempt, movieAttempt).Match<object, Option<MediaMetadata>>( try
result => {
{ await using FileStream fileStream = File.Open(nfoFileName, FileMode.Open);
switch (result) Option<TvShowEpisodeNfo> maybeNfo = TvShowSerializer.Deserialize(fileStream) as TvShowEpisodeNfo;
return maybeNfo.Match<Option<MediaMetadata>>(
nfo => new MediaMetadata
{ {
case TvShowEpisodeNfo nfo: MediaType = MediaType.TvShow,
return new MediaMetadata Title = nfo.ShowTitle,
{ Subtitle = nfo.Title,
MediaType = MediaType.TvShow, Description = nfo.Outline,
Title = nfo.ShowTitle, EpisodeNumber = nfo.Episode,
Subtitle = nfo.Title, SeasonNumber = nfo.Season,
Description = nfo.Outline, Aired = GetAired(nfo.Aired)
EpisodeNumber = nfo.Episode, },
SeasonNumber = nfo.Season, None);
Aired = GetAired(nfo.Aired) }
}; catch (Exception)
case MovieNfo nfo: {
return new MediaMetadata return None;
{ }
MediaType = MediaType.Movie, }
Title = nfo.Title,
Description = nfo.Outline, private static async Task<Option<MediaMetadata>> LoadMovieMetadata(string nfoFileName)
ContentRating = nfo.ContentRating, {
Aired = GetAired(nfo.Premiered) try
}; {
default: await using FileStream fileStream = File.Open(nfoFileName, FileMode.Open);
return None; Option<MovieNfo> maybeNfo = MovieSerializer.Deserialize(fileStream) as MovieNfo;
} return maybeNfo.Match<Option<MediaMetadata>>(
}, nfo => new MediaMetadata
None); {
MediaType = MediaType.Movie,
Title = nfo.Title,
Description = nfo.Outline,
ContentRating = nfo.ContentRating,
Aired = GetAired(nfo.Premiered)
},
None);
}
catch (Exception)
{
return None;
}
} }
private static DateTime? GetAired(string aired) private static DateTime? GetAired(string aired)

Loading…
Cancel
Save