From db5ae6f28575a8fd6769028c9779761c609107b5 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Sat, 26 Jun 2021 16:13:06 +0200 Subject: [PATCH] Using nullables instead of -1 --- Kyoo.Common/Controllers/IMetadataProvider.cs | 2 +- Kyoo.Common/Controllers/IProviderManager.cs | 2 +- Kyoo.Common/Models/Resources/Episode.cs | 48 +++++++------------ Kyoo.Common/Models/Resources/Season.cs | 4 +- Kyoo.Common/Models/Resources/Show.cs | 3 +- Kyoo.Common/Models/Resources/Track.cs | 4 +- Kyoo.Common/Models/Resources/User.cs | 2 +- Kyoo.Common/Models/WatchItem.cs | 34 ++++++++----- .../Migrations/20210621175342_Triggers.cs | 25 ++++++++-- .../Library/SpecificTests/EpisodeTest.cs | 28 ++++++----- Kyoo.Tests/Library/TestSample.cs | 5 +- Kyoo/Controllers/ProviderManager.cs | 13 +++-- .../Repositories/EpisodeRepository.cs | 2 +- .../Repositories/TrackRepository.cs | 4 +- Kyoo/Startup.cs | 4 +- Kyoo/Tasks/Crawler.cs | 31 ++++++------ 16 files changed, 113 insertions(+), 98 deletions(-) diff --git a/Kyoo.Common/Controllers/IMetadataProvider.cs b/Kyoo.Common/Controllers/IMetadataProvider.cs index ce9592f9..a0c30cbb 100644 --- a/Kyoo.Common/Controllers/IMetadataProvider.cs +++ b/Kyoo.Common/Controllers/IMetadataProvider.cs @@ -16,6 +16,6 @@ namespace Kyoo.Controllers Task GetSeason(Show show, int seasonNumber); - Task GetEpisode(Show show, int seasonNumber, int episodeNumber, int absoluteNumber); + Task GetEpisode(Show show, int? seasonNumber, int? episodeNumber, int? absoluteNumber); } } diff --git a/Kyoo.Common/Controllers/IProviderManager.cs b/Kyoo.Common/Controllers/IProviderManager.cs index d1136052..dd83a283 100644 --- a/Kyoo.Common/Controllers/IProviderManager.cs +++ b/Kyoo.Common/Controllers/IProviderManager.cs @@ -11,7 +11,7 @@ namespace Kyoo.Controllers Task SearchShow(string showName, bool isMovie, Library library); Task> SearchShows(string showName, bool isMovie, Library library); Task GetSeason(Show show, int seasonNumber, Library library); - Task GetEpisode(Show show, string episodePath, int seasonNumber, int episodeNumber, int absoluteNumber, Library library); + Task GetEpisode(Show show, string episodePath, int? seasonNumber, int? episodeNumber, int? absoluteNumber, Library library); Task> GetPeople(Show show, Library library); } } \ No newline at end of file diff --git a/Kyoo.Common/Models/Resources/Episode.cs b/Kyoo.Common/Models/Resources/Episode.cs index 37cd51aa..7c5bd7c7 100644 --- a/Kyoo.Common/Models/Resources/Episode.cs +++ b/Kyoo.Common/Models/Resources/Episode.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.ComponentModel; using System.Text.RegularExpressions; using JetBrains.Annotations; using Kyoo.Controllers; @@ -10,9 +9,8 @@ namespace Kyoo.Models { /// /// A class to represent a single show's episode. - /// This is also used internally for movies (their number is juste set to -1). /// - public class Episode : IResource, IOnMerge + public class Episode : IResource { /// public int ID { get; set; } @@ -31,6 +29,7 @@ namespace Kyoo.Models if (value == null) throw new ArgumentNullException(nameof(value)); + Console.WriteLine(value); Match match = Regex.Match(value, @"(?.+)-s(?\d+)e(?\d+)"); if (match.Success) @@ -44,13 +43,13 @@ namespace Kyoo.Models match = Regex.Match(value, @"(?.*)-(?\d*)"); if (match.Success) { - ShowSlug = match.Groups["Show"].Value; + ShowSlug = match.Groups["show"].Value; AbsoluteNumber = int.Parse(match.Groups["absolute"].Value); } else ShowSlug = value; - SeasonNumber = -1; - EpisodeNumber = -1; + SeasonNumber = null; + EpisodeNumber = null; } } } @@ -82,20 +81,17 @@ namespace Kyoo.Models /// /// The season in witch this episode is in. /// - [DefaultValue(-1)] - public int SeasonNumber { get; set; } = -1; + public int? SeasonNumber { get; set; } /// /// The number of this episode is it's season. /// - [DefaultValue(-1)] - public int EpisodeNumber { get; set; } = -1; + public int? EpisodeNumber { get; set; } /// /// The absolute number of this episode. It's an episode number that is not reset to 1 after a new season. /// - [DefaultValue(-1)] - public int AbsoluteNumber { get; set; } = -1; + public int? AbsoluteNumber { get; set; } /// /// The path of the video file for this episode. Any format supported by a is allowed. @@ -141,43 +137,31 @@ namespace Kyoo.Models /// The slug of the show. It can't be null. /// /// The season in which the episode is. - /// If this is a movie or if the episode should be referred by it's absolute number, set this to -1. + /// If this is a movie or if the episode should be referred by it's absolute number, set this to null. /// /// /// The number of the episode in it's season. - /// If this is a movie or if the episode should be referred by it's absolute number, set this to -1. + /// If this is a movie or if the episode should be referred by it's absolute number, set this to null. /// /// /// The absolute number of this show. - /// If you don't know it or this is a movie, use -1 + /// If you don't know it or this is a movie, use null /// /// The slug corresponding to the given arguments /// The given show slug was null. public static string GetSlug([NotNull] string showSlug, - int seasonNumber = -1, - int episodeNumber = -1, - int absoluteNumber = -1) + int? seasonNumber, + int? episodeNumber, + int? absoluteNumber = null) { if (showSlug == null) throw new ArgumentNullException(nameof(showSlug)); return seasonNumber switch { - -1 when absoluteNumber == -1 => showSlug, - -1 => $"{showSlug}-{absoluteNumber}", + null when absoluteNumber == null => showSlug, + null => $"{showSlug}-{absoluteNumber}", _ => $"{showSlug}-s{seasonNumber}e{episodeNumber}" }; } - - /// - public void OnMerge(object merged) - { - Episode other = (Episode)merged; - if (SeasonNumber == -1 && other.SeasonNumber != -1) - SeasonNumber = other.SeasonNumber; - if (EpisodeNumber == -1 && other.EpisodeNumber != -1) - EpisodeNumber = other.EpisodeNumber; - if (AbsoluteNumber == -1 && other.AbsoluteNumber != -1) - AbsoluteNumber = other.AbsoluteNumber; - } } } diff --git a/Kyoo.Common/Models/Resources/Season.cs b/Kyoo.Common/Models/Resources/Season.cs index 028022b6..07411cf3 100644 --- a/Kyoo.Common/Models/Resources/Season.cs +++ b/Kyoo.Common/Models/Resources/Season.cs @@ -50,9 +50,9 @@ namespace Kyoo.Models [LoadableRelation(nameof(ShowID))] public Show Show { get; set; } /// - /// The number of this season. This can be set to 0 to indicate specials. This defaults to -1 for unset. + /// The number of this season. This can be set to 0 to indicate specials. /// - public int SeasonNumber { get; set; } = -1; + public int SeasonNumber { get; set; } /// /// The title of this season. diff --git a/Kyoo.Common/Models/Resources/Show.cs b/Kyoo.Common/Models/Resources/Show.cs index 788ffff3..5232dee2 100644 --- a/Kyoo.Common/Models/Resources/Show.cs +++ b/Kyoo.Common/Models/Resources/Show.cs @@ -118,7 +118,8 @@ namespace Kyoo.Models [LoadableRelation] public ICollection Seasons { get; set; } /// - /// The list of episodes in this show. If this is a movie, there will be a unique episode (with the seasonNumber and episodeNumber set to -1). + /// The list of episodes in this show. + /// If this is a movie, there will be a unique episode (with the seasonNumber and episodeNumber set to null). /// Having an episode is necessary to store metadata and tracks. /// [LoadableRelation] public ICollection Episodes { get; set; } diff --git a/Kyoo.Common/Models/Resources/Track.cs b/Kyoo.Common/Models/Resources/Track.cs index e0d543c2..38006392 100644 --- a/Kyoo.Common/Models/Resources/Track.cs +++ b/Kyoo.Common/Models/Resources/Track.cs @@ -63,8 +63,8 @@ namespace Kyoo.Models } EpisodeSlug = Episode.GetSlug(match.Groups["show"].Value, - match.Groups["season"].Success ? int.Parse(match.Groups["season"].Value) : -1, - match.Groups["episode"].Success ? int.Parse(match.Groups["episode"].Value) : -1); + match.Groups["season"].Success ? int.Parse(match.Groups["season"].Value) : null, + match.Groups["episode"].Success ? int.Parse(match.Groups["episode"].Value) : null); Language = match.Groups["language"].Value; IsForced = match.Groups["forced"].Success; if (match.Groups["type"].Success) diff --git a/Kyoo.Common/Models/Resources/User.cs b/Kyoo.Common/Models/Resources/User.cs index 1f497541..05f56534 100644 --- a/Kyoo.Common/Models/Resources/User.cs +++ b/Kyoo.Common/Models/Resources/User.cs @@ -63,7 +63,7 @@ namespace Kyoo.Models public class WatchedEpisode : Link { /// - /// Where the player has stopped watching the episode (-1 if not started, else between 0 and 100). + /// Where the player has stopped watching the episode (between 0 and 100). /// public int WatchedPercentage { get; set; } } diff --git a/Kyoo.Common/Models/WatchItem.cs b/Kyoo.Common/Models/WatchItem.cs index a7e15fd1..3b64d54e 100644 --- a/Kyoo.Common/Models/WatchItem.cs +++ b/Kyoo.Common/Models/WatchItem.cs @@ -37,20 +37,19 @@ namespace Kyoo.Models public string ShowSlug { get; set; } /// - /// The season in witch this episode is in. This defaults to -1 if not specified. + /// The season in witch this episode is in. /// - public int SeasonNumber { get; set; } + public int? SeasonNumber { get; set; } /// - /// The number of this episode is it's season. This defaults to -1 if not specified. + /// The number of this episode is it's season. /// - public int EpisodeNumber { get; set; } + public int? EpisodeNumber { get; set; } /// /// The absolute number of this episode. It's an episode number that is not reset to 1 after a new season. - /// This defaults to -1 if not specified. /// - public int AbsoluteNumber { get; set; } + public int? AbsoluteNumber { get; set; } /// /// The title of this episode. @@ -148,21 +147,30 @@ namespace Kyoo.Models await library.Load(ep, x => x.Show); await library.Load(ep, x => x.Tracks); - if (!ep.Show.IsMovie) + if (!ep.Show.IsMovie && ep.SeasonNumber != null && ep.EpisodeNumber != null) { if (ep.EpisodeNumber > 1) - previous = await library.GetOrDefault(ep.ShowID, ep.SeasonNumber, ep.EpisodeNumber - 1); + previous = await library.GetOrDefault(ep.ShowID, ep.SeasonNumber.Value, ep.EpisodeNumber.Value - 1); else if (ep.SeasonNumber > 1) { - int count = await library.GetCount(x => x.ShowID == ep.ShowID - && x.SeasonNumber == ep.SeasonNumber - 1); - previous = await library.GetOrDefault(ep.ShowID, ep.SeasonNumber - 1, count); + previous = (await library.GetAll(x => x.ShowID == ep.ShowID + && x.SeasonNumber == ep.SeasonNumber.Value - 1, + limit: 1, + sort: new Sort(x => x.EpisodeNumber, true)) + ).FirstOrDefault(); } if (ep.EpisodeNumber >= await library.GetCount(x => x.SeasonID == ep.SeasonID)) - next = await library.GetOrDefault(ep.ShowID, ep.SeasonNumber + 1, 1); + next = await library.GetOrDefault(ep.ShowID, ep.SeasonNumber.Value + 1, 1); else - next = await library.GetOrDefault(ep.ShowID, ep.SeasonNumber, ep.EpisodeNumber + 1); + next = await library.GetOrDefault(ep.ShowID, ep.SeasonNumber.Value, ep.EpisodeNumber.Value + 1); + } + else if (!ep.Show.IsMovie && ep.AbsoluteNumber != null) + { + previous = await library.GetOrDefault(x => x.ShowID == ep.ShowID + && x.AbsoluteNumber == ep.EpisodeNumber + 1); + next = await library.GetOrDefault(x => x.ShowID == ep.ShowID + && x.AbsoluteNumber == ep.AbsoluteNumber + 1); } return new WatchItem diff --git a/Kyoo.SqLite/Migrations/20210621175342_Triggers.cs b/Kyoo.SqLite/Migrations/20210621175342_Triggers.cs index b6477eeb..0f0596dd 100644 --- a/Kyoo.SqLite/Migrations/20210621175342_Triggers.cs +++ b/Kyoo.SqLite/Migrations/20210621175342_Triggers.cs @@ -25,14 +25,25 @@ namespace Kyoo.SqLite.Migrations migrationBuilder.Sql(@" CREATE TRIGGER EpisodeSlugInsert AFTER INSERT ON Episodes FOR EACH ROW BEGIN - UPDATE Episodes SET Slug = (SELECT Slug from Shows WHERE ID = ShowID) || '-s' || SeasonNumber || 'e' || EpisodeNumber + UPDATE Episodes + SET Slug = (SELECT Slug from Shows WHERE ID = ShowID) || + CASE (SeasonNumber) + WHEN NULL THEN '-' || AbsoluteNumber + ELSE '-s' || SeasonNumber || 'e' || EpisodeNumber + END WHERE ID == new.ID; END"); // language=SQLite migrationBuilder.Sql(@" - CREATE TRIGGER EpisodeSlugUpdate AFTER UPDATE OF EpisodeNumber, SeasonNumber, ShowID ON Episodes FOR EACH ROW + CREATE TRIGGER EpisodeSlugUpdate AFTER UPDATE OF AbsoluteNumber, EpisodeNumber, SeasonNumber, ShowID + ON Episodes FOR EACH ROW BEGIN - UPDATE Episodes SET Slug = (SELECT Slug from Shows WHERE ID = ShowID) || '-s' || SeasonNumber || 'e' || EpisodeNumber + UPDATE Episodes + SET Slug = (SELECT Slug from Shows WHERE ID = ShowID) || + CASE (SeasonNumber) + WHEN NULL THEN '-' || AbsoluteNumber + ELSE '-s' || SeasonNumber || 'e' || EpisodeNumber + END WHERE ID == new.ID; END"); @@ -42,7 +53,13 @@ namespace Kyoo.SqLite.Migrations CREATE TRIGGER ShowSlugUpdate AFTER UPDATE OF Slug ON Shows FOR EACH ROW BEGIN UPDATE Seasons SET Slug = new.Slug || '-s' || SeasonNumber WHERE ShowID = new.ID; - UPDATE Episodes SET Slug = new.Slug || '-s' || SeasonNumber || 'e' || EpisodeNumber WHERE ShowID = new.ID; + UPDATE Episodes + SET Slug = new.Slug || + CASE (SeasonNumber) + WHEN NULL THEN '-' || AbsoluteNumber + ELSE '-s' || SeasonNumber || 'e' || EpisodeNumber + END + WHERE ShowID = new.ID; END;"); } diff --git a/Kyoo.Tests/Library/SpecificTests/EpisodeTest.cs b/Kyoo.Tests/Library/SpecificTests/EpisodeTest.cs index 868de9d7..22c4cdee 100644 --- a/Kyoo.Tests/Library/SpecificTests/EpisodeTest.cs +++ b/Kyoo.Tests/Library/SpecificTests/EpisodeTest.cs @@ -55,11 +55,12 @@ namespace Kyoo.Tests.Library { Episode episode = await _repository.Get(1); Assert.Equal($"{TestSample.Get().Slug}-s1e1", episode.Slug); - await _repository.Edit(new Episode + episode = await _repository.Edit(new Episode { ID = 1, SeasonNumber = 2 }, false); + Assert.Equal($"{TestSample.Get().Slug}-s2e2", episode.Slug); episode = await _repository.Get(1); Assert.Equal($"{TestSample.Get().Slug}-s2e1", episode.Slug); } @@ -69,11 +70,12 @@ namespace Kyoo.Tests.Library { Episode episode = await _repository.Get(1); Assert.Equal($"{TestSample.Get().Slug}-s1e1", episode.Slug); - await _repository.Edit(new Episode + episode = await _repository.Edit(new Episode { ID = 1, EpisodeNumber = 2 }, false); + Assert.Equal($"{TestSample.Get().Slug}-s1e2", episode.Slug); episode = await _repository.Get(1); Assert.Equal($"{TestSample.Get().Slug}-s1e2", episode.Slug); } @@ -127,12 +129,13 @@ namespace Kyoo.Tests.Library public async Task AbsoluteNumberEditTest() { await _repository.Create(TestSample.GetAbsoluteEpisode()); - await _repository.Edit(new Episode + Episode episode = await _repository.Edit(new Episode { - ID = 1, + ID = 2, AbsoluteNumber = 56 }, false); - Episode episode = await _repository.Get(2); + Assert.Equal($"{TestSample.Get().Slug}-56", episode.Slug); + episode = await _repository.Get(2); Assert.Equal($"{TestSample.Get().Slug}-56", episode.Slug); } @@ -140,27 +143,28 @@ namespace Kyoo.Tests.Library public async Task AbsoluteToNormalEditTest() { await _repository.Create(TestSample.GetAbsoluteEpisode()); - await _repository.Edit(new Episode + Episode episode = await _repository.Edit(new Episode { - ID = 1, + ID = 2, SeasonNumber = 1, EpisodeNumber = 2 }, false); - Episode episode = await _repository.Get(1); + Assert.Equal($"{TestSample.Get().Slug}-s1e2", episode.Slug); + episode = await _repository.Get(2); Assert.Equal($"{TestSample.Get().Slug}-s1e2", episode.Slug); } [Fact] public async Task NormalToAbsoluteEditTest() { - await _repository.Create(TestSample.GetAbsoluteEpisode()); - await _repository.Edit(new Episode + Episode episode = await _repository.Edit(new Episode { ID = 1, - SeasonNumber = -1, + SeasonNumber = null, AbsoluteNumber = 12 }, false); - Episode episode = await _repository.Get(1); + Assert.Equal($"{TestSample.Get().Slug}-12", episode.Slug); + episode = await _repository.Get(1); Assert.Equal($"{TestSample.Get().Slug}-12", episode.Slug); } } diff --git a/Kyoo.Tests/Library/TestSample.cs b/Kyoo.Tests/Library/TestSample.cs index cb8650fa..937fac9a 100644 --- a/Kyoo.Tests/Library/TestSample.cs +++ b/Kyoo.Tests/Library/TestSample.cs @@ -129,9 +129,8 @@ namespace Kyoo.Tests ID = 2, ShowSlug = "anohana", ShowID = 1, - SeasonID = -1, - SeasonNumber = -1, - EpisodeNumber = -1, + SeasonNumber = null, + EpisodeNumber = null, AbsoluteNumber = 3, Path = "/home/kyoo/anohana-3", Thumb = "thumbnail", diff --git a/Kyoo/Controllers/ProviderManager.cs b/Kyoo/Controllers/ProviderManager.cs index 4a0a0cd1..6ed5f796 100644 --- a/Kyoo/Controllers/ProviderManager.cs +++ b/Kyoo/Controllers/ProviderManager.cs @@ -122,16 +122,15 @@ namespace Kyoo.Controllers season.Show = show; season.ShowID = show.ID; season.ShowSlug = show.Slug; - season.SeasonNumber = season.SeasonNumber == -1 ? seasonNumber : season.SeasonNumber; season.Title ??= $"Season {season.SeasonNumber}"; return season; } public async Task GetEpisode(Show show, string episodePath, - int seasonNumber, - int episodeNumber, - int absoluteNumber, + int? seasonNumber, + int? episodeNumber, + int? absoluteNumber, Library library) { Episode episode = await GetMetadata( @@ -142,9 +141,9 @@ namespace Kyoo.Controllers episode.ShowID = show.ID; episode.ShowSlug = show.Slug; episode.Path = episodePath; - episode.SeasonNumber = episode.SeasonNumber != -1 ? episode.SeasonNumber : seasonNumber; - episode.EpisodeNumber = episode.EpisodeNumber != -1 ? episode.EpisodeNumber : episodeNumber; - episode.AbsoluteNumber = episode.AbsoluteNumber != -1 ? episode.AbsoluteNumber : absoluteNumber; + episode.SeasonNumber ??= seasonNumber; + episode.EpisodeNumber ??= episodeNumber; + episode.AbsoluteNumber ??= absoluteNumber; return episode; } diff --git a/Kyoo/Controllers/Repositories/EpisodeRepository.cs b/Kyoo/Controllers/Repositories/EpisodeRepository.cs index 278e31b5..6f555571 100644 --- a/Kyoo/Controllers/Repositories/EpisodeRepository.cs +++ b/Kyoo/Controllers/Repositories/EpisodeRepository.cs @@ -99,7 +99,7 @@ namespace Kyoo.Controllers public override async Task> Search(string query) { return await _database.Episodes - .Where(x => x.EpisodeNumber != -1) + .Where(x => x.EpisodeNumber != null) .Where(_database.Like(x => x.Title, $"%{query}%")) .OrderBy(DefaultSort) .Take(20) diff --git a/Kyoo/Controllers/Repositories/TrackRepository.cs b/Kyoo/Controllers/Repositories/TrackRepository.cs index b33f48a4..98b05f30 100644 --- a/Kyoo/Controllers/Repositories/TrackRepository.cs +++ b/Kyoo/Controllers/Repositories/TrackRepository.cs @@ -67,8 +67,8 @@ namespace Kyoo.Controllers } string showSlug = match.Groups["show"].Value; - int seasonNumber = match.Groups["season"].Success ? int.Parse(match.Groups["season"].Value) : -1; - int episodeNumber = match.Groups["episode"].Success ? int.Parse(match.Groups["episode"].Value) : -1; + int? seasonNumber = match.Groups["season"].Success ? int.Parse(match.Groups["season"].Value) : null; + int? episodeNumber = match.Groups["episode"].Success ? int.Parse(match.Groups["episode"].Value) : null; string language = match.Groups["language"].Value; bool forced = match.Groups["forced"].Success; if (match.Groups["type"].Success) diff --git a/Kyoo/Startup.cs b/Kyoo/Startup.cs index 983d1d6c..27c05c56 100644 --- a/Kyoo/Startup.cs +++ b/Kyoo/Startup.cs @@ -47,8 +47,8 @@ namespace Kyoo // TODO remove postgres from here and load it like a normal plugin. _plugins.LoadPlugins(new IPlugin[] { new CoreModule(configuration), - new PostgresModule(configuration, host), - // new SqLiteModule(configuration, host), + // new PostgresModule(configuration, host), + new SqLiteModule(configuration, host), new AuthenticationModule(configuration, loggerFactory, host) }); } diff --git a/Kyoo/Tasks/Crawler.cs b/Kyoo/Tasks/Crawler.cs index ebe3eaed..9f1185dd 100644 --- a/Kyoo/Tasks/Crawler.cs +++ b/Kyoo/Tasks/Crawler.cs @@ -210,18 +210,20 @@ namespace Kyoo.Tasks string showPath = Path.GetDirectoryName(path); string collectionName = match.Groups["Collection"].Value; string showName = match.Groups["Show"].Value; - int seasonNumber = int.TryParse(match.Groups["Season"].Value, out int tmp) ? tmp : -1; - int episodeNumber = int.TryParse(match.Groups["Episode"].Value, out tmp) ? tmp : -1; - int absoluteNumber = int.TryParse(match.Groups["Absolute"].Value, out tmp) ? tmp : -1; + int? seasonNumber = int.TryParse(match.Groups["Season"].Value, out int tmp) ? tmp : null; + int? episodeNumber = int.TryParse(match.Groups["Episode"].Value, out tmp) ? tmp : null; + int? absoluteNumber = int.TryParse(match.Groups["Absolute"].Value, out tmp) ? tmp : null; Collection collection = await GetCollection(libraryManager, collectionName, library); - bool isMovie = seasonNumber == -1 && episodeNumber == -1 && absoluteNumber == -1; + bool isMovie = seasonNumber == null && episodeNumber == null && absoluteNumber == null; Show show = await GetShow(libraryManager, showName, showPath, isMovie, library); if (isMovie) await libraryManager!.Create(await GetMovie(show, path)); else { - Season season = await GetSeason(libraryManager, show, seasonNumber, library); + Season season = seasonNumber != null + ? await GetSeason(libraryManager, show, seasonNumber.Value, library) + : null; Episode episode = await GetEpisode(libraryManager, show, season, @@ -315,8 +317,6 @@ namespace Kyoo.Tasks int seasonNumber, Library library) { - if (seasonNumber == -1) - return default; try { Season season = await libraryManager.Get(show.Slug, seasonNumber); @@ -343,21 +343,24 @@ namespace Kyoo.Tasks private async Task GetEpisode(ILibraryManager libraryManager, Show show, Season season, - int episodeNumber, - int absoluteNumber, + int? episodeNumber, + int? absoluteNumber, string episodePath, Library library) { Episode episode = await MetadataProvider.GetEpisode(show, episodePath, - season?.SeasonNumber ?? -1, + season?.SeasonNumber, episodeNumber, absoluteNumber, library); - - season ??= await GetSeason(libraryManager, show, episode.SeasonNumber, library); - episode.Season = season; - episode.SeasonID = season?.ID; + + if (episode.SeasonNumber != null) + { + season ??= await GetSeason(libraryManager, show, episode.SeasonNumber.Value, library); + episode.Season = season; + episode.SeasonID = season?.ID; + } await ThumbnailsManager.Validate(episode); await GetTracks(episode); return episode;