fix some stuff

This commit is contained in:
Michael Nolan 2021-08-25 04:11:08 -05:00
parent 1a12160d2b
commit ceb6a6bc97
7 changed files with 311 additions and 656 deletions

View File

@ -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>

View File

@ -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();
}
}

View File

@ -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)
{
}*/
} }
} }

View File

@ -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) =>
{
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.Video }); media.Add(new SavedMedia() { Title = e.Title, Id = e.Id, Kind = InfoType.Video });
}); });
await DL.ytc.Search.GetPlaylistsAsync(text).ForEachAsync((e) => { await DL.ytc.Search.GetPlaylistsAsync(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.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);

View File

@ -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"
}
] ]
} }
] ]

View File

@ -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>

View File

@ -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>