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();
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
48
Program.cs
48
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) =>
|
||||||
|
{
|
||||||
|
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);
|
||||||
|
|
|
@ -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