From 7e13e2c5c555895e4fa5166496a2d6d1f0a7ee1d Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Sun, 29 Dec 2019 05:57:18 +0100 Subject: [PATCH] Making transcoder/transmuxer not throw when there was no read/write permissions given --- Kyoo/InternalAPI/Transcoder/Transcoder.cs | 37 +++++++++++++++----- Kyoo/InternalAPI/Transcoder/TranscoderAPI.cs | 17 +++++---- Kyoo/Models/Track.cs | 37 ++++++++++++++++---- 3 files changed, 68 insertions(+), 23 deletions(-) diff --git a/Kyoo/InternalAPI/Transcoder/Transcoder.cs b/Kyoo/InternalAPI/Transcoder/Transcoder.cs index 42a634d7..cae60986 100644 --- a/Kyoo/InternalAPI/Transcoder/Transcoder.cs +++ b/Kyoo/InternalAPI/Transcoder/Transcoder.cs @@ -1,3 +1,4 @@ +using System; using Kyoo.Models; using Kyoo.InternalAPI.TranscoderLink; using Microsoft.Extensions.Configuration; @@ -5,6 +6,7 @@ using System.Diagnostics; using System.IO; using System.Runtime.InteropServices; using System.Threading.Tasks; +#pragma warning disable 4014 namespace Kyoo.InternalAPI { @@ -18,7 +20,7 @@ namespace Kyoo.InternalAPI transmuxPath = config.GetValue("transmuxTempPath"); transcodePath = config.GetValue("transcodeTempPath"); - Debug.WriteLine("&Api INIT (unmanaged stream size): " + TranscoderAPI.init() + ", Stream size: " + Marshal.SizeOf()); + Console.WriteLine("&Api INIT (unmanaged stream size): " + TranscoderAPI.init() + ", Stream size: " + Marshal.SizeOf()); } public async Task GetTrackInfo(string path) @@ -48,11 +50,19 @@ namespace Kyoo.InternalAPI float playableDuration = 0; bool transmuxFailed = false; - Directory.CreateDirectory(folder); - Debug.WriteLine("&Transmuxing " + episode.Link + " at " + episode.Path + ", outputPath: " + folder); + try + { + Directory.CreateDirectory(folder); + Debug.WriteLine("&Transmuxing " + episode.Link + " at " + episode.Path + ", outputPath: " + folder); - if (File.Exists(manifest)) - return manifest; + if (File.Exists(manifest)) + return manifest; + } + catch (UnauthorizedAccessException) + { + Console.Error.WriteLine($"Access to the path {manifest} is denied. Please change your transmux path in the config."); + return null; + } Task.Run(() => { transmuxFailed = TranscoderAPI.transmux(episode.Path, manifest.Replace('\\', '/'), out playableDuration) != 0; @@ -69,11 +79,20 @@ namespace Kyoo.InternalAPI float playableDuration = 0; bool transmuxFailed = false; - Directory.CreateDirectory(folder); - Debug.WriteLine("&Transcoding " + episode.Link + " at " + episode.Path + ", outputPath: " + folder); + try + { + Directory.CreateDirectory(folder); + Debug.WriteLine("&Transcoding " + episode.Link + " at " + episode.Path + ", outputPath: " + folder); + + if (File.Exists(manifest)) + return manifest; + } + catch (UnauthorizedAccessException) + { + Console.Error.WriteLine($"Access to the path {manifest} is denied. Please change your transmux path in the config."); + return null; + } - if (File.Exists(manifest)) - return manifest; Task.Run(() => { transmuxFailed = TranscoderAPI.transcode(episode.Path, manifest.Replace('\\', '/'), out playableDuration) != 0; diff --git a/Kyoo/InternalAPI/Transcoder/TranscoderAPI.cs b/Kyoo/InternalAPI/Transcoder/TranscoderAPI.cs index e3c46e89..e2a66594 100644 --- a/Kyoo/InternalAPI/Transcoder/TranscoderAPI.cs +++ b/Kyoo/InternalAPI/Transcoder/TranscoderAPI.cs @@ -27,7 +27,10 @@ namespace Kyoo.InternalAPI.TranscoderLink private static extern IntPtr extract_subtitles(string path, string out_path, out int array_length, out int track_count); [DllImport(TranscoderPath, CallingConvention = CallingConvention.Cdecl)] - private static extern void free_streams(IntPtr stream_ptr); + private static extern void free_streams(IntPtr stream_ptr); + + [DllImport(TranscoderPath, CallingConvention = CallingConvention.Cdecl)] + private static extern void free(IntPtr ptr); public static void GetTrackInfo(string path, out Track[] tracks) @@ -46,7 +49,7 @@ namespace Kyoo.InternalAPI.TranscoderLink Stream stream = Marshal.PtrToStructure(streamsPtr); if (stream.Type != StreamType.Unknow) { - tracks[j] = (Track)stream; + tracks[j] = new Track(stream); j++; } streamsPtr += size; @@ -55,8 +58,8 @@ namespace Kyoo.InternalAPI.TranscoderLink else tracks = null; - free_streams(ptr); - Debug.WriteLine("&" + tracks?.Length + " tracks got at: " + path); + free(ptr); + Console.WriteLine("&" + tracks?.Length + " tracks got at: " + path); } public static void ExtractSubtitles(string path, string outPath, out Track[] tracks) @@ -75,7 +78,7 @@ namespace Kyoo.InternalAPI.TranscoderLink Stream stream = Marshal.PtrToStructure(streamsPtr); if (stream.Type != StreamType.Unknow) { - tracks[j] = (Track)stream; + tracks[j] = new Track(stream); j++; } streamsPtr += size; @@ -84,8 +87,8 @@ namespace Kyoo.InternalAPI.TranscoderLink else tracks = null; - free_streams(ptr); - Debug.WriteLine("&" + tracks?.Length + " tracks got at: " + path); + free(ptr); + Console.WriteLine("&" + tracks?.Length + " tracks got at: " + path); } } } diff --git a/Kyoo/Models/Track.cs b/Kyoo/Models/Track.cs index 6ce86220..54f26ee0 100644 --- a/Kyoo/Models/Track.cs +++ b/Kyoo/Models/Track.cs @@ -27,6 +27,29 @@ namespace Kyoo.Models [MarshalAs(UnmanagedType.I1)] public bool IsForced; [JsonIgnore] public string Path; [JsonIgnore] public StreamType Type; + + public Stream() {} + + public Stream(string title, string language, string codec, bool isDefault, bool isForced, string path, StreamType type) + { + Title = title; + Language = language; + Codec = codec; + IsDefault = isDefault; + IsForced = isForced; + Path = path; + Type = type; + } + + public Stream(Stream stream) + { + Title = stream.Title; + Language = stream.Language; + IsDefault = stream.IsDefault; + IsForced = stream.IsForced; + Codec = stream.Codec; + Type = stream.Type; + } } } @@ -39,15 +62,15 @@ namespace Kyoo.Models [JsonIgnore] public bool IsExternal; public Track(StreamType type, string title, string language, bool isDefault, bool isForced, string codec, bool isExternal, string path) + : base(title, language, codec, isDefault, isForced, path, type) { - this.Type = type; - Title = title; - Language = language; - IsDefault = isDefault; - IsForced = isForced; - Codec = codec; IsExternal = isExternal; - Path = path; + } + + public Track(Stream stream) + : base(stream) + { + IsExternal = false; } public static Track FromReader(System.Data.SQLite.SQLiteDataReader reader)