@@ -13,6 +13,7 @@ using System.Xml;
|
||||
using Windows.ApplicationModel.Core;
|
||||
using Windows.ApplicationModel.DataTransfer;
|
||||
using Windows.ApplicationModel.Resources;
|
||||
using Windows.ApplicationModel.Resources.Core;
|
||||
using Windows.Storage;
|
||||
using Windows.Storage.Streams;
|
||||
using Windows.System;
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
</Windows10version1809:UserControl.OpacityTransition>
|
||||
|
||||
<Button Padding="0" Margin="1" Background="{ThemeResource SystemControlBackgroundChromeMediumBrush}" Click="Button_Click">
|
||||
<Grid>
|
||||
<Grid Name="grid">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="auto"/>
|
||||
<RowDefinition Height="50"/>
|
||||
|
||||
@@ -30,41 +30,57 @@ namespace FoxTube.Controls
|
||||
|
||||
public async void Initialize(string id, string live)
|
||||
{
|
||||
ChannelsResource.ListRequest request = SecretsVault.Service.Channels.List("snippet,statistics,brandingSettings");
|
||||
request.Id = id;
|
||||
ChannelListResponse response = await request.ExecuteAsync();
|
||||
|
||||
item = response.Items[0];
|
||||
channelId = id;
|
||||
|
||||
title.Text = item.Snippet.Title;
|
||||
description.Text = item.Snippet.Description;
|
||||
|
||||
subs.Text = $"{item.Statistics.SubscriberCount:0,0} {resources.GetString("/Cards/subscribers")}";
|
||||
uploads.Text = $"{item.Statistics.VideoCount:0,0} {resources.GetString("/Cards/videos")}";
|
||||
|
||||
if (live == "live")
|
||||
liveTag.Visibility = Visibility.Visible;
|
||||
|
||||
if(SecretsVault.IsAuthorized)
|
||||
{
|
||||
if(SecretsVault.Subscriptions.Exists(i => i.Snippet.ResourceId.ChannelId == id))
|
||||
{
|
||||
subscribe.Background = new SolidColorBrush(Colors.Transparent);
|
||||
subscribe.Foreground = new SolidColorBrush(Colors.Gray);
|
||||
subscribe.Content = resources.GetString("/Cards/unsubscribe");
|
||||
}
|
||||
subscriptionPane.Visibility = Visibility.Visible;
|
||||
}
|
||||
|
||||
try { avatar.ProfilePicture = new BitmapImage(new Uri(item.Snippet.Thumbnails.Medium.Url)); }
|
||||
catch { }
|
||||
try
|
||||
{
|
||||
if (!item.BrandingSettings.Image.BannerImageUrl.Contains("default"))
|
||||
cover.Source = new BitmapImage(item.BrandingSettings.Image.BannerImageUrl.ToUri());
|
||||
if (id == SecretsVault.AccountId)
|
||||
grid.RowDefinitions[3].Height = new GridLength(0);
|
||||
|
||||
ChannelsResource.ListRequest request = SecretsVault.Service.Channels.List("snippet,statistics,brandingSettings");
|
||||
request.Id = id;
|
||||
ChannelListResponse response = await request.ExecuteAsync();
|
||||
|
||||
item = response.Items[0];
|
||||
channelId = id;
|
||||
|
||||
title.Text = item.Snippet.Title;
|
||||
description.Text = item.Snippet.Description;
|
||||
|
||||
subs.Text = $"{item.Statistics.SubscriberCount:0,0} {resources.GetString("/Cards/subscribers")}";
|
||||
uploads.Text = $"{item.Statistics.VideoCount:0,0} {resources.GetString("/Cards/videos")}";
|
||||
|
||||
if (live == "live")
|
||||
liveTag.Visibility = Visibility.Visible;
|
||||
|
||||
if (SecretsVault.IsAuthorized)
|
||||
{
|
||||
if (SecretsVault.Subscriptions.Exists(i => i.Snippet.ResourceId.ChannelId == id))
|
||||
{
|
||||
subscribe.Background = new SolidColorBrush(Colors.Transparent);
|
||||
subscribe.Foreground = new SolidColorBrush(Colors.Gray);
|
||||
subscribe.Content = resources.GetString("/Cards/unsubscribe");
|
||||
}
|
||||
subscriptionPane.Visibility = Visibility.Visible;
|
||||
}
|
||||
|
||||
try { avatar.ProfilePicture = new BitmapImage(new Uri(item.Snippet.Thumbnails.Medium.Url)) { DecodePixelWidth = 74, DecodePixelHeight = 74 }; }
|
||||
catch { }
|
||||
try
|
||||
{
|
||||
if (!item.BrandingSettings.Image.BannerImageUrl.Contains("default"))
|
||||
cover.Source = new BitmapImage(item.BrandingSettings.Image.BannerImageUrl.ToUri());
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Visibility = Visibility.Collapsed;
|
||||
Microsoft.AppCenter.Analytics.Analytics.TrackEvent("VideoCard loading failed", new System.Collections.Generic.Dictionary<string, string>()
|
||||
{
|
||||
{ "Exception", e.GetType().ToString() },
|
||||
{ "Message", e.Message },
|
||||
{ "Video ID", id }
|
||||
});
|
||||
}
|
||||
catch { }
|
||||
|
||||
Opacity = 1;
|
||||
}
|
||||
|
||||
@@ -35,7 +35,11 @@
|
||||
<ColumnDefinition/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<StackPanel Orientation="Horizontal" VerticalAlignment="Top" Margin="5,0">
|
||||
<PersonPicture Height="20" ProfilePicture="{Binding Path=Avatar}"/>
|
||||
<PersonPicture Height="20">
|
||||
<PersonPicture.ProfilePicture>
|
||||
<BitmapImage UriSource="{Binding Path=Avatar}" DecodePixelHeight="20" DecodePixelWidth="20"/>
|
||||
</PersonPicture.ProfilePicture>
|
||||
</PersonPicture>
|
||||
<FontIcon Glyph="" Margin="2,0" Visibility="{Binding Path=IsVerified}">
|
||||
<ToolTipService.ToolTip>
|
||||
<TextBlock x:Uid="/Chat/verified"/>
|
||||
|
||||
@@ -71,7 +71,7 @@ namespace FoxTube.Controls
|
||||
meta.Text = string.Format("{0} {1}", Methods.GetAgo(comment.Snippet.TopLevelComment.Snippet.PublishedAt.Value), comment.Snippet.TopLevelComment.Snippet.UpdatedAt != comment.Snippet.TopLevelComment.Snippet.PublishedAt ? resources.GetString("/CommentsPage/edited") : "");
|
||||
Methods.FormatText(ref text, comment.Snippet.TopLevelComment.Snippet.TextDisplay);
|
||||
|
||||
try { avatar.ProfilePicture = new BitmapImage(new Uri(comment.Snippet.TopLevelComment.Snippet.AuthorProfileImageUrl)); }
|
||||
try { avatar.ProfilePicture = new BitmapImage(new Uri(comment.Snippet.TopLevelComment.Snippet.AuthorProfileImageUrl)) { DecodePixelWidth = 50, DecodePixelHeight = 50 }; }
|
||||
catch { }
|
||||
}
|
||||
|
||||
@@ -127,7 +127,7 @@ namespace FoxTube.Controls
|
||||
meta.Text = string.Format("{0} {1}", Methods.GetAgo(comment.Snippet.PublishedAt.Value), comment.Snippet.UpdatedAt != comment.Snippet.PublishedAt ? resources.GetString("/CommentsPage/edited") : "");
|
||||
Methods.FormatText(ref text, comment.Snippet.TextDisplay);
|
||||
|
||||
try { avatar.ProfilePicture = new BitmapImage(new Uri(comment.Snippet.AuthorProfileImageUrl)); }
|
||||
try { avatar.ProfilePicture = new BitmapImage(new Uri(comment.Snippet.AuthorProfileImageUrl)) { DecodePixelWidth = 50, DecodePixelHeight = 50 }; }
|
||||
catch { }
|
||||
}
|
||||
|
||||
|
||||
@@ -264,7 +264,7 @@ namespace FoxTube.Controls
|
||||
|
||||
void SetMeta()
|
||||
{
|
||||
thumbnail.Source = new BitmapImage(Container.Thumbnail);
|
||||
thumbnail.Source = new BitmapImage(Container.Thumbnail) { DecodePixelHeight = (int)thumbnail.ActualHeight, DecodePixelWidth = (int)thumbnail.ActualWidth };
|
||||
|
||||
title.Text = Container.Title;
|
||||
path.Text = File.Path;
|
||||
|
||||
@@ -184,20 +184,17 @@ namespace FoxTube
|
||||
|
||||
private void VideoSource_CurrentStateChanged(object sender, RoutedEventArgs e)
|
||||
{
|
||||
if (audioSource.Source == null)
|
||||
return;
|
||||
|
||||
switch(videoSource.CurrentState)
|
||||
{
|
||||
case Windows.UI.Xaml.Media.MediaElementState.Buffering:
|
||||
case Windows.UI.Xaml.Media.MediaElementState.Paused:
|
||||
systemControls.PlaybackStatus = MediaPlaybackStatus.Paused;
|
||||
// TODO: Create history entry
|
||||
audioSource.Pause();
|
||||
audioSource?.Pause();
|
||||
break;
|
||||
case Windows.UI.Xaml.Media.MediaElementState.Playing:
|
||||
systemControls.PlaybackStatus = MediaPlaybackStatus.Playing;
|
||||
audioSource.Play();
|
||||
audioSource?.Play();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@ namespace FoxTube.Controls
|
||||
|
||||
try { thumbnail.Source = new BitmapImage(item.Snippet.Thumbnails.Medium.Url.ToUri()); }
|
||||
catch { }
|
||||
try { avatar.ProfilePicture = new BitmapImage(new Uri((await r.ExecuteAsync()).Items[0].Snippet.Thumbnails.Medium.Url)); }
|
||||
try { avatar.ProfilePicture = new BitmapImage(new Uri((await r.ExecuteAsync()).Items[0].Snippet.Thumbnails.Medium.Url)) { DecodePixelWidth = 46, DecodePixelHeight = 46 }; }
|
||||
catch { }
|
||||
|
||||
Opacity = 1;
|
||||
|
||||
@@ -72,7 +72,7 @@ namespace FoxTube.Controls
|
||||
liveTag.Visibility = Visibility.Visible;
|
||||
|
||||
if (item.LiveStreamingDetails.ScheduledStartTime.HasValue)
|
||||
liveContent.Text = $"{resources.GetString("/Cards/goesLive")} {(item.LiveStreamingDetails.ScheduledStartTime.Value - DateTime.Now).ToString(@"hh\:mm\:ss")}";
|
||||
liveContent.Text = resources.GetString("/Cards/goesLive") + (item.LiveStreamingDetails.ScheduledStartTime.Value > DateTime.Now ? " " : " -") + (item.LiveStreamingDetails.ScheduledStartTime.Value - DateTime.Now).ToString(@"hh\:mm\:ss");
|
||||
else liveContent.Text = resources.GetString("/Cards/upcoming");
|
||||
}
|
||||
else
|
||||
@@ -83,7 +83,7 @@ namespace FoxTube.Controls
|
||||
|
||||
try { thumbnail.Source = new BitmapImage(item.Snippet.Thumbnails.Medium.Url.ToUri()); }
|
||||
catch { }
|
||||
try { avatar.ProfilePicture = new BitmapImage((await new YoutubeClient().GetChannelAsync(item.Snippet.ChannelId)).LogoUrl.ToUri()); }
|
||||
try { avatar.ProfilePicture = new BitmapImage((await new YoutubeClient().GetChannelAsync(item.Snippet.ChannelId)).LogoUrl.ToUri()) { DecodePixelWidth = 46, DecodePixelHeight = 46 }; }
|
||||
catch { }
|
||||
|
||||
if(SecretsVault.History.Contains(videoId))
|
||||
|
||||
@@ -56,6 +56,12 @@ namespace FoxTube.Pages
|
||||
|
||||
try
|
||||
{
|
||||
if (id == SecretsVault.AccountId)
|
||||
{
|
||||
infoPanel.ColumnDefinitions[2].Width = new GridLength(0);
|
||||
collapsedBtn.Visibility = Visibility.Collapsed;
|
||||
}
|
||||
|
||||
ChannelsResource.ListRequest infoRequest = SecretsVault.Service.Channels.List("snippet,statistics,brandingSettings");
|
||||
infoRequest.Id = channelId = id;
|
||||
|
||||
@@ -66,10 +72,10 @@ namespace FoxTube.Pages
|
||||
videosCount.Text = $"{item.Statistics.VideoCount:0,0} {resources.GetString("/Cards/videos")}";
|
||||
|
||||
if (!item.BrandingSettings.Image.BannerImageUrl.Contains("default"))
|
||||
try { channelCover.Source = new BitmapImage(new Uri(item.BrandingSettings.Image.BannerImageUrl)); }
|
||||
try { channelCover.Source = new BitmapImage(item.BrandingSettings.Image.BannerImageUrl.ToUri()); }
|
||||
catch { }
|
||||
|
||||
try { avatar.ProfilePicture = collapsedAvatar.ProfilePicture = new BitmapImage(new Uri(item.Snippet.Thumbnails.Medium.Url)); }
|
||||
try { avatar.ProfilePicture = collapsedAvatar.ProfilePicture = new BitmapImage(item.Snippet.Thumbnails.Medium.Url.ToUri()) { DecodePixelHeight = 100, DecodePixelWidth = 100 }; }
|
||||
catch { }
|
||||
|
||||
Methods.FormatText(ref description, item.Snippet.Description);
|
||||
|
||||
@@ -12,13 +12,24 @@
|
||||
<Windows10version1809:Grid.BackgroundTransition>
|
||||
<BrushTransition/>
|
||||
</Windows10version1809:Grid.BackgroundTransition>
|
||||
<VisualStateManager.VisualStateGroups>
|
||||
<VisualStateGroup>
|
||||
<VisualState>
|
||||
<VisualState.StateTriggers>
|
||||
<AdaptiveTrigger MinWindowWidth="{x:Bind nav.CompactModeThresholdWidth}"/>
|
||||
</VisualState.StateTriggers>
|
||||
<VisualState.Setters>
|
||||
<Setter Target="Title.Margin" Value="0"/>
|
||||
</VisualState.Setters>
|
||||
</VisualState>
|
||||
</VisualStateGroup>
|
||||
</VisualStateManager.VisualStateGroups>
|
||||
|
||||
<Border x:Name="AppTitleBar"
|
||||
<Border x:Name="AppTitleBar"
|
||||
IsHitTestVisible="True"
|
||||
VerticalAlignment="Top"
|
||||
Background="Transparent"
|
||||
Canvas.ZIndex="1"
|
||||
Margin="12, 8">
|
||||
Canvas.ZIndex="1">
|
||||
|
||||
<TextBlock x:Name="AppTitle"
|
||||
Text="FoxTube"
|
||||
@@ -26,12 +37,20 @@
|
||||
Style="{StaticResource CaptionTextBlockStyle}" />
|
||||
</Border>
|
||||
|
||||
<NavigationView SelectedItem="toHome" Windows10version1803:BackRequested="Nav_BackRequested" Windows10version1803:PaneClosing="Nav_PaneChanged" Windows10version1803:PaneOpening="Nav_PaneChanged" Windows10version1803:PaneTitle="FoxTube" OpenPaneLength="300" Name="nav" SelectionChanged="Nav_SelectionChanged">
|
||||
<NavigationView SelectedItem="toHome" Windows10version1803:BackRequested="Nav_BackRequested" Windows10version1803:PaneClosing="Nav_PaneClosing" Windows10version1803:PaneOpened="Nav_PaneOpened" OpenPaneLength="300" Name="nav" SelectionChanged="Nav_SelectionChanged">
|
||||
|
||||
<NavigationView.Header>
|
||||
<TextBlock Name="Title" Text="Hello, World!" Margin="0,30,0,10" Style="{StaticResource TitleTextBlockStyle}"/>
|
||||
</NavigationView.Header>
|
||||
|
||||
<NavigationView.MenuItemTemplate>
|
||||
<DataTemplate>
|
||||
<StackPanel Orientation="Horizontal" Padding="5" Margin="-5,0,0,0" Tag="{Binding Snippet.ResourceId.ChannelId}">
|
||||
<PersonPicture Height="20" ProfilePicture="{Binding Snippet.Thumbnails.Medium.Url}" Margin="-5,0,15,0"/>
|
||||
<PersonPicture Height="20" Margin="-5,0,15,0">
|
||||
<PersonPicture.ProfilePicture>
|
||||
<BitmapImage UriSource="{Binding Snippet.Thumbnails.Medium.Url}" DecodePixelHeight="20" DecodePixelWidth="20"/>
|
||||
</PersonPicture.ProfilePicture>
|
||||
</PersonPicture>
|
||||
<TextBlock Text="{Binding Snippet.Title}"/>
|
||||
</StackPanel>
|
||||
</DataTemplate>
|
||||
|
||||
@@ -34,7 +34,8 @@ namespace FoxTube
|
||||
public MainPage()
|
||||
{
|
||||
InitializeComponent();
|
||||
SetTitleBar();
|
||||
Window.Current.SetTitleBar(AppTitleBar);
|
||||
CoreApplication.GetCurrentView().TitleBar.LayoutMetricsChanged += (s, e) => SetTitleBar(s);
|
||||
|
||||
SecretsVault.AuthorizationStateChanged += AuthorizationStateChanged;
|
||||
SecretsVault.SubscriptionsChanged += SecretsVault_SubscriptionsChanged;
|
||||
@@ -47,20 +48,20 @@ namespace FoxTube
|
||||
|
||||
headers = new Dictionary<Type, Action>()
|
||||
{
|
||||
{ typeof(Settings), () => nav.Header = resources.GetString("/Main/settings/Content") },
|
||||
{ typeof(ChannelPage), () => nav.Header = resources.GetString("/Main/channel") },
|
||||
{ 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(Settings), () => Title.Text = resources.GetString("/Main/settings/Content") },
|
||||
{ typeof(ChannelPage), () => Title.Text = resources.GetString("/Main/channel") },
|
||||
{ typeof(PlaylistPage), () => Title.Text = resources.GetString("/Main/playlist") },
|
||||
{ typeof(Search), () => Title.Text = resources.GetString("/Main/searchPlaceholder/PlaceholderText") },
|
||||
{ typeof(Subscriptions), () => Title.Text = resources.GetString("/Main/subscriptions/Content") },
|
||||
{ typeof(History), () =>
|
||||
{
|
||||
if((content.Content as History).id == "HL")
|
||||
nav.Header = resources.GetString("/Main/history/Content");
|
||||
Title.Text = resources.GetString("/Main/history/Content");
|
||||
else
|
||||
nav.Header = resources.GetString("/Main/later/Content");
|
||||
Title.Text = resources.GetString("/Main/later/Content");
|
||||
} },
|
||||
{ typeof(Home), () => nav.Header = resources.GetString("/Main/home/Content") },
|
||||
{ typeof(Downloads), () => nav.Header = resources.GetString("/Main/downloads/Content") }
|
||||
{ typeof(Home), () => Title.Text = resources.GetString("/Main/home/Content") },
|
||||
{ typeof(Downloads), () => Title.Text = resources.GetString("/Main/downloads/Content") }
|
||||
};
|
||||
}
|
||||
|
||||
@@ -70,8 +71,16 @@ namespace FoxTube
|
||||
catch { return null; }
|
||||
}
|
||||
|
||||
public void SetTitleBar()
|
||||
public void SetTitleBar(CoreApplicationViewTitleBar coreTitleBar = null)
|
||||
{
|
||||
if(coreTitleBar != null)
|
||||
{
|
||||
bool full = ApplicationView.GetForCurrentView().IsFullScreenMode;
|
||||
double left = 12 + (full ? 0 : coreTitleBar.SystemOverlayLeftInset);
|
||||
AppTitle.Margin = new Thickness(left, 8, 0, 0);
|
||||
AppTitleBar.Height = coreTitleBar.Height;
|
||||
}
|
||||
|
||||
var titleBar = ApplicationView.GetForCurrentView().TitleBar;
|
||||
|
||||
titleBar.ButtonBackgroundColor = Colors.Transparent;
|
||||
@@ -84,8 +93,6 @@ namespace FoxTube
|
||||
titleBar.ForegroundColor = Colors.White;
|
||||
else
|
||||
titleBar.ForegroundColor = Colors.Black;
|
||||
|
||||
CoreApplication.GetCurrentView().TitleBar.ExtendViewIntoTitleBar = true;
|
||||
}
|
||||
|
||||
private void SecretsVault_SubscriptionsChanged(object sender, params object[] args)
|
||||
@@ -145,6 +152,8 @@ namespace FoxTube
|
||||
for (int k = 0; k < SecretsVault.Subscriptions.Count && k < 10; k++)
|
||||
nav.MenuItems.Add(SecretsVault.Subscriptions[k]);
|
||||
}
|
||||
if (SecretsVault.UserChannel == null)
|
||||
toChannel.Visibility = Visibility.Collapsed;
|
||||
break;
|
||||
case false:
|
||||
for (int k = nav.MenuItems.Count - 1; k > 8; k--)
|
||||
@@ -363,7 +372,7 @@ namespace FoxTube
|
||||
return;
|
||||
|
||||
nav.IsBackEnabled = true;
|
||||
nav.Header = resources.GetString("/Main/video");
|
||||
Title.Text = resources.GetString("/Main/video");
|
||||
nav.ExpandedModeThresholdWidth = short.MaxValue;
|
||||
nav.IsPaneOpen = false;
|
||||
}
|
||||
@@ -468,9 +477,9 @@ namespace FoxTube
|
||||
if(e.SourcePageType == typeof(History))
|
||||
{
|
||||
if(e.Parameter.ToString() == "HL")
|
||||
nav.Header = resources.GetString("/Main/history/Content");
|
||||
Title.Text = resources.GetString("/Main/history/Content");
|
||||
else if(e.Parameter.ToString() == "WL")
|
||||
nav.Header = resources.GetString("/Main/later/Content");
|
||||
Title.Text = resources.GetString("/Main/later/Content");
|
||||
}
|
||||
|
||||
if (content.CanGoBack)
|
||||
@@ -547,9 +556,19 @@ namespace FoxTube
|
||||
content.GoBack();
|
||||
}
|
||||
|
||||
private void Nav_PaneChanged(NavigationView sender, object args)
|
||||
private void Nav_PaneClosing(NavigationView sender, NavigationViewPaneClosingEventArgs args)
|
||||
{
|
||||
AppTitleBar.Visibility = nav.IsPaneOpen? Visibility.Visible : Visibility.Collapsed;
|
||||
AppTitle.Visibility = Visibility.Collapsed;
|
||||
}
|
||||
|
||||
private void Nav_PaneOpened(NavigationView sender, object args)
|
||||
{
|
||||
AppTitle.Visibility = Visibility.Visible;
|
||||
|
||||
if (sender.DisplayMode == NavigationViewDisplayMode.Expanded && sender.IsPaneOpen)
|
||||
AppTitleBar.Margin = new Thickness(40, 0, 0, 0);
|
||||
else
|
||||
AppTitleBar.Margin = new Thickness();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -65,7 +65,7 @@ namespace FoxTube.Pages
|
||||
channelRequest.Id = item.Snippet.ChannelId;
|
||||
Channel channel = (await channelRequest.ExecuteAsync()).Items[0];
|
||||
|
||||
try { avatar.ProfilePicture = new BitmapImage(channel.Snippet.Thumbnails.Medium.Url.ToUri()); }
|
||||
try { avatar.ProfilePicture = new BitmapImage(channel.Snippet.Thumbnails.Medium.Url.ToUri()) { DecodePixelWidth = 50, DecodePixelHeight = 50 }; }
|
||||
catch { }
|
||||
try { thumbnail.Source = new BitmapImage(item.Snippet.Thumbnails.Medium.Url.ToUri()); }
|
||||
catch { }
|
||||
|
||||
@@ -20,7 +20,11 @@
|
||||
<ColumnDefinition Width="55"/>
|
||||
<ColumnDefinition/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<PersonPicture Height="50" HorizontalAlignment="Left" ProfilePicture="{Binding Path=Snippet.Thumbnails.Medium.Url}"/>
|
||||
<PersonPicture Height="50" HorizontalAlignment="Left">
|
||||
<PersonPicture.ProfilePicture>
|
||||
<BitmapImage UriSource="{Binding Path=Snippet.Thumbnails.Medium.Url}" DecodePixelHeight="50" DecodePixelWidth="50"/>
|
||||
</PersonPicture.ProfilePicture>
|
||||
</PersonPicture>
|
||||
<TextBlock Grid.Column="1" TextWrapping="Wrap" VerticalAlignment="Center" TextTrimming="CharacterEllipsis" Text="{Binding Path=Snippet.Title}"/>
|
||||
</Grid>
|
||||
</Button>
|
||||
|
||||
@@ -12,6 +12,7 @@ namespace FoxTube.Pages
|
||||
public sealed partial class VideoGrid : Page
|
||||
{
|
||||
public int Count => list.Items.Count;
|
||||
public ItemCollection Children => list.Items;
|
||||
|
||||
public VideoGrid()
|
||||
{
|
||||
|
||||
@@ -32,35 +32,35 @@
|
||||
</Grid.ColumnDefinitions>
|
||||
<ScrollViewer Margin="0,0,0,50" Name="mainScroll" VerticalScrollBarVisibility="Hidden">
|
||||
<StackPanel Orientation="Vertical" Name="mainContent">
|
||||
<Border BorderBrush="Red" BorderThickness="5" CornerRadius="10" Margin="0,10" Name="upcoming" Visibility="Collapsed">
|
||||
<Grid Margin="10">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="auto"/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition Width="auto"/>
|
||||
<ColumnDefinition Width="auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<FontIcon Glyph="" FontSize="50" VerticalAlignment="Center"/>
|
||||
|
||||
<TextBlock x:Uid="/VideoPage/upcomingHeader" FontWeight="Bold" FontSize="25" Text="Stream hasn't started yet" Grid.Column="1" Margin="10,0" VerticalAlignment="Center"/>
|
||||
|
||||
<StackPanel Grid.Column="2" Margin="10,0" Name="schedule" Visibility="Collapsed">
|
||||
<TextBlock x:Uid="/VideoPage/scheduleHeader" FontSize="20" FontWeight="SemiBold" Text="Stream schedule:"/>
|
||||
<TextBlock Name="start" Text="Starts at: 2/15/2019 21:00:00" Visibility="Collapsed"/>
|
||||
<TextBlock Name="end" Text="Ends at: 2/15/2019 23:00:00" Visibility="Collapsed"/>
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Grid.Column="3" Margin="10,0" Name="countdownPanel" Visibility="Collapsed">
|
||||
<TextBlock x:Uid="/VideoPage/countdown" FontSize="20" FontWeight="SemiBold" Text="Stream starts in:"/>
|
||||
<TextBlock Name="countdown" FontWeight="Bold" FontSize="35" Text="00:12:12"/>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</Border>
|
||||
<local:VideoPlayer x:Name="player" NextClicked="Player_NextClicked" MiniMode="Player_Minimize"/>
|
||||
<PivotItem Header="Description" Name="descriptionPanel">
|
||||
<StackPanel Margin="0,10">
|
||||
<TextBlock IsTextSelectionEnabled="True" Name="title" Text="[Video title]" FontSize="25" TextWrapping="WrapWholeWords" HorizontalTextAlignment="Start"/>
|
||||
<Border BorderBrush="Red" BorderThickness="5" CornerRadius="10" Margin="0,10" Name="upcoming" Visibility="Collapsed">
|
||||
<Grid Margin="10">
|
||||
<Grid.ColumnDefinitions>
|
||||
<ColumnDefinition Width="auto"/>
|
||||
<ColumnDefinition/>
|
||||
<ColumnDefinition Width="auto"/>
|
||||
<ColumnDefinition Width="auto"/>
|
||||
</Grid.ColumnDefinitions>
|
||||
|
||||
<FontIcon Glyph="" FontSize="50" VerticalAlignment="Center"/>
|
||||
|
||||
<TextBlock x:Uid="/VideoPage/upcomingHeader" FontWeight="Bold" FontSize="25" Text="Stream hasn't started yet" Grid.Column="1" Margin="10,0" VerticalAlignment="Center"/>
|
||||
|
||||
<StackPanel Grid.Column="2" Margin="10,0" Name="schedule" Visibility="Collapsed">
|
||||
<TextBlock x:Uid="/VideoPage/scheduleHeader" FontSize="20" FontWeight="SemiBold" Text="Stream schedule:"/>
|
||||
<TextBlock Name="start" Text="Starts at: 2/15/2019 21:00:00" Visibility="Collapsed"/>
|
||||
<TextBlock Name="end" Text="Ends at: 2/15/2019 23:00:00" Visibility="Collapsed"/>
|
||||
</StackPanel>
|
||||
|
||||
<StackPanel Grid.Column="3" Margin="10,0" Name="countdownPanel" Visibility="Collapsed">
|
||||
<TextBlock x:Uid="/VideoPage/countdown" FontSize="20" FontWeight="SemiBold" Text="Stream starts in:"/>
|
||||
<TextBlock Name="countdown" FontWeight="Bold" FontSize="35" Text="00:12:12"/>
|
||||
</StackPanel>
|
||||
</Grid>
|
||||
</Border>
|
||||
<Grid>
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="Auto"/>
|
||||
@@ -160,28 +160,19 @@
|
||||
<Pivot Grid.Row="1" Name="pivot" SelectedIndex="0" IsHeaderItemsCarouselEnabled="False">
|
||||
<PivotItem x:Uid="/VideoPage/related" Header="Suggestions">
|
||||
<ScrollViewer>
|
||||
<StackPanel>
|
||||
<controls1:Advert/>
|
||||
<StackPanel Name="relatedVideos">
|
||||
<StackPanel.ChildrenTransitions>
|
||||
<TransitionCollection>
|
||||
<EntranceThemeTransition IsStaggeringEnabled="True"/>
|
||||
</TransitionCollection>
|
||||
</StackPanel.ChildrenTransitions>
|
||||
</StackPanel>
|
||||
</StackPanel>
|
||||
<pages:VideoGrid x:Name="relatedVideos"/>
|
||||
</ScrollViewer>
|
||||
</PivotItem>
|
||||
<PivotItem x:Uid="/VideoPage/comments" Header="Comments" Name="commentsPlaceholder">
|
||||
<pages:CommentsPage x:Name="comments"/>
|
||||
</PivotItem>
|
||||
<PivotItem x:Uid="/VideoPage/playlist" Header="Playlist" Name="playlist">
|
||||
<ScrollViewer>
|
||||
<ScrollViewer Name="playlistScroll">
|
||||
<StackPanel>
|
||||
<StackPanel Padding="8" Background="{ThemeResource SystemControlBackgroundChromeMediumBrush}">
|
||||
<TextBlock Text="Music" FontSize="26" TextWrapping="WrapWholeWords" Name="playlistName"/>
|
||||
<TextBlock Text="DAGames" Name="playlistChannel"/>
|
||||
<TextBlock Text="15/155" Name="playlistCounter"/>
|
||||
<TextBlock Text="[Playlsit name]" FontSize="26" TextWrapping="WrapWholeWords" Name="playlistName"/>
|
||||
<TextBlock Text="[Channel name]" Name="playlistChannel"/>
|
||||
<TextBlock Text="[Counter]" Name="playlistCounter"/>
|
||||
</StackPanel>
|
||||
<ListBox Background="Transparent" SelectionChanged="ListBox_SelectionChanged" Name="playlistList">
|
||||
<ListBox.ItemTemplate>
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
using FoxTube.Controls;
|
||||
using FoxTube.Controls.Adverts;
|
||||
using Google.Apis.YouTube.v3;
|
||||
using Google.Apis.YouTube.v3.Data;
|
||||
using Microsoft.AppCenter.Analytics;
|
||||
@@ -8,6 +7,8 @@ using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Windows.ApplicationModel.DataTransfer;
|
||||
using Windows.ApplicationModel.Resources;
|
||||
using Windows.Foundation;
|
||||
@@ -52,6 +53,7 @@ namespace FoxTube.Pages
|
||||
public Video item;
|
||||
|
||||
bool isExtended = false;
|
||||
bool playlistLoaded = false;
|
||||
|
||||
Rating userRating = Rating.None;
|
||||
|
||||
@@ -146,17 +148,19 @@ namespace FoxTube.Pages
|
||||
|
||||
void SetSchedule()
|
||||
{
|
||||
views.Visibility = Visibility.Collapsed;
|
||||
upcoming.Visibility = Visibility.Visible;
|
||||
if (item.LiveStreamingDetails.ScheduledEndTime.HasValue || item.LiveStreamingDetails.ScheduledStartTime.HasValue)
|
||||
schedule.Visibility = Visibility.Visible;
|
||||
|
||||
if (item.LiveStreamingDetails.ScheduledEndTime.HasValue)
|
||||
{
|
||||
end.Text = $"{resources.GetString("/VideoPage/end")} {item.LiveStreamingDetails.ActualEndTime.Value}";
|
||||
end.Text = $"{resources.GetString("/VideoPage/end")} {item.LiveStreamingDetails.ScheduledEndTime.Value}";
|
||||
end.Visibility = Visibility.Visible;
|
||||
}
|
||||
if (item.LiveStreamingDetails.ScheduledStartTime.HasValue)
|
||||
{
|
||||
start.Text = $"{resources.GetString("/VideoPage/start")} {item.LiveStreamingDetails.ActualStartTime.Value}";
|
||||
start.Text = $"{resources.GetString("/VideoPage/start")} {item.LiveStreamingDetails.ScheduledStartTime.Value}";
|
||||
start.Visibility = Visibility.Visible;
|
||||
|
||||
countdownPanel.Visibility = Visibility.Visible;
|
||||
@@ -164,7 +168,7 @@ namespace FoxTube.Pages
|
||||
countdownTimer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(1) };
|
||||
countdownTimer.Tick += (s, e) =>
|
||||
{
|
||||
countdown.Text = (item.LiveStreamingDetails.ScheduledStartTime.Value - DateTime.Now).ToString(@"hh\:mm\:ss");
|
||||
countdown.Text = item.LiveStreamingDetails.ScheduledStartTime.Value > DateTime.Now ? "" : "-" + (item.LiveStreamingDetails.ScheduledStartTime.Value - DateTime.Now).ToString(@"hh\:mm\:ss");
|
||||
if (countdown.Text == "00:00:00")
|
||||
refresh_Click(this, null);
|
||||
};
|
||||
@@ -186,30 +190,19 @@ namespace FoxTube.Pages
|
||||
PlaylistItemsResource.ListRequest listRequest = SecretsVault.Service.PlaylistItems.List("snippet");
|
||||
listRequest.MaxResults = 50;
|
||||
listRequest.PlaylistId = id;
|
||||
PlaylistItemListResponse listResponse = await listRequest.ExecuteAsync();
|
||||
|
||||
foreach (PlaylistItem i in listResponse.Items)
|
||||
PlaylistItemListResponse listResponse;
|
||||
do
|
||||
{
|
||||
items.Add(new VideoPlaylistItem(i.Snippet.Thumbnails.Medium.Url, i.Snippet.Title, i.Snippet.ResourceId.VideoId));
|
||||
if (items.Last().Id == videoId)
|
||||
selection = items.Last();
|
||||
}
|
||||
|
||||
string token = listResponse.NextPageToken;
|
||||
while (!string.IsNullOrWhiteSpace(token))
|
||||
{
|
||||
listRequest.PageToken = token;
|
||||
listResponse = await listRequest.ExecuteAsync();
|
||||
listRequest.PageToken = listResponse.NextPageToken;
|
||||
|
||||
foreach (PlaylistItem i in listResponse.Items)
|
||||
{
|
||||
foreach(PlaylistItem i in listResponse.Items)
|
||||
items.Add(new VideoPlaylistItem(i.Snippet.Thumbnails.Medium.Url, i.Snippet.Title, i.Snippet.ResourceId.VideoId));
|
||||
if (items.Last().Id == videoId)
|
||||
selection = items.Last();
|
||||
}
|
||||
|
||||
token = listResponse.NextPageToken;
|
||||
}
|
||||
while (!string.IsNullOrWhiteSpace(listRequest.PageToken));
|
||||
|
||||
selection = items.Find(i => i.Id == item.Id);
|
||||
|
||||
for (int k = 0; k < items.Count; k++)
|
||||
items[k].Number = k + 1;
|
||||
@@ -224,6 +217,10 @@ namespace FoxTube.Pages
|
||||
playlistList.SelectedItem = selection;
|
||||
pivot.SelectedItem = playlist;
|
||||
|
||||
await Task.Delay(500);
|
||||
|
||||
playlistScroll.ChangeView(null, playlistList.SelectedIndex * 86 + 89, null, true);
|
||||
|
||||
if (playlistList.SelectedIndex == playlistList.Items.Count - 1)
|
||||
player.Controls.IsNextTrackButtonVisible = false;
|
||||
}
|
||||
@@ -239,7 +236,7 @@ namespace FoxTube.Pages
|
||||
channelRequest.Id = item.Snippet.ChannelId;
|
||||
var item1 = (await channelRequest.ExecuteAsync()).Items[0];
|
||||
|
||||
channelAvatar.ProfilePicture = new BitmapImage(new Uri(item1.Snippet.Thumbnails.Medium.Url));
|
||||
channelAvatar.ProfilePicture = new BitmapImage(item1.Snippet.Thumbnails.Medium.Url.ToUri()) { DecodePixelHeight = 90, DecodePixelWidth = 90 };
|
||||
channelName.Text = item.Snippet.ChannelTitle;
|
||||
subscribers.Text = $"{item1.Statistics.SubscriberCount:0,0} {resources.GetString("/Cards/subscribers")}";
|
||||
|
||||
|
||||
Reference in New Issue
Block a user