Skip to content
This repository has been archived by the owner on Dec 20, 2023. It is now read-only.

Commit

Permalink
支持协议启动 (#1091)
Browse files Browse the repository at this point in the history
  • Loading branch information
Richasy authored Apr 22, 2022
1 parent 738b699 commit d17577e
Show file tree
Hide file tree
Showing 6 changed files with 164 additions and 6 deletions.
9 changes: 6 additions & 3 deletions src/App/App.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -107,12 +107,15 @@ private async void OnLaunchedOrActivatedAsync(IActivatedEventArgs e)
}

// App launched or activated by link
else if (e is ProtocolActivatedEventArgs protocalArgs)
else if (e is IProtocolActivatedEventArgs protocalArgs)
{
var arg = protocalArgs.Uri.Query.Replace("?", string.Empty);
if (rootFrame.Content == null)
{
rootFrame.Navigate(typeof(Pages.RootPage), arg);
rootFrame.Navigate(typeof(Pages.RootPage), protocalArgs);
}
else
{
await AppViewModel.Instance.InitializeProtocolFromQueryAsync(protocalArgs.Uri);
}
}

Expand Down
6 changes: 6 additions & 0 deletions src/App/Package.appxmanifest
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,12 @@
<uap5:ExecutionAlias Alias="Bili.exe" />
</uap5:AppExecutionAlias>
</uap5:Extension>
<uap:Extension Category="windows.protocol" EntryPoint="App.App">
<uap:Protocol Name="richasy-bili">
<uap:DisplayName>哔哩</uap:DisplayName>
<uap:Logo>Assets\Bili_rgba_80.png</uap:Logo>
</uap:Protocol>
</uap:Extension>
</Extensions>
</Application>
</Applications>
Expand Down
15 changes: 12 additions & 3 deletions src/App/Pages/RootPage.xaml.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
// Copyright (c) Richasy. All rights reserved.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Threading.Tasks;
Expand All @@ -25,6 +24,7 @@ namespace Richasy.Bili.App.Pages
public sealed partial class RootPage : AppPage
{
private string _initialCommandParameters = null;
private Uri _initialUri;

/// <summary>
/// Initializes a new instance of the <see cref="RootPage"/> class.
Expand Down Expand Up @@ -88,9 +88,13 @@ public void RemoveFromHolder(UIElement element)
/// <inheritdoc/>
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if (e.Parameter is CommandLineActivatedEventArgs args)
if (e.Parameter is CommandLineActivatedEventArgs command)
{
_initialCommandParameters = args.Operation.Arguments;
_initialCommandParameters = command.Operation.Arguments;
}
else if (e.Parameter is IProtocolActivatedEventArgs protocol)
{
_initialUri = protocol.Uri;
}
}

Expand Down Expand Up @@ -222,6 +226,11 @@ private async void OnRootNavViewLoadedAsync(object sender, RoutedEventArgs e)
await CoreViewModel.InitializeCommandFromArgumentsAsync(_initialCommandParameters);
_initialCommandParameters = null;
}
else if (_initialUri != null)
{
await CoreViewModel.InitializeProtocolFromQueryAsync(_initialUri);
_initialUri = null;
}
else
{
CoreViewModel.CheckContinuePlay();
Expand Down
15 changes: 15 additions & 0 deletions src/Models/Models.App/Constants/AppConstants.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,21 @@ public static class AppConstants
/// 哔哩哔哩番剧出差账户Id.
/// </summary>
public const int RegionalAnimeUserId = 11783021;

public static class Protocol
{
public const string PlayHost = "play";
public const string FindHost = "find";
public const string NavigateHost = "navigate";

public const string VideoParam = "video";
public const string SeasonParam = "season";
public const string EpisodeParam = "episode";
public const string LiveParam = "live";
public const string KeywordParam = "keyword";
public const string IdParam = "id";
public const string ModeParam = "mode";
}
#pragma warning restore SA1600 // Elements should be documented
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
using System;
using System.Threading.Tasks;
using CommandLine;
using Microsoft.QueryStringDotNET;
using Richasy.Bili.Models.App.Constants;
using Richasy.Bili.Models.App.Other;
using Richasy.Bili.Models.Enums;

Expand Down Expand Up @@ -50,6 +52,16 @@ await Parser.Default.ParseArguments<CommandLineViewModel>(ParseArguments(argumen
}
}
}
else if (!string.IsNullOrEmpty(vm.EpisodeId))
{
if (int.TryParse(vm.EpisodeId.Replace("ep", string.Empty), out var episodeId))
{
record = new CurrentPlayingRecord(episodeId.ToString(), 0, VideoType.Pgc)
{
NeedBiliPlus = true,
};
}
}
else if (!string.IsNullOrEmpty(vm.LiveId))
{
record = new CurrentPlayingRecord(vm.LiveId, 0, VideoType.Live);
Expand Down Expand Up @@ -129,5 +141,115 @@ string[] ParseArguments(string commandLine)
return new string(parmChars).Split('\n');
}
}

