diff --git a/Tesses.YouTubeDownloader.Server/Class1.cs b/Tesses.YouTubeDownloader.Server/Class1.cs index 119f931..ca84bfd 100644 --- a/Tesses.YouTubeDownloader.Server/Class1.cs +++ b/Tesses.YouTubeDownloader.Server/Class1.cs @@ -335,7 +335,23 @@ namespace Tesses.YouTubeDownloader.Server Add("/QueueList",QueueList); Add("/subscribe",Subscribe); Add("/resubscribe",Resubscribe); + Add("/unsubscribe",Unsubscribe); + Add("/subscriptions",Subscriptions); + } + public async Task Subscriptions(ServerContext ctx) + { + TYTDStorage storage = Downloader as TYTDStorage; + if(storage != null) + { + + + var sub=storage.GetLoadedSubscriptions(); + await ctx.SendJsonAsync(sub); + + + } + } public async Task Resubscribe(ServerContext ctx) { @@ -362,12 +378,7 @@ namespace Tesses.YouTubeDownloader.Server if(cid.HasValue) { - var sub=storage.GetSubscription(cid.Value); - if(sub != null) - { - sub.BellInfo = conf; - await storage.SaveSubscription(sub); - } + await storage.ResubscribeAsync(cid.Value,conf); } } } @@ -375,6 +386,33 @@ namespace Tesses.YouTubeDownloader.Server $"You Will Be Redirected in 5 Sec

You Will Be Redirected in 5 Sec

\n" ); } + + public async Task Unsubscribe(ServerContext ctx) + { + TYTDStorage storage = Downloader as TYTDStorage; + if(storage != null) + { + string id; + + if(ctx.QueryParams.TryGetFirst("id",out id)) + { + + + + ChannelId? cid=ChannelId.TryParse(WebUtility.UrlDecode(id)); + + if(cid.HasValue) + { + + storage.Unsubscribe(cid.Value); + + } + } + } + await ctx.SendTextAsync( + $"You Will Be Redirected in 5 Sec

You Will Be Redirected in 5 Sec

