diff --git a/Kyoo.Common/Controllers/ILibraryManager.cs b/Kyoo.Common/Controllers/ILibraryManager.cs index 24141692..b380608d 100644 --- a/Kyoo.Common/Controllers/ILibraryManager.cs +++ b/Kyoo.Common/Controllers/ILibraryManager.cs @@ -9,7 +9,6 @@ namespace Kyoo.Controllers //Read values string GetShowExternalIDs(long showID); Studio GetStudio(long showID); - IEnumerable GetDirectors(long showID); IEnumerable GetPeople(long showID); IEnumerable GetGenreForShow(long showID); IEnumerable GetSeasons(long showID); @@ -45,13 +44,10 @@ namespace Kyoo.Controllers IEnumerable SearchStudios(string searchQuery); //Check if value exists - bool IsCollectionRegistered(string collectionSlug); bool IsCollectionRegistered(string collectionSlug, out long collectionID); - bool IsShowRegistered(string showPath); bool IsShowRegistered(string showPath, out long showID); - bool IsSeasonRegistered(long showID, long seasonNumber); bool IsSeasonRegistered(long showID, long seasonNumber, out long seasonID); - bool IsEpisodeRegistered(string episodePath); + bool IsEpisodeRegistered(string episodePath, out long episodeID); //Register values long RegisterCollection(Collection collection); diff --git a/Kyoo.Common/Models/Collection.cs b/Kyoo.Common/Models/Collection.cs index ecf522f6..60eeddd2 100644 --- a/Kyoo.Common/Models/Collection.cs +++ b/Kyoo.Common/Models/Collection.cs @@ -7,7 +7,7 @@ namespace Kyoo.Models { public class Collection : IMergable { - [JsonIgnore] public long Id { get; set; } = -1; + [JsonIgnore] public long ID { get; set; } = -1; public string Slug { get; set; } public string Name { get; set; } public string Poster { get; set; } @@ -19,7 +19,7 @@ namespace Kyoo.Models public Collection(long id, string slug, string name, string overview, string imgPrimary) { - Id = id; + ID = id; Slug = slug; Name = name; Overview = overview; @@ -47,7 +47,7 @@ namespace Kyoo.Models public Collection SetShows(ILibraryManager libraryManager) { - Shows = libraryManager.GetShowsInCollection(Id); + Shows = libraryManager.GetShowsInCollection(ID); return this; } @@ -55,8 +55,8 @@ namespace Kyoo.Models { if (collection == null) return this; - if (Id == -1) - Id = collection.Id; + if (ID == -1) + ID = collection.ID; if (Slug == null) Slug = collection.Slug; if (Name == null) diff --git a/Kyoo.Common/Models/Episode.cs b/Kyoo.Common/Models/Episode.cs index 48ea449c..fe386702 100644 --- a/Kyoo.Common/Models/Episode.cs +++ b/Kyoo.Common/Models/Episode.cs @@ -5,7 +5,7 @@ namespace Kyoo.Models { public class Episode : IMergable { - [JsonIgnore] public long Id { get; set; } + [JsonIgnore] public long ID { get; set; } [JsonIgnore] public long ShowID { get; set; } public virtual Show Show { get; set; } [JsonIgnore] public long SeasonID { get; set; } @@ -31,7 +31,7 @@ namespace Kyoo.Models public Episode() { - Id = -1; + ID = -1; ShowID = -1; SeasonID = -1; SeasonNumber = -1; @@ -41,7 +41,7 @@ namespace Kyoo.Models public Episode(long seasonNumber, long episodeNumber, long absoluteNumber, string title, string overview, DateTime? releaseDate, long runtime, string imgPrimary, string externalIDs) { - Id = -1; + ID = -1; ShowID = -1; SeasonID = -1; SeasonNumber = seasonNumber; @@ -57,7 +57,7 @@ namespace Kyoo.Models 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) { - Id = id; + ID = id; ShowID = showID; SeasonID = seasonID; SeasonNumber = seasonNumber; @@ -112,8 +112,8 @@ namespace Kyoo.Models { if (other == null) return this; - if (Id == -1) - Id = other.Id; + if (ID == -1) + ID = other.ID; if (ShowID == -1) ShowID = other.ShowID; if (SeasonID == -1) diff --git a/Kyoo.Common/Models/Genre.cs b/Kyoo.Common/Models/Genre.cs index 7d378950..fb0d2dba 100644 --- a/Kyoo.Common/Models/Genre.cs +++ b/Kyoo.Common/Models/Genre.cs @@ -4,7 +4,7 @@ namespace Kyoo.Models { public class Genre { - [JsonIgnore] public long Id { get; set; } + [JsonIgnore] public long ID { get; set; } public string Slug { get; set; } public string Name { get; set; } @@ -16,7 +16,7 @@ namespace Kyoo.Models public Genre(long id, string slug, string name) { - Id = id; + ID = id; Slug = slug; Name = name; } diff --git a/Kyoo.Common/Models/People.cs b/Kyoo.Common/Models/People.cs index 515fb9f3..ae3408d5 100644 --- a/Kyoo.Common/Models/People.cs +++ b/Kyoo.Common/Models/People.cs @@ -9,8 +9,8 @@ namespace Kyoo.Models [JsonIgnore] public long ID { get; set; } = -1; public string Slug { get; set; } public string Name { get; set; } - public string Role;//Dynamic data not stored as it in the database - public string Type; //Dynamic data not stored as it in the database ---- Null for now + public string Role; + public string Type; [JsonIgnore] public string ImgPrimary { get; set; } public string ExternalIDs { get; set; } @@ -38,24 +38,11 @@ namespace Kyoo.Models ExternalIDs = externalIDs; } - public static People FromReader(System.Data.SQLite.SQLiteDataReader reader) + public People SetRoleType(string role, string type) { - return new People((long)reader["id"], - reader["slug"] as string, - reader["name"] as string, - reader["imgPrimary"] as string, - reader["externalIDs"] as string); - } - - public static People FromFullReader(System.Data.SQLite.SQLiteDataReader reader) - { - return new People((long)reader["id"], - reader["slug"] as string, - reader["name"] as string, - reader["role"] as string, - reader["type"] as string, - reader["imgPrimary"] as string, - reader["externalIDs"] as string); + Role = role; + Type = type; + return this; } public People Merge(People other) diff --git a/Kyoo.Common/Models/Show.cs b/Kyoo.Common/Models/Show.cs index 72a1c410..8ed50b6c 100644 --- a/Kyoo.Common/Models/Show.cs +++ b/Kyoo.Common/Models/Show.cs @@ -8,7 +8,7 @@ namespace Kyoo.Models { public class Show : IMergable { - [JsonIgnore] public long ID { get; set; } = -1; + [JsonIgnore] public long ID { get; set; } public string Slug { get; set; } public string Title { get; set; } diff --git a/Kyoo/Controllers/Crawler.cs b/Kyoo/Controllers/Crawler.cs index a072c565..5037a3c5 100644 --- a/Kyoo/Controllers/Crawler.cs +++ b/Kyoo/Controllers/Crawler.cs @@ -89,7 +89,7 @@ namespace Kyoo.Controllers private async Task RegisterFile(string path, string relativePath, Library library) { - if (!libraryManager.IsEpisodeRegistered(path)) + if (!libraryManager.IsEpisodeRegistered(path, out long _)) { string patern = config.GetValue("regex"); Regex regex = new Regex(patern, RegexOptions.IgnoreCase); @@ -117,7 +117,7 @@ namespace Kyoo.Controllers if (!absoluteSucess) { - Console.WriteLine("&Couldn't find basic data for the episode (regexs didn't match) " + relativePath); + Console.Error.WriteLine("Couldn't find basic data for the episode (regexs didn't match) " + relativePath); return; } } @@ -183,7 +183,7 @@ namespace Kyoo.Controllers if (seasonID == -1) seasonID = await RegisterSeason(show, seasonNumber, library); episode.SeasonID = seasonID; - episode.Id = libraryManager.RegisterEpisode(episode); + episode.ID = libraryManager.RegisterEpisode(episode); Track[] tracks = await transcoder.GetTrackInfo(episode.Path); int subcount = 0; @@ -194,7 +194,7 @@ namespace Kyoo.Controllers subcount++; continue; } - track.EpisodeID = episode.Id; + track.EpisodeID = episode.ID; libraryManager.RegisterTrack(track); } @@ -205,7 +205,7 @@ namespace Kyoo.Controllers { foreach (Track track in subtitles) { - track.EpisodeID = episode.Id; + track.EpisodeID = episode.ID; libraryManager.RegisterTrack(track); } } @@ -228,7 +228,7 @@ namespace Kyoo.Controllers string language = sub.Substring(Path.GetDirectoryName(sub).Length + episodeLink.Length + 2, 3); bool isDefault = sub.Contains("default"); bool isForced = sub.Contains("forced"); - Track track = new Track(StreamType.Subtitle, null, language, isDefault, isForced, null, false, sub) { EpisodeID = episode.Id }; + Track track = new Track(StreamType.Subtitle, null, language, isDefault, isForced, null, false, sub) { EpisodeID = episode.ID }; if (Path.GetExtension(sub) == ".ass") track.Codec = "ass"; diff --git a/Kyoo/Controllers/LibraryManager.cs b/Kyoo/Controllers/LibraryManager.cs index abe9858b..e91b891d 100644 --- a/Kyoo/Controllers/LibraryManager.cs +++ b/Kyoo/Controllers/LibraryManager.cs @@ -65,7 +65,7 @@ namespace Kyoo.Controllers { 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( + where l.CollectionID == null select l.Show).AsEnumerable().Union( from collection in _database.Collections select collection.AsShow()).OrderBy(x => x.Title); } @@ -132,7 +132,7 @@ namespace Kyoo.Controllers { WatchItem item = (from episode in _database.Episodes where episode.SeasonNumber == seasonNumber && episode.EpisodeNumber == episodeNumber && episode.Show.Slug == showSlug - select new WatchItem(episode.Id, + select new WatchItem(episode.ID, episode.Show.Title, episode.Show.Slug, seasonNumber, @@ -158,350 +158,109 @@ namespace Kyoo.Controllers 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; - } + return from link in _database.PeopleLinks where link.ShowID == showID select link.People.SetRoleType(link.Role, link.Type); } 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; - } + return (from people in _database.Peoples where people.Slug == slug select people).FirstOrDefault(); } 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; - } + return (from show in _database.Shows where show.ID == showID select show.Genres).FirstOrDefault(); } 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; - } + return (from genre in _database.Genres where genre.Slug == slug select genre).FirstOrDefault(); } 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(); - } + return (from show in _database.Shows where show.ID == showID select show.Studio).FirstOrDefault(); } 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; - //} + return (from studio in _database.Studios where studio.Slug == slug select studio).FirstOrDefault(); } 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; - } + return (from collection in _database.Collections where collection.Slug == slug select collection).FirstOrDefault(); } 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; - } + return from link in _database.CollectionLinks where link.CollectionID == collectionID select link.Show; } 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; + return (from link in _database.LibraryLinks where link.LibraryID == libraryID select link).AsEnumerable() + .Select(link => link.Show ?? link.Collection.AsShow()) + .OrderBy(x => x.Title); } 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; - } + return (from link in _database.PeopleLinks where link.PeopleID == peopleID select link.Show).OrderBy(x => x.Title); } 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; - } + return _database.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; + return from episode in _database.Episodes where episode.Title.Contains(searchQuery) select episode; } 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; + return from people in _database.Peoples where people.Name.Contains(searchQuery) select 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; + return from genre in _database.Genres where genre.Name.Contains(searchQuery) select genre; } 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; + return from studio in _database.Studios where studio.Name.Contains(searchQuery) select studio; } #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; - } + Collection col = (from collection in _database.Collections where collection.Slug == collectionSlug select collection).FirstOrDefault(); + collectionID = col?.ID ?? -1; + return collectionID != -1; } 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; - } + Show tmp = (from show in _database.Shows where show.Path == showPath select show).FirstOrDefault(); + showID = tmp?.ID ?? -1; + return showID != -1; } 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; - } + Season tmp = (from season in _database.Seasons where season.SeasonNumber == seasonNumber && season.ShowID == showID select season).FirstOrDefault(); + seasonID = tmp?.ID ?? -1; + return seasonID != -1; } - public bool IsEpisodeRegistered(string episodePath) + public bool IsEpisodeRegistered(string episodePath, out long episodeID) { - 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; - } + Episode tmp = (from episode in _database.Episodes where episode.Path == episodePath select episode).FirstOrDefault(); + episodeID = tmp?.ID ?? -1; + return episodeID != -1; } public long GetOrCreateGenre(Genre genre) @@ -509,28 +268,11 @@ namespace Kyoo.Controllers Genre existingGenre = GetGenreBySlug(genre.Slug); if (existingGenre != null) - return existingGenre.Id; + 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(); - } - } + _database.Genres.Add(genre); + _database.SaveChanges(); + return genre.ID; } public long GetOrCreateStudio(Studio studio) @@ -539,27 +281,10 @@ namespace Kyoo.Controllers 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(); - } - } + + _database.Studios.Add(studio); + _database.SaveChanges(); + return studio.ID; } public long GetOrCreatePeople(People people) @@ -569,128 +294,59 @@ namespace Kyoo.Controllers 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(); - } - - } + _database.Peoples.Add(people); + _database.SaveChanges(); + return people.ID; } #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(); - } - } + // 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(); + // } + // } + return -1; } 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(); - } + // 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; - } - } + _database.Shows.Add(show); + _database.SaveChanges(); + return show.ID; } public long RegisterSeason(Season season) @@ -839,7 +495,7 @@ namespace Kyoo.Controllers using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) { - cmd.Parameters.AddWithValue("$episodeID", episode.Id); + cmd.Parameters.AddWithValue("$episodeID", episode.ID); cmd.ExecuteNonQuery(); } diff --git a/Kyoo/Controllers/PluginManager.cs b/Kyoo/Controllers/PluginManager.cs index 3c41fa0e..66f47c94 100644 --- a/Kyoo/Controllers/PluginManager.cs +++ b/Kyoo/Controllers/PluginManager.cs @@ -11,48 +11,46 @@ namespace Kyoo.Controllers { public class PluginManager : IPluginManager { - private readonly IServiceProvider provider; - private readonly IConfiguration config; - private List plugins; + private readonly IServiceProvider _provider; + private readonly IConfiguration _config; + private List _plugins; public PluginManager(IServiceProvider provider, IConfiguration config) { - this.provider = provider; - this.config = config; + _provider = provider; + _config = config; } public T GetPlugin(string name) { - if (plugins == null) + if (_plugins == null) return default; - return (T)(from plugin in plugins where plugin.Name == name && plugin is T - select plugin).FirstOrDefault(); + return (T)(from plugin in _plugins where plugin.Name == name && plugin is T select plugin).FirstOrDefault(); } public IEnumerable GetPlugins() { - if (plugins == null) - return null; - return from plugin in plugins where plugin is T - select (T)plugin; + if (_plugins == null) + return new List(); + return from plugin in _plugins where plugin is T select (T)plugin; } public void ReloadPlugins() { - string pluginFolder = config.GetValue("plugins"); + string pluginFolder = _config.GetValue("plugins"); if (!Directory.Exists(pluginFolder)) return; string[] pluginsPaths = Directory.GetFiles(pluginFolder); - plugins = pluginsPaths.Select(path => + _plugins = pluginsPaths.Select(path => { try { Assembly ass = Assembly.LoadFile(Path.GetFullPath(path)); return (from type in ass.GetTypes() where typeof(IPlugin).IsAssignableFrom(type) - select (IPlugin) ActivatorUtilities.CreateInstance(provider, type)).FirstOrDefault(); + select (IPlugin) ActivatorUtilities.CreateInstance(_provider, type)).FirstOrDefault(); } catch (Exception ex) { diff --git a/Kyoo/Controllers/ProviderManager.cs b/Kyoo/Controllers/ProviderManager.cs index 14f7496e..911b0241 100644 --- a/Kyoo/Controllers/ProviderManager.cs +++ b/Kyoo/Controllers/ProviderManager.cs @@ -8,20 +8,20 @@ namespace Kyoo.Controllers { public class ProviderManager : IProviderManager { - private readonly IEnumerable providers; - private readonly IThumbnailsManager thumbnailsManager; + private readonly IEnumerable _providers; + private readonly IThumbnailsManager _thumbnailsManager; public ProviderManager(IThumbnailsManager thumbnailsManager, IPluginManager pluginManager) { - this.thumbnailsManager = thumbnailsManager; - providers = pluginManager.GetPlugins(); + _thumbnailsManager = thumbnailsManager; + _providers = pluginManager.GetPlugins(); } public async Task GetMetadata(Func> providerCall, Library library, string what) where T : IMergable, new() { T ret = new T(); - foreach (IMetadataProvider provider in providers.OrderBy(provider => Array.IndexOf(library.Providers, provider.Name))) + foreach (IMetadataProvider provider in _providers.OrderBy(provider => Array.IndexOf(library.Providers, provider.Name))) { try { @@ -38,7 +38,7 @@ namespace Kyoo.Controllers { List ret = new List(); - foreach (IMetadataProvider provider in providers.OrderBy(provider => Array.IndexOf(library.Providers, provider.Name))) + foreach (IMetadataProvider provider in _providers.OrderBy(provider => Array.IndexOf(library.Providers, provider.Name))) { try { @@ -65,7 +65,7 @@ namespace Kyoo.Controllers show.Path = showPath; show.Slug = Utility.ToSlug(showName); show.Title ??= showName; - await thumbnailsManager.Validate(show); + await _thumbnailsManager.Validate(show); return show; } @@ -86,14 +86,14 @@ namespace Kyoo.Controllers episode.SeasonNumber = episode.SeasonNumber != -1 ? episode.SeasonNumber : seasonNumber; episode.EpisodeNumber = episode.EpisodeNumber != -1 ? episode.EpisodeNumber : episodeNumber; episode.AbsoluteNumber = episode.AbsoluteNumber != -1 ? episode.AbsoluteNumber : absoluteNumber; - await thumbnailsManager.Validate(episode); + await _thumbnailsManager.Validate(episode); return episode; } public async Task> GetPeople(Show show, Library library) { IEnumerable people = await GetMetadata(provider => provider.GetPeople(show), library, "unknown data"); - people = await thumbnailsManager.Validate(people); + people = await _thumbnailsManager.Validate(people); return people; } } diff --git a/Kyoo/HtmlAPI/SubtitleAPI.cs b/Kyoo/HtmlAPI/SubtitleAPI.cs index 954da5c6..3ce9bbeb 100644 --- a/Kyoo/HtmlAPI/SubtitleAPI.cs +++ b/Kyoo/HtmlAPI/SubtitleAPI.cs @@ -50,12 +50,12 @@ namespace Kyoo.Controllers public async Task ExtractSubtitle(string showSlug, long seasonNumber, long episodeNumber) { Episode episode = libraryManager.GetEpisode(showSlug, seasonNumber, episodeNumber); - libraryManager.ClearSubtitles(episode.Id); + libraryManager.ClearSubtitles(episode.ID); Track[] tracks = await transcoder.ExtractSubtitles(episode.Path); foreach (Track track in tracks) { - track.EpisodeID = episode.Id; + track.EpisodeID = episode.ID; libraryManager.RegisterTrack(track); } @@ -68,12 +68,12 @@ namespace Kyoo.Controllers IEnumerable episodes = libraryManager.GetEpisodes(showSlug); foreach (Episode episode in episodes) { - libraryManager.ClearSubtitles(episode.Id); + libraryManager.ClearSubtitles(episode.ID); Track[] tracks = await transcoder.ExtractSubtitles(episode.Path); foreach (Track track in tracks) { - track.EpisodeID = episode.Id; + track.EpisodeID = episode.ID; libraryManager.RegisterTrack(track); } } diff --git a/Kyoo/Startup.cs b/Kyoo/Startup.cs index 089b0b74..b8e88e24 100644 --- a/Kyoo/Startup.cs +++ b/Kyoo/Startup.cs @@ -33,18 +33,18 @@ namespace Kyoo services.AddControllers().AddNewtonsoftJson(); services.AddHttpClient(); - services.AddDbContext(options => options.UseSqlite(Configuration.GetConnectionString("Database"))); + services.AddDbContext(options => options.UseSqlite(Configuration.GetConnectionString("Database")), ServiceLifetime.Singleton); // services.AddIdentity() // .AddEntityFrameworkStores() // services.AddIdentityServer(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.