* reorganize metadata parsing; only attempt to parse appropriate media type based on media source configuration * add fallback metadata for movie sources * only request read access for nfo metadata * fix tests
77 lines
2.4 KiB
C#
77 lines
2.4 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Text.RegularExpressions;
|
|
using ErsatzTV.Core.Domain;
|
|
|
|
namespace ErsatzTV.Core.Metadata
|
|
{
|
|
public static class FallbackMetadataProvider
|
|
{
|
|
public static MediaMetadata GetFallbackMetadata(MediaItem mediaItem)
|
|
{
|
|
string fileName = Path.GetFileName(mediaItem.Path);
|
|
var metadata = new MediaMetadata { Title = fileName ?? mediaItem.Path };
|
|
|
|
if (fileName != null)
|
|
{
|
|
if (!(mediaItem.Source is LocalMediaSource localMediaSource))
|
|
{
|
|
return metadata;
|
|
}
|
|
|
|
return localMediaSource.MediaType switch
|
|
{
|
|
MediaType.TvShow => GetTvShowMetadata(fileName, metadata),
|
|
MediaType.Movie => GetMovieMetadata(fileName, metadata),
|
|
_ => metadata
|
|
};
|
|
}
|
|
|
|
return metadata;
|
|
}
|
|
|
|
private static MediaMetadata GetTvShowMetadata(string fileName, MediaMetadata metadata)
|
|
{
|
|
try
|
|
{
|
|
const string PATTERN = @"^(.*?)[.\s-]+[sS](\d+)[eE](\d+).*\.\w+$";
|
|
Match match = Regex.Match(fileName, PATTERN);
|
|
if (match.Success)
|
|
{
|
|
metadata.MediaType = MediaType.TvShow;
|
|
metadata.Title = match.Groups[1].Value;
|
|
metadata.SeasonNumber = int.Parse(match.Groups[2].Value);
|
|
metadata.EpisodeNumber = int.Parse(match.Groups[3].Value);
|
|
}
|
|
}
|
|
catch (Exception)
|
|
{
|
|
// ignored
|
|
}
|
|
|
|
return metadata;
|
|
}
|
|
|
|
private static MediaMetadata GetMovieMetadata(string fileName, MediaMetadata metadata)
|
|
{
|
|
try
|
|
{
|
|
const string PATTERN = @"^(.*?)[.\(](\d{4})[.\)].*\.\w+$";
|
|
Match match = Regex.Match(fileName, PATTERN);
|
|
if (match.Success)
|
|
{
|
|
metadata.MediaType = MediaType.Movie;
|
|
metadata.Title = match.Groups[1].Value;
|
|
metadata.Aired = new DateTime(int.Parse(match.Groups[2].Value), 1, 1);
|
|
}
|
|
}
|
|
catch (Exception)
|
|
{
|
|
// ignored
|
|
}
|
|
|
|
return metadata;
|
|
}
|
|
}
|
|
}
|