Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

修复部分用户合集不显示的问题 #259

Merged
merged 2 commits into from
Jan 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 6 additions & 2 deletions src/App/Controls/Base/ArticleItem/ArticleItem.xaml
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,11 @@
<TextBlock
x:Name="SubtitleBlock"
VerticalAlignment="Center"
MaxLines="1"
Opacity="0.6"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=ViewModel.Data.Subtitle}" />
Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=ViewModel.Data.Subtitle}"
TextTrimming="CharacterEllipsis" />

<TextBlock
x:Name="TitleBlock"
Expand Down Expand Up @@ -239,9 +241,11 @@
<TextBlock
x:Name="SubtitleBlock"
VerticalAlignment="Center"
MaxLines="1"
Opacity="0.6"
Style="{StaticResource CaptionTextBlockStyle}"
Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=ViewModel.Data.Subtitle}" />
Text="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}, Path=ViewModel.Data.Subtitle}"
TextTrimming="CharacterEllipsis" />

<TextBlock
x:Name="TitleBlock"
Expand Down
2 changes: 1 addition & 1 deletion src/App/Forms/MainWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -351,7 +351,7 @@ private void OnRequestShowImages(object sender, ShowImageEventArgs e)

private async void OnBackRequestedAsync(object sender, EventArgs e)
{
if (PlayerFrame.Content.ToString().Contains("PlayerPage"))
if (PlayerFrame.Content != null && PlayerFrame.Content.ToString().Contains("PlayerPage"))
{
MinWidth = 800;
MinHeight = 640;
Expand Down
65 changes: 50 additions & 15 deletions src/Libs/Libs.Adapter/VideoAdapter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -456,15 +456,16 @@ public static VideoPlayerView ConvertToVideoView(ViewReply videoDetail)
}

/// <summary>
/// 撠�憸△霂行� <see cref="ViewReply"/> 頧祆銝箄�憸縑��.
/// 撠�憸△霂行� <see cref="VideoPageResponse"/> 頧祆銝箄�憸縑��.
/// </summary>
/// <param name="response">閫�霂行�.</param>
/// <returns><see cref="VideoPlayerView"/>.</returns>
public static VideoPlayerView ConvertToVideoView(VideoPageResponse response)
{
var videoInfo = GetVideoInformationFromVideoPageResponse(response);
var subVideos = GetSubVideosFromVideoPageResponse(response);
return new VideoPlayerView(videoInfo, default, subVideos, default, default, default, default, default, default);
var videoSection = GetVideoSectionsFromVideoPageResponse(response);
return new VideoPlayerView(videoInfo, default, subVideos, videoSection, default, default, default, default, default);
}

/// <summary>
Expand Down Expand Up @@ -521,6 +522,20 @@ public static VideoHistoryView ConvertToVideoHistoryView(CursorV2Reply reply)
return new VideoHistoryView(items, isFinished);
}

private static VideoInformation GetVideoInformationFromEpisode(VideoEpisode episode, PublisherInfo author)
{
var id = episode.aid.ToString();
var cid = episode.cid.ToString();
var title = Regex.Replace(episode.title, "<[^>]+>", string.Empty);
var duration = episode.arc.duration;
var publisher = UserAdapter.ConvertToRoleProfile(author, AvatarSize.Size64);
var communityInfo = CommunityAdapter.ConvertToVideoCommunityInformation(episode.arc.stat);
var cover = ImageAdapter.ConvertToVideoCardCover(episode.arc.pic);
var identifier = new VideoIdentifier(id, title, duration, cover);
var subtitle = TextToolkit.ConvertToTraditionalChineseIfNeeded(DateTimeOffset.FromUnixTimeSeconds(episode.arc.pubdate).Humanize());
return new VideoInformation(identifier, publisher, cid, communityInformation: communityInfo, subtitle: subtitle);
}

