History and watch later pages
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<items>
|
||||
<item time="2019-02-02" version="0.3">
|
||||
<content>
|
||||
<en-US>### What's new:
|
||||
|
||||
- Small fixes
|
||||
- First public pre-release version
|
||||
- Some content was cut out due to its incompleteness
|
||||
</en-US>
|
||||
<ru-RU>### Что нового:
|
||||
|
||||
- Мелкие исправления багов
|
||||
- Эта версия является первой пред-релизной публичной версией
|
||||
- Некотроые функции были вырезаны из-за их незавершенности
|
||||
</ru-RU>
|
||||
</content>
|
||||
</item>
|
||||
<item time="2019-01-05" version="0.2.19012">
|
||||
<content>
|
||||
<en-US>### What's new:
|
||||
|
||||
- 'Live' button fixed in the player
|
||||
- Long channel names on crads fixed
|
||||
- Fixed video description disappearing on window resizing
|
||||
- Player seek is fixed
|
||||
- Added video buffering progress indicatior
|
||||
- Small fixes
|
||||
|
||||
### Known issues:
|
||||
|
||||
- Recommended and subscriptions pages aren't implemented
|
||||
- History isn't implemented
|
||||
- Playlists management isn't implemented
|
||||
- Ads aren't implemented
|
||||
</en-US>
|
||||
<ru-RU>### Что нового:
|
||||
|
||||
- Кнопка перехода к прямому эфиру на стримах теперь работает
|
||||
- Исправлен баг с длинными именами каналов на карточках
|
||||
- Исправлено исчезание описания видео при изменении размеров окна
|
||||
- Исправлен ползунок перемотки видео
|
||||
- Добавлен индикатор буферизации видео
|
||||
- Мелкие исправления
|
||||
|
||||
### Что по-прежнему не работает:
|
||||
|
||||
- Страница рекомендованных видео и страница видео с подписок
|
||||
- История
|
||||
- Работа с плейлистами
|
||||
- Нет карточек рекламы
|
||||
</ru-RU>
|
||||
</content>
|
||||
</item>
|
||||
</items>
|
||||
@@ -1,11 +1,14 @@
|
||||
using FoxTube.Pages;
|
||||
using Google.Apis.YouTube.v3;
|
||||
using Newtonsoft.Json;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net.Http;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
using System.Web;
|
||||
using System.Xml;
|
||||
using Windows.ApplicationModel.Core;
|
||||
@@ -308,5 +311,35 @@ namespace FoxTube
|
||||
deferral.Complete();
|
||||
}
|
||||
}
|
||||
|
||||
public static async Task<List<string>> GetHistory()
|
||||
{
|
||||
List<string> list = new List<string>();
|
||||
|
||||
HttpClient client = new HttpClient();
|
||||
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", SecretsVault.Credential.Token.AccessToken);
|
||||
string output = await client.GetStringAsync($"https://www.youtube.com/list_ajax?style=json&action_get_list=1&list=HL&hl={SettingsStorage.RelevanceLanguage}");
|
||||
|
||||
dynamic raw = JsonConvert.DeserializeObject(output);
|
||||
foreach (dynamic i in raw.video)
|
||||
list.Add(i.encrypted_id.ToString());
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
public static async Task<List<string>> GetLater()
|
||||
{
|
||||
List<string> list = new List<string>();
|
||||
|
||||
HttpClient client = new HttpClient();
|
||||
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", SecretsVault.Credential.Token.AccessToken);
|
||||
string output = await client.GetStringAsync($"https://www.youtube.com/list_ajax?style=json&action_get_list=1&list=WL&hl={SettingsStorage.RelevanceLanguage}");
|
||||
|
||||
dynamic raw = JsonConvert.DeserializeObject(output);
|
||||
foreach (dynamic i in raw.video)
|
||||
list.Add(i.encrypted_id.ToString());
|
||||
|
||||
return list;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -110,7 +110,11 @@ namespace FoxTube
|
||||
new[]
|
||||
{
|
||||
Google.Apis.Oauth2.v2.Oauth2Service.Scope.UserinfoProfile,
|
||||
YouTubeService.Scope.YoutubeForceSsl
|
||||
YouTubeService.Scope.YoutubeForceSsl,
|
||||
YouTubeService.Scope.Youtube,
|
||||
YouTubeService.Scope.YoutubeUpload,
|
||||
YouTubeService.Scope.YoutubeReadonly,
|
||||
YouTubeService.Scope.Youtubepartner
|
||||
},
|
||||
"user",
|
||||
CancellationToken.None);
|
||||
|
||||
@@ -209,6 +209,7 @@
|
||||
<Content Include="Assets\BadgeLogo.scale-200.png" />
|
||||
<Content Include="Assets\BadgeLogo.scale-400.png" />
|
||||
<Content Include="Assets\ChannelCoverTemplate.png" />
|
||||
<Content Include="Assets\Data\RevEn.xml" />
|
||||
<Content Include="Assets\Data\Patchnotes.xml" />
|
||||
<Content Include="Assets\FoxGame.png" />
|
||||
<Content Include="Assets\Icons\Profile.png" />
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Package xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10" xmlns:mp="http://schemas.microsoft.com/appx/2014/phone/manifest" xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10" xmlns:uap3="http://schemas.microsoft.com/appx/manifest/uap/windows10/3" IgnorableNamespaces="uap mp uap3">
|
||||
<Identity Name="53949MichaelXFoxGordeev.FoxTube" Publisher="CN=FD7A34DD-FE4D-4D7D-9D33-2DA9EBBE7725" Version="0.3.5.0" />
|
||||
<Identity Name="53949MichaelXFoxGordeev.FoxTube" Publisher="CN=FD7A34DD-FE4D-4D7D-9D33-2DA9EBBE7725" Version="0.3.6.0" />
|
||||
<mp:PhoneIdentity PhoneProductId="04fd81c1-6473-4174-afd7-4ac71dd85721" PhonePublisherId="00000000-0000-0000-0000-000000000000" />
|
||||
<Properties>
|
||||
<DisplayName>FoxTube</DisplayName>
|
||||
|
||||
@@ -29,27 +29,16 @@ namespace FoxTube.Pages
|
||||
public Browser()
|
||||
{
|
||||
InitializeComponent();
|
||||
Initialize();
|
||||
}
|
||||
|
||||
|
||||
public async void Initialize()
|
||||
{
|
||||
/*Debug.WriteLine(SecretsVault.Credential.Token.AccessToken);
|
||||
WebClient client = new WebClient();
|
||||
client.Headers.Add(HttpRequestHeader.Cookie, "SID=9wYUCqAm2D7AmC_Vi8uNGjYZAf6Js2hasI1gCEhznMjJbYqnt0J6m1sthArcXG_pMMadnQ.; HSID=AhyajPo6nPBx7VB-0; SSID=AaaOvEW6jZVcc4Asp; APISID=tXeMRBKErzlt6KOo/Aapw7Rv4U_HG1A0CQ; SAPISID=FGp4Ff7MMF8Yq0X4/AOdNjGueWyCkkK7C5; LOGIN_INFO=AFmmF2swRAIgZln6SD5aFUlABb9pBEq9uAwLBISe7sYR1NWVXyaDTY4CIBLo_KAFcoo4wtlW0ZPmJnHaa-xVhsA7MzdGm7-vvgX-:QUQ3MjNmekJTZ3M2dXJNaFh3M3NfTFVDS0RIaUM3WlJNWlRJbk5sZUE1eHR3bHkwckhQeEppazkyekhDb0ljcXpacDdwQXlIanhSbnpSWkUyZVFpdWtiT243Rzhad0N4aGZwUXJDZ1Mxd0tFTS0wVDdudk9xaFJDdTNYUWtnQlE3VXhQdVl5MjB2MGdEdl9keElDaS1yX0tmQWowS041ZWF1VU9tV0c3bTRVbWNGSHFjWHRDVTIw;");*/
|
||||
HttpClient client = new HttpClient();
|
||||
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", "BQcUCusfz2zKN_ejHc3Xu15ahz8eEEaKouKJydqBAVKxWxcqfhht1zVux-G9bRf0KSTFBw");
|
||||
/*SecretsVault.Credential.ToString();
|
||||
string url = $"https://www.youtube.com/list_ajax?style=json&action_get_list=1&list=HL&hl=en";
|
||||
string response = client.DownloadString(url.ToUri());
|
||||
HttpClient c = new HttpClient();*/
|
||||
string response = await SecretsVault.Service.HttpClient.GetStringAsync("https://www.youtube.com/list_ajax?style=xml&action_get_list=1&list=HL");
|
||||
//HttpResponseMessage res = await c.GetAsync("");
|
||||
Debug.WriteLine(response);
|
||||
|
||||
/*new Google.Apis.Oauth2.v2.Oauth2Service.Initializer();
|
||||
code.Text = response;*/
|
||||
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", SecretsVault.Credential.Token.AccessToken);
|
||||
string response = await SecretsVault.Service.HttpClient.GetStringAsync(adress.Text);
|
||||
code.Text = response;
|
||||
view.NavigateToString(response);
|
||||
}
|
||||
|
||||
private void Adress_QuerySubmitted(AutoSuggestBox sender, AutoSuggestBoxQuerySubmittedEventArgs args)
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
<Page
|
||||
NavigationCacheMode="Enabled"
|
||||
x:Class="FoxTube.Pages.History"
|
||||
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
||||
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
||||
@@ -7,6 +6,7 @@
|
||||
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
||||
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
||||
xmlns:foxtube="using:FoxTube"
|
||||
xmlns:controls="using:FoxTube.Controls"
|
||||
mc:Ignorable="d"
|
||||
Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
|
||||
|
||||
@@ -15,8 +15,11 @@
|
||||
<RowDefinition/>
|
||||
<RowDefinition Height="auto"/>
|
||||
</Grid.RowDefinitions>
|
||||
<ScrollViewer Name="scroll">
|
||||
<ScrollViewer>
|
||||
<StackPanel Name="stack">
|
||||
<local:VideoGrid/>
|
||||
<controls:ShowMore Clicked="ShowMore_Clicked"/>
|
||||
</StackPanel>
|
||||
</ScrollViewer>
|
||||
<CommandBar Grid.Row="1" DefaultLabelPosition="Right">
|
||||
<AppBarButton Icon="Refresh" Label="Refresh" Name="refresh" Click="Refresh_Click"/>
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
using System;
|
||||
using FoxTube.Controls;
|
||||
using Microsoft.AppCenter.Analytics;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Windows.System;
|
||||
using Windows.UI.Xaml;
|
||||
using Windows.UI.Xaml.Controls;
|
||||
@@ -11,8 +14,12 @@ namespace FoxTube.Pages
|
||||
/// </summary>
|
||||
public sealed partial class History : Page
|
||||
{
|
||||
List<string> entries;
|
||||
int page = 1;
|
||||
public string id = "HL";
|
||||
LoadingPage loading;
|
||||
VideoGrid list;
|
||||
ShowMore more;
|
||||
|
||||
public History()
|
||||
{
|
||||
@@ -24,25 +31,65 @@ namespace FoxTube.Pages
|
||||
base.OnNavigatedTo(e);
|
||||
|
||||
loading = grid.Children[2] as LoadingPage;
|
||||
list = scroll.Content as VideoGrid;
|
||||
list = stack.Children[0] as VideoGrid;
|
||||
more = stack.Children[1] as ShowMore;
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(e.Parameter.ToString()))
|
||||
id = e.Parameter.ToString();
|
||||
|
||||
Initialize();
|
||||
}
|
||||
|
||||
public void Initialize()
|
||||
public async void Initialize()
|
||||
{
|
||||
try
|
||||
{
|
||||
loading.Refresh();
|
||||
|
||||
entries = id == "HL" ? await Methods.GetHistory() : await Methods.GetLater();
|
||||
|
||||
for (int k = 0; k < 50 && k < entries.Count; k++)
|
||||
list.Add(new VideoCard(entries[k]));
|
||||
|
||||
if (list.Count >= entries.Count)
|
||||
more.Complete(true);
|
||||
|
||||
loading.Close();
|
||||
}
|
||||
catch (System.Net.Http.HttpRequestException)
|
||||
{
|
||||
loading.Error("System.Net.Http.HttpRequestException", "Unable to connect to Google servers.", true);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
loading.Error(e.GetType().ToString(), e.Message);
|
||||
Analytics.TrackEvent("History loading error", new Dictionary<string, string>()
|
||||
{
|
||||
{ "Exception", e.GetType().ToString() },
|
||||
{ "Message", e.Message },
|
||||
{ "ID", id }
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private async void toBrowser_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
await Launcher.LaunchUriAsync(new Uri("youtube.com/feed/history"));
|
||||
await Launcher.LaunchUriAsync(new Uri(id == "HL" ? "https://www.youtube.com/feed/history" : "https://www.youtube.com/playlist?list=WL"));
|
||||
}
|
||||
|
||||
private void Refresh_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
list.Clear();
|
||||
Initialize();
|
||||
}
|
||||
|
||||
private void ShowMore_Clicked()
|
||||
{
|
||||
for (int k = 50 * page++; k < 50 * page; k++)
|
||||
list.Add(new VideoCard(entries[k]));
|
||||
|
||||
if (list.Count >= entries.Count)
|
||||
more.Complete(true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@ namespace FoxTube
|
||||
try
|
||||
{
|
||||
VideosResource.ListRequest request = SecretsVault.Service.Videos.List("id");
|
||||
request.MaxResults = 48;
|
||||
request.MaxResults = 25;
|
||||
request.PageToken = trendToken;
|
||||
|
||||
request.Chart = VideosResource.ListRequest.ChartEnum.MostPopular;
|
||||
|
||||
@@ -186,9 +186,9 @@ namespace FoxTube
|
||||
toChannel.Visibility = Visibility.Visible;
|
||||
toSubscriptions.Visibility = Visibility.Visible;
|
||||
libHeader.Visibility = Visibility.Visible;
|
||||
//toHistory.Visibility = Visibility.Visible;
|
||||
toHistory.Visibility = Visibility.Visible;
|
||||
toLiked.Visibility = Visibility.Visible;
|
||||
//toLater.Visibility = Visibility.Visible;
|
||||
toLater.Visibility = Visibility.Visible;
|
||||
|
||||
if (SecretsVault.Subscriptions.Count > 0)
|
||||
{
|
||||
@@ -230,9 +230,9 @@ namespace FoxTube
|
||||
toChannel.Visibility = Visibility.Collapsed;
|
||||
toSubscriptions.Visibility = Visibility.Collapsed;
|
||||
libHeader.Visibility = Visibility.Collapsed;
|
||||
//toHistory.Visibility = Visibility.Collapsed;
|
||||
toHistory.Visibility = Visibility.Collapsed;
|
||||
toLiked.Visibility = Visibility.Collapsed;
|
||||
//toLater.Visibility = Visibility.Collapsed;
|
||||
toLater.Visibility = Visibility.Collapsed;
|
||||
subsHeader.Visibility = Visibility.Collapsed;
|
||||
|
||||
subsHeader.Visibility = Visibility.Collapsed;
|
||||
@@ -557,11 +557,11 @@ namespace FoxTube
|
||||
if (args.SelectedItem == toHome)
|
||||
content.Navigate(typeof(Home));
|
||||
else if (args.SelectedItem == toHistory)
|
||||
content.Navigate(typeof(History));
|
||||
content.Navigate(typeof(History), "HL");
|
||||
else if (args.SelectedItem == toLiked)
|
||||
content.Navigate(typeof(PlaylistPage), SecretsVault.UserChannel.ContentDetails.RelatedPlaylists.Likes);
|
||||
else if (args.SelectedItem == toLater)
|
||||
content.Navigate(typeof(PlaylistPage), SecretsVault.UserChannel.ContentDetails.RelatedPlaylists.WatchLater);
|
||||
content.Navigate(typeof(History), "WL");
|
||||
else if (args.SelectedItem == toSubscriptions)
|
||||
content.Navigate(typeof(Subscriptions));
|
||||
else if (args.SelectedItem == toDownloads)
|
||||
@@ -587,7 +587,14 @@ namespace FoxTube
|
||||
{ typeof(PlaylistPage), () => nav.Header = resources.GetString("/Main/playlist") },
|
||||
{ typeof(Search), () => nav.Header = resources.GetString("/Main/searchPlaceholder/PlaceholderText") },
|
||||
{ typeof(Subscriptions), () => nav.Header = resources.GetString("/Main/subscriptions/Content") },
|
||||
{ typeof(History), () => nav.Header = resources.GetString("/Main/history/Content") },
|
||||
{ typeof(History), () =>
|
||||
{
|
||||
if((content.Content as History).id == "HL")
|
||||
nav.Header = resources.GetString("/Main/history/Content");
|
||||
else
|
||||
nav.Header = resources.GetString("/Main/later/Content");
|
||||
|
||||
} },
|
||||
{ typeof(Home), () => nav.Header = resources.GetString("/Main/home/Content") },
|
||||
{ typeof(Downloads), () => nav.Header = resources.GetString("/Main/downloads/Content") }
|
||||
};
|
||||
@@ -642,11 +649,9 @@ namespace FoxTube
|
||||
}
|
||||
|
||||
if(!found)
|
||||
{
|
||||
nav.SelectedItem = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
nav.SelectedItem = null;
|
||||
} },
|
||||
@@ -666,17 +671,8 @@ namespace FoxTube
|
||||
else
|
||||
s = Sender.None;
|
||||
}
|
||||
else if ((content.Content as PlaylistPage).playlistId == SecretsVault.UserChannel.ContentDetails.RelatedPlaylists.WatchLater)
|
||||
{
|
||||
if(nav.SelectedItem != toLater)
|
||||
nav.SelectedItem = toLater;
|
||||
else
|
||||
s = Sender.None;
|
||||
}
|
||||
else
|
||||
{
|
||||
nav.SelectedItem = null;
|
||||
}
|
||||
} },
|
||||
{ typeof(Search), () => nav.SelectedItem = null },
|
||||
{typeof(Subscriptions), () =>
|
||||
@@ -687,11 +683,21 @@ namespace FoxTube
|
||||
s = Sender.None;
|
||||
} },
|
||||
{ typeof(History), () =>
|
||||
{
|
||||
if((content.Content as History).id == "HL")
|
||||
{
|
||||
if(nav.SelectedItem != toHistory)
|
||||
nav.SelectedItem = toHistory;
|
||||
else
|
||||
s = Sender.None;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(nav.SelectedItem != toLater)
|
||||
nav.SelectedItem = toLater;
|
||||
else
|
||||
s = Sender.None;
|
||||
}
|
||||
} },
|
||||
{ typeof(Home), () =>
|
||||
{
|
||||
|
||||
@@ -8,6 +8,8 @@ namespace FoxTube.Pages
|
||||
/// </summary>
|
||||
public sealed partial class VideoGrid : Page
|
||||
{
|
||||
public int Count => list.Items.Count;
|
||||
|
||||
public VideoGrid()
|
||||
{
|
||||
InitializeComponent();
|
||||
|
||||
Reference in New Issue
Block a user