From c4ca46841cc06813d055bfdf27921243f69ce8b1 Mon Sep 17 00:00:00 2001 From: Richasy Date: Mon, 14 Jun 2021 17:51:30 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=88=86=E5=8C=BA=E9=80=BB?= =?UTF-8?q?=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/App/Controls/Bili/PartitionItem.xaml | 2 +- src/App/Controls/Bili/PartitionItem.xaml.cs | 3 +- src/App/Controls/Bili/VideoItem.xaml | 2 +- src/App/Controls/Bili/VideoView.xaml | 8 +- .../Pages/Overlay/PartitionDetailPage.xaml | 5 +- .../Pages/Overlay/PartitionDetailPage.xaml.cs | 45 ++--- src/App/Pages/PartitionPage.xaml | 2 +- src/App/Pages/PartitionPage.xaml.cs | 4 +- .../BiliController.Partition.cs | 100 +++++++++++ .../Controller.Uwp/BiliController.cs | 29 +++- .../Controller.Uwp/Controller.Uwp.csproj | 1 + src/Lib/Lib.Interfaces/IPartitionProvider.cs | 37 ++++ src/Lib/Lib.Interfaces/Lib.Interfaces.csproj | 1 + .../AccountLoginDialog.xaml.cs | 2 +- .../AuthorizeProvider.Extension.cs | 2 +- .../HttpProvider/HttpProvider.Extension.cs | 2 +- src/Lib/Lib.Uwp/HttpProvider/HttpProvider.cs | 2 +- src/Lib/Lib.Uwp/Lib.Uwp.csproj | 2 + .../Lib.Uwp/PartitionProvider.Extension.cs | 14 ++ src/Lib/Lib.Uwp/PartitionProvider.cs | 133 +++++++++++++++ ...PartitionAdditionalDataChangedEventArgs.cs | 42 +++++ .../Models.App/Args/PartitionEventArgs.cs | 33 ++++ .../Args/PartitionVideoIterationEventArgs.cs | 69 ++++++++ .../Constants/ControllerConstants.cs | 20 +++ .../Models.App/Constants/ServiceConstants.cs | 48 ++++++ src/Models/Models.App/Other/LocalCache.cs | 34 ++++ .../Models.App/Other/ServiceException.cs | 2 +- .../Models.BiliBili/Partition/Partition.cs | 2 +- .../Models.BiliBili/Partition/SubPartition.cs | 12 ++ .../Toolkit.Interfaces/IFileToolkit.cs | 2 +- .../Toolkit/Toolkit.Uwp/FileToolkit.cs | 2 +- .../AccountViewModel.Properties.cs | 0 .../AccountViewModel.cs | 0 .../PartitionModuleViewModel.Properties.cs | 9 + .../PartitionModuleViewModel.cs | 33 +++- .../PartitionViewModel/PartitionViewModel.cs | 57 ++++++- .../SubPartitionViewModel.Properties.cs | 12 +- .../SubPartitionViewModel.cs | 161 +++++++++--------- .../ViewModels.Uwp/ViewModels.Uwp.csproj | 8 +- 39 files changed, 798 insertions(+), 144 deletions(-) create mode 100644 src/Controller/Controller.Uwp/BiliController.Partition.cs create mode 100644 src/Lib/Lib.Interfaces/IPartitionProvider.cs create mode 100644 src/Lib/Lib.Uwp/PartitionProvider.Extension.cs create mode 100644 src/Lib/Lib.Uwp/PartitionProvider.cs create mode 100644 src/Models/Models.App/Args/PartitionAdditionalDataChangedEventArgs.cs create mode 100644 src/Models/Models.App/Args/PartitionEventArgs.cs create mode 100644 src/Models/Models.App/Args/PartitionVideoIterationEventArgs.cs create mode 100644 src/Models/Models.App/Constants/ControllerConstants.cs create mode 100644 src/Models/Models.App/Other/LocalCache.cs rename src/ViewModels/ViewModels.Uwp/{ => AccountViewModel}/AccountViewModel.Properties.cs (100%) rename src/ViewModels/ViewModels.Uwp/{ => AccountViewModel}/AccountViewModel.cs (100%) diff --git a/src/App/Controls/Bili/PartitionItem.xaml b/src/App/Controls/Bili/PartitionItem.xaml index 82731a2..bcbfdc5 100644 --- a/src/App/Controls/Bili/PartitionItem.xaml +++ b/src/App/Controls/Bili/PartitionItem.xaml @@ -19,7 +19,7 @@ CornerRadius="{StaticResource ControlCornerRadius}" Tapped="OnItemTapped"> - + diff --git a/src/App/Controls/Bili/PartitionItem.xaml.cs b/src/App/Controls/Bili/PartitionItem.xaml.cs index fe8b7db..1d88681 100644 --- a/src/App/Controls/Bili/PartitionItem.xaml.cs +++ b/src/App/Controls/Bili/PartitionItem.xaml.cs @@ -56,8 +56,7 @@ namespace Richasy.Bili.App.Controls { e.Handled = true; var animationService = ConnectedAnimationService.GetForCurrentView(); - animationService.PrepareToAnimate("PartitionLogoAnimate", this.PartitionLogo); - animationService.PrepareToAnimate("PartitionNameAnimate", this.PartitionName); + animationService.PrepareToAnimate("PartitionAnimate", this.ContentContainer); ItemClick?.Invoke(this, Data); } } diff --git a/src/App/Controls/Bili/VideoItem.xaml b/src/App/Controls/Bili/VideoItem.xaml index f86e994..a3f0085 100644 --- a/src/App/Controls/Bili/VideoItem.xaml +++ b/src/App/Controls/Bili/VideoItem.xaml @@ -119,7 +119,7 @@ + Fill="{ThemeResource ControlOnImageFillColorDefaultBrush}" /> - + @@ -57,7 +57,7 @@ IsBackButtonVisible="Collapsed" IsPaneToggleButtonVisible="False" IsSettingsVisible="False" - ItemInvoked="OnDetailNavigationViewItemInvoked" + ItemInvoked="OnDetailNavigationViewItemInvokedAsync" MenuItemsSource="{x:Bind ViewModel.SubPartitionCollection}" PaneDisplayMode="Top"> @@ -106,6 +106,7 @@ Style="{StaticResource DefaultComboBoxStyle}" ItemsSource="{x:Bind ViewModel.CurrentSelectedSubPartition.SortTypeCollection, Mode=OneWay}" PlaceholderText="{loc:LocaleLocator Name=SelectSortType}" + SelectionChanged="OnVideoSortComboBoxSlectionChanged" Visibility="Collapsed"> diff --git a/src/App/Pages/Overlay/PartitionDetailPage.xaml.cs b/src/App/Pages/Overlay/PartitionDetailPage.xaml.cs index 1c84f3d..713e17b 100644 --- a/src/App/Pages/Overlay/PartitionDetailPage.xaml.cs +++ b/src/App/Pages/Overlay/PartitionDetailPage.xaml.cs @@ -2,7 +2,7 @@ using System.ComponentModel; using Richasy.Bili.App.Controls; -using Richasy.Bili.App.Resources.Extension; +using Richasy.Bili.Models.Enums; using Richasy.Bili.ViewModels.Uwp; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; @@ -49,8 +49,11 @@ namespace Richasy.Bili.App.Pages.Overlay this.ViewModel = data; this.DataContext = data; var animationService = ConnectedAnimationService.GetForCurrentView(); - animationService.TryStartAnimation("PartitionLogoAnimate", PartitionLogo); - animationService.TryStartAnimation("PartitionNameAnimate", PartitionName); + var animate = animationService.GetAnimation("PartitionAnimate"); + if (animate != null) + { + animate.TryStart(PartitionHeader, new UIElement[] { DetailNavigationView }); + } } } @@ -58,49 +61,42 @@ namespace Richasy.Bili.App.Pages.Overlay protected override void OnNavigatingFrom(NavigatingCancelEventArgs e) { var animationService = ConnectedAnimationService.GetForCurrentView(); - var animate = animationService.PrepareToAnimate("PartitionBackAnimate", this.PartitionHeader); + var animate = animationService.PrepareToAnimate("PartitionBackAnimate", this.RootContainer); animate.Configuration = new DirectConnectedAnimationConfiguration(); } private void OnUnloaded(object sender, RoutedEventArgs e) { ViewModel.PropertyChanged -= OnViewModelPropertyChanged; + VideoView.NewItemAdded -= OnVideoViewNewItemAddedAsync; } private void OnLoaded(object sender, RoutedEventArgs e) { ViewModel.PropertyChanged += OnViewModelPropertyChanged; - CheckCurrentSubPartitionAsync(); + VideoView.NewItemAdded += OnVideoViewNewItemAddedAsync; + CheckCurrentSubPartition(); } private void OnViewModelPropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == nameof(ViewModel.CurrentSelectedSubPartition)) { - CheckCurrentSubPartitionAsync(); + CheckCurrentSubPartition(); } } - private void OnDetailNavigationViewItemInvoked(Microsoft.UI.Xaml.Controls.NavigationView sender, Microsoft.UI.Xaml.Controls.NavigationViewItemInvokedEventArgs args) + private async void OnDetailNavigationViewItemInvokedAsync(Microsoft.UI.Xaml.Controls.NavigationView sender, Microsoft.UI.Xaml.Controls.NavigationViewItemInvokedEventArgs args) { var vm = args.InvokedItem as SubPartitionViewModel; - - ViewModel.CurrentSelectedSubPartition = vm; + await ViewModel.SelectSubPartitionAsync(vm); } - private async void CheckCurrentSubPartitionAsync() + private void CheckCurrentSubPartition() { var vm = ViewModel.CurrentSelectedSubPartition; if (vm != null) { - VideoView.NewItemAdded -= OnVideoViewNewItemAddedAsync; - VideoView.NewItemAdded += OnVideoViewNewItemAddedAsync; - - if (!vm.IsRequested) - { - await vm.RequestDataAsync(); - } - BannerView.Visibility = vm.BannerCollection != null && vm.BannerCollection.Count > 0 ? Visibility.Visible : Visibility.Collapsed; var isShowSort = vm.SortTypeCollection != null && vm.SortTypeCollection.Count > 0; if (isShowSort) @@ -154,10 +150,15 @@ namespace Richasy.Bili.App.Pages.Overlay { await ViewModel.CurrentSelectedSubPartition.RequestDataAsync(); } - else - { - VideoView.NewItemAdded -= OnVideoViewNewItemAddedAsync; - } + } + } + + private void OnVideoSortComboBoxSlectionChanged(object sender, SelectionChangedEventArgs e) + { + if (VideoSortComboBox.SelectedItem != null) + { + var item = (VideoSortType)VideoSortComboBox.SelectedItem; + ViewModel.CurrentSelectedSubPartition.CurrentSortType = item; } } } diff --git a/src/App/Pages/PartitionPage.xaml b/src/App/Pages/PartitionPage.xaml index c9e3d83..08861ec 100644 --- a/src/App/Pages/PartitionPage.xaml +++ b/src/App/Pages/PartitionPage.xaml @@ -44,7 +44,7 @@ Loaded="OnItemsRepeaterLoadedAsync"> - + diff --git a/src/App/Pages/PartitionPage.xaml.cs b/src/App/Pages/PartitionPage.xaml.cs index 12a6932..88be84d 100644 --- a/src/App/Pages/PartitionPage.xaml.cs +++ b/src/App/Pages/PartitionPage.xaml.cs @@ -64,10 +64,10 @@ namespace Richasy.Bili.App.Pages this.FindName("PartitionView"); } - private void OnPartitionItemClick(object sender, PartitionViewModel e) + private async void OnPartitionItemClickAsync(object sender, PartitionViewModel e) { - this.ViewModel.CurrentPartition = e; AppViewModel.Instance.SetOverlayContentId(Models.Enums.PageIds.PartitionDetail, e); + await this.ViewModel.SelectPartitionAsync(e); } } } diff --git a/src/Controller/Controller.Uwp/BiliController.Partition.cs b/src/Controller/Controller.Uwp/BiliController.Partition.cs new file mode 100644 index 0000000..b3c293e --- /dev/null +++ b/src/Controller/Controller.Uwp/BiliController.Partition.cs @@ -0,0 +1,100 @@ +// Copyright (c) Richasy. All rights reserved. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Richasy.Bili.Models.App.Args; +using Richasy.Bili.Models.App.Other; +using Richasy.Bili.Models.BiliBili; +using Richasy.Bili.Models.Enums; +using static Richasy.Bili.Models.App.Constants.ControllerConstants; + +namespace Richasy.Bili.Controller.Uwp +{ + /// + /// 控制器的分区及标签部分. + /// + public partial class BiliController + { + /// + /// 请求分区索引. + /// + /// 分区索引列表. + public async Task> RequestPartitionIndexAsync() + { + var cacheData = await _fileToolkit.ReadLocalDataAsync>>(Names.PartitionIndex, folderName: Names.ServerFolder); + var needRequest = true; + List data; + if (cacheData != null) + { + needRequest = cacheData.ExpiryTime < DateTimeOffset.Now; + } + + if (needRequest) + { + var webResult = await _partitionProvider.GetPartitionIndexAsync(); + data = webResult.ToList(); + var localCache = new LocalCache>(DateTimeOffset.Now.AddDays(1), data); + await _fileToolkit.WriteLocalDataAsync(Names.PartitionIndex, localCache, Names.ServerFolder); + } + else + { + data = cacheData.Data; + } + + foreach (var partion in data) + { + partion.Children.Insert(0, null); + } + + return data; + } + + /// + /// 请求子分区数据. + /// + /// 子分区Id. + /// 是否为推荐视频分区. + /// 偏移值. + /// 排序方式. + /// 页码. + /// . + public async Task RequestSubPartitionDataAsync(int subPartitionId, bool isRecommend, int offsetId = 0, VideoSortType sortType = VideoSortType.Default, int pageNumber = 1) + { + try + { + var requestDateTime = DateTimeOffset.Now; + var data = await _partitionProvider.GetSubPartitionDataAsync(subPartitionId, isRecommend, offsetId, sortType, pageNumber); + pageNumber = !isRecommend && sortType != VideoSortType.Default ? pageNumber + 1 : 1; + SubPartitionVideoIteration?.Invoke(this, new PartitionVideoIterationEventArgs(subPartitionId, requestDateTime, data, pageNumber)); + + if (data is SubPartitionRecommend recommend && (recommend.Banner?.TopBanners?.Any() ?? false)) + { + SubPartitionAdditionalDataChanged?.Invoke( + this, + new PartitionAdditionalDataChangedEventArgs( + subPartitionId, + requestDateTime, + recommend.Banner.TopBanners)); + } + else if (data is SubPartitionDefault defaultData && (defaultData.TopTags?.Any() ?? false)) + { + SubPartitionAdditionalDataChanged?.Invoke( + this, + new PartitionAdditionalDataChangedEventArgs( + subPartitionId, + requestDateTime, + tagList: defaultData.TopTags)); + } + } + catch + { + if (offsetId == 0) + { + throw; + } + } + } + } +} diff --git a/src/Controller/Controller.Uwp/BiliController.cs b/src/Controller/Controller.Uwp/BiliController.cs index 85c44db..8114f43 100644 --- a/src/Controller/Controller.Uwp/BiliController.cs +++ b/src/Controller/Controller.Uwp/BiliController.cs @@ -7,6 +7,7 @@ using Richasy.Bili.Controller.Uwp.Modules; using Richasy.Bili.Lib.Interfaces; using Richasy.Bili.Lib.Uwp; using Richasy.Bili.Locator.Uwp; +using Richasy.Bili.Models.App.Args; using Richasy.Bili.Models.BiliBili; using Richasy.Bili.Toolkit.Interfaces; using Richasy.Bili.Toolkit.Uwp; @@ -19,8 +20,11 @@ namespace Richasy.Bili.Controller.Uwp public partial class BiliController { private readonly ISettingsToolkit _settingsToolkit; + private readonly IFileToolkit _fileToolkit; + private readonly IAuthorizeProvider _authorizeProvider; private readonly IAccountProvider _accountProvider; + private readonly IPartitionProvider _partitionProvider; private readonly INetworkModule _networkModule; @@ -31,33 +35,45 @@ namespace Richasy.Bili.Controller.Uwp { RegisterToolkitServices(); ServiceLocator.Instance.LoadService(out _settingsToolkit) + .LoadService(out _fileToolkit) .LoadService(out _networkModule) .LoadService(out _authorizeProvider) - .LoadService(out _accountProvider); + .LoadService(out _accountProvider) + .LoadService(out _partitionProvider); RegisterEvents(); } /// - /// Triggered when the user successfully logs in + /// 在用户成功登录后发生. /// public event EventHandler Logged; /// - /// Triggered when the user successfully logs out + /// 在用户登出时发生. /// public event EventHandler LoggedOut; /// - /// Triggered when user login fails + /// 在用户登录失败时发生. /// public event EventHandler LoggedFailed; /// - /// Triggered when the user changes + /// 在登录账户数据发生改变时发生. /// public event EventHandler AccountChanged; + /// + /// 在子分区有新的视频列表传入时发生. + /// + public event EventHandler SubPartitionVideoIteration; + + /// + /// 在子分区的附加数据发生改变时发生. + /// + public event EventHandler SubPartitionAdditionalDataChanged; + /// /// 控制器实例. /// @@ -87,7 +103,8 @@ namespace Richasy.Bili.Controller.Uwp .AddSingleton() .AddSingleton() .AddSingleton() - .AddSingleton(); + .AddSingleton() + .AddSingleton(); _ = new ServiceLocator(serviceCollection); } } diff --git a/src/Controller/Controller.Uwp/Controller.Uwp.csproj b/src/Controller/Controller.Uwp/Controller.Uwp.csproj index e4be0f3..d58f0d8 100644 --- a/src/Controller/Controller.Uwp/Controller.Uwp.csproj +++ b/src/Controller/Controller.Uwp/Controller.Uwp.csproj @@ -12,6 +12,7 @@ + diff --git a/src/Lib/Lib.Interfaces/IPartitionProvider.cs b/src/Lib/Lib.Interfaces/IPartitionProvider.cs new file mode 100644 index 0000000..7d51520 --- /dev/null +++ b/src/Lib/Lib.Interfaces/IPartitionProvider.cs @@ -0,0 +1,37 @@ +// Copyright (c) Richasy. All rights reserved. + +using System.Collections.Generic; +using System.Threading.Tasks; +using Richasy.Bili.Models.BiliBili; +using Richasy.Bili.Models.Enums; + +namespace Richasy.Bili.Lib.Interfaces +{ + /// + /// 分区,标签相关的数据操作定义. + /// + public interface IPartitionProvider + { + /// + /// 获取分区索引. + /// + /// 全部分区索引,但不包括需要网页显示的分区. + Task> GetPartitionIndexAsync(); + + /// + /// 获取子分区数据. + /// + /// 子分区Id. + /// 是否是推荐子分区. + /// 偏移Id. + /// 排序方式. + /// 页码. + /// 返回的子分区数据. + Task GetSubPartitionDataAsync( + int subPartitionId, + bool isRecommend, + int offsetId = 0, + VideoSortType sortType = VideoSortType.Default, + int pageNumber = 1); + } +} diff --git a/src/Lib/Lib.Interfaces/Lib.Interfaces.csproj b/src/Lib/Lib.Interfaces/Lib.Interfaces.csproj index fd1dd42..ab69270 100644 --- a/src/Lib/Lib.Interfaces/Lib.Interfaces.csproj +++ b/src/Lib/Lib.Interfaces/Lib.Interfaces.csproj @@ -123,6 +123,7 @@ + diff --git a/src/Lib/Lib.Uwp/AuthorizeProvider/AccountLoginDialog.xaml.cs b/src/Lib/Lib.Uwp/AuthorizeProvider/AccountLoginDialog.xaml.cs index 52dbc1a..2977a6b 100644 --- a/src/Lib/Lib.Uwp/AuthorizeProvider/AccountLoginDialog.xaml.cs +++ b/src/Lib/Lib.Uwp/AuthorizeProvider/AccountLoginDialog.xaml.cs @@ -3,7 +3,7 @@ using System.Threading.Tasks; using Richasy.Bili.Lib.Interfaces; using Richasy.Bili.Locator.Uwp; -using Richasy.Bili.Models.App.Other.Models; +using Richasy.Bili.Models.App.Other; using Richasy.Bili.Models.BiliBili; using Richasy.Bili.Models.Enums; using Richasy.Bili.Toolkit.Interfaces; diff --git a/src/Lib/Lib.Uwp/AuthorizeProvider/AuthorizeProvider.Extension.cs b/src/Lib/Lib.Uwp/AuthorizeProvider/AuthorizeProvider.Extension.cs index 73ae23f..87f1952 100644 --- a/src/Lib/Lib.Uwp/AuthorizeProvider/AuthorizeProvider.Extension.cs +++ b/src/Lib/Lib.Uwp/AuthorizeProvider/AuthorizeProvider.Extension.cs @@ -11,7 +11,7 @@ using System.Threading.Tasks; using Newtonsoft.Json.Linq; using Richasy.Bili.Lib.Interfaces; using Richasy.Bili.Locator.Uwp; -using Richasy.Bili.Models.App.Other.Models; +using Richasy.Bili.Models.App.Other; using Richasy.Bili.Models.BiliBili; using Richasy.Bili.Models.Enums; using Richasy.Bili.Toolkit.Interfaces; diff --git a/src/Lib/Lib.Uwp/HttpProvider/HttpProvider.Extension.cs b/src/Lib/Lib.Uwp/HttpProvider/HttpProvider.Extension.cs index d242647..058cbe1 100644 --- a/src/Lib/Lib.Uwp/HttpProvider/HttpProvider.Extension.cs +++ b/src/Lib/Lib.Uwp/HttpProvider/HttpProvider.Extension.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; using Newtonsoft.Json; using Richasy.Bili.Lib.Interfaces; using Richasy.Bili.Models.App.Constants; -using Richasy.Bili.Models.App.Other.Models; +using Richasy.Bili.Models.App.Other; using Richasy.Bili.Models.BiliBili; namespace Richasy.Bili.Lib.Uwp diff --git a/src/Lib/Lib.Uwp/HttpProvider/HttpProvider.cs b/src/Lib/Lib.Uwp/HttpProvider/HttpProvider.cs index 4dd101c..c8a78f5 100644 --- a/src/Lib/Lib.Uwp/HttpProvider/HttpProvider.cs +++ b/src/Lib/Lib.Uwp/HttpProvider/HttpProvider.cs @@ -8,7 +8,7 @@ using System.Threading.Tasks; using Newtonsoft.Json; using Richasy.Bili.Lib.Interfaces; using Richasy.Bili.Models.App.Constants; -using Richasy.Bili.Models.App.Other.Models; +using Richasy.Bili.Models.App.Other; using Richasy.Bili.Models.Enums; namespace Richasy.Bili.Lib.Uwp diff --git a/src/Lib/Lib.Uwp/Lib.Uwp.csproj b/src/Lib/Lib.Uwp/Lib.Uwp.csproj index ad726e0..7065775 100644 --- a/src/Lib/Lib.Uwp/Lib.Uwp.csproj +++ b/src/Lib/Lib.Uwp/Lib.Uwp.csproj @@ -18,6 +18,8 @@ + + Properties\SharedAssemblyInfo.cs diff --git a/src/Lib/Lib.Uwp/PartitionProvider.Extension.cs b/src/Lib/Lib.Uwp/PartitionProvider.Extension.cs new file mode 100644 index 0000000..907c862 --- /dev/null +++ b/src/Lib/Lib.Uwp/PartitionProvider.Extension.cs @@ -0,0 +1,14 @@ +// Copyright (c) Richasy. All rights reserved. + +using Richasy.Bili.Lib.Interfaces; + +namespace Richasy.Bili.Lib.Uwp +{ + /// + /// 分区及标签的相关定义和扩展方法. + /// + public partial class PartitionProvider + { + private readonly IHttpProvider _httpProvider; + } +} diff --git a/src/Lib/Lib.Uwp/PartitionProvider.cs b/src/Lib/Lib.Uwp/PartitionProvider.cs new file mode 100644 index 0000000..f481566 --- /dev/null +++ b/src/Lib/Lib.Uwp/PartitionProvider.cs @@ -0,0 +1,133 @@ +// Copyright (c) Richasy. All rights reserved. + +using System.Collections.Generic; +using System.Linq; +using System.Net.Http; +using System.Threading.Tasks; +using Richasy.Bili.Lib.Interfaces; +using Richasy.Bili.Models.BiliBili; +using Richasy.Bili.Models.Enums; +using static Richasy.Bili.Models.App.Constants.ServiceConstants; + +namespace Richasy.Bili.Lib.Uwp +{ + /// + /// 提供分区及标签的数据操作. + /// + public partial class PartitionProvider : IPartitionProvider + { + /// + /// Initializes a new instance of the class. + /// + /// 网络操作工具. + public PartitionProvider(IHttpProvider httpProvider) => _httpProvider = httpProvider; + + /// + public async Task> GetPartitionIndexAsync() + { + var request = await _httpProvider.GetRequestMessageAsync(HttpMethod.Get, Api.Partition.PartitionIndex); + var response = await _httpProvider.SendAsync(request); + var data = await _httpProvider.ParseAsync>>(response); + + return data.Data.Where(p => p.IsNeedToShow()); + } + + /// + public async Task GetSubPartitionDataAsync( + int subPartitionId, + bool isRecommend, + int offsetId = 0, + VideoSortType sortType = VideoSortType.Default, + int pageNum = 1) + { + var requestUrl = string.Empty; + var isOffset = offsetId != 0; + var isDefaultOrder = sortType == VideoSortType.Default; + SubPartition data; + + if (isRecommend) + { + requestUrl = isOffset ? Api.Partition.SubPartitionRecommendOffset : Api.Partition.SubPartitionRecommend; + } + else + { + if (!isDefaultOrder) + { + requestUrl = Api.Partition.SubPartitionOrderOffset; + } + else + { + requestUrl = isOffset ? Api.Partition.SubPartitionNormalOffset : Api.Partition.SubPartitionNormal; + } + } + + var queryParameters = new Dictionary + { + { Query.PartitionId, subPartitionId.ToString() }, + { Query.Pull, "0" }, + }; + + if (isOffset) + { + queryParameters.Add(Query.OffsetId, offsetId.ToString()); + } + + if (!isDefaultOrder) + { + var sortStr = string.Empty; + switch (sortType) + { + case VideoSortType.Newest: + sortStr = Sort.Newest; + break; + case VideoSortType.Play: + sortStr = Sort.Play; + break; + case VideoSortType.Reply: + sortStr = Sort.Reply; + break; + case VideoSortType.Danmaku: + sortStr = Sort.Danmaku; + break; + case VideoSortType.Favorite: + sortStr = Sort.Favorite; + break; + default: + break; + } + + queryParameters.Add(Query.Order, sortStr); + queryParameters.Add(Query.PageNumber, pageNum.ToString()); + queryParameters.Add(Query.PageSize, "30"); + } + + var request = await _httpProvider.GetRequestMessageAsync(HttpMethod.Get, requestUrl, queryParameters); + var response = await _httpProvider.SendAsync(request); + if (isOffset) + { + data = (await _httpProvider.ParseAsync>(response)).Data; + } + else if (!isRecommend) + { + if (!isDefaultOrder) + { + var list = (await _httpProvider.ParseAsync>>(response)).Data; + data = new SubPartition() + { + NewVideos = list, + }; + } + else + { + data = (await _httpProvider.ParseAsync>(response)).Data; + } + } + else + { + data = (await _httpProvider.ParseAsync>(response)).Data; + } + + return data; + } + } +} diff --git a/src/Models/Models.App/Args/PartitionAdditionalDataChangedEventArgs.cs b/src/Models/Models.App/Args/PartitionAdditionalDataChangedEventArgs.cs new file mode 100644 index 0000000..d635f07 --- /dev/null +++ b/src/Models/Models.App/Args/PartitionAdditionalDataChangedEventArgs.cs @@ -0,0 +1,42 @@ +// Copyright (c) Richasy. All rights reserved. + +using System; +using System.Collections.Generic; +using Richasy.Bili.Models.BiliBili; + +namespace Richasy.Bili.Models.App.Args +{ + /// + /// 分区附加数据改变时的事件参数. + /// + public class PartitionAdditionalDataChangedEventArgs : PartitionEventArgs + { + /// + /// Initializes a new instance of the class. + /// + /// 子分区Id. + /// 请求发生的时间. + /// 横幅列表. + /// 标签列表. + public PartitionAdditionalDataChangedEventArgs( + int subPartitionId, + DateTimeOffset requestDateTime, + IEnumerable bannerList = null, + IEnumerable tagList = null) + : base(subPartitionId, requestDateTime) + { + this.BannerList = bannerList; + this.TagList = tagList; + } + + /// + /// 横幅列表. + /// + public IEnumerable BannerList { get; set; } + + /// + /// 热门标签列表. + /// + public IEnumerable TagList { get; set; } + } +} diff --git a/src/Models/Models.App/Args/PartitionEventArgs.cs b/src/Models/Models.App/Args/PartitionEventArgs.cs new file mode 100644 index 0000000..0d7bb12 --- /dev/null +++ b/src/Models/Models.App/Args/PartitionEventArgs.cs @@ -0,0 +1,33 @@ +// Copyright (c) Richasy. All rights reserved. + +using System; + +namespace Richasy.Bili.Models.App.Args +{ + /// + /// 分区事件参数基类. + /// + public class PartitionEventArgs : EventArgs + { + /// + /// Initializes a new instance of the class. + /// + /// 子分区Id. + /// 请求发生的时间. + public PartitionEventArgs(int subPartitionId, DateTimeOffset requestDateTime) + { + this.SubPartitionId = subPartitionId; + this.RequestDateTime = requestDateTime; + } + + /// + /// 子分区标识符. + /// + public int SubPartitionId { get; set; } + + /// + /// 请求发生时的时间. + /// + public DateTimeOffset RequestDateTime { get; set; } + } +} diff --git a/src/Models/Models.App/Args/PartitionVideoIterationEventArgs.cs b/src/Models/Models.App/Args/PartitionVideoIterationEventArgs.cs new file mode 100644 index 0000000..731e2c0 --- /dev/null +++ b/src/Models/Models.App/Args/PartitionVideoIterationEventArgs.cs @@ -0,0 +1,69 @@ +// Copyright (c) Richasy. All rights reserved. + +using System; +using System.Collections.Generic; +using System.Linq; +using Richasy.Bili.Models.BiliBili; + +namespace Richasy.Bili.Models.App.Args +{ + /// + /// 视频批量传输事件,用于传输视频列表. + /// + public class PartitionVideoIterationEventArgs : PartitionEventArgs + { + /// + /// Initializes a new instance of the class. + /// + /// 子分区Id. + /// 请求发生时间. + /// 子分区数据. + /// 下一页码. + public PartitionVideoIterationEventArgs( + int subPartitionId, + DateTimeOffset requestDateTime, + SubPartition partionData, + int nextPageNumber) + : base(subPartitionId, requestDateTime) + { + this.SubPartitionId = subPartitionId; + this.TopOffsetId = partionData.TopOffsetId; + this.BottomOffsetId = partionData.BottomOffsetId; + this.RequestDateTime = requestDateTime; + this.NextPageNumber = nextPageNumber; + + var videoList = new List