using System; using System.IO; using Emby.Naming.Common; using Emby.Naming.Video; using Jellyfin.Extensions; namespace Emby.Naming.TV { /// /// Used to resolve information about episode from path. /// public class EpisodeResolver { private readonly NamingOptions _options; /// /// Initializes a new instance of the class. /// /// object containing VideoFileExtensions and passed to , and . public EpisodeResolver(NamingOptions options) { _options = options; } /// /// Resolve information about episode from path. /// /// Path. /// Is path for a directory or file. /// Do we want to use IsNamed expressions. /// Do we want to use Optimistic expressions. /// Do we want to use expressions supporting absolute episode numbers. /// Should we attempt to retrieve extended information. /// Returns null or object if successful. public EpisodeInfo? Resolve( string path, bool isDirectory, bool? isNamed = null, bool? isOptimistic = null, bool? supportsAbsoluteNumbers = null, bool fillExtendedInfo = true) { bool isStub = false; string? container = null; string? stubType = null; if (!isDirectory) { var extension = Path.GetExtension(path); // Check supported extensions if (!_options.VideoFileExtensions.Contains(extension, StringComparison.OrdinalIgnoreCase)) { // It's not supported. Check stub extensions if (!StubResolver.TryResolveFile(path, _options, out stubType)) { return null; } isStub = true; } container = extension.TrimStart('.'); } var format3DResult = Format3DParser.Parse(path, _options); var parsingResult = new EpisodePathParser(_options) .Parse(path, isDirectory, isNamed, isOptimistic, supportsAbsoluteNumbers, fillExtendedInfo); if (!parsingResult.Success && !isStub) { return null; } return new EpisodeInfo(path) { Container = container, IsStub = isStub, EndingEpisodeNumber = parsingResult.EndingEpisodeNumber, EpisodeNumber = parsingResult.EpisodeNumber, SeasonNumber = parsingResult.SeasonNumber, SeriesName = parsingResult.SeriesName, StubType = stubType, Is3D = format3DResult.Is3D, Format3D = format3DResult.Format3D, IsByDate = parsingResult.IsByDate, Day = parsingResult.Day, Month = parsingResult.Month, Year = parsingResult.Year }; } } }