Add enumerate video ids
This commit is contained in:
		
							parent
							
								
									55f62811c7
								
							
						
					
					
						commit
						f8deea2c78
					
				
							
								
								
									
										379
									
								
								Program.cs
								
								
								
								
							
							
						
						
									
										379
									
								
								Program.cs
								
								
								
								
							|  | @ -1,186 +1,195 @@ | |||
| using System.Collections.Concurrent; | ||||
| using Renci.SshNet; | ||||
| using YoutubeExplode; | ||||
| using YoutubeExplode.Videos; | ||||
| using Tesses.WebServer; | ||||
| using static Creds; | ||||
| using System.Diagnostics.CodeAnalysis; | ||||
| using YoutubeExplode.Playlists; | ||||
| using YoutubeExplode.Channels; | ||||
| 
 | ||||
| HttpClient http=new HttpClient(); | ||||
| YoutubeClient ytc=new YoutubeClient(http); | ||||
| ConcurrentStack<VideoId> videoIds=new ConcurrentStack<VideoId>(); | ||||
| bool isRunning=true; | ||||
| 
 | ||||
| async Task AddVideo(VideoId id) | ||||
| { | ||||
|     if(!string.IsNullOrWhiteSpace(AlreadyExistsUrl)) | ||||
|     { | ||||
|         try{ | ||||
|         if(await http.GetStringAsync($"{AlreadyExistsUrl}{id.Value}") == "true") | ||||
|         { | ||||
|             Console.WriteLine($"{AlreadyExistsUrl}{id.Value} returned true skipping: https://www.youtube.com/watch?v={id.Value}"); | ||||
|             return; | ||||
|         } | ||||
|         }catch(Exception) | ||||
|         { | ||||
| 
 | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     using(SshClient client = new SshClient(IP,Port,Username,Password)){ | ||||
|     await client.ConnectAsync(default); | ||||
|     using(var res=client.CreateCommand($"echo {DirectoryOnServer}/*-{id.Value}.mp4")) | ||||
|     { | ||||
|         await res.ExecuteAsync(); | ||||
|      | ||||
|         if(res.Result == $"{DirectoryOnServer}/*-{id.Value}.mp4\n") | ||||
|         { | ||||
|              using(var res2=client.CreateCommand($"cd {DirectoryOnServer} && tytd {id.Value}")) | ||||
|             { | ||||
|                 await res2.ExecuteAsync(); | ||||
|                 Console.WriteLine($"Downloaded: https://www.youtube.com/watch?v={id.Value}"); | ||||
|                 _=res2.Result; | ||||
|             }          | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             Console.WriteLine($"Video already exists: https://www.youtube.com/watch?v={id.Value}"); | ||||
|         } | ||||
| 
 | ||||
|          | ||||
|     } | ||||
|     client.Disconnect(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| async Task AddItem(string url) | ||||
| { | ||||
|     VideoId? vId = VideoId.TryParse(url); | ||||
|     PlaylistId? pId = PlaylistId.TryParse(url); | ||||
|     ChannelId? cId = ChannelId.TryParse(url); | ||||
|     UserName? username = UserName.TryParse(url);  | ||||
|     ChannelSlug? slug = ChannelSlug.TryParse(url);   | ||||
|     ChannelHandle? handle = ChannelHandle.TryParse(url); | ||||
| 
 | ||||
|     if(url.Length == 11 && vId.HasValue)     | ||||
|     { | ||||
|         videoIds.Push(vId.Value); | ||||
|     } | ||||
|     else if(pId.HasValue) | ||||
|     { | ||||
|         await foreach(var v in ytc.Playlists.GetVideosAsync(pId.Value)) | ||||
|         { | ||||
|             videoIds.Push(v.Id); | ||||
|         } | ||||
|     } | ||||
|     else if(vId.HasValue) | ||||
|     { | ||||
|         videoIds.Push(vId.Value); | ||||
|     } | ||||
|     else if(cId.HasValue) | ||||
|     { | ||||
|         await foreach(var c in ytc.Channels.GetUploadsAsync(cId.Value)) | ||||
|         { | ||||
|             videoIds.Push(c.Id); | ||||
|         } | ||||
|     } | ||||
|     else if(username.HasValue) | ||||
|     { | ||||
|         cId = (await ytc.Channels.GetByUserAsync(username.Value)).Id; | ||||
|         await foreach(var c in ytc.Channels.GetUploadsAsync(cId.Value)) | ||||
|         { | ||||
|             videoIds.Push(c.Id); | ||||
|         } | ||||
|     } | ||||
|     else if(slug.HasValue) | ||||
|     { | ||||
|         cId = (await ytc.Channels.GetBySlugAsync(slug.Value)).Id; | ||||
|         await foreach(var c in ytc.Channels.GetUploadsAsync(cId.Value)) | ||||
|         { | ||||
|             videoIds.Push(c.Id); | ||||
|         } | ||||
|     } | ||||
|     else if(handle.HasValue) | ||||
|     { | ||||
|         cId = (await ytc.Channels.GetByHandleAsync(handle.Value)).Id; | ||||
|         await foreach(var c in ytc.Channels.GetUploadsAsync(cId.Value)) | ||||
|         { | ||||
|             videoIds.Push(c.Id); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| Task.Factory.StartNew(async()=>{ | ||||
|     while(isRunning) | ||||
|     { | ||||
|         if(videoIds.TryPop(out var res)) | ||||
|         { | ||||
|             await AddVideo(res); | ||||
|         } | ||||
|     } | ||||
| },TaskCreationOptions.LongRunning).Wait(0); | ||||
| 
 | ||||
| MountableServer msvr=new MountableServer(new StaticServer("wwwroot")); | ||||
| 
 | ||||
| msvr.Mount("/api/AddItemRes/1/",new TYTDServer(AddItem)); | ||||
| msvr.Mount("/api/AddItem/",new TYTDServer(AddItem)); | ||||
| msvr.Mount("/api/AddVideoRes/1/",new TYTDServer(videoIds)); | ||||
| msvr.Mount("/api/AddVideo/",new TYTDServer(videoIds)); | ||||
| RouteServer routeServer=new RouteServer(msvr); | ||||
| routeServer.Add("/itemsInQueue",async(ctx)=>{ | ||||
|     await ctx.SendJsonAsync(videoIds.Count); | ||||
| }); | ||||
| routeServer.Add("/add",async(ctx)=>{ | ||||
|     if(ctx.QueryParams.TryGetFirst("v",out var v)) | ||||
|     { | ||||
|         await AddItem(v); | ||||
|     } | ||||
|     await ctx.SendRedirectAsync("/"); | ||||
| }); | ||||
| routeServer.StartServer(3252); | ||||
| 
 | ||||
| public class TYTDServer : Server | ||||
| { | ||||
|     bool onlyVideos; | ||||
|     ConcurrentStack<VideoId>? stk; | ||||
|     | ||||
|     Func<string,Task>? cb; | ||||
|     public TYTDServer(ConcurrentStack<VideoId> stk) | ||||
|     { | ||||
|         onlyVideos=true; | ||||
|         this.stk = stk; | ||||
|     } | ||||
| 
 | ||||
|     public TYTDServer(Func<string,Task> cb) | ||||
|     { | ||||
|         onlyVideos=false; | ||||
|         this.cb = cb; | ||||
|     } | ||||
|     public override async Task GetAsync(ServerContext ctx) | ||||
|     { | ||||
|         | ||||
|         if(onlyVideos) | ||||
|         { | ||||
|              | ||||
|             string url=ctx.UrlAndQuery.Substring(1); | ||||
|              | ||||
|             stk?.Push(url); | ||||
|             await ctx.SendTextAsync("<script>window.history.back();</script>"); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             if(cb == null) { | ||||
|                 await ctx.SendTextAsync("<script>window.history.back();</script>"); | ||||
|        | ||||
|                 return; | ||||
|             } | ||||
|             string url=ctx.UrlAndQuery.Substring(1); | ||||
|              | ||||
|             await cb(url); | ||||
|             await ctx.SendTextAsync("<script>window.history.back();</script>"); | ||||
| 
 | ||||
|         } | ||||
|     } | ||||
| using System.Collections.Concurrent; | ||||
| using Renci.SshNet; | ||||
| using YoutubeExplode; | ||||
| using YoutubeExplode.Videos; | ||||
| using Tesses.WebServer; | ||||
| using static Creds; | ||||
| using System.Diagnostics.CodeAnalysis; | ||||
| using YoutubeExplode.Playlists; | ||||
| using YoutubeExplode.Channels; | ||||
| using System.Linq; | ||||
| 
 | ||||
| HttpClient http=new HttpClient(); | ||||
| YoutubeClient ytc=new YoutubeClient(http); | ||||
| ConcurrentStack<VideoId> videoIds=new ConcurrentStack<VideoId>(); | ||||
| bool isRunning=true; | ||||
| 
 | ||||
| async Task AddVideo(VideoId id) | ||||
| { | ||||
|     if(!string.IsNullOrWhiteSpace(AlreadyExistsUrl)) | ||||
|     { | ||||
|         try{ | ||||
|         if(await http.GetStringAsync($"{AlreadyExistsUrl}{id.Value}") == "true") | ||||
|         { | ||||
|             Console.WriteLine($"{AlreadyExistsUrl}{id.Value} returned true skipping: https://www.youtube.com/watch?v={id.Value}"); | ||||
|             return; | ||||
|         } | ||||
|         }catch(Exception) | ||||
|         { | ||||
| 
 | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     using(SshClient client = new SshClient(IP,Port,Username,Password)){ | ||||
|     await client.ConnectAsync(default); | ||||
|     using(var res=client.CreateCommand($"echo {DirectoryOnServer}/*-{id.Value}.mp4")) | ||||
|     { | ||||
|         await res.ExecuteAsync(); | ||||
|      | ||||
|         if(res.Result == $"{DirectoryOnServer}/*-{id.Value}.mp4\n") | ||||
|         { | ||||
|              using(var res2=client.CreateCommand($"cd {DirectoryOnServer} && tytd {id.Value}")) | ||||
|             { | ||||
|                 await res2.ExecuteAsync(); | ||||
|                 Console.WriteLine($"Downloaded: https://www.youtube.com/watch?v={id.Value}"); | ||||
|                 _=res2.Result; | ||||
|             }          | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             Console.WriteLine($"Video already exists: https://www.youtube.com/watch?v={id.Value}"); | ||||
|         } | ||||
| 
 | ||||
|          | ||||
|     } | ||||
|     client.Disconnect(); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| async Task AddItem(string url) | ||||
| { | ||||
|     VideoId? vId = VideoId.TryParse(url); | ||||
|     PlaylistId? pId = PlaylistId.TryParse(url); | ||||
|     ChannelId? cId = ChannelId.TryParse(url); | ||||
|     UserName? username = UserName.TryParse(url);  | ||||
|     ChannelSlug? slug = ChannelSlug.TryParse(url);   | ||||
|     ChannelHandle? handle = ChannelHandle.TryParse(url); | ||||
| 
 | ||||
|     if(url.Length == 11 && vId.HasValue)     | ||||
|     { | ||||
|         videoIds.Push(vId.Value); | ||||
|     } | ||||
|     else if(pId.HasValue) | ||||
|     { | ||||
|         await foreach(var v in ytc.Playlists.GetVideosAsync(pId.Value)) | ||||
|         { | ||||
|             videoIds.Push(v.Id); | ||||
|         } | ||||
|     } | ||||
|     else if(vId.HasValue) | ||||
|     { | ||||
|         videoIds.Push(vId.Value); | ||||
|     } | ||||
|     else if(cId.HasValue) | ||||
|     { | ||||
|         await foreach(var c in ytc.Channels.GetUploadsAsync(cId.Value)) | ||||
|         { | ||||
|             videoIds.Push(c.Id); | ||||
|         } | ||||
|     } | ||||
|     else if(username.HasValue) | ||||
|     { | ||||
|         cId = (await ytc.Channels.GetByUserAsync(username.Value)).Id; | ||||
|         await foreach(var c in ytc.Channels.GetUploadsAsync(cId.Value)) | ||||
|         { | ||||
|             videoIds.Push(c.Id); | ||||
|         } | ||||
|     } | ||||
|     else if(slug.HasValue) | ||||
|     { | ||||
|         cId = (await ytc.Channels.GetBySlugAsync(slug.Value)).Id; | ||||
|         await foreach(var c in ytc.Channels.GetUploadsAsync(cId.Value)) | ||||
|         { | ||||
|             videoIds.Push(c.Id); | ||||
|         } | ||||
|     } | ||||
|     else if(handle.HasValue) | ||||
|     { | ||||
|         cId = (await ytc.Channels.GetByHandleAsync(handle.Value)).Id; | ||||
|         await foreach(var c in ytc.Channels.GetUploadsAsync(cId.Value)) | ||||
|         { | ||||
|             videoIds.Push(c.Id); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| Task.Factory.StartNew(async()=>{ | ||||
|     while(isRunning) | ||||
|     { | ||||
|         if(videoIds.TryPop(out var res)) | ||||
|         { | ||||
|             await AddVideo(res); | ||||
|         } | ||||
|     } | ||||
| },TaskCreationOptions.LongRunning).Wait(0); | ||||
| 
 | ||||
| MountableServer msvr=new MountableServer(new StaticServer("wwwroot")); | ||||
| 
 | ||||
| msvr.Mount("/api/AddItemRes/1/",new TYTDServer(AddItem)); | ||||
| msvr.Mount("/api/AddItem/",new TYTDServer(AddItem)); | ||||
| msvr.Mount("/api/AddVideoRes/1/",new TYTDServer(videoIds)); | ||||
| msvr.Mount("/api/AddVideo/",new TYTDServer(videoIds)); | ||||
| RouteServer routeServer=new RouteServer(msvr); | ||||
| routeServer.Add("/itemsInQueue",async(ctx)=>{ | ||||
|     await ctx.SendJsonAsync(videoIds.Count); | ||||
| }); | ||||
| routeServer.Add("/queue.json", async(ctx)=>{ | ||||
|     List<string> items = new List<string>(); | ||||
|     foreach(var item in videoIds) | ||||
|     { | ||||
|         items.Add(item.Value); | ||||
|     } | ||||
|     await ctx.SendJsonAsync(items); | ||||
| }); | ||||
| routeServer.Add("/add",async(ctx)=>{ | ||||
|     if(ctx.QueryParams.TryGetFirst("v",out var v)) | ||||
|     { | ||||
|         await AddItem(v); | ||||
|     } | ||||
|     await ctx.SendRedirectAsync("/"); | ||||
| }); | ||||
| routeServer.StartServer(3252); | ||||
| 
 | ||||
| public class TYTDServer : Server | ||||
| { | ||||
|     bool onlyVideos; | ||||
|     ConcurrentStack<VideoId>? stk; | ||||
|     | ||||
|     Func<string,Task>? cb; | ||||
|     public TYTDServer(ConcurrentStack<VideoId> stk) | ||||
|     { | ||||
|         onlyVideos=true; | ||||
|         this.stk = stk; | ||||
|     } | ||||
| 
 | ||||
|     public TYTDServer(Func<string,Task> cb) | ||||
|     { | ||||
|         onlyVideos=false; | ||||
|         this.cb = cb; | ||||
|     } | ||||
|     public override async Task GetAsync(ServerContext ctx) | ||||
|     { | ||||
|         | ||||
|         if(onlyVideos) | ||||
|         { | ||||
|              | ||||
|             string url=ctx.UrlAndQuery.Substring(1); | ||||
|              | ||||
|             stk?.Push(url); | ||||
|             await ctx.SendTextAsync("<script>window.history.back();</script>"); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             if(cb == null) { | ||||
|                 await ctx.SendTextAsync("<script>window.history.back();</script>"); | ||||
|        | ||||
|                 return; | ||||
|             } | ||||
|             string url=ctx.UrlAndQuery.Substring(1); | ||||
|              | ||||
|             await cb(url); | ||||
|             await ctx.SendTextAsync("<script>window.history.back();</script>"); | ||||
| 
 | ||||
|         } | ||||
|     } | ||||
| } | ||||
		Loading…
	
		Reference in New Issue