From 9200c2b00e1b01b01c7cab80775911e17a039e4c Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Fri, 9 Aug 2019 21:39:44 +0200 Subject: [PATCH] Adding the episode registering. --- Kyoo/InternalAPI/Crawler/Crawler.cs | 9 +++ .../LibraryManager/ILibraryManager.cs | 4 +- .../LibraryManager/LibraryManager.cs | 36 +++++++++++ .../MetadataProvider/IMetadataProvider.cs | 6 +- .../TheTvDB/ProviderTheTvDB.cs | 61 ++++++++++++++++++- .../MetadataProvider/ProviderManager.cs | 6 +- Kyoo/Models/Episode.cs | 35 ++++++++++- 7 files changed, 149 insertions(+), 8 deletions(-) diff --git a/Kyoo/InternalAPI/Crawler/Crawler.cs b/Kyoo/InternalAPI/Crawler/Crawler.cs index db470e5d..524650ff 100644 --- a/Kyoo/InternalAPI/Crawler/Crawler.cs +++ b/Kyoo/InternalAPI/Crawler/Crawler.cs @@ -61,12 +61,16 @@ namespace Kyoo.InternalAPI Debug.WriteLine("&ShowPath: " + showPath + " Show: " + showName + " season: " + seasonNumber + " episode: " + episodeNumber); + string showProviderIDs; if (!libraryManager.IsShowRegistered(showPath, out long showID)) { Debug.WriteLine("&Should register show: " + showName); Show show = await metadataProvider.GetShowFromName(showName, showPath); + showProviderIDs = show.ExternalIDs; showID = libraryManager.RegisterShow(show); } + else + showProviderIDs = libraryManager.GetShowExternalIDs(showID); Debug.WriteLine("&Show ID: " + showID); @@ -79,6 +83,11 @@ namespace Kyoo.InternalAPI } Debug.WriteLine("&Season ID: " + seasonID); + + Episode episode = await metadataProvider.GetEpisode(showProviderIDs, seasonNumber, episodeNumber); + episode.ShowID = showID; + episode.SeasonID = seasonID; + libraryManager.RegisterEpisode(episode); } } } diff --git a/Kyoo/InternalAPI/LibraryManager/ILibraryManager.cs b/Kyoo/InternalAPI/LibraryManager/ILibraryManager.cs index e1a93d5d..f7f67a80 100644 --- a/Kyoo/InternalAPI/LibraryManager/ILibraryManager.cs +++ b/Kyoo/InternalAPI/LibraryManager/ILibraryManager.cs @@ -5,7 +5,8 @@ namespace Kyoo.InternalAPI { public interface ILibraryManager { - //Public value reading + //Read values + string GetShowExternalIDs(long showID); IEnumerable QueryShows(string selection); //Check if value exists @@ -18,5 +19,6 @@ namespace Kyoo.InternalAPI //Register values long RegisterShow(Show show); long RegisterSeason(Season season); + long RegisterEpisode(Episode episode); } } diff --git a/Kyoo/InternalAPI/LibraryManager/LibraryManager.cs b/Kyoo/InternalAPI/LibraryManager/LibraryManager.cs index 7f25e5db..7961a1f0 100644 --- a/Kyoo/InternalAPI/LibraryManager/LibraryManager.cs +++ b/Kyoo/InternalAPI/LibraryManager/LibraryManager.cs @@ -164,6 +164,20 @@ namespace Kyoo.InternalAPI } #region Read the database + public string GetShowExternalIDs(long showID) + { + string query = string.Format("SELECT 1 FROM shows WHERE showID = {0};", showID); + + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + SQLiteDataReader reader = cmd.ExecuteReader(); + + reader.Read(); + return Show.FromReader(reader).ExternalIDs; + } + } + + public IEnumerable QueryShows(string selection) { string query = "SELECT * FROM shows;"; @@ -290,6 +304,28 @@ namespace Kyoo.InternalAPI return (long)cmd.ExecuteScalar(); } } + + public long RegisterEpisode(Episode episode) + { + string query = "INSERT INTO episodes (showID, seasonID, episodeNumber, title, overview, releaseDate, runtime, imgPrimary, externalIDs) VALUES($showID, $seasonID, $episodeNumber, $title, $overview, $releaseDate, $runtime, $imgPrimary, $externalIDs);"; + Debug.WriteLine("&SQL QUERY:: " + query); + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + cmd.Parameters.AddWithValue("$showID", episode.ShowID); + cmd.Parameters.AddWithValue("seasonID", episode.SeasonID); + cmd.Parameters.AddWithValue("episodeNumber", episode.episodeNumber); + cmd.Parameters.AddWithValue("$title", episode.Title); + cmd.Parameters.AddWithValue("$overview", episode.Overview); + cmd.Parameters.AddWithValue("$releaseDate", episode.ReleaseDate); + cmd.Parameters.AddWithValue("$runtime", episode.Runtime); + cmd.Parameters.AddWithValue("$imgPrimary", episode.ImgPrimary); + cmd.Parameters.AddWithValue("$externalIDs", episode.ExternalIDs); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT LAST_INSERT_ROWID()"; + return (long)cmd.ExecuteScalar(); + } + } #endregion } } diff --git a/Kyoo/InternalAPI/MetadataProvider/IMetadataProvider.cs b/Kyoo/InternalAPI/MetadataProvider/IMetadataProvider.cs index 970c393a..26e0cb37 100644 --- a/Kyoo/InternalAPI/MetadataProvider/IMetadataProvider.cs +++ b/Kyoo/InternalAPI/MetadataProvider/IMetadataProvider.cs @@ -7,14 +7,14 @@ namespace Kyoo.InternalAPI { //For the show Task GetShowByID(string id); - Task GetShowFromName(string showName, string showPath); - Task GetImages(Show show); //For the seasons Task GetSeason(string showName, long seasonNumber); - Task GetSeasonImage(string showName, long seasonNumber); + + //For the episodes + Task GetEpisode(string externalIDs, long seasonNumber, long episodeNumber); } } diff --git a/Kyoo/InternalAPI/MetadataProvider/Implementations/TheTvDB/ProviderTheTvDB.cs b/Kyoo/InternalAPI/MetadataProvider/Implementations/TheTvDB/ProviderTheTvDB.cs index e78b73a2..efed7c7c 100644 --- a/Kyoo/InternalAPI/MetadataProvider/Implementations/TheTvDB/ProviderTheTvDB.cs +++ b/Kyoo/InternalAPI/MetadataProvider/Implementations/TheTvDB/ProviderTheTvDB.cs @@ -256,7 +256,9 @@ namespace Kyoo.InternalAPI.MetadataProvider return show; } - public Task GetSeason(string showName, long seasonNumber) +#pragma warning disable CS1998 // Async method lacks 'await' operators and will run synchronously + public async Task GetSeason(string showName, long seasonNumber) +#pragma warning restore CS1998 // Async method lacks 'await' operators and will run synchronously { return new Season(-1, -1, seasonNumber, "Season " + seasonNumber, null, null, null, null); } @@ -265,5 +267,62 @@ namespace Kyoo.InternalAPI.MetadataProvider { return null; } + + + + public async Task GetEpisode(string externalIDs, long seasonNumber, long episodeNumber) + { + string id = GetID(externalIDs); + + if (id == null) + return null; + + string token = await Authentificate(); + + if (token == null) + return null; + + long page = episodeNumber / 100 + 1; + long index = episodeNumber % 100; + + WebRequest request = WebRequest.Create("https://api.thetvdb.com/series/" + id + "/episodes?page=" + page); + request.Method = "GET"; + request.Timeout = 12000; + request.ContentType = "application/json"; + request.Headers.Add(HttpRequestHeader.Authorization, "Bearer " + token); + + try + { + HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync(); + + if (response.StatusCode == HttpStatusCode.OK) + { + Stream stream = response.GetResponseStream(); + using (StreamReader reader = new StreamReader(stream)) + { + string content = await reader.ReadToEndAsync(); + stream.Close(); + response.Close(); + + dynamic data = JsonConvert.DeserializeObject(content); + dynamic episode = data.data[index]; + + Debug.WriteLine("&Date: " + (string)episode.firstAired); + return new Episode(episodeNumber, episode.episodeName, episode.overview, DateTime.Parse(episode.firstAired), -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 null; + } + } + catch (WebException ex) + { + Debug.WriteLine("&TheTvDB Provider couldn't work for the episode number: " + episodeNumber + ".\nError Code: " + ex.Status); + return null; + } + } } } diff --git a/Kyoo/InternalAPI/MetadataProvider/ProviderManager.cs b/Kyoo/InternalAPI/MetadataProvider/ProviderManager.cs index ce34186f..fe43254c 100644 --- a/Kyoo/InternalAPI/MetadataProvider/ProviderManager.cs +++ b/Kyoo/InternalAPI/MetadataProvider/ProviderManager.cs @@ -3,7 +3,6 @@ using Kyoo.Models; using Microsoft.Extensions.Configuration; using System; using System.Collections.Generic; -using System.Diagnostics; using System.IO; using System.Reflection; using System.Threading.Tasks; @@ -96,5 +95,10 @@ namespace Kyoo.InternalAPI { return providers[0].GetSeasonImage(showName, seasonNumber); } + + public Task GetEpisode(string externalIDs, long seasonNumber, long episodeNumber) + { + return providers[0].GetEpisode(externalIDs, seasonNumber, episodeNumber); + } } } diff --git a/Kyoo/Models/Episode.cs b/Kyoo/Models/Episode.cs index a79f717a..886e3ff2 100644 --- a/Kyoo/Models/Episode.cs +++ b/Kyoo/Models/Episode.cs @@ -5,8 +5,8 @@ namespace Kyoo.Models public class Episode { public readonly long id; - public readonly long ShowID; - public readonly long SeasonID; + public long ShowID; + public long SeasonID; public long episodeNumber; public string Title; @@ -25,5 +25,36 @@ namespace Kyoo.Models return Runtime / 60; } } + + + public Episode() { } + + public Episode(long episodeNumber, string title, string overview, DateTime releaseDate, long runtime, string imgPrimary, string externalIDs) + { + id = -1; + ShowID = -1; + SeasonID = -1; + this.episodeNumber = episodeNumber; + Title = title; + Overview = overview; + ReleaseDate = releaseDate; + Runtime = runtime; + ImgPrimary = imgPrimary; + ExternalIDs = externalIDs; + } + + public Episode(long id, long showID, long seasonID, long episodeNumber, string title, string overview, DateTime releaseDate, long runtime, string imgPrimary, string externalIDs) + { + this.id = id; + ShowID = showID; + SeasonID = seasonID; + this.episodeNumber = episodeNumber; + Title = title; + Overview = overview; + ReleaseDate = releaseDate; + Runtime = runtime; + ImgPrimary = imgPrimary; + ExternalIDs = externalIDs; + } } }