private static VideoInformation GetVideoInformationFromEpisode(Episode episode)
{
var id = episode.Aid.ToString();
Expand All @@ -538,15 +553,15 @@ private static VideoInformation GetVideoInformationFromEpisode(Episode episode)

private static VideoInformation GetVideoInformationFromVideoPageResponse(VideoPageResponse response)
{
var title = TextToolkit.ConvertToTraditionalChineseIfNeeded(response.Title);
var id = response.Aid.ToString();
var bvid = response.Bvid;
var duration = response.Duration;
var cover = ImageAdapter.ConvertToImage(response.Cover);
var publisher = UserAdapter.ConvertToRoleProfile(response.Owner, AvatarSize.Size32);
var desc = TextToolkit.ConvertToTraditionalChineseIfNeeded(response.Description);
var publishTime = DateTimeOffset.FromUnixTimeSeconds(response.PublishDateTime).DateTime;
var communityInfo = CommunityAdapter.ConvertToVideoCommunityInformation(response.Stat);
var title = TextToolkit.ConvertToTraditionalChineseIfNeeded(response.title);
var id = response.aid.ToString();
var bvid = response.bvid;
var duration = response.duration;
var cover = ImageAdapter.ConvertToImage(response.pic);
var publisher = UserAdapter.ConvertToRoleProfile(response.owner, AvatarSize.Size32);
var desc = TextToolkit.ConvertToTraditionalChineseIfNeeded(response.desc);
var publishTime = DateTimeOffset.FromUnixTimeSeconds(response.pubdate).DateTime;
var communityInfo = CommunityAdapter.ConvertToVideoCommunityInformation(response.stat);

var identifier = new VideoIdentifier(id, title, duration, cover);
return new VideoInformation(identifier, publisher, bvid, desc, publishTime: publishTime, communityInformation: communityInfo);
Expand Down Expand Up @@ -586,11 +601,11 @@ private static VideoInformation GetVideoInformationFromViewReply(ViewReply video
private static IEnumerable<VideoIdentifier> GetSubVideosFromVideoPageResponse(VideoPageResponse response)
{
var subVideos = new List<VideoIdentifier>();
foreach (var page in response.SubVideos.OrderBy(p => p.Page))
foreach (var page in response.pages.OrderBy(p => p.page))
{
var cid = page.Cid.ToString();
var title = TextToolkit.ConvertToTraditionalChineseIfNeeded(page.Title);
var duration = page.Duration;
var cid = page.cid.ToString();
var title = TextToolkit.ConvertToTraditionalChineseIfNeeded(page.part);
var duration = page.duration;
var identifier = new VideoIdentifier(cid, title, duration, null);
subVideos.Add(identifier);
}
Expand Down Expand Up @@ -675,6 +690,26 @@ private static IEnumerable<VideoInformation> GetRelatedVideosFromViewReply(ViewR
return relatedVideos;
}

private static IEnumerable<VideoSeason> GetVideoSectionsFromVideoPageResponse(VideoPageResponse response)
{
if (!response.is_season_display)
{
return null;
}

var sections = new List<VideoSeason>();
foreach (var item in response.ugc_season.sections)
{
var id = item.id.ToString();
var title = TextToolkit.ConvertToTraditionalChineseIfNeeded(item.title);
var videos = item.episodes.Select(p => GetVideoInformationFromEpisode(p, response.owner));
var section = new VideoSeason(id, title, videos);
sections.Add(section);
}

return sections;
}

private static IEnumerable<VideoSeason> GetVideoSectionsFromViewReply(ViewReply videoDetail)
{
if (videoDetail.UgcSeason == null || videoDetail.UgcSeason.Sections?.Count == 0)
Expand Down
49 changes: 28 additions & 21 deletions src/Libs/Libs.Provider/PlayerProvider/PlayerProvider.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,10 @@ private PlayerProvider()
public static async Task<VideoPlayerView> GetVideoDetailAsync(string videoId)
{
var type = VideoToolkit.GetVideoIdType(videoId, out var avId);
try
var tasks = new List<Task>();
VideoPlayerView result = default;
VideoPlayerView webResult = default;
tasks.Add(Task.Run(async () =>
{
var viewRequest = new ViewReq();
if (type == VideoIdType.Av && !string.IsNullOrEmpty(avId))
Expand All @@ -64,31 +67,35 @@ public static async Task<VideoPlayerView> GetVideoDetailAsync(string videoId)
var request = await HttpProvider.GetRequestMessageAsync(Video.DetailGrpc, viewRequest);
var response = await HttpProvider.Instance.SendAsync(request);
var data = await HttpProvider.ParseAsync(response, ViewReply.Parser);
return VideoAdapter.ConvertToVideoView(data);
}
catch (ServiceException se)
result = VideoAdapter.ConvertToVideoView(data);
}));

tasks.Add(Task.Run(async () =>
{
if (se.Message == Messages.NoData)
// 雿輻蝵△ API 霂瑟��唳.
var queryParameters = new Dictionary<string, string>();
if (type == VideoIdType.Av)
{
queryParameters.Add("aid", avId);
}
else
{
// 雿輻蝵△ API 霂瑟��唳.
var queryParameters = new Dictionary<string, string>();
if (type == VideoIdType.Av)
{
queryParameters.Add("aid", avId);
}
else
{
queryParameters.Add("bvid", videoId);
}

var request = await HttpProvider.GetRequestMessageAsync(HttpMethod.Get, Video.Detail, queryParameters, RequestClientType.IOS, needToken: false);
var response = await HttpProvider.Instance.SendAsync(request);
var data = await HttpProvider.ParseAsync<ServerResponse<VideoPageResponse>>(response);
return VideoAdapter.ConvertToVideoView(data.Data);
queryParameters.Add("bvid", videoId);
}

var request = await HttpProvider.GetRequestMessageAsync(HttpMethod.Get, Video.Detail, queryParameters, RequestClientType.Web, needToken: false, needCookie: true, needRid: true);
var response = await HttpProvider.Instance.SendAsync(request);
var data = await HttpProvider.ParseAsync<ServerResponse<VideoPageResponse>>(response);
webResult = VideoAdapter.ConvertToVideoView(data.Data);
}));

await Task.WhenAll(tasks.ToArray());
if (webResult.Seasons != null && webResult.Seasons.Count() > 0 && result.Seasons == null)
{
result.Seasons = webResult.Seasons;
}

return default;
return result;
}

/// <summary>
Expand Down
18 changes: 9 additions & 9 deletions src/Models/Models.BiliBili/Player/SubtitleIndexResponse.cs
Original file line number Diff line number Diff line change
@@ -1,50 +1,50 @@
// Copyright (c) Bili Copilot. All rights reserved.
嚜�// Copyright (c) Bili Copilot. All rights reserved.

namespace Bili.Copilot.Models.BiliBili;

/// <summary>
/// 趼躉坰竘砒茼賦彆.
/// 摮�蝝W���蝏�.
/// </summary>
public class SubtitleIndexResponse
{
/// <summary>
/// 盓厥枑蝠.
/// �舀��漱.
/// </summary>
[JsonPropertyName("allow_submit")]
public bool AllowSubmit { get; set; }

/// <summary>
/// 趼躉坰竘蹈桶.
/// 摮�蝝W��”.
/// </summary>
[JsonPropertyName("subtitles")]
public List<SubtitleIndexItem> Subtitles { get; set; }
}

/// <summary>
/// 趼躉坰竘沭醴.
/// 摮�蝝W��∠.
/// </summary>
public class SubtitleIndexItem
{
/// <summary>
/// 趼躉Id.
/// 摮�Id.
/// </summary>
[JsonPropertyName("id")]
public long Id { get; set; }

/// <summary>
/// 逄晟測鎢.
/// 霂剛�隞��.
/// </summary>
[JsonPropertyName("lan")]
public string Language { get; set; }

/// <summary>
/// 珆尨逄晟.
/// �曄內霂剛�.
/// </summary>
[JsonPropertyName("lan_doc")]
public string DisplayLanguage { get; set; }

/// <summary>
/// 趼躉華硊.
/// 摮��啣�.
/// </summary>
[JsonPropertyName("subtitle_url")]
public string Url { get; set; }
Expand Down
Loading
Loading