diff --git a/FoxTube/Classes/Methods.cs b/FoxTube/Classes/Methods.cs index f201fb6..1ca0a75 100644 --- a/FoxTube/Classes/Methods.cs +++ b/FoxTube/Classes/Methods.cs @@ -1,9 +1,14 @@ -using MyToolkit.Multimedia; +using Google.Apis.YouTube.v3; +using Google.Apis.YouTube.v3.Data; +using MyToolkit.Multimedia; using System; +using System.Collections.Generic; using System.Diagnostics; using System.Text.RegularExpressions; using System.Threading.Tasks; +using System.Web; using Windows.ApplicationModel.Core; +using Windows.System; using Windows.UI; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; @@ -70,7 +75,8 @@ namespace FoxTube { try { - Hyperlink link = new Hyperlink { NavigateUri = new Uri(item), Foreground = new SolidColorBrush(Colors.Red) }; + Hyperlink link = new Hyperlink(); + link.Click += (s, arg) => { ProcessLink(item); }; link.Inlines.Add(new Run { Text = item }); block.Inlines.Add(link); } @@ -133,5 +139,69 @@ namespace FoxTube return "Unknown"; } } + + public async static void ProcessLink(string url) + { + try + { + Debug.WriteLine($"Processing link: {url}"); + if (url.Contains("youtube.com/") || url.Contains("youtu.be/")) + { + Debug.WriteLine("This is an internal youtube link"); + url = url.Replace("https://", "").Replace("http://", "").Replace("wwww.", "").Replace("//", ""); + Debug.WriteLine($"Prepared link: {url}"); + + if (url.Contains("/playlist")) + { + Debug.WriteLine($"This is a playlist link. ID: {HttpUtility.ParseQueryString(url).Get("list")}"); + MainPage.GoToPlaylist(HttpUtility.ParseQueryString(url).Get("list")); + } + else if (url.Contains("youtu.be/")) + { + Debug.WriteLine($"This is obfuscated video link. Video ID: {url.Split('/')[1]}"); + MainPage.GoToVideo(url.Split('/')[1]); + } + else if (url.Contains("/watch")) + { + Debug.WriteLine($"This is regular video link. Video ID: {HttpUtility.ParseQueryString(url).Get("v")}"); + MainPage.GoToVideo(HttpUtility.ParseQueryString(url).Get(0), HttpUtility.ParseQueryString(url).Get("list")); + } + else if (url.Contains("/v/")) + { + Debug.WriteLine($"This is video link. ID: {url.Split('/')[2].Split('?')[0]}"); + MainPage.GoToVideo(url.Split('/')[2].Split('?')[0]); + } + else if (url.Contains("/channel/")) + { + Debug.WriteLine($"This is channel link. ID: {url.Split('/')[2]}"); + MainPage.GoToChannel(url.Split('/')[2]); + } + else if (url.Contains("/user/")) + { + Debug.WriteLine($"This is channel link with username. Username: {url.Split('/')[2]}"); + ChannelsResource.ListRequest request = SecretsVault.Service.Channels.List("id"); + Debug.WriteLine(request.ForUsername = url.Split('/')[2]); + request.MaxResults = 1; + MainPage.GoToChannel((await request.ExecuteAsync()).Items[0].Id); + } + else if (url.Contains("/c/")) + { + Debug.WriteLine($"This is channel link with custom url. Custom name: {url.Split('/')[2]}"); + SearchResource.ListRequest request = SecretsVault.Service.Search.List("id"); + Debug.WriteLine(request.Q = url.Split('/')[2]); + request.MaxResults = 1; + MainPage.GoToChannel((await request.ExecuteAsync()).Items[0].Id.ChannelId); + } + else + throw new Exception(); + } + else + throw new Exception(); + } + catch + { + await Launcher.LaunchUriAsync(new Uri(url)); + } + } } } diff --git a/FoxTube/Pages/MainPage.xaml.cs b/FoxTube/Pages/MainPage.xaml.cs index 2324e1c..2f1e3e1 100644 --- a/FoxTube/Pages/MainPage.xaml.cs +++ b/FoxTube/Pages/MainPage.xaml.cs @@ -320,12 +320,14 @@ namespace FoxTube public void GoToChannel(string id) { + Debug.WriteLine($"Channel id: {id}"); MinimizeAsInitializer(); content.Navigate(typeof(ChannelPage), id); } public async void GoToVideo(string id, string playlistId = null) { + Debug.WriteLine($"Video id: {id}; Playlist id: {playlistId}"); try { var connection = NetworkInformation.GetInternetConnectionProfile().GetConnectionCost(); @@ -369,6 +371,7 @@ namespace FoxTube public void GoToPlaylist(string id) { + Debug.WriteLine($"Playlist id: {id}"); MinimizeAsInitializer(); content.Navigate(typeof(PlaylistPage), id); }