Skip to content

Commit 1176350

Browse files
committed
修复弹幕获取的ID匹配逻辑
1 parent 9e45de8 commit 1176350

File tree

4 files changed

+51
-30
lines changed

4 files changed

+51
-30
lines changed

CHANGELOG.MD

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
更新日志文档,版本顺序从新到旧,最新版本在最前(上)面。
44

5+
# 1.5.1
6+
7+
- 修复弹幕获取的ID匹配逻辑
8+
59
# 1.5.0
610

711
- 更新查询弹幕时的剧集ID的查询方式,根据番组计划ID查询剧集ID

lib/player/player_video_desktop.dart

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import 'package:ikaros/api/collection/EpisodeCollectionApi.dart';
1313
import 'package:ikaros/api/dandanplay/DandanplayBangumiApi.dart';
1414
import 'package:ikaros/api/dandanplay/DandanplayCommentApi.dart';
1515
import 'package:ikaros/api/dandanplay/DandanplaySearchApi.dart';
16+
import 'package:ikaros/api/dandanplay/model/BangumiEpisode.dart';
1617
import 'package:ikaros/api/dandanplay/model/CommentEpisode.dart';
1718
import 'package:ikaros/api/dandanplay/model/CommentEpisodeIdResponse.dart';
1819
import 'package:ikaros/api/dandanplay/model/IkarosDanmukuBangumiResponse.dart';
@@ -214,31 +215,32 @@ class DesktopVideoPlayerState extends State<DesktopVideoPlayer>
214215
return; // 自己新建的无三方同步平台ID关联的条目是不会请求弹幕的
215216
}
216217
var targetEpisodeId = -1;
217-
if (_syncs.isNotEmpty && _syncs.first.platform == SubjectSyncPlatform.BGM_TV) {
218+
if (_syncs.isNotEmpty &&
219+
_syncs.first.platform == SubjectSyncPlatform.BGM_TV) {
218220
var bgmtvSubjectId = _syncs.first.platformId;
219221

220222
IkarosDanmukuBangumiResponse? bangumiRsp = await DandanplayBangumiApi()
221223
.getBangumiDetailsByBgmtvSubjectId(bgmtvSubjectId);
222-
if (bangumiRsp != null) {
223-
targetEpisodeId =
224-
bangumiRsp.data.episodes.where((ep)=> ep.episodeNumber == _episode.sequence.toString())
225-
.first.episodeId;
224+
if (bangumiRsp != null && bangumiRsp.data.episodes.isNotEmpty) {
225+
BangumiEpisode? targetEpisode = bangumiRsp.data.episodes
226+
.where((ep) => ep.episodeNumber == _episode.sequence.toInt().toString())
227+
.firstOrNull;
228+
targetEpisodeId = targetEpisode?.episodeId ?? -1;
226229
}
227230
}
228231
if (targetEpisodeId == -1) {
229232
IkarosDanmukuEpisodesResponse? searchEpsResp = await DandanplaySearchApi()
230233
.searchEpisodes(_subject!.name, _episode.sequence.toInt().toString());
231-
if (searchEpsResp == null ||
232-
searchEpsResp.animes.isEmpty) return;
234+
if (searchEpsResp == null || searchEpsResp.animes.isEmpty) return;
233235
SearchEpisodesAnime searchEpisodesAnime = searchEpsResp.animes.first;
234236
if (searchEpisodesAnime.episodes.isEmpty) return;
235237
SearchEpisodeDetails searchEpisodeDetails =
236238
searchEpisodesAnime.episodes.first;
237239
targetEpisodeId = searchEpisodeDetails.episodeId;
238240
}
239241

240-
CommentEpisodeIdResponse? commentEpIdResp = await DandanplayCommentApi()
241-
.commentEpisodeId(targetEpisodeId, 1);
242+
CommentEpisodeIdResponse? commentEpIdResp =
243+
await DandanplayCommentApi().commentEpisodeId(targetEpisodeId, 1);
242244
if (commentEpIdResp == null || commentEpIdResp.count == 0) return;
243245
_commentEpisodes.addAll(commentEpIdResp.comments);
244246

@@ -367,12 +369,16 @@ class DesktopVideoPlayerState extends State<DesktopVideoPlayer>
367369
final exStyle = GetWindowLongPtr(hWnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE);
368370

369371
// 隐藏标题栏和任务栏
370-
SetWindowLongPtr(hWnd, WINDOW_LONG_PTR_INDEX.GWL_STYLE, style & ~WINDOW_STYLE.WS_OVERLAPPEDWINDOW);
371-
SetWindowLongPtr(hWnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE, exStyle | WINDOW_EX_STYLE.WS_EX_TOPMOST);
372+
SetWindowLongPtr(hWnd, WINDOW_LONG_PTR_INDEX.GWL_STYLE,
373+
style & ~WINDOW_STYLE.WS_OVERLAPPEDWINDOW);
374+
SetWindowLongPtr(hWnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE,
375+
exStyle | WINDOW_EX_STYLE.WS_EX_TOPMOST);
372376

373377
// 获取屏幕尺寸
374-
final screenWidth = GetSystemMetrics(SYSTEM_METRICS_INDEX.SM_CXSCREEN); // 屏幕宽度
375-
final screenHeight = GetSystemMetrics(SYSTEM_METRICS_INDEX.SM_CYSCREEN); // 屏幕高度
378+
final screenWidth =
379+
GetSystemMetrics(SYSTEM_METRICS_INDEX.SM_CXSCREEN); // 屏幕宽度
380+
final screenHeight =
381+
GetSystemMetrics(SYSTEM_METRICS_INDEX.SM_CYSCREEN); // 屏幕高度
376382

377383
// 计算窗口右下角的位置
378384
final x = screenWidth - smallWindowDevicePixelWidth;
@@ -392,7 +398,8 @@ class DesktopVideoPlayerState extends State<DesktopVideoPlayer>
392398
// 指定的窗口宽度
393399
smallWindowDevicePixelHeight,
394400
// 指定的窗口高度
395-
SET_WINDOW_POS_FLAGS.SWP_NOACTIVATE | SET_WINDOW_POS_FLAGS.SWP_SHOWWINDOW, // 不激活窗口,显示窗口
401+
SET_WINDOW_POS_FLAGS.SWP_NOACTIVATE |
402+
SET_WINDOW_POS_FLAGS.SWP_SHOWWINDOW, // 不激活窗口,显示窗口
396403
);
397404
}
398405

