Adding metadata to the stream object and getting back data from c++ to the managed code.

This commit is contained in:
Zoe Roux
2019-09-16 03:25:03 +02:00
parent 5459e3cde6
commit 2835f75c69
12 changed files with 144 additions and 97 deletions
+9 -3
View File
@@ -8,7 +8,6 @@ using System.Linq;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using Stream = Kyoo.Models.Watch.Stream;
namespace Kyoo.InternalAPI
{
@@ -145,8 +144,15 @@ namespace Kyoo.InternalAPI
episode.SeasonID = seasonID;
long episodeID = libraryManager.RegisterEpisode(episode);
Stream[] streams = transcoder.ExtractSubtitles(episode.Path);
//libraryManager.RegisterStreams(episodeID, streams);
if (episode.Path.EndsWith(".mkv"))
{
Track[] tracks = transcoder.ExtractSubtitles(episode.Path);
foreach (Track track in tracks)
{
track.episodeID = episodeID;
libraryManager.RegisterTrack(track);
}
}
}
}
@@ -17,8 +17,8 @@ namespace Kyoo.InternalAPI
int GetSeasonCount(string showSlug, long seasonNumber);
//Internal HTML read
(List<Stream> audios, List<Stream> subtitles) GetStreams(long episodeID);
Stream GetSubtitle(string showSlug, long seasonNumber, long episodeNumber, string languageTag);
(List<Track> audios, List<Track> subtitles) GetStreams(long episodeID);
Track GetSubtitle(string showSlug, long seasonNumber, long episodeNumber, string languageTag);
//Public read
IEnumerable<Library> GetLibraries();
@@ -42,6 +42,7 @@ namespace Kyoo.InternalAPI
long RegisterShow(Show show);
long RegisterSeason(Season season);
long RegisterEpisode(Episode episode);
void RegisterTrack(Track track);
long GetOrCreateGenre(Genre genre);
long GetOrCreateStudio(Studio studio);
@@ -70,11 +70,11 @@ namespace Kyoo.InternalAPI
FOREIGN KEY(showID) REFERENCES shows(id),
FOREIGN KEY(seasonID) REFERENCES seasons(id)
);
CREATE TABLE streams(
CREATE TABLE tracks(
id INTEGER PRIMARY KEY UNIQUE,
episodeID INTEGER,
streamType TEXT,
tile TEXT,
title TEXT,
language TEXT,
codec TEXT,
isDefault BOOLEAN,
@@ -189,35 +189,35 @@ namespace Kyoo.InternalAPI
}
public (List<Stream> audios, List<Stream> subtitles) GetStreams(long episodeID)
public (List<Track> audios, List<Track> subtitles) GetStreams(long episodeID)
{
string query = "SELECT * FROM streams WHERE episodeID = $episodeID;";
string query = "SELECT * FROM tracks WHERE episodeID = $episodeID;";
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
{
cmd.Parameters.AddWithValue("$episodeID", episodeID);
SQLiteDataReader reader = cmd.ExecuteReader();
List<Stream> audios = new List<Stream>();
List<Stream> subtitles = new List<Stream>();
List<Track> audios = new List<Track>();
List<Track> subtitles = new List<Track>();
while (reader.Read())
{
Stream stream = Stream.FromReader(reader);
Track stream = Track.FromReader(reader);
//if (stream.type == StreamType.Audio)
// audios.Add(stream);
//else if (stream.type == StreamType.Subtitle)
// subtitles.Add(stream);
if (stream.type == StreamType.Audio)
audios.Add(stream);
else if (stream.type == StreamType.Subtitle)
subtitles.Add(stream);
}
return (audios, subtitles);
}
}
public Stream GetSubtitle(string showSlug, long seasonNumber, long episodeNumber, string languageTag)
public Track GetSubtitle(string showSlug, long seasonNumber, long episodeNumber, string languageTag)
{
string query = "SELECT streams.* FROM streams JOIN episodes ON streams.episodeID = episodes.id JOIN shows ON episodes.showID = shows.id WHERE shows.showSlug = $showSlug AND episodes.seasonNumber = $seasonNumber AND episodes.episodeNumber = $episodeNumber AND streams.language = $languageTag;";
string query = "SELECT tracks.* FROM tracks JOIN episodes ON tracks.episodeID = episodes.id JOIN shows ON episodes.showID = shows.id WHERE shows.showSlug = $showSlug AND episodes.seasonNumber = $seasonNumber AND episodes.episodeNumber = $episodeNumber AND tracks.language = $languageTag;";
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
{
@@ -228,7 +228,7 @@ namespace Kyoo.InternalAPI
SQLiteDataReader reader = cmd.ExecuteReader();
if (reader.Read())
return Stream.FromReader(reader);
return Track.FromReader(reader);
return null;
}
@@ -685,6 +685,24 @@ namespace Kyoo.InternalAPI
}
}
public void RegisterTrack(Track track)
{
string query = "INSERT INTO tracks (episodeID, streamType, title, language, codec, isDefault, isForced, isExternal, path) VALUES($episodeID, $streamType, $title, $language, $codec, $isDefault, $isForced, $isExternal, $path);";
using (SQLiteCommand cmd = new SQLiteCommand(query, sqlConnection))
{
cmd.Parameters.AddWithValue("$episodeID", track.episodeID);
cmd.Parameters.AddWithValue("$streamType", track.type);
cmd.Parameters.AddWithValue("$title", track.Title);
cmd.Parameters.AddWithValue("$language", track.Language);
cmd.Parameters.AddWithValue("$codec", track.Codec);
cmd.Parameters.AddWithValue("$isDefault", track.IsDefault);
cmd.Parameters.AddWithValue("$isForced", track.IsForced);
cmd.Parameters.AddWithValue("$isExternal", track.IsDefault);
cmd.Parameters.AddWithValue("$path", track.Path);
cmd.ExecuteNonQuery();
}
}
public void RegisterShowPeople(long showID, List<People> people)
{
string query = "INSERT INTO people (slug, name, imgPrimary, externalIDs) VALUES($slug, $name, $imgPrimary, $externalIDs);";
+2 -1
View File
@@ -1,3 +1,4 @@
using Kyoo.Models;
using Kyoo.Models.Watch;
namespace Kyoo.InternalAPI
@@ -11,6 +12,6 @@ namespace Kyoo.InternalAPI
string Transcode(string path);
//Extract all subtitles of a video and save them in the subtitles sub-folder.
Stream[] ExtractSubtitles(string path);
Track[] ExtractSubtitles(string path);
}
}
+4 -4
View File
@@ -1,8 +1,8 @@
using Kyoo.InternalAPI.TranscoderLink;
using Kyoo.Models;
using Microsoft.Extensions.Configuration;
using System.Diagnostics;
using System.IO;
using Stream = Kyoo.Models.Watch.Stream;
namespace Kyoo.InternalAPI
{
@@ -13,13 +13,13 @@ namespace Kyoo.InternalAPI
Debug.WriteLine("&Api INIT: " + TranscoderAPI.Init());
}
public Stream[] ExtractSubtitles(string path)
public Track[] ExtractSubtitles(string path)
{
string output = Path.Combine(Path.GetDirectoryName(path), "Subtitles");
Directory.CreateDirectory(output);
TranscoderAPI.ExtractSubtitles(path, output, out Stream[] streams);
TranscoderAPI.ExtractSubtitles(path, output, out Track[] tracks);
return streams;
return tracks;
}
public void GetVideo(string path)
+6 -4
View File
@@ -1,5 +1,6 @@
using System;
using System.Runtime.InteropServices;
using Kyoo.Models;
using Kyoo.Models.Watch;
namespace Kyoo.InternalAPI.TranscoderLink
@@ -14,23 +15,24 @@ namespace Kyoo.InternalAPI.TranscoderLink
[DllImport(TranscoderPath, CallingConvention = CallingConvention.Cdecl)]
private extern static IntPtr ExtractSubtitles(string path, string outPath, out int streams);
public static void ExtractSubtitles(string path, string outPath, out Stream[] streams)
public static void ExtractSubtitles(string path, string outPath, out Track[] tracks)
{
int size = Marshal.SizeOf<Stream>();
IntPtr streamsPtr = ExtractSubtitles(path, outPath, out int length);
if (length > 0)
{
streams = new Stream[length];
tracks = new Track[length];
for (int i = 0; i < length; i++)
{
streams[i] = Marshal.PtrToStructure<Stream>(streamsPtr);
tracks[i] = (Track)Marshal.PtrToStructure<Stream>(streamsPtr);
tracks[i].type = StreamType.Subtitle;
streamsPtr += size;
}
}
else
streams = null;
tracks = null;
}
}
}