Archived
1
0

Development

This commit is contained in:
Michael Gordeev
2018-12-19 17:17:04 +03:00
parent 8eaa8321ba
commit 52c081fec2
5 changed files with 186 additions and 151 deletions
+1
View File
@@ -53,6 +53,7 @@ namespace FoxTube
public event ObjectEventHandler SetFullSize; public event ObjectEventHandler SetFullSize;
public event ObjectEventHandler NextClicked; public event ObjectEventHandler NextClicked;
public Button Next => next;
bool isMuxed = false; bool isMuxed = false;
bool audioReady = false; bool audioReady = false;
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?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"> <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="foxtube-5d1cba1f-d7d5-472b-acb7-beb360bab268" Publisher="CN=XFox" Version="1.0.0.0" /> <Identity Name="foxtube-5d1cba1f-d7d5-472b-acb7-beb360bab268" Publisher="CN=Michael Gordeev" Version="0.2.1812.0" />
<mp:PhoneIdentity PhoneProductId="5d1cba1f-d7d5-472b-acb7-beb360bab268" PhonePublisherId="00000000-0000-0000-0000-000000000000" /> <mp:PhoneIdentity PhoneProductId="5d1cba1f-d7d5-472b-acb7-beb360bab268" PhonePublisherId="00000000-0000-0000-0000-000000000000" />
<Properties> <Properties>
<DisplayName>FoxTube</DisplayName> <DisplayName>FoxTube</DisplayName>
+11 -2
View File
@@ -392,6 +392,13 @@ namespace FoxTube
nav.IsBackEnabled = true; nav.IsBackEnabled = true;
else else
nav.IsBackEnabled = false; nav.IsBackEnabled = false;
if (content.SourcePageType == typeof(Home) || content.SourcePageType == typeof(Settings) || content.SourcePageType == typeof(Subscriptions))
{
nav.ExpandedModeThresholdWidth = 1008;
if (nav.DisplayMode == NavigationViewDisplayMode.Expanded)
nav.IsPaneOpen = true;
}
} }
public void MaximizeVideo() public void MaximizeVideo()
@@ -403,6 +410,9 @@ namespace FoxTube
videoPlaceholder.Margin = new Thickness(0); videoPlaceholder.Margin = new Thickness(0);
nav.IsBackEnabled = true; nav.IsBackEnabled = true;
nav.ExpandedModeThresholdWidth = short.MaxValue;
nav.IsPaneOpen = false;
} }
public void Fullscreen(bool on) public void Fullscreen(bool on)
@@ -441,7 +451,6 @@ namespace FoxTube
(videoPlaceholder.Content as VideoPage).player.pointerCaptured = false; (videoPlaceholder.Content as VideoPage).player.pointerCaptured = false;
videoPlaceholder.Content = null; videoPlaceholder.Content = null;
Window.Current.CoreWindow.PointerCursor = new CoreCursor(CoreCursorType.Arrow, 0); Window.Current.CoreWindow.PointerCursor = new CoreCursor(CoreCursorType.Arrow, 0);
MaximizeVideo();
if (content.CanGoBack) if (content.CanGoBack)
nav.IsBackEnabled = true; nav.IsBackEnabled = true;
@@ -665,7 +674,7 @@ namespace FoxTube
nav.IsPaneOpen = true; nav.IsPaneOpen = true;
} }
else else
nav.ExpandedModeThresholdWidth = int.MaxValue; nav.ExpandedModeThresholdWidth = short.MaxValue;
if (videoPlaceholder.Content != null && videoPlaceholder.HorizontalAlignment == HorizontalAlignment.Stretch) if (videoPlaceholder.Content != null && videoPlaceholder.HorizontalAlignment == HorizontalAlignment.Stretch)
MinimizeAsInitializer(); MinimizeAsInitializer();
+1 -20
View File
@@ -82,26 +82,7 @@
</StackPanel> </StackPanel>
</Grid> </Grid>
<TextBlock Name="description" Text="[Description]" IsTextSelectionEnabled="True" TextWrapping="WrapWholeWords"/> <TextBlock Name="description" Text="[Description]" IsTextSelectionEnabled="True" TextWrapping="WrapWholeWords"/>
<Grid Margin="0,20,0,0"> <TextBlock Margin="0,20" Name="category" Text="Category: "/>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
<ColumnDefinition Width="20"/>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<TextBlock Text="Published at: "/>
<TextBlock Grid.Row="1" Text="Category: "/>
<TextBlock Grid.Row="2" Text="License: "/>
<TextBlock Name="publishedAt" Grid.Column="2" Text="[Publishing date]"/>
<TextBlock Name="category" Grid.Column="2" Grid.Row="1" Padding="0" Text="[Category]"/>
<TextBlock Name="license" Grid.Column="2" Grid.Row="2" Text="[License type]"/>
</Grid>
</StackPanel> </StackPanel>
</PivotItem> </PivotItem>
</StackPanel> </StackPanel>
+100 -56
View File
@@ -20,7 +20,7 @@ using FoxTube.Controls;
using YoutubeExplode.Models.MediaStreams; using YoutubeExplode.Models.MediaStreams;
using YoutubeExplode; using YoutubeExplode;
// The Blank Page item template is documented at https://go.microsoft.com/fwlink/?LinkId=234238 //TODO: Refactor page sizing algorythm; Cleanup code
namespace FoxTube.Pages namespace FoxTube.Pages
{ {
@@ -61,6 +61,8 @@ namespace FoxTube.Pages
public CommentsPage comments; public CommentsPage comments;
public LoadingPage loading; public LoadingPage loading;
DispatcherTimer liveTimer;
public VideoPage() public VideoPage()
{ {
this.InitializeComponent(); this.InitializeComponent();
@@ -90,6 +92,9 @@ namespace FoxTube.Pages
private void Player_NextClicked(object sender, params object[] e) private void Player_NextClicked(object sender, params object[] e)
{ {
if(playlistId != null)
playlistList.SelectedIndex++;
else
(relatedVideos.Children[0] as VideoCard).Button_Click(this, null); (relatedVideos.Children[0] as VideoCard).Button_Click(this, null);
} }
@@ -111,21 +116,47 @@ namespace FoxTube.Pages
videoId = ids[0]; videoId = ids[0];
if (ids[1] != null) if (ids[1] != null)
LoadPlaylist(ids[1]);
else
pivot.Items.Remove(playlist);
VideosResource.ListRequest request = SecretsVault.Service.Videos.List("snippet,statistics,status,contentDetails,liveStreamingDetails");
request.Id = ids[0];
item = (await request.ExecuteAsync()).Items[0];
if (item.Snippet.LiveBroadcastContent == "none")
LoadStats();
else
LoadStream();
LoadInfo();
loading.Close();
}
catch (System.Net.Http.HttpRequestException)
{ {
playlistId = ids[1]; loading.Error("System.Net.Http.HttpRequestException", "Unable to connect to Google servers.", true);
}
catch (Exception e)
{
loading.Error(e.GetType().ToString(), e.Message);
}
}
async void LoadPlaylist(string id)
{
playlistId = id;
List<VideoPlaylistItem> items = new List<VideoPlaylistItem>(); List<VideoPlaylistItem> items = new List<VideoPlaylistItem>();
VideoPlaylistItem selection = null; VideoPlaylistItem selection = null;
//Retrieving data
PlaylistsResource.ListRequest playlistRequest = SecretsVault.Service.Playlists.List("snippet,contentDetails"); PlaylistsResource.ListRequest playlistRequest = SecretsVault.Service.Playlists.List("snippet,contentDetails");
playlistRequest.Id = ids[1]; playlistRequest.Id = id;
Playlist playlistItem = (await playlistRequest.ExecuteAsync()).Items[0]; Playlist playlistItem = (await playlistRequest.ExecuteAsync()).Items[0];
playlistName.Text = playlistItem.Snippet.Title;
playlistChannel.Text = playlistItem.Snippet.ChannelTitle;
PlaylistItemsResource.ListRequest listRequest = SecretsVault.Service.PlaylistItems.List("snippet"); PlaylistItemsResource.ListRequest listRequest = SecretsVault.Service.PlaylistItems.List("snippet");
listRequest.MaxResults = 50; listRequest.MaxResults = 50;
listRequest.PlaylistId = ids[1]; listRequest.PlaylistId = id;
PlaylistItemListResponse listResponse = await listRequest.ExecuteAsync(); PlaylistItemListResponse listResponse = await listRequest.ExecuteAsync();
foreach (PlaylistItem i in listResponse.Items) foreach (PlaylistItem i in listResponse.Items)
@@ -154,39 +185,49 @@ namespace FoxTube.Pages
for (int k = 0; k < items.Count; k++) for (int k = 0; k < items.Count; k++)
items[k].Number = k + 1; items[k].Number = k + 1;
//Setting data
playlistName.Text = playlistItem.Snippet.Title;
playlistChannel.Text = playlistItem.Snippet.ChannelTitle;
playlistCounter.Text = $"{items.IndexOf(selection) + 1}/{playlistItem.ContentDetails.ItemCount}"; playlistCounter.Text = $"{items.IndexOf(selection) + 1}/{playlistItem.ContentDetails.ItemCount}";
playlistList.ItemsSource = items; playlistList.ItemsSource = items;
playlistList.SelectedItem = selection; playlistList.SelectedItem = selection;
pivot.SelectedItem = playlist; pivot.SelectedItem = playlist;
if (playlistList.SelectedIndex == playlistList.Items.Count - 1)
player.Next.Visibility = Visibility.Collapsed;
} }
else
pivot.Items.Remove(playlist);
VideosResource.ListRequest request = SecretsVault.Service.Videos.List("snippet,statistics,status,contentDetails");
request.Id = ids[0];
item = (await request.ExecuteAsync()).Items[0];
async void LoadInfo()
{
//Setting meta
title.Text = item.Snippet.Title; title.Text = item.Snippet.Title;
Methods.FormatText(ref description, item.Snippet.Description); Methods.FormatText(ref description, item.Snippet.Description);
publishedAt.Text = item.Snippet.PublishedAt.ToString(); //Setting channel button
if (item.Status.License == "youtube") ChannelsResource.ListRequest channelRequest = SecretsVault.Service.Channels.List("snippet, statistics");
license.Text = "Standard YouTube License"; channelRequest.Id = item.Snippet.ChannelId;
else license.Text = "Creative Commons Attribution license (reuse allowed)"; var item1 = (await channelRequest.ExecuteAsync()).Items[0];
VideoCategoriesResource.ListRequest categoryRequest = SecretsVault.NoAuthService.VideoCategories.List("snippet"); channelAvatar.ProfilePicture = new BitmapImage(new Uri(item1.Snippet.Thumbnails.Medium.Url));
categoryRequest.Id = item.Snippet.CategoryId; channelName.Text = item.Snippet.ChannelTitle;
category.Text = (await categoryRequest.ExecuteAsync()).Items[0].Snippet.Title; subscribers.Text = $"{item1.Statistics.SubscriberCount:0,0} subscribers";
views.Text = $"{item.Statistics.ViewCount:0,0} views"; //Setting ratings
dislikes.Text = $"{item.Statistics.DislikeCount:0,0}"; dislikes.Text = $"{item.Statistics.DislikeCount:0,0}";
likes.Text = $"{item.Statistics.LikeCount:0,0}"; likes.Text = $"{item.Statistics.LikeCount:0,0}";
rating.Value = (double)item.Statistics.DislikeCount / (double)(item.Statistics.DislikeCount + item.Statistics.LikeCount) * 100; rating.Value = (double)item.Statistics.DislikeCount / (double)(item.Statistics.DislikeCount + item.Statistics.LikeCount) * 100;
//Setting category
VideoCategoriesResource.ListRequest categoryRequest = SecretsVault.NoAuthService.VideoCategories.List("snippet");
categoryRequest.Id = item.Snippet.CategoryId;
category.Text = (await categoryRequest.ExecuteAsync()).Items[0].Snippet.Title;
//Setting User's rate
if (SecretsVault.IsAuthorized) if (SecretsVault.IsAuthorized)
{ {
VideoGetRatingResponse ratingResponse = await SecretsVault.Service.Videos.GetRating(ids[0]).ExecuteAsync(); VideoGetRatingResponse ratingResponse = await SecretsVault.Service.Videos.GetRating(videoId).ExecuteAsync();
if (ratingResponse.Items[0].Rating == "like") if (ratingResponse.Items[0].Rating == "like")
{ {
userRating = Rating.Like; userRating = Rating.Like;
@@ -216,29 +257,39 @@ namespace FoxTube.Pages
subscribe.Visibility = Visibility.Collapsed; subscribe.Visibility = Visibility.Collapsed;
} }
ChannelsResource.ListRequest channelRequest = SecretsVault.Service.Channels.List("snippet, statistics"); //Initializing player
channelRequest.Id = item.Snippet.ChannelId; player.Initialize(item, item1.Snippet.Thumbnails.Medium.Url);
var item1 = (await channelRequest.ExecuteAsync()).Items[0];
channelAvatar.ProfilePicture = new BitmapImage(new Uri(item1.Snippet.Thumbnails.Medium.Url)); LoadRelatedVideos();
channelName.Text = item.Snippet.ChannelTitle; }
subscribers.Text = $"{item1.Statistics.SubscriberCount:0,0} subscribers";
void LoadStream()
{
liveTimer = new DispatcherTimer() { Interval = TimeSpan.FromSeconds(10) };
liveTimer.Tick += LiveStatsUpdate;
liveTimer.Start();
LiveStatsUpdate();
commentsPlaceholder.Header = "Chat";
//TODO: Initialize chat
download.Visibility = Visibility.Collapsed;
}
private async void LiveStatsUpdate(object sender = null, object e = null)
{
VideosResource.ListRequest request = SecretsVault.Service.Videos.List("liveStreamingDetails");
request.Id = videoId;
Video video = (await request.ExecuteAsync()).Items[0];
views.Text = $"{item.LiveStreamingDetails.ConcurrentViewers} viewers";
}
void LoadStats()
{
views.Text = $"{item.Statistics.ViewCount:0,0} views";
comments.Initialize(item); comments.Initialize(item);
player.Initialize(item, item1.Snippet.Thumbnails.Medium.Url);
LoadRelatedVideos();
LoadDownloads(); LoadDownloads();
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);
}
} }
async void LoadDownloads() async void LoadDownloads()
@@ -251,9 +302,10 @@ namespace FoxTube.Pages
MenuFlyoutItem menuItem = new MenuFlyoutItem() MenuFlyoutItem menuItem = new MenuFlyoutItem()
{ {
Text = i.VideoQualityLabel, Text = i.VideoQualityLabel,
Tag = new object[] { i, i.VideoQualityLabel } Tag = new { i, i.VideoQualityLabel }
}; };
menuItem.Click += downloadItemSelected; menuItem.Click += (sender, e) =>
DownloadAgent.Add(((sender as MenuFlyoutItem).Tag as object[])[0] as MediaStreamInfo, item, ((sender as MenuFlyoutItem).Tag as object[])[1] as string);
downloadSelector.Items.Add(menuItem); downloadSelector.Items.Add(menuItem);
} }
@@ -262,20 +314,17 @@ namespace FoxTube.Pages
Text = "Audio track", Text = "Audio track",
Tag = new object[] { infoSet.Audio[0], "Audio only" } Tag = new object[] { infoSet.Audio[0], "Audio only" }
}; };
audioItem.Click += downloadItemSelected; audioItem.Click += (sender, e) =>
DownloadAgent.Add(((sender as MenuFlyoutItem).Tag as object[])[0] as MediaStreamInfo, item, ((sender as MenuFlyoutItem).Tag as object[])[1] as string);
downloadSelector.Items.Add(audioItem); downloadSelector.Items.Add(audioItem);
} }
catch (Exception e) catch (Exception e)
{ {
loading.Error(e.GetType().ToString(), e.Message); Debug.WriteLine($"{e.GetType()}: '{e.Message}'");
download.Visibility = Visibility.Collapsed;
} }
} }
private void downloadItemSelected(object sender, RoutedEventArgs e)
{
DownloadAgent.Add(((sender as MenuFlyoutItem).Tag as object[])[0] as MediaStreamInfo, item, ((sender as MenuFlyoutItem).Tag as object[])[1] as string);
}
async void LoadRelatedVideos() async void LoadRelatedVideos()
{ {
SearchResource.ListRequest request = SecretsVault.Service.Search.List("snippet"); SearchResource.ListRequest request = SecretsVault.Service.Search.List("snippet");
@@ -332,8 +381,7 @@ namespace FoxTube.Pages
public void refresh_Click(object sender, RoutedEventArgs e) public void refresh_Click(object sender, RoutedEventArgs e)
{ {
player = new VideoPlayer(); Methods.MainPage.GoToVideo(videoId, playlistId);
Initialize(new string[2] { videoId, playlistId });
} }
private void grid_SizeChanged(object sender, SizeChangedEventArgs e) private void grid_SizeChanged(object sender, SizeChangedEventArgs e)
@@ -487,14 +535,10 @@ namespace FoxTube.Pages
} }
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
try
{ {
if ((e.AddedItems[0] as VideoPlaylistItem).Id != videoId) if ((e.AddedItems[0] as VideoPlaylistItem).Id != videoId)
Methods.MainPage.GoToVideo((e.AddedItems[0] as VideoPlaylistItem).Id, playlistId); Methods.MainPage.GoToVideo((e.AddedItems[0] as VideoPlaylistItem).Id, playlistId);
} }
catch { }
}
private async void subscribe_Click(object sender, RoutedEventArgs e) private async void subscribe_Click(object sender, RoutedEventArgs e)
{ {