@@ -420,8 +427,10 @@ class DesktopVideoPlayerState extends State<DesktopVideoPlayer>
420427
final exStyle = GetWindowLongPtr(hWnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE);
421428

422429
// 隐藏标题栏和任务栏
423-
SetWindowLongPtr(hWnd, WINDOW_LONG_PTR_INDEX.GWL_STYLE, style & ~WINDOW_STYLE.WS_OVERLAPPEDWINDOW);
424-
SetWindowLongPtr(hWnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE, exStyle | WINDOW_EX_STYLE.WS_EX_TOPMOST);
430+
SetWindowLongPtr(hWnd, WINDOW_LONG_PTR_INDEX.GWL_STYLE,
431+
style & ~WINDOW_STYLE.WS_OVERLAPPEDWINDOW);
432+
SetWindowLongPtr(hWnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE,
433+
exStyle | WINDOW_EX_STYLE.WS_EX_TOPMOST);
425434

426435
// 设置窗口位置和大小,覆盖整个屏幕
427436
SetWindowPos(
@@ -443,8 +452,10 @@ class DesktopVideoPlayerState extends State<DesktopVideoPlayer>
443452
final exStyle = GetWindowLongPtr(hWnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE);
444453

445454
// 还原标题栏和任务栏
446-
SetWindowLongPtr(hWnd, WINDOW_LONG_PTR_INDEX.GWL_STYLE, style | WINDOW_STYLE.WS_OVERLAPPEDWINDOW);
447-
SetWindowLongPtr(hWnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE, exStyle & ~WINDOW_EX_STYLE.WS_EX_TOPMOST);
455+
SetWindowLongPtr(hWnd, WINDOW_LONG_PTR_INDEX.GWL_STYLE,
456+
style | WINDOW_STYLE.WS_OVERLAPPEDWINDOW);
457+
SetWindowLongPtr(hWnd, WINDOW_LONG_PTR_INDEX.GWL_EXSTYLE,
458+
exStyle & ~WINDOW_EX_STYLE.WS_EX_TOPMOST);
448459

449460
// 还原窗口位置和大小
450461
SetWindowPos(
@@ -566,7 +577,8 @@ class DesktopVideoPlayerState extends State<DesktopVideoPlayer>
566577
if (!Platform.isWindows) return;
567578
final ptr = calloc<Pointer<Utf16>>();
568579
final guid = calloc<GUID>()..ref.setGUID(FOLDERID_Pictures);
569-
final hr = SHGetKnownFolderPath(guid, KNOWN_FOLDER_FLAG.KF_FLAG_DEFAULT, NULL, ptr);
580+
final hr = SHGetKnownFolderPath(
581+
guid, KNOWN_FOLDER_FLAG.KF_FLAG_DEFAULT, NULL, ptr);
570582

571583
String path;
572584
if (hr == S_OK) {
@@ -777,7 +789,9 @@ class DesktopVideoPlayerState extends State<DesktopVideoPlayer>
777789
offsetY.toInt() + smallWindowDevicePixelHeight,
778790
smallWindowDevicePixelWidth,
779791
smallWindowDevicePixelHeight,
780-
SET_WINDOW_POS_FLAGS.SWP_NOZORDER | SET_WINDOW_POS_FLAGS.SWP_NOSIZE | SET_WINDOW_POS_FLAGS.SWP_NOREDRAW);
792+
SET_WINDOW_POS_FLAGS.SWP_NOZORDER |
793+
SET_WINDOW_POS_FLAGS.SWP_NOSIZE |
794+
SET_WINDOW_POS_FLAGS.SWP_NOREDRAW);
781795
},
782796
onTap: () {
783797
if (_player.playback.isPlaying) {

lib/player/player_video_mobile.dart

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import 'package:ikaros/api/collection/EpisodeCollectionApi.dart';
99
import 'package:ikaros/api/dandanplay/DandanplayBangumiApi.dart';
1010
import 'package:ikaros/api/dandanplay/DandanplayCommentApi.dart';
1111
import 'package:ikaros/api/dandanplay/DandanplaySearchApi.dart';
12+
import 'package:ikaros/api/dandanplay/model/BangumiEpisode.dart';
1213
import 'package:ikaros/api/dandanplay/model/CommentEpisode.dart';
1314
import 'package:ikaros/api/dandanplay/model/CommentEpisodeIdResponse.dart';
1415
import 'package:ikaros/api/dandanplay/model/IkarosDanmukuBangumiResponse.dart';
@@ -301,31 +302,33 @@ class MobileVideoPlayerState extends State<MobileVideoPlayer>
301302
return; // 自己新建的无三方同步平台ID关联的条目是不会请求弹幕的
302303
}
303304
var targetEpisodeId = -1;
304-
if (_syncs.isNotEmpty && _syncs.first.platform == SubjectSyncPlatform.BGM_TV) {
305+
if (_syncs.isNotEmpty &&
306+
_syncs.first.platform == SubjectSyncPlatform.BGM_TV) {
305307
var bgmtvSubjectId = _syncs.first.platformId;
306308

307309
IkarosDanmukuBangumiResponse? bangumiRsp = await DandanplayBangumiApi()
308310
.getBangumiDetailsByBgmtvSubjectId(bgmtvSubjectId);
309-
if (bangumiRsp != null) {
310-
targetEpisodeId =
311-
bangumiRsp.data.episodes.where((ep)=> ep.episodeNumber == _episode.sequence.toString())
312-
.first.episodeId;
311+
if (bangumiRsp != null && bangumiRsp.data.episodes.isNotEmpty) {
312+
BangumiEpisode? targetEpisode = bangumiRsp.data.episodes
313+
.where((ep) =>
314+
ep.episodeNumber == _episode.sequence.toInt().toString())
315+
.firstOrNull;
316+
targetEpisodeId = targetEpisode?.episodeId ?? -1;
313317
}
314318
}
315319
if (targetEpisodeId == -1) {
316320
IkarosDanmukuEpisodesResponse? searchEpsResp = await DandanplaySearchApi()
317321
.searchEpisodes(_subject!.name, _episode.sequence.toInt().toString());
318-
if (searchEpsResp == null ||
319-
searchEpsResp.animes.isEmpty) return;
322+
if (searchEpsResp == null || searchEpsResp.animes.isEmpty) return;
320323
SearchEpisodesAnime searchEpisodesAnime = searchEpsResp.animes.first;
321324
if (searchEpisodesAnime.episodes.isEmpty) return;
322325
SearchEpisodeDetails searchEpisodeDetails =
323326
searchEpisodesAnime.episodes.first;
324327
targetEpisodeId = searchEpisodeDetails.episodeId;
325328
}
326329

327-
CommentEpisodeIdResponse? commentEpIdResp = await DandanplayCommentApi()
328-
.commentEpisodeId(targetEpisodeId, 1);
330+
CommentEpisodeIdResponse? commentEpIdResp =
331+
await DandanplayCommentApi().commentEpisodeId(targetEpisodeId, 1);
329332
if (commentEpIdResp == null || commentEpIdResp.count == 0) return;
330333
_commentEpisodes.addAll(commentEpIdResp.comments);
331334
widget.onDanmukuPoolInitialed?.call(_commentEpisodes.length);

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name: ikaros
22
description: ikaros app by flutter
3-
version: 1.5.0
3+
version: 1.5.1
44

55
environment:
66
sdk: '>=2.18.4 <=3.10.5'

0 commit comments

Comments
 (0)