TYTD w api

This commit is contained in:
Michael Nolan 2021-12-07 19:07:43 -06:00
parent c1ffcb8b89
commit 5ec68e4b09
338 changed files with 99212 additions and 3753 deletions

View File

@ -1,32 +1,44 @@
<Properties StartupConfiguration="{E26F8159-6B4B-4660-A7A4-D0333DFEF0DD}|Default" NuGet.AddPackagesDialog.IncludePrerelease="True">
<MonoDevelop.Ide.Workbench ActiveDocument="Program.cs">
<MonoDevelop.Ide.Workbench ActiveDocument="TYTD.Api/Server/Models/SavedVideo.cs">
<Files>
<File FileName="Server/Models/InfoType.cs" Line="45" Column="39" />
<File FileName="Server/Models/YoutubeDownloaderResponse.cs" Line="1" Column="1" />
<File FileName="Server/Functions/Downloader.cs" Line="118" Column="30" />
<File FileName="Server/Functions/SavedMedia.cs" Line="1" Column="1" />
<File FileName="Server/Models/SavedVideo.cs" Line="35" Column="10" />
<File FileName="Server/Models/InfomationQueueItem.cs" Line="25" Column="27" />
<File FileName="Server/Functions/ffmpeg.cs" Line="30" Column="14" />
<File FileName="Program.cs" Line="1" Column="1" />
<File FileName="TYTD.Api/Server/Models/InfoType.cs" Line="20" Column="16" />
<File FileName="TYTD.Api/Server/Functions/Downloader.cs" Line="51" Column="35" />
<File FileName="TYTD.Api/Server/Models/SavedMedia.cs" Line="1" Column="1" />
<File FileName="TYTD.Api/Server/Models/SavedVideo.cs" Line="43" Column="6" />
<File FileName="TYTD.Api/Server/Models/InfomationQueueItem.cs" Line="9" Column="1" />
<File FileName="TYTD.Api/Server/Functions/ffmpeg.cs" Line="5" Column="15" />
<File FileName="Program.cs" Line="256" Column="32" />
<File FileName="TYTD.Api/MyClass.cs" Line="122" Column="34" />
<File FileName="TYTD.Api/Server/Models/SavedChannel.cs" Line="6" Column="10" />
<File FileName="TYTD.Api/Server/Models/SavedPlaylist.cs" Line="7" Column="1" />
<File FileName="TYTD.Api/Server/Models/VideoDownloadProgress.cs" Line="7" Column="16" />
</Files>
<Pads>
<Pad Id="ProjectPad">
<State name="__root__">
<Node name="youtube-downloader" expanded="True">
<Node name="youtube-downloader" expanded="True">
<Node name="Program.cs" selected="True" />
<Node name="TYTD.Api" expanded="True">
<Node name="Server" expanded="True">
<Node name="Functions" expanded="True" />
<Node name="Models" expanded="True">
<Node name="SavedVideo.cs" selected="True" />
</Node>
</Node>
</Node>
<Node name="youtube-downloader" expanded="True" />
</Node>
</State>
</Pad>
</Pads>
</MonoDevelop.Ide.Workbench>
<MonoDevelop.Ide.ItemProperties.TYTD.Api FirstBuild="True" />
<MonoDevelop.Ide.DebuggingService.PinnedWatches />
<MonoDevelop.Ide.Workspace ActiveConfiguration="Release" />
<MonoDevelop.Ide.ItemProperties.youtube-downloader PreferredExecutionTarget="MonoDevelop.Default" />
<MonoDevelop.Ide.DebuggingService.Breakpoints>
<BreakpointStore />
<BreakpointStore>
<Breakpoint file="/home/ddlovato/tytd/site/TYTD.Api/Server/Models/YoutubeDownloaderResponse.cs" relfile="TYTD.Api/Server/Models/YoutubeDownloaderResponse.cs" line="10" column="1" />
</BreakpointStore>
</MonoDevelop.Ide.DebuggingService.Breakpoints>
<MultiItemStartupConfigurations />
</Properties>

View File

