Archived
1
0

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:
Michael Gordeev
2019-01-01 15:01:27 +03:00
parent df6d74da5c
commit cb5c3c7c7f
5 changed files with 37 additions and 36 deletions
+2 -1
View File
@@ -36,6 +36,7 @@
<ColumnDefinition/> <ColumnDefinition/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<StackPanel Orientation="Horizontal" VerticalAlignment="Top" Margin="5,0"> <StackPanel Orientation="Horizontal" VerticalAlignment="Top" Margin="5,0">
<PersonPicture Height="20" ProfilePicture="{Binding Path=Avatar}"/>
<FontIcon Glyph="&#xEC61;" ToolTipService.ToolTip="Verified" Margin="2,0" Visibility="{Binding Path=IsVerified}"/> <FontIcon Glyph="&#xEC61;" ToolTipService.ToolTip="Verified" Margin="2,0" Visibility="{Binding Path=IsVerified}"/>
<FontIcon Glyph="&#xEC1B;" ToolTipService.ToolTip="Moderator" Margin="2,0" Visibility="{Binding Path=IsModerator}"/> <FontIcon Glyph="&#xEC1B;" ToolTipService.ToolTip="Moderator" Margin="2,0" Visibility="{Binding Path=IsModerator}"/>
<FontIcon Glyph="&#xECA7;" ToolTipService.ToolTip="Chat owner" Margin="2,0" Visibility="{Binding Path=IsOwner}"/> <FontIcon Glyph="&#xECA7;" 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"/> <HyperlinkButton Content="{Binding Path=Author}" Tag="{Binding Path=ChannelId}" Grid.Column="1" Margin="0,-6,0,0" FontWeight="Bold" Click="HyperlinkButton_Click"/>
<TextBlock Text=":"/> <TextBlock Text=":"/>
</StackPanel> </StackPanel>
<TextBlock Grid.Column="2" IsTextSelectionEnabled="True" VerticalAlignment="Top" TextWrapping="WrapWholeWords" Text="{Binding Path=Message}"/> <GroupItem Content="{Binding Path=Message}" Grid.Column="2"/>
</Grid> </Grid>
</Border> </Border>
</DataTemplate> </DataTemplate>
+19 -26
View File
@@ -10,35 +10,28 @@ namespace FoxTube.Controls
{ {
public class ChatMessage public class ChatMessage
{ {
public string Author public string Author => message.AuthorDetails.DisplayName;
public TextBlock Message
{ {
get { return message.AuthorDetails.DisplayName; } get
} {
public string Message TextBlock block = new TextBlock()
{ {
get { return message.Snippet.DisplayMessage; } IsTextSelectionEnabled = true,
} VerticalAlignment = VerticalAlignment.Top,
public string ChannelId TextWrapping = TextWrapping.WrapWholeWords
{ };
get { return message.AuthorDetails.ChannelId; } Methods.FormatText(ref block, message.Snippet.DisplayMessage);
return block;
}
} }
public string ChannelId => message.AuthorDetails.ChannelId;
public string Avatar => message.AuthorDetails.ProfileImageUrl;
public Visibility IsVerified public Visibility IsVerified => message.AuthorDetails.IsVerified.Value ? Visibility.Visible : Visibility.Collapsed;
{ public Visibility IsOwner => message.AuthorDetails.IsChatOwner.Value ? Visibility.Visible : Visibility.Collapsed;
get { return message.AuthorDetails.IsVerified.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 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 Brush Background public Brush Background
{ {
+3 -3
View File
@@ -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"> <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"> <StackPanel Orientation="Horizontal">
<FontIcon Glyph="&#xE91F;" Foreground="Red"/> <FontIcon Glyph="&#xE91F;" Foreground="Red"/>
<TextBlock Text="Live" Margin="5,0,0,5"/> <TextBlock Text="Live" Margin="5,0,0,0" FontSize="15" VerticalAlignment="Center"/>
</StackPanel> </StackPanel>
</Button> </Button>
</StackPanel> </StackPanel>
@@ -114,7 +114,7 @@
</Grid> </Grid>
<StackPanel Grid.Column="2" Orientation="Horizontal"> <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"> <StackPanel Orientation="Horizontal" Name="rewindPanel">
<Button Click="back10_Click" Name="back10" Background="Transparent" FontFamily="Segoe MDL2 Assets" Content="&#xED3C;" Foreground="White" Width="50" Height="50" FontSize="25" ToolTipService.ToolTip="Skip back for 10 seconds"/> <Button Click="back10_Click" Name="back10" Background="Transparent" FontFamily="Segoe MDL2 Assets" Content="&#xED3C;" 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="&#xED3D;" Foreground="White" Width="50" Height="50" FontSize="25" ToolTipService.ToolTip="Skip forward for 30 seconds"/> <Button Click="fwd30_Click" Name="fwd30" Background="Transparent" FontFamily="Segoe MDL2 Assets" Content="&#xED3D;" Foreground="White" Width="50" Height="50" FontSize="25" ToolTipService.ToolTip="Skip forward for 30 seconds"/>
@@ -132,7 +132,7 @@
</Flyout> </Flyout>
</Button.Flyout> </Button.Flyout>
</Button> </Button>
<Button Background="Transparent" FontFamily="Segoe MDL2 Assets" Content="&#xE713;" Foreground="White" Width="50" Height="50" FontSize="25" ToolTipService.ToolTip="Video quality"> <Button Name="qualityBtn" Background="Transparent" FontFamily="Segoe MDL2 Assets" Content="&#xE713;" Foreground="White" Width="50" Height="50" FontSize="25" ToolTipService.ToolTip="Video quality">
<Button.Flyout> <Button.Flyout>
<Flyout> <Flyout>
<ComboBox Width="225" Header="Quality" Name="quality" SelectionChanged="quality_SelectionChanged"/> <ComboBox Width="225" Header="Quality" Name="quality" SelectionChanged="quality_SelectionChanged"/>
+12 -6
View File
@@ -217,18 +217,21 @@ namespace FoxTube
} }
} }
public void LoadStream() public async void LoadStream()
{ {
InitializeContols(); InitializeContols();
seekPanel.Visibility = Visibility.Collapsed; seekPanel.Visibility = Visibility.Collapsed;
rewindPanel.Visibility = Visibility.Collapsed; rewindPanel.Visibility = Visibility.Collapsed;
captions.Visibility = Visibility.Collapsed; captionsBtn.Visibility = Visibility.Collapsed;
qualityBtn.Visibility = Visibility.Collapsed;
gotoLive.Visibility = Visibility.Visible; gotoLive.Visibility = Visibility.Visible;
liveElapsed.Visibility = Visibility.Visible; liveElapsed.Visibility = Visibility.Visible;
timer.Tick += UpdateLive; timer.Tick += UpdateLive;
timer.Start();
//TODO: Set up a stream
streamInfo = await new YoutubeClient().GetVideoMediaStreamInfosAsync(videoId);
videoPlayer.Source = MediaSource.CreateFromUri(streamInfo.HlsLiveStreamUrl.ToUri());
} }
public async void LoadVideo() public async void LoadVideo()
@@ -284,7 +287,7 @@ namespace FoxTube
public void UpdateLive(object sender, object e) 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) public async void UpdateSeek(MediaTimelineController sender, object e)
@@ -699,6 +702,9 @@ namespace FoxTube
systemControls.IsEnabled = false; systemControls.IsEnabled = false;
pointerCaptured = false; pointerCaptured = false;
Elapsed(this, null); Elapsed(this, null);
controller.Pause();
videoPlayer.Dispose();
audioPlayer?.Dispose();
Methods.MainPage.CloseVideo(); Methods.MainPage.CloseVideo();
} }
@@ -796,7 +802,7 @@ namespace FoxTube
private void GotoLive_Click(object sender, RoutedEventArgs e) private void GotoLive_Click(object sender, RoutedEventArgs e)
{ {
controller.Position = controller.Duration.Value.Subtract(TimeSpan.FromMilliseconds(100));
} }
} }
} }
+1
View File
@@ -273,6 +273,7 @@ namespace FoxTube.Pages
{ {
commentsPlaceholder.Header = "Chat"; commentsPlaceholder.Header = "Chat";
commentsPlaceholder.Content = new Chat(item.LiveStreamingDetails.ActiveLiveChatId); commentsPlaceholder.Content = new Chat(item.LiveStreamingDetails.ActiveLiveChatId);
pivot.SelectedItem = commentsPlaceholder;
} }
download.Visibility = Visibility.Collapsed; download.Visibility = Visibility.Collapsed;
} }