Solving bugs and adding library support.

This commit is contained in:
Zoe Roux 2019-10-20 23:17:33 +02:00
parent 8c7bdcebc6
commit f3d207cb4e
8 changed files with 285 additions and 122 deletions

View File

@ -49,12 +49,12 @@ namespace Kyoo.Controllers
}
[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);
libraryManager.ClearSubtitles(episode.id);
Track[] tracks = transcoder.ExtractSubtitles(episode.Path);
Track[] tracks = await transcoder.ExtractSubtitles(episode.Path);
foreach (Track track in tracks)
{
track.episodeID = episode.id;
@ -65,14 +65,14 @@ namespace Kyoo.Controllers
}
[HttpGet("extract/{showSlug}")]
public string ExtractSubtitle(string showSlug)
public async Task<string> ExtractSubtitle(string showSlug)
{
List<Episode> episodes = libraryManager.GetEpisodes(showSlug);
foreach (Episode episode in episodes)
{
libraryManager.ClearSubtitles(episode.id);
Track[] tracks = transcoder.ExtractSubtitles(episode.Path);
Track[] tracks = await transcoder.ExtractSubtitles(episode.Path);
foreach (Track track in tracks)
{
track.episodeID = episode.id;

View File

@ -14,6 +14,7 @@ namespace Kyoo.InternalAPI
{
public class Crawler : ICrawler
{
private static ICrawler runningCrawler;
private readonly CancellationTokenSource cancellation;
private readonly ILibraryManager libraryManager;
@ -33,15 +34,27 @@ namespace Kyoo.InternalAPI
public Task Start(bool watch)
{
return StartAsync(watch, cancellation.Token);
if (runningCrawler == null)
{
runningCrawler = this;
return StartAsync(watch, cancellation.Token);
}
return null;
}
private Task StartAsync(bool watch, CancellationToken cancellationToken)
{
Debug.WriteLine("&Crawler started");
IEnumerable<string> paths = libraryManager.GetLibrariesPath();
IEnumerable<Episode> episodes = libraryManager.GetAllEpisodes();
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);
@ -50,8 +63,8 @@ namespace Kyoo.InternalAPI
}
while (!cancellationToken.IsCancellationRequested);
Debug.WriteLine("&Crawler stopped");
runningCrawler = null;
return null;
}
@ -65,7 +78,10 @@ namespace Kyoo.InternalAPI
return;
if (IsVideo(file))
{
Debug.WriteLine("&Registering episode at: " + file);
await ExtractEpisodeData(file, folderPath);
}
}
}
@ -157,7 +173,8 @@ namespace Kyoo.InternalAPI
}
Show show = await RegisterOrGetShow(collectionName, showName, showPath, libraryPath);
await RegisterEpisode(show, seasonNumber, episodeNumber, absoluteNumber, episodePath);
if (show != null)
await RegisterEpisode(show, seasonNumber, episodeNumber, absoluteNumber, episodePath);
}
}
@ -171,8 +188,11 @@ namespace Kyoo.InternalAPI
showProviderIDs = show.ExternalIDs;
showID = libraryManager.RegisterShow(show);
if (showID == -1)
return null;
libraryManager.RegisterInLibrary(showID, libraryPath);
if (collectionName != null)
if (collectionName != null && collectionName.Length > 0)
{
if (!libraryManager.IsCollectionRegistered(Slugifier.ToSlug(collectionName), out long collectionID))
{
@ -224,7 +244,7 @@ namespace Kyoo.InternalAPI
{
if (!FindExtractedSubtitles(episode))
{
Track[] tracks = transcoder.ExtractSubtitles(episode.Path);
Track[] tracks = await transcoder.ExtractSubtitles(episode.Path);
if (tracks != null)
{
foreach (Track track in tracks)
@ -282,7 +302,6 @@ namespace Kyoo.InternalAPI
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 bool IsVideo(string filePath)

View File

@ -37,6 +37,7 @@ namespace Kyoo.InternalAPI
Genre GetGenreBySlug(string slug);
Studio GetStudioBySlug(string slug);
Collection GetCollection(string slug);
IEnumerable<Episode> GetAllEpisodes();
//Check if value exists
bool IsCollectionRegistered(string collectionSlug);
@ -61,6 +62,7 @@ namespace Kyoo.InternalAPI
void AddShowToCollection(long showID, long collectionID);
void RegisterInLibrary(long showID, string libraryPath);
void RemoveEpisode(Episode episode);
void ClearSubtitles(long episodeID);
}
}

View File

@ -52,7 +52,7 @@ namespace Kyoo.InternalAPI
imgPrimary TEXT,
year INTEGER,
externalIDs TEXT,
FOREIGN KEY(showID) REFERENCES shows(id)
FOREIGN KEY(showID) REFERENCES shows(id) ON DELETE CASCADE
);
CREATE TABLE episodes(
id INTEGER PRIMARY KEY UNIQUE,
@ -61,15 +61,15 @@ namespace Kyoo.InternalAPI
seasonNumber INTEGER,
episodeNumber INTEGER,
absoluteNumber INTEGER,
path TEXT,
path TEXT UNIQUE,
title TEXT,
overview TEXT,
imgPrimary TEXT,
releaseDate TEXT,
runtime INTEGER,
externalIDs TEXT,
FOREIGN KEY(showID) REFERENCES shows(id),
FOREIGN KEY(seasonID) REFERENCES seasons(id)
FOREIGN KEY(showID) REFERENCES shows(id) ON DELETE CASCADE,
FOREIGN KEY(seasonID) REFERENCES seasons(id) ON DELETE CASCADE
);
CREATE TABLE tracks(
id INTEGER PRIMARY KEY UNIQUE,
@ -82,7 +82,7 @@ namespace Kyoo.InternalAPI
isForced BOOLEAN,
isExternal BOOLEAN,
path TEXT,
FOREIGN KEY(episodeID) REFERENCES episodes(id)
FOREIGN KEY(episodeID) REFERENCES episodes(id) ON DELETE CASCADE
);
CREATE TABLE libraries(
@ -94,8 +94,8 @@ namespace Kyoo.InternalAPI
CREATE TABLE librariesLinks(
libraryID INTEGER,
showID INTEGER,
FOREIGN KEY(libraryID) REFERENCES libraries(id),
FOREIGN KEY(showID) REFERENCES shows(id)
FOREIGN KEY(libraryID) REFERENCES libraries(id) ON DELETE CASCADE,
FOREIGN KEY(showID) REFERENCES shows(id) ON DELETE CASCADE
);
CREATE TABLE collections(
@ -103,15 +103,15 @@ namespace Kyoo.InternalAPI
slug TEXT UNIQUE,
name TEXT,
overview TEXT,
starYear INTEGER,
startYear INTEGER,
endYear INTEGER,
imgPrimary TEXT
);
CREATE TABLE collectionsLinks(
collectionID INTEGER,
showID INTEGER,
FOREIGN KEY(collectionID) REFERENCES collections(id),
FOREIGN KEY(showID) REFERENCES shows(id)
FOREIGN KEY(collectionID) REFERENCES collections(id) ON DELETE CASCADE,
FOREIGN KEY(showID) REFERENCES shows(id) ON DELETE CASCADE
);
CREATE TABLE studios(
@ -122,8 +122,8 @@ namespace Kyoo.InternalAPI
CREATE TABLE studiosLinks(
studioID INTEGER,
showID INTEGER,
FOREIGN KEY(studioID) REFERENCES studios(id),
FOREIGN KEY(showID) REFERENCES shows(id)
FOREIGN KEY(studioID) REFERENCES studios(id) ON DELETE CASCADE,
FOREIGN KEY(showID) REFERENCES shows(id) ON DELETE CASCADE
);
CREATE TABLE people(
@ -138,8 +138,8 @@ namespace Kyoo.InternalAPI
showID INTEGER,
role TEXT,
type TEXT,
FOREIGN KEY(peopleID) REFERENCES people(id),
FOREIGN KEY(showID) REFERENCES shows(id)
FOREIGN KEY(peopleID) REFERENCES people(id) ON DELETE CASCADE,
FOREIGN KEY(showID) REFERENCES shows(id) ON DELETE CASCADE
);
CREATE TABLE genres(
@ -150,8 +150,8 @@ namespace Kyoo.InternalAPI
CREATE TABLE genresLinks(
genreID INTEGER,
showID INTEGER,
FOREIGN KEY(genreID) REFERENCES genres(id),
FOREIGN KEY(showID) REFERENCES shows(id)
FOREIGN KEY(genreID) REFERENCES genres(id) ON DELETE CASCADE,
FOREIGN KEY(showID) REFERENCES shows(id) ON DELETE CASCADE
);";
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)
{
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;
}
}
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
#region Check if items exists
@ -724,12 +758,22 @@ namespace Kyoo.InternalAPI
string query = "INSERT INTO genres (slug, name) VALUES($slug, $name);";
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
{
cmd.Parameters.AddWithValue("$slug", genre.Slug);
cmd.Parameters.AddWithValue("$name", genre.Name);
cmd.ExecuteNonQuery();
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();
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();
}
}
}
@ -743,12 +787,22 @@ namespace Kyoo.InternalAPI
string query = "INSERT INTO studios (slug, name) VALUES($slug, $name);";
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
{
cmd.Parameters.AddWithValue("$slug", studio.Slug);
cmd.Parameters.AddWithValue("$name", studio.Name);
cmd.ExecuteNonQuery();
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();
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();
}
}
}
@ -762,14 +816,25 @@ namespace Kyoo.InternalAPI
string query = "INSERT INTO people (slug, name, imgPrimary, externalIDs) VALUES($slug, $name, $imgPrimary, $externalIDs);";
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
{
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();
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();
}
cmd.CommandText = "SELECT LAST_INSERT_ROWID()";
return (long)cmd.ExecuteScalar();
}
}
#endregion
@ -781,14 +846,24 @@ namespace Kyoo.InternalAPI
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
{
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();
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();
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();
}
}
}
@ -809,47 +884,55 @@ 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);";
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
{
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)
try
{
cmd.CommandText = "INSERT INTO genresLinks (genreID, showID) VALUES($genreID, $showID);";
foreach (Genre genre in show.Genres)
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)
{
long genreID = GetOrCreateGenre(genre);
cmd.Parameters.AddWithValue("$genreID", genreID);
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();
}
}
if(show.studio != null)
return showID;
}
catch
{
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();
Console.Error.WriteLine("SQL error while trying to insert a show ({0}), show probably already registered.", show.Title);
return -1;
}
return showID;
}
}
@ -858,17 +941,28 @@ namespace Kyoo.InternalAPI
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))
{
cmd.Parameters.AddWithValue("$showID", season.ShowID);
cmd.Parameters.AddWithValue("$seasonNumber", season.seasonNumber);
cmd.Parameters.AddWithValue("$title", season.Title);
cmd.Parameters.AddWithValue("$overview", season.Overview);
cmd.Parameters.AddWithValue("$year", season.year);
cmd.Parameters.AddWithValue("$imgPrimary", season.ImgPrimary);
cmd.Parameters.AddWithValue("$externalIDs", season.ExternalIDs);
cmd.ExecuteNonQuery();
try
{
cmd.Parameters.AddWithValue("$showID", season.ShowID);
cmd.Parameters.AddWithValue("$seasonNumber", season.seasonNumber);
cmd.Parameters.AddWithValue("$title", season.Title);
cmd.Parameters.AddWithValue("$overview", season.Overview);
cmd.Parameters.AddWithValue("$year", season.year);
cmd.Parameters.AddWithValue("$imgPrimary", season.ImgPrimary);
cmd.Parameters.AddWithValue("$externalIDs", season.ExternalIDs);
cmd.ExecuteNonQuery();
cmd.CommandText = "SELECT LAST_INSERT_ROWID()";
return (long)cmd.ExecuteScalar();
cmd.CommandText = "SELECT LAST_INSERT_ROWID()";
return (long)cmd.ExecuteScalar();
}
catch
{
Console.Error.WriteLine("SQL error while trying to insert a season ({0}), season probably already registered.", season.Title);
cmd.CommandText = "SELECT * FROM seasons WHERE showID = $showID AND seasonNumber = $seasonNumber";
cmd.Parameters.AddWithValue("$showID", season.ShowID);
cmd.Parameters.AddWithValue("$seasonNumber", season.seasonNumber);
return (long)cmd.ExecuteScalar();
}
}
}
@ -877,22 +971,34 @@ namespace Kyoo.InternalAPI
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))
{
cmd.Parameters.AddWithValue("$showID", episode.ShowID);
cmd.Parameters.AddWithValue("$seasonID", episode.SeasonID);
cmd.Parameters.AddWithValue("$seasonNUmber", episode.seasonNumber);
cmd.Parameters.AddWithValue("$episodeNumber", episode.episodeNumber);
cmd.Parameters.AddWithValue("$absoluteNumber", episode.absoluteNumber);
cmd.Parameters.AddWithValue("$path", episode.Path);
cmd.Parameters.AddWithValue("$title", episode.Title);
cmd.Parameters.AddWithValue("$overview", episode.Overview);
cmd.Parameters.AddWithValue("$releaseDate", episode.ReleaseDate);
cmd.Parameters.AddWithValue("$runtime", episode.Runtime);
cmd.Parameters.AddWithValue("$imgPrimary", episode.ImgPrimary);
cmd.Parameters.AddWithValue("$externalIDs", episode.ExternalIDs);
cmd.ExecuteNonQuery();
try
{
cmd.Parameters.AddWithValue("$showID", episode.ShowID);
cmd.Parameters.AddWithValue("$seasonID", episode.SeasonID);
cmd.Parameters.AddWithValue("$seasonNUmber", episode.seasonNumber);
cmd.Parameters.AddWithValue("$episodeNumber", episode.episodeNumber);
cmd.Parameters.AddWithValue("$absoluteNumber", episode.absoluteNumber);
cmd.Parameters.AddWithValue("$path", episode.Path);
cmd.Parameters.AddWithValue("$title", episode.Title);
cmd.Parameters.AddWithValue("$overview", episode.Overview);
cmd.Parameters.AddWithValue("$releaseDate", episode.ReleaseDate);
cmd.Parameters.AddWithValue("$runtime", episode.Runtime);
cmd.Parameters.AddWithValue("$imgPrimary", episode.ImgPrimary);
cmd.Parameters.AddWithValue("$externalIDs", episode.ExternalIDs);
cmd.ExecuteNonQuery();
cmd.CommandText = "SELECT LAST_INSERT_ROWID()";
return (long)cmd.ExecuteScalar();
cmd.CommandText = "SELECT LAST_INSERT_ROWID()";
return (long)cmd.ExecuteScalar();
}
catch
{
Console.Error.WriteLine("SQL error while trying to insert an episode ({0}), episode probably already registered.", episode.Link);
cmd.CommandText = "SELECT * FROM episodes WHERE showID = $showID AND seasonNumber = $seasonNumber AND episodeNumber = $episodeNumber";
cmd.Parameters.AddWithValue("$showID", episode.ShowID);
cmd.Parameters.AddWithValue("$seasonNumber", episode.seasonNumber);
cmd.Parameters.AddWithValue("$episodeNumber", episode.episodeNumber);
return (long)cmd.ExecuteScalar();
}
}
}
@ -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)
{
string query = "DELETE FROM tracks WHERE episodeID = $episodeID;";

View File

@ -253,7 +253,7 @@ namespace Kyoo.InternalAPI.MetadataProvider
DateTime dateTime = DateTime.ParseExact((string)episode.firstAired, "yyyy-MM-dd", CultureInfo.InvariantCulture);
if (absoluteNumber == -1)
absoluteNumber = episode.absoluteNumber as long? ?? -1;
absoluteNumber = (long?)episode.absoluteNumber ?? -1;
else
{
seasonNumber = episode.airedSeason;

View File

@ -1,5 +1,6 @@
using Kyoo.Models;
using Kyoo.Models.Watch;
using System.Threading.Tasks;
namespace Kyoo.InternalAPI
{
@ -12,6 +13,6 @@ namespace Kyoo.InternalAPI
string Transcode(string path);
//Extract all subtitles of a video and save them in the subtitles sub-folder.
Track[] ExtractSubtitles(string path);
Task<Track[]> ExtractSubtitles(string path);
}
}

View File

@ -20,13 +20,15 @@ namespace Kyoo.InternalAPI
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");
Directory.CreateDirectory(output);
TranscoderAPI.ExtractSubtitles(path, output, out Track[] tracks);
return tracks;
return await Task.Run(() =>
{
TranscoderAPI.ExtractSubtitles(path, output, out Track[] tracks);
return tracks;
});
}
public void GetVideo(string path)

View File

@ -1,11 +1,6 @@
using Kyoo.InternalAPI;
using Kyoo.Models;
using Microsoft.Extensions.Configuration;
using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace UnitTests.Kyoo_InternalAPI
{