From 08944241bba629ae5a9c44393692260581692534 Mon Sep 17 00:00:00 2001 From: My-Responsitories <107370289+My-Responsitories@users.noreply.github.com> Date: Sat, 25 Oct 2025 14:41:47 +0800 Subject: [PATCH] fix: danmaku (#1696) * fix: post danmaku * mod: tap danmaku * mod: delete danmaku --- lib/http/danmaku.dart | 24 +++++----------- lib/models_new/danmaku/post.dart | 31 +++++++++++++++++++++ lib/pages/video/send_danmaku/view.dart | 7 +++-- lib/pages/video/widgets/header_control.dart | 2 +- lib/plugin/pl_player/view.dart | 11 +++++--- 5 files changed, 50 insertions(+), 25 deletions(-) create mode 100644 lib/models_new/danmaku/post.dart diff --git a/lib/http/danmaku.dart b/lib/http/danmaku.dart index 107706ba..bf18d649 100644 --- a/lib/http/danmaku.dart +++ b/lib/http/danmaku.dart @@ -1,11 +1,12 @@ import 'package:PiliPlus/http/api.dart'; import 'package:PiliPlus/http/init.dart'; import 'package:PiliPlus/http/loading_state.dart'; +import 'package:PiliPlus/models_new/danmaku/post.dart'; import 'package:PiliPlus/utils/accounts.dart'; import 'package:dio/dio.dart'; abstract final class DanmakuHttp { - static Future shootDanmaku({ + static Future> shootDanmaku({ int type = 1, //弹幕类选择(1:视频弹幕 2:漫画弹幕) required int oid, // 视频cid required String msg, //弹幕文本(长度小于 100 字符) @@ -46,27 +47,16 @@ abstract final class DanmakuHttp { // 'access_key': access_key, }; - var response = await Request().post( + final res = await Request().post( Api.shootDanmaku, data: data, options: Options(contentType: Headers.formUrlEncodedContentType), ); - if (response.statusCode != 200) { - return { - 'status': false, - 'msg': '弹幕发送失败,状态码:${response.statusCode}', - }; - } - if (response.data['code'] == 0) { - return { - 'status': true, - 'data': response.data['data'], - }; + + if (res.data['code'] == 0) { + return Success(DanmakuPost.fromJson(res.data['data'])); } else { - return { - 'status': false, - 'msg': "${response.data['code']}: ${response.data['message']}", - }; + return Error(res.data['message'], code: res.data['code']); } } diff --git a/lib/models_new/danmaku/post.dart b/lib/models_new/danmaku/post.dart new file mode 100644 index 00000000..678934aa --- /dev/null +++ b/lib/models_new/danmaku/post.dart @@ -0,0 +1,31 @@ +class DanmakuPost { + DanmakuPost({ + required this.action, + required this.animation, + required this.colorfulSrc, + required this.dmContent, + required this.dmid, + required this.dmidStr, + required this.visible, + }); + + final String? action; + final String? animation; + final dynamic colorfulSrc; + final String? dmContent; + final int? dmid; + final String? dmidStr; + final bool? visible; + + factory DanmakuPost.fromJson(Map json) { + return DanmakuPost( + action: json["action"], + animation: json["animation"], + colorfulSrc: json["colorful_src"], + dmContent: json["dm_content"], + dmid: json["dmid"], + dmidStr: json["dmid_str"], + visible: json["visible"], + ); + } +} diff --git a/lib/pages/video/send_danmaku/view.dart b/lib/pages/video/send_danmaku/view.dart index 85b0925d..db48b858 100644 --- a/lib/pages/video/send_danmaku/view.dart +++ b/lib/pages/video/send_danmaku/view.dart @@ -3,6 +3,7 @@ import 'dart:async'; import 'package:PiliPlus/common/widgets/button/icon_button.dart'; import 'package:PiliPlus/common/widgets/view_safe_area.dart'; import 'package:PiliPlus/http/danmaku.dart'; +import 'package:PiliPlus/http/loading_state.dart'; import 'package:PiliPlus/main.dart'; import 'package:PiliPlus/models/common/publish_panel_type.dart'; import 'package:PiliPlus/pages/common/publish/common_text_pub_page.dart'; @@ -454,12 +455,12 @@ class _SendDanmakuPanelState extends CommonTextPubPageState { colorful: isColorful, ); SmartDialog.dismiss(); - if (res['status']) { + if (res case Success(:final response)) { hasPub = true; Get.back(); SmartDialog.showToast('发送成功'); VideoDanmaku? extra; - if (res['dmid'] case int dmid) { + if (response.dmid case final dmid?) { extra = VideoDanmaku( id: dmid, mid: PlPlayerController.instance!.midHash, @@ -480,7 +481,7 @@ class _SendDanmakuPanelState extends CommonTextPubPageState { ), ); } else { - SmartDialog.showToast('发送失败: ${res['msg']}'); + res.toast(); } } } diff --git a/lib/pages/video/widgets/header_control.dart b/lib/pages/video/widgets/header_control.dart index ac9c6e6d..0d87505e 100644 --- a/lib/pages/video/widgets/header_control.dart +++ b/lib/pages/video/widgets/header_control.dart @@ -2102,7 +2102,7 @@ class HeaderControlState extends State { onPressed: () => HeaderControl.deleteDanmaku( extra.id, plPlayerController.cid!, - ), + ).then((_) => item.expired = true), icon: const Icon(CustomIcons.player_dm_tip_recall), ) else diff --git a/lib/plugin/pl_player/view.dart b/lib/plugin/pl_player/view.dart index 94b117e4..80f4ff56 100644 --- a/lib/plugin/pl_player/view.dart +++ b/lib/plugin/pl_player/view.dart @@ -1140,8 +1140,10 @@ class _PLVideoPlayerState extends State default: if (_suspendedDm == null) { plPlayerController.controls = !plPlayerController.showControls.value; - } else { + } else if (_suspendedDm!.suspend) { _dmOffset.value = details.localPosition; + } else { + _suspendedDm = null; } break; } @@ -1153,13 +1155,14 @@ class _PLVideoPlayerState extends State final pos = details.localPosition; final item = ctr.findSingleDanmaku(pos); if (item == null) { - _removeDmAction(); + _suspendedDm?.suspend = false; + _dmOffset.value = null; } else if (item != _suspendedDm) { + _suspendedDm?.suspend = false; if (item.content.extra == null) { - _removeDmAction(); + _dmOffset.value = null; return; } - _suspendedDm?.suspend = false; _suspendedDm = item..suspend = true; } }