From 81da4967f5c6e21edbce9ab44c2eb0a8ddd9c1ae Mon Sep 17 00:00:00 2001 From: Michael Nolan Date: Sat, 25 Sep 2021 17:30:16 -0500 Subject: [PATCH] refactor Program.cs, add file download support --- .vs/youtube-downloader/xs/UserPrefs.xml | 23 +- Program.cs | 482 ++++++++------- Server/Functions/Downloader.cs | 577 ++++++++++++------ Server/Models/InfoType.cs | 6 +- Server/Models/InfomationQueueItem.cs | 40 ++ Server/Models/SavedVideo.cs | 22 +- bin/Release/youtube-downloader.exe | Bin 47104 -> 52224 bytes ...e-downloader.csprojAssemblyReference.cache | Bin 424 -> 90159 bytes obj/x86/Release/youtube-downloader.exe | Bin 47104 -> 52224 bytes 9 files changed, 732 insertions(+), 418 deletions(-) diff --git a/.vs/youtube-downloader/xs/UserPrefs.xml b/.vs/youtube-downloader/xs/UserPrefs.xml index 71545d3..4330388 100644 --- a/.vs/youtube-downloader/xs/UserPrefs.xml +++ b/.vs/youtube-downloader/xs/UserPrefs.xml @@ -1,28 +1,27 @@  - + - - + + - + + + + - - - - - - + + @@ -33,9 +32,7 @@ - - - + \ No newline at end of file diff --git a/Program.cs b/Program.cs index a11742d..1a60151 100644 --- a/Program.cs +++ b/Program.cs @@ -20,7 +20,7 @@ namespace youtube_downloader class Program { - + static string webSitePath; static void Main(string[] arg) { @@ -36,205 +36,59 @@ namespace youtube_downloader // we need to get our app name so that // we can create unique names for our mutex and our pipe - string webSitePath = Server.Functions.Downloader.DL.GetPath(true, "WebSite"); + webSitePath = Server.Functions.Downloader.DL.GetPath(true, "WebSite"); - /*Route.Add("/api/endpoint/", (rq, rp, args) => - { - rp.AsText(HandleRequest(rq.InputStream,rq.CurrentEncoding), "application/json"); - }, - "POST");*/ + + + /* Generic */ + Route.Add("/api/AddItems", (HttpAction)AddItems, "POST"); + Route.Add("/api/AddFile/{Url}", (HttpAction)AddFile); + Route.Add("/api/AddCaptions/{Id}", (HttpAction)AddCaptions); + + /* Videos */ + Route.Add("/api/AddVideoInfo/{Id}", (HttpAction)AddVideoInfo); + Route.Add("/api/AddVideo/{Id}", (HttpAction)AddVideo); + Route.Add("/api/AddVideoRes/{R}/{Id}", (HttpAction)AddVideoRes); + Route.Add("/api/Redownload", (HttpAction)Redownload); + Route.Add("/api/Redownload/{R}", (HttpAction)RedownloadRes); + Route.Add("/api/Watch/{VideoId}", (HttpAction)Watch); + + /* Playlist */ + Route.Add("/api/AddPlaylistOnly/{Id}", (HttpAction)AddPlaylistOnly); + Route.Add("/api/AddPlaylist/{Id}", (HttpAction)AddPlaylist); + Route.Add("/api/AddPlaylistRes/{R}/{Id}", (HttpAction)AddPlaylistRes); + + /* Search */ + Route.Add("/api/SearchOnly/{text}", (HttpAction)SearchOnly); + Route.Add("/api/Search/{text}", (HttpAction)Search); - Route.Add("/api/upload/", (rq,rp,args) => { - var files = rq.ParseBody(args); - foreach (var f in files.Values) - f.Save(Path.Combine(webSitePath,f.FileName)); - rp.AsText("uploaded", "text/plain"); - },"POST"); - Route.Add("/api/AddItems", (HttpAction)AddItems,"POST"); - Route.Add("/", (rq, rp, args) => - { - rp.AsFile(rq, Path.Combine(webSitePath, "index.html")); - }); - Route.Add("/api/Search/{text}", (rq, rp, args) => - { - string search = System.Web.HttpUtility.UrlDecode(args["text"]); - string json = JsonConvert.SerializeObject(Server.Functions.Downloader.Search(search)); - rp.AsText(json, "application/json"); + /* Channel */ + Route.Add("/api/AddChannelOnly/{Id}", (HttpAction)AddChannelOnly); + Route.Add("/api/AddChannel/{Id}", (HttpAction)AddChannel); + Route.Add("/api/AddChannelRes/{R}/{Id}", (HttpAction)AddChannelRes); - }); - Route.Add("/api/SearchOnly/{text}", (rq, rp, args) => - { - string search = System.Web.HttpUtility.UrlDecode(args["text"]); - string json = JsonConvert.SerializeObject(Server.Functions.Downloader.Search(search,false)); - rp.AsText(json, "application/json"); + /* User */ + Route.Add("/api/AddUserOnly/{Id}", (HttpAction)AddUserOnly); + Route.Add("/api/AddUser/{Id}", (HttpAction)AddUser); + Route.Add("/api/AddUserRes/{R}/{Id}", (HttpAction)AddUserRes); - }); - Route.Add("/api/Storage/GetDirectories/{Path}", (rq, rp, args) => - { - string path = Server.Functions.Downloader.DL.GetPath(true, args["Path"]); + /* Queue and Progress */ + Route.Add("/api/QueueList", (HttpAction)QueueList); + Route.Add("/api/QueueMove/{From}/{To}", (HttpAction)QueueMove); + Route.Add("/api/QueueMove2/{To}/{Id}", (HttpAction)QueueMove2); + Route.Add("/api/Progress", (HttpAction)VideoProgress); + + /* Storage */ + Route.Add("/api/Storage/GetDirectories/{Path}", (HttpAction)StorageGetDirectories); + Route.Add("/api/Storage/GetFiles/{Path}", (HttpAction)StorageGetFiles); + Route.Add("/api/Storage/DirectoryExists/{Path}", (HttpAction)StorageDirectoryExists); + Route.Add("/api/Storage/FileExists/{Path}", (HttpAction)StorageFileExists); + Route.Add("/api/Storage/File/{Path}", (HttpAction)StorageFile); + Route.Add("/api/upload/", (HttpAction)UploadFiles, "POST"); - if (Directory.Exists(path)) - { - string json = Newtonsoft.Json.JsonConvert.SerializeObject(Directory.EnumerateDirectories(path).Select((o) => { return Path.GetFileName(o); })); - rp.AsText(json, "application/json"); - } - else - { - rp.AsText("[]", "application/json"); - } - }); - Route.Add("/api/Storage/GetFiles/{Path}", (rq, rp, args) => - { - string path = Server.Functions.Downloader.DL.GetPath(true, args["Path"]); - - if (Directory.Exists(path)) - { - string json = Newtonsoft.Json.JsonConvert.SerializeObject(Directory.EnumerateFiles(path).Select((o) => { return Path.GetFileName(o); })); - rp.AsText(json, "application/json"); - } - else - { - rp.AsText("[]", "application/json"); - } - }); - - Route.Add("/api/Storage/FileExists/{Path}", (rq, rp, args) => - { - string path = Server.Functions.Downloader.DL.GetPath(true, args["Path"]); - string json = File.Exists(path) ? "true" : "false"; - rp.AsText(json, "text/plain"); - - }); - Route.Add("/api/Storage/DirectoryExists/{Path}", (rq, rp, args) => - { - string path = Server.Functions.Downloader.DL.GetPath(true, args["Path"]); - string json = Directory.Exists(path) ? "true" : "false"; - rp.AsText(json, "text/plain"); - - }); - Route.Add("/api/Storage/File/{Path}", (rq, rp, args) => - { - if (args["path"].StartsWith("config/")) - { - rp.AsText("Access denied"); - } - else - { - string path = Server.Functions.Downloader.DL.GetPath(true, args["Path"]); - - rp.AsFile(rq, path); - } - }); - Route.Add("/api/AddVideo/{Id}", (rq, rp, args) => - { - Server.Functions.Downloader.DownloadVideo(System.Web.HttpUtility.UrlDecode(args["Id"])); - - rp.AsRedirect("/"); - }); - Route.Add("/api/AddVideoRes/{R}/{Id}", (rq, rp, args) => - { - Server.Functions.Downloader.DownloadVideo(System.Web.HttpUtility.UrlDecode(args["Id"]), (Resolution)int.Parse(args["R"])); - rp.AsRedirect("/"); - }); - Route.Add("/api/AddPlaylist/{Id}", (rq, rp, args) => - { - Server.Functions.Downloader.DownloadPlaylist(System.Web.HttpUtility.UrlDecode(args["Id"])); - - rp.AsRedirect("/"); - }); - Route.Add("/api/AddPlaylistRes/{R}/{Id}", (rq, rp, args) => - { - Server.Functions.Downloader.DownloadPlaylist(System.Web.HttpUtility.UrlDecode(args["Id"]), (Resolution)int.Parse(args["R"])); - rp.AsRedirect("/"); - }); - Route.Add("/api/AddChannel/{Id}", (rq, rp, args) => - { - Server.Functions.Downloader.DownloadChannel(System.Web.HttpUtility.UrlDecode(args["Id"])); - - rp.AsRedirect("/"); - }); - Route.Add("/api/AddChannelRes/{R}/{Id}", (rq, rp, args) => - { - Server.Functions.Downloader.DownloadChannel(System.Web.HttpUtility.UrlDecode(args["Id"]), (Resolution)int.Parse(args["R"])); - rp.AsRedirect("/"); - }); - Route.Add("/api/AddUser/{Id}", (rq, rp, args) => - { - Server.Functions.Downloader.DownloadUser(System.Web.HttpUtility.UrlDecode(args["Id"])); - - rp.AsRedirect("/"); - }); - Route.Add("/api/AddChannelOnly/{Id}", (rq, rp, args) => - { - Server.Functions.Downloader.DownloadChannelOnly(System.Web.HttpUtility.UrlDecode(args["Id"])); - - rp.AsRedirect("/"); - }); - Route.Add("/api/AddUserOnly/{Id}", (rq, rp, args) => - { - Server.Functions.Downloader.DownloadUserOnly(System.Web.HttpUtility.UrlDecode(args["Id"])); - rp.AsRedirect("/"); - }); - Route.Add("/api/AddPlaylistOnly/{Id}", (rq, rp, args) => - { - Server.Functions.Downloader.DownloadPlaylistOnly(System.Web.HttpUtility.UrlDecode(args["Id"]),Resolution.NoConvert); - rp.AsRedirect("/"); - }); - Route.Add("/api/AddVideoInfo/{Id}", (rq, rp, args) => - { - Server.Functions.Downloader.DownloadVideoInfo(System.Web.HttpUtility.UrlDecode(args["Id"]),Resolution.NoConvert); - rp.AsRedirect("/"); - }); - Route.Add("/api/AddUserRes/{R}/{Id}", (rq, rp, args) => - { - Server.Functions.Downloader.DownloadUser(System.Web.HttpUtility.UrlDecode(args["Id"]), (Resolution)int.Parse(args["R"])); - rp.AsRedirect("/"); - }); - Route.Add("/api/QueueMove/{From}/{To}", (rq, rp, args) => - { - Server.Functions.Downloader.ModQueue(args["To"], args["From"]); - rp.AsRedirect("/"); - }); - Route.Add("/api/QueueList", (rq, rp, args) => - { - string json = Server.Functions.Downloader.GetQueue(); - rp.AsText(json, "application/json"); - }); - Route.Add("/api/Progress", (rq, rp, args) => - { - string json = JsonConvert.SerializeObject(Server.Functions.Downloader.GetProgress()); - rp.AsText(json, "application/json"); - }); - Route.Add("/api/Watch/{VideoId}", (rq, rp, args) => - { - var txt = Templating.RenderFile(Path.Combine(webSitePath, "watch_page.thtml"), args); //populate template - rp.AsText(txt); - }); - - Route.Add("/api/Redownload", (rq, rp, args) => - { - foreach (var item in Directory.GetFiles(Server.Functions.Downloader.DL.GetPath(true, "Info"), "*.json")) - { - string id = System.IO.Path.GetFileNameWithoutExtension(item); - Server.Functions.Downloader.DownloadVideo(id, Resolution.NoConvert); - } - rp.AsRedirect("/"); - }); - Route.Add("/api/Redownload/{R}", (rq, rp, args) => - { - foreach (var item in Directory.GetFiles(Server.Functions.Downloader.DL.GetPath(true, "Info"), "*.json")) - { - string id = System.IO.Path.GetFileNameWithoutExtension(item); - Server.Functions.Downloader.DownloadVideo(id, (Resolution)int.Parse(args["R"])); - } - rp.AsRedirect("/"); - }); - Route.Add("/{Path}", (rq, rp, args) => - { - string path = Path.Combine(webSitePath, args["Path"].Split(new char[] { '?' }, StringSplitOptions.RemoveEmptyEntries)[0]); - - rp.AsFile(rq, path); - }); + /* Other */ + Route.Add("/", (HttpAction)Index); + Route.Add("/{Path}", (HttpAction)RootPath); Console.WriteLine("Almost Ready To Listen"); if (arg.Length > 0) @@ -249,33 +103,243 @@ namespace youtube_downloader } } + #region Generic private static void AddItems(HttpListenerRequest request, HttpListenerResponse response, Dictionary arguments) { var f = request.ParseBody(arguments); - foreach(var file in f.Values) + foreach (var file in f.Values) { using (var req = new StreamReader(file.Value)) { - List tripletlst = JsonConvert.DeserializeObject>( req.ReadToEnd()); + List tripletlst = JsonConvert.DeserializeObject>(req.ReadToEnd()); Server.Functions.Downloader.DownloadItems(tripletlst); response.Redirect("/"); } } - + } - /* -private static string HandleRequest(Stream inputStream, Encoding currentEncoding) -{ - using (var streamReader = new StreamReader(inputStream, currentEncoding)) - { - return Newtonsoft.Json.JsonConvert.SerializeObject(HandleRequest(Newtonsoft.Json.JsonConvert.DeserializeObject(streamReader.ReadToEnd())); - } -} -private static YoutubeDownloaderResponse HandleRequest(YoutubeDownloaderRequest data) -{ + public static void AddFile(HttpListenerRequest request, HttpListenerResponse response, Dictionary arguments) + { + Server.Functions.Downloader.DownloadFile(arguments["Url"]); + } + public static void AddCaptions(HttpListenerRequest request, HttpListenerResponse response, Dictionary arguments) + { + Server.Functions.Downloader.DownloadCaptions(arguments["Id"]); + } + #endregion + #region Video + public static void AddVideoInfo(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary args) + { + Server.Functions.Downloader.DownloadVideoInfo(System.Web.HttpUtility.UrlDecode(args["Id"]), Resolution.NoConvert); + rp.AsRedirect("/"); + } + public static void AddVideo(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary args) + { + Server.Functions.Downloader.DownloadVideo(System.Web.HttpUtility.UrlDecode(args["Id"])); + + rp.AsRedirect("/"); + } + public static void AddVideoRes(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary args) + { + Server.Functions.Downloader.DownloadVideo(System.Web.HttpUtility.UrlDecode(args["Id"]), (Resolution)int.Parse(args["R"])); + rp.AsRedirect("/"); + } + public static void Redownload(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary args) + { + foreach (var item in Directory.GetFiles(Server.Functions.Downloader.DL.GetPath(true, "Info"), "*.json")) + { + string id = System.IO.Path.GetFileNameWithoutExtension(item); + Server.Functions.Downloader.DownloadVideo(id, Resolution.NoConvert); + } + rp.AsRedirect("/"); + } + + public static void RedownloadRes(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary args) + { + foreach (var item in Directory.GetFiles(Server.Functions.Downloader.DL.GetPath(true, "Info"), "*.json")) + { + string id = System.IO.Path.GetFileNameWithoutExtension(item); + Server.Functions.Downloader.DownloadVideo(id, (Resolution)int.Parse(args["R"])); + } + rp.AsRedirect("/"); + } + public static void Watch(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary args) + { + var txt = Templating.RenderFile(Path.Combine(webSitePath, "watch_page.thtml"), args); //populate template + rp.AsText(txt); + } + #endregion + #region Playlist + public static void AddPlaylistOnly(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary args) + { + Server.Functions.Downloader.DownloadPlaylistOnly(System.Web.HttpUtility.UrlDecode(args["Id"]), Resolution.NoConvert); + rp.AsRedirect("/"); + } + public static void AddPlaylist(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary args) + { + Server.Functions.Downloader.DownloadPlaylist(System.Web.HttpUtility.UrlDecode(args["Id"])); + + rp.AsRedirect("/"); + } + public static void AddPlaylistRes(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary args) + { + Server.Functions.Downloader.DownloadPlaylist(System.Web.HttpUtility.UrlDecode(args["Id"]), (Resolution)int.Parse(args["R"])); + rp.AsRedirect("/"); + } + #endregion + #region Search + public static void SearchOnly(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary args) + { + string search = System.Web.HttpUtility.UrlDecode(args["text"]); + string json = JsonConvert.SerializeObject(Server.Functions.Downloader.Search(search, false)); + rp.AsText(json, "application/json"); + + } + public static void Search(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary args) + { + string search = System.Web.HttpUtility.UrlDecode(args["text"]); + string json = JsonConvert.SerializeObject(Server.Functions.Downloader.Search(search)); + rp.AsText(json, "application/json"); + + } + #endregion + #region Channel + public static void AddChannelOnly(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary args) + { + Server.Functions.Downloader.DownloadChannelOnly(System.Web.HttpUtility.UrlDecode(args["Id"])); + + rp.AsRedirect("/"); + } + public static void AddChannel(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary args) + { + Server.Functions.Downloader.DownloadChannel(System.Web.HttpUtility.UrlDecode(args["Id"])); + + rp.AsRedirect("/"); + } + public static void AddChannelRes(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary args) + { + Server.Functions.Downloader.DownloadChannel(System.Web.HttpUtility.UrlDecode(args["Id"]), (Resolution)int.Parse(args["R"])); + rp.AsRedirect("/"); + } + #endregion + #region User + public static void AddUserOnly(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary args) + { + Server.Functions.Downloader.DownloadUserOnly(System.Web.HttpUtility.UrlDecode(args["Id"])); + rp.AsRedirect("/"); + } + public static void AddUser(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary args) + { + Server.Functions.Downloader.DownloadUser(System.Web.HttpUtility.UrlDecode(args["Id"])); + + rp.AsRedirect("/"); + } + public static void AddUserRes(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary args) + { + Server.Functions.Downloader.DownloadUser(System.Web.HttpUtility.UrlDecode(args["Id"]), (Resolution)int.Parse(args["R"])); + rp.AsRedirect("/"); + } + #endregion + #region Queue And Progress + public static void QueueList(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary args) + { + string json = Server.Functions.Downloader.GetQueue(); + rp.AsText(json, "application/json"); + } + public static void QueueMove(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary args) + { + Server.Functions.Downloader.ModQueue(args["To"], args["From"]); + rp.AsRedirect("/"); + } + public static void QueueMove2(HttpListenerRequest request, HttpListenerResponse response, Dictionary arguments) + { + Server.Functions.Downloader.ModQueue2(arguments["To"], arguments["Id"]); + response.AsRedirect("/"); + } + public static void VideoProgress(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary args) + { + string json = JsonConvert.SerializeObject(Server.Functions.Downloader.GetProgress()); + rp.AsText(json, "application/json"); + } + #endregion + #region Storage + public static void StorageGetDirectories(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary args) + { + string path = Server.Functions.Downloader.DL.GetPath(true, args["Path"]); + + if (Directory.Exists(path)) + { + string json = Newtonsoft.Json.JsonConvert.SerializeObject(Directory.EnumerateDirectories(path).Select((o) => { return Path.GetFileName(o); })); + rp.AsText(json, "application/json"); + } + else + { + rp.AsText("[]", "application/json"); + } + } + public static void StorageGetFiles(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary args) + { + string path = Server.Functions.Downloader.DL.GetPath(true, args["Path"]); + + if (Directory.Exists(path)) + { + string json = Newtonsoft.Json.JsonConvert.SerializeObject(Directory.EnumerateFiles(path).Select((o) => { return Path.GetFileName(o); })); + rp.AsText(json, "application/json"); + } + else + { + rp.AsText("[]", "application/json"); + } + } + public static void StorageDirectoryExists(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary args) + { + string path = Server.Functions.Downloader.DL.GetPath(true, args["Path"]); + string json = Directory.Exists(path) ? "true" : "false"; + rp.AsText(json, "text/plain"); + + } + public static void StorageFileExists(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary args) + { + string path = Server.Functions.Downloader.DL.GetPath(true, args["Path"]); + string json = File.Exists(path) ? "true" : "false"; + rp.AsText(json, "text/plain"); + + } + public static void StorageFile(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary args) + { + if (args["path"].StartsWith("config/")) + { + rp.AsText("Access denied"); + } + else + { + string path = Server.Functions.Downloader.DL.GetPath(true, args["Path"]); + + rp.AsFile(rq, path); + } + } + public static void UploadFiles(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary args) + { + var files = rq.ParseBody(args); + foreach (var f in files.Values) + f.Save(Path.Combine(webSitePath, f.FileName)); + rp.AsText("uploaded", "text/plain"); + } + #endregion + #region Other + public static void Index(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary args) + { + rp.AsFile(rq, Path.Combine(webSitePath, "index.html")); + } + public static void RootPath(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary args) + { + string path = Path.Combine(webSitePath, args["Path"].Split(new char[] { '?' }, StringSplitOptions.RemoveEmptyEntries)[0]); + + rp.AsFile(rq, path); + } + #endregion -}*/ } } diff --git a/Server/Functions/Downloader.cs b/Server/Functions/Downloader.cs index 7eb918a..c34c07a 100644 --- a/Server/Functions/Downloader.cs +++ b/Server/Functions/Downloader.cs @@ -23,24 +23,24 @@ namespace youtube_downloader.Server.Functions { public Downloader() { - // TessesYoutubeDownloader.Server.Functions.Downloader.DL.DownloadThread().GetAwaiter().GetResult(); + // TessesYoutubeDownloader.Server.Functions.Downloader.DL.DownloadThread().GetAwaiter().GetResult(); } - public List infoQueue = new List(); + public List infoQueue = new List(); public static YoutubeClient CreateYoutubeClient() { - + ServicePointManager .ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true; HttpClientHandler handler = new HttpClientHandler(); handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true; - + Directory.CreateDirectory("config"); - string cookiesFile=Path.Combine("config", "cookies.txt"); + string cookiesFile = Path.Combine("config", "cookies.txt"); if (File.Exists(cookiesFile)) { - var cookies=CookiesTxt.Parser.ParseFileAsCookieCollection(cookiesFile); + var cookies = CookiesTxt.Parser.ParseFileAsCookieCollection(cookiesFile); handler.CookieContainer.Add(cookies); } Http = new HttpClient(handler); @@ -54,18 +54,18 @@ namespace youtube_downloader.Server.Functions static HttpClient Http; - internal YoutubeClient ytc = CreateYoutubeClient(); - static VideoDownloadProgress P=new VideoDownloadProgress(); - Progress DownloadP =new Progress( (e)=> { P.Progress = (int)(e * 100.0); }); - - public List Queue = new List(); + internal YoutubeClient ytc = CreateYoutubeClient(); + static VideoDownloadProgress P = new VideoDownloadProgress(); + Progress DownloadP = new Progress((e) => { P.Progress = (int)(e * 100.0); P.ProgressRaw = e; }); + + public List Queue = new List(); internal static string GetQueue() { string q; lock (DL.Queue) { - q = JsonConvert.SerializeObject(DL.Queue.Select(o => o.Video)) ; + q = JsonConvert.SerializeObject(DL.Queue.Select(o => o.Video)); } return q; } @@ -97,7 +97,7 @@ namespace youtube_downloader.Server.Functions { _DownloadVideos(items); } - }catch(Exception ex) + } catch (Exception ex) { Console.WriteLine(ex.Message); @@ -106,34 +106,32 @@ namespace youtube_downloader.Server.Functions } } while (true); } - internal static void ModQueue(string mvto, string index) + internal static void ModQueue2(string mvto, string index) { try { - //?mv=up|down|top|bottom|remove,int&i=0,last + //?mv=up|down|top|bottom|remove,int&i=videoId;URL lock (DL.Queue) { - int index2 = 0; - if (index == "last") + int index2 = -1; + for(int i=0;i= DL.Queue.Count) + if(index2 < 0) { - index2 = DL.Queue.Count - 1; + return; } if (mvto == "top") { var v = DL.Queue[index2]; DL.Queue.Remove(v); - DL.Queue.Insert(0,v); + DL.Queue.Insert(0, v); } else if (mvto == "bottom") { @@ -188,7 +186,98 @@ namespace youtube_downloader.Server.Functions } } - }catch(Exception ex) + } + catch (Exception ex) + { + Console.WriteLine(ex.Message); + + _ = ex; + } + } + + internal static void ModQueue(string mvto, string index) + { + try + { + //?mv=up|down|top|bottom|remove,int&i=0,last + lock (DL.Queue) + { + int index2 = 0; + if (index == "last") + { + index2 = DL.Queue.Count - 1; + } + else + { + if (!int.TryParse(index, out index2)) + { + index2 = 0; + } + } + if (index2 >= DL.Queue.Count) + { + index2 = DL.Queue.Count - 1; + } + if (mvto == "top") + { + var v = DL.Queue[index2]; + DL.Queue.Remove(v); + DL.Queue.Insert(0, v); + } + else if (mvto == "bottom") + { + var v = DL.Queue[index2]; + DL.Queue.Remove(v); + DL.Queue.Add(v); + } + else if (mvto == "remove") + { + var v = DL.Queue[index2]; + DL.Queue.Remove(v); + + } + else if (mvto == "up") + { + if (index2 > 0) + { + var v = DL.Queue[index2]; + DL.Queue.Remove(v); + + DL.Queue.Insert(index2 - 1, v); + } + + } + else if (mvto == "down") + { + if (index2 < DL.Queue.Count - 1) + { + var v = DL.Queue[index2]; + DL.Queue.Remove(v); + + DL.Queue.Insert(index2 + 1, v); + } + } + else + { + int n1; + + if (int.TryParse(mvto, out n1)) + { + var v = DL.Queue[index2]; + DL.Queue.Remove(v); + if (n1 > index2) + { + DL.Queue.Insert(n1 - 1, v); + } + else + { + DL.Queue.Insert(n1, v); + } + } + } + + } + } catch (Exception ex) { Console.WriteLine(ex.Message); @@ -201,7 +290,7 @@ namespace youtube_downloader.Server.Functions ChannelId? v = ChannelId.TryParse(id); if (v.HasValue) { - InfomationQueueItem item = new InfomationQueueItem(v.Value,Resolution.NoConvert,false); + InfomationQueueItem item = new InfomationQueueItem(v.Value, Resolution.NoConvert, false); lock (DL.infoQueue) { DL.infoQueue.Insert(0, item); @@ -211,10 +300,10 @@ namespace youtube_downloader.Server.Functions public static void DownloadItems(List id) { List items = new List(); - foreach(var item in id) + foreach (var item in id) { var iqi = item.ToInfomationQueueItem(); - if(iqi != null) + if (iqi != null) { items.Add(iqi); } @@ -224,7 +313,7 @@ namespace youtube_downloader.Server.Functions lock (DL.infoQueue) { - DL.infoQueue.InsertRange(0,items); + DL.infoQueue.InsertRange(0, items); } } } @@ -245,7 +334,7 @@ namespace youtube_downloader.Server.Functions { if (File.Exists(v)) { - using(var f = File.OpenRead(v)) + using (var f = File.OpenRead(v)) { return f.Length == 0; } @@ -256,7 +345,7 @@ namespace youtube_downloader.Server.Functions { if (File.Exists("loc.txt")) { - string loc=File.ReadAllText("loc.txt"); + string loc = File.ReadAllText("loc.txt"); try { Directory.CreateDirectory(loc); @@ -264,7 +353,7 @@ namespace youtube_downloader.Server.Functions { return loc; } - }catch(Exception ex) + } catch (Exception ex) { Console.WriteLine(ex.Message); @@ -275,8 +364,8 @@ namespace youtube_downloader.Server.Functions } public string StorageLocation { get { return gStorageLocation(); } } private void _DownloadVideos(SavedVideoObject[] items) - { - + { + lock (Queue) { foreach (var item in items) @@ -286,6 +375,17 @@ namespace youtube_downloader.Server.Functions } } } + public bool FileExists(string nameSrc,ref string nameDest,ref int i) + { + if(i == 1) + { + i++; + return File.Exists(nameSrc); + } + i++; + nameDest= Path.Combine(Path.GetDirectoryName(nameSrc), $"{Path.GetFileNameWithoutExtension(nameSrc)} ({i}){Path.GetExtension(nameSrc)}"); + return File.Exists(nameDest); + } public async Task DownloadThread() { do @@ -294,13 +394,21 @@ namespace youtube_downloader.Server.Functions SavedVideoObject v; lock (Queue) { - canDownload= Queue.Count > 0; + canDownload = Queue.Count > 0; if (canDownload) { v = Queue[0]; Queue.RemoveAt(0); P.Saved = v.Video; - Console.WriteLine($"Download: {v.Video.Title}"); + if (v.RegularFile) + { + Console.WriteLine($"Download: {v.Video.Id}"); + } + else + { + Console.WriteLine($"Download: {v.Video.Title}"); + } + } else { @@ -312,84 +420,103 @@ namespace youtube_downloader.Server.Functions { try { - switch (v.Resolution) - { - case Resolution.Convert: + if (v.RegularFile) { - string mypath = GetPath(true, "Converted", v.Video.Id + "-vidonly.bkp"); - string mypathaudio = GetPath(true, "Audio", v.Video.Id + "incomplete.mp4"); - string mypathCompleteAudio = GetPath(true, "Audio", v.Video.Id + ".mp4"); - string mypathComplete = GetPath(true, "Converted", v.Video.Id + ".mp4"); - string mypathIncompleteConverting = GetPath(true, "Converted", "conv.mkv"); - - if (Continue(mypathComplete)) + var req=await Http.GetAsync(v.Video.Id); + long? Len=req.Content.Headers.ContentLength; + Uri u = new Uri(v.Video.Id); + string abs = u.AbsolutePath; + string name = "file.bin"; + if(abs.Contains("/")) + { + name=abs.Substring(abs.LastIndexOf('/') + 1); + } + if (req.Content.Headers.Contains("Content-Disposition")) + { + name=req.Content.Headers.ContentDisposition.FileName; + } + int fileI=1; + P.Saved.Title = name; + name=GetPath(true, "Download", name); + string filename=name; + while (FileExists(name, ref filename, ref fileI)) ; + long Len2 = long.MaxValue; + if(Len.HasValue) + { + if(Len.Value > 0) { - var s3 = await ytc.Videos.Streams.GetManifestAsync(v.Video.Id); - var best2 = s3.GetAudioOnlyStreams().GetWithHighestBitrate(); + Len2 = Len.Value; + } + } - - - var best = s3.GetVideoOnlyStreams().GetWithHighestVideoQuality(); - P.Length = best.Size.Bytes + best2.Size.Bytes; - ProgressTwo p = new ProgressTwo(best.Size.Bytes, best2.Size.Bytes, DownloadP); - - using (var destStrm = System.IO.File.Open(mypath, FileMode.OpenOrCreate, FileAccess.ReadWrite)) + P.Length = Len2; + long Pos = 0; + byte[] buffer = new byte[4096]; + int Cycles = 0; + IProgress p = DownloadP; + int CYCLES_BETWEEN_REPORT = 5; + using (var srcFile = await req.Content.ReadAsStreamAsync()) + { + using (var destFile = File.Create(filename)) + { + int read; + do { - long pos = 0; - long len = 0; - using (var srcStrm = await ytc.Videos.Streams.GetAsync(best)) + read = await srcFile.ReadAsync(buffer, 0, buffer.Length); + await destFile.WriteAsync(buffer, 0, read); + Pos += read; + Cycles++; + if (Cycles > CYCLES_BETWEEN_REPORT) { - len = srcStrm.Length; - pos = destStrm.Length; - IProgress myProgress = p.Video; - if (pos >= len) - { - - myProgress.Report(1); - - } - /* This is why videos get corrupted */ - srcStrm.Seek(destStrm.Length, SeekOrigin.Begin); - destStrm.Seek(destStrm.Length,SeekOrigin.Begin); - byte[] buffer = new byte[4096]; - int read = 0; - do - { - read = srcStrm.Read(buffer, 0, buffer.Length); - destStrm.Write(buffer, 0, read); - - pos += read; - double myP = (double)pos / (double)len; - myProgress.Report(myP); - } - while (read > 0); + Cycles = 0; + p.Report(Pos / Len2); } + } while (read > 0); + } + } + // DownloadP. + } + else + { + switch (v.Resolution) + { + case Resolution.Convert: - } + string mypath = GetPath(true, "Converted", v.Video.Id + "-vidonly.bkp"); + string mypathaudio = GetPath(true, "Audio", v.Video.Id + "incomplete.mp4"); + string mypathCompleteAudio = GetPath(true, "Audio", v.Video.Id + ".mp4"); + string mypathComplete = GetPath(true, "Converted", v.Video.Id + ".mp4"); + string mypathIncompleteConverting = GetPath(true, "Converted", "conv.mkv"); - IProgress pv = p.Video; - pv.Report(1); - if (Continue(mypathCompleteAudio)) + if (Continue(mypathComplete)) { - long pos = 0; - long len = 0; - using (var destStrm = System.IO.File.Open(mypathaudio, FileMode.OpenOrCreate, FileAccess.ReadWrite)) + var s3 = await ytc.Videos.Streams.GetManifestAsync(v.Video.Id); + var best2 = s3.GetAudioOnlyStreams().GetWithHighestBitrate(); + + + + var best = s3.GetVideoOnlyStreams().GetWithHighestVideoQuality(); + P.Length = best.Size.Bytes + best2.Size.Bytes; + ProgressTwo p = new ProgressTwo(best.Size.Bytes, best2.Size.Bytes, DownloadP); + + using (var destStrm = System.IO.File.Open(mypath, FileMode.OpenOrCreate, FileAccess.ReadWrite)) { - using (var srcStrm = await ytc.Videos.Streams.GetAsync(best2)) + long pos = 0; + long len = 0; + using (var srcStrm = await ytc.Videos.Streams.GetAsync(best)) { len = srcStrm.Length; pos = destStrm.Length; - IProgress myProgress = p.Audio; + IProgress myProgress = p.Video; if (pos >= len) { myProgress.Report(1); } - /* This is why videos get corrupted */ + /* This is why videos get corrupted */ srcStrm.Seek(destStrm.Length, SeekOrigin.Begin); - destStrm.Seek(destStrm.Length,SeekOrigin.Begin); - + destStrm.Seek(destStrm.Length, SeekOrigin.Begin); byte[] buffer = new byte[4096]; int read = 0; do @@ -405,128 +532,168 @@ namespace youtube_downloader.Server.Functions } } - File.Move(mypathaudio, mypathCompleteAudio); - } - IProgress pa = p.Video; - pa.Report(1); - ffmpeg.mux(mypath, mypathCompleteAudio, mypathIncompleteConverting); - - File.Move(mypathIncompleteConverting, mypathComplete); - } - break; - case Resolution.NoConvert: - string mypath2 = GetPath(true, "NotConverted", v.Video.Id + "incomplete.mp4"); - string mypath2Complete = GetPath(true, "NotConverted", v.Video.Id + ".mp4"); - - if (Continue(mypath2Complete)) - { - var s = await ytc.Videos.Streams.GetManifestAsync(v.Video.Id); - var best = s.GetMuxedStreams().GetWithHighestVideoQuality(); - P.Length = best.Size.Bytes; - long pos = 0; - long len = 0; - using (var destStrm = System.IO.File.Open(mypath2, FileMode.OpenOrCreate, FileAccess.ReadWrite)) - { - using (var srcStrm = await ytc.Videos.Streams.GetAsync(best)) + IProgress pv = p.Video; + pv.Report(1); + if (Continue(mypathCompleteAudio)) { - len = srcStrm.Length; - pos = destStrm.Length; - IProgress myProgress = DownloadP; - if (pos >= len) + long pos = 0; + long len = 0; + using (var destStrm = System.IO.File.Open(mypathaudio, FileMode.OpenOrCreate, FileAccess.ReadWrite)) { + using (var srcStrm = await ytc.Videos.Streams.GetAsync(best2)) + { + len = srcStrm.Length; + pos = destStrm.Length; + IProgress myProgress = p.Audio; + if (pos >= len) + { - myProgress.Report(1); + myProgress.Report(1); + + } + /* This is why videos get corrupted */ + srcStrm.Seek(destStrm.Length, SeekOrigin.Begin); + destStrm.Seek(destStrm.Length, SeekOrigin.Begin); + + byte[] buffer = new byte[4096]; + int read = 0; + do + { + read = srcStrm.Read(buffer, 0, buffer.Length); + destStrm.Write(buffer, 0, read); + + pos += read; + double myP = (double)pos / (double)len; + myProgress.Report(myP); + } + while (read > 0); + } } - /* This is why videos get corrupted */ - srcStrm.Seek(destStrm.Length, SeekOrigin.Begin); - destStrm.Seek(destStrm.Length,SeekOrigin.Begin); - byte[] buffer = new byte[4096]; - int read = 0; - do - { - read = srcStrm.Read(buffer, 0, buffer.Length); - destStrm.Write(buffer, 0, read); - - pos += read; - double myP = (double)pos / (double)len; - myProgress.Report(myP); - } - while (read > 0); + File.Move(mypathaudio, mypathCompleteAudio); } + IProgress pa = p.Video; + pa.Report(1); + ffmpeg.mux(mypath, mypathCompleteAudio, mypathIncompleteConverting); + + File.Move(mypathIncompleteConverting, mypathComplete); } - File.Move(mypath2, mypath2Complete); - } + break; + case Resolution.NoConvert: + string mypath2 = GetPath(true, "NotConverted", v.Video.Id + "incomplete.mp4"); + string mypath2Complete = GetPath(true, "NotConverted", v.Video.Id + ".mp4"); - - break; - case Resolution.Audio: - string mypath3 = GetPath(true, "Audio", v.Video.Id + "incomplete.mp4"); - string mypath3Complete = GetPath(true, "Audio", v.Video.Id + ".mp4"); - if (Continue(mypath3Complete)) - { - var s2 = await ytc.Videos.Streams.GetManifestAsync(v.Video.Id); - var best2 = s2.GetAudioOnlyStreams().GetWithHighestBitrate(); - P.Length = best2.Size.Bytes; - long pos = 0; - long len = 0; - using (var destStrm = System.IO.File.Open(mypath3, FileMode.OpenOrCreate, FileAccess.ReadWrite)) + if (Continue(mypath2Complete)) { - using (var srcStrm = await ytc.Videos.Streams.GetAsync(best2)) + var s = await ytc.Videos.Streams.GetManifestAsync(v.Video.Id); + var best = s.GetMuxedStreams().GetWithHighestVideoQuality(); + P.Length = best.Size.Bytes; + long pos = 0; + long len = 0; + using (var destStrm = System.IO.File.Open(mypath2, FileMode.OpenOrCreate, FileAccess.ReadWrite)) { - len = srcStrm.Length; - pos = destStrm.Length; - IProgress myProgress = DownloadP; - if (pos >= len) + using (var srcStrm = await ytc.Videos.Streams.GetAsync(best)) { + len = srcStrm.Length; + pos = destStrm.Length; + IProgress myProgress = DownloadP; + if (pos >= len) + { - myProgress.Report(1); + myProgress.Report(1); + } + /* This is why videos get corrupted */ + srcStrm.Seek(destStrm.Length, SeekOrigin.Begin); + destStrm.Seek(destStrm.Length, SeekOrigin.Begin); + byte[] buffer = new byte[4096]; + int read = 0; + do + { + read = srcStrm.Read(buffer, 0, buffer.Length); + destStrm.Write(buffer, 0, read); + + pos += read; + double myP = (double)pos / (double)len; + myProgress.Report(myP); + } + while (read > 0); } - /* This is why videos get corrupted */ - srcStrm.Seek(destStrm.Length, SeekOrigin.Begin); - destStrm.Seek(destStrm.Length,SeekOrigin.Begin); - byte[] buffer = new byte[4096]; - int read = 0; - do - { - read = srcStrm.Read(buffer, 0, buffer.Length); - destStrm.Write(buffer, 0, read); - pos += read; - double myP = (double)pos / (double)len; - myProgress.Report(myP); - } - while (read > 0); } - + File.Move(mypath2, mypath2Complete); } - File.Move(mypath3, mypath3Complete); - } - break; + + + break; + case Resolution.Audio: + string mypath3 = GetPath(true, "Audio", v.Video.Id + "incomplete.mp4"); + string mypath3Complete = GetPath(true, "Audio", v.Video.Id + ".mp4"); + if (Continue(mypath3Complete)) + { + var s2 = await ytc.Videos.Streams.GetManifestAsync(v.Video.Id); + var best2 = s2.GetAudioOnlyStreams().GetWithHighestBitrate(); + P.Length = best2.Size.Bytes; + long pos = 0; + long len = 0; + using (var destStrm = System.IO.File.Open(mypath3, FileMode.OpenOrCreate, FileAccess.ReadWrite)) + { + using (var srcStrm = await ytc.Videos.Streams.GetAsync(best2)) + { + len = srcStrm.Length; + pos = destStrm.Length; + IProgress myProgress = DownloadP; + if (pos >= len) + { + + myProgress.Report(1); + + } + /* This is why videos get corrupted */ + srcStrm.Seek(destStrm.Length, SeekOrigin.Begin); + destStrm.Seek(destStrm.Length, SeekOrigin.Begin); + byte[] buffer = new byte[4096]; + int read = 0; + do + { + read = srcStrm.Read(buffer, 0, buffer.Length); + destStrm.Write(buffer, 0, read); + + pos += read; + double myP = (double)pos / (double)len; + myProgress.Report(myP); + } + while (read > 0); + } + + } + File.Move(mypath3, mypath3Complete); + } + break; + } } - }catch(Exception ex) + } catch (Exception ex) { Console.WriteLine(ex.Message); } } System.Threading.Thread.Sleep(4000); - } + } while (true); } - internal void _DownloadThumbnail(int w,int h,string id,string tnail) + internal void _DownloadThumbnail(int w, int h, string id, string tnail) { try { - string p = GetPath(true,"Thumbnails", w.ToString() + 'x' + h.ToString(), id + ".jpg"); + string p = GetPath(true, "Thumbnails", w.ToString() + 'x' + h.ToString(), id + ".jpg"); if (!File.Exists(p)) { ffmpeg.download_thumbnail(tnail, p); - } + } } - catch(Exception ex) + catch (Exception ex) { Console.WriteLine(ex.Message); @@ -553,12 +720,12 @@ namespace youtube_downloader.Server.Functions _ = ex; } } - public static async Task> Search(string text,bool downloadThumbs=true) + public static async Task> Search(string text, bool downloadThumbs = true) { List media = new List(); try { - + await DL.ytc.Search.GetVideosAsync(text).ForEachAsync((e) => { if (downloadThumbs) @@ -569,7 +736,7 @@ namespace youtube_downloader.Server.Functions } } media.Add(new SavedMedia() { Title = e.Title, Id = e.Id, Kind = InfoType.Video }); - + }); await DL.ytc.Search.GetPlaylistsAsync(text).ForEachAsync((e) => { if (downloadThumbs) @@ -579,8 +746,8 @@ namespace youtube_downloader.Server.Functions DL._DownloadThumbnail2(t.Resolution.Width, t.Resolution.Height, e.Id, t.Url); } } - media.Add(new SavedMedia() { Title = e.Title, Id = e.Id, Kind = InfoType.Playlist }); - + media.Add(new SavedMedia() { Title = e.Title, Id = e.Id, Kind = InfoType.Playlist }); + }); await DL.ytc.Search.GetChannelsAsync(text).ForEachAsync((e) => { if (downloadThumbs) @@ -590,10 +757,10 @@ namespace youtube_downloader.Server.Functions DL._DownloadThumbnail2(t.Resolution.Width, t.Resolution.Height, e.Id, t.Url); } } - media.Add(new SavedMedia() { Title = e.Title, Id = e.Id, Kind = InfoType.Channel }); - + media.Add(new SavedMedia() { Title = e.Title, Id = e.Id, Kind = InfoType.Channel }); + }); - }catch (Exception ex) + } catch (Exception ex) { _ = ex; } @@ -603,9 +770,19 @@ namespace youtube_downloader.Server.Functions { return DL.Queue; } + public static void DownloadFile(string id) + { - - public static void DownloadVideo(string id,Resolution res) + + InfomationQueueItem item = new InfomationQueueItem(new Uri(id)); + lock (DL.infoQueue) + { + DL.infoQueue.Insert(0, item); + } + + } + + public static void DownloadVideo(string id, Resolution res) { VideoId? v = VideoId.TryParse(id); if (v.HasValue) @@ -634,6 +811,18 @@ namespace youtube_downloader.Server.Functions { DownloadVideo(v, Resolution.NoConvert); } + public static void DownloadCaptions(string id) + { + VideoId? v = VideoId.TryParse(id); + if(v.HasValue) + { + InfomationQueueItem item = new InfomationQueueItem(v.Value); + lock (DL.infoQueue) + { + DL.infoQueue.Insert(0, item); + } + } + } public static void DownloadPlaylist(string id,Resolution res) { PlaylistId? v = PlaylistId.TryParse(id); diff --git a/Server/Models/InfoType.cs b/Server/Models/InfoType.cs index fcfe540..fe03aec 100644 --- a/Server/Models/InfoType.cs +++ b/Server/Models/InfoType.cs @@ -10,7 +10,8 @@ namespace youtube_downloader.Server.Models Playlist=1, Channel=2, User=3, - ClosedCaptions=4 + ClosedCaptions=4, + FileDownload=5 } public class IDResolutionTypeTriplet { @@ -40,6 +41,9 @@ namespace youtube_downloader.Server.Models UserName user = Id; return new InfomationQueueItem(user, Resolution, download); + case InfoType.ClosedCaptions: + VideoId vid2 = Id; + return new InfomationQueueItem(vid2); } return null; diff --git a/Server/Models/InfomationQueueItem.cs b/Server/Models/InfomationQueueItem.cs index 167413d..f358d08 100644 --- a/Server/Models/InfomationQueueItem.cs +++ b/Server/Models/InfomationQueueItem.cs @@ -22,6 +22,20 @@ namespace youtube_downloader.Server.Models Type = InfoType.Video; this.res = res; } + public InfomationQueueItem(VideoId id) + { + Data = id.Value; + DownloadActualDataAfterwards = false; + Type = InfoType.ClosedCaptions; + this.res = 0; + } + public InfomationQueueItem(IDResolutionTypeTriplet triplet) + { + Data = triplet.Id; + DownloadActualDataAfterwards = true; + Type = triplet.Type; + this.res = triplet.Resolution; + } public InfomationQueueItem(PlaylistId id,Resolution res,bool download = true) { Data = id.Value; @@ -29,6 +43,13 @@ namespace youtube_downloader.Server.Models Type = InfoType.Playlist; this.res = res; } + public InfomationQueueItem(Uri url) + { + Data = url.ToString(); + DownloadActualDataAfterwards = true; + Type = InfoType.FileDownload; + this.res = 0; + } public InfomationQueueItem(ChannelId id, Resolution res, bool download = true) { Data = id.Value; @@ -61,6 +82,25 @@ namespace youtube_downloader.Server.Models { switch (Type) { + case InfoType.FileDownload: + return new SavedVideoObject[] { new SavedVideoObject(Data) }; + case InfoType.ClosedCaptions: + string path = Functions.Downloader.DL.GetPath(true, "ClosedCaptions", Data); + if (!Directory.Exists(path)) + { + + var cc0 = await Functions.Downloader.DL.ytc.Videos.ClosedCaptions.GetManifestAsync(Data); + string trackInfo = Functions.Downloader.DL.GetPath(true, "ClosedCaptions", Data,"track_info.json"); + File.WriteAllText(trackInfo, JsonConvert.SerializeObject(cc0.Tracks)); + foreach (var track in cc0.Tracks) + { + string trackType = track.IsAutoGenerated ? "auto" : "manu"; + string langFileName = $"{trackType}_{track.Language.Code}.srt"; + string track2 = Functions.Downloader.DL.GetPath(true, "ClosedCaptions", Data,langFileName); + await Functions.Downloader.DL.ytc.Videos.ClosedCaptions.DownloadAsync(track, track2); + } + } + break; case InfoType.Video: { string infPath = Functions.Downloader.DL.GetPath(true, "Info", Data + ".json"); diff --git a/Server/Models/SavedVideo.cs b/Server/Models/SavedVideo.cs index 5a8bcfe..61754e8 100644 --- a/Server/Models/SavedVideo.cs +++ b/Server/Models/SavedVideo.cs @@ -4,7 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using youtube_downloader.Server.Functions; - +using YoutubeExplode.Videos; namespace TessesYoutubeDownloader.Server.Models { @@ -14,8 +14,28 @@ namespace TessesYoutubeDownloader.Server.Models NoConvert=1, Audio=2 } + public struct ClosedCaptions + { + public ClosedCaptions(VideoId id) + { + VideoId = id; + } + public VideoId VideoId; + } public class SavedVideoObject { + public SavedVideoObject() + { + RegularFile = false; + } + public SavedVideoObject(string url) + { + RegularFile = true; + Video = new SavedVideo() { Id = url }; + } + public bool RegularFile { get; set; } + + public SavedVideo Video { get; set; } public Resolution Resolution { get; set; } } diff --git a/bin/Release/youtube-downloader.exe b/bin/Release/youtube-downloader.exe index 214a490f635598c70e52ba4cad409e81ebe3935f..1e98e63745e0d270b7a489a48f9c2b3dad200c63 100644 GIT binary patch literal 52224 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�Df%n)Oj{}yATSnYbQZ6=z z?i@$j8 zfaOVO@Q7{IZ^7DM7886gK=AvFJ4b9Q@`wn-gH?q8XatSduQ4to#5C_upSdG3+5MM7pSnd&DMNd6q>j)a7 z_=p{4<>K$`|3Kv%73D%>cwXQQ^m=B1G$com-~PgWd%B$P*BE~iIL6UKHczi4_$mAR z$6UG;zNOi?28WF_TWM|Z!?bh~+6=n1B8#f-57m1}+ zB+O~G4(+;QI+BtZeerK9d5zh`V2uW{K$7cS{Nk~EO|lI z`H-wNsY`=IjT0NWUZ5ya(IT2eA4^_ULevB?z|?z89VaefYNwORTEsm&z z#?AvmLm#jm1T`CX>_puF3+9Wt;$fTQ60wWRma*h=@iV4=0m&AzLhNDcD2=GI#N$l0 zKytoVDW0@xIY<1Q%gDv^MN&M&lpFQt<38tErrzNet`*NSbrH@X=8Ns(1*YEDiMkoH zo$OSRbmxoP#LMX4O!rfGh3P~0Gk^;`&jAj2e(Tfq?at?Xrw^>E{vF^-h65$P^XbTZ zuRvy#dmmtT0o7ez@H@b(+y?+(V)$Ia+rR^i-^p+k!{ZA`rl#PxfbAY?@x20q3gZ=? zKLD4tq&6SRAM5!De7hbgBejvFA?_?Xkg@rS;!k1oU#kfkL4tRL32v_-c)9D-Oe>GM z377UCD5YNPETDc#{>QEZzL419B%5z>lFgH%1fOGkzd`t`3_Gg@-hk>Za06ZrsEd_> zqC!LLDk;U!XZ}I20)DM?BuX!HQt3H?F@<4~ayEc-7Tb{R^<**KIRT{`#AHY=4$J~1 z+ps=p3y4$r9PkO@C3&UPiZ1@{IvYC6)Hv|^U;=ovngraa^%j!mZP5H3aRJ~yh2SUR zD}YBSUxEDPB_BcawZ&tAk1M+x(2iT}UT2n4E4Q-#+X4Te-ovdt1b9dzk1fVQ9Da%1 zu?w7Q9b*8$-Qo?v50$q8=P3Vxeyc6jPnM9Ej?=CNY*t<1 z3@x3d8Gc3lncJP?poqGS;oFW9@Lh;xMbtTIjAk?5td@bVh*5wWwHV+%$^^i_sU+!h z91HwQj$X*W#yaaA)T2&@k1_lQ!(xt&i41E6$^2M333dOa&IG*MaWddR$70wVjo=&R z;=9hXZT7ci_~WBgw@lpx`DV2@&jXX9J&+t%b{?1RI!x&{vvgq;X+T`;e$#aUILl4y zeb-k&#ZBtHqVupvYd5Knimt@XZ_1>WRW>M^IM1ZkR4TYDzR;v5N3X-_%H<|CJ9@3( zA+}4Z)QdIVDQ?M7H~O98&J2Zb$%%(DR1v5bB<1e+&QVqNx(>f!Fy5rr zgs$}$izz1MsyYw97|?7|M%9)65;51LE-5_^d%Hy@b#3XD{;)XHq;5f3M65BXyHOSq z8%*lSvM2ndB5hK8%YFmOKGJ1kE0^6M3WEpmRa5${ck(s)r9w2C6#1n>Of@MQhf2|6 zQZx>g;uMoQBRC)LGcGo%Rly=q_Vz}Iv$^aBy!U$0KSJy_C3jVX0;9w)OzMe>3Q*6R z6ph1C;$@SfaX3o6X;L%}qs4nBMdL79{LQ4O4`ak9CPjT1gP&cJ{i88DTKG(g#^`8K zVp7zR&9U4`T)W621`Ei2n{A6&Nd)kCoJt^4dVH_ybcnh}GWOz&P>0Cbg=f zHqa=1wIq3i2$$3bCW`SUwWhc>Fj*`zsb5BF15?FCCUujmHZV=#=hL{}_fd9|m{}*O z+lp!f(*^x{KI!~pv^FqH++b1%s%rx$i$_fAP1HM8yl+yML-I6nRK2Ws6SOQ6D@^J; zC|fG%mkdegM@DVn3~{ST{RCRh6wjK}(~w*#4w}@CaBX0<2;rWS>b(fbR&laP{S3CO z73)lDSD-e~F0MAId$rm?hj_%KzFb)wNb;R4X-SpV22%KkD5TEkLG_5YP3kX@+#(vs z%d&l-`ova~S`W`}6R(-n4^eMWEN_&O?XdbH(PdIkqwinI8QaUm_qa^XfXl=WO^TxD zGVwE$`iAfLz~$oSCiQJ!GpOfGit^bN;w6)!e0GI+TT0p_T=%6@?Ql$+H62iDNTVB7kViP#u9A#bp_4bKqw2kfhv8B6E~m z#iJ(G9Vx*xohMC-dh`wPj7d?Cz9D{RQV%+5kGapJ9(5Lh`h%pzlg@#_4pBFeEW1W{ zi)x)a#5|_16Ft$(Q6~6&_BwH5aIfo*oW9>Fe#K?ilp2w119ys-m?BTy0BY7Tq;pVg zDY@2vmpIF$HWy#(zguiFsrk5*{*Jhusf*ps#XAGv5!ad2DaH4Iy2Ydxmh24NBfe=; zXO`Rp>OM*Fig&LlnoRB8Aeu+~AaJkvFQ%>&*H!)))N>}aE>P>dSIj(?Brg`X29I~# zD=uN`I$+DIA4g@^iMfHjuJ4Jvrb+6C=uOIfqVxo!ZV_XWC zqVYs3yI9;4*sne)wlFm)W+F>HB=*WOcOz4;nPtybJRNvQOgl-|d#CdGzz@WBliKP! z-tmZdiKz=kS@4y>BVuVYNnR)()?NubDn4ZD260o-n}OZpB)V0B)n}LgHSn02$J7mC ziT5VuF>#kkEiL{e@VF?QPLekWN69CFC&eWuwY2yq<>z9%Nu5@4lkyAxM_fqqx#~{> zPl>J>vfl5ap9Fp>_M6mm)i){6i1$tE9pjV0uf^FjrQ|!tP0Dj(y-8gc{v`0ccqv2O zr2JOA&D6!>u_Co-uV|b_^#(x|6#Y)LG9@GHMbXRD#qMu=jt{&j22JWdPcx{?Oo~>E zm&COuMf3e7@pY4;72#!Zhe^?j@N!NhzasACGTGiMd1a4q*@d{j3l!y+y(-?f%9M(t zS4C_#_2Gb`M|JU<=$b33ExsC1+nACqyq?p->*5M7yHGrc{n+c`K9l-yg{ZwIG`*O6rAzm{j1OxQHp)hquHP z%d&lVOWe$q?8DnRTHY4l;<5|HSH!jcx5ZN?^^`ca=$#DpPi0ooyW&@7*+OMm(FbBL zQ?k83iFzDskq60Ve-hJ7iv0O!aZ7u)?9Vx^|3%!(WfzJ|m9vZfBG#Wnk{9AP>spHr zila72YPEJw(O<=Wreu466I(m8I{zlFFez&9L-AZ!w(LW(-=wJQBXLwZTlNu9+!qIi zhkwUCz9QBIhc7*V^HCM|v-HfX{xC9!)BM@|_i)mn9#*Gp_YaWKaIcCpYTV({3G|WM za9$Dh=wTcqtKw}R>G^Kuk#e3cp;|it@mnNiRO|oe{GWSc=ve%J->bPXT!im?-OTfa zVp7Fx8w;|#PcJF^IP_qgm!O8{GXf^ zWxJPft()K_MMy}cswiL$QpPSR>z))QnOW?gzrzm>F@f{U;rLRsY)e9^#}4hKm*8yi zcD!kIJASe3cHAZ3jyvAl@oPo5;|baAI2HHei)IF(j&pBs#Djka!y75Wc{RbQ3|kn^ zWw?mp3WjmO64B21CWgHXF9p(EeqYIOJOd zeoGPIrLNOq-JYtmfd4)m7mJiJu65#NWlz;c;8LFMk#~t7j_4L2tL4?_0bdr{hSQ5T zs;;aq#cq31vG*R^&;8WFq$9?-h!(~dn z*f-)T@vitZG*&q%_7^n(-e1+AyesJRV3KI`9G<t^rWtp%d}Y7@s#lRB#8WNnXD;X|xyM^&8${I<#>u?P3-C4i?#3I5T$RBKXC zs-B}XslSEywzAC^0k&&bh;`L{+IHZ&xP{^K+AQO1S}*iJjoi4>cboRSw$ZppTf{AX zlj|;0uQ#65;D?%5wRg2ELT{q<{P4TlL5$#^wYiY|yH*4L|5H;OFN6cQ{~~RQXwsT%Rs&b78J~VE z#dUwhb??^Fu2IfiDxK06IErd&onO;V@X_eI5CctGUDb)sOEsF0Bss4d-jz7VZ;Z=UBAjq+UOOufwUpni((P@WFA=|1H*t~tsy@nhGy z!0Rzv=PHyX=0d~OI>p%a`do$b!(5(~b9p|NIj+@j(Tn9A#6OerL;YQ7+pBM4ZJVG+ z$DDmO^rk*dOdipvO%t?B|C$zqPimB16<4{M9AB;2?waa&RKM9($(9_&b-US;qu3Hf zJ+|yA*WFr0bg!#kp?oq)p?p%Hej7Fys1ffUU52^~qe=ce2yFrVV^@v(G=2`cOr?I6 zsbq$yerMlW^OD36p~?QVh2>)jo!vzz5x9Gmn<+*>n#+Y6aB`k&l* z9tdA`v#+|@SKB$Bw~GpVqxd3j_X=+JV}(ZQ3fA_qLbX2T72y_^oU1;lzg@7MVbgjeO?WfohRl%&j7qiiqQ?%jpRzuEgCkKkU8)m@I; z_1)f2nX}6=sPFSSIPdM{G2P2!x|hfFV`Va;(TyF%-9ERd6yF1kiU$F|%AD=YxrsTq zh)2NRA$|h*P4Spd700MQ2W(-ujA4S|CWcP!=e{VOjDHXFj9>$v%0E)nfaei=04r$i z#WVJI0qgMFh7DpO!{ZswVE(DX1^yD|oW-yeyUYeW@tX^n7N;A{tht5ZYKC!!0}KZl z?qIl^;eLifA$wXF#u*MW+`;g6hPxT=VYr{+0fu;$5Oo!XQHJ;u9XO*HHZyEtID=uF zVJpJ{hJy?*WVnOj?F{c=xSQb~hL1Dc&+q`lw-^eIZD6P|j54fYIErC2!xn}!7_Md* zXV}VcfZ-s+3mNWUcss*88181chv9yP2N>d|Kk@^^D8m|t%?wvF9ALPE;ckZe844%W zjWTRz*uro%!#Kl1hPxT=VYr{+0fs{7))___HZxq!aEE@O*kSBud_O~cv52f?7-d+) zu$kd%h64KSSYWYZ=xsY+)E@xWh-KyBY3hC<yd4^gAA>ynJk%p2g z)>%sMy9{3{+YVgTlG<8>B>z&yPC&aJDI>K>Ny+)C?>mr`_H2oeg_84(lk{9s{C&WI z5`weXl7~DbpKX!+qT!<`2pMr7)_o+?5kE8WL91o~sA9oD!6983lB4ic(uKBUR zn<1;<9jK|m6OdKJT0r_2NlyU29uV&r?<*_09E|<4c`3{=K`u?i$z0%H0aUR!KNavEyaA<%djVDPUA$?ki0=Wa;`?F|@cRHmqEi_K z*rkky-!B7RDy{%tE^Y>nw-|v}h;IO|5IcZZiSGcf688chA-)HEgt!lQwRiw{wRi}4 z3v754_uwOy3Cb$v`$|}?SEs9;>Rxq{c9ynA>(&OfOSA{Hu;V_*^Nu$i#m=PjF6T4O z_nn8F0sSn!Q~$319oK`dS6pwos@=`*lig>#JKYz!zvceE`zd!t!BGW&DfqZxqGzUO zzNgD`uIGNwk33_%b0-$ytXao8AJeXl!-#PN_|gv(yQ*%QgB zfU^FVeZ4qG%CCDLPD-Q%)t7(gvl>}fa<1~-fmZYDK8|x5`R~5amHuw@H5Sv=Zr@eD z->|;iUfhM#8fi0K>F>+FgE*Ozb;)Y_+u=LbOIHKE3t~2g@F~WeEI}3v;}gNB6rVE8 z!E$^m@TtV73ZD^>sD{J>#K{Wro;XXmlwQ%R+#wR`3h}D?mN-FMA*vl?mC5*=>P#wq z&Ks2r^m~+F>o+Q|;O^%`d=BYPDv!FJRD$k1M7jG(Wg$MB-68eY_y^?26^vF@&uH~@ ze750p9X^laGsSz4@__el^$}cO!sqYa(Q2b_wA#h~64TPD*4gbHi4%`mwW_I6OqhPNo+1Bzh8ayAvBvY?CD$d%NP@>nF}gZtUtvbaRCXs4z2mZf8d_-ZnGd9Vb!Z zo!Gi+)y(#ES4X^eMn^oIp3u08xKmfHVq``t5${gSP9-;+0Rr7My>-92j(GdkK6o!unFW%>Fh9AnutVKQM$(0F`ZVosuaW_v0@ zrnD#0T$_uzjbn2K$!Ai83rJ)tNk9jCj%qU_$3N6vF^zh@5WeYvujjUrB-xONr&`yW zM4klP3W>Hvx;ryeO=8*_&=Y9fCV&{y#l}^{g;`C6WPN6GClL3rJ|m$isG2vtuoSGU zr6krvywiF*I^t_O604iU+*zGH8xtvuYDxEYw&t)-k9YJWmd4W?Al%a0-Ja|ugv5wB zKheED**3kWy`wFWLP18l<=l9CH?yo3Fih0m!c=lyDv?eTzBmzYThQ6jOHmAZU7~vx zg)rH9?5b7grs7>d5q)hO?i0kcF7_V~YnYa<=VA)v31V(%_e7Kp<6CfH%|@;*rfoK_ zmJ*%|a2BMp<x{)&w!Tr?VArPMCe4AZE6+7via2aF-v`ICVxM)!n|fy%m#Wf|#Fd zwh)GSQpvb(5(!7acX%D9P>WLYZD3|)I1kjSvI|*qc(aE6*G_eKFCyl^K<0Px6 zpmQ~_QO9I_L_P<#xxFosWMv>0CetJZj8q*XjU&n&PM}if+|E`rG0jMJZYBqIu4Da^ zF;RNfu1%zf0zrCkk+ry)reiS^dRu8eLj;6bW_6U+Ofh2xS6Muf*;AnqpBXD=%$v1j z)%00Q&zLpqv{j2|EnKj8DG8tq1K5N7DrV1~zi`$ZF>{_+(u*9sv0?54v80`n>B&o% zE)>>?E)<(-f~;DFYiCdCMu)|aGOMQ?Yjn3kF3*8FTbv27Uc1aNsGwXuumO3Jj-q*{8ArczlR zjYU3>y8-#!WG)tTB|6E28E4CsBPg|7BZ(ntGuKu8OuuPP8Vw|Q%#aw`1SiC0o$2`6 z#DY#MRxQz7nq!DNBe8aLn|-ih)vD?7)(w~|v)dCL;9@x%!prN|PytptlznP@=P=q9 zC)V|J#8bSG4QXm=dpD-a5Vo}7FojEdyN0PEgAAP~*z!JY1}n813`6Yrp5Ygvnh@Z5N+Ej?7psfpfm zlf#zGYu|tjH&lIlx?}i~%-S+cEjdMpYO@yOp(UrcC(a#4kyT-F{M;dRXqGHZ&gzsw zP2t2b%m_`;8OgQ;PaCAzguv*{OtcbaZUSd*L81XkqVusqzz$Ey1d;AS`b*^UIB8fc zsxmL$xvq!m%!O>Kdof7DHzzkFcNiWQ&%@Q}FWa6h;nt!&V@zNu*A0Z);0*W-C~&Q)rx?NTrb)hZZ7E z*S4=SGw0Canc2*lEtG!ZT)Q~Y5#PdCI$LfvjJR#YIcEvkw1&ez+yW2M=$PTocFv8*xt{dgYz(IBVaKNHrw3$Pi!BexA&ejKtGKZe}g$MP9;l|@|)gbNza-zf9G2)O<+?C52Ez&dvk%f%S+S^ z@?MDzG0`*P-L31zxrsGPuoI;_6)tR9!)vQ#z_nbkIGL2lDvaKGvt<@PqrJ_nC>MU7 z=O#*>Hb=tbAT6c3krh#8S*o4A+nuo8kzq*M+c-97#5+3HVE1GioWfnlXUkCtElGSq zxfwm_ZX|=DtuIL=qzQEUoV{NbafFT7Ou*VfnA=ralq{6DZWcisRSO?_hbgSc%Ipg= zoK@Y{ZK&v`n^E=%)?=AbaqYo}5{A4W%1mxQi!uYz zOvPlcpjB8b#k^gD*(_$nJ6kb9S`r8*2<6^w*UzP3)M= zOm1jLCbI6;YkNz~f(nUr}HCaKMI^CxC>B-4qu8FB8( z(iCPH1&Ej{1BmhYJzElOHhM1Cw=tNe(;yp<_t<&79D7-{Wiu0U$dMG7GIvd!C76-f z0cC`_4fcn`WD=xhh0aYS&+>pNvAH`bHYer0z@BXBxk<64Ba!G5sV*x}PD^w*Q21D9 z28_ys1Z=i8iPR>6xtkKQv$SzfYbepKvOK^uS6&7oiHOC>i&F!s;g~|5LZrqY%)12a+wz-`?83!5I05MCR%vu~7#xmAByD>E(Wf@A_ zOiERJl@lVpbPIAkc5bO`o-@w{Y1UfkEUc`uHJNQWO668Kb3BQ|L!R~Wu#zY~f(E4H zUo7XH?R2&L!8tE&jm6CN_`1$yy1TtK&AOK+yW<^8aP!gGCK*;AhP!9u$oNbF@``mI z$I=-hdn|yNYRls$#Sw4f(Wv8{eHu zr&)yDq*JQ2H6qEZdP%3UW@CVQaH7@QFeBC5)lDl<*ZSUuyj{K=Kibks3=1w!lW4b+ zM(9skg{7|D9CXS`8J}eKN)5COr!n)eOHZ3g)EaH<$z((}kb^qX!%Vw8f&46N9+k1b z%%$42##({X?5fNfozCB6ag3xJWSWq5EgVzGmQ>R;Kk{-Y^EhW^b7(pONZ9D(BVC;`V`3Y3r9=3aGS7zm#M5H%ymo7P`QR3ZX9wJIyoG9th^AAt~{DIEUk2s zV4WziZPo(E(U>9FENeF8ax)adCWBMgT2kxqK&i8vC!vYu`NT?avSV4wOa^4)EP5(I zgT~p%N=UsXdmXzF2UKh>A61$6RW03gUf>_uO(LV&W{5#H~L|)5(wq7%AXkE!HC}yxS z4;`_SR!3=@W0hxctI+DJC6GhYagli=nMnush{-Y$__l*S4$(z8ipN%hrr)ehCQbvj ztecOGY!e&{hun7HHL)}BcG4QW*V>LZkP<>vj2Cgy1!_Fr>}kV)bD6&pZ@7wrg?LwF ziCBuCKhBq$jT#-OKOXP2E)yx>{rDlgIe2Rc(slXLGq{az)Jcj?Xr@|o(H82A%a=VJ zQf<(T8!gDL#nmP~#Ez`AO={xdbuNZx+5Td*ZmUzBtwSc{ zVSQm6lO^y)9OFy9u-ikivjsMy$F?!COOquwsiu5uWle{7zV_UG2H z_4L@!)_vH14)NwP_&tH%+IwnRGb+CgOV(z`kUm;6hqa(8t923H1x)Z~o;m*FnBhw4 zx6?L5lG>dOTa)-TI2p-Hfnz*uah26+)tbQdq@>MqTNYTzI@bZxOhFcym9=6CMl^|% zINoX`3+4b~_W^rJy45Ug=bEH_Atbvo&alcBjl*lPGK!p?wwiMe-+q3}^wuO2JkOpX zdQLdJ9;@xosBIhDeEY51c|FFzUub349%NW6lZ?lgQ}GGpNsnuR#720RW_}d8gyvlv zvOyFXH3?`%MFKNMxMa>1PKr*UEk>@kvZW}j#k;QOKo8|wQFAVj0nOi4utJVp1CL5K z+UpP^WX;m?kTH1$7EjbrAISQ4j4zF*%;Dp+EjYCAKxs(M-x6!aq;8BHWs@{|L_MM1k&JZ3$k!)AvL^YM?Bj?l8wa1aqyMC{1JOb4 zY=Ab!+k#%Tu{Kdf{ihM7C?spBb^}wBxW~i?W{^xLG*a0HTt(Sw;NaHDhgkmA%TKIDhLh^D*nPEMX4G=#HGpzp?MU4fmsynDJ%*0tHB<#ac5LjDoe|XR8B>&eRE7Z6aq3>rQXOEbGu7|aR)l<_eLEk z4k;luq@h6dyBxvFtYaK5#hB+RF$VT1!Ds;{2Vo)MYE%@ZXas)e9L3z1fh(yM_Vzn& z{9vg+ICv|5X%OS!6!6;p_~Jxx;G^KcQ^A2}{IKqBP2ymd;`h4;K7vp0&*eMIgcAks zAqA?_?^0pO%c?&(@Op6I0KQpK5*&EmB%hMFzaYc&lD7w5P^qKDeSsy3OG+fyQb(hQ zFv8%j;WxbKuK4}IcJiGP`iG1ZT6obb>=I}JIw9s*HC^?PI$xDCzOyZ<_ZM)j)& zQM6a38H2CWpv4fl#v=R%rD6XzbrUr!nlf-cSgsOxq^)cg-9x`!_uVEix& zz!57tW~dt%Vima~E|1x0ZoQz(!O39YgJ2^IG^+T?WRvB`ghB=y_@LC~l!X|Jj}ciJ zS?S1nnpsqW31>=psdf17Qt&cu9L&_qv~kdC^PAukIIzi&pDFPN%vOt4j6TeE z35VZbS;?;HAg6TbLPNazQ5A#OMx>EUNeSYpOMKJe!XS*^%$utzfU-o-~|P4`nYNAdNKPrO&3Hp_<#}@{4ww~)o=J* za1OE9ss09+&mD{g2ku1XhQZ&(e7loUi81g4LbEx}7}ymY_z4BV1%*XXnprG>c>{5p zCQQn)_%0eC7Hjh~sw!o{q7jPEL-k}E^Pmcq;c?`&>q%qq0s~FnYH6ey1u{~kAPIiN zrJTd3BF&&lr-w>e$u5^ig?Yw24ssX?4-D)gKWrh#Zy{_eVOs|-b&YZd8!@6rEI0^< zlQDykHak2B%IWtTg9XN5p)qI#iy`tc29}*^UV1*A7G>Qzh#)pC%y{zV9hHnQ8IAjr_!Kj1!f}WuovJrWY1PaM-=;vzqCRpl2TbZs>epmgLSu5EpnqAai zy25QMvC5j5v6`~|m2d%%Kb*mHk)6U)j2WvD*=U0DQ&mU+1}~_|hSDIWdbaNagH`|y z=EMexAekU#4cv;bD9eiuTK~a@P>$k*U{tt}wWcA=mLUhzq~=k>6@x*O<4T1ly2WIN z!)ywb^#gagrex|CBU7xPDe57|^T-dbz^pgXm6C_`c$eV|4#tCn*hz7i#bE?cxNtCT z47PhbT#1X!P=XR3pep>9wk*z&P&0(HF`qN=lWZ1RK~cf^Xhp_Kt5fKJ(ZT*7&2X%X zQYdY?~`+ z1$Fye@PxH-mJ3yL(B*{x5Pr=R90T`TSzskiG|qm5n`navA&Da|jZ1ZA7#*xCcrmhE})eD_=;^B zT`3nh^x)uVfPrhE*llu)fltF{rrcs?ZaoT6Nv@+Pj8bs(rr)7s*#hTeDwp>Rz}Tq+ zcT(Xl6fUGj-k}C)&k9B(%j}^f18S*N19=}ZoXAmiu#j7!;W6h@FbW-jDL|DX2G z=eLa_isNG^sHWJiVj)zaf`(O*ETwi5CsETXCPWHRBhm1qN$86;3YWdD~zv6x%Uh_j`}SNwByILP||iu4)uG0E9PQA%t2HO7{FX; z5=H?{VuW4UVW&I8M~=^)J}RG8WC<3OAe>M>o=X4fBYr2s`~JX}bfdI3tRus=_{_{3 z6fH2l)tl+3!n~TVJA6*?y=EBC9`o{-a&U;Au-C-rXt1&)aM$qH7nq)EnhF8j1AFop zvpM4)PxZkjjOF3Vi%fsOnW>8#DjZ)^+V_mp6ZQN|XYb2KvUHgWz=*EO|9NmHN26t$d!)=6mt~XVDsW|qlE%t8 z1w?|Jwil3lS0@{+W#9S&?HF|MQ*A=zoe#f`GUQWt!6`oMH4tk_^r#%O?xilprKalG z_UEV8)+Vu1Wy2_Qb#}I~)0nPZuQYDVOjl-VJ5!a-u(4U0tTkq~Hg~4yZtQGxSQ95N zOmWT>Kf``c=I!e0M{B8?`n6aCxz1Ts*TJ{=W||~*NQ9rVM<}U`O;ap+Z)eP{bE)Q3 zofJP27>*Cx>^h5FBWP!+bO{AM)XZ&n)ZP9G$ zY}|%JOCWpUwzKB08Fu?K^Dhg@>i{?iv&MuO^VQi9UPPxMrngh$!wvcV-CAlxYLQ_e zu6e4vci)`yZ@qu;et6m&gPJ)y85qEzZtM&*!?3#DLiE-5HP4QZ>YmTtujC}eI>+>5( z&_2hvf(&$(@Cx^3{Bl2zKKo1X{iPTWb3tC*D3_0ML3dknaT~1gcYxzp;8$4LmJC4d zsw=hTBm~k7kc1*xd3PB&KkXNK`wTcqj-d7P-64>^cX=j}V))+-tM7DY?13SAXw|&M z&#&|&zi1Du2JLHIBk`#3Kmn^M|<$3C@Qu2^X?iRa- zWRN9F0wzeJjAU7QqFpB`)Asd)an?LFmR}9rYT#(tSx2<%!tpIAiJPQ39b^^>mGx%n z89s^YPz$Q&gr*94iofi$EW5Vx^6G7aT3i>7H<*LQABP8F(>8Ul z2aU*^({=*8|6tMSkk*5pMl%ZIhjKtBhG3JRKGBE!{6tCwGR#jTE#%IwaG#(tr~Vw! N@6jP(=tc0iv17kYs@AFgOEf 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 diff --git a/obj/x86/Release/youtube-downloader.csprojAssemblyReference.cache b/obj/x86/Release/youtube-downloader.csprojAssemblyReference.cache index c81f00330f6d9b14e070ce4c62635153436bc995..a54278bd667fdafaa3b0801ffd84e83920531490 100644 GIT binary patch literal 90159 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 B8S4N5 delta 30 gcmZ2~fOQ4)27g8-GuFw0jGlZ9Kp?;dB7uM#0CA24x&QzG diff --git a/obj/x86/Release/youtube-downloader.exe b/obj/x86/Release/youtube-downloader.exe index 214a490f635598c70e52ba4cad409e81ebe3935f..1e98e63745e0d270b7a489a48f9c2b3dad200c63 100644 GIT binary patch literal 52224 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�Df%n)Oj{}yATSnYbQZ6=z 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 N@6jP(=tc0iv17kYs@AFgOEf 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