@ -8,50 +8,15 @@ using System.Reflection;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading;
using TessesYoutubeDownloader.Server.Models;
using TYTD.Server.Models;
using Newtonsoft.Json;
using System.Net;
using System.Threading.Tasks;
using youtube_downloader.Server.Models;
using TYTD.Server.Functions;
namespace youtube_downloader
namespace TYTD
{
public class SSE
{
public static SSE ServerSentEventItem = new SSE();
List<HttpListenerResponse> Streams = new List<HttpListenerResponse>();
public void RegisterResponse(HttpListenerResponse rp)
{
Streams.Add(rp);
}
public async Task PushEventAsync(string event_name,object data)
{
await PushEventAsync(event_name, JsonConvert.SerializeObject(data));
}
public async Task PushEventAsync(string event_name,string data)
{
await PushEventRawAsync($"event: {event_name}\ndata: {data}");
}
public async Task PushEventRawAsync(string raw_data)
{
foreach (var items in Streams)
{
try
{
Console.WriteLine($"Event Sent: {raw_data}");
var bytes = Encoding.UTF8.GetBytes(raw_data + "\n\n");
await items.OutputStream.WriteAsync(bytes, 0, bytes.Length);
await items.OutputStream.FlushAsync();
}
catch (Exception ex)
{
_ = ex;
}
}
}
}
class Program
{
@ -60,18 +25,20 @@ namespace youtube_downloader
{
Thread t = new Thread(new ThreadStart(() => {
Server.Functions.Downloader.DL.DownloadThread().GetAwaiter().GetResult();
Downloader.DL.DownloadThread().GetAwaiter().GetResult();
}));
t.Start();
Thread t2 = new Thread(new ThreadStart(() => {
Server.Functions.Downloader.DL.ListenForQueueItem().GetAwaiter().GetResult();
Downloader.DL.ListenForQueueItem().GetAwaiter().GetResult();
}));
t2.Start();
// we need to get our app name so that
// we can create unique names for our mutex and our pipe
webSitePath = Server.Functions.Downloader.DL.GetPath(true, "WebSite");
webSitePath = Downloader.DL.GetPath(true, "WebSite");
Route.Before += Route_Before;
@ -115,7 +82,8 @@ namespace youtube_downloader
Route.Add("/api/QueueMove/{From}/{To}", (HttpAction)QueueMove);
Route.Add("/api/QueueMove2/{To}/{Id}", (HttpAction)QueueMove2);
Route.Add("/api/Progress", (HttpAction)VideoProgress);
Route.Add("/api/SSE", (HttpAction)ServerSentEvents);
Route.Add("/api/Redo", (HttpAction)Redo);
Route.Add("/api/Cancel", (HttpAction)Cancel);
/* Storage */
Route.Add("/api/Storage/GetDirectories/{Path}", (HttpAction)StorageGetDirectories);
@ -130,7 +98,10 @@ namespace youtube_downloader
/* Other */
Route.Add("/", (HttpAction)Index);
Route.Add("/{Path}", (HttpAction)RootPath);
Route.Add("/{Path}", (HttpAction)RootPath);
Console.CancelKeyPress += (sender, e) => { ApiLoader.Dispose();var date = DateTime.Now.ToString("yyyyMMdd_HHmmss");File.WriteAllText(Path.Combine("config","queues-close",$"{date}.json"), Downloader.GetQueue()); return; };
ApiLoader.Init();
Console.WriteLine("Almost Ready To Listen");
if (arg.Length > 0)
@ -155,7 +126,7 @@ namespace youtube_downloader
using (var req = new StreamReader(file.Value))
{
List<IDResolutionTypeTriplet> tripletlst = JsonConvert.DeserializeObject<List<IDResolutionTypeTriplet>>(req.ReadToEnd());
Server.Functions.Downloader.DownloadItems(tripletlst);
Downloader.DownloadItems(tripletlst);
response.Redirect("/");
}
}
@ -164,59 +135,59 @@ namespace youtube_downloader
}
public static void AddItem(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
Server.Functions.Downloader.DownloadItem(System.Web.HttpUtility.UrlDecode(args["Id"]));
Downloader.DownloadItem(System.Web.HttpUtility.UrlDecode(args["Id"]));
rp.AsRedirect("/");
}
public static void AddItemRes(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
Server.Functions.Downloader.DownloadItem(System.Web.HttpUtility.UrlDecode(args["Id"]), (Resolution)int.Parse(args["R"]));
Downloader.DownloadItem(System.Web.HttpUtility.UrlDecode(args["Id"]), (Resolution)int.Parse(args["R"]));
rp.AsRedirect("/");
}
public static void AddFile(HttpListenerRequest request, HttpListenerResponse response, Dictionary<string, string> arguments)
{
Server.Functions.Downloader.DownloadFile(arguments["Url"]);
Downloader.DownloadFile(arguments["Url"]);
}
public static void AddCaptions(HttpListenerRequest request, HttpListenerResponse response, Dictionary<string, string> arguments)
{
Server.Functions.Downloader.DownloadCaptions(arguments["Id"]);
Downloader.DownloadCaptions(arguments["Id"]);
}
#endregion
#region Video
public static void AddVideoInfo(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
Server.Functions.Downloader.DownloadVideoInfo(System.Web.HttpUtility.UrlDecode(args["Id"]), Resolution.NoConvert);
Downloader.DownloadVideoInfo(System.Web.HttpUtility.UrlDecode(args["Id"]), Resolution.NoConvert);
rp.AsRedirect("/");
}
public static void AddVideo(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
Server.Functions.Downloader.DownloadVideo(System.Web.HttpUtility.UrlDecode(args["Id"]));
Downloader.DownloadVideo(System.Web.HttpUtility.UrlDecode(args["Id"]));
rp.AsRedirect("/");
}
public static void AddVideoRes(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
Server.Functions.Downloader.DownloadVideo(System.Web.HttpUtility.UrlDecode(args["Id"]), (Resolution)int.Parse(args["R"]));
Downloader.DownloadVideo(System.Web.HttpUtility.UrlDecode(args["Id"]), (Resolution)int.Parse(args["R"]));
rp.AsRedirect("/");
}
public static void Redownload(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
foreach (var item in Directory.GetFiles(Server.Functions.Downloader.DL.GetPath(true, "Info"), "*.json"))
foreach (var item in Directory.GetFiles(Downloader.DL.GetPath(true, "Info"), "*.json"))
{
string id = System.IO.Path.GetFileNameWithoutExtension(item);
Server.Functions.Downloader.DownloadVideo(id, Resolution.NoConvert);
Downloader.DownloadVideo(id, Resolution.NoConvert);
}
rp.AsRedirect("/");
}
public static void RedownloadRes(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
foreach (var item in Directory.GetFiles(Server.Functions.Downloader.DL.GetPath(true, "Info"), "*.json"))
foreach (var item in Directory.GetFiles(Downloader.DL.GetPath(true, "Info"), "*.json"))
{
string id = System.IO.Path.GetFileNameWithoutExtension(item);
Server.Functions.Downloader.DownloadVideo(id, (Resolution)int.Parse(args["R"]));
Downloader.DownloadVideo(id, (Resolution)int.Parse(args["R"]));
}
rp.AsRedirect("/");
}
@ -229,18 +200,18 @@ namespace youtube_downloader
#region Playlist
public static void AddPlaylistOnly(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
Server.Functions.Downloader.DownloadPlaylistOnly(System.Web.HttpUtility.UrlDecode(args["Id"]), Resolution.NoConvert);
Downloader.DownloadPlaylistOnly(System.Web.HttpUtility.UrlDecode(args["Id"]), Resolution.NoConvert);
rp.AsRedirect("/");
}
public static void AddPlaylist(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
Server.Functions.Downloader.DownloadPlaylist(System.Web.HttpUtility.UrlDecode(args["Id"]));
Downloader.DownloadPlaylist(System.Web.HttpUtility.UrlDecode(args["Id"]));
rp.AsRedirect("/");
}
public static void AddPlaylistRes(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
Server.Functions.Downloader.DownloadPlaylist(System.Web.HttpUtility.UrlDecode(args["Id"]), (Resolution)int.Parse(args["R"]));
Downloader.DownloadPlaylist(System.Web.HttpUtility.UrlDecode(args["Id"]), (Resolution)int.Parse(args["R"]));
rp.AsRedirect("/");
}
#endregion
@ -248,14 +219,14 @@ namespace youtube_downloader
public static void SearchOnly(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
string search = System.Web.HttpUtility.UrlDecode(args["text"]);
string json = JsonConvert.SerializeObject(Server.Functions.Downloader.Search(search, false));
string json = JsonConvert.SerializeObject(Downloader.Search(search, false));
rp.AsText(json, "application/json");
}
public static void Search(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
string search = System.Web.HttpUtility.UrlDecode(args["text"]);
string json = JsonConvert.SerializeObject(Server.Functions.Downloader.Search(search));
string json = JsonConvert.SerializeObject(Downloader.Search(search));
rp.AsText(json, "application/json");
}
@ -263,80 +234,78 @@ namespace youtube_downloader
#region Channel
public static void AddChannelOnly(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
Server.Functions.Downloader.DownloadChannelOnly(System.Web.HttpUtility.UrlDecode(args["Id"]));
Downloader.DownloadChannelOnly(System.Web.HttpUtility.UrlDecode(args["Id"]));
rp.AsRedirect("/");
}
public static void AddChannel(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
Server.Functions.Downloader.DownloadChannel(System.Web.HttpUtility.UrlDecode(args["Id"]));
Downloader.DownloadChannel(System.Web.HttpUtility.UrlDecode(args["Id"]));
rp.AsRedirect("/");
}
public static void AddChannelRes(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
Server.Functions.Downloader.DownloadChannel(System.Web.HttpUtility.UrlDecode(args["Id"]), (Resolution)int.Parse(args["R"]));
Downloader.DownloadChannel(System.Web.HttpUtility.UrlDecode(args["Id"]), (Resolution)int.Parse(args["R"]));
rp.AsRedirect("/");
}
#endregion
#region User
public static void AddUserOnly(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
Server.Functions.Downloader.DownloadUserOnly(System.Web.HttpUtility.UrlDecode(args["Id"]));
Downloader.DownloadUserOnly(System.Web.HttpUtility.UrlDecode(args["Id"]));
rp.AsRedirect("/");
}
public static void AddUser(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
Server.Functions.Downloader.DownloadUser(System.Web.HttpUtility.UrlDecode(args["Id"]));
Downloader.DownloadUser(System.Web.HttpUtility.UrlDecode(args["Id"]));
rp.AsRedirect("/");
}
public static void AddUserRes(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
Server.Functions.Downloader.DownloadUser(System.Web.HttpUtility.UrlDecode(args["Id"]), (Resolution)int.Parse(args["R"]));
Downloader.DownloadUser(System.Web.HttpUtility.UrlDecode(args["Id"]), (Resolution)int.Parse(args["R"]));
rp.AsRedirect("/");
}
#endregion
#region Queue And Progress
public static void QueueList(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
string json = Server.Functions.Downloader.GetQueue();
string json = Downloader.GetQueue();
rp.AsText(json, "application/json");
}
public static void QueueMove(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
Server.Functions.Downloader.ModQueue(args["To"], args["From"]);
Downloader.ModQueue(args["To"], args["From"]);
rp.AsRedirect("/");
}
public static void QueueMove2(HttpListenerRequest request, HttpListenerResponse response, Dictionary<string, string> arguments)
{
Server.Functions.Downloader.ModQueue2(arguments["To"], arguments["Id"]);
Downloader.ModQueue2(arguments["To"], arguments["Id"]);
response.AsRedirect("/");
}
public static void VideoProgress(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
string json = JsonConvert.SerializeObject(Server.Functions.Downloader.GetProgress());
string json = JsonConvert.SerializeObject(Downloader.GetProgress());
rp.AsText(json, "application/json");
}
public static void ServerSentEvents(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
public static void Redo(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
rp.AddHeader("Cache-Control", "no-cache");
rp.ContentType = "text/event-stream";
rp.WithCode();
Console.WriteLine(rp.SendChunked);
rp.SendChunked = false;
rp.ContentEncoding = Encoding.UTF8;
SSE.ServerSentEventItem.RegisterResponse(rp);
Downloader.RedownloadIt = true;
Downloader.DownloadIt = false;
}
public static void Cancel(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
Downloader.RedownloadIt = false;
Downloader.DownloadIt = false;
}
#endregion
#region Storage
public static void StorageGetDirectories(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
string path = Server.Functions.Downloader.DL.GetPath(true, args["Path"]);
string path = Downloader.DL.GetPath(true, args["Path"]);
if (Directory.Exists(path))
{
@ -350,7 +319,7 @@ namespace youtube_downloader
}
public static void StorageGetFiles(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
string path = Server.Functions.Downloader.DL.GetPath(true, args["Path"]);
string path = Downloader.DL.GetPath(true, args["Path"]);
if (Directory.Exists(path))
{
@ -364,14 +333,14 @@ namespace youtube_downloader
}
public static void StorageDirectoryExists(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
string path = Server.Functions.Downloader.DL.GetPath(true, args["Path"]);
string path = Downloader.DL.GetPath(true, args["Path"]);
string json = Directory.Exists(path) ? "true" : "false";
rp.AsText(json, "text/plain");
}
public static void StorageFileExists(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
string path = Server.Functions.Downloader.DL.GetPath(true, args["Path"]);
string path = Downloader.DL.GetPath(true, args["Path"]);
string json = File.Exists(path) ? "true" : "false";
rp.AsText(json, "text/plain");
@ -384,7 +353,7 @@ namespace youtube_downloader
}
else
{
string path = Server.Functions.Downloader.DL.GetPath(true, args["Path"]);
string path = Downloader.DL.GetPath(true, args["Path"]);
rp.AsFile(rq, path);
}
@ -394,7 +363,7 @@ namespace youtube_downloader
YoutubeExplode.Videos.VideoId? vid = YoutubeExplode.Videos.VideoId.TryParse(args["Id"]);
if (vid.HasValue)
{
string path = Server.Functions.Downloader.DL.GetPath(true, "NotConverted",vid.Value +".mp4");
string path = Downloader.DL.GetPath(true, "NotConverted",vid.Value +".mp4");
rp.AddHeader("Content-Disposition", GetVideoContentDisposition(vid.Value).ToString());
rp.AsFile(rq, path);
}
@ -420,7 +389,7 @@ namespace youtube_downloader
else
{
string[] m = new string[] { "Converted", "NotConverted", "Audio" };
string path = Server.Functions.Downloader.DL.GetPath(true, m[res], vid.Value + ".mp4");
string path = Downloader.DL.GetPath(true, m[res], vid.Value + ".mp4");
rp.AddHeader("Content-Disposition", GetVideoContentDisposition(vid.Value).ToString());
rp.AsFile(rq, path);
}
@ -450,7 +419,7 @@ namespace youtube_downloader
public static string GetVideoName(string id)
{
string name = id + ".mp4";
string path = Server.Functions.Downloader.DL.GetPath(true, "Info", id + ".json");
string path = Downloader.DL.GetPath(true, "Info", id + ".json");
if (File.Exists(path))
{
string info=File.ReadAllText(path);

View File

@ -1,42 +0,0 @@
/*using System;
namespace youtubedownloader.Server.Models
{
public enum YoutubeDownloaderRequestEntryType
{
VideoDownload=0,
PlaylistDownload=1,
ChannelDownload=2,
UserDownload=3,
GetProgress=4,
GetQueue=5,
}
public class InternalYTDLReqE
{
public YoutubeDownloaderRequest()
{
}
public IYoutubeDownloaderRequestEntry GetRequestEntry()
{
}
public void SetRequestEntry(IYoutubeDownloaderRequestEntry re)
{
}
public string Data { get; set; }
public YoutubeDownloaderRequestEntryType Type { get; set; }
}
public interface IYoutubeDownloaderRequestEntry
{
}
public class VideoDownload : IYoutubeDownloaderRequestEntry
{
public string Id { get; set; }
}
}
*/

View File

@ -1,11 +0,0 @@
/*using System;
namespace youtubedownloader.Server.Models
{
public class YoutubeDownloaderResponse
{
public YoutubeDownloaderResponse()
{
}
}
}
*/

View File

@ -1,44 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{17BEC4FA-5FB8-4BCE-8FAF-CCD7A4B317DE}</ProjectGuid>
<OutputType>Library</OutputType>
<RootNamespace>Site</RootNamespace>
<AssemblyName>Site</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug</OutputPath>
<DefineConstants>DEBUG;</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<ConsolePause>false</ConsolePause>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<Optimize>true</Optimize>
<OutputPath>bin\Release</OutputPath>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<ConsolePause>false</ConsolePause>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="Hyperlinq">
<HintPath>..\packages\Hyperlinq.1.0.7\lib\net40-client\Hyperlinq.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="YouTubeSite.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project>

View File

@ -1,79 +0,0 @@
using System;
using System.Collections.Generic;
using System.IO;
using Hyperlinq;
namespace Site
{
public class YouTubeSite
{
public YouTubeSite()
{
}
public HElement[] GetBootStrap()
{
return new HElement[] {
H.link(e=> e.href("https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css").rel("stylesheet").Custom("integrity","sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC").Custom("crossorigin","anonymous")),
H.script(e=> e.src("https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/js/bootstrap.bundle.min.js").Custom("integrity","sha384-MrcW6ZMFYlzcLA8Nl+NtUVF0sA7MsXsP1UyJoMp4YLEuNSfAP+JcXn/tWtIaxVXM").Custom("crossorigin","anonymous"))
};
}
public void RegisterPages(List<string> pages)
{
pages.Add("/");
pages.Add("/index.html");
}
public object[] GetPage2(string page,Dictionary<string,string> args,string con_type)
{
string con_type0 = con_type;
return new object[] { GetPage(page, args, ref con_type0), con_type };
}
public MyResponse GetPage(string page,Dictionary<string,string> args,ref string content_type)
{
if(page == "/" || page == "/index.html")
{
return
H.html(
H.head(
H.title("Tesses YouTube Downloader")
),
H.body(
H.h1("Demi Lovato is an awesome boy")
)
);
}
return MyResponse.Empty;
}
}
public class MyResponse
{
public bool IsEmpty = false;
public byte[] Data;
public static MyResponse Empty { get { return new MyResponse() { IsEmpty = true }; } }
public static implicit operator MyResponse(Stream strm)
{
MemoryStream strm2=new MemoryStream();
strm.CopyTo(strm2);
strm.Dispose();
return strm2.ToArray();
}
public static implicit operator MyResponse(string str)
{
return System.Text.Encoding.UTF8.GetBytes(str);
}
public static implicit operator MyResponse(HElement elmt)
{
return elmt.ToString();
}
public static implicit operator MyResponse(byte[] data)
{
return new MyResponse() { Data = data };
}
public static implicit operator byte[](MyResponse resp)
{
return resp.Data;
}
}
}

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@ -1,2 +0,0 @@
// <autogenerated />
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.7", FrameworkDisplayName = "")]

View File

@ -1,4 +0,0 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]

View File

@ -1 +0,0 @@
d6ca3b791b6c76aeeb1b4696b0f39574a0557b9e

View File

@ -1,17 +0,0 @@
/home/tom/site/Site/bin/Debug/Site.dll
/home/tom/site/Site/bin/Debug/Site.pdb
/home/tom/site/Site/bin/Debug/Hyperlinq.dll
/home/tom/site/Site/obj/Debug/Site.csproj.CoreCompileInputs.cache
/home/tom/site/Site/obj/Debug/Site.csproj.CopyComplete
/home/tom/site/Site/obj/Debug/Site.dll
/home/tom/site/Site/obj/Debug/Site.pdb
/home/tom/site/Site/obj/Debug/Site.csprojAssemblyReference.cache
C:\Users\DemetroaLovato\site\Site\bin\Debug\Site.dll
C:\Users\DemetroaLovato\site\Site\bin\Debug\Site.pdb
C:\Users\DemetroaLovato\site\Site\bin\Debug\Hyperlinq.dll
C:\Users\DemetroaLovato\site\Site\bin\Debug\Hyperlinq.xml
C:\Users\DemetroaLovato\site\Site\obj\Debug\Site.csproj.AssemblyReference.cache
C:\Users\DemetroaLovato\site\Site\obj\Debug\Site.csproj.CoreCompileInputs.cache
C:\Users\DemetroaLovato\site\Site\obj\Debug\Site.csproj.CopyComplete
C:\Users\DemetroaLovato\site\Site\obj\Debug\Site.dll
C:\Users\DemetroaLovato\site\Site\obj\Debug\Site.pdb

View File

@ -1,6 +0,0 @@
/home/tom/site/Site/obj/Debug/.NETFramework,Version=v4.7.AssemblyAttribute.cs
/home/tom/site/Site/bin/Debug/Site.pdb
/home/tom/site/Site/bin/Debug/Site.dll
/home/tom/site/Site/obj/Debug/Site.dll
/home/tom/site/Site/obj/Debug/Site.pdb
/home/tom/site/Site/bin/Debug/Hyperlinq.dll

Binary file not shown.

Binary file not shown.

View File

@ -1,4 +0,0 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.6.1", FrameworkDisplayName = ".NET Framework 4.6.1")]

View File

@ -1,4 +0,0 @@
// <autogenerated />
using System;
using System.Reflection;
[assembly: global::System.Runtime.Versioning.TargetFrameworkAttribute(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")]

View File

@ -1 +0,0 @@
adbfa313b79cf09cc32e4ed7094771e5432b96e5

View File

@ -1,12 +0,0 @@
/home/tom/site/Site/bin/Release/Site.dll
/home/tom/site/Site/bin/Release/Hyperlinq.dll
/home/tom/site/Site/obj/Release/Site.csproj.CoreCompileInputs.cache
/home/tom/site/Site/obj/Release/Site.csproj.CopyComplete
/home/tom/site/Site/obj/Release/Site.dll
C:\Users\DemetroaLovato\site\Site\bin\Release\Site.dll
C:\Users\DemetroaLovato\site\Site\bin\Release\Hyperlinq.dll
C:\Users\DemetroaLovato\site\Site\bin\Release\Hyperlinq.xml
C:\Users\DemetroaLovato\site\Site\obj\Release\Site.csproj.AssemblyReference.cache
C:\Users\DemetroaLovato\site\Site\obj\Release\Site.csproj.CoreCompileInputs.cache
C:\Users\DemetroaLovato\site\Site\obj\Release\Site.csproj.CopyComplete
C:\Users\DemetroaLovato\site\Site\obj\Release\Site.dll

Binary file not shown.

View File

@ -1,4 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Hyperlinq" version="1.0.7" targetFramework="net47" />
</packages>

145
TYTD.Api/MyClass.cs Normal file
View File

@ -0,0 +1,145 @@
using System;
using TYTD.Server.Models;
using TYTD.Server.Functions;
using System.Threading;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
namespace TYTD
{
public abstract class Api : IDisposable
{
public Api()
{
}
public virtual void OnStart()
{
Console.WriteLine("Extension Loaded");
}
internal string storage;
protected string StorageLocation { get { return storage; } }
private System.Timers.Timer t = null;
protected void SetTimer(TimeSpan timespan)
{
if(t == null)
{
t = new System.Timers.Timer();
}
t.Interval = timespan.TotalMilliseconds;
t.Elapsed += (sender, e) =>
{
TimerElapsed();
};
t.Start();
}
public bool TimerEnabled { get { if (t != null) { return t.Enabled; } else { return false; } } set { if (t != null) { t.Enabled = value; } } }
protected virtual void TimerElapsed()
{
Console.WriteLine("Event Fired");
}
public Api AddItem(string id)
{
Downloader.DownloadItem(id);
return this;
}
internal void SendDLStart(object sender,DownloadStartEventArgs e)
{
if(DownloadStart != null)
{
DownloadStart.Invoke(sender, e);
}
}
internal void SendDLComplete(object sender, DownloadCompleteEventArgs e)
{
if (DownloadComplete != null)
{
DownloadComplete.Invoke(sender, e);
}
}
public event EventHandler<DownloadStartEventArgs> DownloadStart;
public event EventHandler<DownloadCompleteEventArgs> DownloadComplete;
public void Dispose()
{
if( t != null)
{
t.Dispose();
}
}
}
public class DownloadCompleteEventArgs : EventArgs
{
public bool RegularFile { get; set; }
public SavedVideo Video { get; set; }
}
public class DownloadStartEventArgs : EventArgs
{
public bool RegularFile { get; set; }
public SavedVideo Video { get; set; }
public bool Cancel { get; set; }
}
public static class ApiLoader
{
internal static List<Api> apis = new List<Api>();
internal static void DownloadStarted(object sender,DownloadStartEventArgs evt)
{
foreach(var api in apis)
{
api.SendDLStart(sender, evt);
}
}
internal static void DownloadComplete(object sender, DownloadCompleteEventArgs evt)
{
foreach (var api in apis)
{
api.SendDLComplete(sender, evt);
}
}
public static void Dispose()
{
foreach(var api in apis)
{
api.Dispose();
}
}
internal static void Load(string dll,string confpath)
{
var asm=Assembly.LoadFile(dll);
foreach(var item in asm.GetTypes())
{
if(typeof(Api).IsAssignableFrom(item))
{
Api api = (Api)Activator.CreateInstance(item);
api.storage = confpath;
apis.Add(api);
Thread thrd = new Thread(new ThreadStart(api.OnStart));
thrd.Start();
}
}
}
public static void Init()
{
string root = Path.Combine("config", "apidll");
string appconfroot = Path.Combine("config", "apistore");
foreach(var dir in Directory.GetDirectories(root))
{
string name = Path.GetFileName(dir);
string dllpath = Path.Combine(root, name, name + ".dll");
string confpath = Path.Combine(appconfroot, name);
if(File.Exists(dllpath))
{
Directory.CreateDirectory(confpath);
Load(dllpath, confpath);
}
}
}
}
}

View File

@ -4,7 +4,7 @@ using System.Runtime.CompilerServices;
// Information about this assembly is defined by the following attributes.
// Change them to the values specific to your project.
[assembly: AssemblyTitle("Site")]
[assembly: AssemblyTitle("TYTD.Api")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]

View File

@ -1,23 +1,22 @@
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 TYTD.Server.Models;
using Newtonsoft.Json;
using YoutubeExplode.Videos.Streams;
using YoutubeExplode.Channels;
using YoutubeExplode.Playlists;
using youtube_downloader.Server.Models;
using Dasync.Collections;
namespace youtube_downloader.Server.Functions
namespace TYTD.Server.Functions
{
public class Downloader
{
@ -26,6 +25,8 @@ namespace youtube_downloader.Server.Functions
// TessesYoutubeDownloader.Server.Functions.Downloader.DL.DownloadThread().GetAwaiter().GetResult();
}
public static bool DownloadIt = true;
public static bool RedownloadIt = false;
public List<InfomationQueueItem> infoQueue = new List<InfomationQueueItem>();
public static YoutubeClient CreateYoutubeClient()
{
@ -47,7 +48,7 @@ namespace youtube_downloader.Server.Functions
return new YoutubeClient(Http);
}
internal static VideoDownloadProgress GetProgress()
public static VideoDownloadProgress GetProgress()
{
return P;
}
@ -56,20 +57,13 @@ namespace youtube_downloader.Server.Functions
static HttpClient Http;
internal YoutubeClient ytc = CreateYoutubeClient();
static VideoDownloadProgress P = new VideoDownloadProgress();
const int NUM_WAITS = 10;
const int NUM_WAITS = 5;
static int WAITS = 0;
Progress<double> DownloadP = new Progress<double>((e) => { P.Progress = (int)(e * 100.0); P.ProgressRaw = e; SendProgress(); });
public static void SendProgress()
{
if (WAITS++ < NUM_WAITS)
return;
SSE.ServerSentEventItem.PushEventAsync("progress", P).Wait();
}
Progress<double> DownloadP = new Progress<double>((e) => { P.Progress = (int)(e * 100.0); P.ProgressRaw = e; });
public List<SavedVideoObject> Queue = new List<SavedVideoObject>();
internal static string GetQueue()
public static string GetQueue()
{
string q;
lock (DL.Queue)
@ -115,7 +109,7 @@ namespace youtube_downloader.Server.Functions
}
} while (true);
}
internal static void ModQueue2(string mvto, string index)
public static void ModQueue2(string mvto, string index)
{
try
{
@ -204,7 +198,7 @@ namespace youtube_downloader.Server.Functions
}
}
internal static void ModQueue(string mvto, string index)
public static void ModQueue(string mvto, string index)
{
try
{
@ -294,7 +288,7 @@ namespace youtube_downloader.Server.Functions
}
}
internal static void DownloadChannelOnly(string id)
public static void DownloadChannelOnly(string id)
{
ChannelId? v = ChannelId.TryParse(id);
if (v.HasValue)
@ -326,7 +320,7 @@ namespace youtube_downloader.Server.Functions
}
}
}
internal static void DownloadUserOnly(string id)
public static void DownloadUserOnly(string id)
{
UserName? v = UserName.TryParse(id);
if (v.HasValue)
@ -428,11 +422,21 @@ namespace youtube_downloader.Server.Functions
if (canDownload)
{
DownloadStartEventArgs evt = new DownloadStartEventArgs();
evt.Cancel = false;
evt.RegularFile = v.RegularFile;
evt.Video = v.Video;
ApiLoader.DownloadStarted(this, evt);
if(evt.Cancel)
{
DownloadIt = true;
goto nope;
}
redownload:
try
{
if (v.RegularFile) {
await SSE.ServerSentEventItem.PushEventAsync("start_dl_file", P);
var req=await Http.GetAsync(v.Video.Id);
long? Len=req.Content.Headers.ContentLength;
Uri u = new Uri(v.Video.Id);
@ -465,7 +469,7 @@ namespace youtube_downloader.Server.Functions
byte[] buffer = new byte[4096];
int Cycles = 0;
IProgress<double> p = DownloadP;
int CYCLES_BETWEEN_REPORT = 5;
int CYCLES_BETWEEN_REPORT = 1;
using (var srcFile = await req.Content.ReadAsStreamAsync())
{
using (var destFile = File.Create(filename))
@ -482,14 +486,13 @@ namespace youtube_downloader.Server.Functions
Cycles = 0;
p.Report(Pos / Len2);
}
} while (read > 0);
} while (read > 0 && DownloadIt);
}
}
// DownloadP.
p.Report(1);
}
else
{
await SSE.ServerSentEventItem.PushEventAsync("start_dl_vid", P);
switch (v.Resolution)
{
case Resolution.Convert:
@ -540,7 +543,8 @@ namespace youtube_downloader.Server.Functions
double myP = (double)pos / (double)len;
myProgress.Report(myP);
}
while (read > 0);
while (read > 0 && DownloadIt ) ;
}
}
@ -551,7 +555,7 @@ namespace youtube_downloader.Server.Functions
{
long pos = 0;
long len = 0;
using (var destStrm = System.IO.File.Open(mypathaudio, FileMode.OpenOrCreate, FileAccess.ReadWrite))
using (var destStrm = File.Open(mypathaudio, FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
using (var srcStrm = await ytc.Videos.Streams.GetAsync(best2))
{
@ -579,18 +583,25 @@ namespace youtube_downloader.Server.Functions
double myP = (double)pos / (double)len;
myProgress.Report(myP);
}
while (read > 0);
while (read > 0 && DownloadIt);
}
}
File.Move(mypathaudio, mypathCompleteAudio);
if(DownloadIt)
{
File.Move(mypathaudio, mypathCompleteAudio);
}
}
IProgress<double> pa = p.Video;
pa.Report(1);
ffmpeg.mux(mypath, mypathCompleteAudio, mypathIncompleteConverting);
if (DownloadIt)
{
pa.Report(1);
ffmpeg.mux(mypath, mypathCompleteAudio, mypathIncompleteConverting);
File.Move(mypathIncompleteConverting, mypathComplete);
File.Move(mypathIncompleteConverting, mypathComplete);
}
}
break;
case Resolution.NoConvert:
@ -631,11 +642,16 @@ namespace youtube_downloader.Server.Functions
double myP = (double)pos / (double)len;
myProgress.Report(myP);
}
while (read > 0);
while (read > 0 && DownloadIt);
}
}
File.Move(mypath2, mypath2Complete);
if (DownloadIt)
{
File.Move(mypath2, mypath2Complete);
}
}
@ -677,23 +693,45 @@ namespace youtube_downloader.Server.Functions
double myP = (double)pos / (double)len;
myProgress.Report(myP);
}
while (read > 0);
while (read > 0 && DownloadIt);
}
}
File.Move(mypath3, mypath3Complete);
if (DownloadIt)
{
File.Move(mypath3, mypath3Complete);
}
}
break;
}
await SSE.ServerSentEventItem.PushEventAsync("done", v.Video);
ffmpeg.on_video_done(v.Video.Id, (int)v.Resolution);
if (DownloadIt)
{
DownloadCompleteEventArgs evt2 = new DownloadCompleteEventArgs();
evt2.RegularFile = v.RegularFile;
evt2.Video = v.Video;
ApiLoader.DownloadComplete(this, evt2);
ffmpeg.on_video_done(v.Video.Id, (int)v.Resolution);
}
}
if (RedownloadIt && !DownloadIt)
{
DownloadIt = true;
goto redownload;
}
DownloadIt = true;
} catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
System.Threading.Thread.Sleep(4000);
nope: System.Threading.Thread.Sleep(2000);
}
while (true);
}
@ -780,7 +818,7 @@ namespace youtube_downloader.Server.Functions
}
return media;
}
internal static List<SavedVideoObject> GetQueueItems()
public static List<SavedVideoObject> GetQueueItems()
{
return DL.Queue;
}

