eea3b11e23
- Added ability to delete comments. Fixes Related Work Items: #228, #234 - Refactored Video page Related Work Items: #183, #186 - Player refactoring - Chat Related Work Items: #183, #185 - New Logo draft - Improving thumbnails quality - Seek slider fixes Related Work Items: #235, #237 - Regions and languagaes improved. Video cards duration display fixed. Added settings updating system Related Work Items: #236 - Items cards' context menu. Fixed duplicating authors' name on comments replies. Another version of logo Related Work Items: #226 - Context menu for cards done Related Work Items: #226 - Live stats update done Related Work Items: #183, #186 - Settings recovery system improvements - Missync fixed. New logo. Supporting all existing qualities Related Work Items: #207 - Added support of livestreams. Chat messages avatars added. Formatting live chat messages added. Few player fixes Related Work Items: #183, #184 - Refactored player. Refactored changelog system. Players isn't localized Related Work Items: #161, #211, #238 - Player fixes. Localization updates. Tiles updated Related Work Items: #161 - Menu render fix Related Work Items: #239 - Fullscreen mode fixes Related Work Items: #240 - Manifest changes - Ads development - Video cards fixes. Localization fixes. CardAdvert created Related Work Items: #244, #245 - Localization fixed. Player fixes. Menu fixes Related Work Items: #243, #245 - Menu displaying fixes - Fixes Related Work Items: #241, #242, #249, #250 - SafeSearch filter fixed - Video page fixes Related Work Items: #249 - Patchnote updated - Version updated
116 lines
4.8 KiB
C#
116 lines
4.8 KiB
C#
using System;
|
|
using Windows.UI.Xaml;
|
|
using Windows.UI.Xaml.Controls;
|
|
using Google.Apis.YouTube.v3;
|
|
using Google.Apis.YouTube.v3.Data;
|
|
using Windows.UI.Xaml.Media.Imaging;
|
|
using Windows.System;
|
|
using Windows.ApplicationModel.DataTransfer;
|
|
using Windows.ApplicationModel.Resources;
|
|
|
|
namespace FoxTube.Controls
|
|
{
|
|
/// <summary>
|
|
/// Video item card
|
|
/// </summary>
|
|
public sealed partial class VideoCard : UserControl
|
|
{
|
|
ResourceLoader resources = ResourceLoader.GetForCurrentView("Cards");
|
|
|
|
public string playlistId;
|
|
public string videoId;
|
|
Video item;
|
|
|
|
public VideoCard(string id, string playlist = null)
|
|
{
|
|
InitializeComponent();
|
|
Initialize(id, playlist);
|
|
}
|
|
|
|
private void UserControl_SizeChanged(object sender, SizeChangedEventArgs e)
|
|
{
|
|
Height = e.NewSize.Width * 0.75;
|
|
}
|
|
|
|
public async void Initialize(string id, string playlist = null)
|
|
{
|
|
VideosResource.ListRequest request = SecretsVault.Service.Videos.List("snippet,contentDetails,statistics,liveStreamingDetails");
|
|
request.Id = id;
|
|
VideoListResponse response = await request.ExecuteAsync();
|
|
|
|
item = response.Items[0];
|
|
videoId = id;
|
|
playlistId = playlist;
|
|
|
|
title.Text = item.Snippet.Title;
|
|
channelName.Text = item.Snippet.ChannelTitle;
|
|
if (item.Snippet.LiveBroadcastContent == "live")
|
|
{
|
|
views.Text = $"{item.LiveStreamingDetails.ConcurrentViewers:0,0} {resources.GetString("/Cards/viewers")}";
|
|
if (item.LiveStreamingDetails.ScheduledStartTime.HasValue && item.LiveStreamingDetails.ScheduledEndTime.HasValue)
|
|
info.Text = $"{item.LiveStreamingDetails.ScheduledEndTime - item.LiveStreamingDetails.ScheduledStartTime} | {Methods.GetAgo(item.LiveStreamingDetails.ActualStartTime.Value)}";
|
|
else
|
|
info.Text = item.LiveStreamingDetails.ActualStartTime.Value.ToString();
|
|
liveTag.Visibility = Visibility.Visible;
|
|
}
|
|
else if(item.Snippet.LiveBroadcastContent == "upcoming")
|
|
{
|
|
views.Text = "";
|
|
if (item.LiveStreamingDetails.ScheduledStartTime.HasValue && item.LiveStreamingDetails.ScheduledEndTime.HasValue)
|
|
info.Text = $"{item.LiveStreamingDetails.ScheduledEndTime - item.LiveStreamingDetails.ScheduledStartTime} | {item.LiveStreamingDetails.ScheduledStartTime}";
|
|
else
|
|
info.Text = $"{Methods.GetAgo(item.Snippet.PublishedAt.Value)}";
|
|
liveTag.Visibility = Visibility.Visible;
|
|
|
|
if (item.LiveStreamingDetails.ScheduledStartTime.HasValue && (item.LiveStreamingDetails.ScheduledStartTime - DateTime.Now).Value.TotalMilliseconds > 0)
|
|
liveContent.Text = $"{resources.GetString("/Cards/goesLive")} {item.LiveStreamingDetails.ScheduledStartTime}";
|
|
else liveContent.Text = resources.GetString("/Cards/upcoming");
|
|
}
|
|
else
|
|
{
|
|
views.Text = $"{item.Statistics.ViewCount:0,0} {resources.GetString("/Cards/views")}";
|
|
info.Text = $"{item.ContentDetails.Duration.GetDuration()} | {Methods.GetAgo(item.Snippet.PublishedAt.Value)}";
|
|
}
|
|
|
|
var request1 = SecretsVault.Service.Channels.List("snippet");
|
|
request1.Id = item.Snippet.ChannelId;
|
|
ChannelListResponse response1 = await request1.ExecuteAsync();
|
|
|
|
try
|
|
{
|
|
avatar.ProfilePicture = new BitmapImage(new Uri(response1.Items[0].Snippet.Thumbnails.Medium.Url));
|
|
thumbnail.Source = new BitmapImage(new Uri((item.Snippet.Thumbnails.Maxres ?? item.Snippet.Thumbnails.Medium).Url));
|
|
}
|
|
catch { }
|
|
|
|
/*if(SecretsVault.UserHistory.Exists(x => x.Id == videoId))
|
|
{
|
|
watched.Visibility = Visibility.Visible;
|
|
leftOn.Value = SecretsVault.UserHistory.Find(x => x.Id == videoId).LeftOn;
|
|
}*/
|
|
}
|
|
|
|
public void Button_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
Methods.MainPage.GoToVideo(videoId, playlistId);
|
|
}
|
|
|
|
private void ViewChannel_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
Methods.MainPage.GoToChannel(item.Snippet.ChannelId);
|
|
}
|
|
|
|
private void GetLink_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
DataPackage data = new DataPackage();
|
|
data.SetText($"https://www.youtube.com/watch?v={videoId}");
|
|
Clipboard.SetContent(data);
|
|
}
|
|
|
|
private async void InBrowser_Click(object sender, RoutedEventArgs e)
|
|
{
|
|
await Launcher.LaunchUriAsync($"https://www.youtube.com/watch?v={videoId}".ToUri());
|
|
}
|
|
}
|
|
}
|