Added support of livestreams. Chat messages avatars added. Formatting live chat messages added. Few player fixes
Related Work Items: #183, #184
This commit is contained in:
@@ -36,6 +36,7 @@
|
||||
<ColumnDefinition/>
|
||||
</Grid.ColumnDefinitions>
|
||||
<StackPanel Orientation="Horizontal" VerticalAlignment="Top" Margin="5,0">
|
||||
<PersonPicture Height="20" ProfilePicture="{Binding Path=Avatar}"/>
|
||||
<FontIcon Glyph="" ToolTipService.ToolTip="Verified" Margin="2,0" Visibility="{Binding Path=IsVerified}"/>
|
||||
<FontIcon Glyph="" ToolTipService.ToolTip="Moderator" Margin="2,0" Visibility="{Binding Path=IsModerator}"/>
|
||||
<FontIcon Glyph="" ToolTipService.ToolTip="Chat owner" Margin="2,0" Visibility="{Binding Path=IsOwner}"/>
|
||||
@@ -45,7 +46,7 @@
|
||||
<HyperlinkButton Content="{Binding Path=Author}" Tag="{Binding Path=ChannelId}" Grid.Column="1" Margin="0,-6,0,0" FontWeight="Bold" Click="HyperlinkButton_Click"/>
|
||||
<TextBlock Text=":"/>
|
||||
</StackPanel>
|
||||
<TextBlock Grid.Column="2" IsTextSelectionEnabled="True" VerticalAlignment="Top" TextWrapping="WrapWholeWords" Text="{Binding Path=Message}"/>
|
||||
<GroupItem Content="{Binding Path=Message}" Grid.Column="2"/>
|
||||
</Grid>
|
||||
</Border>
|
||||
</DataTemplate>
|
||||
|
||||
@@ -10,35 +10,28 @@ namespace FoxTube.Controls
|
||||
{
|
||||
public class ChatMessage
|
||||
{
|
||||
public string Author
|
||||
public string Author => message.AuthorDetails.DisplayName;
|
||||
public TextBlock Message
|
||||
{
|
||||
get { return message.AuthorDetails.DisplayName; }
|
||||
}
|
||||
public string Message
|
||||
{
|
||||
get { return message.Snippet.DisplayMessage; }
|
||||
}
|
||||
public string ChannelId
|
||||
{
|
||||
get { return message.AuthorDetails.ChannelId; }
|
||||
get
|
||||
{
|
||||
TextBlock block = new TextBlock()
|
||||
{
|
||||
IsTextSelectionEnabled = true,
|
||||
VerticalAlignment = VerticalAlignment.Top,
|
||||
TextWrapping = TextWrapping.WrapWholeWords
|
||||
};
|
||||
Methods.FormatText(ref block, message.Snippet.DisplayMessage);
|
||||
return block;
|
||||
}
|
||||
}
|
||||
public string ChannelId => message.AuthorDetails.ChannelId;
|
||||
public string Avatar => message.AuthorDetails.ProfileImageUrl;
|
||||
|
||||
public Visibility IsVerified
|
||||
{
|
||||
get { return message.AuthorDetails.IsVerified.Value? Visibility.Visible : Visibility.Collapsed; }
|
||||
}
|
||||
public Visibility IsOwner
|
||||
{
|
||||
get { return message.AuthorDetails.IsChatOwner.Value ? Visibility.Visible : Visibility.Collapsed; }
|
||||
}
|
||||
public Visibility IsSponsor
|
||||
{
|
||||
get { return message.AuthorDetails.IsChatSponsor.Value ? Visibility.Visible : Visibility.Collapsed; }
|
||||
}
|
||||
public Visibility IsModerator
|
||||
{
|
||||
get { return message.AuthorDetails.IsChatModerator.Value ? Visibility.Visible : Visibility.Collapsed; }
|
||||
}
|
||||
public Visibility IsVerified => message.AuthorDetails.IsVerified.Value ? Visibility.Visible : Visibility.Collapsed;
|
||||
public Visibility IsOwner => message.AuthorDetails.IsChatOwner.Value ? Visibility.Visible : Visibility.Collapsed;
|
||||
public Visibility IsSponsor => message.AuthorDetails.IsChatSponsor.Value ? Visibility.Visible : Visibility.Collapsed;
|
||||
public Visibility IsModerator => message.AuthorDetails.IsChatModerator.Value ? Visibility.Visible : Visibility.Collapsed;
|
||||
|
||||
public Brush Background
|
||||
{
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
<Button Name="gotoLive" Visibility="Collapsed" Click="GotoLive_Click" Background="Transparent" Foreground="White" Height="50" FontSize="25" ToolTipService.ToolTip="Go to live broadcast">
|
||||
<StackPanel Orientation="Horizontal">
|
||||
<FontIcon Glyph="" Foreground="Red"/>
|
||||
<TextBlock Text="Live" Margin="5,0,0,5"/>
|
||||
<TextBlock Text="Live" Margin="5,0,0,0" FontSize="15" VerticalAlignment="Center"/>
|
||||
</StackPanel>
|
||||
</Button>
|
||||
</StackPanel>
|
||||
@@ -114,7 +114,7 @@
|
||||
</Grid>
|
||||
|
||||
<StackPanel Grid.Column="2" Orientation="Horizontal">
|
||||
<TextBlock Text="1:12:32" Name="liveElapsed" Visibility="Collapsed" FontSize="20" VerticalAlignment="Center" ToolTipService.ToolTip="Elapsed time since stream start"/>
|
||||
<TextBlock Text="1:12:32" Name="liveElapsed" Visibility="Collapsed" Margin="10,0" FontSize="20" VerticalAlignment="Center" ToolTipService.ToolTip="Elapsed time since stream start"/>
|
||||
<StackPanel Orientation="Horizontal" Name="rewindPanel">
|
||||
<Button Click="back10_Click" Name="back10" Background="Transparent" FontFamily="Segoe MDL2 Assets" Content="" Foreground="White" Width="50" Height="50" FontSize="25" ToolTipService.ToolTip="Skip back for 10 seconds"/>
|
||||
<Button Click="fwd30_Click" Name="fwd30" Background="Transparent" FontFamily="Segoe MDL2 Assets" Content="" Foreground="White" Width="50" Height="50" FontSize="25" ToolTipService.ToolTip="Skip forward for 30 seconds"/>
|
||||
@@ -132,7 +132,7 @@
|
||||
</Flyout>
|
||||
</Button.Flyout>
|
||||
</Button>
|
||||
<Button Background="Transparent" FontFamily="Segoe MDL2 Assets" Content="" Foreground="White" Width="50" Height="50" FontSize="25" ToolTipService.ToolTip="Video quality">
|
||||
<Button Name="qualityBtn" Background="Transparent" FontFamily="Segoe MDL2 Assets" Content="" Foreground="White" Width="50" Height="50" FontSize="25" ToolTipService.ToolTip="Video quality">
|
||||
<Button.Flyout>
|
||||
<Flyout>
|
||||
<ComboBox Width="225" Header="Quality" Name="quality" SelectionChanged="quality_SelectionChanged"/>
|
||||
|
||||
@@ -217,18 +217,21 @@ namespace FoxTube
|
||||
}
|
||||
}
|
||||
|
||||
public void LoadStream()
|
||||
public async void LoadStream()
|
||||
{
|
||||
InitializeContols();
|
||||
seekPanel.Visibility = Visibility.Collapsed;
|
||||
rewindPanel.Visibility = Visibility.Collapsed;
|
||||
captions.Visibility = Visibility.Collapsed;
|
||||
captionsBtn.Visibility = Visibility.Collapsed;
|
||||
qualityBtn.Visibility = Visibility.Collapsed;
|
||||
gotoLive.Visibility = Visibility.Visible;
|
||||
liveElapsed.Visibility = Visibility.Visible;
|
||||
|
||||
timer.Tick += UpdateLive;
|
||||
|
||||
//TODO: Set up a stream
|
||||
timer.Start();
|
||||
|
||||
streamInfo = await new YoutubeClient().GetVideoMediaStreamInfosAsync(videoId);
|
||||
videoPlayer.Source = MediaSource.CreateFromUri(streamInfo.HlsLiveStreamUrl.ToUri());
|
||||
}
|
||||
|
||||
public async void LoadVideo()
|
||||
@@ -284,7 +287,7 @@ namespace FoxTube
|
||||
|
||||
public void UpdateLive(object sender, object e)
|
||||
{
|
||||
|
||||
liveElapsed.Text = $"{DateTime.Now - item.LiveStreamingDetails.ActualStartTime:hh\\:mm\\:ss}";
|
||||
}
|
||||
|
||||
public async void UpdateSeek(MediaTimelineController sender, object e)
|
||||
@@ -699,6 +702,9 @@ namespace FoxTube
|
||||
systemControls.IsEnabled = false;
|
||||
pointerCaptured = false;
|
||||
Elapsed(this, null);
|
||||
controller.Pause();
|
||||
videoPlayer.Dispose();
|
||||
audioPlayer?.Dispose();
|
||||
Methods.MainPage.CloseVideo();
|
||||
}
|
||||
|
||||
@@ -796,7 +802,7 @@ namespace FoxTube
|
||||
|
||||
private void GotoLive_Click(object sender, RoutedEventArgs e)
|
||||
{
|
||||
|
||||
controller.Position = controller.Duration.Value.Subtract(TimeSpan.FromMilliseconds(100));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -273,6 +273,7 @@ namespace FoxTube.Pages
|
||||
{
|
||||
commentsPlaceholder.Header = "Chat";
|
||||
commentsPlaceholder.Content = new Chat(item.LiveStreamingDetails.ActiveLiveChatId);
|
||||
pivot.SelectedItem = commentsPlaceholder;
|
||||
}
|
||||
download.Visibility = Visibility.Collapsed;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user