/// <summary>
/// 从参数初始化协议调用.
/// </summary>
/// <param name="link">协议调用链接.</param>
/// <returns><see cref="Task"/>.</returns>
public async Task InitializeProtocolFromQueryAsync(Uri link)
{
CurrentPlayingRecord record = null;
var queryList = QueryString.Parse(link.Query.TrimStart('?'));
if (link.Host.Equals(AppConstants.Protocol.PlayHost, StringComparison.OrdinalIgnoreCase))
{
var hasVideoId = queryList.TryGetValue(AppConstants.Protocol.VideoParam, out var videoId);
var hasSeasonId = queryList.TryGetValue(AppConstants.Protocol.SeasonParam, out var seasonId);
var hasEpisodeId = queryList.TryGetValue(AppConstants.Protocol.EpisodeParam, out var episodeId);
var hasLiveId = queryList.TryGetValue(AppConstants.Protocol.LiveParam, out var liveId);

if (hasVideoId)
{
record = new CurrentPlayingRecord(videoId, 0, VideoType.Video);
}
else if (hasSeasonId)
{
var seasonResult = int.TryParse(seasonId.Replace("ss", string.Empty), out var seasonIdNum);
if (seasonResult)
{
record = new CurrentPlayingRecord("0", seasonIdNum, VideoType.Pgc);
if (hasEpisodeId)
{
if (int.TryParse(episodeId.Replace("ep", string.Empty), out var episodeIdNum))
{
record.VideoId = episodeIdNum.ToString();
}
}
}
}
else if (hasEpisodeId)
{
if (int.TryParse(episodeId.Replace("ep", string.Empty), out var episodeIdNum))
{
record = new CurrentPlayingRecord(episodeIdNum.ToString(), 0, VideoType.Pgc)
{
NeedBiliPlus = true,
};
}
}
else if (hasLiveId)
{
record = new CurrentPlayingRecord(liveId, 0, VideoType.Live);
}
}
else if (link.Host.Equals(AppConstants.Protocol.FindHost, StringComparison.OrdinalIgnoreCase))
{
var hasKeyword = queryList.TryGetValue(AppConstants.Protocol.KeywordParam, out var keyword);
if (hasKeyword)
{
SearchModuleViewModel.Instance.InputWords = keyword;
await Task.Delay(500);
SetOverlayContentId(PageIds.Search);
}
}
else if (link.Host.Equals(AppConstants.Protocol.NavigateHost, StringComparison.OrdinalIgnoreCase))
{
var hasId = queryList.TryGetValue(AppConstants.Protocol.IdParam, out var id);
var result = Enum.TryParse(id, true, out PageIds pageId);

if (result && pageId != PageIds.None)
{
var idCode = pageId.GetHashCode();
if (idCode < 100)
{
// 主页面.
SetMainContentId(pageId);
}
else if (idCode < 200)
{
// 需要登录后才能查看的页面.
if (await AccountViewModel.Instance.TrySignInAsync(true))
{
SetOverlayContentId(pageId);
}
}
}
}

if (record != null)
{
var hasMode = queryList.TryGetValue(AppConstants.Protocol.ModeParam, out var modeId);
if (hasMode)
{
if (modeId.Equals("mini", StringComparison.OrdinalIgnoreCase))
{
record.DisplayMode = PlayerDisplayMode.CompactOverlay;
}
else if (modeId.Equals("screen", StringComparison.OrdinalIgnoreCase))
{
record.DisplayMode = PlayerDisplayMode.FullScreen;
}
else if (modeId.Equals("window", StringComparison.OrdinalIgnoreCase))
{
record.DisplayMode = PlayerDisplayMode.FullWindow;
}
}

await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.High, () =>
{
OpenPlayer(record);
});
}
}
}
}
3 changes: 3 additions & 0 deletions src/ViewModels/ViewModels.Uwp/ViewModels.Uwp.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,9 @@
<PackageReference Include="Microsoft.Toolkit.Uwp">
<Version>7.1.2</Version>
</PackageReference>
<PackageReference Include="QueryString.NET">
<Version>1.0.0</Version>
</PackageReference>
<PackageReference Include="ReactiveUI">
<Version>17.1.50</Version>
</PackageReference>
Expand Down

0 comments on commit d17577e

Please sign in to comment.