Starting to have a real implementation of EF

This commit is contained in:
Zoe Roux 2020-02-07 01:29:57 +01:00
parent 5181a6cf46
commit a2a494d907
12 changed files with 140 additions and 503 deletions

View File

@ -9,7 +9,6 @@ namespace Kyoo.Controllers
//Read values //Read values
string GetShowExternalIDs(long showID); string GetShowExternalIDs(long showID);
Studio GetStudio(long showID); Studio GetStudio(long showID);
IEnumerable<People> GetDirectors(long showID);
IEnumerable<People> GetPeople(long showID); IEnumerable<People> GetPeople(long showID);
IEnumerable<Genre> GetGenreForShow(long showID); IEnumerable<Genre> GetGenreForShow(long showID);
IEnumerable<Season> GetSeasons(long showID); IEnumerable<Season> GetSeasons(long showID);
@ -45,13 +44,10 @@ namespace Kyoo.Controllers
IEnumerable<Studio> SearchStudios(string searchQuery); IEnumerable<Studio> SearchStudios(string searchQuery);
//Check if value exists //Check if value exists
bool IsCollectionRegistered(string collectionSlug);
bool IsCollectionRegistered(string collectionSlug, out long collectionID); bool IsCollectionRegistered(string collectionSlug, out long collectionID);
bool IsShowRegistered(string showPath);
bool IsShowRegistered(string showPath, out long showID); bool IsShowRegistered(string showPath, out long showID);
bool IsSeasonRegistered(long showID, long seasonNumber);
bool IsSeasonRegistered(long showID, long seasonNumber, out long seasonID); bool IsSeasonRegistered(long showID, long seasonNumber, out long seasonID);
bool IsEpisodeRegistered(string episodePath); bool IsEpisodeRegistered(string episodePath, out long episodeID);
//Register values //Register values
long RegisterCollection(Collection collection); long RegisterCollection(Collection collection);

View File