\n" + ); + } public async Task Subscribe(ServerContext ctx) { TYTDStorage storage = Downloader as TYTDStorage; @@ -408,10 +446,10 @@ namespace Tesses.YouTubeDownloader.Server if(cid.HasValue) { - await storage.Subscribe(cid.Value,getinfo,conf); + await storage.SubscribeAsync(cid.Value,getinfo,conf); }else{ UserName? uname=UserName.TryParse(WebUtility.UrlDecode(id)); - await storage.Subscribe(uname.Value,conf); + await storage.SubscribeAsync(uname.Value,conf); } } diff --git a/Tesses.YouTubeDownloader.Server/Tesses.YouTubeDownloader.Server.csproj b/Tesses.YouTubeDownloader.Server/Tesses.YouTubeDownloader.Server.csproj index 9553270..f8f152f 100644 --- a/Tesses.YouTubeDownloader.Server/Tesses.YouTubeDownloader.Server.csproj +++ b/Tesses.YouTubeDownloader.Server/Tesses.YouTubeDownloader.Server.csproj @@ -15,9 +15,9 @@ Tesses.YouTubeDownloader.Server Mike Nolan Tesses - 1.0.2.0 - 1.0.2.0 - 1.0.2.0 + 1.0.2.1 + 1.0.2.1 + 1.0.2.1 Adds WebServer to TYTD LGPL-3.0-only true diff --git a/Tesses.YouTubeDownloader/IDownloader.cs b/Tesses.YouTubeDownloader/IDownloader.cs index e6b7ecb..a28e0ae 100644 --- a/Tesses.YouTubeDownloader/IDownloader.cs +++ b/Tesses.YouTubeDownloader/IDownloader.cs @@ -20,5 +20,10 @@ namespace Tesses.YouTubeDownloader IReadOnlyList<(SavedVideo Video,Resolution Resolution)> GetQueueList(); SavedVideoProgress GetProgress(); + IAsyncEnumerable GetSubscriptionsAsync(); + Task UnsubscribeAsync(ChannelId id); + Task SubscribeAsync(ChannelId id,bool downloadChannelInfo=false,ChannelBellInfo bellInfo = ChannelBellInfo.NotifyAndDownload); + Task SubscribeAsync(UserName name,ChannelBellInfo info=ChannelBellInfo.NotifyAndDownload); + Task ResubscribeAsync(ChannelId id,ChannelBellInfo info=ChannelBellInfo.NotifyAndDownload); } } \ No newline at end of file diff --git a/Tesses.YouTubeDownloader/SubscribedTo.cs b/Tesses.YouTubeDownloader/SubscribedTo.cs index f8a6f6f..d9c360d 100644 --- a/Tesses.YouTubeDownloader/SubscribedTo.cs +++ b/Tesses.YouTubeDownloader/SubscribedTo.cs @@ -66,7 +66,22 @@ namespace Tesses.YouTubeDownloader } - + + public async Task UnsubscribeAsync(ChannelId id) + { + await Task.Run(()=>{Unsubscribe(id);}); + } + + public async Task ResubscribeAsync(ChannelId id,ChannelBellInfo info=ChannelBellInfo.NotifyAndDownload) + { + var sub=GetSubscription(id); + if(sub != null) + { + sub.BellInfo = info; + await SaveSubscription(sub); + } + } + public DateTime LastSubscriptionTime = DateTime.MinValue; public async Task HandleSubscriptions() { @@ -99,7 +114,7 @@ namespace Tesses.YouTubeDownloader /// /// Subscribe to creator /// - public async Task Subscribe(ChannelId id, bool downloadChannelInfo=false,ChannelBellInfo bellInfo = ChannelBellInfo.NotifyAndDownload) + public async Task SubscribeAsync(ChannelId id, bool downloadChannelInfo=false,ChannelBellInfo bellInfo = ChannelBellInfo.NotifyAndDownload) { if(downloadChannelInfo) { @@ -117,11 +132,15 @@ namespace Tesses.YouTubeDownloader { await WriteAllTextAsync($"Subscriptions/{sub.Id}",JsonConvert.SerializeObject(sub)); } - public async Task Subscribe(UserName name,ChannelBellInfo bellInfo=ChannelBellInfo.NotifyAndDownload) + public async Task SubscribeAsync(UserName name,ChannelBellInfo bellInfo=ChannelBellInfo.NotifyAndDownload) { ChannelMediaContext context=new ChannelMediaContext(name,Resolution.NoDownload); var c=await context.GetChannel(this); - await Subscribe(ChannelId.Parse(c.Id),false,bellInfo); + await SubscribeAsync(ChannelId.Parse(c.Id),false,bellInfo); + } + public IReadOnlyList GetLoadedSubscriptions() + { + return Subscriptions; } public void Unsubscribe(ChannelId id) { diff --git a/Tesses.YouTubeDownloader/TYTDClient.cs b/Tesses.YouTubeDownloader/TYTDClient.cs index d2cbdd0..93b66bd 100644 --- a/Tesses.YouTubeDownloader/TYTDClient.cs +++ b/Tesses.YouTubeDownloader/TYTDClient.cs @@ -11,6 +11,7 @@ using System.IO; using YoutubeExplode.Channels; using YoutubeExplode.Playlists; using System.Net.Http; +using System.Net; namespace Tesses.YouTubeDownloader { @@ -111,7 +112,67 @@ namespace Tesses.YouTubeDownloader } } } - + public async IAsyncEnumerable GetSubscriptionsAsync() + { + string v="[]"; + try{ + v=await client.GetStringAsync("/api/v2/subscriptions"); + }catch(Exception ex) + { + _=ex; + } + foreach(var item in JsonConvert.DeserializeObject>(v)) + { + yield return await Task.FromResult(item); + } + + + } + public async Task UnsubscribeAsync(ChannelId id) + { + try{ + string v=await client.GetStringAsync($"/api/v2/unsubscribe?id={id.Value}"); + + }catch(Exception ex) + { + _=ex; + } + } + public async Task SubscribeAsync(ChannelId id,bool downloadChannelInfo=false,ChannelBellInfo bellInfo = ChannelBellInfo.NotifyAndDownload) + { + try{ + string dlcid=downloadChannelInfo ? "true" : "false"; + string v=await client.GetStringAsync($"/api/v2/subscribe?id={id.Value}&conf={bellInfo.ToString()}&getinfo={dlcid}"); + + }catch(Exception ex) + { + _=ex; + } + } + public async Task SubscribeAsync(UserName name,ChannelBellInfo info=ChannelBellInfo.NotifyAndDownload) + { + try{ + + + string v=await client.GetStringAsync($"/api/v2/subscribe?id={ WebUtility.UrlEncode(name.Value)}&conf={info.ToString()}"); + + }catch(Exception ex) + { + _=ex; + } + } + public async Task ResubscribeAsync(ChannelId id,ChannelBellInfo info=ChannelBellInfo.NotifyAndDownload) + { + try{ + + + string v=await client.GetStringAsync($"/api/v2/resubscribe?id={id.Value}&conf={info.ToString()}"); + + }catch(Exception ex) + { + _=ex; + } + } public async override IAsyncEnumerable EnumerateFilesAsync(string path) { List items=null; @@ -208,6 +269,6 @@ namespace Tesses.YouTubeDownloader return Stream.Null; } - + } } \ No newline at end of file diff --git a/Tesses.YouTubeDownloader/Tesses.YouTubeDownloader.csproj b/Tesses.YouTubeDownloader/Tesses.YouTubeDownloader.csproj index 877afac..aff957d 100644 --- a/Tesses.YouTubeDownloader/Tesses.YouTubeDownloader.csproj +++ b/Tesses.YouTubeDownloader/Tesses.YouTubeDownloader.csproj @@ -7,9 +7,9 @@ Tesses.YouTubeDownloader Mike Nolan Tesses - 1.0.3.0 - 1.0.3.0 - 1.0.3.0 + 1.0.3.1 + 1.0.3.1 + 1.0.3.1 A YouTube Downloader LGPL-3.0-only true