tytd-server/Program.cs

1393 lines
70 KiB
C#
Raw Normal View History

2021-06-25 08:30:45 +00:00
using System.Linq;
using SimpleHttp;
2021-06-24 01:10:20 +00:00
using System;
2021-06-24 02:55:41 +00:00
using System.Collections.Generic;
2021-06-24 01:10:20 +00:00
using System.IO;
using System.IO.Pipes;
using System.Reflection;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Threading;
2021-12-08 01:07:43 +00:00
using TYTD.Server.Models;
2021-06-25 08:30:45 +00:00
using Newtonsoft.Json;
2021-09-25 19:33:10 +00:00
2021-09-25 06:18:12 +00:00
using System.Net;
using System.Threading.Tasks;
2021-12-08 01:07:43 +00:00
using TYTD.Server.Functions;
2021-12-08 22:02:30 +00:00
using YoutubeExplode.Videos;
using YoutubeExplode;
using YoutubeExplode.Videos.Streams;
2022-01-03 16:35:57 +00:00
using PlaylistsNET;
using PlaylistsNET.Content;
using PlaylistsNET.Models;
using PlaylistsNET.Utils;
using YoutubeExplode.Playlists;
2022-02-24 23:37:01 +00:00
using Dasync.Collections;
using YoutubeExplode.Search;
2021-12-08 01:07:43 +00:00
namespace TYTD
2021-06-24 01:10:20 +00:00
{
2021-08-03 19:39:03 +00:00
2022-01-03 16:35:57 +00:00
static class Program
2021-06-24 01:10:20 +00:00
{
2022-01-03 16:35:57 +00:00
public static void RemoveRange<T>(this List<T> list,IEnumerable<T> items)
{
foreach(var item in items)
{
list.Remove(item);
}
}
static string webSitePath;
2021-06-28 16:42:57 +00:00
static void Main(string[] arg)
2021-06-24 01:10:20 +00:00
{
2021-12-08 22:02:30 +00:00
Downloader.GetManifest = GetManifest;
2021-08-03 19:39:03 +00:00
Thread t = new Thread(new ThreadStart(() => {
2021-12-08 01:07:43 +00:00
Downloader.DL.DownloadThread().GetAwaiter().GetResult();
2021-06-24 03:41:34 +00:00
}));
t.Start();
2021-06-25 08:30:45 +00:00
Thread t2 = new Thread(new ThreadStart(() => {
2021-12-08 01:07:43 +00:00
Downloader.DL.ListenForQueueItem().GetAwaiter().GetResult();
2021-06-25 08:30:45 +00:00
}));
2021-12-08 01:07:43 +00:00
2021-06-25 08:30:45 +00:00
t2.Start();
2021-08-26 10:44:54 +00:00
2021-09-25 06:18:12 +00:00
2021-06-24 01:10:20 +00:00
// we need to get our app name so that
// we can create unique names for our mutex and our pipe
2021-12-08 01:07:43 +00:00
webSitePath = Downloader.DL.GetPath(true, "WebSite");
2021-08-25 09:11:08 +00:00
2021-10-24 12:52:24 +00:00
Route.Before += Route_Before;
/* Generic */
Route.Add("/api/AddItems", (HttpAction)AddItems, "POST");
2021-11-14 12:57:02 +00:00
Route.Add("/api/AddItem/{Id}", (HttpAction)AddItem);
Route.Add("/api/AddItemRes/{R}/{Id}", (HttpAction)AddItemRes);
Route.Add("/api/AddFile/{Url}", (HttpAction)AddFile);
Route.Add("/api/AddCaptions/{Id}", (HttpAction)AddCaptions);
/* Videos */
2022-02-24 23:37:01 +00:00
Route.Add("/api/AddVideoInfo/{Id}", AddVideoInfo);
Route.Add("/api/AddVideo/{Id}", (HttpAction)AddVideo);
Route.Add("/api/AddVideoRes/{R}/{Id}", (HttpAction)AddVideoRes);
Route.Add("/api/Redownload", (HttpAction)Redownload);
Route.Add("/api/Redownload/{R}", (HttpAction)RedownloadRes);
Route.Add("/api/Watch/{VideoId}", (HttpAction)Watch);
2022-02-24 21:22:23 +00:00
Route.Add("/api/VideoInfo/{Id}",(HttpAction)VideoInfo);
/* Playlist */
2022-02-24 23:37:01 +00:00
Route.Add("/api/AddPlaylistOnly/{Id}", AddPlaylistOnly);
Route.Add("/api/AddPlaylist/{Id}", (HttpAction)AddPlaylist);
Route.Add("/api/AddPlaylistRes/{R}/{Id}", (HttpAction)AddPlaylistRes);
2022-01-03 16:35:57 +00:00
Route.Add("/api/PersonalPlaylist/{PlaylistName}",(HttpAction)PersonalPlaylist);
Route.Add("/api/CreatePlaylist/{Ids}/playlist.{extension}", (HttpAction)CreatePlaylist);
Route.Add("/api/CreatePlaylistRes/{Ids}/playlist.{extension}", (HttpAction)CreatePlaylistRes);
2022-02-24 21:22:23 +00:00
Route.Add("/api/PlaylistInfo/{Id}", (HttpAction)PlaylistInfo);
2022-02-24 23:37:01 +00:00
Route.Add("/api/ListPlaylists/", (HttpAction)ListPlaylists);
/* Search */
Route.Add("/api/SearchOnly/{text}", (HttpAction)SearchOnly);
Route.Add("/api/Search/{text}", (HttpAction)Search);
2022-02-24 23:37:01 +00:00
Route.Add("/api/SearchPage/", SearchPage);
Route.Add("/api/SearchPage/{query}",SearchPage);
Route.Add("/api/SearchPage/",SearchPage,"POST");
Route.Add("/api/SearchVideos/", (HttpAction)SearchVideos,"POST");
Route.Add("/api/SearchVideos/{query}", (HttpAction)SearchVideos, "GET");
Route.Add("/api/SearchVideos/", (HttpAction)SearchVideos, "GET");
/* Channel */
2022-02-24 23:37:01 +00:00
Route.Add("/api/AddChannelOnly/{Id}", AddChannelOnly);
Route.Add("/api/AddChannel/{Id}", (HttpAction)AddChannel);
Route.Add("/api/AddChannelRes/{R}/{Id}", (HttpAction)AddChannelRes);
2021-06-27 17:22:18 +00:00
/* User */
2022-02-24 23:37:01 +00:00
Route.Add("/api/AddUserOnly/{Id}", AddUserOnly);
Route.Add("/api/AddUser/{Id}", (HttpAction)AddUser);
Route.Add("/api/AddUserRes/{R}/{Id}", (HttpAction)AddUserRes);
2021-08-25 09:11:08 +00:00
/* Queue and Progress */
Route.Add("/api/QueueList", (HttpAction)QueueList);
2022-02-24 21:22:23 +00:00
Route.Add("/api/QueueListPage/", (HttpAction)QueueListHtml);
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/Progress.html", (HttpAction)VideoProgressHtml);
2021-12-08 01:07:43 +00:00
Route.Add("/api/Redo", (HttpAction)Redo);
Route.Add("/api/Cancel", (HttpAction)Cancel);
/* Storage */
Route.Add("/api/Storage/GetDirectories/{Path}", (HttpAction)StorageGetDirectories);
Route.Add("/api/Storage/GetFiles/{Path}", (HttpAction)StorageGetFiles);
Route.Add("/api/Storage/DirectoryExists/{Path}", (HttpAction)StorageDirectoryExists);
Route.Add("/api/Storage/FileExists/{Path}", (HttpAction)StorageFileExists);
Route.Add("/api/Storage/File/{Path}", (HttpAction)StorageFile);
2021-10-24 12:52:24 +00:00
Route.Add("/api/Storage/Video/{Id}",(HttpAction)Video);
Route.Add("/api/Storage/VideoRes/{Res}/{Id}",(HttpAction)VideoRes);
Route.Add("/api/upload/", (HttpAction)UploadFiles, "POST");
2021-06-24 03:41:34 +00:00
2021-12-12 10:04:16 +00:00
Route.Add("/api/endpoint", (HttpAction)Endpoint,"POST");
2022-01-03 16:35:57 +00:00
2021-12-08 01:16:23 +00:00
ApiLoader.Init();
/* Other */
Route.Add("/", (HttpAction)Index);
2021-12-08 07:24:25 +00:00
Route.Add("/extensions.html", (HttpAction)Extensions);
2021-12-08 01:07:43 +00:00
Route.Add("/{Path}", (HttpAction)RootPath);
2021-12-12 10:04:16 +00:00
Route.Add("/{Path}",(HttpAction)UploadFilePut,"PUT");
2022-02-19 08:54:43 +00:00
Console.CancelKeyPress += (sender, e) => { ApiLoader.Dispose();var date = DateTime.Now.ToString("yyyyMMdd_HHmmss");Directory.CreateDirectory(Path.Combine("config","queues-close")); File.WriteAllText(Path.Combine("config", "queues-close", $"{date}.json"), Downloader.GetQueue()); Console.WriteLine("TYTD has Closed"); Environment.Exit(0); };
2021-12-08 01:16:23 +00:00
2021-12-08 01:07:43 +00:00
Console.WriteLine("Almost Ready To Listen");
if (arg.Length > 0)
2021-06-25 08:30:45 +00:00
{
2021-06-24 03:41:34 +00:00
HttpServer.ListenAsync(arg[0], CancellationToken.None, Route.OnHttpRequestAsync).Wait();
2021-08-03 19:39:03 +00:00
}
else
2021-06-25 08:30:45 +00:00
{
HttpServer.ListenAsync(3250, CancellationToken.None, Route.OnHttpRequestAsync).Wait();
}
}
2021-08-03 19:39:03 +00:00
public static void AddEscapedHtml<T>(this Dictionary<T,string> dict,T key,string value)
{
dict.Add(key, WebUtility.HtmlEncode(value));
}
2021-12-12 10:04:16 +00:00
2021-12-08 22:02:30 +00:00
private static async Task<StreamManifest> GetManifest(YoutubeClient arg1, VideoId arg2)
{
2021-12-31 15:28:34 +00:00
return await arg1.Videos.Streams.GetManifestAsync(arg2);
2021-12-08 22:02:30 +00:00
}
#region Generic
private static void AddItems(HttpListenerRequest request, HttpListenerResponse response, Dictionary<string, string> arguments)
{
var f = request.ParseBody(arguments);
foreach (var file in f.Values)
2021-06-25 08:30:45 +00:00
{
2021-06-24 01:10:20 +00:00
using (var req = new StreamReader(file.Value))
2021-09-25 19:33:10 +00:00
{
List<IDResolutionTypeTriplet> tripletlst = JsonConvert.DeserializeObject<List<IDResolutionTypeTriplet>>(req.ReadToEnd());
2021-12-08 01:07:43 +00:00
Downloader.DownloadItems(tripletlst);
response.Redirect("/");
2021-09-25 19:33:10 +00:00
}
}
2021-06-25 08:30:45 +00:00
2021-08-03 19:39:03 +00:00
2021-11-14 12:57:02 +00:00
}
public static void AddItem(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
2021-12-08 01:07:43 +00:00
Downloader.DownloadItem(System.Web.HttpUtility.UrlDecode(args["Id"]));
2021-11-14 12:57:02 +00:00
rq.RedirectIt(rp);
2021-11-14 12:57:02 +00:00
}
public static void AddItemRes(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
2021-12-08 01:07:43 +00:00
Downloader.DownloadItem(System.Web.HttpUtility.UrlDecode(args["Id"]), (Resolution)int.Parse(args["R"]));
rq.RedirectIt(rp);
}
public static void AddFile(HttpListenerRequest request, HttpListenerResponse response, Dictionary<string, string> arguments)
{
2021-12-08 01:07:43 +00:00
Downloader.DownloadFile(arguments["Url"]);
request.RedirectIt(response);
}
public static void AddCaptions(HttpListenerRequest request, HttpListenerResponse response, Dictionary<string, string> arguments)
{
2021-12-08 01:07:43 +00:00
Downloader.DownloadCaptions(arguments["Id"]);
request.RedirectIt(response);
2022-02-19 08:54:43 +00:00
}
#endregion
#region Video
public static void VideoInfo(HttpListenerRequest request,HttpListenerResponse response,Dictionary<string,string> args)
{
//"<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"UTF-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><title>{Title}</title></head><body><h1>{Title}</h1><h3>{AuthorTitle}</h3><table><thead><tr><th></th><th></th></tr></thead><tbody>{Elements}</tbody></table></body></html>"
//video id
VideoId? id=VideoId.TryParse(args["Id"]);
if(id.HasValue)
{
var item=JsonConvert.DeserializeObject<SavedVideo>(File.ReadAllText(Path.Combine("Info", $"{id.Value.Value}.json")));
Dictionary<string, string> videos = new Dictionary<string, string>();
videos.AddEscapedHtml("Title", item.Title);
videos.AddEscapedHtml("Id", item.Id);
videos.AddEscapedHtml("AuthorTitle", item.AuthorTitle);
videos.AddEscapedHtml("AuthorChannelId", item.AuthorChannelId);
videos.AddEscapedHtml("DurationStringLong", TimeSpan.FromSeconds(item.Duration).ToString());
videos.AddEscapedHtml("DurationNumber", item.Duration.ToString());
videos.AddEscapedHtml("Likes", item.Likes.ToString());
videos.AddEscapedHtml("Dislikes", item.Dislikes.ToString());
videos.AddEscapedHtml("Views", item.Views.ToString());
videos.AddEscapedHtml("Description", item.Description);
videos.AddEscapedHtml("UploadDate", DateTime.Parse(item.UploadDate).ToShortDateString());
2022-02-24 23:37:01 +00:00
string res=ApiLoader.RenderFileOrDefault("WebSite/err/video_list/VideoInfo.html", "<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"UTF-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><title>Information about {Title}</title></head><body><h1>Video Info for {Title}</h1>Playback: <a href=\"../../api/Storage/File/NotConverted/{Id}.mp4\">SD</a> <a href=\"../../api/Storage/File/Converted/{Id}.mp4\">HD</a> <a href=\"../../api/Storage/File/Audio/{Id}.mp4\">Audio</a><br>Download: <a href=\"../../api/Storage/VideoRes/1/{Id}\">SD</a> <a href=\"../../api/Storage/VideoRes/0/{Id}\">HD</a> <a href=\"../../api/Storage/VideoRes/2/{Id}\">Audio</a><br>Add To Server: <a href=\"../../api/AddVideoRes/1/{Id}\">SD</a> <a href=\"../../api/AddVideoRes/0/{Id}\">HD</a> <a href=\"../../api/AddVideoRes/2/{Id}\">Audio</a><br><h3>Video Id: {Id}</h3><h3>Video Channel: {AuthorTitle}</h3><h3>Video Channel Id: {AuthorChannelId}</h3><h3>Likes: {Likes}, Dislikes: {Dislikes}, Views: {Views}</h3><h3>Upload Date: {UploadDate}</h3><h3>Duration: {DurationStringLong}</h3><h3>Description:</h3><p>{Description}</p></body></html>", videos);
response.AsText(res);
}
else
{
response.AsText("Invalid Video Id");
}
}
2022-02-24 23:37:01 +00:00
public static async Task AddVideoInfo(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
2022-02-24 23:37:01 +00:00
await Downloader.DownloadVideoInfo(System.Web.HttpUtility.UrlDecode(args["Id"]), Resolution.NoConvert);
rq.RedirectIt(rp);
2022-02-19 08:54:43 +00:00
}
public static void AddVideo(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
2021-12-08 01:07:43 +00:00
Downloader.DownloadVideo(System.Web.HttpUtility.UrlDecode(args["Id"]));
2021-06-25 10:55:27 +00:00
rq.RedirectIt(rp);
}
2021-10-24 12:52:24 +00:00
public static void AddVideoRes(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
2021-12-08 01:07:43 +00:00
Downloader.DownloadVideo(System.Web.HttpUtility.UrlDecode(args["Id"]), (Resolution)int.Parse(args["R"]));
rq.RedirectIt(rp);
}
public static void Redownload(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
2021-12-08 01:07:43 +00:00
foreach (var item in Directory.GetFiles(Downloader.DL.GetPath(true, "Info"), "*.json"))
2021-06-25 10:55:27 +00:00
{
2021-12-12 10:04:16 +00:00
string id =Path.GetFileNameWithoutExtension(item);
if(!File.Exists(Path.Combine("NotConverted",$"{id}.mp4")))
{
Downloader.DownloadVideo(id, Resolution.NoConvert);
}
}
rq.RedirectIt(rp);
}
public static void RedownloadRes(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
int res=int.Parse(args["R"]);
if(res > 2)
{
rq.RedirectIt(rp);
return;
}
string res_str = new[]{"Converted","NotConverted","Audio"}[res];
2021-12-08 01:07:43 +00:00
foreach (var item in Directory.GetFiles(Downloader.DL.GetPath(true, "Info"), "*.json"))
2021-06-25 10:55:27 +00:00
{
string id = Path.GetFileNameWithoutExtension(item);
if (!File.Exists(Path.Combine(res_str, $"{id}.mp4")))
{
Downloader.DownloadVideo(id, (Resolution)res);
}
}
rq.RedirectIt(rp);
}
public static void Watch(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
var txt = Templating.RenderFile(Path.Combine(webSitePath, "watch_page.thtml"), args); //populate template
rp.AsText(txt);
}
#endregion
#region Playlist
2022-02-24 23:37:01 +00:00
public static async Task AddPlaylistOnly(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
2022-02-24 23:37:01 +00:00
await Downloader.DownloadPlaylistOnly(System.Web.HttpUtility.UrlDecode(args["Id"]), Resolution.NoConvert);
rq.RedirectIt(rp);
}
public static void AddPlaylist(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
2021-12-08 01:07:43 +00:00
Downloader.DownloadPlaylist(System.Web.HttpUtility.UrlDecode(args["Id"]));
2021-06-25 10:55:27 +00:00
rq.RedirectIt(rp);
}
public static void AddPlaylistRes(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
2021-12-08 01:07:43 +00:00
Downloader.DownloadPlaylist(System.Web.HttpUtility.UrlDecode(args["Id"]), (Resolution)int.Parse(args["R"]));
rq.RedirectIt(rp);
2022-01-03 16:35:57 +00:00
}
public static void PersonalPlaylist(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
string playlistName=System.Web.HttpUtility.UrlDecode(args["PlaylistName"]);
string playlistNameWithoutExtension =Path.GetFileNameWithoutExtension(playlistName);
string path= Path.Combine("PersonalPlaylist", $"{playlistNameWithoutExtension}.json");
string extension = Path.GetExtension(playlistName);
List<(string Id, Resolution Resolution)> list = JsonConvert.DeserializeObject<List<(string Id, Resolution Resolution)>>(File.ReadAllText(path));
string mimeType;
rp.AsText(CreatePlaylistString(rq, list, extension, out mimeType),mimeType);
}
public static void CreatePlaylist(HttpListenerRequest rq,HttpListenerResponse rp,Dictionary<string,string> args)
{
// Route.Add("/api/PersonalPlaylist/{PlaylistName}", (HttpAction)PersonalPlaylist);
//Route.Add("/api/CreatePlaylist/{Ids}/playlist.{extension}", (HttpAction)CreatePlaylist);
//Route.Add("/api/CreatePlaylistRes/{Ids}/playlist.{extension}", (HttpAction)CreatePlaylistRes);
string[] ids= System.Web.HttpUtility.UrlDecode(args["Ids"]).Split(',');
var list = new List<(string Id, Resolution Resolution)>();
foreach (var id in ids)
{
list.Add((id, Resolution.NoConvert));
}
string mimeType;
rp.AsText(CreatePlaylistString(rq, list, args["extension"],out mimeType),mimeType);
}
public static void CreatePlaylistRes(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
string[] ids = System.Web.HttpUtility.UrlDecode(args["Ids"]).Split(',');
var list = new List<(string Id, Resolution Resolution)>();
for (int i=0;i<list.Count;i+=2)
{
string id = ids[i];
string res = ids[i + 1];
list.Add((id,(Resolution)int.Parse(res)));
}
string mimeType;
rp.AsText(CreatePlaylistString(rq, list, args["extension"], out mimeType),mimeType);
}
public static string CreatePlaylistString(HttpListenerRequest req, List<(string Id, Resolution Resolution)> videoIds, string ext,out string mimeType)
{
string[] _res = { "Converted", "NotConverted", "Audio" };
string UrlBegin = GetServerRoot(req);
string ext2 = ext.TrimStart('.');
if (ext2 == "m3u" || ext2 == "m3u8")
{
M3uPlaylist playlist = new M3uPlaylist();
playlist.IsExtended = true;
foreach (var item in videoIds)
{
M3uPlaylistEntry entry = new M3uPlaylistEntry();
entry.Path = UrlBegin.TrimEnd('/') + $"/api/Storage/File/{_res[(int)item.Resolution]}/{item.Id}.mp4";
var video = JsonConvert.DeserializeObject<SavedVideo>(File.ReadAllText(Path.Combine("Info", $"{item.Id}.json")));
entry.Title = video.Title;
entry.AlbumArtist = video.AuthorTitle;
entry.Duration = TimeSpan.FromSeconds(video.Duration);
playlist.PlaylistEntries.Add(entry);
}
M3uContent content = new M3uContent();
mimeType = "audio/x-mpegurl";
return content.ToText(playlist);
} else if (ext2 == "wpl")
{
WplPlaylist playlist = new WplPlaylist();
foreach (var item in videoIds)
{
WplPlaylistEntry entry = new WplPlaylistEntry();
entry.Path = UrlBegin.TrimEnd('/') + $"/api/Storage/File/{_res[(int)item.Resolution]}/{item.Id}.mp4";
var video = JsonConvert.DeserializeObject<SavedVideo>(File.ReadAllText(Path.Combine("Info", $"{item.Id}.json")));
entry.TrackTitle = video.Title;
entry.TrackArtist = video.AuthorTitle;
entry.Duration = TimeSpan.FromSeconds(video.Duration);
playlist.PlaylistEntries.Add(entry);
}
WplContent content = new WplContent();
mimeType = "application/vnd.ms-wpl";
return content.ToText(playlist);
} else if (ext2 == "pls")
{
PlsPlaylist playlist = new PlsPlaylist();
int i = 1;
foreach (var item in videoIds)
{
PlsPlaylistEntry entry = new PlsPlaylistEntry();
entry.Path = UrlBegin.TrimEnd('/') + $"/api/Storage/File/{_res[(int)item.Resolution]}/{item.Id}.mp4";
var video = JsonConvert.DeserializeObject<SavedVideo>(File.ReadAllText(Path.Combine("Info", $"{item.Id}.json")));
entry.Title = video.Title;
entry.Nr = i++;
playlist.PlaylistEntries.Add(entry);
}
mimeType = "audio/x-scpls";
PlsContent content = new PlsContent();
return content.ToText(playlist);
} else if (ext2 == "zpl")
{
ZplPlaylist playlist = new ZplPlaylist();
foreach (var item in videoIds)
{
ZplPlaylistEntry entry = new ZplPlaylistEntry();
entry.Path = UrlBegin.TrimEnd('/') + $"/api/Storage/File/{_res[(int)item.Resolution]}/{item.Id}.mp4";
var video = JsonConvert.DeserializeObject<SavedVideo>(File.ReadAllText(Path.Combine("Info", $"{item.Id}.json")));
entry.TrackTitle = video.Title;
entry.TrackArtist = video.AuthorTitle;
entry.Duration = TimeSpan.FromSeconds(video.Duration);
playlist.PlaylistEntries.Add(entry);
}
mimeType = "application/vnd.ms-zpl";
ZplContent content = new ZplContent();
return content.ToText(playlist);
}
mimeType = "text/plain";
return "Invalid";
}
public static void ListPlaylists(HttpListenerRequest request,HttpListenerResponse resp,Dictionary<string,string> args)
{
2022-02-24 23:37:01 +00:00
string htmlBeforeProcessed = ApiLoader.ReadAllTextOrDefault("WebSite/err/playlist_list/element.html", "<tr><td><img src=\"../Storage/File/Thumbnails/120x90/{FirstVideoId}.jpg\" alt=\"\" width=\"120\" height=\"90\"></td><td><a href=\"../PlaylistInfo/{Id}\">{Title}</a><h5>{AuthorTitle}</h5></td></tr>");
StringBuilder builder = new StringBuilder();
foreach (var f in Directory.EnumerateFiles("Playlist","*.json"))
{
Dictionary<string, string> playlist = new Dictionary<string, string>();
bool add = true;
var plitem = JsonConvert.DeserializeObject<SavedPlaylist>(File.ReadAllText(f));
try
{
playlist.AddEscapedHtml("Title", plitem.Title);
playlist.AddEscapedHtml("Id", plitem.Id);
playlist.AddEscapedHtml("AuthorTitle", plitem.AuthorTitle);
playlist.AddEscapedHtml("AuthorChannelId", plitem.AuthorChannelId);
playlist.AddEscapedHtml("Description", plitem.Description);
playlist.AddEscapedHtml("FirstVideoId", plitem.Videos[0]);
}catch(Exception)
{
add = false;
}
if(add)
builder.Append(Templating.RenderString(htmlBeforeProcessed, playlist));
}
Dictionary<string, string> main = new Dictionary<string, string>();
main.Add("Elements", builder.ToString());
2022-01-03 16:35:57 +00:00
string res = ApiLoader.RenderFileOrDefault("WebSite/err/playlist_list/main.html", "<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"UTF-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><title>All Playlists</title></head><body><h1>All Playlists</h1><table><thead><tr><th></th><th></th></tr></thead><tbody>{Elements}</tbody></table></body></html>", main);
resp.AsText(res);
}
public static void PlaylistInfo(HttpListenerRequest request, HttpListenerResponse response, Dictionary<string, string> args)
{
//video id
PlaylistId? id = PlaylistId.TryParse(args["Id"]);
if (id.HasValue)
{
var plitem = JsonConvert.DeserializeObject<SavedPlaylist>(File.ReadAllText(Path.Combine("Playlist", $"{id.Value.Value}.json")));
2022-02-24 21:33:04 +00:00
string htmlBeforeProcessed = ApiLoader.ReadAllTextOrDefault("WebSite/err/video_list/element.html", "<tr><td><img src=\"../api/Storage/File/Thumbnails/120x90/{Id}.jpg\" alt=\"\" width=\"120\" height=\"90\"></td><td><a href=\"../VideoInfo/{Id}\">{Title}</a><h5>{AuthorTitle}</h5></td></tr>");
StringBuilder builder = new StringBuilder();
foreach (var v in plitem.Videos)
{
2022-02-24 23:37:01 +00:00
string path = Path.Combine("Info", $"{v}.json");
if (!File.Exists(path))
{
continue;
}
2022-02-24 21:35:38 +00:00
try
{
2022-02-24 23:37:01 +00:00
var item = JsonConvert.DeserializeObject<SavedVideo>(File.ReadAllText(path));
2022-02-24 21:35:38 +00:00
Dictionary<string, string> videos = new Dictionary<string, string>();
videos.AddEscapedHtml("Title", item.Title);
videos.AddEscapedHtml("Id", item.Id);
videos.AddEscapedHtml("AuthorTitle", item.AuthorTitle);
videos.AddEscapedHtml("AuthorChannelId", item.AuthorChannelId);
videos.AddEscapedHtml("DurationStringLong", TimeSpan.FromSeconds(item.Duration).ToString());
videos.AddEscapedHtml("DurationNumber", item.Duration.ToString());
videos.AddEscapedHtml("Likes", item.Likes.ToString());
videos.AddEscapedHtml("Dislikes", item.Dislikes.ToString());
videos.AddEscapedHtml("Views", item.Views.ToString());
videos.AddEscapedHtml("Description", item.Description);
videos.AddEscapedHtml("UploadDate", DateTime.Parse(item.UploadDate).ToShortDateString());
builder.Append(Templating.RenderString(htmlBeforeProcessed, videos));
}catch(Exception ex)
{
_ = ex;
}
}
Dictionary<string, string> playlist = new Dictionary<string, string>();
playlist.Add("Elements", builder.ToString());
playlist.AddEscapedHtml("Title", plitem.Title);
playlist.AddEscapedHtml("Id", plitem.Id);
playlist.AddEscapedHtml("AuthorTitle", plitem.AuthorTitle);
playlist.AddEscapedHtml("AuthorChannelId", plitem.AuthorChannelId);
playlist.AddEscapedHtml("Description",plitem.Description);
string res = ApiLoader.RenderFileOrDefault("WebSite/err/playlist_list/PlaylistInfo.html", "<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"UTF-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><title>{Title}</title></head><body><h1>{Title}</h1><h3>{AuthorTitle}</h3><table><thead><tr><th></th><th></th></tr></thead><tbody>{Elements}</tbody></table></body></html>",playlist);
response.AsText(res);
}
else
{
response.AsText("Invalid Video Id");
}
}
#endregion
#region Search
public static void SearchOnly(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
string search = System.Web.HttpUtility.UrlDecode(args["text"]);
2021-12-08 01:07:43 +00:00
string json = JsonConvert.SerializeObject(Downloader.Search(search, false));
rp.AsText(json, "application/json");
2021-06-25 10:55:27 +00:00
}
public static void Search(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
string search = System.Web.HttpUtility.UrlDecode(args["text"]);
2021-12-08 01:07:43 +00:00
string json = JsonConvert.SerializeObject(Downloader.Search(search));
rp.AsText(json, "application/json");
2021-06-25 10:55:27 +00:00
}
2022-02-24 23:37:01 +00:00
public static async Task SearchPage(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
if (rq.HttpMethod == "POST")
{
rq.ParseBody(args);
}
string search = "";
if (args.ContainsKey("query"))
{
search = System.Web.HttpUtility.UrlDecode(args["query"]);
}
try
{
string htmlBeforeProcessedPlaylist = ApiLoader.ReadAllTextOrDefault("WebSite/err/playlist_list/element.html", "<tr><td><img src=\"../Storage/File/Thumbnails/120x90/{FirstVideoId}.jpg\" alt=\"\" width=\"120\" height=\"90\"></td><td><a href=\"../PlaylistInfo/{Id}\">{Title}</a><h5>{AuthorTitle}</h5></td></tr>");
string htmlBeforeProcessedVideo = ApiLoader.ReadAllTextOrDefault("WebSite/err/video_list/element.html", "<tr><td><img src=\"../api/Storage/File/Thumbnails/120x90/{Id}.jpg\" alt=\"\" width=\"120\" height=\"90\"></td><td><a href=\"../VideoInfo/{Id}\">{Title}</a><h5>{AuthorTitle}</h5></td></tr>");
StringBuilder builder = new StringBuilder();
await Downloader.GetClient().Search.GetResultsAsync(search).ForEachAsync(async (e) =>
{
var video = e as VideoSearchResult;
var playlist = e as PlaylistSearchResult;
var channel = e as ChannelSearchResult;
if (video != null)
{
await Downloader.DownloadVideoInfo(video.Id, Resolution.NoConvert);
string path = Path.Combine("Info", $"{video.Id.Value}.json");
var item = JsonConvert.DeserializeObject<SavedVideo>(File.ReadAllText(path));
Dictionary<string, string> videos = new Dictionary<string, string>();
videos.AddEscapedHtml("Title", item.Title);
videos.AddEscapedHtml("Id", item.Id);
videos.AddEscapedHtml("AuthorTitle", item.AuthorTitle);
videos.AddEscapedHtml("AuthorChannelId", item.AuthorChannelId);
videos.AddEscapedHtml("DurationStringLong", TimeSpan.FromSeconds(item.Duration).ToString());
videos.AddEscapedHtml("DurationNumber", item.Duration.ToString());
videos.AddEscapedHtml("Likes", item.Likes.ToString());
videos.AddEscapedHtml("Dislikes", item.Dislikes.ToString());
videos.AddEscapedHtml("Views", item.Views.ToString());
videos.AddEscapedHtml("Description", item.Description);
videos.AddEscapedHtml("UploadDate", DateTime.Parse(item.UploadDate).ToShortDateString());
builder.Append(Templating.RenderString(htmlBeforeProcessedVideo, videos));
}
if (playlist != null)
{
await Downloader.DownloadPlaylistOnly(playlist.Id, Resolution.NoConvert);
Dictionary<string, string> playlist0 = new Dictionary<string, string>();
var plitem = JsonConvert.DeserializeObject<SavedPlaylist>(File.ReadAllText(Path.Combine("Playlist", $"{playlist.Id.Value}.json")));
playlist0.AddEscapedHtml("Title", plitem.Title);
playlist0.AddEscapedHtml("Id", plitem.Id);
playlist0.AddEscapedHtml("AuthorTitle", plitem.AuthorTitle);
playlist0.AddEscapedHtml("AuthorChannelId", plitem.AuthorChannelId);
playlist0.AddEscapedHtml("Description", plitem.Description);
playlist0.AddEscapedHtml("FirstVideoId", plitem.Videos[0]);
string res0 = Templating.RenderString(htmlBeforeProcessedPlaylist, playlist0);
builder.Append(res0);
}
if(channel !=null)
{
await Downloader.DownloadChannelOnly(channel.Id);
}
});
//string res = ApiLoader.RenderFileOrDefault(, "<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"UTF-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><title>All Playlists</title></head><body><h1>All Playlists</h1><table><thead><tr><th></th><th></th></tr></thead><tbody>{Elements}</tbody></table></body></html>", main);
Dictionary<string, string> data = new Dictionary<string, string>();
data.Add("Elements", builder.ToString());
string html = ApiLoader.RenderFileOrDefault("WebSite/err/search_main.html", "<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"UTF-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><title>Search Online</title></head><body><form action=\"../SearchPage/\" method=\"POST\"><input type=\"text\" name=\"query\"><input type=\"submit\" value=\"Search\"></form><table><thead><tr><th></th><th></th></tr></thead><tbody>{Elements}</tbody></table>\n</body></html>", data);
rp.AsText(html, "text/html");
}
catch (Exception ex)
{
_ = ex;
}
}
public static void SearchVideos(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
if(rq.HttpMethod == "POST")
{
rq.ParseBody(args);
}
string search = "*";
if (args.ContainsKey("query"))
{
2022-02-24 23:37:01 +00:00
search= System.Web.HttpUtility.UrlDecode(args["query"]);
}
StringBuilder innerHtml = new StringBuilder();
2022-02-24 23:37:01 +00:00
string htmlBeforeProcessed = ApiLoader.ReadAllTextOrDefault("WebSite/err/video_list/element.html", "<tr><td><img src=\"../Storage/File/Thumbnails/120x90/{Id}.jpg\" alt=\"\" width=\"120\" height=\"90\"></td><td><a href=\"../VideoInfo/{Id}\">{Title}</a><h5>{AuthorTitle}</h5></td></tr>");
long i=0;
foreach (var item in Downloader.SearchFor(search))
{
Dictionary<string, string> videos = new Dictionary<string, string>();
videos.AddEscapedHtml("Title", item.Title);
videos.AddEscapedHtml("Id", item.Id);
videos.AddEscapedHtml("AuthorTitle", item.AuthorTitle);
videos.AddEscapedHtml("AuthorChannelId", item.AuthorChannelId);
videos.AddEscapedHtml("DurationStringLong", TimeSpan.FromSeconds(item.Duration).ToString());
videos.AddEscapedHtml("DurationNumber", item.Duration.ToString());
videos.AddEscapedHtml("Likes", item.Likes.ToString());
videos.AddEscapedHtml("Dislikes", item.Dislikes.ToString());
videos.AddEscapedHtml("Views", item.Views.ToString());
videos.AddEscapedHtml("Description",item.Description);
videos.AddEscapedHtml("UploadDate", DateTime.Parse(item.UploadDate).ToShortDateString());
videos.AddEscapedHtml("Index", i.ToString());
var rend=Templating.RenderString(htmlBeforeProcessed, videos);
innerHtml.Append(rend);
i++;
}
Dictionary<string, string> data = new Dictionary<string, string>();
data.Add("Elements", innerHtml.ToString());
string html = ApiLoader.RenderFileOrDefault("WebSite/err/video_list/main.html", "<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"UTF-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><title>Search Videos</title></head><body><form action=\"../SearchVideos/\" method=\"POST\"><input type=\"text\" name=\"query\"><input type=\"submit\" value=\"Search\"></form><table><thead><tr><th></th><th></th></tr></thead><tbody>{Elements}</tbody></table>\n</body></html>", data);
rp.AsText(html, "text/html");
}
#endregion
#region Channel
2022-02-24 23:37:01 +00:00
public static async Task AddChannelOnly(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
2022-02-24 23:37:01 +00:00
await Downloader.DownloadChannelOnly(System.Web.HttpUtility.UrlDecode(args["Id"]));
2021-06-25 11:03:09 +00:00
rq.RedirectIt(rp);
}
public static void AddChannel(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
2021-12-08 01:07:43 +00:00
Downloader.DownloadChannel(System.Web.HttpUtility.UrlDecode(args["Id"]));
2021-06-24 01:10:20 +00:00
rq.RedirectIt(rp);
}
public static void AddChannelRes(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
2021-12-08 01:07:43 +00:00
Downloader.DownloadChannel(System.Web.HttpUtility.UrlDecode(args["Id"]), (Resolution)int.Parse(args["R"]));
rq.RedirectIt(rp);
}
#endregion
#region User
2022-02-24 23:37:01 +00:00
public static async Task AddUserOnly(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
2022-02-24 23:37:01 +00:00
await Downloader.DownloadUserOnly(System.Web.HttpUtility.UrlDecode(args["Id"]));
rq.RedirectIt(rp);
}
public static void AddUser(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
2021-12-08 01:07:43 +00:00
Downloader.DownloadUser(System.Web.HttpUtility.UrlDecode(args["Id"]));
2021-09-25 06:18:12 +00:00
rq.RedirectIt(rp);
}
public static void AddUserRes(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
2021-12-08 01:07:43 +00:00
Downloader.DownloadUser(System.Web.HttpUtility.UrlDecode(args["Id"]), (Resolution)int.Parse(args["R"]));
rq.RedirectIt(rp);
}
#endregion
#region Queue And Progress
public static void QueueList(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
2021-12-08 01:07:43 +00:00
string json = Downloader.GetQueue();
rp.AsText(json, "application/json");
}
public static void QueueListHtml(HttpListenerRequest req,HttpListenerResponse resp,Dictionary<string,string> args)
{
StringBuilder innerHtml = new StringBuilder();
2022-02-24 21:22:23 +00:00
string htmlBeforeProcessed = ApiLoader.ReadAllTextOrDefault("WebSite/err/video_list/element.html", "<tr><td><img src=\"../File/Thumbnails/120x90/{Id}.jpg\" alt=\"\" width=\"120\" height=\"90\"></td><td><a href=\"../VideoInfo/{Id}\">{Title}</a><h5>{AuthorTitle}</h5></td></tr>");
long i = 0;
foreach (var item0 in Downloader.GetQueueItems())
{
var item = item0.Video;
Dictionary<string, string> videos = new Dictionary<string, string>();
videos.AddEscapedHtml("Title", item.Title);
videos.AddEscapedHtml("Id", item.Id);
videos.AddEscapedHtml("AuthorTitle", item.AuthorTitle);
videos.AddEscapedHtml("AuthorChannelId", item.AuthorChannelId);
videos.AddEscapedHtml("DurationStringLong", TimeSpan.FromSeconds(item.Duration).ToString());
videos.AddEscapedHtml("DurationNumber", item.Duration.ToString());
videos.AddEscapedHtml("Likes", item.Likes.ToString());
videos.AddEscapedHtml("Dislikes", item.Dislikes.ToString());
videos.AddEscapedHtml("Views", item.Views.ToString());
videos.AddEscapedHtml("Resolution", ((int)item0.Resolution).ToString());
videos.AddEscapedHtml("RegularFile", (Convert.ToInt32(item0.RegularFile)).ToString());
videos.AddEscapedHtml("Description", item.Description);
videos.AddEscapedHtml("UploadDate", DateTime.Parse(item.UploadDate).ToShortDateString());
videos.AddEscapedHtml("Index", i.ToString());
var rend = Templating.RenderString(htmlBeforeProcessed, videos);
innerHtml.Append(rend);
i++;
}
Dictionary<string, string> data = new Dictionary<string, string>();
data.Add("Elements", innerHtml.ToString());
string html = ApiLoader.RenderFileOrDefault("WebSite/err/QueueList.html", "<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"UTF-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><title>Video Queue</title></head><body><table><thead><tr><th></th><th></th></tr></thead><tbody>{Elements}</tbody></table>\n</body></html>", data);
resp.AsText(html, "text/html");
}
public static void QueueMove(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
2021-12-08 01:07:43 +00:00
Downloader.ModQueue(args["To"], args["From"]);
rq.RedirectIt(rp);
}
public static void QueueMove2(HttpListenerRequest request, HttpListenerResponse response, Dictionary<string, string> arguments)
{
2021-12-08 01:07:43 +00:00
Downloader.ModQueue2(arguments["To"], arguments["Id"]);
response.AsRedirect("/");
}
public static void VideoProgress(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
2021-12-08 01:07:43 +00:00
string json = JsonConvert.SerializeObject(Downloader.GetProgress());
rp.AsText(json, "application/json");
2021-11-08 01:42:56 +00:00
}
public static void VideoProgressHtml(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
var progress=Downloader.GetProgress();
if(progress==null)
{
progress = new VideoDownloadProgress();
}
var saved = progress.Saved;
if(progress.Saved == null)
{
saved = new SavedVideo();
}
Dictionary<string, string> videos = new Dictionary<string, string>();
videos.AddEscapedHtml("Title", saved.Title);
videos.AddEscapedHtml("Id", saved.Id);
videos.AddEscapedHtml("AuthorTitle", saved.AuthorTitle);
videos.AddEscapedHtml("AuthorChannelId", saved.AuthorChannelId);
videos.AddEscapedHtml("DurationStringLong", TimeSpan.FromSeconds(saved.Duration).ToString());
videos.AddEscapedHtml("DurationNumber", saved.Duration.ToString());
videos.AddEscapedHtml("Likes", saved.Likes.ToString());
videos.AddEscapedHtml("Dislikes", saved.Dislikes.ToString());
videos.AddEscapedHtml("Views", saved.Views.ToString());
videos.AddEscapedHtml("Description", saved.Description);
videos.AddEscapedHtml("UploadDate", DateTime.Parse(saved.UploadDate).ToShortDateString());
videos.AddEscapedHtml("Progress", progress.Progress.ToString());
var rend = ApiLoader.RenderFileOrDefault("WebSite/err/Progress.html", "<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"UTF-8\"><meta http-equiv=\"refresh\" content=\"5\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><title>TYTD Progress</title></head><body><h1>TYTD Progress</h1><h3>Video Title: {Title}</h3><h3>Video Id: {Id}</h3><h3>Video Channel: {AuthorTitle}</h3><h3>Video Channel Id: {AuthorChannelId}</h3><h3>Likes: {Likes}, Dislikes: {Dislikes}, Views: {Views}</h3><h3>Upload Date: {UploadDate}</h3><h3>Duration: {DurationStringLong}</h3><h3>Progress: {Progress}</h3><h3>Description:</h3><p>{Description}</p></body></html>", videos);
rp.AsText(rend);
}
public static void Redo(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
2021-11-08 01:42:56 +00:00
{
2021-12-12 10:04:16 +00:00
lock (Downloader.DL.cancelSrc)
{
Downloader.RedownloadIt = true;
Downloader.DL.cancelSrc.Item.Cancel();
}
rq.RedirectIt(rp);
2021-12-08 01:07:43 +00:00
}
public static void Cancel(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
2021-12-12 10:04:16 +00:00
lock (Downloader.DL.cancelSrc)
{
Downloader.RedownloadIt = false;
Downloader.DL.cancelSrc.Item.Cancel();
}
rq.RedirectIt(rp);
}
#endregion
#region Storage
public static void StorageGetDirectories(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
2022-01-03 16:35:57 +00:00
string path = Downloader.DL.GetPath(true, System.Web.HttpUtility.UrlDecode(args["Path"]));
2021-08-26 10:44:54 +00:00
if (Directory.Exists(path))
{
string json = Newtonsoft.Json.JsonConvert.SerializeObject(Directory.EnumerateDirectories(path).Select<string, string>((o) => { return Path.GetFileName(o); }));
rp.AsText(json, "application/json");
}
else
{
rp.AsText("[]", "application/json");
}
}
public static void StorageGetFiles(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
2022-01-03 16:35:57 +00:00
string path = Downloader.DL.GetPath(true, System.Web.HttpUtility.UrlDecode(args["Path"]));
2021-06-28 16:42:57 +00:00
if (Directory.Exists(path))
{
string json = Newtonsoft.Json.JsonConvert.SerializeObject(Directory.EnumerateFiles(path).Select<string, string>((o) => { return Path.GetFileName(o); }));
rp.AsText(json, "application/json");
2021-06-28 16:42:57 +00:00
}
else
{
rp.AsText("[]", "application/json");
2021-06-28 16:42:57 +00:00
}
2021-06-24 01:10:20 +00:00
}
public static void StorageDirectoryExists(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
2022-01-03 16:35:57 +00:00
string path = Downloader.DL.GetPath(true, System.Web.HttpUtility.UrlDecode(args["Path"]));
string json = Directory.Exists(path) ? "true" : "false";
rp.AsText(json, "text/plain");
2021-09-25 06:18:12 +00:00
}
public static void StorageFileExists(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
2021-08-25 09:11:08 +00:00
{
2022-01-03 16:35:57 +00:00
string path = Downloader.DL.GetPath(true, System.Web.HttpUtility.UrlDecode(args["Path"]));
string json = File.Exists(path) ? "true" : "false";
rp.AsText(json, "text/plain");
}
public static void StorageFile(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
2021-09-27 05:52:31 +00:00
if (args["Path"].StartsWith("config/"))
2021-08-25 09:11:08 +00:00
{
rp.AsText("Access denied");
}
else
{
2022-01-03 16:35:57 +00:00
string path = Downloader.DL.GetPath(true, System.Web.HttpUtility.UrlDecode(args["Path"]));
2021-12-12 10:04:16 +00:00
if (Directory.Exists(path))
{
string indexHtml = Path.Combine(path, "index.html");
if (File.Exists(indexHtml))
{
path = indexHtml;
}
else
{
string dir = Path.Combine(webSitePath, "err", "dir.html");
StringBuilder b = new StringBuilder();
var f = Directory.GetLastWriteTime(Path.GetDirectoryName(path));
string parentModified = $"{f.ToShortDateString()} {f.ToShortTimeString()}";
b.Append($"<tr><td><a href=\"..\">Up</a></td><td>{parentModified}</td><td>DIR</td></tr>");
foreach (var file in Directory.GetDirectories(path))
{
string name = Path.GetFileName(file);
string nameUrled = System.Web.HttpUtility.UrlEncode(name);
string nameHtmled = System.Web.HttpUtility.HtmlEncode(name);
f = Directory.GetLastWriteTime(file);
string dateModifed = $"{f.ToShortDateString()} {f.ToShortTimeString()}";
b.Append($"<tr><td><a href=\"{nameUrled}\">{nameHtmled}</a></td><td>{dateModifed}</td><td>DIR</td></tr>");
}
foreach (var file in Directory.GetFiles(path))
{
string name = Path.GetFileName(file);
string nameUrled = System.Web.HttpUtility.UrlEncode(name);
string nameHtmled = System.Web.HttpUtility.HtmlEncode(name);
f = File.GetLastWriteTime(file);
string dateModifed = $"{f.ToShortDateString()} {f.ToShortTimeString()}";
b.Append($"<tr><td><a href=\"{nameUrled}\">{nameHtmled}</a></td><td>{dateModifed}</td><td>FILE</td></tr>");
}
Dictionary<string, string> templating = new Dictionary<string, string>();
templating.Add("Items", b.ToString());
rp.AsText(Templating.RenderFile(dir, templating));
return;
}
}
rp.AsFile(rq, path);
2021-08-25 09:11:08 +00:00
}
2021-12-12 10:04:16 +00:00
}
2021-10-24 12:52:24 +00:00
public static void Video(HttpListenerRequest rq,HttpListenerResponse rp,Dictionary<string,string> args)
{
2022-01-03 16:35:57 +00:00
VideoId? vid = VideoId.TryParse(System.Web.HttpUtility.UrlDecode(args["Id"]));
2021-10-24 12:52:24 +00:00
if (vid.HasValue)
{
2021-12-08 01:07:43 +00:00
string path = Downloader.DL.GetPath(true, "NotConverted",vid.Value +".mp4");
2021-10-24 12:52:24 +00:00
rp.AddHeader("Content-Disposition", GetVideoContentDisposition(vid.Value).ToString());
rp.AsFile(rq, path);
}
else
{
rp.WithCode(HttpStatusCode.BadRequest);
rp.AsText("Invalid Video ID or URL", "text/plain");
}
}
public static void VideoRes(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
2022-01-03 16:35:57 +00:00
VideoId? vid = VideoId.TryParse(System.Web.HttpUtility.UrlDecode(args["Id"]));
2021-10-24 12:52:24 +00:00
if (vid.HasValue)
{
int res;
if(int.TryParse(args["Res"],out res))
{
if (res > 2 || res < 0)
{
rp.WithCode(HttpStatusCode.BadRequest);
rp.AsText($"Invalid Resolution Number must be either 0, 1 or 2", "text/plain");
}
else
{
string[] m = new string[] { "Converted", "NotConverted", "Audio" };
2021-12-08 01:07:43 +00:00
string path = Downloader.DL.GetPath(true, m[res], vid.Value + ".mp4");
2021-10-24 12:52:24 +00:00
rp.AddHeader("Content-Disposition", GetVideoContentDisposition(vid.Value).ToString());
rp.AsFile(rq, path);
}
}
else
{
rp.WithCode(HttpStatusCode.BadRequest);
rp.AsText("Res is not a number", "text/plain");
}
}
else
{
rp.WithCode(HttpStatusCode.BadRequest);
rp.AsText("Invalid Video ID or URL", "text/plain");
}
}
public static System.Net.Mime.ContentDisposition GetVideoContentDisposition(string id)
{
var cd = new System.Net.Mime.ContentDisposition();
string filename = GetVideoName(id);
cd.FileName = filename;
return cd;
}
public static string GetVideoName(string id)
{
string name = id + ".mp4";
2021-12-08 01:07:43 +00:00
string path = Downloader.DL.GetPath(true, "Info", id + ".json");
2021-10-24 12:52:24 +00:00
if (File.Exists(path))
{
string info=File.ReadAllText(path);
name= JsonConvert.DeserializeObject<SavedVideo>(info).Title + ".mp4";
}
string asAscii = Encoding.ASCII.GetString(
Encoding.Convert(
Encoding.UTF8,
Encoding.GetEncoding(
Encoding.ASCII.EncodingName,
new EncoderReplacementFallback(string.Empty),
new DecoderExceptionFallback()
),
Encoding.UTF8.GetBytes(name)
)
);
return asAscii;
}
public static void UploadFiles(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
var files = rq.ParseBody(args);
foreach (var f in files.Values)
f.Save(Path.Combine(webSitePath, f.FileName));
rp.AsText("uploaded", "text/plain");
}
#endregion
#region Other
public static void Index(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
2022-02-24 23:37:01 +00:00
string r = ApiLoader.ReadAllTextOrDefault(Path.Combine(webSitePath, "index.html"), "<!DOCTYPE html><html lang=\"en\"><head><meta charset=\"UTF-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><title>TYTD</title></head><body><h1>TYTD</h1><form action=\"./api/endpoint\" method=\"POST\"><input type=\"text\" name=\"url\"><select name=\"resolution\"><option value=\"1\" selected>SD</option><option value=\"0\">HD</option><option value=\"2\">Audio</option></select><input type=\"submit\" value=\"Add To Downloader\"></form>Existing Videos: <form action=\"./api/SearchVideos/\" method=\"POST\"><input type=\"search\" name=\"query\"><input type=\"submit\" value=\"Search\"></form><br><a href=\"./api/Progress.html\">Get Progress</a><br><a href=\"./api/QueueListPage/\">List Queue</a><br><a href=\"./api/ListPlaylists/\">List Playlists</a><br></body></html>");
rp.AsText( r);
}
2021-12-08 07:09:16 +00:00
public static void Extensions(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
rp.AsText(ApiLoader.Page);
}
2021-12-12 10:04:16 +00:00
private static void UploadFilePut(HttpListenerRequest request, HttpListenerResponse response, Dictionary<string, string> arguments)
{
2022-01-03 16:35:57 +00:00
string p = System.Web.HttpUtility.UrlDecode(arguments["Path"]).Split(new char[] { '?' }, StringSplitOptions.RemoveEmptyEntries)[0];
2021-12-12 10:04:16 +00:00
string path = Path.Combine(webSitePath, p);
bool exists = File.Exists(path);
using (var instr = request.InputStream)
{
using (var outStr = File.Create(path))
{
instr.CopyTo(outStr);
}
}
if (exists)
{
response.WithCode(HttpStatusCode.NoContent);
}
else
{
response.WithCode(HttpStatusCode.Created);
}
}
private static void Endpoint(HttpListenerRequest request, HttpListenerResponse response, Dictionary<string, string> arguments)
{
2022-01-03 16:35:57 +00:00
//MultiDictionary<string, string> multi = new MultiDictionary<string, string>();
2021-12-12 10:04:16 +00:00
request.ParseBody(arguments);
List<string> print = new List<string>();
bool hasOtherResponse=false;
bool success = true;
if(arguments.ContainsKey("operation"))
{
2022-01-03 16:35:57 +00:00
if (arguments["operation"] == "create_personal_playlist")
{
string myName = arguments["name"];
string path = Downloader.DL.GetPath(true, "PersonalPlaylist", $"{myName}.json");
string[] ids = System.Web.HttpUtility.UrlDecode(arguments["ids"]).Split(',');
var list = new List<(string Id, Resolution Resolution)>();
list.AddRange(ids.Select(e => (e, Resolution.NoConvert)));
File.WriteAllText(path, JsonConvert.SerializeObject(list));
}
else if (arguments["operation"] == "create_personal_playlist_res")
{
string myName = arguments["name"];
string path = Downloader.DL.GetPath(true, "PersonalPlaylist", $"{myName}.json");
string[] ids = System.Web.HttpUtility.UrlDecode(arguments["ids"]).Split(',');
var list = new List<(string Id, Resolution Resolution)>();
for (int i = 0; i < list.Count; i += 2)
{
string id = ids[i];
string res = ids[i + 1];
list.Add((id, (Resolution)int.Parse(res)));
}
File.WriteAllText(path, JsonConvert.SerializeObject(list));
}
else if (arguments["operation"] == "add_to_personal_playlist")
{
string myName = arguments["name"];
string path = Downloader.DL.GetPath(true, "PersonalPlaylist", $"{myName}.json");
string[] ids = System.Web.HttpUtility.UrlDecode(arguments["ids"]).Split(',');
var list = JsonConvert.DeserializeObject<List<(string Id, Resolution Resolution)>>(File.ReadAllText(path));
list.AddRange(ids.Select(e => (e, Resolution.NoConvert)));
File.WriteAllText(path, JsonConvert.SerializeObject(list));
}
else if (arguments["operation"] == "add_to_personal_playlist_res")
{
string myName = arguments["name"];
string path = Downloader.DL.GetPath(true, "PersonalPlaylist", $"{myName}.json");
string[] ids = System.Web.HttpUtility.UrlDecode(arguments["ids"]).Split(',');
var list = JsonConvert.DeserializeObject<List<(string Id, Resolution Resolution)>>(File.ReadAllText(path));
for (int i = 0; i < list.Count; i += 2)
{
string id = ids[i];
string res = ids[i + 1];
list.Add((id, (Resolution)int.Parse(res)));
}
File.WriteAllText(path, JsonConvert.SerializeObject(list));
}
else if (arguments["operation"] == "insert_to_personal_playlist")
{
string myName = arguments["name"];
string path = Downloader.DL.GetPath(true, "PersonalPlaylist", $"{myName}.json");
string[] ids = System.Web.HttpUtility.UrlDecode(arguments["ids"]).Split(',');
var list = JsonConvert.DeserializeObject<List<(string Id, Resolution Resolution)>>(File.ReadAllText(path));
int offset = 0;
if (arguments.ContainsKey("offset"))
{
if (!int.TryParse(arguments["offset"], out offset))
{
offset = 0;
}
}
list.InsertRange(offset, ids.Select(e => (e, Resolution.NoConvert)));
File.WriteAllText(path, JsonConvert.SerializeObject(list));
}
else if (arguments["operation"] == "remove_from_personal_playlist")
{
string myName = arguments["name"];
string path = Downloader.DL.GetPath(true, "PersonalPlaylist", $"{myName}.json");
string[] ids = System.Web.HttpUtility.UrlDecode(arguments["ids"]).Split(',');
var list = JsonConvert.DeserializeObject<List<(string Id, Resolution Resolution)>>(File.ReadAllText(path));
List<(string, Resolution)> todel = new List<(string, Resolution)>();
foreach(var item in list)
{
if(ids.Contains(item.Id))
{
todel.Add(item);
}
}
list.RemoveRange(todel);
File.WriteAllText(path, JsonConvert.SerializeObject(list));
}
else if (arguments["operation"] == "insert_to_personal_playlist_res")
{
string myName = arguments["name"];
string path = Downloader.DL.GetPath(true, "PersonalPlaylist", $"{myName}.json");
string[] ids = System.Web.HttpUtility.UrlDecode(arguments["ids"]).Split(',');
var list = JsonConvert.DeserializeObject<List<(string Id, Resolution Resolution)>>(File.ReadAllText(path));
int offset = 0;
if (arguments.ContainsKey("offset"))
{
if (!int.TryParse(arguments["offset"], out offset))
{
offset = 0;
}
}
for (int i = 0; i < list.Count; i += 2)
{
string id = ids[i];
string res = ids[i + 1];
list.Insert(offset++,(id, (Resolution)int.Parse(res)));
}
File.WriteAllText(path, JsonConvert.SerializeObject(list));
}
else if (arguments["operation"] == "server_download")
2021-12-12 10:04:16 +00:00
{
if (arguments.ContainsKey("url"))
{
string myUrl = arguments["url"];
if (arguments.ContainsKey("resolution"))
{
uint res;
if (uint.TryParse(arguments["resolution"], out res) && res <= 2)
{
Downloader.DownloadItem(myUrl, (Resolution)res);
}
else
{
print.Add("WARNING: argument resolution shall not be greater than 3 or less than 0");
Downloader.DownloadItem(myUrl);
}
}
else
{
Downloader.DownloadItem(myUrl);
}
}
}
else if (arguments["operation"] == "download")
{
if (arguments.ContainsKey("url"))
{
VideoId? vid = VideoId.TryParse(arguments["url"]);
if (vid.HasValue)
{
if (arguments.ContainsKey("resolution"))
{
int res;
if (int.TryParse(arguments["resolution"], out res))
{
if (res > 2 || res < 0)
{
print.Add("Invalid Resolution Number must be either 0, 1 or 2");
}
else
{
string[] m = new string[] { "Converted", "NotConverted", "Audio" };
string path = Downloader.DL.GetPath(true, m[res], vid.Value + ".mp4");
response.AddHeader("Content-Disposition", GetVideoContentDisposition(vid.Value).ToString());
response.AsFile(request, path);
hasOtherResponse = true;
}
}
else
{
print.Add("Res is not a number");
}
}
else
{
string path = Downloader.DL.GetPath(true, "NotConverted", vid.Value + ".mp4");
response.AddHeader("Content-Disposition", GetVideoContentDisposition(vid.Value).ToString());
response.AsFile(request, path);
hasOtherResponse = true;
}
}
else
{
success = false;
print.Add("Invalid Video ID or URL");
}
}
}
else if (arguments["operation"] == "enumerate_queue")
{
string json = Downloader.GetQueue();
response.AsText(json, "application/json");
hasOtherResponse = true;
}
else if (arguments["operation"] == "progress")
{
string json = JsonConvert.SerializeObject(Downloader.GetProgress());
response.AsText(json, "application/json");
hasOtherResponse = true;
}
2022-01-03 16:35:57 +00:00
else if (arguments["operation"] == "queue_move")
2021-12-12 10:04:16 +00:00
{
bool containsId = arguments.ContainsKey("id");
bool containsIndex = arguments.ContainsKey("index");
if (containsId ^ containsIndex)
{
success = false;
print.Add("You cant use both id and index");
}
else
{
if (arguments.ContainsKey("to"))
{
string to_loc = arguments["to"];
2022-01-03 16:35:57 +00:00
if (containsId)
2021-12-12 10:04:16 +00:00
Downloader.ModQueue2(to_loc, arguments["id"]);
if (containsIndex)
Downloader.ModQueue(to_loc, arguments["index"]);
}
else
{
success = false;
print.Add("You must have the &quot;to&quot; variable set");
}
}
}
else
{
success = false;
}
}
if(success)
{
2022-01-13 23:54:11 +00:00
print.Add("<h1>Your request was delt with successfully</h1>");
print.Add("Click <a href=\"#\" onclick=\"history.back();\">Here</a> to go back.");
2021-12-12 10:04:16 +00:00
}
else if(!hasOtherResponse)
{
response.WithCode(HttpStatusCode.BadRequest);
}
if (!hasOtherResponse)
{
response.AsText(string.Join("<br>", print));
}
}
public static void RootPath(HttpListenerRequest rq, HttpListenerResponse rp, Dictionary<string, string> args)
{
2022-01-03 16:35:57 +00:00
string p = System.Web.HttpUtility.UrlDecode(args["Path"]).Split(new char[] { '?' }, StringSplitOptions.RemoveEmptyEntries)[0];
2021-12-12 10:04:16 +00:00
string path = Path.Combine(webSitePath, p);
if (Directory.Exists(path))
{
string indexHtml = Path.Combine(path, "index.html");
if(File.Exists(indexHtml))
{
path = indexHtml;
}
else
{
string dir = Path.Combine(webSitePath,"err", "dir.html");
StringBuilder b = new StringBuilder();
var f= Directory.GetLastWriteTime(Path.GetDirectoryName(path));
string parentModified = $"{f.ToShortDateString()} {f.ToShortTimeString()}";
b.Append($"<tr><td><a href=\"..\">Up</a></td><td>{parentModified}</td><td>DIR</td></tr>");
foreach (var file in Directory.GetDirectories(path))
{
string name = Path.GetFileName(file);
string nameUrled = System.Web.HttpUtility.UrlEncode(name);
string nameHtmled = System.Web.HttpUtility.HtmlEncode(name);
f= Directory.GetLastWriteTime(file);
string dateModifed =$"{f.ToShortDateString()} {f.ToShortTimeString()}";
b.Append($"<tr><td><a href=\"{nameUrled}\">{nameHtmled}</a></td><td>{dateModifed}</td><td>DIR</td></tr>");
}
foreach (var file in Directory.GetFiles(path))
{
string name = Path.GetFileName(file);
string nameUrled = System.Web.HttpUtility.UrlEncode(name);
string nameHtmled = System.Web.HttpUtility.HtmlEncode(name);
f = File.GetLastWriteTime(file);
string dateModifed = $"{f.ToShortDateString()} {f.ToShortTimeString()}";
b.Append($"<tr><td><a href=\"{nameUrled}\">{nameHtmled}</a></td><td>{dateModifed}</td><td>FILE</td></tr>");
}
Dictionary<string, string> templating = new Dictionary<string, string>();
templating.Add("Items", b.ToString());
rp.AsText(Templating.RenderFile(dir, templating));
return;
}
}
2021-09-25 06:18:12 +00:00
rp.AsFile(rq, path);
2021-08-25 09:11:08 +00:00
}
#endregion
2021-06-24 01:10:20 +00:00
2021-10-24 12:52:24 +00:00
public static bool Route_Before(HttpListenerRequest request, HttpListenerResponse response)
{
response.WithCORS();
2021-10-24 13:38:14 +00:00
return false;
2021-10-24 12:52:24 +00:00
}
public static void RedirectIt(this HttpListenerRequest req,HttpListenerResponse resp)
{
if (req.Headers.AllKeys.Contains("ServerRoot"))
{
resp.AsRedirect(req.Headers["ServerRoot"]);
}
else
{
resp.AsRedirect("/");
}
}
2022-01-03 16:35:57 +00:00
public static string GetServerRoot(HttpListenerRequest req)
{
if(req.Headers.AllKeys.Contains("ServerRoot"))
{
return req.Headers["ServerRoot"];
}
else
{
return $"http://{req.LocalEndPoint.ToString()}/";
}
}
2021-10-24 12:52:24 +00:00
2021-06-24 01:10:20 +00:00
}
}