fix some stuff
This commit is contained in:
		
							parent
							
								
									1a12160d2b
								
							
						
					
					
						commit
						ceb6a6bc97
					
				| 
						 | 
					@ -1,30 +1,30 @@
 | 
				
			||||||
<Properties StartupConfiguration="{55AFA327-A943-42F1-BEAB-02A4CBF389FD}|Default" NuGet.AddPackagesDialog.IncludePrerelease="True">
 | 
					<Properties StartupConfiguration="{E26F8159-6B4B-4660-A7A4-D0333DFEF0DD}|Default" NuGet.AddPackagesDialog.IncludePrerelease="True">
 | 
				
			||||||
  <MonoDevelop.Ide.Workbench ActiveDocument="Server/Models/SavedVideo.cs">
 | 
					  <MonoDevelop.Ide.Workbench ActiveDocument="Server/Functions/ffmpeg.cs">
 | 
				
			||||||
    <Files>
 | 
					    <Files>
 | 
				
			||||||
      <File FileName="Program.cs" Line="54" Column="14" />
 | 
					      <File FileName="Program.cs" Line="230" Column="12" />
 | 
				
			||||||
      <File FileName="Server/Models/SavedVideo.cs" Line="41" Column="35" />
 | 
					      <File FileName="Server/Models/SavedVideo.cs" Line="41" Column="35" />
 | 
				
			||||||
      <File FileName="Server/Models/InfomationQueueItem.cs" Line="24" Column="41" />
 | 
					      <File FileName="Server/Models/InfomationQueueItem.cs" Line="24" Column="41" />
 | 
				
			||||||
      <File FileName="Server/Models/VideoDownloadProgress.cs" Line="7" Column="33" />
 | 
					      <File FileName="Server/Models/VideoDownloadProgress.cs" Line="5" Column="5" />
 | 
				
			||||||
      <File FileName="Server/Functions/Downloader.cs" Line="39" Column="24" />
 | 
					      <File FileName="Server/Functions/Downloader.cs" Line="132" Column="43" />
 | 
				
			||||||
      <File FileName="Server/Functions/SavedMedia.cs" Line="1" Column="1" />
 | 
					      <File FileName="Server/Functions/SavedMedia.cs" Line="1" Column="1" />
 | 
				
			||||||
      <File FileName="Site/YouTubeSite.cs" Line="13" Column="54" />
 | 
					      <File FileName="Site/YouTubeSite.cs" Line="13" Column="41" />
 | 
				
			||||||
      <File FileName="../../../usr/lib/mono/msbuild/15.0/bin/Microsoft.Common.CurrentVersion.targets" Line="2101" Column="5" />
 | 
					      <File FileName="../../../usr/lib/mono/msbuild/15.0/bin/Microsoft.Common.CurrentVersion.targets" Line="2101" Column="5" />
 | 
				
			||||||
      <File FileName="packages.config" Line="31" Column="1" />
 | 
					 | 
				
			||||||
      <File FileName="Site/packages.config" Line="1" Column="1" />
 | 
					      <File FileName="Site/packages.config" Line="1" Column="1" />
 | 
				
			||||||
      <File FileName="Build Output 1:02 PM 2021-08-01.binlog" />
 | 
					      <File FileName="ffmpeg.cs" Line="1" Column="1" />
 | 
				
			||||||
 | 
					      <File FileName="Server/Models/YoutubeDownloaderRequest.cs" Line="42" Column="3" />
 | 
				
			||||||
 | 
					      <File FileName="Server/Models/YoutubeDownloaderResponse.cs" Line="1" Column="3" />
 | 
				
			||||||
 | 
					      <File FileName="Server/Functions/ffmpeg.cs" Line="1" Column="1" />
 | 
				
			||||||
    </Files>
 | 
					    </Files>
 | 
				
			||||||
    <Pads>
 | 
					    <Pads>
 | 
				
			||||||
      <Pad Id="ProjectPad">
 | 
					      <Pad Id="ProjectPad">
 | 
				
			||||||
        <State name="__root__">
 | 
					        <State name="__root__">
 | 
				
			||||||
          <Node name="youtube-downloader" expanded="True">
 | 
					          <Node name="youtube-downloader" expanded="True">
 | 
				
			||||||
            <Node name="Site" expanded="True">
 | 
					            <Node name="youtube-downloader" expanded="True">
 | 
				
			||||||
              <Node name="References" expanded="True" />
 | 
					 | 
				
			||||||
            </Node>
 | 
					 | 
				
			||||||
            <Node name="youtube-downloader" expanded="True" selected="True">
 | 
					 | 
				
			||||||
              <Node name="Properties" expanded="True" />
 | 
					              <Node name="Properties" expanded="True" />
 | 
				
			||||||
              <Node name="Server" expanded="True">
 | 
					              <Node name="Server" expanded="True">
 | 
				
			||||||
                <Node name="Functions" expanded="True" />
 | 
					                <Node name="Functions" expanded="True">
 | 
				
			||||||
                <Node name="Models" expanded="True" />
 | 
					                  <Node name="ffmpeg.cs" selected="True" />
 | 
				
			||||||
 | 
					                </Node>
 | 
				
			||||||
              </Node>
 | 
					              </Node>
 | 
				
			||||||
            </Node>
 | 
					            </Node>
 | 
				
			||||||
          </Node>
 | 
					          </Node>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										412
									
								
								Downloader.cs
								
								
								
								
							
							
						
						
									
										412
									
								
								Downloader.cs
								
								
								
								
							| 
						 | 
					@ -1,412 +0,0 @@
 | 
				
			||||||
using System;
 | 
					 | 
				
			||||||
using System.Collections.Generic;
 | 
					 | 
				
			||||||
using System.Linq;
 | 
					 | 
				
			||||||
using System.Text;
 | 
					 | 
				
			||||||
using System.Threading.Tasks;
 | 
					 | 
				
			||||||
using YoutubeExplode.Videos;
 | 
					 | 
				
			||||||
using YoutubeExplode;
 | 
					 | 
				
			||||||
using System.Net.Http;
 | 
					 | 
				
			||||||
using System.Net;
 | 
					 | 
				
			||||||
using System.IO;
 | 
					 | 
				
			||||||
using TessesYoutubeDownloader.Server.Models;
 | 
					 | 
				
			||||||
using Newtonsoft.Json;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
using YoutubeExplode.Videos.Streams;
 | 
					 | 
				
			||||||
using YoutubeExplode.Channels;
 | 
					 | 
				
			||||||
using YoutubeExplode.Playlists;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace youtube_downloader.Server.Functions
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    public class Downloader
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        public static YoutubeClient CreateYoutubeClient()
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            ServicePointManager
 | 
					 | 
				
			||||||
.ServerCertificateValidationCallback +=
 | 
					 | 
				
			||||||
