* opt: live extra

* opt: remove addPointer

* opt: use ssd

* opt: cache svg

* opt: localToGlobal

* opt: disabled icon

* opt: onVideoDetailChange switch

* fix

---------

Co-authored-by: dom <githubaccount56556@proton.me>
This commit is contained in:
My-Responsitories
2026-02-25 18:01:43 +08:00
committed by GitHub
parent 4a3d827f7a
commit e707764f84
19 changed files with 159 additions and 238 deletions

View File

@@ -3,18 +3,16 @@ import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
class DisabledIcon<T extends Widget> extends SingleChildRenderObjectWidget {
class DisabledIcon extends SingleChildRenderObjectWidget {
const DisabledIcon({
super.key,
required T child,
required Widget super.child,
this.disable = false,
this.color,
this.iconSize,
double? lineLengthScale,
StrokeCap? strokeCap,
}) : lineLengthScale = lineLengthScale ?? 0.9,
strokeCap = strokeCap ?? StrokeCap.butt,
super(child: child);
this.lineLengthScale = 0.9,
this.strokeCap = .butt,
});
final bool disable;
final Color? color;
@@ -48,12 +46,12 @@ class DisabledIcon<T extends Widget> extends SingleChildRenderObjectWidget {
..disable = disable
..iconSize =
iconSize ??
(child is Icon ? (child as Icon?)?.size : null) ??
(child is Icon ? (child as Icon).size : null) ??
iconTheme.size ??
24.0
..color =
color ??
(child is Icon ? (child as Icon?)?.color : null) ??
(child is Icon ? (child as Icon).color : null) ??
iconTheme.color!
..strokeCap = strokeCap
..lineLengthScale = lineLengthScale;

View File

@@ -1,8 +1,19 @@
import 'package:PiliPlus/common/widgets/gesture/horizontal_drag_gesture_recognizer.dart';
import 'package:PiliPlus/common/widgets/gesture/image_tap_gesture_recognizer.dart'
show ImageGestureRecognizerMixin;
import 'package:flutter/gestures.dart';
mixin ImageGestureRecognizerMixin on GestureRecognizer {
int? _pointer;
@override
void addPointer(PointerDownEvent event) {
if (_pointer == event.pointer) {
return;
}
_pointer = event.pointer;
super.addPointer(event);
}
}
typedef IsBoundaryAllowed =
bool Function(Offset? initialPosition, OffsetPair lastPosition);

View File

@@ -1,39 +0,0 @@
import 'package:flutter/gestures.dart'
show
GestureRecognizer,
TapGestureRecognizer,
DoubleTapGestureRecognizer,
PointerDownEvent;
mixin ImageGestureRecognizerMixin on GestureRecognizer {
int? _pointer;
@override
void addPointer(PointerDownEvent event) {
if (_pointer == event.pointer) {
return;
}
_pointer = event.pointer;
super.addPointer(event);
}
}
class ImageTapGestureRecognizer extends TapGestureRecognizer
with ImageGestureRecognizerMixin {
ImageTapGestureRecognizer({
super.debugOwner,
super.supportedDevices,
super.allowedButtonsFilter,
super.preAcceptSlopTolerance,
super.postAcceptSlopTolerance,
});
}
class ImageDoubleTapGestureRecognizer extends DoubleTapGestureRecognizer
with ImageGestureRecognizerMixin {
ImageDoubleTapGestureRecognizer({
super.debugOwner,
super.supportedDevices,
super.allowedButtonsFilter,
});
}

View File

@@ -67,31 +67,6 @@ class CachedNetworkSVGImage extends StatefulWidget {
@override
State<CachedNetworkSVGImage> createState() => _CachedNetworkSVGImageState();
static Future<void> preCache(
String imageUrl, {
String? cacheKey,
BaseCacheManager? cacheManager,
}) {
final key = cacheKey ?? _generateKeyFromUrl(imageUrl);
cacheManager ??= DefaultCacheManager();
return cacheManager.downloadFile(key);
}
static Future<void> clearCacheForUrl(
String imageUrl, {
String? cacheKey,
BaseCacheManager? cacheManager,
}) {
final key = cacheKey ?? _generateKeyFromUrl(imageUrl);
cacheManager ??= DefaultCacheManager();
return cacheManager.removeFile(key);
}
static Future<void> clearCache({BaseCacheManager? cacheManager}) {
cacheManager ??= DefaultCacheManager();
return cacheManager.emptyCache();
}
static String _generateKeyFromUrl(String url) => url.split('?').first;
}

View File

@@ -20,7 +20,6 @@ import 'dart:io' show File, Platform;
import 'package:PiliPlus/common/widgets/colored_box_transition.dart';
import 'package:PiliPlus/common/widgets/flutter/page/page_view.dart';
import 'package:PiliPlus/common/widgets/gesture/image_horizontal_drag_gesture_recognizer.dart';
import 'package:PiliPlus/common/widgets/gesture/image_tap_gesture_recognizer.dart';
import 'package:PiliPlus/common/widgets/image_viewer/image.dart';
import 'package:PiliPlus/common/widgets/image_viewer/loading_indicator.dart';
import 'package:PiliPlus/common/widgets/image_viewer/viewer.dart';
@@ -81,8 +80,8 @@ class _GalleryViewerState extends State<GalleryViewer>
late final PageController _pageController;
late final ImageTapGestureRecognizer _tapGestureRecognizer;
late final ImageDoubleTapGestureRecognizer _doubleTapGestureRecognizer;
late final TapGestureRecognizer _tapGestureRecognizer;
late final DoubleTapGestureRecognizer _doubleTapGestureRecognizer;
late final ImageHorizontalDragGestureRecognizer
_horizontalDragGestureRecognizer;
late final LongPressGestureRecognizer _longPressGestureRecognizer;
@@ -116,13 +115,13 @@ class _GalleryViewerState extends State<GalleryViewer>
_pageController = PageController(initialPage: widget.initIndex);
final gestureSettings = MediaQuery.maybeGestureSettingsOf(Get.context!);
_tapGestureRecognizer = ImageTapGestureRecognizer()
_tapGestureRecognizer = TapGestureRecognizer()
// ..onTap = _onTap
..gestureSettings = gestureSettings;
if (PlatformUtils.isDesktop) {
_tapGestureRecognizer.onSecondaryTapUp = _showDesktopMenu;
}
_doubleTapGestureRecognizer = ImageDoubleTapGestureRecognizer()
_doubleTapGestureRecognizer = DoubleTapGestureRecognizer()
..onDoubleTap = () {}
..gestureSettings = gestureSettings;
_horizontalDragGestureRecognizer = ImageHorizontalDragGestureRecognizer();
@@ -360,7 +359,6 @@ class _GalleryViewerState extends State<GalleryViewer>
onDragStart: _onDragStart,
onDragUpdate: _onDragUpdate,
onDragEnd: _onDragEnd,
tapGestureRecognizer: _tapGestureRecognizer,
doubleTapGestureRecognizer: _doubleTapGestureRecognizer,
horizontalDragGestureRecognizer: _horizontalDragGestureRecognizer,
onChangePage: _onChangePage,
@@ -373,7 +371,6 @@ class _GalleryViewerState extends State<GalleryViewer>
minScale: widget.minScale,
maxScale: widget.maxScale,
containerSize: _containerSize,
tapGestureRecognizer: _tapGestureRecognizer,
doubleTapGestureRecognizer: _doubleTapGestureRecognizer,
horizontalDragGestureRecognizer: _horizontalDragGestureRecognizer,
onChangePage: _onChangePage,
@@ -395,7 +392,6 @@ class _GalleryViewerState extends State<GalleryViewer>
onDragStart: null,
onDragUpdate: null,
onDragEnd: null,
tapGestureRecognizer: _tapGestureRecognizer,
doubleTapGestureRecognizer: _doubleTapGestureRecognizer,
horizontalDragGestureRecognizer:
_horizontalDragGestureRecognizer,
@@ -434,7 +430,6 @@ class _GalleryViewerState extends State<GalleryViewer>
onDragStart: _onDragStart,
onDragUpdate: _onDragUpdate,
onDragEnd: _onDragEnd,
tapGestureRecognizer: _tapGestureRecognizer,
doubleTapGestureRecognizer: _doubleTapGestureRecognizer,
horizontalDragGestureRecognizer:
_horizontalDragGestureRecognizer,

View File

@@ -7,9 +7,9 @@ import 'dart:math' as math;
import 'package:PiliPlus/common/constants.dart';
import 'package:PiliPlus/common/widgets/gesture/image_horizontal_drag_gesture_recognizer.dart';
import 'package:PiliPlus/common/widgets/gesture/image_tap_gesture_recognizer.dart';
import 'package:PiliPlus/common/widgets/image_viewer/viewer.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/gestures.dart';
import 'package:flutter/material.dart';
import 'package:flutter/scheduler.dart';
import 'package:flutter/semantics.dart';
@@ -42,7 +42,6 @@ class Image extends StatefulWidget {
required this.onDragStart,
required this.onDragUpdate,
required this.onDragEnd,
required this.tapGestureRecognizer,
required this.doubleTapGestureRecognizer,
required this.horizontalDragGestureRecognizer,
required this.onChangePage,
@@ -81,7 +80,6 @@ class Image extends StatefulWidget {
required this.onDragStart,
required this.onDragUpdate,
required this.onDragEnd,
required this.tapGestureRecognizer,
required this.doubleTapGestureRecognizer,
required this.horizontalDragGestureRecognizer,
required this.onChangePage,
@@ -127,7 +125,6 @@ class Image extends StatefulWidget {
required this.onDragStart,
required this.onDragUpdate,
required this.onDragEnd,
required this.tapGestureRecognizer,
required this.doubleTapGestureRecognizer,
required this.horizontalDragGestureRecognizer,
required this.onChangePage,
@@ -176,7 +173,6 @@ class Image extends StatefulWidget {
required this.onDragStart,
required this.onDragUpdate,
required this.onDragEnd,
required this.tapGestureRecognizer,
required this.doubleTapGestureRecognizer,
required this.horizontalDragGestureRecognizer,
required this.onChangePage,
@@ -225,7 +221,6 @@ class Image extends StatefulWidget {
required this.onDragStart,
required this.onDragUpdate,
required this.onDragEnd,
required this.tapGestureRecognizer,
required this.doubleTapGestureRecognizer,
required this.horizontalDragGestureRecognizer,
required this.onChangePage,
@@ -285,8 +280,7 @@ class Image extends StatefulWidget {
final ValueChanged<ScaleEndDetails>? onDragEnd;
final ValueChanged<int>? onChangePage;
final ImageTapGestureRecognizer tapGestureRecognizer;
final ImageDoubleTapGestureRecognizer doubleTapGestureRecognizer;
final DoubleTapGestureRecognizer doubleTapGestureRecognizer;
final ImageHorizontalDragGestureRecognizer horizontalDragGestureRecognizer;
@override
@@ -630,7 +624,6 @@ class _ImageState extends State<Image> with WidgetsBindingObserver {
onDragStart: widget.onDragStart,
onDragUpdate: widget.onDragUpdate,
onDragEnd: widget.onDragEnd,
tapGestureRecognizer: widget.tapGestureRecognizer,
doubleTapGestureRecognizer: widget.doubleTapGestureRecognizer,
horizontalDragGestureRecognizer: widget.horizontalDragGestureRecognizer,
onChangePage: widget.onChangePage,

View File

@@ -20,7 +20,6 @@ import 'dart:math' as math;
import 'package:PiliPlus/common/widgets/gesture/horizontal_drag_gesture_recognizer.dart'
show touchSlopH;
import 'package:PiliPlus/common/widgets/gesture/image_horizontal_drag_gesture_recognizer.dart';
import 'package:PiliPlus/common/widgets/gesture/image_tap_gesture_recognizer.dart';
import 'package:PiliPlus/utils/extension/num_ext.dart';
import 'package:easy_debounce/easy_throttle.dart';
import 'package:flutter/foundation.dart';
@@ -44,7 +43,6 @@ class Viewer extends StatefulWidget {
required this.onDragStart,
required this.onDragUpdate,
required this.onDragEnd,
required this.tapGestureRecognizer,
required this.doubleTapGestureRecognizer,
required this.horizontalDragGestureRecognizer,
required this.onChangePage,
@@ -63,8 +61,7 @@ class Viewer extends StatefulWidget {
final ValueChanged<ScaleEndDetails>? onDragEnd;
final ValueChanged<int>? onChangePage;
final ImageTapGestureRecognizer tapGestureRecognizer;
final ImageDoubleTapGestureRecognizer doubleTapGestureRecognizer;
final DoubleTapGestureRecognizer doubleTapGestureRecognizer;
final ImageHorizontalDragGestureRecognizer horizontalDragGestureRecognizer;
@override
@@ -101,8 +98,7 @@ class _ViewerState extends State<Viewer> with SingleTickerProviderStateMixin {
late Size _imageSize;
late final ImageTapGestureRecognizer _tapGestureRecognizer;
late final ImageDoubleTapGestureRecognizer _doubleTapGestureRecognizer;
late final DoubleTapGestureRecognizer _doubleTapGestureRecognizer;
late final ImageHorizontalDragGestureRecognizer
_horizontalDragGestureRecognizer;
late final ScaleGestureRecognizer _scaleGestureRecognizer;
@@ -153,7 +149,6 @@ class _ViewerState extends State<Viewer> with SingleTickerProviderStateMixin {
duration: const Duration(milliseconds: 300),
)..addListener(_listener);
_tapGestureRecognizer = widget.tapGestureRecognizer;
_doubleTapGestureRecognizer = widget.doubleTapGestureRecognizer;
_horizontalDragGestureRecognizer = widget.horizontalDragGestureRecognizer;
@@ -419,11 +414,9 @@ class _ViewerState extends State<Viewer> with SingleTickerProviderStateMixin {
void _onPointerDown(PointerDownEvent event) {
_scalePos = event.position;
_tapGestureRecognizer.addPointer(event);
_doubleTapGestureRecognizer
..onDoubleTapDown = _onDoubleTapDown
..onDoubleTap = _onDoubleTap
..addPointer(event);
..onDoubleTap = _onDoubleTap;
_horizontalDragGestureRecognizer
..isBoundaryAllowed = _isBoundaryAllowed
..addPointer(event);

View File

@@ -4,26 +4,23 @@ import 'package:PiliPlus/pages/danmaku/danmaku_model.dart';
class DanmakuMsg {
final String name;
final Object uid;
final String text;
final Map<String, BaseEmote>? emots;
final BaseEmote? uemote;
final LiveDanmaku extra;
final Owner? reply;
final LiveDanmaku extra;
const DanmakuMsg({
required this.name,
required this.uid,
required this.text,
this.emots,
this.uemote,
required this.extra,
this.reply,
required this.extra,
});
factory DanmakuMsg.fromPrefetch(Map<String, dynamic> obj) {
final user = obj['user'];
final uid = user['uid'];
BaseEmote? uemote;
if ((obj['emoticon']?['emoticon_unique'] as String?)?.isNotEmpty == true) {
uemote = BaseEmote.fromJson(obj['emoticon']);
@@ -41,30 +38,28 @@ class DanmakuMsg {
}
return DanmakuMsg(
name: user['base']['name'],
uid: uid,
text: obj['text'],
emots: (obj['emots'] as Map<String, dynamic>?)?.map(
(k, v) => MapEntry(k, BaseEmote.fromJson(v)),
),
uemote: uemote,
reply: reply,
extra: LiveDanmaku(
id: obj['id_str'],
mid: uid,
mid: user['uid'],
dmType: obj['dm_type'],
ts: checkInfo['ts'],
ct: checkInfo['ct'],
),
reply: reply,
);
}
Map<String, dynamic> toJson() => <String, dynamic>{
'name': name,
'uid': uid,
'text': text,
'emots': emots,
'uemote': uemote?.toJson(),
'emots': ?emots,
'uemote': ?uemote?.toJson(),
'reply': ?reply?.toJson(),
'extra': extra.toJson(),
'reply': reply?.toJson(),
};
}

View File

@@ -182,12 +182,12 @@ class LiveRoomController extends GetxController {
void onInit() {
super.onInit();
scrollController = ScrollController()..addListener(listener);
final account = Accounts.heartbeat;
final account = Accounts.main;
isLogin = account.isLogin;
mid = account.mid;
queryLiveUrl();
queryLiveInfoH5();
if (isLogin && !Pref.historyPause) {
if (Accounts.heartbeat.isLogin && !Pref.historyPause) {
VideoHttp.roomEntryAction(roomId: roomId);
}
if (showSuperChat) {
@@ -428,7 +428,7 @@ class LiveRoomController extends GetxController {
LiveMessageStream(
streamToken: info.token!,
roomId: roomId,
uid: mid,
uid: Accounts.heartbeat.mid,
servers: info.hostList!
.map((host) => 'wss://${host.host}:${host.wssPort}/sub')
.toList(),
@@ -488,7 +488,6 @@ class LiveRoomController extends GetxController {
addDm(
DanmakuMsg(
name: name,
uid: uid,
text: msg,
emots: (extra['emots'] as Map<String, dynamic>?)?.map(
(k, v) => MapEntry(k, BaseEmote.fromJson(v)),
@@ -574,7 +573,7 @@ class LiveRoomController extends GetxController {
}
Future<void> onLike() async {
if (!Accounts.main.isLogin) {
if (!isLogin) {
likeClickTime.value = 0;
return;
}
@@ -593,7 +592,7 @@ class LiveRoomController extends GetxController {
}
void onSendDanmaku([bool fromEmote = false]) {
if (!Accounts.main.isLogin) {
if (!isLogin) {
SmartDialog.showToast('账号未登录');
return;
}
@@ -623,7 +622,7 @@ class LiveRoomController extends GetxController {
}
void reportSC(SuperChatItem item) {
if (!Accounts.main.isLogin) {
if (!isLogin) {
SmartDialog.showToast('账号未登录');
return;
}

View File

@@ -714,7 +714,7 @@ class _LiveRoomPageState extends State<LiveRoomPage>
..savedDanmaku = [
RichTextItem.fromStart(
'@${item.name} ',
rawText: item.uid.toString(),
rawText: item.extra.mid.toString(),
type: .at,
id: item.extra.id.toString(),
),

View File

@@ -8,7 +8,6 @@ import 'package:PiliPlus/models_new/live/live_superchat/item.dart';
import 'package:PiliPlus/pages/live_room/controller.dart';
import 'package:PiliPlus/pages/live_room/superchat/superchat_card.dart';
import 'package:PiliPlus/pages/video/widgets/header_control.dart';
import 'package:PiliPlus/utils/accounts.dart';
import 'package:PiliPlus/utils/extension/theme_ext.dart';
import 'package:PiliPlus/utils/utils.dart';
import 'package:flutter/foundation.dart' show kDebugMode;
@@ -82,7 +81,7 @@ class LiveRoomChatPanel extends StatelessWidget {
color: nameColor,
fontSize: 14,
),
recognizer: item.uid == 0
recognizer: item.extra.mid == 0
? null
: (NoDeadlineTapGestureRecognizer()
..onTapUp = (e) => _showMsgMenu(
@@ -292,7 +291,11 @@ class LiveRoomChatPanel extends StatelessWidget {
) {
final dx = details.globalPosition.dx;
final renderBox = itemContext.findRenderObject() as RenderBox;
final dy = renderBox.localToGlobal(renderBox.size.bottomLeft(.zero)).dy;
final dy =
details.globalPosition.dy -
details.localPosition.dy +
renderBox.size.height -
4; // padding
final autoScroll =
liveRoomController.autoScroll &&
!liveRoomController.disableAutoScroll.value;
@@ -321,7 +324,7 @@ class LiveRoomChatPanel extends StatelessWidget {
),
PopupMenuItem(
height: 38,
onTap: () => Get.toNamed('/member?mid=${item.uid}'),
onTap: () => Get.toNamed('/member?mid=${item.extra.mid}'),
child: const Text(
'去TA的个人空间',
style: TextStyle(fontSize: 13),
@@ -338,9 +341,9 @@ class LiveRoomChatPanel extends StatelessWidget {
PopupMenuItem(
height: 38,
onTap: () async {
if (!Accounts.main.isLogin) return;
if (!liveRoomController.isLogin) return;
final res = await LiveHttp.liveShieldUser(
uid: item.uid,
uid: item.extra.mid,
roomid: roomId,
type: 1,
);

View File

@@ -25,9 +25,11 @@ import 'package:PiliPlus/pages/setting/widgets/multi_select_dialog.dart';
import 'package:PiliPlus/pages/setting/widgets/select_dialog.dart';
import 'package:PiliPlus/pages/setting/widgets/slider_dialog.dart';
import 'package:PiliPlus/plugin/pl_player/utils/fullscreen.dart';
import 'package:PiliPlus/utils/extension/file_ext.dart';
import 'package:PiliPlus/utils/extension/num_ext.dart';
import 'package:PiliPlus/utils/extension/theme_ext.dart';
import 'package:PiliPlus/utils/global_data.dart';
import 'package:PiliPlus/utils/path_utils.dart';
import 'package:PiliPlus/utils/platform_utils.dart';
import 'package:PiliPlus/utils/storage.dart';
import 'package:PiliPlus/utils/storage_key.dart';
@@ -38,6 +40,7 @@ import 'package:flutter/services.dart';
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
import 'package:get/get.dart';
import 'package:material_design_icons_flutter/material_design_icons_flutter.dart';
import 'package:path/path.dart' as path;
List<SettingsModel> get styleSettings => [
if (PlatformUtils.isDesktop) ...[
@@ -56,16 +59,7 @@ List<SettingsModel> get styleSettings => [
needReboot: true,
),
],
if (Platform.isLinux)
const SwitchModel(
title: '使用SSDServer-Side Decoration',
subtitle: 'Linux强制使用Server-Side Decoration',
leading: Icon(Icons.web_asset),
setKey: SettingBoxKey.useSSD,
defaultVal: false,
needReboot: true,
onChanged: GStorage.syncToDisk,
),
if (Platform.isLinux) _useSSDModel(),
SwitchModel(
title: '横屏适配',
subtitle: '启用横屏布局与逻辑,平板、折叠屏等可开启;建议全屏方向设为【不改变当前方向】',
@@ -920,3 +914,31 @@ Future<void> _showBarHideTypeDialog(
setState();
}
}
NormalModel _useSSDModel() {
final file = File(path.join(appSupportDirPath, 'use_ssd'));
void onChanged(BuildContext context, VoidCallback setState) {
(file.existsSync() ? file.tryDel() : file.create()).whenComplete(() {
if (context.mounted) {
setState();
}
});
}
return NormalModel(
title: '使用SSDServer-Side Decoration',
leading: const Icon(Icons.web_asset),
onTap: onChanged,
getTrailing: (theme) => Builder(
builder: (context) => Transform.scale(
scale: 0.8,
alignment: .centerRight,
child: Switch(
value: file.existsSync(),
onChanged: (_) =>
onChanged(context, (context as Element).markNeedsBuild),
),
),
),
);
}

View File

@@ -45,19 +45,19 @@ class _PopupListTileState<T> extends State<PopupListTile<T>> {
final _key = PlatformUtils.isDesktop ? null : GlobalKey();
void _showButtonMenu(TapUpDetails details, T value) {
final box = context.findRenderObject() as RenderBox;
final offset = box.localToGlobal(box.size.topLeft(.zero));
final thisOffset = details.globalPosition - details.localPosition;
final double dx;
if (PlatformUtils.isDesktop) {
dx = details.globalPosition.dx + 1;
} else {
final box = _key!.currentContext!.findRenderObject() as RenderBox;
final offset = box.localToGlobal(box.size.topLeft(.zero));
dx = offset.dx;
final thisBox = context.findRenderObject() as RenderBox;
final titleBox = _key!.currentContext!.findRenderObject() as RenderBox;
final titleOffset = titleBox.localToGlobal(.zero, ancestor: thisBox);
dx = thisOffset.dx + titleOffset.dx;
}
showMenu<T?>(
context: context,
position: RelativeRect.fromLTRB(dx, offset.dy + 5, dx, 0),
position: RelativeRect.fromLTRB(dx, thisOffset.dy + 5, dx, 0),
items: widget.itemBuilder(context),
initialValue: value,
requestFocus: false,

View File

@@ -467,6 +467,7 @@ class _PLVideoPlayerState extends State<PLVideoPlayer>
tooltip: '分段信息',
icon: DisabledIcon(
iconSize: 22,
color: Colors.white,
disable: !show,
child: Transform.rotate(
angle: math.pi / 2,

View File

@@ -147,76 +147,78 @@ class VideoPlayerServiceHandler extends BaseAudioHandler with SeekHandler {
Uri getUri(String? cover) => Uri.parse(ImageUtils.safeThumbnailUrl(cover));
late final id = '$cid$herotag';
MediaItem? mediaItem;
if (data is VideoDetailData) {
if ((data.pages?.length ?? 0) > 1) {
final current = data.pages?.firstWhereOrNull(
(element) => element.cid == cid,
);
final MediaItem mediaItem;
switch (data) {
case VideoDetailData(:final pages):
if (pages != null && pages.length > 1) {
final current = pages.firstWhereOrNull((e) => e.cid == cid);
mediaItem = MediaItem(
id: id,
title: current?.part ?? '',
artist: data.owner?.name,
duration: Duration(seconds: current?.duration ?? 0),
artUri: getUri(data.pic),
);
} else {
mediaItem = MediaItem(
id: id,
title: data.title ?? '',
artist: data.owner?.name,
duration: Duration(seconds: data.duration ?? 0),
artUri: getUri(data.pic),
);
}
case EpisodeItem():
mediaItem = MediaItem(
id: id,
title: current?.part ?? '',
artist: data.owner?.name,
duration: Duration(seconds: current?.duration ?? 0),
artUri: getUri(data.pic),
title: data.showTitle ?? data.longTitle ?? data.title ?? '',
artist: artist,
duration: data.from == 'pugv'
? Duration(seconds: data.duration ?? 0)
: Duration(milliseconds: data.duration ?? 0),
artUri: getUri(data.cover),
);
} else {
case RoomInfoH5Data():
mediaItem = MediaItem(
id: id,
title: data.title ?? '',
artist: data.owner?.name,
title: data.roomInfo?.title ?? '',
artist: data.anchorInfo?.baseInfo?.uname,
artUri: getUri(data.roomInfo?.cover),
isLive: true,
);
case Part():
mediaItem = MediaItem(
id: id,
title: data.part ?? '',
artist: artist,
duration: Duration(seconds: data.duration ?? 0),
artUri: getUri(data.pic),
artUri: getUri(cover),
);
}
} else if (data is EpisodeItem) {
mediaItem = MediaItem(
id: id,
title: data.showTitle ?? data.longTitle ?? data.title ?? '',
artist: artist,
duration: data.from == 'pugv'
? Duration(seconds: data.duration ?? 0)
: Duration(milliseconds: data.duration ?? 0),
artUri: getUri(data.cover),
);
} else if (data is RoomInfoH5Data) {
mediaItem = MediaItem(
id: id,
title: data.roomInfo?.title ?? '',
artist: data.anchorInfo?.baseInfo?.uname,
artUri: getUri(data.roomInfo?.cover),
isLive: true,
);
} else if (data is Part) {
mediaItem = MediaItem(
id: id,
title: data.part ?? '',
artist: artist,
duration: Duration(seconds: data.duration ?? 0),
artUri: getUri(cover),
);
} else if (data is DetailItem) {
mediaItem = MediaItem(
id: id,
title: data.arc.title,
artist: data.owner.name,
duration: Duration(seconds: data.arc.duration.toInt()),
artUri: getUri(data.arc.cover),
);
} else if (data is BiliDownloadEntryInfo) {
final coverFile = File(path.join(data.entryDirPath, PathUtils.coverName));
final uri = coverFile.existsSync()
? coverFile.absolute.uri
: getUri(data.cover);
mediaItem = MediaItem(
id: id,
title: data.showTitle,
artist: data.ownerName,
duration: Duration(milliseconds: data.totalTimeMilli),
artUri: uri,
);
case DetailItem(:final arc):
mediaItem = MediaItem(
id: id,
title: arc.title,
artist: data.owner.name,
duration: Duration(seconds: arc.duration.toInt()),
artUri: getUri(arc.cover),
);
case BiliDownloadEntryInfo():
final coverFile = File(
path.join(data.entryDirPath, PathUtils.coverName),
);
final uri = coverFile.existsSync()
? coverFile.absolute.uri
: getUri(data.cover);
mediaItem = MediaItem(
id: id,
title: data.showTitle,
artist: data.ownerName,
duration: Duration(milliseconds: data.totalTimeMilli),
artUri: uri,
);
default:
return;
}
if (mediaItem == null) return;
// if (kDebugMode) debugPrint("exist: ${PlPlayerController.instanceExists()}");
if (!PlPlayerController.instanceExists()) return;
_item.add(mediaItem);

View File

@@ -1,5 +1,4 @@
import 'dart:convert';
import 'dart:io';
import 'package:PiliPlus/models/model_owner.dart';
import 'package:PiliPlus/models/user/danmaku_rule_adapter.dart';
@@ -62,11 +61,6 @@ abstract final class GStorage {
]);
}
static Future<File> syncToDisk([_]) {
final jsonPath = path.join(appSupportDirPath, 'settings.json');
return File(jsonPath).writeAsString(exportAllSettings());
}
static String exportAllSettings() {
return Utils.jsonEncoder.convert({
setting.name: setting.toMap(),

View File

@@ -157,8 +157,7 @@ abstract final class SettingBoxKey {
showWindowTitleBar = 'showWindowTitleBar',
desktopVolume = 'desktopVolume',
showTrayIcon = 'showTrayIcon',
uiScale = 'uiScale',
useSSD = 'useSSD';
uiScale = 'uiScale';
static const String subtitlePreferenceV2 = 'subtitlePreferenceV2',
enableDragSubtitle = 'enableDragSubtitle',

View File

@@ -914,9 +914,6 @@ abstract final class Pref {
static bool get showWindowTitleBar =>
_setting.get(SettingBoxKey.showWindowTitleBar, defaultValue: true);
static bool get useSSD =>
_setting.get(SettingBoxKey.useSSD, defaultValue: false);
static double get desktopVolume =>
_setting.get(SettingBoxKey.desktopVolume, defaultValue: 1.0);