@ -7,7 +7,7 @@ namespace Kyoo.Models
{ {
public class Collection : IMergable<Collection> public class Collection : IMergable<Collection>
{ {
[JsonIgnore] public long Id { get; set; } = -1; [JsonIgnore] public long ID { get; set; } = -1;
public string Slug { get; set; } public string Slug { get; set; }
public string Name { get; set; } public string Name { get; set; }
public string Poster { 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) public Collection(long id, string slug, string name, string overview, string imgPrimary)
{ {
Id = id; ID = id;
Slug = slug; Slug = slug;
Name = name; Name = name;
Overview = overview; Overview = overview;
@ -47,7 +47,7 @@ namespace Kyoo.Models
public Collection SetShows(ILibraryManager libraryManager) public Collection SetShows(ILibraryManager libraryManager)
{ {
Shows = libraryManager.GetShowsInCollection(Id); Shows = libraryManager.GetShowsInCollection(ID);
return this; return this;
} }
@ -55,8 +55,8 @@ namespace Kyoo.Models
{ {
if (collection == null) if (collection == null)
return this; return this;
if (Id == -1) if (ID == -1)
Id = collection.Id; ID = collection.ID;
if (Slug == null) if (Slug == null)
Slug = collection.Slug; Slug = collection.Slug;
if (Name == null) if (Name == null)

View File

@ -5,7 +5,7 @@ namespace Kyoo.Models
{ {
public class Episode : IMergable<Episode> public class Episode : IMergable<Episode>
{ {
[JsonIgnore] public long Id { get; set; } [JsonIgnore] public long ID { get; set; }
[JsonIgnore] public long ShowID { get; set; } [JsonIgnore] public long ShowID { get; set; }
public virtual Show Show { get; set; } public virtual Show Show { get; set; }
[JsonIgnore] public long SeasonID { get; set; } [JsonIgnore] public long SeasonID { get; set; }
@ -31,7 +31,7 @@ namespace Kyoo.Models
public Episode() public Episode()
{ {
Id = -1; ID = -1;
ShowID = -1; ShowID = -1;
SeasonID = -1; SeasonID = -1;
SeasonNumber = -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) 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; ShowID = -1;
SeasonID = -1; SeasonID = -1;
SeasonNumber = seasonNumber; 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) 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; ShowID = showID;
SeasonID = seasonID; SeasonID = seasonID;
SeasonNumber = seasonNumber; SeasonNumber = seasonNumber;
@ -112,8 +112,8 @@ namespace Kyoo.Models
{ {
if (other == null) if (other == null)
return this; return this;
if (Id == -1) if (ID == -1)
Id = other.Id; ID = other.ID;
if (ShowID == -1) if (ShowID == -1)
ShowID = other.ShowID; ShowID = other.ShowID;
if (SeasonID == -1) if (SeasonID == -1)

View File

@ -4,7 +4,7 @@ namespace Kyoo.Models
{ {
public class Genre public class Genre
{ {
[JsonIgnore] public long Id { get; set; } [JsonIgnore] public long ID { get; set; }
public string Slug { get; set; } public string Slug { get; set; }
public string Name { get; set; } public string Name { get; set; }
@ -16,7 +16,7 @@ namespace Kyoo.Models
public Genre(long id, string slug, string name) public Genre(long id, string slug, string name)
{ {
Id = id; ID = id;
Slug = slug; Slug = slug;
Name = name; Name = name;
} }

View File

@ -9,8 +9,8 @@ namespace Kyoo.Models
[JsonIgnore] public long ID { get; set; } = -1; [JsonIgnore] public long ID { get; set; } = -1;
public string Slug { get; set; } public string Slug { get; set; }
public string Name { get; set; } public string Name { get; set; }
public string Role;//Dynamic data not stored as it in the database public string Role;
public string Type; //Dynamic data not stored as it in the database ---- Null for now public string Type;
[JsonIgnore] public string ImgPrimary { get; set; } [JsonIgnore] public string ImgPrimary { get; set; }
public string ExternalIDs { get; set; } public string ExternalIDs { get; set; }
@ -38,24 +38,11 @@ namespace Kyoo.Models
ExternalIDs = externalIDs; ExternalIDs = externalIDs;
} }
public static People FromReader(System.Data.SQLite.SQLiteDataReader reader) public People SetRoleType(string role, string type)
{ {
return new People((long)reader["id"], Role = role;
reader["slug"] as string, Type = type;
reader["name"] as string, return this;
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);
} }
public People Merge(People other) public People Merge(People other)

View File

@ -8,7 +8,7 @@ namespace Kyoo.Models
{ {
public class Show : IMergable<Show> public class Show : IMergable<Show>
{ {
[JsonIgnore] public long ID { get; set; } = -1; [JsonIgnore] public long ID { get; set; }
public string Slug { get; set; } public string Slug { get; set; }
public string Title { get; set; } public string Title { get; set; }

View File

@ -89,7 +89,7 @@ namespace Kyoo.Controllers
private async Task RegisterFile(string path, string relativePath, Library library) private async Task RegisterFile(string path, string relativePath, Library library)
{ {
if (!libraryManager.IsEpisodeRegistered(path)) if (!libraryManager.IsEpisodeRegistered(path, out long _))
{ {
string patern = config.GetValue<string>("regex"); string patern = config.GetValue<string>("regex");
Regex regex = new Regex(patern, RegexOptions.IgnoreCase); Regex regex = new Regex(patern, RegexOptions.IgnoreCase);
@ -117,7 +117,7 @@ namespace Kyoo.Controllers
if (!absoluteSucess) 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; return;
} }
} }
@ -183,7 +183,7 @@ namespace Kyoo.Controllers
if (seasonID == -1) if (seasonID == -1)
seasonID = await RegisterSeason(show, seasonNumber, library); seasonID = await RegisterSeason(show, seasonNumber, library);
episode.SeasonID = seasonID; episode.SeasonID = seasonID;
episode.Id = libraryManager.RegisterEpisode(episode); episode.ID = libraryManager.RegisterEpisode(episode);
Track[] tracks = await transcoder.GetTrackInfo(episode.Path); Track[] tracks = await transcoder.GetTrackInfo(episode.Path);
int subcount = 0; int subcount = 0;
@ -194,7 +194,7 @@ namespace Kyoo.Controllers
subcount++; subcount++;
continue; continue;
} }
track.EpisodeID = episode.Id; track.EpisodeID = episode.ID;
libraryManager.RegisterTrack(track); libraryManager.RegisterTrack(track);
} }
@ -205,7 +205,7 @@ namespace Kyoo.Controllers
{ {
foreach (Track track in subtitles) foreach (Track track in subtitles)
{ {
track.EpisodeID = episode.Id; track.EpisodeID = episode.ID;
libraryManager.RegisterTrack(track); libraryManager.RegisterTrack(track);
} }
} }
@ -228,7 +228,7 @@ namespace Kyoo.Controllers
string language = sub.Substring(Path.GetDirectoryName(sub).Length + episodeLink.Length + 2, 3); string language = sub.Substring(Path.GetDirectoryName(sub).Length + episodeLink.Length + 2, 3);
bool isDefault = sub.Contains("default"); bool isDefault = sub.Contains("default");
bool isForced = sub.Contains("forced"); 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") if (Path.GetExtension(sub) == ".ass")
track.Codec = "ass"; track.Codec = "ass";

View File

@ -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 return (from show in _database.Shows join link in _database.CollectionLinks on show equals link.Show into gj
from l in gj.DefaultIfEmpty() 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); 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 WatchItem item = (from episode in _database.Episodes where episode.SeasonNumber == seasonNumber
&& episode.EpisodeNumber == episodeNumber && episode.Show.Slug == showSlug && episode.EpisodeNumber == episodeNumber && episode.Show.Slug == showSlug
select new WatchItem(episode.Id, select new WatchItem(episode.ID,
episode.Show.Title, episode.Show.Title,
episode.Show.Slug, episode.Show.Slug,
seasonNumber, seasonNumber,
@ -158,350 +158,109 @@ namespace Kyoo.Controllers
public IEnumerable<People> GetPeople(long showID) public IEnumerable<People> 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;"; return from link in _database.PeopleLinks where link.ShowID == showID select link.People.SetRoleType(link.Role, link.Type);
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
{
cmd.Parameters.AddWithValue("$showID", showID);
SQLiteDataReader reader = cmd.ExecuteReader();
List<People> people = new List<People>();
while (reader.Read())
people.Add(People.FromFullReader(reader));
return people;
}
} }
public People GetPeopleBySlug(string slug) public People GetPeopleBySlug(string slug)
{ {
string query = "SELECT * FROM people WHERE slug = $slug;"; return (from people in _database.Peoples where people.Slug == slug select people).FirstOrDefault();
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<Genre> GetGenreForShow(long showID) public IEnumerable<Genre> 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;"; return (from show in _database.Shows where show.ID == showID select show.Genres).FirstOrDefault();
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
{
cmd.Parameters.AddWithValue("$showID", showID);
SQLiteDataReader reader = cmd.ExecuteReader();
List<Genre> genres = new List<Genre>();
while (reader.Read())
genres.Add(Genre.FromReader(reader));
return genres;
}
} }
public Genre GetGenreBySlug(string slug) public Genre GetGenreBySlug(string slug)
{ {
string query = "SELECT * FROM genres WHERE slug = $slug;"; return (from genre in _database.Genres where genre.Slug == slug select genre).FirstOrDefault();
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) 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;"; return (from show in _database.Shows where show.ID == showID select show.Studio).FirstOrDefault();
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) public Studio GetStudioBySlug(string slug)
{ {
string query = "SELECT * FROM studios WHERE slug = $slug;"; return (from studio in _database.Studios where studio.Slug == slug select studio).FirstOrDefault();
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<People> 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<Genre> genres = new List<Genre>();
// while (reader.Read())
// genres.Add(Genre.FromReader(reader));
// return genres;
//}
} }
public Collection GetCollection(string slug) public Collection GetCollection(string slug)
{ {
string query = "SELECT * FROM collections WHERE slug = $slug;"; return (from collection in _database.Collections where collection.Slug == slug select collection).FirstOrDefault();
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<Show> GetShowsInCollection(long collectionID) public IEnumerable<Show> GetShowsInCollection(long collectionID)
{ {
string query = "SELECT * FROM shows JOIN collectionsLinks l ON l.showID = shows.id WHERE l.collectionID = $id ORDER BY title;"; return from link in _database.CollectionLinks where link.CollectionID == collectionID select link.Show;
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
{
cmd.Parameters.AddWithValue("$id", collectionID);
SQLiteDataReader reader = cmd.ExecuteReader();
List<Show> shows = new List<Show>();
while (reader.Read())
shows.Add(Show.FromReader(reader));
return shows;
}
} }
public IEnumerable<Show> GetShowsInLibrary(long libraryID) public IEnumerable<Show> GetShowsInLibrary(long libraryID)
{ {
List<Show> shows = new List<Show>(); return (from link in _database.LibraryLinks where link.LibraryID == libraryID select link).AsEnumerable()
SQLiteDataReader reader; .Select(link => link.Show ?? link.Collection.AsShow())
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;"; .OrderBy(x => x.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<Show> GetShowsByPeople(long peopleID) public IEnumerable<Show> GetShowsByPeople(long peopleID)
{ {
string query = "SELECT * FROM shows JOIN peopleLinks l ON l.showID = shows.id WHERE l.peopleID = $id ORDER BY title;"; return (from link in _database.PeopleLinks where link.PeopleID == peopleID select link.Show).OrderBy(x => x.Title);
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
{
cmd.Parameters.AddWithValue("$id", peopleID);
SQLiteDataReader reader = cmd.ExecuteReader();
List<Show> shows = new List<Show>();
while (reader.Read())
shows.Add(Show.FromReader(reader));
return shows;
}
} }
public IEnumerable<Episode> GetAllEpisodes() public IEnumerable<Episode> GetAllEpisodes()
{ {
List<Episode> episodes = new List<Episode>(); return _database.Episodes;
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<Episode> SearchEpisodes(string searchQuery) public IEnumerable<Episode> SearchEpisodes(string searchQuery)
{ {
List<Episode> episodes = new List<Episode>(); return from episode in _database.Episodes where episode.Title.Contains(searchQuery) select episode;
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<People> SearchPeople(string searchQuery) public IEnumerable<People> SearchPeople(string searchQuery)
{ {
List<People> people = new List<People>(); return from people in _database.Peoples where people.Name.Contains(searchQuery) select people;
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<Genre> SearchGenres(string searchQuery) public IEnumerable<Genre> SearchGenres(string searchQuery)
{ {
List<Genre> genres = new List<Genre>(); return from genre in _database.Genres where genre.Name.Contains(searchQuery) select genre;
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<Studio> SearchStudios(string searchQuery) public IEnumerable<Studio> SearchStudios(string searchQuery)
{ {
List<Studio> studios = new List<Studio>(); return from studio in _database.Studios where studio.Name.Contains(searchQuery) select studio;
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 #endregion
#region Check if items exists #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) public bool IsCollectionRegistered(string collectionSlug, out long collectionID)
{ {
string query = "SELECT (id) FROM collections WHERE slug = $slug;"; Collection col = (from collection in _database.Collections where collection.Slug == collectionSlug select collection).FirstOrDefault();
collectionID = col?.ID ?? -1;
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) return collectionID != -1;
{
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) public bool IsShowRegistered(string showPath, out long showID)
{ {
string query = "SELECT (id) FROM shows WHERE path = $path;"; Show tmp = (from show in _database.Shows where show.Path == showPath select show).FirstOrDefault();
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) showID = tmp?.ID ?? -1;
{ return showID != -1;
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) public bool IsSeasonRegistered(long showID, long seasonNumber, out long seasonID)
{ {
string query = "SELECT (id) FROM seasons WHERE showID = $showID AND seasonNumber = $seasonNumber;"; Season tmp = (from season in _database.Seasons where season.SeasonNumber == seasonNumber && season.ShowID == showID select season).FirstOrDefault();
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) seasonID = tmp?.ID ?? -1;
{ return seasonID != -1;
cmd.Parameters.AddWithValue("$showID", showID);
cmd.Parameters.AddWithValue("$seasonNumber", seasonNumber);
seasonID = cmd.ExecuteScalar() as long? ?? -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;"; Episode tmp = (from episode in _database.Episodes where episode.Path == episodePath select episode).FirstOrDefault();
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) episodeID = tmp?.ID ?? -1;
{ return episodeID != -1;
cmd.Parameters.AddWithValue("$path", episodePath);
return cmd.ExecuteScalar() != null;
}
} }
public long GetOrCreateGenre(Genre genre) public long GetOrCreateGenre(Genre genre)
@ -509,28 +268,11 @@ namespace Kyoo.Controllers
Genre existingGenre = GetGenreBySlug(genre.Slug); Genre existingGenre = GetGenreBySlug(genre.Slug);
if (existingGenre != null) if (existingGenre != null)
return existingGenre.Id; return existingGenre.ID;
string query = "INSERT INTO genres (slug, name) VALUES($slug, $name);"; _database.Genres.Add(genre);
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) _database.SaveChanges();
{ return genre.ID;
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) public long GetOrCreateStudio(Studio studio)
@ -539,27 +281,10 @@ namespace Kyoo.Controllers
if (existingStudio != null) if (existingStudio != null)
return existingStudio.ID; return existingStudio.ID;
string query = "INSERT INTO studios (slug, name) VALUES($slug, $name);"; _database.Studios.Add(studio);
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) _database.SaveChanges();
{ return studio.ID;
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) public long GetOrCreatePeople(People people)
@ -569,128 +294,59 @@ namespace Kyoo.Controllers
if (existingPeople != null) if (existingPeople != null)
return existingPeople.ID; return existingPeople.ID;
string query = "INSERT INTO people (slug, name, imgPrimary, externalIDs) VALUES($slug, $name, $imgPrimary, $externalIDs);"; _database.Peoples.Add(people);
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) _database.SaveChanges();
{ return people.ID;
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 #endregion
#region Write Into The Database #region Write Into The Database
public long RegisterCollection(Collection collection) public long RegisterCollection(Collection collection)
{ {
string query = "INSERT INTO collections (slug, name, overview, imgPrimary) VALUES($slug, $name, $overview, $imgPrimary);"; // string query = "INSERT INTO collections (slug, name, overview, imgPrimary) VALUES($slug, $name, $overview, $imgPrimary);";
//
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) // using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
{ // {
try // try
{ // {
cmd.Parameters.AddWithValue("$slug", collection.Slug); // cmd.Parameters.AddWithValue("$slug", collection.Slug);
cmd.Parameters.AddWithValue("$name", collection.Name); // cmd.Parameters.AddWithValue("$name", collection.Name);
cmd.Parameters.AddWithValue("$overview", collection.Overview); // cmd.Parameters.AddWithValue("$overview", collection.Overview);
cmd.Parameters.AddWithValue("$imgPrimary", collection.ImgPrimary); // cmd.Parameters.AddWithValue("$imgPrimary", collection.ImgPrimary);
cmd.ExecuteNonQuery(); // cmd.ExecuteNonQuery();
//
cmd.CommandText = "SELECT LAST_INSERT_ROWID()"; // cmd.CommandText = "SELECT LAST_INSERT_ROWID()";
return (long)cmd.ExecuteScalar(); // return (long)cmd.ExecuteScalar();
} // }
catch // catch
{ // {
Console.Error.WriteLine("SQL error while trying to create a collection. Collection probably already registered."); // Console.Error.WriteLine("SQL error while trying to create a collection. Collection probably already registered.");
cmd.CommandText = "SELECT * FROM collections WHERE slug = $slug"; // cmd.CommandText = "SELECT * FROM collections WHERE slug = $slug";
cmd.Parameters.AddWithValue("$slug", collection.Slug); // cmd.Parameters.AddWithValue("$slug", collection.Slug);
return (long)cmd.ExecuteScalar(); // return (long)cmd.ExecuteScalar();
} // }
} // }
return -1;
} }
public void RegisterInLibrary(long showID, Library library) public void RegisterInLibrary(long showID, Library library)
{ {
string query = // string query =
"INSERT INTO librariesLinks (libraryID, showID) SELECT id, $showID FROM libraries WHERE libraries.id = $libraryID;"; // "INSERT INTO librariesLinks (libraryID, showID) SELECT id, $showID FROM libraries WHERE libraries.id = $libraryID;";
//
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) // using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
{ // {
cmd.Parameters.AddWithValue("$libraryID", library.Id); // cmd.Parameters.AddWithValue("$libraryID", library.Id);
cmd.Parameters.AddWithValue("$showID", showID); // cmd.Parameters.AddWithValue("$showID", showID);
cmd.ExecuteNonQuery(); // cmd.ExecuteNonQuery();
} // }
} }
public long RegisterShow(Show show) 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);"; _database.Shows.Add(show);
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) _database.SaveChanges();
{ return show.ID;
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) public long RegisterSeason(Season season)
@ -839,7 +495,7 @@ namespace Kyoo.Controllers
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection)) using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
{ {
cmd.Parameters.AddWithValue("$episodeID", episode.Id); cmd.Parameters.AddWithValue("$episodeID", episode.ID);
cmd.ExecuteNonQuery(); cmd.ExecuteNonQuery();
} }

View File

@ -11,48 +11,46 @@ namespace Kyoo.Controllers
{ {
public class PluginManager : IPluginManager public class PluginManager : IPluginManager
{ {
private readonly IServiceProvider provider; private readonly IServiceProvider _provider;
private readonly IConfiguration config; private readonly IConfiguration _config;
private List<IPlugin> plugins; private List<IPlugin> _plugins;
public PluginManager(IServiceProvider provider, IConfiguration config) public PluginManager(IServiceProvider provider, IConfiguration config)
{ {
this.provider = provider; _provider = provider;
this.config = config; _config = config;
} }
public T GetPlugin<T>(string name) public T GetPlugin<T>(string name)
{ {
if (plugins == null) if (_plugins == null)
return default; return default;
return (T)(from plugin in plugins where plugin.Name == name && plugin is T return (T)(from plugin in _plugins where plugin.Name == name && plugin is T select plugin).FirstOrDefault();
select plugin).FirstOrDefault();
} }
public IEnumerable<T> GetPlugins<T>() public IEnumerable<T> GetPlugins<T>()
{ {
if (plugins == null) if (_plugins == null)
return null; return new List<T>();
return from plugin in plugins where plugin is T return from plugin in _plugins where plugin is T select (T)plugin;
select (T)plugin;
} }
public void ReloadPlugins() public void ReloadPlugins()
{ {
string pluginFolder = config.GetValue<string>("plugins"); string pluginFolder = _config.GetValue<string>("plugins");
if (!Directory.Exists(pluginFolder)) if (!Directory.Exists(pluginFolder))
return; return;
string[] pluginsPaths = Directory.GetFiles(pluginFolder); string[] pluginsPaths = Directory.GetFiles(pluginFolder);
plugins = pluginsPaths.Select(path => _plugins = pluginsPaths.Select(path =>
{ {
try try
{ {
Assembly ass = Assembly.LoadFile(Path.GetFullPath(path)); Assembly ass = Assembly.LoadFile(Path.GetFullPath(path));
return (from type in ass.GetTypes() return (from type in ass.GetTypes()
where typeof(IPlugin).IsAssignableFrom(type) where typeof(IPlugin).IsAssignableFrom(type)
select (IPlugin) ActivatorUtilities.CreateInstance(provider, type)).FirstOrDefault(); select (IPlugin) ActivatorUtilities.CreateInstance(_provider, type)).FirstOrDefault();
} }
catch (Exception ex) catch (Exception ex)
{ {

View File

@ -8,20 +8,20 @@ namespace Kyoo.Controllers
{ {
public class ProviderManager : IProviderManager public class ProviderManager : IProviderManager
{ {
private readonly IEnumerable<IMetadataProvider> providers; private readonly IEnumerable<IMetadataProvider> _providers;
private readonly IThumbnailsManager thumbnailsManager; private readonly IThumbnailsManager _thumbnailsManager;
public ProviderManager(IThumbnailsManager thumbnailsManager, IPluginManager pluginManager) public ProviderManager(IThumbnailsManager thumbnailsManager, IPluginManager pluginManager)
{ {
this.thumbnailsManager = thumbnailsManager; _thumbnailsManager = thumbnailsManager;
providers = pluginManager.GetPlugins<IMetadataProvider>(); _providers = pluginManager.GetPlugins<IMetadataProvider>();
} }
public async Task<T> GetMetadata<T>(Func<IMetadataProvider, Task<T>> providerCall, Library library, string what) where T : IMergable<T>, new() public async Task<T> GetMetadata<T>(Func<IMetadataProvider, Task<T>> providerCall, Library library, string what) where T : IMergable<T>, new()
{ {
T ret = new T(); 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 try
{ {
@ -38,7 +38,7 @@ namespace Kyoo.Controllers
{ {
List<T> ret = new List<T>(); List<T> ret = new List<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 try
{ {
@ -65,7 +65,7 @@ namespace Kyoo.Controllers
show.Path = showPath; show.Path = showPath;
show.Slug = Utility.ToSlug(showName); show.Slug = Utility.ToSlug(showName);
show.Title ??= showName; show.Title ??= showName;
await thumbnailsManager.Validate(show); await _thumbnailsManager.Validate(show);
return show; return show;
} }
@ -86,14 +86,14 @@ namespace Kyoo.Controllers
episode.SeasonNumber = episode.SeasonNumber != -1 ? episode.SeasonNumber : seasonNumber; episode.SeasonNumber = episode.SeasonNumber != -1 ? episode.SeasonNumber : seasonNumber;
episode.EpisodeNumber = episode.EpisodeNumber != -1 ? episode.EpisodeNumber : episodeNumber; episode.EpisodeNumber = episode.EpisodeNumber != -1 ? episode.EpisodeNumber : episodeNumber;
episode.AbsoluteNumber = episode.AbsoluteNumber != -1 ? episode.AbsoluteNumber : absoluteNumber; episode.AbsoluteNumber = episode.AbsoluteNumber != -1 ? episode.AbsoluteNumber : absoluteNumber;
await thumbnailsManager.Validate(episode); await _thumbnailsManager.Validate(episode);
return episode; return episode;
} }
public async Task<IEnumerable<People>> GetPeople(Show show, Library library) public async Task<IEnumerable<People>> GetPeople(Show show, Library library)
{ {
IEnumerable<People> people = await GetMetadata(provider => provider.GetPeople(show), library, "unknown data"); IEnumerable<People> people = await GetMetadata(provider => provider.GetPeople(show), library, "unknown data");
people = await thumbnailsManager.Validate(people); people = await _thumbnailsManager.Validate(people);
return people; return people;
} }
} }

View File

@ -50,12 +50,12 @@ namespace Kyoo.Controllers
public async Task<string> ExtractSubtitle(string showSlug, long seasonNumber, long episodeNumber) public async Task<string> ExtractSubtitle(string showSlug, long seasonNumber, long episodeNumber)
{ {
Episode episode = libraryManager.GetEpisode(showSlug, seasonNumber, episodeNumber); Episode episode = libraryManager.GetEpisode(showSlug, seasonNumber, episodeNumber);
libraryManager.ClearSubtitles(episode.Id); libraryManager.ClearSubtitles(episode.ID);
Track[] tracks = await transcoder.ExtractSubtitles(episode.Path); Track[] tracks = await transcoder.ExtractSubtitles(episode.Path);
foreach (Track track in tracks) foreach (Track track in tracks)
{ {
track.EpisodeID = episode.Id; track.EpisodeID = episode.ID;
libraryManager.RegisterTrack(track); libraryManager.RegisterTrack(track);
} }
@ -68,12 +68,12 @@ namespace Kyoo.Controllers
IEnumerable<Episode> episodes = libraryManager.GetEpisodes(showSlug); IEnumerable<Episode> episodes = libraryManager.GetEpisodes(showSlug);
foreach (Episode episode in episodes) foreach (Episode episode in episodes)
{ {
libraryManager.ClearSubtitles(episode.Id); libraryManager.ClearSubtitles(episode.ID);
Track[] tracks = await transcoder.ExtractSubtitles(episode.Path); Track[] tracks = await transcoder.ExtractSubtitles(episode.Path);
foreach (Track track in tracks) foreach (Track track in tracks)
{ {
track.EpisodeID = episode.Id; track.EpisodeID = episode.ID;
libraryManager.RegisterTrack(track); libraryManager.RegisterTrack(track);
} }
} }

View File

@ -33,18 +33,18 @@ namespace Kyoo
services.AddControllers().AddNewtonsoftJson(); services.AddControllers().AddNewtonsoftJson();
services.AddHttpClient(); services.AddHttpClient();
services.AddDbContext<DatabaseContext>(options => options.UseSqlite(Configuration.GetConnectionString("Database"))); services.AddDbContext<DatabaseContext>(options => options.UseSqlite(Configuration.GetConnectionString("Database")), ServiceLifetime.Singleton);
// services.AddIdentity<ApplicationUser, IdentityRole>() // services.AddIdentity<ApplicationUser, IdentityRole>()
// .AddEntityFrameworkStores() // .AddEntityFrameworkStores()
// services.AddIdentityServer(); // services.AddIdentityServer();
services.AddScoped<ILibraryManager, LibraryManager>(); services.AddSingleton<ILibraryManager, LibraryManager>();
services.AddScoped<ITranscoder, Transcoder>(); services.AddSingleton<ITranscoder, Transcoder>();
services.AddScoped<IThumbnailsManager, ThumbnailsManager>(); services.AddSingleton<IThumbnailsManager, ThumbnailsManager>();
services.AddScoped<IProviderManager, ProviderManager>(); services.AddSingleton<IProviderManager, ProviderManager>();
services.AddScoped<ICrawler, Crawler>(); services.AddSingleton<ICrawler, Crawler>();
services.AddScoped<IPluginManager, PluginManager>(); services.AddSingleton<IPluginManager, PluginManager>();
} }
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline. // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.