(sender, cert, chain, sslPolicyErrors) => true;
 | 
					 | 
				
			||||||
            HttpClientHandler handler = new HttpClientHandler();
 | 
					 | 
				
			||||||
            handler.ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;
 | 
					 | 
				
			||||||
            Http = new HttpClient(handler);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            return new YoutubeExplode.YoutubeClient(Http);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        internal static VideoDownloadProgress GetProgress()
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            return P;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        static HttpClient Http;
 | 
					 | 
				
			||||||
        YoutubeClient ytc = CreateYoutubeClient();
 | 
					 | 
				
			||||||
        static VideoDownloadProgress P=new VideoDownloadProgress();
 | 
					 | 
				
			||||||
        Progress<double> DownloadP =new Progress<double>( (e)=> { P.Progress = (int)(e * 100.0); });
 | 
					 | 
				
			||||||
        
 | 
					 | 
				
			||||||
        List<SavedVideoObject> Queue = new List<SavedVideoObject>();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        internal static string GetQueue()
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            string q;
 | 
					 | 
				
			||||||
            lock (DL.Queue)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                q = JsonConvert.SerializeObject(DL.Queue.Select<SavedVideoObject, SavedVideo>(o => o.Video)) ;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            return q;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        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)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                _ = ex;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        public bool Continue(string v)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            if (File.Exists(v))
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                using(var f = File.OpenRead(v))
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    return f.Length == 0;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            return true;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        private string gStorageLocation()
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            if (System.IO.File.Exists("loc.txt"))
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                string loc=System.IO.File.ReadAllText("loc.txt");
 | 
					 | 
				
			||||||
                try
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    System.IO.Directory.CreateDirectory(loc);
 | 
					 | 
				
			||||||
                    if (System.IO.Directory.Exists(loc))
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        return loc;
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                }catch(Exception ex)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            return Environment.CurrentDirectory;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        public string StorageLocation { get { return gStorageLocation(); } }
 | 
					 | 
				
			||||||
        private async Task _DownloadVideo(VideoId videoId,Resolution res)
 | 
					 | 
				
			||||||
        {   string infpath=  GetPath(true, "Info", videoId + ".json");
 | 
					 | 
				
			||||||
            SavedVideoObject sv;
 | 
					 | 
				
			||||||
            bool exist = File.Exists(videoId);
 | 
					 | 
				
			||||||
            if (exist)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                sv = new SavedVideoObject();
 | 
					 | 
				
			||||||
                sv.Resolution = res;
 | 
					 | 
				
			||||||
                sv.Video = Newtonsoft.Json.JsonConvert.DeserializeObject<SavedVideo>(File.ReadAllText(infpath));
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            else
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                var vinfo = await ytc.Videos.GetAsync(videoId);
 | 
					 | 
				
			||||||
                
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                 sv = SavedVideo.CreateFrom(res, vinfo, _DownloadThumbnail);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if (!exist)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                File.WriteAllText(infpath, JsonConvert.SerializeObject(sv.Video));
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            lock (Queue)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                Queue.Insert(0,sv); //new elements get added to begining
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        public async Task DownloadThread()
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            do
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                bool canDownload = false;
 | 
					 | 
				
			||||||
                SavedVideoObject v;
 | 
					 | 
				
			||||||
                lock (Queue)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                   canDownload= Queue.Count > 0;
 | 
					 | 
				
			||||||
                    if (canDownload)
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        v = Queue[0];
 | 
					 | 
				
			||||||
                        Queue.RemoveAt(0);
 | 
					 | 
				
			||||||
                        P.Saved = v.Video;
 | 
					 | 
				
			||||||
                        Console.WriteLine($"Download: {v.Video.Title}");
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    else
 | 
					 | 
				
			||||||
                    {
 | 
					 | 
				
			||||||
                        v = null;
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                if (canDownload)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    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");
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                            if (Continue(mypathComplete))
 | 
					 | 
				
			||||||
                            {
 | 
					 | 
				
			||||||
                                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);
 | 
					 | 
				
			||||||
                                await ytc.Videos.Streams.DownloadAsync(best,mypath, p.Video);
 | 
					 | 
				
			||||||
                                IProgress<double> pv = p.Video;
 | 
					 | 
				
			||||||
                                pv.Report(1);
 | 
					 | 
				
			||||||
                                if (Continue(mypathCompleteAudio))
 | 
					 | 
				
			||||||
                                {
 | 
					 | 
				
			||||||
                                    await ytc.Videos.Streams.DownloadAsync(best2, mypathaudio,p.Audio);
 | 
					 | 
				
			||||||
                                    File.Move(mypathaudio, mypathCompleteAudio);
 | 
					 | 
				
			||||||
                                }
 | 
					 | 
				
			||||||
                                IProgress<double> 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;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                                await ytc.Videos.Streams.DownloadAsync(best, mypath2, DownloadP);
 | 
					 | 
				
			||||||
                                File.Move(mypath2, mypath2Complete);
 | 
					 | 
				
			||||||
                            }
 | 
					 | 
				
			||||||
                          
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                            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;
 | 
					 | 
				
			||||||
                                await ytc.Videos.Streams.DownloadAsync(best2, mypath3, DownloadP);
 | 
					 | 
				
			||||||
                                File.Move(mypath3, mypath3Complete);
 | 
					 | 
				
			||||||
                            }
 | 
					 | 
				
			||||||
                            break;
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                System.Threading.Thread.Sleep(1);
 | 
					 | 
				
			||||||
            } 
 | 
					 | 
				
			||||||
            while (true);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        private void _DownloadThumbnail(int w,int h,string id,string tnail)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            try
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                string p = GetPath(true,"Thumbnails", w.ToString() + 'x' + h.ToString(), id + ".jpg");
 | 
					 | 
				
			||||||
                if (!File.Exists(p))
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    ffmpeg.download_thumbnail(tnail, p);
 | 
					 | 
				
			||||||
                 }
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            catch(Exception ex)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                _ = ex;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        internal static List<SavedVideoObject> GetQueueItems()
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            return DL.Queue;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        private async Task _DownloadChannel(ChannelId id,Resolution res)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
           var c=await ytc.Channels.GetAsync(id);
 | 
					 | 
				
			||||||
            SavedChannel c2 = SavedChannel.FromChannel(c, _DownloadThumbnail);
 | 
					 | 
				
			||||||
            string infpath = GetPath(true, "Channel", id + ".json");
 | 
					 | 
				
			||||||
             File.WriteAllText(infpath, JsonConvert.SerializeObject(c2));
 | 
					 | 
				
			||||||
            var cvids = ytc.Channels.GetUploadsAsync(id).GetAsyncEnumerator();
 | 
					 | 
				
			||||||
            while (await cvids.MoveNextAsync())
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                await _DownloadVideo(cvids.Current.Id, res);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        private async Task _DownloadPlaylist(PlaylistId id,Resolution res)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            SavedPlaylist pl =await SavedPlaylist.FromPlaylistId(res, ytc, id, DownloadVideo, _DownloadThumbnail);
 | 
					 | 
				
			||||||
            string infpath = GetPath(true, "Playlist", id + ".json");
 | 
					 | 
				
			||||||
            File.WriteAllText(infpath, JsonConvert.SerializeObject(pl));
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        private async Task _DownloadUser(UserName name, Resolution res)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            var c = await ytc.Channels.GetByUserAsync(name);
 | 
					 | 
				
			||||||
            SavedChannel c2 = SavedChannel.FromChannel(c, _DownloadThumbnail);
 | 
					 | 
				
			||||||
            string infpath = GetPath(true, "Channels", c.Id + ".json");
 | 
					 | 
				
			||||||
            File.WriteAllText(infpath, JsonConvert.SerializeObject(c2));
 | 
					 | 
				
			||||||
            var cvids = ytc.Channels.GetUploadsAsync(c.Id).GetAsyncEnumerator();
 | 
					 | 
				
			||||||
            while (await cvids.MoveNextAsync())
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                await _DownloadVideo(cvids.Current.Id, res);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        public static void DownloadVideo(VideoId v,Resolution res)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            DL._DownloadVideo(v, res).GetAwaiter().GetResult();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        public static void DownloadVideo(VideoId v)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            DownloadVideo(v, Resolution.NoConvert);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        public static void DownloadPlaylist(PlaylistId id,Resolution res)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            DL._DownloadPlaylist(id, res).GetAwaiter().GetResult();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        public static void DownloadPlaylist(PlaylistId id)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            DownloadPlaylist(id, Resolution.NoConvert);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        public static void DownloadChannel(ChannelId id,Resolution res)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            DL._DownloadChannel(id, res).GetAwaiter().GetResult();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        public static void DownloadChannel(ChannelId id)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            DownloadChannel(id, Resolution.NoConvert);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        public static void DownloadUser(UserName name, Resolution res)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            DL._DownloadUser(name, res).GetAwaiter().GetResult();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        public static void DownloadUser(UserName name)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            DownloadUser(name, Resolution.NoConvert);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        public string GetPath(bool createParent,params string[] _path)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            if (createParent)
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                string dir = GetPath(_path);
 | 
					 | 
				
			||||||
                try
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    Directory.CreateDirectory(Path.GetDirectoryName(dir));
 | 
					 | 
				
			||||||
                }catch(Exception ex)
 | 
					 | 
				
			||||||
                {
 | 
					 | 
				
			||||||
                    _ = ex;
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
                return dir;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
            else
 | 
					 | 
				
			||||||
            {
 | 
					 | 
				
			||||||
                return GetPath(_path);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        private string GetPath(params string[] _path)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            string[] array2 = new string[_path.Length + 1];
 | 
					 | 
				
			||||||
            array2[0] = StorageLocation;
 | 
					 | 
				
			||||||
            Array.Copy(_path, 0, array2, 1,_path.Length);
 | 
					 | 
				
			||||||
            return System.IO.Path.Combine(array2);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        public static Downloader DL = new Downloader();
 | 
					 | 
				
			||||||
       
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
							
								
								
									
										46
									
								
								Program.cs
								
								
								
								
							
							
						
						
									
										46
									
								
								Program.cs
								
								
								
								
							| 
						 | 
					@ -31,6 +31,20 @@ namespace youtube_downloader
 | 
				
			||||||
            // we need to get our app name so that 
 | 
					            // we need to get our app name so that 
 | 
				
			||||||
            // we can create unique names for our mutex and our pipe
 | 
					            // we can create unique names for our mutex and our pipe
 | 
				
			||||||
            string webSitePath = Server.Functions.Downloader.DL.GetPath(true, "WebSite");
 | 
					            string 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");*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            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));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            },"POST")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Route.Add("/", (rq, rp, args) =>
 | 
					            Route.Add("/", (rq, rp, args) =>
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                rp.AsFile(rq, Path.Combine(webSitePath, "index.html"));
 | 
					                rp.AsFile(rq, Path.Combine(webSitePath, "index.html"));
 | 
				
			||||||
| 
						 | 
					@ -41,6 +55,13 @@ namespace youtube_downloader
 | 
				
			||||||
                string json = JsonConvert.SerializeObject(Server.Functions.Downloader.Search(search));
 | 
					                string json = JsonConvert.SerializeObject(Server.Functions.Downloader.Search(search));
 | 
				
			||||||
                rp.AsText(json, "application/json");
 | 
					                rp.AsText(json, "application/json");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					             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");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            Route.Add("/api/Storage/GetDirectories/{Path}", (rq, rp, args) =>
 | 
					            Route.Add("/api/Storage/GetDirectories/{Path}", (rq, rp, args) =>
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
| 
						 | 
					@ -137,11 +158,21 @@ namespace youtube_downloader
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                rp.AsRedirect("/");
 | 
					                rp.AsRedirect("/");
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
            Route.Add("/api/AddUserOnly/{R}/{Id}", (rq, rp, args) =>
 | 
					            Route.Add("/api/AddUserOnly/{Id}", (rq, rp, args) =>
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                Server.Functions.Downloader.DownloadUserOnly(System.Web.HttpUtility.UrlDecode(args["Id"]));
 | 
					                Server.Functions.Downloader.DownloadUserOnly(System.Web.HttpUtility.UrlDecode(args["Id"]));
 | 
				
			||||||
                rp.AsRedirect("/");
 | 
					                rp.AsRedirect("/");
 | 
				
			||||||
            });
 | 
					            });
 | 
				
			||||||
 | 
					            Route.Add("/api/AddPlaylistOnly/{Id}", (rq, rp, args) =>
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                Server.Functions.Downloader.DownloadPlaylistOnly(System.Web.HttpUtility.UrlDecode(args["Id"]));
 | 
				
			||||||
 | 
					                rp.AsRedirect("/");
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
 | 
					            Route.Add("/api/AddVideoInfo/{Id}", (rq, rp, args) =>
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                Server.Functions.Downloader.DownloadVideoInfo(System.Web.HttpUtility.UrlDecode(args["Id"]));
 | 
				
			||||||
 | 
					                rp.AsRedirect("/");
 | 
				
			||||||
 | 
					            });
 | 
				
			||||||
            Route.Add("/api/AddUserRes/{R}/{Id}", (rq, rp, args) =>
 | 
					            Route.Add("/api/AddUserRes/{R}/{Id}", (rq, rp, args) =>
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
                Server.Functions.Downloader.DownloadUser(System.Web.HttpUtility.UrlDecode(args["Id"]), (Resolution)int.Parse(args["R"]));
 | 
					                Server.Functions.Downloader.DownloadUser(System.Web.HttpUtility.UrlDecode(args["Id"]), (Resolution)int.Parse(args["R"]));
 | 
				
			||||||
| 
						 | 
					@ -202,8 +233,17 @@ namespace youtube_downloader
 | 
				
			||||||
                HttpServer.ListenAsync(3250, CancellationToken.None, Route.OnHttpRequestAsync).Wait();
 | 
					                HttpServer.ListenAsync(3250, CancellationToken.None, Route.OnHttpRequestAsync).Wait();
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        /*
 | 
				
			||||||
 | 
					        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<YoutubeDownloaderRequest>(streamReader.ReadToEnd()));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        private static YoutubeDownloaderResponse HandleRequest(YoutubeDownloaderRequest data)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        }*/
 | 
				
			||||||
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -321,7 +321,9 @@ namespace youtube_downloader.Server.Functions
 | 
				
			||||||
                                                myProgress.Report(1);
 | 
					                                                myProgress.Report(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                                            }
 | 
					                                            }
 | 
				
			||||||
 | 
					                                             /* This is why videos get corrupted */
 | 
				
			||||||
                                            srcStrm.Seek(destStrm.Length, SeekOrigin.Begin);
 | 
					                                            srcStrm.Seek(destStrm.Length, SeekOrigin.Begin);
 | 
				
			||||||
 | 
					                                            destStrm.Seek(destStrm.Length,SeekOrigin.Begin);
 | 
				
			||||||
                                            byte[] buffer = new byte[4096];
 | 
					                                            byte[] buffer = new byte[4096];
 | 
				
			||||||
                                            int read = 0;
 | 
					                                            int read = 0;
 | 
				
			||||||
                                            do
 | 
					                                            do
 | 
				
			||||||
| 
						 | 
					@ -357,7 +359,10 @@ namespace youtube_downloader.Server.Functions
 | 
				
			||||||
                                                    myProgress.Report(1);
 | 
					                                                    myProgress.Report(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                                                }
 | 
					                                                }
 | 
				
			||||||
 | 
					                                                 /* This is why videos get corrupted */
 | 
				
			||||||
                                                srcStrm.Seek(destStrm.Length, SeekOrigin.Begin);
 | 
					                                                srcStrm.Seek(destStrm.Length, SeekOrigin.Begin);
 | 
				
			||||||
 | 
					                                                destStrm.Seek(destStrm.Length,SeekOrigin.Begin);
 | 
				
			||||||
 | 
					                                           
 | 
				
			||||||
                                                byte[] buffer = new byte[4096];
 | 
					                                                byte[] buffer = new byte[4096];
 | 
				
			||||||
                                                int read = 0;
 | 
					                                                int read = 0;
 | 
				
			||||||
                                                do
 | 
					                                                do
 | 
				
			||||||
| 
						 | 
					@ -407,7 +412,9 @@ namespace youtube_downloader.Server.Functions
 | 
				
			||||||
                                                myProgress.Report(1);
 | 
					                                                myProgress.Report(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                                            }
 | 
					                                            }
 | 
				
			||||||
 | 
					                                            /* This is why videos get corrupted */
 | 
				
			||||||
                                            srcStrm.Seek(destStrm.Length, SeekOrigin.Begin);
 | 
					                                            srcStrm.Seek(destStrm.Length, SeekOrigin.Begin);
 | 
				
			||||||
 | 
					                                            destStrm.Seek(destStrm.Length,SeekOrigin.Begin);
 | 
				
			||||||
                                            byte[] buffer = new byte[4096];
 | 
					                                            byte[] buffer = new byte[4096];
 | 
				
			||||||
                                            int read = 0;
 | 
					                                            int read = 0;
 | 
				
			||||||
                                            do
 | 
					                                            do
 | 
				
			||||||
| 
						 | 
					@ -451,7 +458,9 @@ namespace youtube_downloader.Server.Functions
 | 
				
			||||||
                                                myProgress.Report(1);
 | 
					                                                myProgress.Report(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                                            }
 | 
					                                            }
 | 
				
			||||||
 | 
					                                             /* This is why videos get corrupted */
 | 
				
			||||||
                                            srcStrm.Seek(destStrm.Length, SeekOrigin.Begin);
 | 
					                                            srcStrm.Seek(destStrm.Length, SeekOrigin.Begin);
 | 
				
			||||||
 | 
					                                            destStrm.Seek(destStrm.Length,SeekOrigin.Begin);
 | 
				
			||||||
                                           byte[] buffer = new byte[4096];
 | 
					                                           byte[] buffer = new byte[4096];
 | 
				
			||||||
                                            int read = 0;
 | 
					                                            int read = 0;
 | 
				
			||||||
                                            do
 | 
					                                            do
 | 
				
			||||||
