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/>
|
<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="" ToolTipService.ToolTip="Verified" Margin="2,0" Visibility="{Binding Path=IsVerified}"/>
|
<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="Moderator" Margin="2,0" Visibility="{Binding Path=IsModerator}"/>
|
||||||
<FontIcon Glyph="" ToolTipService.ToolTip="Chat owner" Margin="2,0" Visibility="{Binding Path=IsOwner}"/>
|
<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"/>
|
<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>
|
||||||
|
|||||||
@@ -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
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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="" Foreground="Red"/>
|
<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>
|
</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="" 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="" 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"/>
|
<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>
|
</Flyout>
|
||||||
</Button.Flyout>
|
</Button.Flyout>
|
||||||
</Button>
|
</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>
|
<Button.Flyout>
|
||||||
<Flyout>
|
<Flyout>
|
||||||
<ComboBox Width="225" Header="Quality" Name="quality" SelectionChanged="quality_SelectionChanged"/>
|
<ComboBox Width="225" Header="Quality" Name="quality" SelectionChanged="quality_SelectionChanged"/>
|
||||||
|
|||||||
@@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user