View File

@ -2,7 +2,7 @@
using System.Diagnostics;
using System.IO;
namespace youtube_downloader.Server.Functions
namespace TYTD.Server.Functions
{
internal class ffmpeg
{

View File

@ -2,7 +2,7 @@
using YoutubeExplode.Playlists;
using YoutubeExplode.Videos;
namespace youtube_downloader.Server.Models
namespace TYTD.Server.Models
{
public enum InfoType
{
@ -17,7 +17,7 @@ namespace youtube_downloader.Server.Models
{
public string Id { get; set; }
public InfoType Type { get; set; }
public TessesYoutubeDownloader.Server.Models.Resolution Resolution { get; set; }
public Resolution Resolution { get; set; }
public InfomationQueueItem ToInfomationQueueItem(bool download=true)
{
switch(Type)

View File

@ -6,12 +6,12 @@ using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TessesYoutubeDownloader.Server.Models;
using YoutubeExplode.Channels;
using YoutubeExplode.Playlists;
using YoutubeExplode.Videos;
namespace youtube_downloader.Server.Models
namespace TYTD.Server.Models
{
public class InfomationQueueItem
{

View File

@ -3,9 +3,9 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using youtube_downloader.Server.Functions;
using TYTD.Server.Functions;
namespace TessesYoutubeDownloader.Server.Models
namespace TYTD.Server.Models
{
public class SavedChannel
{

View File

@ -1,7 +1,4 @@
using TessesYoutubeDownloader.Server.Models;
using youtube_downloader.Server.Models;
namespace youtube_downloader.Server.Functions
namespace TYTD.Server.Models
{
public class SavedMedia

View File

@ -4,9 +4,8 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Dasync.Collections;
using youtube_downloader.Server.Functions;
namespace TessesYoutubeDownloader.Server.Models
namespace TYTD.Server.Models
{
public class SavedPlaylist
{

View File

@ -3,9 +3,9 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using youtube_downloader.Server.Functions;
using TYTD.Server.Functions;
using YoutubeExplode.Videos;
namespace TessesYoutubeDownloader.Server.Models
namespace TYTD.Server.Models
{
public enum Resolution
@ -22,6 +22,16 @@ namespace TessesYoutubeDownloader.Server.Models
}
public VideoId VideoId;
}
public class Chapter
{
public Chapter(TimeSpan ts, string name)
{
Offset = ts;
ChapterName = name;
}
public TimeSpan Offset { get; set; }
public string ChapterName { get; set; }
}
public class SavedVideoObject
{
public SavedVideoObject()
@ -41,7 +51,34 @@ namespace TessesYoutubeDownloader.Server.Models
}
public class SavedVideo
{
public List<Chapter> GetChapters()
{
List<Chapter> chapters = new List<Chapter>();
//a line should start with time then be followed by info
bool found_0 = false;
foreach (var line in Description.Split(new char[] { '\n' }, StringSplitOptions.RemoveEmptyEntries))
{
string[] splitLine = line.Split(new char[] { ' ' }, 2);
if (splitLine.Length == 2)
{
if (found_0)
{
TimeSpan time;
if (TimeSpan.TryParse(splitLine[0], out time))
{
chapters.Add(new Chapter(time, splitLine[1]));
}
}
else
if (splitLine[0] == "0:00")
{
found_0 = true;
chapters.Add(new Chapter(TimeSpan.FromSeconds(0), splitLine[1]));
}
}
}
return chapters;
}
public static SavedVideoObject CreateFrom(Resolution res,YoutubeExplode.Videos.Video v,Action<int,int,string,string> downloadThumbnail)
{

View File

@ -1,10 +1,10 @@
using System;
namespace TessesYoutubeDownloader.Server.Models
namespace TYTD.Server.Models
{
internal class VideoDownloadProgress
public class VideoDownloadProgress
{
public Models.SavedVideo Saved { get; set; }
public SavedVideo Saved { get; set; }
public long Length { get; set; }
public int Progress { get; set; }

102
TYTD.Api/TYTD.Api.csproj Normal file
View File

@ -0,0 +1,102 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{B859C3EE-A821-4C36-8A55-729E79194CF4}</ProjectGuid>
<OutputType>Library</OutputType>
<RootNamespace>TYTD.Api</RootNamespace>
<AssemblyName>TYTD.Api</AssemblyName>
<TargetFrameworkVersion>v4.7</TargetFrameworkVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug</OutputPath>
<DefineConstants>DEBUG;</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<ConsolePause>false</ConsolePause>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<Optimize>true</Optimize>
<OutputPath>bin\Release</OutputPath>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<ConsolePause>false</ConsolePause>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="Newtonsoft.Json">
<HintPath>..\packages\Newtonsoft.Json.13.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<Reference Include="System.Buffers">
<HintPath>..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll</HintPath>
</Reference>
<Reference Include="mscorlib" />
<Reference Include="System.Numerics.Vectors">
<HintPath>..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll</HintPath>
</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">
<HintPath>..\packages\System.Memory.4.5.4\lib\net461\System.Memory.dll</HintPath>
</Reference>
<Reference Include="System.Text.Encoding.CodePages">
<HintPath>..\packages\System.Text.Encoding.CodePages.4.5.0\lib\net461\System.Text.Encoding.CodePages.dll</HintPath>
</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">
<HintPath>..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll</HintPath>
</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">
<HintPath>..\packages\System.ValueTuple.4.5.0\lib\net47\System.ValueTuple.dll</HintPath>
</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="AsyncEnumerable">
<HintPath>..\packages\AsyncEnumerator.4.0.2\lib\net461\AsyncEnumerable.dll</HintPath>
</Reference>
<Reference Include="CookiesTxtParser">
<HintPath>..\packages\CookiesTxtParser.1.0.1\lib\netstandard2.0\CookiesTxtParser.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="MyClass.cs" />
<Compile Include="Properties\AssemblyInfo.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\Functions\Downloader.cs" />
<Compile Include="Server\Functions\ffmpeg.cs" />
<Compile Include="Server\Models\SavedMedia.cs" />
</ItemGroup>
<ItemGroup>
<Folder Include="Server\" />
<Folder Include="Server\Models\" />
<Folder Include="Server\Functions\" />
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project>

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,223 @@
<?xml version="1.0"?>
<doc>
<assembly>
<name>Microsoft.Bcl.AsyncInterfaces</name>
</assembly>
<members>
<member name="T:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1">
<summary>Provides the core logic for implementing a manual-reset <see cref="T:System.Threading.Tasks.Sources.IValueTaskSource"/> or <see cref="T:System.Threading.Tasks.Sources.IValueTaskSource`1"/>.</summary>
<typeparam name="TResult"></typeparam>
</member>
<member name="F:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1._continuation">
<summary>
The callback to invoke when the operation completes if <see cref="M:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1.OnCompleted(System.Action{System.Object},System.Object,System.Int16,System.Threading.Tasks.Sources.ValueTaskSourceOnCompletedFlags)"/> was called before the operation completed,
or <see cref="F:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCoreShared.s_sentinel"/> if the operation completed before a callback was supplied,
or null if a callback hasn't yet been provided and the operation hasn't yet completed.
</summary>
</member>
<member name="F:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1._continuationState">
<summary>State to pass to <see cref="F:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1._continuation"/>.</summary>
</member>
<member name="F:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1._executionContext">
<summary><see cref="T:System.Threading.ExecutionContext"/> to flow to the callback, or null if no flowing is required.</summary>
</member>
<member name="F:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1._capturedContext">
<summary>
A "captured" <see cref="T:System.Threading.SynchronizationContext"/> or <see cref="T:System.Threading.Tasks.TaskScheduler"/> with which to invoke the callback,
or null if no special context is required.
</summary>
</member>
<member name="F:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1._completed">
<summary>Whether the current operation has completed.</summary>
</member>
<member name="F:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1._result">
<summary>The result with which the operation succeeded, or the default value if it hasn't yet completed or failed.</summary>
</member>
<member name="F:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1._error">
<summary>The exception with which the operation failed, or null if it hasn't yet completed or completed successfully.</summary>
</member>
<member name="F:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1._version">
<summary>The current version of this value, used to help prevent misuse.</summary>
</member>
<member name="P:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1.RunContinuationsAsynchronously">
<summary>Gets or sets whether to force continuations to run asynchronously.</summary>
<remarks>Continuations may run asynchronously if this is false, but they'll never run synchronously if this is true.</remarks>
</member>
<member name="M:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1.Reset">
<summary>Resets to prepare for the next operation.</summary>
</member>
<member name="M:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1.SetResult(`0)">
<summary>Completes with a successful result.</summary>
<param name="result">The result.</param>
</member>
<member name="M:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1.SetException(System.Exception)">
<summary>Complets with an error.</summary>
<param name="error"></param>
</member>
<member name="P:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1.Version">
<summary>Gets the operation version.</summary>
</member>
<member name="M:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1.GetStatus(System.Int16)">
<summary>Gets the status of the operation.</summary>
<param name="token">Opaque value that was provided to the <see cref="T:System.Threading.Tasks.ValueTask"/>'s constructor.</param>
</member>
<member name="M:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1.GetResult(System.Int16)">
<summary>Gets the result of the operation.</summary>
<param name="token">Opaque value that was provided to the <see cref="T:System.Threading.Tasks.ValueTask"/>'s constructor.</param>
</member>
<member name="M:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1.OnCompleted(System.Action{System.Object},System.Object,System.Int16,System.Threading.Tasks.Sources.ValueTaskSourceOnCompletedFlags)">
<summary>Schedules the continuation action for this operation.</summary>
<param name="continuation">The continuation to invoke when the operation has completed.</param>
<param name="state">The state object to pass to <paramref name="continuation"/> when it's invoked.</param>
<param name="token">Opaque value that was provided to the <see cref="T:System.Threading.Tasks.ValueTask"/>'s constructor.</param>
<param name="flags">The flags describing the behavior of the continuation.</param>
</member>
<member name="M:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1.ValidateToken(System.Int16)">
<summary>Ensures that the specified token matches the current version.</summary>
<param name="token">The token supplied by <see cref="T:System.Threading.Tasks.ValueTask"/>.</param>
</member>
<member name="M:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1.SignalCompletion">
<summary>Signals that the operation has completed. Invoked after the result or error has been set.</summary>
</member>
<member name="M:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1.InvokeContinuation">
<summary>
Invokes the continuation with the appropriate captured context / scheduler.
This assumes that if <see cref="F:System.Threading.Tasks.Sources.ManualResetValueTaskSourceCore`1._executionContext"/> is not null we're already
running within that <see cref="T:System.Threading.ExecutionContext"/>.
</summary>
</member>
<member name="T:System.Threading.Tasks.TaskAsyncEnumerableExtensions">
<summary>Provides a set of static methods for configuring <see cref="T:System.Threading.Tasks.Task"/>-related behaviors on asynchronous enumerables and disposables.</summary>
</member>
<member name="M:System.Threading.Tasks.TaskAsyncEnumerableExtensions.ConfigureAwait(System.IAsyncDisposable,System.Boolean)">
<summary>Configures how awaits on the tasks returned from an async disposable will be performed.</summary>
<param name="source">The source async disposable.</param>
<param name="continueOnCapturedContext">Whether to capture and marshal back to the current context.</param>
<returns>The configured async disposable.</returns>
</member>
<member name="M:System.Threading.Tasks.TaskAsyncEnumerableExtensions.ConfigureAwait``1(System.Collections.Generic.IAsyncEnumerable{``0},System.Boolean)">
<summary>Configures how awaits on the tasks returned from an async iteration will be performed.</summary>
<typeparam name="T">The type of the objects being iterated.</typeparam>
<param name="source">The source enumerable being iterated.</param>
<param name="continueOnCapturedContext">Whether to capture and marshal back to the current context.</param>
<returns>The configured enumerable.</returns>
</member>
<member name="M:System.Threading.Tasks.TaskAsyncEnumerableExtensions.WithCancellation``1(System.Collections.Generic.IAsyncEnumerable{``0},System.Threading.CancellationToken)">
<summary>Sets the <see cref="T:System.Threading.CancellationToken"/> to be passed to <see cref="M:System.Collections.Generic.IAsyncEnumerable`1.GetAsyncEnumerator(System.Threading.CancellationToken)"/> when iterating.</summary>
<typeparam name="T">The type of the objects being iterated.</typeparam>
<param name="source">The source enumerable being iterated.</param>
<param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken"/> to use.</param>
<returns>The configured enumerable.</returns>
</member>
<member name="T:System.Runtime.CompilerServices.AsyncIteratorMethodBuilder">
<summary>Represents a builder for asynchronous iterators.</summary>
</member>
<member name="M:System.Runtime.CompilerServices.AsyncIteratorMethodBuilder.Create">
<summary>Creates an instance of the <see cref="T:System.Runtime.CompilerServices.AsyncIteratorMethodBuilder"/> struct.</summary>
<returns>The initialized instance.</returns>
</member>
<member name="M:System.Runtime.CompilerServices.AsyncIteratorMethodBuilder.MoveNext``1(``0@)">
<summary>Invokes <see cref="M:System.Runtime.CompilerServices.IAsyncStateMachine.MoveNext"/> on the state machine while guarding the <see cref="T:System.Threading.ExecutionContext"/>.</summary>
<typeparam name="TStateMachine">The type of the state machine.</typeparam>
<param name="stateMachine">The state machine instance, passed by reference.</param>
</member>
<member name="M:System.Runtime.CompilerServices.AsyncIteratorMethodBuilder.AwaitOnCompleted``2(``0@,``1@)">
<summary>Schedules the state machine to proceed to the next action when the specified awaiter completes.</summary>
<typeparam name="TAwaiter">The type of the awaiter.</typeparam>
<typeparam name="TStateMachine">The type of the state machine.</typeparam>
<param name="awaiter">The awaiter.</param>
<param name="stateMachine">The state machine.</param>
</member>
<member name="M:System.Runtime.CompilerServices.AsyncIteratorMethodBuilder.AwaitUnsafeOnCompleted``2(``0@,``1@)">
<summary>Schedules the state machine to proceed to the next action when the specified awaiter completes.</summary>
<typeparam name="TAwaiter">The type of the awaiter.</typeparam>
<typeparam name="TStateMachine">The type of the state machine.</typeparam>
<param name="awaiter">The awaiter.</param>
<param name="stateMachine">The state machine.</param>
</member>
<member name="M:System.Runtime.CompilerServices.AsyncIteratorMethodBuilder.Complete">
<summary>Marks iteration as being completed, whether successfully or otherwise.</summary>
</member>
<member name="P:System.Runtime.CompilerServices.AsyncIteratorMethodBuilder.ObjectIdForDebugger">
<summary>Gets an object that may be used to uniquely identify this builder to the debugger.</summary>
</member>
<member name="T:System.Runtime.CompilerServices.AsyncIteratorStateMachineAttribute">
<summary>Indicates whether a method is an asynchronous iterator.</summary>
</member>
<member name="M:System.Runtime.CompilerServices.AsyncIteratorStateMachineAttribute.#ctor(System.Type)">
<summary>Initializes a new instance of the <see cref="T:System.Runtime.CompilerServices.AsyncIteratorStateMachineAttribute"/> class.</summary>
<param name="stateMachineType">The type object for the underlying state machine type that's used to implement a state machine method.</param>
</member>
<member name="T:System.Runtime.CompilerServices.ConfiguredAsyncDisposable">
<summary>Provides a type that can be used to configure how awaits on an <see cref="T:System.IAsyncDisposable"/> are performed.</summary>
</member>
<member name="T:System.Runtime.CompilerServices.ConfiguredCancelableAsyncEnumerable`1">
<summary>Provides an awaitable async enumerable that enables cancelable iteration and configured awaits.</summary>
</member>
<member name="M:System.Runtime.CompilerServices.ConfiguredCancelableAsyncEnumerable`1.ConfigureAwait(System.Boolean)">
<summary>Configures how awaits on the tasks returned from an async iteration will be performed.</summary>
<param name="continueOnCapturedContext">Whether to capture and marshal back to the current context.</param>
<returns>The configured enumerable.</returns>
<remarks>This will replace any previous value set by <see cref="M:System.Runtime.CompilerServices.ConfiguredCancelableAsyncEnumerable`1.ConfigureAwait(System.Boolean)"/> for this iteration.</remarks>
</member>
<member name="M:System.Runtime.CompilerServices.ConfiguredCancelableAsyncEnumerable`1.WithCancellation(System.Threading.CancellationToken)">
<summary>Sets the <see cref="T:System.Threading.CancellationToken"/> to be passed to <see cref="M:System.Collections.Generic.IAsyncEnumerable`1.GetAsyncEnumerator(System.Threading.CancellationToken)"/> when iterating.</summary>
<param name="cancellationToken">The <see cref="T:System.Threading.CancellationToken"/> to use.</param>
<returns>The configured enumerable.</returns>
<remarks>This will replace any previous <see cref="T:System.Threading.CancellationToken"/> set by <see cref="M:System.Runtime.CompilerServices.ConfiguredCancelableAsyncEnumerable`1.WithCancellation(System.Threading.CancellationToken)"/> for this iteration.</remarks>
</member>
<member name="T:System.Runtime.CompilerServices.ConfiguredCancelableAsyncEnumerable`1.Enumerator">
<summary>Provides an awaitable async enumerator that enables cancelable iteration and configured awaits.</summary>
</member>
<member name="M:System.Runtime.CompilerServices.ConfiguredCancelableAsyncEnumerable`1.Enumerator.MoveNextAsync">
<summary>Advances the enumerator asynchronously to the next element of the collection.</summary>
<returns>
A <see cref="T:System.Runtime.CompilerServices.ConfiguredValueTaskAwaitable`1"/> that will complete with a result of <c>true</c>
if the enumerator was successfully advanced to the next element, or <c>false</c> if the enumerator has
passed the end of the collection.
</returns>
</member>
<member name="P:System.Runtime.CompilerServices.ConfiguredCancelableAsyncEnumerable`1.Enumerator.Current">
<summary>Gets the element in the collection at the current position of the enumerator.</summary>
</member>
<member name="M:System.Runtime.CompilerServices.ConfiguredCancelableAsyncEnumerable`1.Enumerator.DisposeAsync">
<summary>
Performs application-defined tasks associated with freeing, releasing, or
resetting unmanaged resources asynchronously.
</summary>
</member>
<member name="T:System.Collections.Generic.IAsyncEnumerable`1">
<summary>Exposes an enumerator that provides asynchronous iteration over values of a specified type.</summary>
<typeparam name="T">The type of values to enumerate.</typeparam>
</member>
<member name="M:System.Collections.Generic.IAsyncEnumerable`1.GetAsyncEnumerator(System.Threading.CancellationToken)">
<summary>Returns an enumerator that iterates asynchronously through the collection.</summary>
<param name="cancellationToken">A <see cref="T:System.Threading.CancellationToken"/> that may be used to cancel the asynchronous iteration.</param>
<returns>An enumerator that can be used to iterate asynchronously through the collection.</returns>
</member>
<member name="T:System.Collections.Generic.IAsyncEnumerator`1">
<summary>Supports a simple asynchronous iteration over a generic collection.</summary>
<typeparam name="T">The type of objects to enumerate.</typeparam>
</member>
<member name="M:System.Collections.Generic.IAsyncEnumerator`1.MoveNextAsync">
<summary>Advances the enumerator asynchronously to the next element of the collection.</summary>
<returns>
A <see cref="T:System.Threading.Tasks.ValueTask`1"/> that will complete with a result of <c>true</c> if the enumerator
was successfully advanced to the next element, or <c>false</c> if the enumerator has passed the end
of the collection.
</returns>
</member>
<member name="P:System.Collections.Generic.IAsyncEnumerator`1.Current">
<summary>Gets the element in the collection at the current position of the enumerator.</summary>
</member>
<member name="T:System.IAsyncDisposable">
<summary>Provides a mechanism for releasing unmanaged resources asynchronously.</summary>
</member>
<member name="M:System.IAsyncDisposable.DisposeAsync">
<summary>
Performs application-defined tasks associated with freeing, releasing, or
resetting unmanaged resources asynchronously.
</summary>
</member>
</members>
</doc>

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="utf-8"?><doc>
<assembly>
<name>System.Buffers</name>
</assembly>
<members>
<member name="T:System.Buffers.ArrayPool`1">
<summary>Provides a resource pool that enables reusing instances of type <see cref="T[]"></see>.</summary>
<typeparam name="T">The type of the objects that are in the resource pool.</typeparam>
</member>
<member name="M:System.Buffers.ArrayPool`1.#ctor">
<summary>Initializes a new instance of the <see cref="T:System.Buffers.ArrayPool`1"></see> class.</summary>
</member>
<member name="M:System.Buffers.ArrayPool`1.Create">
<summary>Creates a new instance of the <see cref="T:System.Buffers.ArrayPool`1"></see> class.</summary>
<returns>A new instance of the <see cref="System.Buffers.ArrayPool`1"></see> class.</returns>
</member>
<member name="M:System.Buffers.ArrayPool`1.Create(System.Int32,System.Int32)">
<summary>Creates a new instance of the <see cref="T:System.Buffers.ArrayPool`1"></see> class using the specifed configuration.</summary>
<param name="maxArrayLength">The maximum length of an array instance that may be stored in the pool.</param>
<param name="maxArraysPerBucket">The maximum number of array instances that may be stored in each bucket in the pool. The pool groups arrays of similar lengths into buckets for faster access.</param>
<returns>A new instance of the <see cref="System.Buffers.ArrayPool`1"></see> class with the specified configuration.</returns>
</member>
<member name="M:System.Buffers.ArrayPool`1.Rent(System.Int32)">
<summary>Retrieves a buffer that is at least the requested length.</summary>
<param name="minimumLength">The minimum length of the array.</param>
<returns>An array of type <see cref="T[]"></see> that is at least <paramref name="minimumLength">minimumLength</paramref> in length.</returns>
</member>
<member name="M:System.Buffers.ArrayPool`1.Return(`0[],System.Boolean)">
<summary>Returns an array to the pool that was previously obtained using the <see cref="M:System.Buffers.ArrayPool`1.Rent(System.Int32)"></see> method on the same <see cref="T:System.Buffers.ArrayPool`1"></see> instance.</summary>
<param name="array">A buffer to return to the pool that was previously obtained using the <see cref="M:System.Buffers.ArrayPool`1.Rent(System.Int32)"></see> method.</param>
<param name="clearArray">Indicates whether the contents of the buffer should be cleared before reuse. If <paramref name="clearArray">clearArray</paramref> is set to true, and if the pool will store the buffer to enable subsequent reuse, the <see cref="M:System.Buffers.ArrayPool`1.Return(`0[],System.Boolean)"></see> method will clear the <paramref name="array">array</paramref> of its contents so that a subsequent caller using the <see cref="M:System.Buffers.ArrayPool`1.Rent(System.Int32)"></see> method will not see the content of the previous caller. If <paramref name="clearArray">clearArray</paramref> is set to false or if the pool will release the buffer, the array&amp;#39;s contents are left unchanged.</param>
</member>
<member name="P:System.Buffers.ArrayPool`1.Shared">
<summary>Gets a shared <see cref="T:System.Buffers.ArrayPool`1"></see> instance.</summary>
<returns>A shared <see cref="System.Buffers.ArrayPool`1"></see> instance.</returns>
</member>
</members>
</doc>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1,355 @@
<?xml version="1.0" encoding="utf-8"?><doc>
<assembly>
<name>System.Memory</name>
</assembly>
<members>
<member name="T:System.Span`1">
<typeparam name="T"></typeparam>
</member>
<member name="M:System.Span`1.#ctor(`0[])">
<param name="array"></param>
</member>
<member name="M:System.Span`1.#ctor(System.Void*,System.Int32)">
<param name="pointer"></param>
<param name="length"></param>
</member>
<member name="M:System.Span`1.#ctor(`0[],System.Int32)">
<param name="array"></param>
<param name="start"></param>
</member>
<member name="M:System.Span`1.#ctor(`0[],System.Int32,System.Int32)">
<param name="array"></param>
<param name="start"></param>
<param name="length"></param>
</member>
<member name="M:System.Span`1.Clear">
</member>
<member name="M:System.Span`1.CopyTo(System.Span{`0})">
<param name="destination"></param>
</member>
<member name="M:System.Span`1.DangerousCreate(System.Object,`0@,System.Int32)">
<param name="obj"></param>
<param name="objectData"></param>
<param name="length"></param>
<returns></returns>
</member>
<member name="M:System.Span`1.DangerousGetPinnableReference">
<returns></returns>
</member>
<member name="P:System.Span`1.Empty">
<returns></returns>
</member>
<member name="M:System.Span`1.Equals(System.Object)">
<param name="obj"></param>
<returns></returns>
</member>
<member name="M:System.Span`1.Fill(`0)">
<param name="value"></param>
</member>
<member name="M:System.Span`1.GetHashCode">
<returns></returns>
</member>
<member name="P:System.Span`1.IsEmpty">
<returns></returns>
</member>
<member name="P:System.Span`1.Item(System.Int32)">
<param name="index"></param>
<returns></returns>
</member>
<member name="P:System.Span`1.Length">
<returns></returns>
</member>
<member name="M:System.Span`1.op_Equality(System.Span{`0},System.Span{`0})">
<param name="left"></param>
<param name="right"></param>
<returns></returns>
</member>
<member name="M:System.Span`1.op_Implicit(System.ArraySegment{T})~System.Span{T}">
<param name="arraySegment"></param>
<returns></returns>
</member>
<member name="M:System.Span`1.op_Implicit(System.Span{T})~System.ReadOnlySpan{T}">
<param name="span"></param>
<returns></returns>
</member>
<member name="M:System.Span`1.op_Implicit(T[])~System.Span{T}">
<param name="array"></param>
<returns></returns>
</member>
<member name="M:System.Span`1.op_Inequality(System.Span{`0},System.Span{`0})">
<param name="left"></param>
<param name="right"></param>
<returns></returns>
</member>
<member name="M:System.Span`1.Slice(System.Int32)">
<param name="start"></param>
<returns></returns>
</member>
<member name="M:System.Span`1.Slice(System.Int32,System.Int32)">
<param name="start"></param>
<param name="length"></param>
<returns></returns>
</member>
<member name="M:System.Span`1.ToArray">
<returns></returns>
</member>
<member name="M:System.Span`1.TryCopyTo(System.Span{`0})">
<param name="destination"></param>
<returns></returns>
</member>
<member name="T:System.SpanExtensions">
</member>
<member name="M:System.SpanExtensions.AsBytes``1(System.ReadOnlySpan{``0})">
<param name="source"></param>
<typeparam name="T"></typeparam>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.AsBytes``1(System.Span{``0})">
<param name="source"></param>
<typeparam name="T"></typeparam>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.AsSpan(System.String)">
<param name="text"></param>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.AsSpan``1(System.ArraySegment{``0})">
<param name="arraySegment"></param>
<typeparam name="T"></typeparam>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.AsSpan``1(``0[])">
<param name="array"></param>
<typeparam name="T"></typeparam>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.CopyTo``1(``0[],System.Span{``0})">
<param name="array"></param>
<param name="destination"></param>
<typeparam name="T"></typeparam>
</member>
<member name="M:System.SpanExtensions.IndexOf(System.Span{System.Byte},System.ReadOnlySpan{System.Byte})">
<param name="span"></param>
<param name="value"></param>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.IndexOf(System.Span{System.Byte},System.Byte)">
<param name="span"></param>
<param name="value"></param>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.IndexOf(System.ReadOnlySpan{System.Byte},System.Byte)">
<param name="span"></param>
<param name="value"></param>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.IndexOf(System.ReadOnlySpan{System.Byte},System.ReadOnlySpan{System.Byte})">
<param name="span"></param>
<param name="value"></param>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.IndexOf``1(System.ReadOnlySpan{``0},System.ReadOnlySpan{``0})">
<param name="span"></param>
<param name="value"></param>
<typeparam name="T"></typeparam>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.IndexOf``1(System.ReadOnlySpan{``0},``0)">
<param name="span"></param>
<param name="value"></param>
<typeparam name="T"></typeparam>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.IndexOf``1(System.Span{``0},System.ReadOnlySpan{``0})">
<param name="span"></param>
<param name="value"></param>
<typeparam name="T"></typeparam>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.IndexOf``1(System.Span{``0},``0)">
<param name="span"></param>
<param name="value"></param>
<typeparam name="T"></typeparam>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.IndexOfAny(System.ReadOnlySpan{System.Byte},System.Byte,System.Byte,System.Byte)">
<param name="span"></param>
<param name="value0"></param>
<param name="value1"></param>
<param name="value2"></param>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.IndexOfAny(System.Span{System.Byte},System.Byte,System.Byte,System.Byte)">
<param name="span"></param>
<param name="value0"></param>
<param name="value1"></param>
<param name="value2"></param>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.IndexOfAny(System.Span{System.Byte},System.Byte,System.Byte)">
<param name="span"></param>
<param name="value0"></param>
<param name="value1"></param>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.IndexOfAny(System.ReadOnlySpan{System.Byte},System.ReadOnlySpan{System.Byte})">
<param name="span"></param>
<param name="values"></param>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.IndexOfAny(System.Span{System.Byte},System.ReadOnlySpan{System.Byte})">
<param name="span"></param>
<param name="values"></param>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.IndexOfAny(System.ReadOnlySpan{System.Byte},System.Byte,System.Byte)">
<param name="span"></param>
<param name="value0"></param>
<param name="value1"></param>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.NonPortableCast``2(System.ReadOnlySpan{``0})">
<param name="source"></param>
<typeparam name="TFrom"></typeparam>
<typeparam name="TTo"></typeparam>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.NonPortableCast``2(System.Span{``0})">
<param name="source"></param>
<typeparam name="TFrom"></typeparam>
<typeparam name="TTo"></typeparam>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.SequenceEqual(System.ReadOnlySpan{System.Byte},System.ReadOnlySpan{System.Byte})">
<param name="first"></param>
<param name="second"></param>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.SequenceEqual(System.Span{System.Byte},System.ReadOnlySpan{System.Byte})">
<param name="first"></param>
<param name="second"></param>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.SequenceEqual``1(System.ReadOnlySpan{``0},System.ReadOnlySpan{``0})">
<param name="first"></param>
<param name="second"></param>
<typeparam name="T"></typeparam>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.SequenceEqual``1(System.Span{``0},System.ReadOnlySpan{``0})">
<param name="first"></param>
<param name="second"></param>
<typeparam name="T"></typeparam>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.StartsWith(System.ReadOnlySpan{System.Byte},System.ReadOnlySpan{System.Byte})">
<param name="span"></param>
<param name="value"></param>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.StartsWith(System.Span{System.Byte},System.ReadOnlySpan{System.Byte})">
<param name="span"></param>
<param name="value"></param>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.StartsWith``1(System.ReadOnlySpan{``0},System.ReadOnlySpan{``0})">
<param name="span"></param>
<param name="value"></param>
<typeparam name="T"></typeparam>
<returns></returns>
</member>
<member name="M:System.SpanExtensions.StartsWith``1(System.Span{``0},System.ReadOnlySpan{``0})">
<param name="span"></param>
<param name="value"></param>
<typeparam name="T"></typeparam>
<returns></returns>
</member>
<member name="T:System.ReadOnlySpan`1">
<typeparam name="T"></typeparam>
</member>
<member name="M:System.ReadOnlySpan`1.#ctor(`0[])">
<param name="array"></param>
</member>
<member name="M:System.ReadOnlySpan`1.#ctor(System.Void*,System.Int32)">
<param name="pointer"></param>
<param name="length"></param>
</member>
<member name="M:System.ReadOnlySpan`1.#ctor(`0[],System.Int32)">
<param name="array"></param>
<param name="start"></param>
</member>
<member name="M:System.ReadOnlySpan`1.#ctor(`0[],System.Int32,System.Int32)">
<param name="array"></param>
<param name="start"></param>
<param name="length"></param>
</member>
<member name="M:System.ReadOnlySpan`1.CopyTo(System.Span{`0})">
<param name="destination"></param>
</member>
<member name="M:System.ReadOnlySpan`1.DangerousCreate(System.Object,`0@,System.Int32)">
<param name="obj"></param>
<param name="objectData"></param>
<param name="length"></param>
<returns></returns>
</member>
<member name="M:System.ReadOnlySpan`1.DangerousGetPinnableReference">
<returns></returns>
</member>
<member name="P:System.ReadOnlySpan`1.Empty">
<returns></returns>
</member>
<member name="M:System.ReadOnlySpan`1.Equals(System.Object)">
<param name="obj"></param>
<returns></returns>
</member>
<member name="M:System.ReadOnlySpan`1.GetHashCode">
<returns></returns>
</member>
<member name="P:System.ReadOnlySpan`1.IsEmpty">
<returns></returns>
</member>
<member name="P:System.ReadOnlySpan`1.Item(System.Int32)">
<param name="index"></param>
<returns></returns>
</member>
<member name="P:System.ReadOnlySpan`1.Length">
<returns></returns>
</member>
<member name="M:System.ReadOnlySpan`1.op_Equality(System.ReadOnlySpan{`0},System.ReadOnlySpan{`0})">
<param name="left"></param>
<param name="right"></param>
<returns></returns>
</member>
<member name="M:System.ReadOnlySpan`1.op_Implicit(System.ArraySegment{T})~System.ReadOnlySpan{T}">
<param name="arraySegment"></param>
<returns></returns>
</member>
<member name="M:System.ReadOnlySpan`1.op_Implicit(T[])~System.ReadOnlySpan{T}">
<param name="array"></param>
<returns></returns>
</member>
<member name="M:System.ReadOnlySpan`1.op_Inequality(System.ReadOnlySpan{`0},System.ReadOnlySpan{`0})">
<param name="left"></param>
<param name="right"></param>
<returns></returns>
</member>
<member name="M:System.ReadOnlySpan`1.Slice(System.Int32)">
<param name="start"></param>
<returns></returns>
</member>
<member name="M:System.ReadOnlySpan`1.Slice(System.Int32,System.Int32)">
<param name="start"></param>
<param name="length"></param>
<returns></returns>
</member>
<member name="M:System.ReadOnlySpan`1.ToArray">
<returns></returns>
</member>
<member name="M:System.ReadOnlySpan`1.TryCopyTo(System.Span{`0})">
<param name="destination"></param>
<returns></returns>
</member>
</members>
</doc>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More