From 5181a6cf4678a787d1e6add17dbc427e89453940 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Wed, 5 Feb 2020 00:47:14 +0100 Subject: [PATCH] Starting to rework the LibraryManager --- Kyoo.Common/Controllers/ILibraryManager.cs | 16 +- Kyoo.Common/Models/Collection.cs | 5 +- Kyoo.Common/Models/CollectionLink.cs | 11 + Kyoo.Common/Models/LibraryLink.cs | 13 + Kyoo.Common/Models/WatchItem.cs | 54 +- Kyoo/.editorconfig | 7 - Kyoo/Controllers/LibraryManager.cs | 1874 +++++++++----------- Kyoo/DatabaseContext.cs | 15 +- Kyoo/HtmlAPI/EpisodesAPI.cs | 14 +- Kyoo/HtmlAPI/LibrariesAPI.cs | 11 +- Kyoo/HtmlAPI/SubtitleAPI.cs | 2 +- Kyoo/Kyoo.csproj.DotSettings | 9 - 12 files changed, 911 insertions(+), 1120 deletions(-) create mode 100644 Kyoo.Common/Models/CollectionLink.cs create mode 100644 Kyoo.Common/Models/LibraryLink.cs delete mode 100644 Kyoo/.editorconfig delete mode 100644 Kyoo/Kyoo.csproj.DotSettings diff --git a/Kyoo.Common/Controllers/ILibraryManager.cs b/Kyoo.Common/Controllers/ILibraryManager.cs index b920219b..24141692 100644 --- a/Kyoo.Common/Controllers/ILibraryManager.cs +++ b/Kyoo.Common/Controllers/ILibraryManager.cs @@ -9,18 +9,18 @@ namespace Kyoo.Controllers //Read values string GetShowExternalIDs(long showID); Studio GetStudio(long showID); - List GetDirectors(long showID); - List GetPeople(long showID); - List GetGenreForShow(long showID); - List GetSeasons(long showID); + IEnumerable GetDirectors(long showID); + IEnumerable GetPeople(long showID); + IEnumerable GetGenreForShow(long showID); + IEnumerable GetSeasons(long showID); int GetSeasonCount(string showSlug, long seasonNumber); IEnumerable GetShowsInCollection(long collectionID); - List GetShowsInLibrary(long libraryID); + IEnumerable GetShowsInLibrary(long libraryID); IEnumerable GetShowsByPeople(long peopleID); IEnumerable GetLibrariesPath(); //Internal read - (Track video, List audios, List subtitles) GetStreams(long episodeID, string showSlug); + (Track video, IEnumerable audios, IEnumerable subtitles) GetStreams(long episodeID, string showSlug); Track GetSubtitle(string showSlug, long seasonNumber, long episodeNumber, string languageTag, bool forced); //Public read @@ -30,8 +30,8 @@ namespace Kyoo.Controllers IEnumerable GetLibraries(); Show GetShowBySlug(string slug); Season GetSeason(string showSlug, long seasonNumber); - List GetEpisodes(string showSlug); - List GetEpisodes(string showSlug, long seasonNumber); + IEnumerable GetEpisodes(string showSlug); + IEnumerable GetEpisodes(string showSlug, long seasonNumber); Episode GetEpisode(string showSlug, long seasonNumber, long episodeNumber); WatchItem GetWatchItem(string showSlug, long seasonNumber, long episodeNumber, bool complete = true); People GetPeopleBySlug(string slug); diff --git a/Kyoo.Common/Models/Collection.cs b/Kyoo.Common/Models/Collection.cs index fb3aee7d..ecf522f6 100644 --- a/Kyoo.Common/Models/Collection.cs +++ b/Kyoo.Common/Models/Collection.cs @@ -39,7 +39,10 @@ namespace Kyoo.Models public Show AsShow() { - return new Show(-1, Slug, Name, null, null, Overview, null, null, null, null, null, null); + return new Show(-1, Slug, Name, null, null, Overview, null, null, null, null, null, null) + { + IsCollection = true + }; } public Collection SetShows(ILibraryManager libraryManager) diff --git a/Kyoo.Common/Models/CollectionLink.cs b/Kyoo.Common/Models/CollectionLink.cs new file mode 100644 index 00000000..b4baf772 --- /dev/null +++ b/Kyoo.Common/Models/CollectionLink.cs @@ -0,0 +1,11 @@ +namespace Kyoo.Models +{ + public class CollectionLink + { + public long ID { get; set; } + public long? CollectionID { get; set; } + public virtual Collection Collection { get; set; } + public long ShowID { get; set; } + public virtual Show Show { get; set; } + } +} \ No newline at end of file diff --git a/Kyoo.Common/Models/LibraryLink.cs b/Kyoo.Common/Models/LibraryLink.cs new file mode 100644 index 00000000..86635adf --- /dev/null +++ b/Kyoo.Common/Models/LibraryLink.cs @@ -0,0 +1,13 @@ +namespace Kyoo.Models +{ + public class LibraryLink + { + public long ID { get; set; } + public long LibraryID { get; set; } + public virtual Library Library { get; set; } + public long? ShowID { get; set; } + public virtual Show Show { get; set; } + public long? CollectionID { get; set; } + public virtual Collection Collection { get; set; } + } +} \ No newline at end of file diff --git a/Kyoo.Common/Models/WatchItem.cs b/Kyoo.Common/Models/WatchItem.cs index 34eb0964..e488fa2d 100644 --- a/Kyoo.Common/Models/WatchItem.cs +++ b/Kyoo.Common/Models/WatchItem.cs @@ -1,5 +1,4 @@ -using Kyoo.Controllers; -using Newtonsoft.Json; +using Newtonsoft.Json; using System; using System.Collections.Generic; @@ -38,60 +37,15 @@ namespace Kyoo.Models ReleaseDate = releaseDate; Path = path; + Container = Path.Substring(Path.LastIndexOf('.') + 1); Link = Episode.GetSlug(ShowSlug, seasonNumber, episodeNumber); } - public WatchItem(long episodeID, string showTitle, string showSlug, long seasonNumber, long episodeNumber, string title, DateTime? releaseDate, string path, Track[] audios, Track[] subtitles) : this(episodeID, showTitle, showSlug, seasonNumber, episodeNumber, title, releaseDate, path) + public WatchItem(long episodeID, string showTitle, string showSlug, long seasonNumber, long episodeNumber, string title, DateTime? releaseDate, string path, Track[] audios, Track[] subtitles) + : this(episodeID, showTitle, showSlug, seasonNumber, episodeNumber, title, releaseDate, path) { Audios = audios; Subtitles = subtitles; } - - public static WatchItem FromReader(System.Data.SQLite.SQLiteDataReader reader) - { - return new WatchItem((long)reader["id"], - reader["showTitle"] as string, - reader["showSlug"] as string, - (long)reader["seasonNumber"], - (long)reader["episodeNumber"], - reader["title"] as string, - reader["releaseDate"] as DateTime?, - reader["path"] as string); - } - - public WatchItem SetStreams(ILibraryManager libraryManager) - { - (Track video, IEnumerable audios, IEnumerable subtitles) streams = libraryManager.GetStreams(EpisodeID, Link); - - Container = Path.Substring(Path.LastIndexOf('.') + 1); - Video = streams.video; - Audios = streams.audios; - Subtitles = streams.subtitles; - return this; - } - - public WatchItem SetPrevious(ILibraryManager libraryManager) - { - long lastEp = EpisodeNumber - 1; - if(lastEp > 0) - PreviousEpisode = ShowSlug + "-s" + SeasonNumber + "e" + lastEp; - else if(SeasonNumber > 1) - { - int seasonCount = libraryManager.GetSeasonCount(ShowSlug, SeasonNumber - 1); - PreviousEpisode = ShowSlug + "-s" + (SeasonNumber - 1) + "e" + seasonCount; - } - return this; - } - - public WatchItem SetNext(ILibraryManager libraryManager) - { - long seasonCount = libraryManager.GetSeasonCount(ShowSlug, SeasonNumber); - if (EpisodeNumber >= seasonCount) - NextEpisode = libraryManager.GetEpisode(ShowSlug, SeasonNumber + 1, 1); - else - NextEpisode = libraryManager.GetEpisode(ShowSlug, SeasonNumber, EpisodeNumber + 1); - - return this; - } } } diff --git a/Kyoo/.editorconfig b/Kyoo/.editorconfig deleted file mode 100644 index d7809230..00000000 --- a/Kyoo/.editorconfig +++ /dev/null @@ -1,7 +0,0 @@ -[*.cs] - -# CS4014: Because this call is not awaited, execution of the current method continues before the call is completed -dotnet_diagnostic.CS4014.severity = silent - -# IDE1006: Naming Styles -dotnet_diagnostic.IDE1006.severity = none diff --git a/Kyoo/Controllers/LibraryManager.cs b/Kyoo/Controllers/LibraryManager.cs index 24ec9cee..abe9858b 100644 --- a/Kyoo/Controllers/LibraryManager.cs +++ b/Kyoo/Controllers/LibraryManager.cs @@ -1,1030 +1,862 @@ using Kyoo.Models; using Kyoo.Models.Watch; -using Microsoft.Extensions.Configuration; using System; using System.Collections.Generic; using System.Data.SQLite; -using System.Diagnostics; -using System.IO; +using System.Linq; namespace Kyoo.Controllers { - public class LibraryManager : ILibraryManager - { - private readonly DatabaseContext _database; - private readonly SQLiteConnection sqlConnection; - - - public LibraryManager(DatabaseContext database) - { - _database = database; - } - - ~LibraryManager() - { - sqlConnection.Close(); - } - - #region Read the database - public IEnumerable GetLibraries() - { - return _database.Libraries; - } - - public IEnumerable GetLibrariesPath() - { - const string query = "SELECT path FROM libraries;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - SQLiteDataReader reader = cmd.ExecuteReader(); - - List libraries = new List(); - - while (reader.Read()) - libraries.Add(reader["path"] as string); - - return libraries; - } - } - - public string GetShowExternalIDs(long showID) - { - string query = "SELECT * FROM shows WHERE id = $showID;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$showID", showID); - SQLiteDataReader reader = cmd.ExecuteReader(); - - if (reader.Read()) - return Show.FromReader(reader).ExternalIDs; - else - return null; - } - } - - - public (Track video, List audios, List subtitles) GetStreams(long episodeID, string episodeSlug) - { - string query = "SELECT * FROM tracks WHERE episodeID = $episodeID;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$episodeID", episodeID); - SQLiteDataReader reader = cmd.ExecuteReader(); - - Track video = null; - List audios = new List(); - List subtitles = new List(); - - while (reader.Read()) - { - Track track = Track.FromReader(reader).SetLink(episodeSlug); - - if (track.Type == StreamType.Video) - video = track; - else if (track.Type == StreamType.Audio) - audios.Add(track); - else if (track.Type == StreamType.Subtitle) - subtitles.Add(track); - } - - return (video, audios, subtitles); - } - } - - public Track GetSubtitle(string showSlug, long seasonNumber, long episodeNumber, string languageTag, bool forced) - { - string query = "SELECT tracks.* FROM tracks JOIN episodes ON tracks.episodeID = episodes.id JOIN shows ON episodes.showID = shows.id WHERE shows.slug = $showSlug AND episodes.seasonNumber = $seasonNumber AND episodes.episodeNumber = $episodeNumber AND tracks.language = $languageTag AND tracks.isForced = $forced;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$showSlug", showSlug); - cmd.Parameters.AddWithValue("$seasonNumber", seasonNumber); - cmd.Parameters.AddWithValue("$episodeNumber", episodeNumber); - cmd.Parameters.AddWithValue("$languageTag", languageTag); - cmd.Parameters.AddWithValue("$forced", forced); - SQLiteDataReader reader = cmd.ExecuteReader(); - - if (reader.Read()) - return Track.FromReader(reader).SetLink(Episode.GetSlug(showSlug, seasonNumber, episodeNumber)); - - return null; - } - } - - - public Library GetLibrary(string librarySlug) - { - string query = "SELECT * FROM libraries WHERE slug = $slug;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$slug", librarySlug); - SQLiteDataReader reader = cmd.ExecuteReader(); - - if (reader.Read()) - return Library.FromReader(reader); - else - return null; - } - } - - public IEnumerable GetShows() - { - List shows = new List(); - SQLiteDataReader reader; - string query = "SELECT slug, title, startYear, endYear, '0' FROM shows LEFT JOIN collectionsLinks l ON l.showID = shows.id WHERE l.showID IS NULL UNION SELECT slug, name, startYear, endYear, '1' FROM collections ORDER BY title;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - reader = cmd.ExecuteReader(); - while (reader.Read()) - shows.Add(Show.FromQueryReader(reader)); - } - return shows; - } - - public IEnumerable GetShows(string searchQuery) - { - List shows = new List(); - SQLiteDataReader reader; - string query = "SELECT slug, title, aliases, startYear, endYear, '0' FROM (SELECT slug, title, aliases, startYear, endYear, '0' FROM shows LEFT JOIN collectionsLinks l ON l.showID = shows.id WHERE l.showID IS NULL UNION SELECT slug, name, null, startYear, endYear, '1' FROM collections) WHERE title LIKE $query OR aliases LIKE $query ORDER BY title;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$query", "%" + searchQuery + "%"); - reader = cmd.ExecuteReader(); - while (reader.Read()) - shows.Add(Show.FromQueryReader(reader, true)); - } - return shows; - } - - public Show GetShowBySlug(string slug) - { - string query = "SELECT * FROM shows WHERE slug = $slug;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$slug", slug); - SQLiteDataReader reader = cmd.ExecuteReader(); - - if (reader.Read()) - return Show.FromReader(reader).SetGenres(this).SetStudio(this).SetDirectors(this).SetSeasons(this).SetPeople(this); - else - return null; - } - } - - public List GetSeasons(long showID) - { - string query = "SELECT * FROM seasons WHERE showID = $showID ORDER BY seasonNumber;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$showID", showID); - SQLiteDataReader reader = cmd.ExecuteReader(); - - List seasons = new List(); - - while (reader.Read()) - seasons.Add(Season.FromReader(reader)); - - return seasons; - } - } - - public Season GetSeason(string showSlug, long seasonNumber) - { - string query = "SELECT * FROM seasons JOIN shows ON shows.id = seasons.showID WHERE shows.slug = $showSlug AND seasons.seasonNumber = $seasonNumber;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$showSlug", showSlug); - cmd.Parameters.AddWithValue("$seasonNumber", seasonNumber); - SQLiteDataReader reader = cmd.ExecuteReader(); - - if (reader.Read()) - return Season.FromReader(reader); - else - return null; - } - } - - public int GetSeasonCount(string showSlug, long seasonNumber) - { - string query = "SELECT count(episodes.id) FROM episodes JOIN shows ON shows.id = episodes.showID WHERE shows.slug = $showSlug AND episodes.seasonNumber = $seasonNumber;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$showSlug", showSlug); - cmd.Parameters.AddWithValue("$seasonNumber", seasonNumber); - - int count = Convert.ToInt32(cmd.ExecuteScalar()); - return count; - } - } - - public List GetEpisodes(string showSlug) - { - string query = "SELECT * FROM episodes JOIN shows ON shows.id = episodes.showID WHERE shows.slug = $showSlug ORDER BY episodeNumber;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$showSlug", showSlug); - SQLiteDataReader reader = cmd.ExecuteReader(); - - List episodes = new List(); - - while (reader.Read()) - episodes.Add(Episode.FromReader(reader).SetThumb(showSlug)); - - return episodes; - } - } - - public List GetEpisodes(string showSlug, long seasonNumber) - { - string query = "SELECT * FROM episodes JOIN shows ON shows.id = episodes.showID WHERE shows.slug = $showSlug AND episodes.seasonNumber = $seasonNumber ORDER BY episodeNumber;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$showSlug", showSlug); - cmd.Parameters.AddWithValue("$seasonNumber", seasonNumber); - SQLiteDataReader reader = cmd.ExecuteReader(); - - List episodes = new List(); - - while (reader.Read()) - episodes.Add(Episode.FromReader(reader).SetThumb(showSlug)); - - return episodes; - } - } - - public List GetEpisodes(long showID, long seasonNumber) - { - string query = "SELECT * FROM episodes WHERE episodes.showID = $showID AND episodes.seasonNumber = $seasonNumber ORDER BY episodeNumber;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$showID", showID); - cmd.Parameters.AddWithValue("$seasonNumber", seasonNumber); - SQLiteDataReader reader = cmd.ExecuteReader(); - - List episodes = new List(); - - while (reader.Read()) - episodes.Add(Episode.FromReader(reader)); - - return episodes; - } - } - - public Episode GetEpisode(string showSlug, long seasonNumber, long episodeNumber) - { - string query = "SELECT * FROM episodes JOIN shows ON shows.id = episodes.showID WHERE shows.slug = $showSlug AND episodes.seasonNumber = $seasonNumber AND episodes.episodeNumber = $episodeNumber;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$showSlug", showSlug); - cmd.Parameters.AddWithValue("$seasonNumber", seasonNumber); - cmd.Parameters.AddWithValue("$episodeNumber", episodeNumber); - SQLiteDataReader reader = cmd.ExecuteReader(); - - if (reader.Read()) - return Episode.FromReader(reader).SetThumb(showSlug); - else - return null; - } - } - - public WatchItem GetWatchItem(string showSlug, long seasonNumber, long episodeNumber, bool complete = true) - { - string query = "SELECT episodes.id, shows.title as showTitle, shows.slug as showSlug, seasonNumber, episodeNumber, episodes.title, releaseDate, episodes.path FROM episodes JOIN shows ON shows.id = episodes.showID WHERE shows.slug = $showSlug AND episodes.seasonNumber = $seasonNumber AND episodes.episodeNumber = $episodeNumber;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$showSlug", showSlug); - cmd.Parameters.AddWithValue("$seasonNumber", seasonNumber); - cmd.Parameters.AddWithValue("$episodeNumber", episodeNumber); - SQLiteDataReader reader = cmd.ExecuteReader(); - - if (reader.Read()) - { - if (complete) - return WatchItem.FromReader(reader).SetStreams(this).SetPrevious(this).SetNext(this); - else - return WatchItem.FromReader(reader); - } - else - return null; - } - } - - public List GetPeople(long showID) - { - string query = "SELECT people.id, people.slug, people.name, people.imgPrimary, people.externalIDs, l.role, l.type FROM people JOIN peopleLinks l ON l.peopleID = people.id WHERE l.showID = $showID;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$showID", showID); - SQLiteDataReader reader = cmd.ExecuteReader(); - - List people = new List(); - - while (reader.Read()) - people.Add(People.FromFullReader(reader)); - - return people; - } - } - - public People GetPeopleBySlug(string slug) - { - string query = "SELECT * FROM people WHERE slug = $slug;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$slug", slug); - SQLiteDataReader reader = cmd.ExecuteReader(); - - if (reader.Read()) - return People.FromReader(reader); - else - return null; - } - } - - public List GetGenreForShow(long showID) - { - string query = "SELECT genres.id, genres.slug, genres.name FROM genres JOIN genresLinks l ON l.genreID = genres.id WHERE l.showID = $showID;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$showID", showID); - SQLiteDataReader reader = cmd.ExecuteReader(); - - List genres = new List(); - - while (reader.Read()) - genres.Add(Genre.FromReader(reader)); - - return genres; - } - } - - public Genre GetGenreBySlug(string slug) - { - string query = "SELECT * FROM genres WHERE slug = $slug;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$slug", slug); - SQLiteDataReader reader = cmd.ExecuteReader(); - - if (reader.Read()) - return Genre.FromReader(reader); - else - return null; - } - } - - public Studio GetStudio(long showID) - { - string query = "SELECT studios.id, studios.slug, studios.name FROM studios JOIN studiosLinks l ON l.studioID = studios.id WHERE l.showID = $showID;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$showID", showID); - SQLiteDataReader reader = cmd.ExecuteReader(); - - if (reader.Read()) - return Studio.FromReader(reader); - else - return Studio.Default(); - } - } - - public Studio GetStudioBySlug(string slug) - { - string query = "SELECT * FROM studios WHERE slug = $slug;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$slug", slug); - SQLiteDataReader reader = cmd.ExecuteReader(); - - if (reader.Read()) - return Studio.FromReader(reader); - else - return null; - } - } - - public List GetDirectors(long showID) - { - return null; - //string query = "SELECT genres.id, genres.slug, genres.name FROM genres JOIN genresLinks l ON l.genreID = genres.id WHERE l.showID = $showID;"; - - //using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - //{ - // cmd.Parameters.AddWithValue("$showID", showID); - // SQLiteDataReader reader = cmd.ExecuteReader(); - - // List genres = new List(); - - // while (reader.Read()) - // genres.Add(Genre.FromReader(reader)); - - // return genres; - //} - } - - public Collection GetCollection(string slug) - { - string query = "SELECT * FROM collections WHERE slug = $slug;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$slug", slug); - SQLiteDataReader reader = cmd.ExecuteReader(); - - if (reader.Read()) - return Collection.FromReader(reader).SetShows(this); - else - return null; - } - } - - public IEnumerable GetShowsInCollection(long collectionID) - { - string query = "SELECT * FROM shows JOIN collectionsLinks l ON l.showID = shows.id WHERE l.collectionID = $id ORDER BY title;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$id", collectionID); - SQLiteDataReader reader = cmd.ExecuteReader(); - List shows = new List(); - while (reader.Read()) - shows.Add(Show.FromReader(reader)); - - return shows; - } - } - - public List GetShowsInLibrary(long libraryID) - { - List shows = new List(); - SQLiteDataReader reader; - string query = "SELECT id, slug, title, startYear, endYear, '0' FROM (SELECT id, slug, title, startYear, endYear, '0' FROM shows JOIN librariesLinks lb ON lb.showID = id WHERE lb.libraryID = $libraryID) LEFT JOIN collectionsLinks l ON l.showID = id WHERE l.showID IS NULL UNION SELECT id, slug, name, startYear, endYear, '1' FROM collections JOIN collectionsLinks l ON l.collectionID = collections.id JOIN librariesLinks lb ON lb.showID = l.showID WHERE lb.libraryID = $libraryID ORDER BY title;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$libraryID", libraryID); - reader = cmd.ExecuteReader(); - while (reader.Read()) - shows.Add(Show.FromQueryReader(reader)); - } - return shows; - } - - public IEnumerable GetShowsByPeople(long peopleID) - { - string query = "SELECT * FROM shows JOIN peopleLinks l ON l.showID = shows.id WHERE l.peopleID = $id ORDER BY title;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$id", peopleID); - SQLiteDataReader reader = cmd.ExecuteReader(); - List shows = new List(); - while (reader.Read()) - shows.Add(Show.FromReader(reader)); - - return shows; - } - } - - public IEnumerable GetAllEpisodes() - { - List episodes = new List(); - string query = "SELECT * FROM episodes;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - SQLiteDataReader reader = cmd.ExecuteReader(); - - while (reader.Read()) - episodes.Add(Episode.FromReader(reader)); - return episodes; - } - } - - public IEnumerable SearchEpisodes(string searchQuery) - { - List episodes = new List(); - SQLiteDataReader reader; - string query = "SELECT episodes.*, shows.slug, shows.title as showTitle FROM episodes JOIN shows ON showID = shows.id WHERE episodes.title LIKE $query ORDER BY seasonNumber, episodeNumber LIMIT 20;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$query", "%" + searchQuery + "%"); - reader = cmd.ExecuteReader(); - while (reader.Read()) - episodes.Add(Episode.FromReader(reader).SetThumb(reader["slug"] as string).SetShowTitle(reader["showTitle"] as string)); - } - return episodes; - } - - public IEnumerable SearchPeople(string searchQuery) - { - List people = new List(); - SQLiteDataReader reader; - string query = "SELECT * FROM people WHERE name LIKE $query ORDER BY name LIMIT 40;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$query", "%" + searchQuery + "%"); - reader = cmd.ExecuteReader(); - while (reader.Read()) - people.Add(People.FromReader(reader)); - } - return people; - } - - public IEnumerable SearchGenres(string searchQuery) - { - List genres = new List(); - SQLiteDataReader reader; - string query = "SELECT * FROM genres WHERE name LIKE $query ORDER BY name;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$query", "%" + searchQuery + "%"); - reader = cmd.ExecuteReader(); - while (reader.Read()) - genres.Add(Genre.FromReader(reader)); - } - return genres; - } - - public IEnumerable SearchStudios(string searchQuery) - { - List studios = new List(); - SQLiteDataReader reader; - string query = "SELECT * FROM studios WHERE name LIKE $query ORDER BY name;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$query", "%" + searchQuery + "%"); - reader = cmd.ExecuteReader(); - while (reader.Read()) - studios.Add(Studio.FromReader(reader)); - } - return studios; - } - #endregion - - #region Check if items exists - public bool IsCollectionRegistered(string collectionSlug) - { - string query = "SELECT (id) FROM collections WHERE slug = $slug;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$slug", collectionSlug); - - return cmd.ExecuteScalar() != null; - } - } - - public bool IsCollectionRegistered(string collectionSlug, out long collectionID) - { - string query = "SELECT (id) FROM collections WHERE slug = $slug;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$slug", collectionSlug); - collectionID = cmd.ExecuteScalar() as long? ?? -1; - - return collectionID != -1; - } - } - - public bool IsShowRegistered(string showPath) - { - string query = "SELECT (id) FROM shows WHERE path = $path;"; - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$path", showPath); - - return cmd.ExecuteScalar() != null; - } - } - - public bool IsShowRegistered(string showPath, out long showID) - { - string query = "SELECT (id) FROM shows WHERE path = $path;"; - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$path", showPath); - showID = cmd.ExecuteScalar() as long? ?? -1; - - return showID != -1; - } - } - - public bool IsSeasonRegistered(long showID, long seasonNumber) - { - string query = "SELECT (id) FROM seasons WHERE showID = $showID AND seasonNumber = $seasonNumber;"; - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$showID", showID); - cmd.Parameters.AddWithValue("$seasonNumber", seasonNumber); - - return cmd.ExecuteScalar() != null; - } - } - - public bool IsSeasonRegistered(long showID, long seasonNumber, out long seasonID) - { - string query = "SELECT (id) FROM seasons WHERE showID = $showID AND seasonNumber = $seasonNumber;"; - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$showID", showID); - cmd.Parameters.AddWithValue("$seasonNumber", seasonNumber); - seasonID = cmd.ExecuteScalar() as long? ?? -1; - - return seasonID != -1; - } - } - - public bool IsEpisodeRegistered(string episodePath) - { - string query = "SELECT (id) FROM episodes WHERE path = $path;"; - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$path", episodePath); - - return cmd.ExecuteScalar() != null; - } - } - - public long GetOrCreateGenre(Genre genre) - { - Genre existingGenre = GetGenreBySlug(genre.Slug); - - if (existingGenre != null) - return existingGenre.Id; - - string query = "INSERT INTO genres (slug, name) VALUES($slug, $name);"; - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - try - { - cmd.Parameters.AddWithValue("$slug", genre.Slug); - cmd.Parameters.AddWithValue("$name", genre.Name); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT LAST_INSERT_ROWID()"; - return (long)cmd.ExecuteScalar(); - } - catch - { - Console.Error.WriteLine("SQL error while trying to insert a people ({0}).", genre.Name); - cmd.CommandText = "SELECT * FROM genres WHERE slug = $slug"; - cmd.Parameters.AddWithValue("$slug", genre.Slug); - return (long)cmd.ExecuteScalar(); - } - } - } - - public long GetOrCreateStudio(Studio studio) - { - Studio existingStudio = GetStudioBySlug(studio.Slug); - - if (existingStudio != null) - return existingStudio.ID; - - string query = "INSERT INTO studios (slug, name) VALUES($slug, $name);"; - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - try - { - cmd.Parameters.AddWithValue("$slug", studio.Slug); - cmd.Parameters.AddWithValue("$name", studio.Name); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT LAST_INSERT_ROWID()"; - return (long)cmd.ExecuteScalar(); - } - catch (SQLiteException) - { - Console.Error.WriteLine("SQL error while trying to insert a studio ({0}).", studio.Name); - cmd.CommandText = "SELECT * FROM studios WHERE slug = $slug"; - cmd.Parameters.AddWithValue("$slug", studio.Slug); - return (long)cmd.ExecuteScalar(); - } - } - } - - public long GetOrCreatePeople(People people) - { - People existingPeople = GetPeopleBySlug(people.Slug); - - if (existingPeople != null) - return existingPeople.ID; - - string query = "INSERT INTO people (slug, name, imgPrimary, externalIDs) VALUES($slug, $name, $imgPrimary, $externalIDs);"; - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - try - { - cmd.Parameters.AddWithValue("$slug", people.Slug); - cmd.Parameters.AddWithValue("$name", people.Name); - cmd.Parameters.AddWithValue("$imgPrimary", people.ImgPrimary); - cmd.Parameters.AddWithValue("$externalIDs", people.ExternalIDs); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT LAST_INSERT_ROWID()"; - return (long)cmd.ExecuteScalar(); - } - catch - { - Console.Error.WriteLine("SQL error while trying to insert a people ({0}).", people.Name); - cmd.CommandText = "SELECT * FROM people WHERE slug = $slug"; - cmd.Parameters.AddWithValue("$slug", people.Slug); - return (long)cmd.ExecuteScalar(); - } - - } - } - #endregion - - #region Write Into The Database - public long RegisterCollection(Collection collection) - { - string query = "INSERT INTO collections (slug, name, overview, imgPrimary) VALUES($slug, $name, $overview, $imgPrimary);"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - try - { - cmd.Parameters.AddWithValue("$slug", collection.Slug); - cmd.Parameters.AddWithValue("$name", collection.Name); - cmd.Parameters.AddWithValue("$overview", collection.Overview); - cmd.Parameters.AddWithValue("$imgPrimary", collection.ImgPrimary); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT LAST_INSERT_ROWID()"; - return (long)cmd.ExecuteScalar(); - } - catch - { - Console.Error.WriteLine("SQL error while trying to create a collection. Collection probably already registered."); - cmd.CommandText = "SELECT * FROM collections WHERE slug = $slug"; - cmd.Parameters.AddWithValue("$slug", collection.Slug); - return (long)cmd.ExecuteScalar(); - } - } - } - - public void RegisterInLibrary(long showID, Library library) - { - string query = - "INSERT INTO librariesLinks (libraryID, showID) SELECT id, $showID FROM libraries WHERE libraries.id = $libraryID;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$libraryID", library.Id); - cmd.Parameters.AddWithValue("$showID", showID); - cmd.ExecuteNonQuery(); - } - } - - public long RegisterShow(Show show) - { - string query = "INSERT INTO shows (slug, title, aliases, path, overview, trailerUrl, startYear, endYear, imgPrimary, imgThumb, imgLogo, imgBackdrop, externalIDs) VALUES($slug, $title, $aliases, $path, $overview, $trailerUrl, $startYear, $endYear, $imgPrimary, $imgThumb, $imgLogo, $imgBackdrop, $externalIDs);"; - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - try - { - cmd.Parameters.AddWithValue("$slug", show.Slug); - cmd.Parameters.AddWithValue("$title", show.Title); - cmd.Parameters.AddWithValue("$aliases", show.GetAliases()); - cmd.Parameters.AddWithValue("$path", show.Path); - cmd.Parameters.AddWithValue("$overview", show.Overview); - cmd.Parameters.AddWithValue("$trailerUrl", show.TrailerUrl); - cmd.Parameters.AddWithValue("$status", show.Status); - cmd.Parameters.AddWithValue("$startYear", show.StartYear); - cmd.Parameters.AddWithValue("$endYear", show.EndYear); - cmd.Parameters.AddWithValue("$imgPrimary", show.ImgPrimary); - cmd.Parameters.AddWithValue("$imgThumb", show.ImgThumb); - cmd.Parameters.AddWithValue("$imgLogo", show.ImgLogo); - cmd.Parameters.AddWithValue("$imgBackdrop", show.ImgBackdrop); - cmd.Parameters.AddWithValue("$externalIDs", show.ExternalIDs); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT LAST_INSERT_ROWID()"; - long showID = (long)cmd.ExecuteScalar(); - - if (show.Genres != null) - { - cmd.CommandText = "INSERT INTO genresLinks (genreID, showID) VALUES($genreID, $showID);"; - foreach (Genre genre in show.Genres) - { - long genreID = GetOrCreateGenre(genre); - cmd.Parameters.AddWithValue("$genreID", genreID); - cmd.Parameters.AddWithValue("$showID", showID); - cmd.ExecuteNonQuery(); - } - } - - if (show.Studio != null) - { - cmd.CommandText = "INSERT INTO studiosLinks (studioID, showID) VALUES($studioID, $showID);"; - long studioID = GetOrCreateStudio(show.Studio); - cmd.Parameters.AddWithValue("$studioID", studioID); - cmd.Parameters.AddWithValue("$showID", showID); - cmd.ExecuteNonQuery(); - } - - return showID; - } - catch - { - Console.Error.WriteLine("SQL error while trying to insert a show ({0}), show probably already registered.", show.Title); - return -1; - } - } - } - - public long RegisterSeason(Season season) - { - string query = "INSERT INTO seasons (showID, seasonNumber, title, overview, year, imgPrimary, externalIDs) VALUES($showID, $seasonNumber, $title, $overview, $year, $imgPrimary, $externalIDs);"; - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - try - { - cmd.Parameters.AddWithValue("$showID", season.ShowID); - cmd.Parameters.AddWithValue("$seasonNumber", season.SeasonNumber); - cmd.Parameters.AddWithValue("$title", season.Title); - cmd.Parameters.AddWithValue("$overview", season.Overview); - cmd.Parameters.AddWithValue("$year", season.Year); - cmd.Parameters.AddWithValue("$imgPrimary", season.ImgPrimary); - cmd.Parameters.AddWithValue("$externalIDs", season.ExternalIDs); - cmd.ExecuteNonQuery(); - - cmd.CommandText = "SELECT LAST_INSERT_ROWID()"; - return (long)cmd.ExecuteScalar(); - } - catch - { - Console.Error.WriteLine("SQL error while trying to insert a season ({0}), season probably already registered.", season.Title); - cmd.CommandText = "SELECT * FROM seasons WHERE showID = $showID AND seasonNumber = $seasonNumber"; - cmd.Parameters.AddWithValue("$showID", season.ShowID); - cmd.Parameters.AddWithValue("$seasonNumber", season.SeasonNumber); - return (long)cmd.ExecuteScalar(); - } - } - } - - public long RegisterEpisode(Episode episode) - { - 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)) - { - try - { - 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); - 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(); - } - catch - { - Console.Error.WriteLine("SQL error while trying to insert an episode ({0}), episode probably already registered.", episode.Link); - cmd.CommandText = "SELECT * FROM episodes WHERE showID = $showID AND seasonNumber = $seasonNumber AND episodeNumber = $episodeNumber"; - cmd.Parameters.AddWithValue("$showID", episode.ShowID); - cmd.Parameters.AddWithValue("$seasonNumber", episode.SeasonNumber); - cmd.Parameters.AddWithValue("$episodeNumber", episode.EpisodeNumber); - return (long)cmd.ExecuteScalar(); - } - } - } - - public void RegisterTrack(Track track) - { - string query = "INSERT INTO tracks (episodeID, streamType, title, language, codec, isDefault, isForced, isExternal, path) VALUES($episodeID, $streamType, $title, $language, $codec, $isDefault, $isForced, $isExternal, $path);"; - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$episodeID", track.EpisodeID); - cmd.Parameters.AddWithValue("$streamType", track.Type); - cmd.Parameters.AddWithValue("$title", track.Title); - cmd.Parameters.AddWithValue("$language", track.Language); - cmd.Parameters.AddWithValue("$codec", track.Codec); - cmd.Parameters.AddWithValue("$isDefault", track.IsDefault); - cmd.Parameters.AddWithValue("$isForced", track.IsForced); - cmd.Parameters.AddWithValue("$isExternal", track.IsExternal); - cmd.Parameters.AddWithValue("$path", track.Path); - cmd.ExecuteNonQuery(); - } - } - - public void RegisterShowPeople(long showID, IEnumerable people) - { - if (people == null) - return; - - string linkQuery = "INSERT INTO peopleLinks (peopleID, showID, role, type) VALUES($peopleID, $showID, $role, $type);"; - - foreach (People peop in people) - { - using (SQLiteCommand cmd = new SQLiteCommand(linkQuery, sqlConnection)) - { - cmd.Parameters.AddWithValue("$peopleID", GetOrCreatePeople(peop)); - cmd.Parameters.AddWithValue("$showID", showID); - cmd.Parameters.AddWithValue("$role", peop.Role); - cmd.Parameters.AddWithValue("$type", peop.Type); - cmd.ExecuteNonQuery(); - } - } - } - - public void AddShowToCollection(long showID, long collectionID) - { - string linkQuery = "INSERT INTO collectionsLinks (collectionID, showID) VALUES($collectionID, $showID);"; - - using (SQLiteCommand cmd = new SQLiteCommand(linkQuery, sqlConnection)) - { - cmd.Parameters.AddWithValue("$collectionID", collectionID); - cmd.Parameters.AddWithValue("$showID", showID); - cmd.ExecuteNonQuery(); - } - } - - public void RemoveShow(long showID) - { - string query = "DELETE FROM shows WHERE id = $showID;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$showID", showID); - cmd.ExecuteNonQuery(); - } - } - - public void RemoveSeason(long showID, long seasonID) - { - string query = "DELETE FROM seasons WHERE id = $seasonID;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$seasonID", seasonID); - cmd.ExecuteNonQuery(); - } - if (GetSeasons(showID).Count == 0) - RemoveShow(showID); - } - - public void RemoveEpisode(Episode episode) - { - string query = "DELETE FROM episodes WHERE id = $episodeID;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$episodeID", episode.Id); - cmd.ExecuteNonQuery(); - } - - if (GetEpisodes(episode.ShowID, episode.SeasonNumber).Count == 0) - RemoveSeason(episode.ShowID, episode.SeasonID); - } - - public void ClearSubtitles(long episodeID) - { - string query = "DELETE FROM tracks WHERE episodeID = $episodeID;"; - - using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) - { - cmd.Parameters.AddWithValue("$episodeID", episodeID); - cmd.ExecuteNonQuery(); - } - } - #endregion - } + public class LibraryManager : ILibraryManager + { + private readonly DatabaseContext _database; + private readonly SQLiteConnection sqlConnection; + + + public LibraryManager(DatabaseContext database) + { + _database = database; + } + + #region Read the database + public IEnumerable GetLibraries() + { + return _database.Libraries; + } + + public IEnumerable GetLibrariesPath() + { + IEnumerable paths = new List(); + return Enumerable.Aggregate(_database.Libraries, paths, (current, lib) => current.Concat(lib.Paths)); + } + + public string GetShowExternalIDs(long showID) + { + return (from show in _database.Shows where show.ID == showID select show.ExternalIDs).FirstOrDefault(); + } + + + public (Track video, IEnumerable audios, IEnumerable subtitles) GetStreams(long episodeID, string episodeSlug) + { + IEnumerable tracks = _database.Tracks.Where(track => track.EpisodeID == episodeID); + return ((from track in tracks where track.Type == StreamType.Video select track.SetLink(episodeSlug)).FirstOrDefault(), + from track in tracks where track.Type == StreamType.Audio select track.SetLink(episodeSlug), + from track in tracks where track.Type == StreamType.Subtitle select track.SetLink(episodeSlug)); + } + + public Track GetSubtitle(string showSlug, long seasonNumber, long episodeNumber, string languageTag, bool forced) + { + long? showID = _database.Shows.FirstOrDefault(x => x.Slug == showSlug)?.ID; + if (showID == null) + return null; + return (from track in _database.Tracks where track.Episode.ShowID == showID + && track.Episode.SeasonNumber == seasonNumber + && track.Episode.EpisodeNumber == episodeNumber + && track.Language == languageTag select track).FirstOrDefault(); + } + + + public Library GetLibrary(string librarySlug) + { + return (from library in _database.Libraries where library.Slug == librarySlug select library).FirstOrDefault(); + } + + public IEnumerable GetShows() + { + return (from show in _database.Shows join link in _database.CollectionLinks on show equals link.Show into gj + from l in gj.DefaultIfEmpty() + where l.CollectionID == null select l.Show).Union( + from collection in _database.Collections select collection.AsShow()).OrderBy(x => x.Title); + } + + public IEnumerable GetShows(string searchQuery) + { + return (from show in _database.Shows join link in _database.CollectionLinks on show equals link.Show into gj + from l in gj.DefaultIfEmpty() + where l.CollectionID == null select l.Show).Union( + from collection in _database.Collections select collection.AsShow()) + .Where(x => x.Title.Contains(searchQuery)).OrderBy(x => x.Title); + } + + public Show GetShowBySlug(string slug) + { + return (from show in _database.Shows where show.Slug == slug select show).FirstOrDefault(); + } + + public IEnumerable GetSeasons(long showID) + { + return from season in _database.Seasons where season.ShowID == showID select season; + } + + public Season GetSeason(string showSlug, long seasonNumber) + { + return (from season in _database.Seasons + where season.SeasonNumber == seasonNumber + && season.Show.Slug == showSlug + select season).FirstOrDefault(); + } + + public int GetSeasonCount(string showSlug, long seasonNumber) + { + return (from season in _database.Seasons + where season.SeasonNumber == seasonNumber + && season.Show.Slug == showSlug + select season).FirstOrDefault()?.Episodes.Count() ?? 0; + } + + public IEnumerable GetEpisodes(string showSlug) + { + return from episode in _database.Episodes where episode.Show.Slug == showSlug select episode; + } + + public IEnumerable GetEpisodes(string showSlug, long seasonNumber) + { + return from episode in _database.Episodes where episode.SeasonNumber == seasonNumber + && episode.Show.Slug == showSlug select episode; + } + + public IEnumerable GetEpisodes(long showID, long seasonNumber) + { + return from episode in _database.Episodes where episode.ShowID == showID + && episode.SeasonNumber == seasonNumber select episode; + } + + public Episode GetEpisode(string showSlug, long seasonNumber, long episodeNumber) + { + return (from episode in _database.Episodes where episode.EpisodeNumber == episodeNumber + && episode.SeasonNumber == seasonNumber + && episode.Show.Slug == showSlug select episode).FirstOrDefault(); + } + + public WatchItem GetWatchItem(string showSlug, long seasonNumber, long episodeNumber, bool complete = true) + { + WatchItem item = (from episode in _database.Episodes where episode.SeasonNumber == seasonNumber + && episode.EpisodeNumber == episodeNumber && episode.Show.Slug == showSlug + select new WatchItem(episode.Id, + episode.Show.Title, + episode.Show.Slug, + seasonNumber, + episodeNumber, + episode.Title, + episode.ReleaseDate, + episode.Path)).FirstOrDefault(); + if (item == null) + return null; + + (item.Video, item.Audios, item.Subtitles) = GetStreams(item.EpisodeID, item.Link); + if(episodeNumber > 1) + item.PreviousEpisode = showSlug + "-s" + seasonNumber + "e" + (episodeNumber - 1); + else if(seasonNumber > 1) + item.PreviousEpisode = showSlug + "-s" + (seasonNumber - 1) + "e" + GetSeasonCount(showSlug, seasonNumber - 1); + + if (episodeNumber >= GetSeasonCount(showSlug, seasonNumber)) + item.NextEpisode = GetEpisode(showSlug, seasonNumber + 1, 1); + else + item.NextEpisode = GetEpisode(showSlug, seasonNumber, episodeNumber + 1); + return item; + } + + public IEnumerable GetPeople(long showID) + { + string query = "SELECT people.id, people.slug, people.name, people.imgPrimary, people.externalIDs, l.role, l.type FROM people JOIN peopleLinks l ON l.peopleID = people.id WHERE l.showID = $showID;"; + + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + cmd.Parameters.AddWithValue("$showID", showID); + SQLiteDataReader reader = cmd.ExecuteReader(); + + List people = new List(); + + while (reader.Read()) + people.Add(People.FromFullReader(reader)); + + return people; + } + } + + public People GetPeopleBySlug(string slug) + { + string query = "SELECT * FROM people WHERE slug = $slug;"; + + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + cmd.Parameters.AddWithValue("$slug", slug); + SQLiteDataReader reader = cmd.ExecuteReader(); + + if (reader.Read()) + return People.FromReader(reader); + else + return null; + } + } + + public IEnumerable GetGenreForShow(long showID) + { + string query = "SELECT genres.id, genres.slug, genres.name FROM genres JOIN genresLinks l ON l.genreID = genres.id WHERE l.showID = $showID;"; + + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + cmd.Parameters.AddWithValue("$showID", showID); + SQLiteDataReader reader = cmd.ExecuteReader(); + + List genres = new List(); + + while (reader.Read()) + genres.Add(Genre.FromReader(reader)); + + return genres; + } + } + + public Genre GetGenreBySlug(string slug) + { + string query = "SELECT * FROM genres WHERE slug = $slug;"; + + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + cmd.Parameters.AddWithValue("$slug", slug); + SQLiteDataReader reader = cmd.ExecuteReader(); + + if (reader.Read()) + return Genre.FromReader(reader); + else + return null; + } + } + + public Studio GetStudio(long showID) + { + string query = "SELECT studios.id, studios.slug, studios.name FROM studios JOIN studiosLinks l ON l.studioID = studios.id WHERE l.showID = $showID;"; + + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + cmd.Parameters.AddWithValue("$showID", showID); + SQLiteDataReader reader = cmd.ExecuteReader(); + + if (reader.Read()) + return Studio.FromReader(reader); + else + return Studio.Default(); + } + } + + public Studio GetStudioBySlug(string slug) + { + string query = "SELECT * FROM studios WHERE slug = $slug;"; + + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + cmd.Parameters.AddWithValue("$slug", slug); + SQLiteDataReader reader = cmd.ExecuteReader(); + + if (reader.Read()) + return Studio.FromReader(reader); + else + return null; + } + } + + public IEnumerable GetDirectors(long showID) + { + return null; + //string query = "SELECT genres.id, genres.slug, genres.name FROM genres JOIN genresLinks l ON l.genreID = genres.id WHERE l.showID = $showID;"; + + //using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + //{ + // cmd.Parameters.AddWithValue("$showID", showID); + // SQLiteDataReader reader = cmd.ExecuteReader(); + + // List genres = new List(); + + // while (reader.Read()) + // genres.Add(Genre.FromReader(reader)); + + // return genres; + //} + } + + public Collection GetCollection(string slug) + { + string query = "SELECT * FROM collections WHERE slug = $slug;"; + + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + cmd.Parameters.AddWithValue("$slug", slug); + SQLiteDataReader reader = cmd.ExecuteReader(); + + if (reader.Read()) + return Collection.FromReader(reader).SetShows(this); + else + return null; + } + } + + public IEnumerable GetShowsInCollection(long collectionID) + { + string query = "SELECT * FROM shows JOIN collectionsLinks l ON l.showID = shows.id WHERE l.collectionID = $id ORDER BY title;"; + + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + cmd.Parameters.AddWithValue("$id", collectionID); + SQLiteDataReader reader = cmd.ExecuteReader(); + List shows = new List(); + while (reader.Read()) + shows.Add(Show.FromReader(reader)); + + return shows; + } + } + + public IEnumerable GetShowsInLibrary(long libraryID) + { + List shows = new List(); + SQLiteDataReader reader; + string query = "SELECT id, slug, title, startYear, endYear, '0' FROM (SELECT id, slug, title, startYear, endYear, '0' FROM shows JOIN librariesLinks lb ON lb.showID = id WHERE lb.libraryID = $libraryID) LEFT JOIN collectionsLinks l ON l.showID = id WHERE l.showID IS NULL UNION SELECT id, slug, name, startYear, endYear, '1' FROM collections JOIN collectionsLinks l ON l.collectionID = collections.id JOIN librariesLinks lb ON lb.showID = l.showID WHERE lb.libraryID = $libraryID ORDER BY title;"; + + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + cmd.Parameters.AddWithValue("$libraryID", libraryID); + reader = cmd.ExecuteReader(); + while (reader.Read()) + shows.Add(Show.FromQueryReader(reader)); + } + return shows; + } + + public IEnumerable GetShowsByPeople(long peopleID) + { + string query = "SELECT * FROM shows JOIN peopleLinks l ON l.showID = shows.id WHERE l.peopleID = $id ORDER BY title;"; + + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + cmd.Parameters.AddWithValue("$id", peopleID); + SQLiteDataReader reader = cmd.ExecuteReader(); + List shows = new List(); + while (reader.Read()) + shows.Add(Show.FromReader(reader)); + + return shows; + } + } + + public IEnumerable GetAllEpisodes() + { + List episodes = new List(); + string query = "SELECT * FROM episodes;"; + + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + SQLiteDataReader reader = cmd.ExecuteReader(); + + while (reader.Read()) + episodes.Add(Episode.FromReader(reader)); + return episodes; + } + } + + public IEnumerable SearchEpisodes(string searchQuery) + { + List episodes = new List(); + SQLiteDataReader reader; + string query = "SELECT episodes.*, shows.slug, shows.title as showTitle FROM episodes JOIN shows ON showID = shows.id WHERE episodes.title LIKE $query ORDER BY seasonNumber, episodeNumber LIMIT 20;"; + + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + cmd.Parameters.AddWithValue("$query", "%" + searchQuery + "%"); + reader = cmd.ExecuteReader(); + while (reader.Read()) + episodes.Add(Episode.FromReader(reader).SetThumb(reader["slug"] as string).SetShowTitle(reader["showTitle"] as string)); + } + return episodes; + } + + public IEnumerable SearchPeople(string searchQuery) + { + List people = new List(); + SQLiteDataReader reader; + string query = "SELECT * FROM people WHERE name LIKE $query ORDER BY name LIMIT 40;"; + + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + cmd.Parameters.AddWithValue("$query", "%" + searchQuery + "%"); + reader = cmd.ExecuteReader(); + while (reader.Read()) + people.Add(People.FromReader(reader)); + } + return people; + } + + public IEnumerable SearchGenres(string searchQuery) + { + List genres = new List(); + SQLiteDataReader reader; + string query = "SELECT * FROM genres WHERE name LIKE $query ORDER BY name;"; + + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + cmd.Parameters.AddWithValue("$query", "%" + searchQuery + "%"); + reader = cmd.ExecuteReader(); + while (reader.Read()) + genres.Add(Genre.FromReader(reader)); + } + return genres; + } + + public IEnumerable SearchStudios(string searchQuery) + { + List studios = new List(); + SQLiteDataReader reader; + string query = "SELECT * FROM studios WHERE name LIKE $query ORDER BY name;"; + + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + cmd.Parameters.AddWithValue("$query", "%" + searchQuery + "%"); + reader = cmd.ExecuteReader(); + while (reader.Read()) + studios.Add(Studio.FromReader(reader)); + } + return studios; + } + #endregion + + #region Check if items exists + public bool IsCollectionRegistered(string collectionSlug) + { + string query = "SELECT (id) FROM collections WHERE slug = $slug;"; + + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + cmd.Parameters.AddWithValue("$slug", collectionSlug); + + return cmd.ExecuteScalar() != null; + } + } + + public bool IsCollectionRegistered(string collectionSlug, out long collectionID) + { + string query = "SELECT (id) FROM collections WHERE slug = $slug;"; + + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + cmd.Parameters.AddWithValue("$slug", collectionSlug); + collectionID = cmd.ExecuteScalar() as long? ?? -1; + + return collectionID != -1; + } + } + + public bool IsShowRegistered(string showPath) + { + string query = "SELECT (id) FROM shows WHERE path = $path;"; + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + cmd.Parameters.AddWithValue("$path", showPath); + + return cmd.ExecuteScalar() != null; + } + } + + public bool IsShowRegistered(string showPath, out long showID) + { + string query = "SELECT (id) FROM shows WHERE path = $path;"; + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + cmd.Parameters.AddWithValue("$path", showPath); + showID = cmd.ExecuteScalar() as long? ?? -1; + + return showID != -1; + } + } + + public bool IsSeasonRegistered(long showID, long seasonNumber) + { + string query = "SELECT (id) FROM seasons WHERE showID = $showID AND seasonNumber = $seasonNumber;"; + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + cmd.Parameters.AddWithValue("$showID", showID); + cmd.Parameters.AddWithValue("$seasonNumber", seasonNumber); + + return cmd.ExecuteScalar() != null; + } + } + + public bool IsSeasonRegistered(long showID, long seasonNumber, out long seasonID) + { + string query = "SELECT (id) FROM seasons WHERE showID = $showID AND seasonNumber = $seasonNumber;"; + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + cmd.Parameters.AddWithValue("$showID", showID); + cmd.Parameters.AddWithValue("$seasonNumber", seasonNumber); + seasonID = cmd.ExecuteScalar() as long? ?? -1; + + return seasonID != -1; + } + } + + public bool IsEpisodeRegistered(string episodePath) + { + string query = "SELECT (id) FROM episodes WHERE path = $path;"; + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + cmd.Parameters.AddWithValue("$path", episodePath); + + return cmd.ExecuteScalar() != null; + } + } + + public long GetOrCreateGenre(Genre genre) + { + Genre existingGenre = GetGenreBySlug(genre.Slug); + + if (existingGenre != null) + return existingGenre.Id; + + string query = "INSERT INTO genres (slug, name) VALUES($slug, $name);"; + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + try + { + cmd.Parameters.AddWithValue("$slug", genre.Slug); + cmd.Parameters.AddWithValue("$name", genre.Name); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT LAST_INSERT_ROWID()"; + return (long)cmd.ExecuteScalar(); + } + catch + { + Console.Error.WriteLine("SQL error while trying to insert a people ({0}).", genre.Name); + cmd.CommandText = "SELECT * FROM genres WHERE slug = $slug"; + cmd.Parameters.AddWithValue("$slug", genre.Slug); + return (long)cmd.ExecuteScalar(); + } + } + } + + public long GetOrCreateStudio(Studio studio) + { + Studio existingStudio = GetStudioBySlug(studio.Slug); + + if (existingStudio != null) + return existingStudio.ID; + + string query = "INSERT INTO studios (slug, name) VALUES($slug, $name);"; + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + try + { + cmd.Parameters.AddWithValue("$slug", studio.Slug); + cmd.Parameters.AddWithValue("$name", studio.Name); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT LAST_INSERT_ROWID()"; + return (long)cmd.ExecuteScalar(); + } + catch (SQLiteException) + { + Console.Error.WriteLine("SQL error while trying to insert a studio ({0}).", studio.Name); + cmd.CommandText = "SELECT * FROM studios WHERE slug = $slug"; + cmd.Parameters.AddWithValue("$slug", studio.Slug); + return (long)cmd.ExecuteScalar(); + } + } + } + + public long GetOrCreatePeople(People people) + { + People existingPeople = GetPeopleBySlug(people.Slug); + + if (existingPeople != null) + return existingPeople.ID; + + string query = "INSERT INTO people (slug, name, imgPrimary, externalIDs) VALUES($slug, $name, $imgPrimary, $externalIDs);"; + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + try + { + cmd.Parameters.AddWithValue("$slug", people.Slug); + cmd.Parameters.AddWithValue("$name", people.Name); + cmd.Parameters.AddWithValue("$imgPrimary", people.ImgPrimary); + cmd.Parameters.AddWithValue("$externalIDs", people.ExternalIDs); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT LAST_INSERT_ROWID()"; + return (long)cmd.ExecuteScalar(); + } + catch + { + Console.Error.WriteLine("SQL error while trying to insert a people ({0}).", people.Name); + cmd.CommandText = "SELECT * FROM people WHERE slug = $slug"; + cmd.Parameters.AddWithValue("$slug", people.Slug); + return (long)cmd.ExecuteScalar(); + } + + } + } + #endregion + + #region Write Into The Database + public long RegisterCollection(Collection collection) + { + string query = "INSERT INTO collections (slug, name, overview, imgPrimary) VALUES($slug, $name, $overview, $imgPrimary);"; + + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + try + { + cmd.Parameters.AddWithValue("$slug", collection.Slug); + cmd.Parameters.AddWithValue("$name", collection.Name); + cmd.Parameters.AddWithValue("$overview", collection.Overview); + cmd.Parameters.AddWithValue("$imgPrimary", collection.ImgPrimary); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT LAST_INSERT_ROWID()"; + return (long)cmd.ExecuteScalar(); + } + catch + { + Console.Error.WriteLine("SQL error while trying to create a collection. Collection probably already registered."); + cmd.CommandText = "SELECT * FROM collections WHERE slug = $slug"; + cmd.Parameters.AddWithValue("$slug", collection.Slug); + return (long)cmd.ExecuteScalar(); + } + } + } + + public void RegisterInLibrary(long showID, Library library) + { + string query = + "INSERT INTO librariesLinks (libraryID, showID) SELECT id, $showID FROM libraries WHERE libraries.id = $libraryID;"; + + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + cmd.Parameters.AddWithValue("$libraryID", library.Id); + cmd.Parameters.AddWithValue("$showID", showID); + cmd.ExecuteNonQuery(); + } + } + + public long RegisterShow(Show show) + { + string query = "INSERT INTO shows (slug, title, aliases, path, overview, trailerUrl, startYear, endYear, imgPrimary, imgThumb, imgLogo, imgBackdrop, externalIDs) VALUES($slug, $title, $aliases, $path, $overview, $trailerUrl, $startYear, $endYear, $imgPrimary, $imgThumb, $imgLogo, $imgBackdrop, $externalIDs);"; + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + try + { + cmd.Parameters.AddWithValue("$slug", show.Slug); + cmd.Parameters.AddWithValue("$title", show.Title); + cmd.Parameters.AddWithValue("$aliases", show.GetAliases()); + cmd.Parameters.AddWithValue("$path", show.Path); + cmd.Parameters.AddWithValue("$overview", show.Overview); + cmd.Parameters.AddWithValue("$trailerUrl", show.TrailerUrl); + cmd.Parameters.AddWithValue("$status", show.Status); + cmd.Parameters.AddWithValue("$startYear", show.StartYear); + cmd.Parameters.AddWithValue("$endYear", show.EndYear); + cmd.Parameters.AddWithValue("$imgPrimary", show.ImgPrimary); + cmd.Parameters.AddWithValue("$imgThumb", show.ImgThumb); + cmd.Parameters.AddWithValue("$imgLogo", show.ImgLogo); + cmd.Parameters.AddWithValue("$imgBackdrop", show.ImgBackdrop); + cmd.Parameters.AddWithValue("$externalIDs", show.ExternalIDs); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT LAST_INSERT_ROWID()"; + long showID = (long)cmd.ExecuteScalar(); + + if (show.Genres != null) + { + cmd.CommandText = "INSERT INTO genresLinks (genreID, showID) VALUES($genreID, $showID);"; + foreach (Genre genre in show.Genres) + { + long genreID = GetOrCreateGenre(genre); + cmd.Parameters.AddWithValue("$genreID", genreID); + cmd.Parameters.AddWithValue("$showID", showID); + cmd.ExecuteNonQuery(); + } + } + + if (show.Studio != null) + { + cmd.CommandText = "INSERT INTO studiosLinks (studioID, showID) VALUES($studioID, $showID);"; + long studioID = GetOrCreateStudio(show.Studio); + cmd.Parameters.AddWithValue("$studioID", studioID); + cmd.Parameters.AddWithValue("$showID", showID); + cmd.ExecuteNonQuery(); + } + + return showID; + } + catch + { + Console.Error.WriteLine("SQL error while trying to insert a show ({0}), show probably already registered.", show.Title); + return -1; + } + } + } + + public long RegisterSeason(Season season) + { + string query = "INSERT INTO seasons (showID, seasonNumber, title, overview, year, imgPrimary, externalIDs) VALUES($showID, $seasonNumber, $title, $overview, $year, $imgPrimary, $externalIDs);"; + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + try + { + cmd.Parameters.AddWithValue("$showID", season.ShowID); + cmd.Parameters.AddWithValue("$seasonNumber", season.SeasonNumber); + cmd.Parameters.AddWithValue("$title", season.Title); + cmd.Parameters.AddWithValue("$overview", season.Overview); + cmd.Parameters.AddWithValue("$year", season.Year); + cmd.Parameters.AddWithValue("$imgPrimary", season.ImgPrimary); + cmd.Parameters.AddWithValue("$externalIDs", season.ExternalIDs); + cmd.ExecuteNonQuery(); + + cmd.CommandText = "SELECT LAST_INSERT_ROWID()"; + return (long)cmd.ExecuteScalar(); + } + catch + { + Console.Error.WriteLine("SQL error while trying to insert a season ({0}), season probably already registered.", season.Title); + cmd.CommandText = "SELECT * FROM seasons WHERE showID = $showID AND seasonNumber = $seasonNumber"; + cmd.Parameters.AddWithValue("$showID", season.ShowID); + cmd.Parameters.AddWithValue("$seasonNumber", season.SeasonNumber); + return (long)cmd.ExecuteScalar(); + } + } + } + + public long RegisterEpisode(Episode episode) + { + 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)) + { + try + { + 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); + 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(); + } + catch + { + Console.Error.WriteLine("SQL error while trying to insert an episode ({0}), episode probably already registered.", episode.Link); + cmd.CommandText = "SELECT * FROM episodes WHERE showID = $showID AND seasonNumber = $seasonNumber AND episodeNumber = $episodeNumber"; + cmd.Parameters.AddWithValue("$showID", episode.ShowID); + cmd.Parameters.AddWithValue("$seasonNumber", episode.SeasonNumber); + cmd.Parameters.AddWithValue("$episodeNumber", episode.EpisodeNumber); + return (long)cmd.ExecuteScalar(); + } + } + } + + public void RegisterTrack(Track track) + { + string query = "INSERT INTO tracks (episodeID, streamType, title, language, codec, isDefault, isForced, isExternal, path) VALUES($episodeID, $streamType, $title, $language, $codec, $isDefault, $isForced, $isExternal, $path);"; + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + cmd.Parameters.AddWithValue("$episodeID", track.EpisodeID); + cmd.Parameters.AddWithValue("$streamType", track.Type); + cmd.Parameters.AddWithValue("$title", track.Title); + cmd.Parameters.AddWithValue("$language", track.Language); + cmd.Parameters.AddWithValue("$codec", track.Codec); + cmd.Parameters.AddWithValue("$isDefault", track.IsDefault); + cmd.Parameters.AddWithValue("$isForced", track.IsForced); + cmd.Parameters.AddWithValue("$isExternal", track.IsExternal); + cmd.Parameters.AddWithValue("$path", track.Path); + cmd.ExecuteNonQuery(); + } + } + + public void RegisterShowPeople(long showID, IEnumerable people) + { + if (people == null) + return; + + string linkQuery = "INSERT INTO peopleLinks (peopleID, showID, role, type) VALUES($peopleID, $showID, $role, $type);"; + + foreach (People peop in people) + { + using (SQLiteCommand cmd = new SQLiteCommand(linkQuery, sqlConnection)) + { + cmd.Parameters.AddWithValue("$peopleID", GetOrCreatePeople(peop)); + cmd.Parameters.AddWithValue("$showID", showID); + cmd.Parameters.AddWithValue("$role", peop.Role); + cmd.Parameters.AddWithValue("$type", peop.Type); + cmd.ExecuteNonQuery(); + } + } + } + + public void AddShowToCollection(long showID, long collectionID) + { + string linkQuery = "INSERT INTO collectionsLinks (collectionID, showID) VALUES($collectionID, $showID);"; + + using (SQLiteCommand cmd = new SQLiteCommand(linkQuery, sqlConnection)) + { + cmd.Parameters.AddWithValue("$collectionID", collectionID); + cmd.Parameters.AddWithValue("$showID", showID); + cmd.ExecuteNonQuery(); + } + } + + public void RemoveShow(long showID) + { + string query = "DELETE FROM shows WHERE id = $showID;"; + + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + cmd.Parameters.AddWithValue("$showID", showID); + cmd.ExecuteNonQuery(); + } + } + + public void RemoveSeason(long showID, long seasonID) + { + string query = "DELETE FROM seasons WHERE id = $seasonID;"; + + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + cmd.Parameters.AddWithValue("$seasonID", seasonID); + cmd.ExecuteNonQuery(); + } + if (GetSeasons(showID).Count() == 0) + RemoveShow(showID); + } + + public void RemoveEpisode(Episode episode) + { + string query = "DELETE FROM episodes WHERE id = $episodeID;"; + + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + cmd.Parameters.AddWithValue("$episodeID", episode.Id); + cmd.ExecuteNonQuery(); + } + + if (GetEpisodes(episode.ShowID, episode.SeasonNumber).Count() == 0) + RemoveSeason(episode.ShowID, episode.SeasonID); + } + + public void ClearSubtitles(long episodeID) + { + string query = "DELETE FROM tracks WHERE episodeID = $episodeID;"; + + using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) + { + cmd.Parameters.AddWithValue("$episodeID", episodeID); + cmd.ExecuteNonQuery(); + } + } + #endregion + } } diff --git a/Kyoo/DatabaseContext.cs b/Kyoo/DatabaseContext.cs index beadd8a7..59e85424 100644 --- a/Kyoo/DatabaseContext.cs +++ b/Kyoo/DatabaseContext.cs @@ -19,9 +19,12 @@ namespace Kyoo public DbSet Tracks { get; set; } public DbSet Genres { get; set; } public DbSet Peoples { get; set; } - public DbSet PeopleLinks { get; set; } public DbSet Studios { get; set; } + public DbSet LibraryLinks { get; set; } + public DbSet CollectionLinks { get; set; } + public DbSet PeopleLinks { get; set; } + private ValueConverter stringArrayConverter = new ValueConverter( arr => string.Join("|", arr), str => str.Split("|", StringSplitOptions.None)); @@ -37,16 +40,6 @@ namespace Kyoo modelBuilder.Entity().Property(e => e.Paths).HasConversion(stringArrayConverter).Metadata.SetValueComparer(stringArrayComparer); modelBuilder.Entity().Property(e => e.Providers).HasConversion(stringArrayConverter).Metadata.SetValueComparer(stringArrayComparer); modelBuilder.Entity().Property(e => e.Aliases).HasConversion(stringArrayConverter).Metadata.SetValueComparer(stringArrayComparer); - - modelBuilder.Entity() - .HasOne(l => l.Show) - .WithMany(s => s.People) - .HasForeignKey(l => l.ShowID); - - modelBuilder.Entity() - .HasOne(l => l.People) - .WithMany(p => p.Roles) - .HasForeignKey(l => l.PeopleID); modelBuilder.Entity() .Property(t => t.IsDefault) diff --git a/Kyoo/HtmlAPI/EpisodesAPI.cs b/Kyoo/HtmlAPI/EpisodesAPI.cs index b3876234..435cae9e 100644 --- a/Kyoo/HtmlAPI/EpisodesAPI.cs +++ b/Kyoo/HtmlAPI/EpisodesAPI.cs @@ -1,7 +1,7 @@ -using Kyoo.Controllers; -using Kyoo.Models; +using Kyoo.Models; using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; +using System.Linq; namespace Kyoo.Controllers { @@ -9,28 +9,28 @@ namespace Kyoo.Controllers [ApiController] public class EpisodesController : ControllerBase { - private readonly ILibraryManager libraryManager; + private readonly ILibraryManager _libraryManager; public EpisodesController(ILibraryManager libraryManager) { - this.libraryManager = libraryManager; + _libraryManager = libraryManager; } [HttpGet("{showSlug}/season/{seasonNumber}")] public ActionResult> GetEpisodesForSeason(string showSlug, long seasonNumber) { - List episodes = libraryManager.GetEpisodes(showSlug, seasonNumber); + IEnumerable episodes = _libraryManager.GetEpisodes(showSlug, seasonNumber); if(episodes == null) return NotFound(); - return episodes; + return episodes.ToList(); } [HttpGet("{showSlug}/season/{seasonNumber}/episode/{episodeNumber}")] public ActionResult GetEpisode(string showSlug, long seasonNumber, long episodeNumber) { - Episode episode = libraryManager.GetEpisode(showSlug, seasonNumber, episodeNumber); + Episode episode = _libraryManager.GetEpisode(showSlug, seasonNumber, episodeNumber); if (episode == null) return NotFound(); diff --git a/Kyoo/HtmlAPI/LibrariesAPI.cs b/Kyoo/HtmlAPI/LibrariesAPI.cs index 47d7011e..9654a154 100644 --- a/Kyoo/HtmlAPI/LibrariesAPI.cs +++ b/Kyoo/HtmlAPI/LibrariesAPI.cs @@ -2,6 +2,7 @@ using Kyoo.Models; using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; +using System.Linq; namespace Kyoo.Controllers { @@ -9,28 +10,28 @@ namespace Kyoo.Controllers [ApiController] public class LibrariesController : ControllerBase { - private readonly ILibraryManager libraryManager; + private readonly ILibraryManager _libraryManager; public LibrariesController(ILibraryManager libraryManager) { - this.libraryManager = libraryManager; + _libraryManager = libraryManager; } [HttpGet] public IEnumerable GetLibraries() { - return libraryManager.GetLibraries(); + return _libraryManager.GetLibraries(); } [HttpGet("{librarySlug}")] public ActionResult> GetShows(string librarySlug) { - Library library = libraryManager.GetLibrary(librarySlug); + Library library = _libraryManager.GetLibrary(librarySlug); if (library == null) return NotFound(); - return libraryManager.GetShowsInLibrary(library.Id); + return _libraryManager.GetShowsInLibrary(library.Id).ToList(); } } } \ No newline at end of file diff --git a/Kyoo/HtmlAPI/SubtitleAPI.cs b/Kyoo/HtmlAPI/SubtitleAPI.cs index 15e156b9..954da5c6 100644 --- a/Kyoo/HtmlAPI/SubtitleAPI.cs +++ b/Kyoo/HtmlAPI/SubtitleAPI.cs @@ -65,7 +65,7 @@ namespace Kyoo.Controllers [HttpGet("extract/{showSlug}")] public async Task ExtractSubtitle(string showSlug) { - List episodes = libraryManager.GetEpisodes(showSlug); + IEnumerable episodes = libraryManager.GetEpisodes(showSlug); foreach (Episode episode in episodes) { libraryManager.ClearSubtitles(episode.Id); diff --git a/Kyoo/Kyoo.csproj.DotSettings b/Kyoo/Kyoo.csproj.DotSettings deleted file mode 100644 index bc646adf..00000000 --- a/Kyoo/Kyoo.csproj.DotSettings +++ /dev/null @@ -1,9 +0,0 @@ - - True - True - True - True - True - True - True - True \ No newline at end of file