From ab630b9b84f92e94caad09c37dd519a46054f0ed Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Tue, 1 Oct 2019 01:12:16 +0200 Subject: [PATCH] Making app support absolute paths. --- Kyoo/InternalAPI/Crawler/Crawler.cs | 45 ++++++++++++++++--- .../LibraryManager/LibraryManager.cs | 4 +- .../MetadataProvider/IMetadataProvider.cs | 2 +- .../TheTvDB/ProviderTheTvDB.cs | 29 +++++++++--- .../MetadataProvider/ProviderManager.cs | 4 +- Kyoo/Models/Episode.cs | 8 +++- Kyoo/config.json | 3 +- 7 files changed, 76 insertions(+), 19 deletions(-) diff --git a/Kyoo/InternalAPI/Crawler/Crawler.cs b/Kyoo/InternalAPI/Crawler/Crawler.cs index ee429c6d..673aadf9 100644 --- a/Kyoo/InternalAPI/Crawler/Crawler.cs +++ b/Kyoo/InternalAPI/Crawler/Crawler.cs @@ -132,6 +132,26 @@ namespace Kyoo.InternalAPI string showName = match.Groups["ShowTitle"].Value; bool seasonSuccess = long.TryParse(match.Groups["Season"].Value, out long seasonNumber); bool episodeSucess = long.TryParse(match.Groups["Episode"].Value, out long episodeNumber); + long absoluteNumber = -1; + + if(!seasonSuccess || !episodeSucess) + { + //Considering that the episode is using absolute path. + seasonNumber = -1; + episodeNumber = -1; + + regex = new Regex(config.GetValue("absoluteRegex")); + match = regex.Match(path); + + showName = match.Groups["ShowTitle"].Value; + bool absoluteSucess = long.TryParse(match.Groups["AbsoluteNumber"].Value, out absoluteNumber); + + if (!absoluteSucess) + { + Debug.WriteLine("&Couldn't find basic data for the episode (regexs didn't match) at " + path); + return; + } + } string showProviderIDs; if (!libraryManager.IsShowRegistered(showPath, out long showID)) @@ -146,15 +166,30 @@ namespace Kyoo.InternalAPI else showProviderIDs = libraryManager.GetShowExternalIDs(showID); - if (!libraryManager.IsSeasonRegistered(showID, seasonNumber, out long seasonID)) + long seasonID = -1; + if (seasonNumber != -1) { - Season season = await metadataProvider.GetSeason(showName, seasonNumber); - season.ShowID = showID; - seasonID = libraryManager.RegisterSeason(season); + if (!libraryManager.IsSeasonRegistered(showID, seasonNumber, out seasonID)) + { + Season season = await metadataProvider.GetSeason(showName, seasonNumber); + season.ShowID = showID; + seasonID = libraryManager.RegisterSeason(season); + } } - Episode episode = await metadataProvider.GetEpisode(showProviderIDs, seasonNumber, episodeNumber, path); + Episode episode = await metadataProvider.GetEpisode(showProviderIDs, seasonNumber, episodeNumber, absoluteNumber, path); episode.ShowID = showID; + + if(seasonID == -1) + { + if (!libraryManager.IsSeasonRegistered(showID, episode.seasonNumber, out seasonID)) + { + Season season = await metadataProvider.GetSeason(showName, episode.seasonNumber); + season.ShowID = showID; + seasonID = libraryManager.RegisterSeason(season); + } + } + episode.SeasonID = seasonID; long episodeID = libraryManager.RegisterEpisode(episode); episode.id = episodeID; diff --git a/Kyoo/InternalAPI/LibraryManager/LibraryManager.cs b/Kyoo/InternalAPI/LibraryManager/LibraryManager.cs index 008e3c81..077abd5a 100644 --- a/Kyoo/InternalAPI/LibraryManager/LibraryManager.cs +++ b/Kyoo/InternalAPI/LibraryManager/LibraryManager.cs @@ -60,6 +60,7 @@ namespace Kyoo.InternalAPI seasonID INTEGER, seasonNumber INTEGER, episodeNumber INTEGER, + absoluteNumber INTEGER, path TEXT, title TEXT, overview TEXT, @@ -707,13 +708,14 @@ namespace Kyoo.InternalAPI public long RegisterEpisode(Episode episode) { - string query = "INSERT INTO episodes (showID, seasonID, seasonNumber, episodeNumber, path, title, overview, releaseDate, runtime, imgPrimary, externalIDs) VALUES($showID, $seasonID, $seasonNumber,$episodeNumber, $path, $title, $overview, $releaseDate, $runtime, $imgPrimary, $externalIDs);"; + string query = "INSERT INTO episodes (showID, seasonID, seasonNumber, episodeNumber, absoluteNumber, path, title, overview, releaseDate, runtime, imgPrimary, externalIDs) VALUES($showID, $seasonID, $seasonNumber, $episodeNumber, $absoluteNumber, $path, $title, $overview, $releaseDate, $runtime, $imgPrimary, $externalIDs);"; using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) { cmd.Parameters.AddWithValue("$showID", episode.ShowID); cmd.Parameters.AddWithValue("$seasonID", episode.SeasonID); cmd.Parameters.AddWithValue("$seasonNUmber", episode.seasonNumber); cmd.Parameters.AddWithValue("$episodeNumber", episode.episodeNumber); + cmd.Parameters.AddWithValue("$absoluteNumber", episode.absoluteNumber); cmd.Parameters.AddWithValue("$path", episode.Path); cmd.Parameters.AddWithValue("$title", episode.Title); cmd.Parameters.AddWithValue("$overview", episode.Overview); diff --git a/Kyoo/InternalAPI/MetadataProvider/IMetadataProvider.cs b/Kyoo/InternalAPI/MetadataProvider/IMetadataProvider.cs index 02e18794..aaffff23 100644 --- a/Kyoo/InternalAPI/MetadataProvider/IMetadataProvider.cs +++ b/Kyoo/InternalAPI/MetadataProvider/IMetadataProvider.cs @@ -17,6 +17,6 @@ namespace Kyoo.InternalAPI Task GetSeasonImage(string showName, long seasonNumber); //For the episodes - Task GetEpisode(string externalIDs, long seasonNumber, long episodeNumber, string episodePath); + Task GetEpisode(string externalIDs, long seasonNumber, long episodeNumber, long absoluteNumber, string episodePath); } } diff --git a/Kyoo/InternalAPI/MetadataProvider/Implementations/TheTvDB/ProviderTheTvDB.cs b/Kyoo/InternalAPI/MetadataProvider/Implementations/TheTvDB/ProviderTheTvDB.cs index 159c786e..aca09150 100644 --- a/Kyoo/InternalAPI/MetadataProvider/Implementations/TheTvDB/ProviderTheTvDB.cs +++ b/Kyoo/InternalAPI/MetadataProvider/Implementations/TheTvDB/ProviderTheTvDB.cs @@ -271,19 +271,24 @@ namespace Kyoo.InternalAPI.MetadataProvider return null; } - public async Task GetEpisode(string externalIDs, long seasonNumber, long episodeNumber, string episodePath) + public async Task GetEpisode(string externalIDs, long seasonNumber, long episodeNumber, long absoluteNumber, string episodePath) { string id = GetID(externalIDs); if (id == null) - return new Episode(seasonNumber, episodeNumber, null, null, null, -1, null, externalIDs); + return new Episode(seasonNumber, episodeNumber, absoluteNumber, null, null, null, -1, null, externalIDs); string token = await Authentificate(); if (token == null) - return new Episode(seasonNumber, episodeNumber, null, null, null, -1, null, externalIDs); + return new Episode(seasonNumber, episodeNumber, absoluteNumber, null, null, null, -1, null, externalIDs); + + WebRequest request; + if(absoluteNumber != -1) + request = WebRequest.Create("https://api.thetvdb.com/series/" + id + "/episodes/query?absoluteNumber=" + absoluteNumber); + else + request = WebRequest.Create("https://api.thetvdb.com/series/" + id + "/episodes/query?airedSeason=" + seasonNumber + "&airedEpisode=" + episodeNumber); - WebRequest request = WebRequest.Create("https://api.thetvdb.com/series/" + id + "/episodes/query?airedSeason=" + seasonNumber + "&airedEpisode=" + episodeNumber); request.Method = "GET"; request.Timeout = 12000; request.ContentType = "application/json"; @@ -306,20 +311,30 @@ namespace Kyoo.InternalAPI.MetadataProvider dynamic episode = data.data[0]; DateTime dateTime = DateTime.ParseExact((string)episode.firstAired, "yyyy-MM-dd", CultureInfo.InvariantCulture); - return new Episode(seasonNumber, episodeNumber, (string)episode.episodeName, (string)episode.overview, dateTime, -1, "https://www.thetvdb.com/banners/" + episode.filename, string.Format("TvDB={0}|", episode.id)); + + if (absoluteNumber == -1) + absoluteNumber = episode.absoluteNumber as long? ?? -1; + else + { + seasonNumber = episode.airedSeason; + episodeNumber = episode.airedEpisodeNumber; + } + + + return new Episode(seasonNumber, episodeNumber, absoluteNumber, (string)episode.episodeName, (string)episode.overview, dateTime, -1, "https://www.thetvdb.com/banners/" + episode.filename, string.Format("TvDB={0}|", episode.id)); } } else { Debug.WriteLine("&TheTvDB Provider couldn't work for the episode number: " + episodeNumber + ".\nError Code: " + response.StatusCode + " Message: " + response.StatusDescription); response.Close(); - return new Episode(seasonNumber, episodeNumber, null, null, null, -1, null, externalIDs); + return new Episode(seasonNumber, episodeNumber, absoluteNumber, null, null, null, -1, null, externalIDs); } } catch (WebException ex) { Debug.WriteLine("&TheTvDB Provider couldn't work for the episode number: " + episodeNumber + ".\nError Code: " + ex.Status); - return new Episode(seasonNumber, episodeNumber, null, null, null, -1, null, externalIDs); + return new Episode(seasonNumber, episodeNumber, absoluteNumber, null, null, null, -1, null, externalIDs); } } diff --git a/Kyoo/InternalAPI/MetadataProvider/ProviderManager.cs b/Kyoo/InternalAPI/MetadataProvider/ProviderManager.cs index 1cfff6dd..4c2d324c 100644 --- a/Kyoo/InternalAPI/MetadataProvider/ProviderManager.cs +++ b/Kyoo/InternalAPI/MetadataProvider/ProviderManager.cs @@ -136,12 +136,12 @@ namespace Kyoo.InternalAPI return providers[0].GetSeasonImage(showName, seasonNumber); } - public async Task GetEpisode(string externalIDs, long seasonNumber, long episodeNumber, string episodePath) + public async Task GetEpisode(string externalIDs, long seasonNumber, long episodeNumber, long absoluteNumber, string episodePath) { List datas = new List(); for (int i = 0; i < providers.Count; i++) { - datas.Add(await providers[i].GetEpisode(externalIDs, seasonNumber, episodeNumber, episodePath)); + datas.Add(await providers[i].GetEpisode(externalIDs, seasonNumber, episodeNumber, absoluteNumber, episodePath)); } Episode episode = Merge(datas); diff --git a/Kyoo/Models/Episode.cs b/Kyoo/Models/Episode.cs index 76ec5b9f..b192ce66 100644 --- a/Kyoo/Models/Episode.cs +++ b/Kyoo/Models/Episode.cs @@ -11,6 +11,7 @@ namespace Kyoo.Models public long seasonNumber; public long episodeNumber; + public long absoluteNumber; [JsonIgnore] public string Path; public string Title; public string Overview; @@ -27,13 +28,14 @@ namespace Kyoo.Models public Episode() { } - public Episode(long seasonNumber, long episodeNumber, string title, string overview, DateTime? releaseDate, long runtime, string imgPrimary, string externalIDs) + public Episode(long seasonNumber, long episodeNumber, long absoluteNumber, string title, string overview, DateTime? releaseDate, long runtime, string imgPrimary, string externalIDs) { id = -1; ShowID = -1; SeasonID = -1; this.seasonNumber = seasonNumber; this.episodeNumber = episodeNumber; + this.absoluteNumber = absoluteNumber; Title = title; Overview = overview; ReleaseDate = releaseDate; @@ -42,13 +44,14 @@ namespace Kyoo.Models ExternalIDs = externalIDs; } - public Episode(long id, long showID, long seasonID, long seasonNumber, long episodeNumber, string path, string title, string overview, DateTime? releaseDate, long runtime, string imgPrimary, string externalIDs) + public Episode(long id, long showID, long seasonID, long seasonNumber, long episodeNumber, long absoluteNumber, string path, string title, string overview, DateTime? releaseDate, long runtime, string imgPrimary, string externalIDs) { this.id = id; ShowID = showID; SeasonID = seasonID; this.seasonNumber = seasonNumber; this.episodeNumber = episodeNumber; + this.absoluteNumber = absoluteNumber; Path = path; Title = title; Overview = overview; @@ -65,6 +68,7 @@ namespace Kyoo.Models (long)reader["seasonID"], (long)reader["seasonNumber"], (long)reader["episodeNumber"], + (long)reader["absoluteNumber"], reader["path"] as string, reader["title"] as string, reader["overview"] as string, diff --git a/Kyoo/config.json b/Kyoo/config.json index 01e896cf..f2d16b9e 100644 --- a/Kyoo/config.json +++ b/Kyoo/config.json @@ -7,5 +7,6 @@ "libraryPaths": [ "\\\\sdg\\video\\Anime" ], - "regex": ".*\\\\(?.+?) S(?\\d+)E(?\\d+)" + "regex": ".*\\\\(?.+?) S(?\\d+)E(?\\d+)", + "absoluteRegex": ".*\\\\(?.+?) (?\\d+)" }