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
string GetShowExternalIDs(long showID);
Studio GetStudio(long showID);
IEnumerable<People> GetDirectors(long showID);
IEnumerable<People> GetPeople(long showID);
IEnumerable<Genre> GetGenreForShow(long showID);
IEnumerable<Season> GetSeasons(long showID);
@ -45,13 +44,10 @@ namespace Kyoo.Controllers
IEnumerable<Studio> 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);

View File

@ -7,7 +7,7 @@ namespace Kyoo.Models
{
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 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)

View File

@ -5,7 +5,7 @@ namespace Kyoo.Models
{
public class Episode : IMergable<Episode>
{
[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)

View File

@ -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;
}

View File

@ -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)

View File

@ -8,7 +8,7 @@ namespace Kyoo.Models
{
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 Title { get; set; }

View File

@ -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<string>("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";

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
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<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;";
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;
}
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<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;";
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;
}
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<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;
//}
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<Show> 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<Show> shows = new List<Show>();
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<Show> GetShowsInLibrary(long libraryID)
{
List<Show> shows = new List<Show>();
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<Show> 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<Show> shows = new List<Show>();
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<Episode> GetAllEpisodes()
{
List<Episode> episodes = new List<Episode>();
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<Episode> SearchEpisodes(string searchQuery)
{
List<Episode> episodes = new List<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;
return from episode in _database.Episodes where episode.Title.Contains(searchQuery) select episode;
}
public IEnumerable<People> SearchPeople(string searchQuery)
{
List<People> people = new List<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;
return from people in _database.Peoples where people.Name.Contains(searchQuery) select people;
}
public IEnumerable<Genre> SearchGenres(string searchQuery)
{
List<Genre> genres = new List<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;
return from genre in _database.Genres where genre.Name.Contains(searchQuery) select genre;
}
public IEnumerable<Studio> SearchStudios(string searchQuery)
{
List<Studio> studios = new List<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;
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();
}

View File

@ -11,48 +11,46 @@ namespace Kyoo.Controllers
{
public class PluginManager : IPluginManager
{
private readonly IServiceProvider provider;
private readonly IConfiguration config;
private List<IPlugin> plugins;
private readonly IServiceProvider _provider;
private readonly IConfiguration _config;
private List<IPlugin> _plugins;
public PluginManager(IServiceProvider provider, IConfiguration config)
{
this.provider = provider;
this.config = config;
_provider = provider;
_config = config;
}
public T GetPlugin<T>(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<T> GetPlugins<T>()
{
if (plugins == null)
return null;
return from plugin in plugins where plugin is T
select (T)plugin;
if (_plugins == null)
return new List<T>();
return from plugin in _plugins where plugin is T select (T)plugin;
}
public void ReloadPlugins()
{
string pluginFolder = config.GetValue<string>("plugins");
string pluginFolder = _config.GetValue<string>("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)
{

View File

@ -8,20 +8,20 @@ namespace Kyoo.Controllers
{
public class ProviderManager : IProviderManager
{
private readonly IEnumerable<IMetadataProvider> providers;
private readonly IThumbnailsManager thumbnailsManager;
private readonly IEnumerable<IMetadataProvider> _providers;
private readonly IThumbnailsManager _thumbnailsManager;
public ProviderManager(IThumbnailsManager thumbnailsManager, IPluginManager pluginManager)
{
this.thumbnailsManager = thumbnailsManager;
providers = pluginManager.GetPlugins<IMetadataProvider>();
_thumbnailsManager = thumbnailsManager;
_providers = pluginManager.GetPlugins<IMetadataProvider>();
}
public async Task<T> GetMetadata<T>(Func<IMetadataProvider, Task<T>> providerCall, Library library, string what) where T : IMergable<T>, 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<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
{
@ -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<IEnumerable<People>> GetPeople(Show show, Library library)
{
IEnumerable<People> people = await GetMetadata(provider => provider.GetPeople(show), library, "unknown data");
people = await thumbnailsManager.Validate(people);
people = await _thumbnailsManager.Validate(people);
return people;
}
}

View File

@ -50,12 +50,12 @@ namespace Kyoo.Controllers
public async Task<string> 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<Episode> 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);
}
}

View File

@ -33,18 +33,18 @@ namespace Kyoo
services.AddControllers().AddNewtonsoftJson();
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>()
// .AddEntityFrameworkStores()
// services.AddIdentityServer();
services.AddScoped<ILibraryManager, LibraryManager>();
services.AddScoped<ITranscoder, Transcoder>();
services.AddScoped<IThumbnailsManager, ThumbnailsManager>();
services.AddScoped<IProviderManager, ProviderManager>();
services.AddScoped<ICrawler, Crawler>();
services.AddScoped<IPluginManager, PluginManager>();
services.AddSingleton<ILibraryManager, LibraryManager>();
services.AddSingleton<ITranscoder, Transcoder>();
services.AddSingleton<IThumbnailsManager, ThumbnailsManager>();
services.AddSingleton<IProviderManager, ProviderManager>();
services.AddSingleton<ICrawler, Crawler>();
services.AddSingleton<IPluginManager, PluginManager>();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.