| 
						 | 
					@ -476,7 +485,7 @@ namespace youtube_downloader.Server.Functions
 | 
				
			||||||
                        Console.WriteLine(ex.Message);
 | 
					                        Console.WriteLine(ex.Message);
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                System.Threading.Thread.Sleep(1);
 | 
					                System.Threading.Thread.Sleep(4000);
 | 
				
			||||||
            } 
 | 
					            } 
 | 
				
			||||||
            while (true);
 | 
					            while (true);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
| 
						 | 
					@ -517,33 +526,43 @@ namespace youtube_downloader.Server.Functions
 | 
				
			||||||
                _ = ex;
 | 
					                _ = ex;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        public static async Task<List<SavedMedia>> Search(string text)
 | 
					        public static async Task<List<SavedMedia>> Search(string text,bool downloadThumbs=true)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            List<SavedMedia> media = new List<SavedMedia>();
 | 
					            List<SavedMedia> media = new List<SavedMedia>();
 | 
				
			||||||
            try
 | 
					            try
 | 
				
			||||||
            {
 | 
					            {
 | 
				
			||||||
               
 | 
					               
 | 
				
			||||||
                await DL.ytc.Search.GetVideosAsync(text).ForEachAsync((e) => { 
 | 
					                await DL.ytc.Search.GetVideosAsync(text).ForEachAsync((e) =>
 | 
				
			||||||
                    foreach(var t in e.Thumbnails)
 | 
					                {
 | 
				
			||||||
 | 
					                    if (downloadThumbs)
 | 
				
			||||||
                    {
 | 
					                    {
 | 
				
			||||||
                        DL._DownloadThumbnail2(t.Resolution.Width, t.Resolution.Height, e.Id, t.Url);
 | 
					 | 
				
			||||||
                    }
 | 
					 | 
				
			||||||
                    media.Add(new SavedMedia() {Title = e.Title, Id = e.Id, Kind = InfoType.Video }); 
 | 
					 | 
				
			||||||
                
 | 
					 | 
				
			||||||
                });
 | 
					 | 
				
			||||||
                await DL.ytc.Search.GetPlaylistsAsync(text).ForEachAsync((e) => {
 | 
					 | 
				
			||||||
                        foreach (var t in e.Thumbnails)
 | 
					                        foreach (var t in e.Thumbnails)
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                            DL._DownloadThumbnail2(t.Resolution.Width, t.Resolution.Height, e.Id, t.Url);
 | 
					                            DL._DownloadThumbnail2(t.Resolution.Width, t.Resolution.Height, e.Id, t.Url);
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    media.Add(new SavedMedia() { Title = e.Title, Id = e.Id, Kind = InfoType.Video });
 | 
				
			||||||
 | 
					                    
 | 
				
			||||||
 | 
					                });
 | 
				
			||||||
 | 
					                await DL.ytc.Search.GetPlaylistsAsync(text).ForEachAsync((e) => {
 | 
				
			||||||
 | 
					                    if (downloadThumbs)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
 | 
					                        foreach (var t in e.Thumbnails)
 | 
				
			||||||
 | 
					                        {
 | 
				
			||||||
 | 
					                            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) => {
 | 
					                await DL.ytc.Search.GetChannelsAsync(text).ForEachAsync((e) => {
 | 
				
			||||||
 | 
					                    if (downloadThumbs)
 | 
				
			||||||
 | 
					                    {
 | 
				
			||||||
                        foreach (var t in e.Thumbnails)
 | 
					                        foreach (var t in e.Thumbnails)
 | 
				
			||||||
                        {
 | 
					                        {
 | 
				
			||||||
                            DL._DownloadThumbnail2(t.Resolution.Width, t.Resolution.Height, e.Id, t.Url);
 | 
					                            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 }); 
 | 
				
			||||||
                
 | 
					                
 | 
				
			||||||
                });
 | 
					                });
 | 
				
			||||||
| 
						 | 
					@ -571,6 +590,19 @@ namespace youtube_downloader.Server.Functions
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        public static void DownloadVideoInfo(string id, Resolution res)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            VideoId? v = VideoId.TryParse(id);
 | 
				
			||||||
 | 
					            if (v.HasValue)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                InfomationQueueItem item = new InfomationQueueItem(v.Value, res, false);
 | 
				
			||||||
 | 
					                lock (DL.infoQueue)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    DL.infoQueue.Insert(0, item);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        public static void DownloadVideo(string v)
 | 
					        public static void DownloadVideo(string v)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            DownloadVideo(v, Resolution.NoConvert);
 | 
					            DownloadVideo(v, Resolution.NoConvert);
 | 
				
			||||||
| 
						 | 
					@ -587,6 +619,18 @@ namespace youtube_downloader.Server.Functions
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					        public static void DownloadPlaylistOnly(string id, Resolution res)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            PlaylistId? v = PlaylistId.TryParse(id);
 | 
				
			||||||
 | 
					            if (v.HasValue)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                InfomationQueueItem item = new InfomationQueueItem(v.Value, res, false);
 | 
				
			||||||
 | 
					                lock (DL.infoQueue)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    DL.infoQueue.Insert(0, item);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        public static void DownloadPlaylist(string id)
 | 
					        public static void DownloadPlaylist(string id)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
            DownloadPlaylist(id, Resolution.NoConvert);
 | 
					            DownloadPlaylist(id, Resolution.NoConvert);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,125 +15,25 @@
 | 
				
			||||||
    "suspend" : "hybrid"
 | 
					    "suspend" : "hybrid"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "memory" : {
 | 
					  "memory" : {
 | 
				
			||||||
    "minor_gc_time" : "5782050483",
 | 
					    "minor_gc_time" : "11806297971",
 | 
				
			||||||
    "major_gc_time" : "95219144",
 | 
					    "major_gc_time" : "48644374",
 | 
				
			||||||
    "minor_gc_count" : "94700",
 | 
					    "minor_gc_count" : "149297",
 | 
				
			||||||
    "major_gc_count" : "99",
 | 
					    "major_gc_count" : "58",
 | 
				
			||||||
    "major_gc_time_concurrent" : "461311594"
 | 
					    "major_gc_time_concurrent" : "154359880"
 | 
				
			||||||
 },
 | 
					 },
 | 
				
			||||||
  "threads" : [
 | 
					  "threads" : [
 | 
				
			||||||
 {
 | 
					 | 
				
			||||||
    "is_managed" : false,
 | 
					 | 
				
			||||||
    "offset_free_hash" : "0x0",
 | 
					 | 
				
			||||||
    "offset_rich_hash" : "0x0",
 | 
					 | 
				
			||||||
    "crashed" : false,
 | 
					 | 
				
			||||||
    "native_thread_id" : "0x7f2710426fc0",
 | 
					 | 
				
			||||||
    "thread_info_addr" : "0x56087de06310",
 | 
					 | 
				
			||||||
    "thread_name" : "GUI Thread",
 | 
					 | 
				
			||||||
    "ctx" : {
 | 
					 | 
				
			||||||
      "IP" : "0x7f271097b618",
 | 
					 | 
				
			||||||
      "SP" : "0x7ffdb624d370",
 | 
					 | 
				
			||||||
      "BP" : "0x5608857871c0"
 | 
					 | 
				
			||||||
  },
 | 
					 | 
				
			||||||
    "unmanaged_frames" : [
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
      "is_managed" : "false",
 | 
					 | 
				
			||||||
      "native_address" : "0x56087badc4c9",
 | 
					 | 
				
			||||||
      "native_offset" : "0x00000"
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
,
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
      "is_managed" : "false",
 | 
					 | 
				
			||||||
      "native_address" : "0x56087bcc2319",
 | 
					 | 
				
			||||||
      "native_offset" : "0x00000"
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
,
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
      "is_managed" : "false",
 | 
					 | 
				
			||||||
      "native_address" : "0x56087bcc3655",
 | 
					 | 
				
			||||||
      "native_offset" : "0x00000"
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
,
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
      "is_managed" : "false",
 | 
					 | 
				
			||||||
      "native_address" : "0x56087bccc6c7",
 | 
					 | 
				
			||||||
      "native_offset" : "0x00000"
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
,
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
      "is_managed" : "false",
 | 
					 | 
				
			||||||
      "native_address" : "0x56087bb315b5",
 | 
					 | 
				
			||||||
      "native_offset" : "0x00000"
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
,
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
      "is_managed" : "false",
 | 
					 | 
				
			||||||
      "native_address" : "0x7f271097d3c0",
 | 
					 | 
				
			||||||
      "native_offset" : "0x00000"
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
,
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
      "is_managed" : "false",
 | 
					 | 
				
			||||||
      "native_address" : "0x7f271097b618",
 | 
					 | 
				
			||||||
      "native_offset" : "0x00000"
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
,
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
      "is_managed" : "false",
 | 
					 | 
				
			||||||
      "native_address" : "0x7f271097b743",
 | 
					 | 
				
			||||||
      "native_offset" : "0x00000"
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
,
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
      "is_managed" : "false",
 | 
					 | 
				
			||||||
      "native_address" : "0x56087bd0e29c",
 | 
					 | 
				
			||||||
      "native_offset" : "0x00000"
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
,
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
      "is_managed" : "false",
 | 
					 | 
				
			||||||
      "native_address" : "0x56087baab6ff",
 | 
					 | 
				
			||||||
      "native_offset" : "0x00000"
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
,
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
      "is_managed" : "false",
 | 
					 | 
				
			||||||
      "native_address" : "0x56087bab2f88",
 | 
					 | 
				
			||||||
      "native_offset" : "0x00000"
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
,
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
      "is_managed" : "false",
 | 
					 | 
				
			||||||
      "native_address" : "0x56087baa1f1c",
 | 
					 | 
				
			||||||
      "native_offset" : "0x00000"
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
,
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
      "is_managed" : "false",
 | 
					 | 
				
			||||||
      "native_address" : "0x7f271044f0b3",
 | 
					 | 
				
			||||||
      "native_offset" : "0x00000"
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
,
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
      "is_managed" : "false",
 | 
					 | 
				
			||||||
      "native_address" : "0x56087baa253a",
 | 
					 | 
				
			||||||
      "native_offset" : "0x00000"
 | 
					 | 
				
			||||||
   }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  ]
 | 
					 | 
				
			||||||
 },
 | 
					 | 
				
			||||||
 {
 | 
					 {
 | 
				
			||||||
    "is_managed" : true,
 | 
					    "is_managed" : true,
 | 
				
			||||||
    "offset_free_hash" : "0x12ecaa89f",
 | 
					    "offset_free_hash" : "0x12ecaa89f",
 | 
				
			||||||
    "offset_rich_hash" : "0x12ecaa921",
 | 
					    "offset_rich_hash" : "0x12ecaa921",
 | 
				
			||||||
    "crashed" : true,
 | 
					    "crashed" : true,
 | 
				
			||||||
    "native_thread_id" : "0x7f270db93700",
 | 
					    "native_thread_id" : "0x7f6018793700",
 | 
				
			||||||
    "thread_info_addr" : "0x7f2708000b60",
 | 
					    "thread_info_addr" : "0x7f6014000b60",
 | 
				
			||||||
    "thread_name" : "Finalizer",
 | 
					    "thread_name" : "Finalizer",
 | 
				
			||||||
    "ctx" : {
 | 
					    "ctx" : {
 | 
				
			||||||
      "IP" : "0x7f27104a1a61",
 | 
					      "IP" : "0x7f601afb9a61",
 | 
				
			||||||
      "SP" : "0x7f270db922b0",
 | 
					      "SP" : "0x7f60187922b0",
 | 
				
			||||||
      "BP" : "0x7f270db92820"
 | 
					      "BP" : "0x7f6018792820"
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
    "managed_frames" : [
 | 
					    "managed_frames" : [
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
| 
						 | 
					@ -222,79 +122,79 @@
 | 
				
			||||||
  "unmanaged_frames" : [
 | 
					  "unmanaged_frames" : [
 | 
				
			||||||
 {
 | 
					 {
 | 
				
			||||||
    "is_managed" : "false",
 | 
					    "is_managed" : "false",
 | 
				
			||||||
    "native_address" : "0x56087badc4c9",
 | 
					    "native_address" : "0x55db49a534c9",
 | 
				
			||||||
    "native_offset" : "0x00000"
 | 
					    "native_offset" : "0x00000"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
,
 | 
					,
 | 
				
			||||||
 {
 | 
					 {
 | 
				
			||||||
    "is_managed" : "false",
 | 
					    "is_managed" : "false",
 | 
				
			||||||
    "native_address" : "0x56087bcc2319",
 | 
					    "native_address" : "0x55db49c39319",
 | 
				
			||||||
    "native_offset" : "0x00000"
 | 
					    "native_offset" : "0x00000"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
,
 | 
					,
 | 
				
			||||||
 {
 | 
					 {
 | 
				
			||||||
    "is_managed" : "false",
 | 
					    "is_managed" : "false",
 | 
				
			||||||
    "native_address" : "0x56087bcc3655",
 | 
					    "native_address" : "0x55db49c3a655",
 | 
				
			||||||
    "native_offset" : "0x00000"
 | 
					    "native_offset" : "0x00000"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
,
 | 
					,
 | 
				
			||||||
 {
 | 
					 {
 | 
				
			||||||
    "is_managed" : "false",
 | 
					    "is_managed" : "false",
 | 
				
			||||||
    "native_address" : "0x56087bccc82c",
 | 
					    "native_address" : "0x55db49c4382c",
 | 
				
			||||||
    "native_offset" : "0x00000"
 | 
					    "native_offset" : "0x00000"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
,
 | 
					,
 | 
				
			||||||
 {
 | 
					 {
 | 
				
			||||||
    "is_managed" : "false",
 | 
					    "is_managed" : "false",
 | 
				
			||||||
    "native_address" : "0x56087bb322a7",
 | 
					    "native_address" : "0x55db49aa92a7",
 | 
				
			||||||
    "native_offset" : "0x00000"
 | 
					    "native_offset" : "0x00000"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
,
 | 
					,
 | 
				
			||||||
 {
 | 
					 {
 | 
				
			||||||
    "is_managed" : "false",
 | 
					    "is_managed" : "false",
 | 
				
			||||||
    "native_address" : "0x56087bb324b9",
 | 
					    "native_address" : "0x55db49aa94b9",
 | 
				
			||||||
    "native_offset" : "0x00000"
 | 
					    "native_offset" : "0x00000"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
,
 | 
					,
 | 
				
			||||||
 {
 | 
					 {
 | 
				
			||||||
    "is_managed" : "false",
 | 
					    "is_managed" : "false",
 | 
				
			||||||
    "native_address" : "0x56087bade7af",
 | 
					    "native_address" : "0x55db49a557af",
 | 
				
			||||||
    "native_offset" : "0x00000"
 | 
					    "native_offset" : "0x00000"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
,
 | 
					,
 | 
				
			||||||
 {
 | 
					 {
 | 
				
			||||||
    "is_managed" : "false",
 | 
					    "is_managed" : "false",
 | 
				
			||||||
    "native_address" : "0x56087bb2bb13",
 | 
					    "native_address" : "0x55db49aa2b13",
 | 
				
			||||||
    "native_offset" : "0x00000"
 | 
					    "native_offset" : "0x00000"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
,
 | 
					,
 | 
				
			||||||
 {
 | 
					 {
 | 
				
			||||||
    "is_managed" : "false",
 | 
					    "is_managed" : "false",
 | 
				
			||||||
    "native_address" : "0x7f27104a1a61",
 | 
					    "native_address" : "0x7f601afb9a61",
 | 
				
			||||||
    "native_offset" : "0x00000"
 | 
					    "native_offset" : "0x00000"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
,
 | 
					,
 | 
				
			||||||
 {
 | 
					 {
 | 
				
			||||||
    "is_managed" : "false",
 | 
					    "is_managed" : "false",
 | 
				
			||||||
    "native_address" : "0x7f27104b6d4a",
 | 
					    "native_address" : "0x7f601afced4a",
 | 
				
			||||||
    "native_offset" : "0x00000"
 | 
					    "native_offset" : "0x00000"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
,
 | 
					,
 | 
				
			||||||
 {
 | 
					 {
 | 
				
			||||||
    "is_managed" : "false",
 | 
					    "is_managed" : "false",
 | 
				
			||||||
    "native_address" : "0x7f2707f720f3",
 | 
					    "native_address" : "0x7f6012aa10f3",
 | 
				
			||||||
    "native_offset" : "0x00000"
 | 
					    "native_offset" : "0x00000"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
,
 | 
					,
 | 
				
			||||||
 {
 | 
					 {
 | 
				
			||||||
    "is_managed" : "false",
 | 
					    "is_managed" : "false",
 | 
				
			||||||
    "native_address" : "0x7f2707f49301",
 | 
					    "native_address" : "0x7f6012a78301",
 | 
				
			||||||
    "native_offset" : "0x00000"
 | 
					    "native_offset" : "0x00000"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
,
 | 
					,
 | 
				
			||||||
 {
 | 
					 {
 | 
				
			||||||
    "is_managed" : "false",
 | 
					    "is_managed" : "false",
 | 
				
			||||||
    "native_address" : "0x7f2707f303ae",
 | 
					    "native_address" : "0x7f6012a5f3ae",
 | 
				
			||||||
    "native_offset" : "0x00000"
 | 
					    "native_offset" : "0x00000"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
,
 | 
					,
 | 
				
			||||||
| 
						 | 
					@ -309,6 +209,106 @@
 | 
				
			||||||
    "il_offset" : "0x00000"
 | 
					    "il_offset" : "0x00000"
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 ]
 | 
				
			||||||
 | 
					},
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  "is_managed" : false,
 | 
				
			||||||
 | 
					  "offset_free_hash" : "0x0",
 | 
				
			||||||
 | 
					  "offset_rich_hash" : "0x0",
 | 
				
			||||||
 | 
					  "crashed" : false,
 | 
				
			||||||
 | 
					  "native_thread_id" : "0x7f601af3efc0",
 | 
				
			||||||
 | 
					  "thread_info_addr" : "0x55db4b39f280",
 | 
				
			||||||
 | 
					  "thread_name" : "GUI Thread",
 | 
				
			||||||
 | 
					  "ctx" : {
 | 
				
			||||||
 | 
					    "IP" : "0x7f601b493618",
 | 
				
			||||||
 | 
					    "SP" : "0x7ffe8121c8c0",
 | 
				
			||||||
 | 
					    "BP" : "0x55db5296bb00"
 | 
				
			||||||
 | 
					 },
 | 
				
			||||||
 | 
					  "unmanaged_frames" : [
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					    "is_managed" : "false",
 | 
				
			||||||
 | 
					    "native_address" : "0x55db49a534c9",
 | 
				
			||||||
 | 
					    "native_offset" : "0x00000"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					,
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					    "is_managed" : "false",
 | 
				
			||||||
 | 
					    "native_address" : "0x55db49c39319",
 | 
				
			||||||
 | 
					    "native_offset" : "0x00000"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					,
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					    "is_managed" : "false",
 | 
				
			||||||
 | 
					    "native_address" : "0x55db49c3a655",
 | 
				
			||||||
 | 
					    "native_offset" : "0x00000"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					,
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					    "is_managed" : "false",
 | 
				
			||||||
 | 
					    "native_address" : "0x55db49c436c7",
 | 
				
			||||||
 | 
					    "native_offset" : "0x00000"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					,
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					    "is_managed" : "false",
 | 
				
			||||||
 | 
					    "native_address" : "0x55db49aa85b5",
 | 
				
			||||||
 | 
					    "native_offset" : "0x00000"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					,
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					    "is_managed" : "false",
 | 
				
			||||||
 | 
					    "native_address" : "0x7f601b4953c0",
 | 
				
			||||||
 | 
					    "native_offset" : "0x00000"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					,
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					    "is_managed" : "false",
 | 
				
			||||||
 | 
					    "native_address" : "0x7f601b493618",
 | 
				
			||||||
 | 
					    "native_offset" : "0x00000"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					,
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					    "is_managed" : "false",
 | 
				
			||||||
 | 
					    "native_address" : "0x7f601b493743",
 | 
				
			||||||
 | 
					    "native_offset" : "0x00000"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					,
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					    "is_managed" : "false",
 | 
				
			||||||
 | 
					    "native_address" : "0x55db49c8529c",
 | 
				
			||||||
 | 
					    "native_offset" : "0x00000"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					,
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					    "is_managed" : "false",
 | 
				
			||||||
 | 
					    "native_address" : "0x55db49a226ff",
 | 
				
			||||||
 | 
					    "native_offset" : "0x00000"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					,
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					    "is_managed" : "false",
 | 
				
			||||||
 | 
					    "native_address" : "0x55db49a29f88",
 | 
				
			||||||
 | 
					    "native_offset" : "0x00000"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					,
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					    "is_managed" : "false",
 | 
				
			||||||
 | 
					    "native_address" : "0x55db49a18f1c",
 | 
				
			||||||
 | 
					    "native_offset" : "0x00000"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					,
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					    "is_managed" : "false",
 | 
				
			||||||
 | 
					    "native_address" : "0x7f601af670b3",
 | 
				
			||||||
 | 
					    "native_offset" : "0x00000"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					,
 | 
				
			||||||
 | 
					 {
 | 
				
			||||||
 | 
					    "is_managed" : "false",
 | 
				
			||||||
 | 
					    "native_address" : "0x55db49a1953a",
 | 
				
			||||||
 | 
					    "native_offset" : "0x00000"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 ]
 | 
					 ]
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,26 +1,25 @@
 | 
				
			||||||
<?xml version="1.0" encoding="utf-8"?>
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
<packages>
 | 
					<packages>
 | 
				
			||||||
  <package id="AngleSharp" version="0.16.0" targetFramework="net48" />
 | 
					  <package id="AngleSharp" version="0.14.0" targetFramework="net47" />
 | 
				
			||||||
  <package id="Microsoft.Bcl.AsyncInterfaces" version="6.0.0-preview.6.21352.12" targetFramework="net48" />
 | 
					  <package id="Microsoft.Bcl.AsyncInterfaces" version="1.1.1" targetFramework="net47" />
 | 
				
			||||||
  <package id="MimeTypesMap" version="1.0.8" targetFramework="net48" />
 | 
					  <package id="MimeTypesMap" version="1.0.2" targetFramework="net47" />
 | 
				
			||||||
  <package id="Newtonsoft.Json" version="13.0.1" targetFramework="net48" />
 | 
					  <package id="Newtonsoft.Json" version="13.0.1" targetFramework="net47" />
 | 
				
			||||||
  <package id="Simple-HTTP" version="1.0.6" targetFramework="net48" />
 | 
					  <package id="Simple-HTTP" version="1.0.6" targetFramework="net47" />
 | 
				
			||||||
  <package id="System.Buffers" version="4.5.1" targetFramework="net48" />
 | 
					  <package id="System.Buffers" version="4.5.1" targetFramework="net47" />
 | 
				
			||||||
  <package id="System.IO" version="4.3.0" targetFramework="net48" />
 | 
					  <package id="System.IO" version="4.3.0" targetFramework="net47" />
 | 
				
			||||||
  <package id="System.Linq.Async" version="5.0.0" targetFramework="net48" />
 | 
					  <package id="System.Memory" version="4.5.4" targetFramework="net47" />
 | 
				
			||||||
  <package id="System.Memory" version="4.5.4" targetFramework="net48" />
 | 
					  <package id="System.Net.Http" version="4.3.3" targetFramework="net47" />
 | 
				
			||||||
  <package id="System.Net.Http" version="4.3.4" targetFramework="net48" />
 | 
					  <package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net47" />
 | 
				
			||||||
  <package id="System.Numerics.Vectors" version="4.5.0" targetFramework="net48" />
 | 
					  <package id="System.Runtime" version="4.3.0" targetFramework="net47" />
 | 
				
			||||||
  <package id="System.Runtime" version="4.3.1" targetFramework="net48" />
 | 
					  <package id="System.Runtime.CompilerServices.Unsafe" version="4.7.1" targetFramework="net47" />
 | 
				
			||||||
  <package id="System.Runtime.CompilerServices.Unsafe" version="6.0.0-preview.6.21352.12" targetFramework="net48" />
 | 
					  <package id="System.Security.Cryptography.Algorithms" version="4.3.0" targetFramework="net47" />
 | 
				
			||||||
  <package id="System.Security.Cryptography.Algorithms" version="4.3.1" targetFramework="net48" />
 | 
					  <package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="net47" />
 | 
				
			||||||
  <package id="System.Security.Cryptography.Encoding" version="4.3.0" targetFramework="net48" />
 | 
					  <package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="net47" />
 | 
				
			||||||
  <package id="System.Security.Cryptography.Primitives" version="4.3.0" targetFramework="net48" />
 | 
					  <package id="System.Security.Cryptography.X509Certificates" version="4.3.0" targetFramework="net47" />
 | 
				
			||||||
  <package id="System.Security.Cryptography.X509Certificates" version="4.3.2" targetFramework="net48" />
 | 
					  <package id="System.Text.Encoding.CodePages" version="4.5.0" targetFramework="net47" />
 | 
				
			||||||
  <package id="System.Text.Encoding.CodePages" version="5.0.0" targetFramework="net48" />
 | 
					  <package id="System.Text.Encodings.Web" version="4.7.1" targetFramework="net47" />
 | 
				
			||||||
  <package id="System.Text.Encodings.Web" version="6.0.0-preview.6.21352.12" targetFramework="net48" />
 | 
					  <package id="System.Text.Json" version="4.7.2" targetFramework="net47" />
 | 
				
			||||||
  <package id="System.Text.Json" version="6.0.0-preview.6.21352.12" targetFramework="net48" />
 | 
					  <package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net47" />
 | 
				
			||||||
  <package id="System.Threading.Tasks.Extensions" version="4.5.4" targetFramework="net48" />
 | 
					  <package id="System.ValueTuple" version="4.5.0" targetFramework="net47" />
 | 
				
			||||||
  <package id="System.ValueTuple" version="4.5.0" targetFramework="net48" />
 | 
					  <package id="YoutubeExplode" version="6.0.5" targetFramework="net47" />
 | 
				
			||||||
  <package id="YoutubeExplode" version="6.0.5" targetFramework="net472" />
 | 
					 | 
				
			||||||
</packages>
 | 
					</packages>
 | 
				
			||||||
| 
						 | 
					@ -1,104 +1,87 @@
 | 
				
			||||||
<?xml version="1.0" encoding="utf-8"?>
 | 
					<?xml version="1.0" encoding="utf-8"?>
 | 
				
			||||||
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
					<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
 | 
				
			||||||
  <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
 | 
					 | 
				
			||||||
  <PropertyGroup>
 | 
					  <PropertyGroup>
 | 
				
			||||||
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
 | 
					    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
 | 
				
			||||||
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
 | 
					    <Platform Condition=" '$(Platform)' == '' ">x86</Platform>
 | 
				
			||||||
    <ProjectGuid>{55AFA327-A943-42F1-BEAB-02A4CBF389FD}</ProjectGuid>
 | 
					    <ProjectGuid>{E26F8159-6B4B-4660-A7A4-D0333DFEF0DD}</ProjectGuid>
 | 
				
			||||||
    <OutputType>Exe</OutputType>
 | 
					    <OutputType>Exe</OutputType>
 | 
				
			||||||
    <RootNamespace>youtube_downloader</RootNamespace>
 | 
					    <RootNamespace>youtubedownloader</RootNamespace>
 | 
				
			||||||
    <AssemblyName>youtube-downloader</AssemblyName>
 | 
					    <AssemblyName>youtube-downloader</AssemblyName>
 | 
				
			||||||
    <TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
 | 
					    <TargetFrameworkVersion>v4.7</TargetFrameworkVersion>
 | 
				
			||||||
    <FileAlignment>512</FileAlignment>
 | 
					 | 
				
			||||||
    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
 | 
					 | 
				
			||||||
    <Deterministic>true</Deterministic>
 | 
					 | 
				
			||||||
    <TargetFrameworkProfile />
 | 
					 | 
				
			||||||
  </PropertyGroup>
 | 
					  </PropertyGroup>
 | 
				
			||||||
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
 | 
					  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">
 | 
				
			||||||
    <PlatformTarget>AnyCPU</PlatformTarget>
 | 
					 | 
				
			||||||
    <DebugSymbols>true</DebugSymbols>
 | 
					    <DebugSymbols>true</DebugSymbols>
 | 
				
			||||||
    <DebugType>full</DebugType>
 | 
					    <DebugType>full</DebugType>
 | 
				
			||||||
    <Optimize>false</Optimize>
 | 
					    <Optimize>false</Optimize>
 | 
				
			||||||
    <OutputPath>bin\Debug\</OutputPath>
 | 
					    <OutputPath>bin\Debug</OutputPath>
 | 
				
			||||||
    <DefineConstants>DEBUG;TRACE</DefineConstants>
 | 
					    <DefineConstants>DEBUG;</DefineConstants>
 | 
				
			||||||
    <ErrorReport>prompt</ErrorReport>
 | 
					    <ErrorReport>prompt</ErrorReport>
 | 
				
			||||||
    <WarningLevel>4</WarningLevel>
 | 
					    <WarningLevel>4</WarningLevel>
 | 
				
			||||||
 | 
					    <ExternalConsole>true</ExternalConsole>
 | 
				
			||||||
 | 
					    <PlatformTarget>x86</PlatformTarget>
 | 
				
			||||||
  </PropertyGroup>
 | 
					  </PropertyGroup>
 | 
				
			||||||
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
 | 
					  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">
 | 
				
			||||||
    <PlatformTarget>AnyCPU</PlatformTarget>
 | 
					 | 
				
			||||||
    <DebugType>pdbonly</DebugType>
 | 
					 | 
				
			||||||
    <Optimize>true</Optimize>
 | 
					    <Optimize>true</Optimize>
 | 
				
			||||||
    <OutputPath>bin\Release\</OutputPath>
 | 
					    <OutputPath>bin\Release</OutputPath>
 | 
				
			||||||
    <DefineConstants>TRACE</DefineConstants>
 | 
					 | 
				
			||||||
    <ErrorReport>prompt</ErrorReport>
 | 
					    <ErrorReport>prompt</ErrorReport>
 | 
				
			||||||
    <WarningLevel>4</WarningLevel>
 | 
					    <WarningLevel>4</WarningLevel>
 | 
				
			||||||
 | 
					    <ExternalConsole>true</ExternalConsole>
 | 
				
			||||||
 | 
					    <PlatformTarget>x86</PlatformTarget>
 | 
				
			||||||
  </PropertyGroup>
 | 
					  </PropertyGroup>
 | 
				
			||||||
  <ItemGroup>
 | 
					  <ItemGroup>
 | 
				
			||||||
    <Reference Include="Microsoft.Bcl.AsyncInterfaces, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
 | 
					 | 
				
			||||||
      <HintPath>packages\Microsoft.Bcl.AsyncInterfaces.6.0.0-preview.6.21352.12\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
 | 
					 | 
				
			||||||
    </Reference>
 | 
					 | 
				
			||||||
    <Reference Include="System" />
 | 
					    <Reference Include="System" />
 | 
				
			||||||
    <Reference Include="System.ComponentModel.Composition" />
 | 
					    <Reference Include="Newtonsoft.Json">
 | 
				
			||||||
    <Reference Include="System.Core" />
 | 
					      <HintPath>packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
 | 
				
			||||||
    <Reference Include="System.Linq.Async, Version=5.0.0.0, Culture=neutral, PublicKeyToken=94bc3704cddfc263, processorArchitecture=MSIL">
 | 
					 | 
				
			||||||
      <HintPath>packages\System.Linq.Async.5.0.0\lib\net461\System.Linq.Async.dll</HintPath>
 | 
					 | 
				
			||||||
    </Reference>
 | 
					 | 
				
			||||||
    <Reference Include="System.Numerics" />
 | 
					 | 
				
			||||||
    <Reference Include="System.Runtime.CompilerServices.Unsafe, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
 | 
					 | 
				
			||||||
      <HintPath>packages\System.Runtime.CompilerServices.Unsafe.6.0.0-preview.6.21352.12\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
 | 
					 | 
				
			||||||
    </Reference>
 | 
					 | 
				
			||||||
    <Reference Include="System.Text.Encodings.Web, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
 | 
					 | 
				
			||||||
      <HintPath>packages\System.Text.Encodings.Web.6.0.0-preview.6.21352.12\lib\net461\System.Text.Encodings.Web.dll</HintPath>
 | 
					 | 
				
			||||||
    </Reference>
 | 
					 | 
				
			||||||
    <Reference Include="System.Text.Json, Version=6.0.0.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
 | 
					 | 
				
			||||||
      <HintPath>packages\System.Text.Json.6.0.0-preview.6.21352.12\lib\net461\System.Text.Json.dll</HintPath>
 | 
					 | 
				
			||||||
    </Reference>
 | 
					 | 
				
			||||||
    <Reference Include="System.Web" />
 | 
					 | 
				
			||||||
    <Reference Include="System.Xml.Linq" />
 | 
					 | 
				
			||||||
    <Reference Include="System.Data.DataSetExtensions" />
 | 
					 | 
				
			||||||
    <Reference Include="Microsoft.CSharp" />
 | 
					 | 
				
			||||||
    <Reference Include="System.Data" />
 | 
					 | 
				
			||||||
    <Reference Include="System.Xml" />
 | 
					 | 
				
			||||||
    <Reference Include="mscorlib" />
 | 
					 | 
				
			||||||
    <Reference Include="System.Net.Http">
 | 
					 | 
				
			||||||
      <HintPath>packages\System.Net.Http.4.3.3\lib\net46\System.Net.Http.dll</HintPath>
 | 
					 | 
				
			||||||
    </Reference>
 | 
					 | 
				
			||||||
    <Reference Include="AngleSharp">
 | 
					 | 
				
			||||||
      <HintPath>packages\AngleSharp.0.14.0\lib\net472\AngleSharp.dll</HintPath>
 | 
					 | 
				
			||||||
    </Reference>
 | 
					 | 
				
			||||||
    <Reference Include="SimpleHTTP">
 | 
					 | 
				
			||||||
      <HintPath>packages\Simple-HTTP.1.0.6\lib\net47\SimpleHTTP.dll</HintPath>
 | 
					 | 
				
			||||||
    </Reference>
 | 
					    </Reference>
 | 
				
			||||||
    <Reference Include="System.Buffers">
 | 
					    <Reference Include="System.Buffers">
 | 
				
			||||||
      <HintPath>packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
 | 
					      <HintPath>packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
 | 
				
			||||||
    </Reference>
 | 
					    </Reference>
 | 
				
			||||||
 | 
					    <Reference Include="mscorlib" />
 | 
				
			||||||
    <Reference Include="System.Numerics.Vectors">
 | 
					    <Reference Include="System.Numerics.Vectors">
 | 
				
			||||||
      <HintPath>packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
 | 
					      <HintPath>packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
 | 
				
			||||||
    </Reference>
 | 
					    </Reference>
 | 
				
			||||||
 | 
					    <Reference Include="System.Numerics" />
 | 
				
			||||||
 | 
					    <Reference Include="System.Runtime.CompilerServices.Unsafe">
 | 
				
			||||||
 | 
					      <HintPath>packages\System.Runtime.CompilerServices.Unsafe.4.7.1\lib\net461\System.Runtime.CompilerServices.Unsafe.dll</HintPath>
 | 
				
			||||||
 | 
					    </Reference>
 | 
				
			||||||
    <Reference Include="System.Memory">
 | 
					    <Reference Include="System.Memory">
 | 
				
			||||||
      <HintPath>packages\System.Memory.4.5.4\lib\net461\System.Memory.dll</HintPath>
 | 
					      <HintPath>packages\System.Memory.4.5.4\lib\net461\System.Memory.dll</HintPath>
 | 
				
			||||||
    </Reference>
 | 
					    </Reference>
 | 
				
			||||||
    <Reference Include="System.Text.Encoding.CodePages">
 | 
					    <Reference Include="System.Text.Encoding.CodePages">
 | 
				
			||||||
      <HintPath>packages\System.Text.Encoding.CodePages.4.5.0\lib\net461\System.Text.Encoding.CodePages.dll</HintPath>
 | 
					      <HintPath>packages\System.Text.Encoding.CodePages.4.5.0\lib\net461\System.Text.Encoding.CodePages.dll</HintPath>
 | 
				
			||||||
    </Reference>
 | 
					    </Reference>
 | 
				
			||||||
 | 
					    <Reference Include="AngleSharp">
 | 
				
			||||||
 | 
					      <HintPath>packages\AngleSharp.0.14.0\lib\net461\AngleSharp.dll</HintPath>
 | 
				
			||||||
 | 
					    </Reference>
 | 
				
			||||||
 | 
					    <Reference Include="System.Text.Encodings.Web">
 | 
				
			||||||
 | 
					      <HintPath>packages\System.Text.Encodings.Web.4.7.1\lib\net461\System.Text.Encodings.Web.dll</HintPath>
 | 
				
			||||||
 | 
					    </Reference>
 | 
				
			||||||
    <Reference Include="System.Threading.Tasks.Extensions">
 | 
					    <Reference Include="System.Threading.Tasks.Extensions">
 | 
				
			||||||
      <HintPath>packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
 | 
					      <HintPath>packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
 | 
				
			||||||
    </Reference>
 | 
					    </Reference>
 | 
				
			||||||
 | 
					    <Reference Include="Microsoft.Bcl.AsyncInterfaces">
 | 
				
			||||||
 | 
					      <HintPath>packages\Microsoft.Bcl.AsyncInterfaces.1.1.1\lib\net461\Microsoft.Bcl.AsyncInterfaces.dll</HintPath>
 | 
				
			||||||
 | 
					    </Reference>
 | 
				
			||||||
    <Reference Include="System.ValueTuple">
 | 
					    <Reference Include="System.ValueTuple">
 | 
				
			||||||
      <HintPath>packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll</HintPath>
 | 
					      <HintPath>packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll</HintPath>
 | 
				
			||||||
    </Reference>
 | 
					    </Reference>
 | 
				
			||||||
 | 
					    <Reference Include="System.Text.Json">
 | 
				
			||||||
 | 
					      <HintPath>packages\System.Text.Json.4.7.2\lib\net461\System.Text.Json.dll</HintPath>
 | 
				
			||||||
 | 
					    </Reference>
 | 
				
			||||||
 | 
					    <Reference Include="System.Core" />
 | 
				
			||||||
 | 
					    <Reference Include="YoutubeExplode">
 | 
				
			||||||
 | 
					      <HintPath>packages\YoutubeExplode.6.0.5\lib\net461\YoutubeExplode.dll</HintPath>
 | 
				
			||||||
 | 
					    </Reference>
 | 
				
			||||||
    <Reference Include="MimeTypesMap">
 | 
					    <Reference Include="MimeTypesMap">
 | 
				
			||||||
      <HintPath>packages\MimeTypesMap.1.0.2\lib\net45\MimeTypesMap.dll</HintPath>
 | 
					      <HintPath>packages\MimeTypesMap.1.0.2\lib\net45\MimeTypesMap.dll</HintPath>
 | 
				
			||||||
    </Reference>
 | 
					    </Reference>
 | 
				
			||||||
    <Reference Include="Newtonsoft.Json">
 | 
					 | 
				
			||||||
      <HintPath>packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
 | 
					 | 
				
			||||||
    </Reference>
 | 
					 | 
				
			||||||
    <Reference Include="System.IO">
 | 
					    <Reference Include="System.IO">
 | 
				
			||||||
      <HintPath>packages\System.IO.4.3.0\lib\net462\System.IO.dll</HintPath>
 | 
					      <HintPath>packages\System.IO.4.3.0\lib\net462\System.IO.dll</HintPath>
 | 
				
			||||||
    </Reference>
 | 
					    </Reference>
 | 
				
			||||||
    <Reference Include="System.Runtime">
 | 
					    <Reference Include="System.Runtime">
 | 
				
			||||||
      <HintPath>packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll</HintPath>
 | 
					      <HintPath>packages\System.Runtime.4.3.0\lib\net462\System.Runtime.dll</HintPath>
 | 
				
			||||||
    </Reference>
 | 
					    </Reference>
 | 
				
			||||||
 | 
					    <Reference Include="System.ComponentModel.Composition" />
 | 
				
			||||||
    <Reference Include="System.Security.Cryptography.Encoding">
 | 
					    <Reference Include="System.Security.Cryptography.Encoding">
 | 
				
			||||||
      <HintPath>packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll</HintPath>
 | 
					      <HintPath>packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll</HintPath>
 | 
				
			||||||
    </Reference>
 | 
					    </Reference>
 | 
				
			||||||
| 
						 | 
					@ -111,29 +94,30 @@
 | 
				
			||||||
    <Reference Include="System.Security.Cryptography.X509Certificates">
 | 
					    <Reference Include="System.Security.Cryptography.X509Certificates">
 | 
				
			||||||
      <HintPath>packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll</HintPath>
 | 
					      <HintPath>packages\System.Security.Cryptography.X509Certificates.4.3.0\lib\net461\System.Security.Cryptography.X509Certificates.dll</HintPath>
 | 
				
			||||||
    </Reference>
 | 
					    </Reference>
 | 
				
			||||||
    <Reference Include="YoutubeExplode">
 | 
					    <Reference Include="System.Net.Http">
 | 
				
			||||||
      <HintPath>packages\YoutubeExplode.6.0.5\lib\net461\YoutubeExplode.dll</HintPath>
 | 
					      <HintPath>packages\System.Net.Http.4.3.3\lib\net46\System.Net.Http.dll</HintPath>
 | 
				
			||||||
 | 
					    </Reference>
 | 
				
			||||||
 | 
					    <Reference Include="SimpleHTTP">
 | 
				
			||||||
 | 
					      <HintPath>packages\Simple-HTTP.1.0.6\lib\net47\SimpleHTTP.dll</HintPath>
 | 
				
			||||||
    </Reference>
 | 
					    </Reference>
 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
  <ItemGroup>
 | 
					  <ItemGroup>
 | 
				
			||||||
    <Compile Include="Program.cs" />
 | 
					    <Compile Include="Program.cs" />
 | 
				
			||||||
    <Compile Include="Properties\AssemblyInfo.cs" />
 | 
					    <Compile Include="Properties\AssemblyInfo.cs" />
 | 
				
			||||||
    <Compile Include="Server\Functions\Downloader.cs" />
 | 
					 | 
				
			||||||
    <Compile Include="Server\Functions\ffmpeg.cs" />
 | 
					    <Compile Include="Server\Functions\ffmpeg.cs" />
 | 
				
			||||||
 | 
					    <Compile Include="Server\Functions\Downloader.cs" />
 | 
				
			||||||
    <Compile Include="Server\Functions\SavedMedia.cs" />
 | 
					    <Compile Include="Server\Functions\SavedMedia.cs" />
 | 
				
			||||||
    <Compile Include="Server\Models\InfomationQueueItem.cs" />
 | 
					 | 
				
			||||||
    <Compile Include="Server\Models\InfoType.cs" />
 | 
					 | 
				
			||||||
    <Compile Include="Server\Models\SavedChannel.cs" />
 | 
					 | 
				
			||||||
    <Compile Include="Server\Models\SavedPlaylist.cs" />
 | 
					 | 
				
			||||||
    <Compile Include="Server\Models\SavedVideo.cs" />
 | 
					 | 
				
			||||||
    <Compile Include="Server\Models\VideoDownloadProgress.cs" />
 | 
					    <Compile Include="Server\Models\VideoDownloadProgress.cs" />
 | 
				
			||||||
 | 
					    <Compile Include="Server\Models\InfoType.cs" />
 | 
				
			||||||
 | 
					    <Compile Include="Server\Models\SavedVideo.cs" />
 | 
				
			||||||
 | 
					    <Compile Include="Server\Models\SavedChannel.cs" />
 | 
				
			||||||
 | 
					    <Compile Include="Server\Models\InfomationQueueItem.cs" />
 | 
				
			||||||
 | 
					    <Compile Include="Server\Models\SavedPlaylist.cs" />
 | 
				
			||||||
 | 
					    <Compile Include="Server\Models\YoutubeDownloaderRequest.cs" />
 | 
				
			||||||
 | 
					    <Compile Include="Server\Models\YoutubeDownloaderResponse.cs" />
 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
  <ItemGroup>
 | 
					  <ItemGroup>
 | 
				
			||||||
    <None Include="App.config" />
 | 
					 | 
				
			||||||
    <None Include="packages.config" />
 | 
					    <None Include="packages.config" />
 | 
				
			||||||
  </ItemGroup>
 | 
					  </ItemGroup>
 | 
				
			||||||
  <ItemGroup>
 | 
					  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
 | 
				
			||||||
    <Content Include=".gitattributes" />
 | 
					 | 
				
			||||||
  </ItemGroup>
 | 
					 | 
				
			||||||
  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
 | 
					 | 
				
			||||||
</Project>
 | 
					</Project>
 | 
				
			||||||
		Loading…
	
		Reference in New Issue