Archived
1
0
This repository has been archived on 2026-04-22. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
FoxTube/FoxTube/Pages/Search.xaml.cs
T
2019-02-02 15:14:35 +03:00

233 lines
9.6 KiB
C#

using FoxTube.Controls;
using FoxTube.Pages;
using Google.Apis.YouTube.v3;
using Google.Apis.YouTube.v3.Data;
using System;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;
using Windows.System;
using Windows.ApplicationModel.Resources;
namespace FoxTube
{
/// <summary>
/// Search page
/// </summary>
public sealed partial class Search : Page
{
readonly ResourceLoader resources = ResourceLoader.GetForCurrentView("Search");
public SearchParameters Parameters;
SearchResource.ListRequest request;
string nextToken;
readonly VideoGrid list;
readonly LoadingPage loading;
readonly ShowMore more;
public Search()
{
InitializeComponent();
loading = grid.Children[2] as LoadingPage;
list = ((grid.Children[0] as ScrollViewer).Content as StackPanel).Children[4] as VideoGrid;
more = ((grid.Children[0] as ScrollViewer).Content as StackPanel).Children[5] as ShowMore;
}
public string SetResults(int? count)
{
if (count == 1000000)
return count + "+";
else if (count == null)
return "0";
else
return count.ToString();
}
public void AddItem(SearchResult result)
{
switch (result.Id.Kind)
{
case "youtube#video":
VideoCard vCard = new VideoCard(result.Id.VideoId);
list.Add(vCard);
break;
case "youtube#channel":
if(Parameters.Channel == null)
list.Add(new ChannelCard(result.Id.ChannelId, result.Snippet.LiveBroadcastContent));
break;
case "youtube#playlist":
PlaylistCard pCard = new PlaylistCard(result.Id.PlaylistId);
list.Add(pCard);
break;
}
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (e.Parameter == null)
loading.Error("NullReferenceException", "Unable to initialize search. Search term is not stated.");
else
{
if (e.Parameter is SearchParameters)
Initialize(e.Parameter as SearchParameters);
else
loading.Error("ArgumentException", "Wrong parameter");
}
}
public async void Initialize(SearchParameters arg)
{
loading.Refresh();
try
{
Parameters = arg;
request = SecretsVault.Service.Search.List("id,snippet");
if (!string.IsNullOrWhiteSpace(arg.Channel))
{
request.ChannelId = arg.Channel;
(type.Items[2] as ComboBoxItem).Visibility = Visibility.Collapsed;
(grid.Children[1] as CommandBar).Visibility = Visibility.Collapsed;
}
request.Q = arg.Term;
request.SafeSearch = (SearchResource.ListRequest.SafeSearchEnum)SettingsStorage.SafeSearch;
request.RegionCode = SettingsStorage.Region;
request.RelevanceLanguage = SettingsStorage.RelevanceLanguage;
request.MaxResults = 48;
try
{
request.Order = (SearchResource.ListRequest.OrderEnum)arg.Filter.GetParameter(SearchParameters.Filters.Enumerations.ConversionType.Order);
request.Type = (string)arg.Filter.GetParameter(SearchParameters.Filters.Enumerations.ConversionType.Type);
request.PublishedAfter = (DateTime)arg.Filter.GetParameter(SearchParameters.Filters.Enumerations.ConversionType.Date);
request.VideoDefinition = (SearchResource.ListRequest.VideoDefinitionEnum)arg.Filter.GetParameter(SearchParameters.Filters.Enumerations.ConversionType.HD);
request.VideoDimension = (SearchResource.ListRequest.VideoDimensionEnum)arg.Filter.GetParameter(SearchParameters.Filters.Enumerations.ConversionType.ThreeD);
request.VideoCaption = (SearchResource.ListRequest.VideoCaptionEnum)arg.Filter.GetParameter(SearchParameters.Filters.Enumerations.ConversionType.Captions);
request.EventType = (SearchResource.ListRequest.EventTypeEnum)arg.Filter.GetParameter(SearchParameters.Filters.Enumerations.ConversionType.LiveEvent);
request.VideoLicense = (SearchResource.ListRequest.VideoLicenseEnum)arg.Filter.GetParameter(SearchParameters.Filters.Enumerations.ConversionType.CreativeCommons);
}
catch { }
order.SelectedIndex = (int)Parameters.Filter.Order;
type.SelectedIndex = (int)Parameters.Filter.Type;
duration.SelectedIndex = (int)Parameters.Filter.Duration;
if (Parameters.Filter.HD)
features.SelectedItems.Add(features.Items[0]);
if (Parameters.Filter.Is3D)
features.SelectedItems.Add(features.Items[1]);
if (Parameters.Filter.Captions)
features.SelectedItems.Add(features.Items[2]);
if (Parameters.Filter.LiveEvent)
features.SelectedItems.Add(features.Items[3]);
if (Parameters.Filter.CreativeCommons)
features.SelectedItems.Add(features.Items[4]);
SearchListResponse response = await request.ExecuteAsync();
searchTerm.Text = $"{resources.GetString("/Search/header")} '{Parameters.Term}'";
resultsCount.Text = $"{resources.GetString("/Search/found")}: {SetResults(response.PageInfo.TotalResults)} {resources.GetString("/Search/items")}";
if (!string.IsNullOrWhiteSpace(response.NextPageToken))
nextToken = response.NextPageToken;
else
more.Complete(true);
list.Clear();
foreach (SearchResult item in response.Items)
AddItem(item);
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);
}
}
private void ToggleFilters_Click(object sender, RoutedEventArgs e)
{
if(filters.Visibility == Visibility.Collapsed)
{
filters.Visibility = Visibility.Visible;
toggleFilters.Content = resources.GetString("/Search/hideFilters");
}
else
{
filters.Visibility = Visibility.Collapsed;
toggleFilters.Content = resources.GetString("/Search/filters/Content");
}
}
private void AppBarButton_Click(object sender, RoutedEventArgs e)
{
Methods.MainPage.GoToSearch(Parameters);
}
private async void More_Clicked()
{
request.PageToken = nextToken;
SearchListResponse response = await request.ExecuteAsync();
foreach (SearchResult item in response.Items)
AddItem(item);
if (response.NextPageToken != null)
{
nextToken = response.NextPageToken;
more.Complete();
}
else
more.Complete(true);
}
private void Type_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
try
{
if (type.SelectedIndex == 1)
{
duration.Visibility = Visibility.Visible;
featBtn.Visibility = Visibility.Visible;
}
else
{
duration.Visibility = Visibility.Collapsed;
featBtn.Visibility = Visibility.Collapsed;
duration.SelectedIndex = 0;
features.SelectedItems.Clear();
}
}
catch (NullReferenceException) { }
}
private async void InBrowser_Click(object sender, RoutedEventArgs e)
{
await Launcher.LaunchUriAsync(new Uri($"https://www.youtube.com/results?search_query={searchTerm}"));
}
private void Apply_Click(object sender, RoutedEventArgs e)
{
Parameters.Filter.HD = features.SelectedItems.Contains(features.Items[0]);
Parameters.Filter.Is3D = features.SelectedItems.Contains(features.Items[1]);
Parameters.Filter.Captions = features.SelectedItems.Contains(features.Items[2]);
Parameters.Filter.LiveEvent = features.SelectedItems.Contains(features.Items[3]);
Parameters.Filter.CreativeCommons = features.SelectedItems.Contains(features.Items[4]);
Parameters.Filter.Order = (SearchParameters.Filters.Enumerations.Order)order.SelectedIndex;
Parameters.Filter.Type = (SearchParameters.Filters.Enumerations.Type)type.SelectedIndex;
Parameters.Filter.Date = (SearchParameters.Filters.Enumerations.Date)date.SelectedIndex;
Parameters.Filter.Duration = (SearchParameters.Filters.Enumerations.Duration)duration.SelectedIndex;
Initialize(Parameters);
}
}
}