mirror of
https://github.com/zoriya/Kyoo.git
synced 2025-07-09 03:04:20 -04:00
Solving bugs and adding library support.
This commit is contained in:
parent
8c7bdcebc6
commit
f3d207cb4e
@ -49,12 +49,12 @@ namespace Kyoo.Controllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("extract/{showSlug}-s{seasonNumber}e{episodeNumber}")]
|
[HttpGet("extract/{showSlug}-s{seasonNumber}e{episodeNumber}")]
|
||||||
public 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 = 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;
|
||||||
@ -65,14 +65,14 @@ namespace Kyoo.Controllers
|
|||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet("extract/{showSlug}")]
|
[HttpGet("extract/{showSlug}")]
|
||||||
public string ExtractSubtitle(string showSlug)
|
public async Task<string> ExtractSubtitle(string showSlug)
|
||||||
{
|
{
|
||||||
List<Episode> episodes = libraryManager.GetEpisodes(showSlug);
|
List<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 = 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;
|
||||||
|
@ -14,6 +14,7 @@ namespace Kyoo.InternalAPI
|
|||||||
{
|
{
|
||||||
public class Crawler : ICrawler
|
public class Crawler : ICrawler
|
||||||
{
|
{
|
||||||
|
private static ICrawler runningCrawler;
|
||||||
private readonly CancellationTokenSource cancellation;
|
private readonly CancellationTokenSource cancellation;
|
||||||
|
|
||||||
private readonly ILibraryManager libraryManager;
|
private readonly ILibraryManager libraryManager;
|
||||||
@ -33,15 +34,27 @@ namespace Kyoo.InternalAPI
|
|||||||
|
|
||||||
public Task Start(bool watch)
|
public Task Start(bool watch)
|
||||||
{
|
{
|
||||||
|
if (runningCrawler == null)
|
||||||
|
{
|
||||||
|
runningCrawler = this;
|
||||||
return StartAsync(watch, cancellation.Token);
|
return StartAsync(watch, cancellation.Token);
|
||||||
}
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
private Task StartAsync(bool watch, CancellationToken cancellationToken)
|
private Task StartAsync(bool watch, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
Debug.WriteLine("&Crawler started");
|
IEnumerable<Episode> episodes = libraryManager.GetAllEpisodes();
|
||||||
IEnumerable<string> paths = libraryManager.GetLibrariesPath();
|
IEnumerable<string> libraryPaths = libraryManager.GetLibrariesPath();
|
||||||
|
|
||||||
foreach (string path in paths)
|
Debug.WriteLine("&Crawler started");
|
||||||
|
foreach (Episode episode in episodes)
|
||||||
|
{
|
||||||
|
if (!File.Exists(episode.Path))
|
||||||
|
libraryManager.RemoveEpisode(episode);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (string path in libraryPaths)
|
||||||
{
|
{
|
||||||
Scan(path, cancellationToken);
|
Scan(path, cancellationToken);
|
||||||
|
|
||||||
@ -50,8 +63,8 @@ namespace Kyoo.InternalAPI
|
|||||||
}
|
}
|
||||||
|
|
||||||
while (!cancellationToken.IsCancellationRequested);
|
while (!cancellationToken.IsCancellationRequested);
|
||||||
|
|
||||||
Debug.WriteLine("&Crawler stopped");
|
Debug.WriteLine("&Crawler stopped");
|
||||||
|
runningCrawler = null;
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -65,9 +78,12 @@ namespace Kyoo.InternalAPI
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (IsVideo(file))
|
if (IsVideo(file))
|
||||||
|
{
|
||||||
|
Debug.WriteLine("&Registering episode at: " + file);
|
||||||
await ExtractEpisodeData(file, folderPath);
|
await ExtractEpisodeData(file, folderPath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void Watch(string folderPath, CancellationToken cancellationToken)
|
public void Watch(string folderPath, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
@ -157,6 +173,7 @@ namespace Kyoo.InternalAPI
|
|||||||
}
|
}
|
||||||
|
|
||||||
Show show = await RegisterOrGetShow(collectionName, showName, showPath, libraryPath);
|
Show show = await RegisterOrGetShow(collectionName, showName, showPath, libraryPath);
|
||||||
|
if (show != null)
|
||||||
await RegisterEpisode(show, seasonNumber, episodeNumber, absoluteNumber, episodePath);
|
await RegisterEpisode(show, seasonNumber, episodeNumber, absoluteNumber, episodePath);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -171,8 +188,11 @@ namespace Kyoo.InternalAPI
|
|||||||
showProviderIDs = show.ExternalIDs;
|
showProviderIDs = show.ExternalIDs;
|
||||||
showID = libraryManager.RegisterShow(show);
|
showID = libraryManager.RegisterShow(show);
|
||||||
|
|
||||||
|
if (showID == -1)
|
||||||
|
return null;
|
||||||
|
|
||||||
libraryManager.RegisterInLibrary(showID, libraryPath);
|
libraryManager.RegisterInLibrary(showID, libraryPath);
|
||||||
if (collectionName != null)
|
if (collectionName != null && collectionName.Length > 0)
|
||||||
{
|
{
|
||||||
if (!libraryManager.IsCollectionRegistered(Slugifier.ToSlug(collectionName), out long collectionID))
|
if (!libraryManager.IsCollectionRegistered(Slugifier.ToSlug(collectionName), out long collectionID))
|
||||||
{
|
{
|
||||||
@ -224,7 +244,7 @@ namespace Kyoo.InternalAPI
|
|||||||
{
|
{
|
||||||
if (!FindExtractedSubtitles(episode))
|
if (!FindExtractedSubtitles(episode))
|
||||||
{
|
{
|
||||||
Track[] tracks = transcoder.ExtractSubtitles(episode.Path);
|
Track[] tracks = await transcoder.ExtractSubtitles(episode.Path);
|
||||||
if (tracks != null)
|
if (tracks != null)
|
||||||
{
|
{
|
||||||
foreach (Track track in tracks)
|
foreach (Track track in tracks)
|
||||||
@ -282,7 +302,6 @@ namespace Kyoo.InternalAPI
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private static readonly string[] videoExtensions = { ".webm", ".mkv", ".flv", ".vob", ".ogg", ".ogv", ".avi", ".mts", ".m2ts", ".ts", ".mov", ".qt", ".asf", ".mp4", ".m4p", ".m4v", ".mpg", ".mp2", ".mpeg", ".mpe", ".mpv", ".m2v", ".3gp", ".3g2" };
|
private static readonly string[] videoExtensions = { ".webm", ".mkv", ".flv", ".vob", ".ogg", ".ogv", ".avi", ".mts", ".m2ts", ".ts", ".mov", ".qt", ".asf", ".mp4", ".m4p", ".m4v", ".mpg", ".mp2", ".mpeg", ".mpe", ".mpv", ".m2v", ".3gp", ".3g2" };
|
||||||
|
|
||||||
private bool IsVideo(string filePath)
|
private bool IsVideo(string filePath)
|
||||||
|
@ -37,6 +37,7 @@ namespace Kyoo.InternalAPI
|
|||||||
Genre GetGenreBySlug(string slug);
|
Genre GetGenreBySlug(string slug);
|
||||||
Studio GetStudioBySlug(string slug);
|
Studio GetStudioBySlug(string slug);
|
||||||
Collection GetCollection(string slug);
|
Collection GetCollection(string slug);
|
||||||
|
IEnumerable<Episode> GetAllEpisodes();
|
||||||
|
|
||||||
//Check if value exists
|
//Check if value exists
|
||||||
bool IsCollectionRegistered(string collectionSlug);
|
bool IsCollectionRegistered(string collectionSlug);
|
||||||
@ -61,6 +62,7 @@ namespace Kyoo.InternalAPI
|
|||||||
void AddShowToCollection(long showID, long collectionID);
|
void AddShowToCollection(long showID, long collectionID);
|
||||||
void RegisterInLibrary(long showID, string libraryPath);
|
void RegisterInLibrary(long showID, string libraryPath);
|
||||||
|
|
||||||
|
void RemoveEpisode(Episode episode);
|
||||||
void ClearSubtitles(long episodeID);
|
void ClearSubtitles(long episodeID);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -52,7 +52,7 @@ namespace Kyoo.InternalAPI
|
|||||||
imgPrimary TEXT,
|
imgPrimary TEXT,
|
||||||
year INTEGER,
|
year INTEGER,
|
||||||
externalIDs TEXT,
|
externalIDs TEXT,
|
||||||
FOREIGN KEY(showID) REFERENCES shows(id)
|
FOREIGN KEY(showID) REFERENCES shows(id) ON DELETE CASCADE
|
||||||
);
|
);
|
||||||
CREATE TABLE episodes(
|
CREATE TABLE episodes(
|
||||||
id INTEGER PRIMARY KEY UNIQUE,
|
id INTEGER PRIMARY KEY UNIQUE,
|
||||||
@ -61,15 +61,15 @@ namespace Kyoo.InternalAPI
|
|||||||
seasonNumber INTEGER,
|
seasonNumber INTEGER,
|
||||||
episodeNumber INTEGER,
|
episodeNumber INTEGER,
|
||||||
absoluteNumber INTEGER,
|
absoluteNumber INTEGER,
|
||||||
path TEXT,
|
path TEXT UNIQUE,
|
||||||
title TEXT,
|
title TEXT,
|
||||||
overview TEXT,
|
overview TEXT,
|
||||||
imgPrimary TEXT,
|
imgPrimary TEXT,
|
||||||
releaseDate TEXT,
|
releaseDate TEXT,
|
||||||
runtime INTEGER,
|
runtime INTEGER,
|
||||||
externalIDs TEXT,
|
externalIDs TEXT,
|
||||||
FOREIGN KEY(showID) REFERENCES shows(id),
|
FOREIGN KEY(showID) REFERENCES shows(id) ON DELETE CASCADE,
|
||||||
FOREIGN KEY(seasonID) REFERENCES seasons(id)
|
FOREIGN KEY(seasonID) REFERENCES seasons(id) ON DELETE CASCADE
|
||||||
);
|
);
|
||||||
CREATE TABLE tracks(
|
CREATE TABLE tracks(
|
||||||
id INTEGER PRIMARY KEY UNIQUE,
|
id INTEGER PRIMARY KEY UNIQUE,
|
||||||
@ -82,7 +82,7 @@ namespace Kyoo.InternalAPI
|
|||||||
isForced BOOLEAN,
|
isForced BOOLEAN,
|
||||||
isExternal BOOLEAN,
|
isExternal BOOLEAN,
|
||||||
path TEXT,
|
path TEXT,
|
||||||
FOREIGN KEY(episodeID) REFERENCES episodes(id)
|
FOREIGN KEY(episodeID) REFERENCES episodes(id) ON DELETE CASCADE
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE libraries(
|
CREATE TABLE libraries(
|
||||||
@ -94,8 +94,8 @@ namespace Kyoo.InternalAPI
|
|||||||
CREATE TABLE librariesLinks(
|
CREATE TABLE librariesLinks(
|
||||||
libraryID INTEGER,
|
libraryID INTEGER,
|
||||||
showID INTEGER,
|
showID INTEGER,
|
||||||
FOREIGN KEY(libraryID) REFERENCES libraries(id),
|
FOREIGN KEY(libraryID) REFERENCES libraries(id) ON DELETE CASCADE,
|
||||||
FOREIGN KEY(showID) REFERENCES shows(id)
|
FOREIGN KEY(showID) REFERENCES shows(id) ON DELETE CASCADE
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE collections(
|
CREATE TABLE collections(
|
||||||
@ -103,15 +103,15 @@ namespace Kyoo.InternalAPI
|
|||||||
slug TEXT UNIQUE,
|
slug TEXT UNIQUE,
|
||||||
name TEXT,
|
name TEXT,
|
||||||
overview TEXT,
|
overview TEXT,
|
||||||
starYear INTEGER,
|
startYear INTEGER,
|
||||||
endYear INTEGER,
|
endYear INTEGER,
|
||||||
imgPrimary TEXT
|
imgPrimary TEXT
|
||||||
);
|
);
|
||||||
CREATE TABLE collectionsLinks(
|
CREATE TABLE collectionsLinks(
|
||||||
collectionID INTEGER,
|
collectionID INTEGER,
|
||||||
showID INTEGER,
|
showID INTEGER,
|
||||||
FOREIGN KEY(collectionID) REFERENCES collections(id),
|
FOREIGN KEY(collectionID) REFERENCES collections(id) ON DELETE CASCADE,
|
||||||
FOREIGN KEY(showID) REFERENCES shows(id)
|
FOREIGN KEY(showID) REFERENCES shows(id) ON DELETE CASCADE
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE studios(
|
CREATE TABLE studios(
|
||||||
@ -122,8 +122,8 @@ namespace Kyoo.InternalAPI
|
|||||||
CREATE TABLE studiosLinks(
|
CREATE TABLE studiosLinks(
|
||||||
studioID INTEGER,
|
studioID INTEGER,
|
||||||
showID INTEGER,
|
showID INTEGER,
|
||||||
FOREIGN KEY(studioID) REFERENCES studios(id),
|
FOREIGN KEY(studioID) REFERENCES studios(id) ON DELETE CASCADE,
|
||||||
FOREIGN KEY(showID) REFERENCES shows(id)
|
FOREIGN KEY(showID) REFERENCES shows(id) ON DELETE CASCADE
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE people(
|
CREATE TABLE people(
|
||||||
@ -138,8 +138,8 @@ namespace Kyoo.InternalAPI
|
|||||||
showID INTEGER,
|
showID INTEGER,
|
||||||
role TEXT,
|
role TEXT,
|
||||||
type TEXT,
|
type TEXT,
|
||||||
FOREIGN KEY(peopleID) REFERENCES people(id),
|
FOREIGN KEY(peopleID) REFERENCES people(id) ON DELETE CASCADE,
|
||||||
FOREIGN KEY(showID) REFERENCES shows(id)
|
FOREIGN KEY(showID) REFERENCES shows(id) ON DELETE CASCADE
|
||||||
);
|
);
|
||||||
|
|
||||||
CREATE TABLE genres(
|
CREATE TABLE genres(
|
||||||
@ -150,8 +150,8 @@ namespace Kyoo.InternalAPI
|
|||||||
CREATE TABLE genresLinks(
|
CREATE TABLE genresLinks(
|
||||||
genreID INTEGER,
|
genreID INTEGER,
|
||||||
showID INTEGER,
|
showID INTEGER,
|
||||||
FOREIGN KEY(genreID) REFERENCES genres(id),
|
FOREIGN KEY(genreID) REFERENCES genres(id) ON DELETE CASCADE,
|
||||||
FOREIGN KEY(showID) REFERENCES shows(id)
|
FOREIGN KEY(showID) REFERENCES shows(id) ON DELETE CASCADE
|
||||||
);";
|
);";
|
||||||
|
|
||||||
using (SQLiteCommand createCmd = new SQLiteCommand(createStatement, sqlConnection))
|
using (SQLiteCommand createCmd = new SQLiteCommand(createStatement, sqlConnection))
|
||||||
@ -404,6 +404,25 @@ namespace Kyoo.InternalAPI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<Episode> GetEpisodes(long showID, long seasonNumber)
|
||||||
|
{
|
||||||
|
string query = "SELECT * FROM episodes WHERE episodes.showID = $showID AND episodes.seasonNumber = $seasonNumber ORDER BY episodeNumber;";
|
||||||
|
|
||||||
|
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
|
||||||
|
{
|
||||||
|
cmd.Parameters.AddWithValue("$showID", showID);
|
||||||
|
cmd.Parameters.AddWithValue("$seasonNumber", seasonNumber);
|
||||||
|
SQLiteDataReader reader = cmd.ExecuteReader();
|
||||||
|
|
||||||
|
List<Episode> episodes = new List<Episode>();
|
||||||
|
|
||||||
|
while (reader.Read())
|
||||||
|
episodes.Add(Episode.FromReader(reader));
|
||||||
|
|
||||||
|
return episodes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public Episode GetEpisode(string showSlug, long seasonNumber, long episodeNumber)
|
public Episode GetEpisode(string showSlug, long seasonNumber, long episodeNumber)
|
||||||
{
|
{
|
||||||
string query = "SELECT * FROM episodes JOIN shows ON shows.id = episodes.showID WHERE shows.slug = $showSlug AND episodes.seasonNumber = $seasonNumber AND episodes.episodeNumber = $episodeNumber;";
|
string query = "SELECT * FROM episodes JOIN shows ON shows.id = episodes.showID WHERE shows.slug = $showSlug AND episodes.seasonNumber = $seasonNumber AND episodes.episodeNumber = $episodeNumber;";
|
||||||
@ -627,6 +646,21 @@ namespace Kyoo.InternalAPI
|
|||||||
return shows;
|
return shows;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Check if items exists
|
#region Check if items exists
|
||||||
@ -723,6 +757,8 @@ namespace Kyoo.InternalAPI
|
|||||||
|
|
||||||
string query = "INSERT INTO genres (slug, name) VALUES($slug, $name);";
|
string query = "INSERT INTO genres (slug, name) VALUES($slug, $name);";
|
||||||
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
|
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
cmd.Parameters.AddWithValue("$slug", genre.Slug);
|
cmd.Parameters.AddWithValue("$slug", genre.Slug);
|
||||||
cmd.Parameters.AddWithValue("$name", genre.Name);
|
cmd.Parameters.AddWithValue("$name", genre.Name);
|
||||||
@ -731,6 +767,14 @@ namespace Kyoo.InternalAPI
|
|||||||
cmd.CommandText = "SELECT LAST_INSERT_ROWID()";
|
cmd.CommandText = "SELECT LAST_INSERT_ROWID()";
|
||||||
return (long)cmd.ExecuteScalar();
|
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)
|
||||||
@ -742,6 +786,8 @@ namespace Kyoo.InternalAPI
|
|||||||
|
|
||||||
string query = "INSERT INTO studios (slug, name) VALUES($slug, $name);";
|
string query = "INSERT INTO studios (slug, name) VALUES($slug, $name);";
|
||||||
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
|
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
cmd.Parameters.AddWithValue("$slug", studio.Slug);
|
cmd.Parameters.AddWithValue("$slug", studio.Slug);
|
||||||
cmd.Parameters.AddWithValue("$name", studio.Name);
|
cmd.Parameters.AddWithValue("$name", studio.Name);
|
||||||
@ -750,6 +796,14 @@ namespace Kyoo.InternalAPI
|
|||||||
cmd.CommandText = "SELECT LAST_INSERT_ROWID()";
|
cmd.CommandText = "SELECT LAST_INSERT_ROWID()";
|
||||||
return (long)cmd.ExecuteScalar();
|
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)
|
||||||
@ -761,6 +815,8 @@ namespace Kyoo.InternalAPI
|
|||||||
|
|
||||||
string query = "INSERT INTO people (slug, name, imgPrimary, externalIDs) VALUES($slug, $name, $imgPrimary, $externalIDs);";
|
string query = "INSERT INTO people (slug, name, imgPrimary, externalIDs) VALUES($slug, $name, $imgPrimary, $externalIDs);";
|
||||||
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
|
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
cmd.Parameters.AddWithValue("$slug", people.slug);
|
cmd.Parameters.AddWithValue("$slug", people.slug);
|
||||||
cmd.Parameters.AddWithValue("$name", people.Name);
|
cmd.Parameters.AddWithValue("$name", people.Name);
|
||||||
@ -771,6 +827,15 @@ namespace Kyoo.InternalAPI
|
|||||||
cmd.CommandText = "SELECT LAST_INSERT_ROWID()";
|
cmd.CommandText = "SELECT LAST_INSERT_ROWID()";
|
||||||
return (long)cmd.ExecuteScalar();
|
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
|
||||||
|
|
||||||
@ -780,6 +845,8 @@ namespace Kyoo.InternalAPI
|
|||||||
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
|
||||||
{
|
{
|
||||||
cmd.Parameters.AddWithValue("$slug", collection.Slug);
|
cmd.Parameters.AddWithValue("$slug", collection.Slug);
|
||||||
cmd.Parameters.AddWithValue("$name", collection.Name);
|
cmd.Parameters.AddWithValue("$name", collection.Name);
|
||||||
@ -790,6 +857,14 @@ namespace Kyoo.InternalAPI
|
|||||||
cmd.CommandText = "SELECT LAST_INSERT_ROWID()";
|
cmd.CommandText = "SELECT LAST_INSERT_ROWID()";
|
||||||
return (long)cmd.ExecuteScalar();
|
return (long)cmd.ExecuteScalar();
|
||||||
}
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
Console.Error.WriteLine("SQL error while trying to create a collection. Collection probably already registered.");
|
||||||
|
cmd.CommandText = "SELECT * FROM collections WHERE slug = $slug";
|
||||||
|
cmd.Parameters.AddWithValue("$slug", collection.Slug);
|
||||||
|
return (long)cmd.ExecuteScalar();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RegisterInLibrary(long showID, string libraryPath)
|
public void RegisterInLibrary(long showID, string libraryPath)
|
||||||
@ -808,6 +883,8 @@ namespace Kyoo.InternalAPI
|
|||||||
{
|
{
|
||||||
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);";
|
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))
|
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
cmd.Parameters.AddWithValue("$slug", show.Slug);
|
cmd.Parameters.AddWithValue("$slug", show.Slug);
|
||||||
cmd.Parameters.AddWithValue("$title", show.Title);
|
cmd.Parameters.AddWithValue("$title", show.Title);
|
||||||
@ -840,7 +917,7 @@ namespace Kyoo.InternalAPI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(show.studio != null)
|
if (show.studio != null)
|
||||||
{
|
{
|
||||||
cmd.CommandText = "INSERT INTO studiosLinks (studioID, showID) VALUES($studioID, $showID);";
|
cmd.CommandText = "INSERT INTO studiosLinks (studioID, showID) VALUES($studioID, $showID);";
|
||||||
long studioID = GetOrCreateStudio(show.studio);
|
long studioID = GetOrCreateStudio(show.studio);
|
||||||
@ -851,12 +928,20 @@ namespace Kyoo.InternalAPI
|
|||||||
|
|
||||||
return showID;
|
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)
|
||||||
{
|
{
|
||||||
string query = "INSERT INTO seasons (showID, seasonNumber, title, overview, year, imgPrimary, externalIDs) VALUES($showID, $seasonNumber, $title, $overview, $year, $imgPrimary, $externalIDs);";
|
string query = "INSERT INTO seasons (showID, seasonNumber, title, overview, year, imgPrimary, externalIDs) VALUES($showID, $seasonNumber, $title, $overview, $year, $imgPrimary, $externalIDs);";
|
||||||
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
|
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
cmd.Parameters.AddWithValue("$showID", season.ShowID);
|
cmd.Parameters.AddWithValue("$showID", season.ShowID);
|
||||||
cmd.Parameters.AddWithValue("$seasonNumber", season.seasonNumber);
|
cmd.Parameters.AddWithValue("$seasonNumber", season.seasonNumber);
|
||||||
@ -870,12 +955,23 @@ namespace Kyoo.InternalAPI
|
|||||||
cmd.CommandText = "SELECT LAST_INSERT_ROWID()";
|
cmd.CommandText = "SELECT LAST_INSERT_ROWID()";
|
||||||
return (long)cmd.ExecuteScalar();
|
return (long)cmd.ExecuteScalar();
|
||||||
}
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
Console.Error.WriteLine("SQL error while trying to insert a season ({0}), season probably already registered.", season.Title);
|
||||||
|
cmd.CommandText = "SELECT * FROM seasons WHERE showID = $showID AND seasonNumber = $seasonNumber";
|
||||||
|
cmd.Parameters.AddWithValue("$showID", season.ShowID);
|
||||||
|
cmd.Parameters.AddWithValue("$seasonNumber", season.seasonNumber);
|
||||||
|
return (long)cmd.ExecuteScalar();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public long RegisterEpisode(Episode episode)
|
public long RegisterEpisode(Episode episode)
|
||||||
{
|
{
|
||||||
string query = "INSERT INTO episodes (showID, seasonID, seasonNumber, episodeNumber, absoluteNumber, path, title, overview, releaseDate, runtime, imgPrimary, externalIDs) VALUES($showID, $seasonID, $seasonNumber, $episodeNumber, $absoluteNumber, $path, $title, $overview, $releaseDate, $runtime, $imgPrimary, $externalIDs);";
|
string query = "INSERT INTO episodes (showID, seasonID, seasonNumber, episodeNumber, absoluteNumber, path, title, overview, releaseDate, runtime, imgPrimary, externalIDs) VALUES($showID, $seasonID, $seasonNumber, $episodeNumber, $absoluteNumber, $path, $title, $overview, $releaseDate, $runtime, $imgPrimary, $externalIDs);";
|
||||||
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
|
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
cmd.Parameters.AddWithValue("$showID", episode.ShowID);
|
cmd.Parameters.AddWithValue("$showID", episode.ShowID);
|
||||||
cmd.Parameters.AddWithValue("$seasonID", episode.SeasonID);
|
cmd.Parameters.AddWithValue("$seasonID", episode.SeasonID);
|
||||||
@ -894,6 +990,16 @@ namespace Kyoo.InternalAPI
|
|||||||
cmd.CommandText = "SELECT LAST_INSERT_ROWID()";
|
cmd.CommandText = "SELECT LAST_INSERT_ROWID()";
|
||||||
return (long)cmd.ExecuteScalar();
|
return (long)cmd.ExecuteScalar();
|
||||||
}
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
Console.Error.WriteLine("SQL error while trying to insert an episode ({0}), episode probably already registered.", episode.Link);
|
||||||
|
cmd.CommandText = "SELECT * FROM episodes WHERE showID = $showID AND seasonNumber = $seasonNumber AND episodeNumber = $episodeNumber";
|
||||||
|
cmd.Parameters.AddWithValue("$showID", episode.ShowID);
|
||||||
|
cmd.Parameters.AddWithValue("$seasonNumber", episode.seasonNumber);
|
||||||
|
cmd.Parameters.AddWithValue("$episodeNumber", episode.episodeNumber);
|
||||||
|
return (long)cmd.ExecuteScalar();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void RegisterTrack(Track track)
|
public void RegisterTrack(Track track)
|
||||||
@ -946,6 +1052,44 @@ namespace Kyoo.InternalAPI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void RemoveShow(long showID)
|
||||||
|
{
|
||||||
|
string query = "DELETE FROM shows WHERE id = $showID;";
|
||||||
|
|
||||||
|
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
|
||||||
|
{
|
||||||
|
cmd.Parameters.AddWithValue("$showID", showID);
|
||||||
|
cmd.ExecuteNonQuery();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveSeason(long showID, long seasonID)
|
||||||
|
{
|
||||||
|
string query = "DELETE FROM seasons WHERE id = $seasonID;";
|
||||||
|
|
||||||
|
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
|
||||||
|
{
|
||||||
|
cmd.Parameters.AddWithValue("$seasonID", seasonID);
|
||||||
|
cmd.ExecuteNonQuery();
|
||||||
|
}
|
||||||
|
if (GetSeasons(showID).Count == 0)
|
||||||
|
RemoveShow(showID);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RemoveEpisode(Episode episode)
|
||||||
|
{
|
||||||
|
string query = "DELETE FROM episodes WHERE id = $episodeID;";
|
||||||
|
|
||||||
|
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
|
||||||
|
{
|
||||||
|
cmd.Parameters.AddWithValue("$episodeID", episode.id);
|
||||||
|
cmd.ExecuteNonQuery();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (GetEpisodes(episode.ShowID, episode.seasonNumber).Count == 0)
|
||||||
|
RemoveSeason(episode.ShowID, episode.SeasonID);
|
||||||
|
}
|
||||||
|
|
||||||
public void ClearSubtitles(long episodeID)
|
public void ClearSubtitles(long episodeID)
|
||||||
{
|
{
|
||||||
string query = "DELETE FROM tracks WHERE episodeID = $episodeID;";
|
string query = "DELETE FROM tracks WHERE episodeID = $episodeID;";
|
||||||
|
@ -253,7 +253,7 @@ namespace Kyoo.InternalAPI.MetadataProvider
|
|||||||
DateTime dateTime = DateTime.ParseExact((string)episode.firstAired, "yyyy-MM-dd", CultureInfo.InvariantCulture);
|
DateTime dateTime = DateTime.ParseExact((string)episode.firstAired, "yyyy-MM-dd", CultureInfo.InvariantCulture);
|
||||||
|
|
||||||
if (absoluteNumber == -1)
|
if (absoluteNumber == -1)
|
||||||
absoluteNumber = episode.absoluteNumber as long? ?? -1;
|
absoluteNumber = (long?)episode.absoluteNumber ?? -1;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
seasonNumber = episode.airedSeason;
|
seasonNumber = episode.airedSeason;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
using Kyoo.Models;
|
using Kyoo.Models;
|
||||||
using Kyoo.Models.Watch;
|
using Kyoo.Models.Watch;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Kyoo.InternalAPI
|
namespace Kyoo.InternalAPI
|
||||||
{
|
{
|
||||||
@ -12,6 +13,6 @@ namespace Kyoo.InternalAPI
|
|||||||
string Transcode(string path);
|
string Transcode(string path);
|
||||||
|
|
||||||
//Extract all subtitles of a video and save them in the subtitles sub-folder.
|
//Extract all subtitles of a video and save them in the subtitles sub-folder.
|
||||||
Track[] ExtractSubtitles(string path);
|
Task<Track[]> ExtractSubtitles(string path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,13 +20,15 @@ namespace Kyoo.InternalAPI
|
|||||||
Debug.WriteLine("&Api INIT (unmanaged stream size): " + TranscoderAPI.Init() + ", Stream size: " + Marshal.SizeOf<Models.Watch.Stream>());
|
Debug.WriteLine("&Api INIT (unmanaged stream size): " + TranscoderAPI.Init() + ", Stream size: " + Marshal.SizeOf<Models.Watch.Stream>());
|
||||||
}
|
}
|
||||||
|
|
||||||
public Track[] ExtractSubtitles(string path)
|
public async Task<Track[]> ExtractSubtitles(string path)
|
||||||
{
|
{
|
||||||
string output = Path.Combine(Path.GetDirectoryName(path), "Subtitles");
|
string output = Path.Combine(Path.GetDirectoryName(path), "Subtitles");
|
||||||
Directory.CreateDirectory(output);
|
Directory.CreateDirectory(output);
|
||||||
|
return await Task.Run(() =>
|
||||||
|
{
|
||||||
TranscoderAPI.ExtractSubtitles(path, output, out Track[] tracks);
|
TranscoderAPI.ExtractSubtitles(path, output, out Track[] tracks);
|
||||||
|
|
||||||
return tracks;
|
return tracks;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void GetVideo(string path)
|
public void GetVideo(string path)
|
||||||
|
@ -1,11 +1,6 @@
|
|||||||
using Kyoo.InternalAPI;
|
using Kyoo.InternalAPI;
|
||||||
using Kyoo.Models;
|
|
||||||
using Microsoft.Extensions.Configuration;
|
using Microsoft.Extensions.Configuration;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
|
|
||||||
namespace UnitTests.Kyoo_InternalAPI
|
namespace UnitTests.Kyoo_InternalAPI
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user