Merge branch 'main' of github.com:guozhigq/pilipala

This commit is contained in:
guozhigq
2024-01-29 22:58:34 +08:00
10 changed files with 56 additions and 273 deletions

View File

@ -1,8 +1,3 @@
import 'package:hive/hive.dart';
part 'result.g.dart';
@HiveType(typeId: 0)
class RecVideoItemAppModel { class RecVideoItemAppModel {
RecVideoItemAppModel({ RecVideoItemAppModel({
this.id, this.id,
@ -27,47 +22,27 @@ class RecVideoItemAppModel {
this.adInfo, this.adInfo,
}); });
@HiveField(0)
int? id; int? id;
@HiveField(1)
int? aid; int? aid;
@HiveField(2)
String? bvid; String? bvid;
@HiveField(3)
int? cid; int? cid;
@HiveField(4)
String? pic; String? pic;
@HiveField(5)
RcmdStat? stat; RcmdStat? stat;
@HiveField(6)
String? duration; String? duration;
@HiveField(7)
String? title; String? title;
@HiveField(8)
int? isFollowed; int? isFollowed;
@HiveField(9)
RcmdOwner? owner; RcmdOwner? owner;
@HiveField(10)
RcmdReason? rcmdReason; RcmdReason? rcmdReason;
@HiveField(11)
String? goto; String? goto;
@HiveField(12)
int? param; int? param;
@HiveField(13)
String? uri; String? uri;
@HiveField(14)
String? talkBack; String? talkBack;
// 番剧 // 番剧
@HiveField(15)
String? bangumiView; String? bangumiView;
@HiveField(16)
String? bangumiFollow; String? bangumiFollow;
@HiveField(17)
String? bangumiBadge; String? bangumiBadge;
@HiveField(18)
String? cardType; String? cardType;
@HiveField(19)
Map? adInfo; Map? adInfo;
RecVideoItemAppModel.fromJson(Map<String, dynamic> json) { RecVideoItemAppModel.fromJson(Map<String, dynamic> json) {
@ -102,18 +77,14 @@ class RecVideoItemAppModel {
} }
} }
@HiveType(typeId: 1)
class RcmdStat { class RcmdStat {
RcmdStat({ RcmdStat({
this.view, this.view,
this.like, this.like,
this.danmu, this.danmu,
}); });
@HiveField(0)
String? view; String? view;
@HiveField(1)
String? like; String? like;
@HiveField(2)
String? danmu; String? danmu;
RcmdStat.fromJson(Map<String, dynamic> json) { RcmdStat.fromJson(Map<String, dynamic> json) {
@ -122,13 +93,10 @@ class RcmdStat {
} }
} }
@HiveType(typeId: 2)
class RcmdOwner { class RcmdOwner {
RcmdOwner({this.name, this.mid}); RcmdOwner({this.name, this.mid});
@HiveField(0)
String? name; String? name;
@HiveField(1)
int? mid; int? mid;
RcmdOwner.fromJson(Map<String, dynamic> json) { RcmdOwner.fromJson(Map<String, dynamic> json) {
@ -141,13 +109,11 @@ class RcmdOwner {
} }
} }
@HiveType(typeId: 8)
class RcmdReason { class RcmdReason {
RcmdReason({ RcmdReason({
this.content, this.content,
}); });
@HiveField(0)
String? content; String? content;
RcmdReason.fromJson(Map<String, dynamic> json) { RcmdReason.fromJson(Map<String, dynamic> json) {

View File

@ -1,209 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'result.dart';
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class RecVideoItemAppModelAdapter extends TypeAdapter<RecVideoItemAppModel> {
@override
final int typeId = 0;
@override
RecVideoItemAppModel read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return RecVideoItemAppModel(
id: fields[0] as int?,
aid: fields[1] as int?,
bvid: fields[2] as String?,
cid: fields[3] as int?,
pic: fields[4] as String?,
stat: fields[5] as RcmdStat?,
duration: fields[6] as String?,
title: fields[7] as String?,
isFollowed: fields[8] as int?,
owner: fields[9] as RcmdOwner?,
rcmdReason: fields[10] as RcmdReason?,
goto: fields[11] as String?,
param: fields[12] as int?,
uri: fields[13] as String?,
talkBack: fields[14] as String?,
bangumiView: fields[15] as String?,
bangumiFollow: fields[16] as String?,
bangumiBadge: fields[17] as String?,
cardType: fields[18] as String?,
adInfo: (fields[19] as Map?)?.cast<dynamic, dynamic>(),
);
}
@override
void write(BinaryWriter writer, RecVideoItemAppModel obj) {
writer
..writeByte(20)
..writeByte(0)
..write(obj.id)
..writeByte(1)
..write(obj.aid)
..writeByte(2)
..write(obj.bvid)
..writeByte(3)
..write(obj.cid)
..writeByte(4)
..write(obj.pic)
..writeByte(5)
..write(obj.stat)
..writeByte(6)
..write(obj.duration)
..writeByte(7)
..write(obj.title)
..writeByte(8)
..write(obj.isFollowed)
..writeByte(9)
..write(obj.owner)
..writeByte(10)
..write(obj.rcmdReason)
..writeByte(11)
..write(obj.goto)
..writeByte(12)
..write(obj.param)
..writeByte(13)
..write(obj.uri)
..writeByte(14)
..write(obj.talkBack)
..writeByte(15)
..write(obj.bangumiView)
..writeByte(16)
..write(obj.bangumiFollow)
..writeByte(17)
..write(obj.bangumiBadge)
..writeByte(18)
..write(obj.cardType)
..writeByte(19)
..write(obj.adInfo);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is RecVideoItemAppModelAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}
class RcmdStatAdapter extends TypeAdapter<RcmdStat> {
@override
final int typeId = 1;
@override
RcmdStat read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return RcmdStat(
view: fields[0] as String?,
like: fields[1] as String?,
danmu: fields[2] as String?,
);
}
@override
void write(BinaryWriter writer, RcmdStat obj) {
writer
..writeByte(3)
..writeByte(0)
..write(obj.view)
..writeByte(1)
..write(obj.like)
..writeByte(2)
..write(obj.danmu);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is RcmdStatAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}
class RcmdOwnerAdapter extends TypeAdapter<RcmdOwner> {
@override
final int typeId = 2;
@override
RcmdOwner read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return RcmdOwner(
name: fields[0] as String?,
mid: fields[1] as int?,
);
}
@override
void write(BinaryWriter writer, RcmdOwner obj) {
writer
..writeByte(2)
..writeByte(0)
..write(obj.name)
..writeByte(1)
..write(obj.mid);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is RcmdOwnerAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}
class RcmdReasonAdapter extends TypeAdapter<RcmdReason> {
@override
final int typeId = 8;
@override
RcmdReason read(BinaryReader reader) {
final numOfFields = reader.readByte();
final fields = <int, dynamic>{
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
};
return RcmdReason(
content: fields[0] as String?,
);
}
@override
void write(BinaryWriter writer, RcmdReason obj) {
writer
..writeByte(1)
..writeByte(0)
..write(obj.content);
}
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is RcmdReasonAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
}

View File

@ -35,6 +35,7 @@ class _PlDanmakuState extends State<PlDanmaku> {
late double opacityVal; late double opacityVal;
late double fontSizeVal; late double fontSizeVal;
late double danmakuDurationVal; late double danmakuDurationVal;
late double strokeWidth;
int latestAddedPosition = -1; int latestAddedPosition = -1;
@override @override
@ -65,6 +66,7 @@ class _PlDanmakuState extends State<PlDanmaku> {
showArea = playerController.showArea; showArea = playerController.showArea;
opacityVal = playerController.opacityVal; opacityVal = playerController.opacityVal;
fontSizeVal = playerController.fontSizeVal; fontSizeVal = playerController.fontSizeVal;
strokeWidth = playerController.strokeWidth;
danmakuDurationVal = playerController.danmakuDurationVal; danmakuDurationVal = playerController.danmakuDurationVal;
} }
@ -136,6 +138,7 @@ class _PlDanmakuState extends State<PlDanmaku> {
hideBottom: blockTypes.contains(4), hideBottom: blockTypes.contains(4),
duration: duration:
danmakuDurationVal / playerController.playbackSpeed, danmakuDurationVal / playerController.playbackSpeed,
strokeWidth: strokeWidth,
// initDuration / // initDuration /
// (danmakuSpeedVal * widget.playerController.playbackSpeed), // (danmakuSpeedVal * widget.playerController.playbackSpeed),
), ),

View File

@ -1,5 +1,6 @@
// 内容 // 内容
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:pilipala/common/widgets/badge.dart'; import 'package:pilipala/common/widgets/badge.dart';
import 'package:pilipala/common/widgets/network_img_layer.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart';
import 'package:pilipala/models/dynamics/result.dart'; import 'package:pilipala/models/dynamics/result.dart';
@ -80,7 +81,7 @@ class _ContentState extends State<Content> {
height: height, height: height,
), ),
), ),
height > maxHeight height > Get.size.height * 0.9
? const PBadge( ? const PBadge(
text: '长图', text: '长图',
right: 8, right: 8,

View File

@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:pilipala/common/constants.dart'; import 'package:pilipala/common/constants.dart';
import 'package:pilipala/common/widgets/badge.dart'; import 'package:pilipala/common/widgets/badge.dart';
import 'package:pilipala/common/widgets/network_img_layer.dart'; import 'package:pilipala/common/widgets/network_img_layer.dart';
@ -87,7 +88,7 @@ Widget picWidget(item, context) {
childAspectRatio: aspectRatio, childAspectRatio: aspectRatio,
children: list, children: list,
), ),
if (len == 1 && origAspectRatio < 0.4) if (len == 1 && height > Get.size.height * 0.9)
const PBadge( const PBadge(
text: '长图', text: '长图',
top: null, top: null,

View File

@ -13,7 +13,6 @@ class RcmdController extends GetxController {
RxList<RecVideoItemModel> webVideoList = <RecVideoItemModel>[].obs; RxList<RecVideoItemModel> webVideoList = <RecVideoItemModel>[].obs;
bool isLoadingMore = true; bool isLoadingMore = true;
OverlayEntry? popupDialog; OverlayEntry? popupDialog;
Box recVideo = GStrorage.recVideo;
Box setting = GStrorage.setting; Box setting = GStrorage.setting;
RxInt crossAxisCount = 2.obs; RxInt crossAxisCount = 2.obs;
late bool enableSaveLastData; late bool enableSaveLastData;
@ -24,15 +23,6 @@ class RcmdController extends GetxController {
super.onInit(); super.onInit();
crossAxisCount.value = crossAxisCount.value =
setting.get(SettingBoxKey.customRows, defaultValue: 2); setting.get(SettingBoxKey.customRows, defaultValue: 2);
// 读取app端缓存内容
// if (recVideo.get('cacheList') != null &&
// recVideo.get('cacheList').isNotEmpty) {
// List<RecVideoItemAppModel> list = [];
// for (var i in recVideo.get('cacheList')) {
// list.add(i);
// }
// videoList.value = list;
// }
enableSaveLastData = enableSaveLastData =
setting.get(SettingBoxKey.enableSaveLastData, defaultValue: false); setting.get(SettingBoxKey.enableSaveLastData, defaultValue: false);
defaultRcmdType = defaultRcmdType =
@ -77,7 +67,6 @@ class RcmdController extends GetxController {
} else if (type == 'onLoad') { } else if (type == 'onLoad') {
appVideoList.addAll(res['data']); appVideoList.addAll(res['data']);
} }
recVideo.put('cacheList', res['data']);
_currentPage += 1; _currentPage += 1;
} }
isLoadingMore = false; isLoadingMore = false;

View File

@ -880,7 +880,7 @@ InlineSpan buildContent(
height: height, height: height,
), ),
), ),
height > maxHeight height > Get.size.height * 0.9
? const PBadge( ? const PBadge(
text: '长图', text: '长图',
right: 8, right: 8,

View File

@ -1,4 +1,5 @@
import 'dart:io'; import 'dart:io';
import 'dart:math';
import 'package:floating/floating.dart'; import 'package:floating/floating.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -724,6 +725,8 @@ class _HeaderControlState extends State<HeaderControl> {
double fontSizeVal = widget.controller!.fontSizeVal; double fontSizeVal = widget.controller!.fontSizeVal;
// 弹幕速度 // 弹幕速度
double danmakuDurationVal = widget.controller!.danmakuDurationVal; double danmakuDurationVal = widget.controller!.danmakuDurationVal;
// 弹幕描边
double strokeWidth = widget.controller!.strokeWidth;
final DanmakuController danmakuController = final DanmakuController danmakuController =
widget.controller!.danmakuController!; widget.controller!.danmakuController!;
@ -857,6 +860,44 @@ class _HeaderControlState extends State<HeaderControl> {
), ),
), ),
), ),
Text('描边粗细 $strokeWidth'),
Padding(
padding: const EdgeInsets.only(
top: 0,
bottom: 6,
left: 10,
right: 10,
),
child: SliderTheme(
data: SliderThemeData(
trackShape: MSliderTrackShape(),
thumbColor: Theme.of(context).colorScheme.primary,
activeTrackColor: Theme.of(context).colorScheme.primary,
trackHeight: 10,
thumbShape: const RoundSliderThumbShape(
enabledThumbRadius: 6.0),
),
child: Slider(
min: 0,
max: 3,
value: strokeWidth,
divisions: 6,
label: '$strokeWidth',
onChanged: (double val) {
strokeWidth = val;
widget.controller!.strokeWidth = val;
setState(() {});
try {
final DanmakuOption currentOption =
danmakuController.option;
final DanmakuOption updatedOption =
currentOption.copyWith(strokeWidth: val);
danmakuController.updateOption(updatedOption);
} catch (_) {}
},
),
),
),
Text('字体大小 ${(fontSizeVal * 100).toStringAsFixed(1)}%'), Text('字体大小 ${(fontSizeVal * 100).toStringAsFixed(1)}%'),
Padding( Padding(
padding: const EdgeInsets.only( padding: const EdgeInsets.only(

View File

@ -221,6 +221,7 @@ class PlPlayerController {
late double showArea; late double showArea;
late double opacityVal; late double opacityVal;
late double fontSizeVal; late double fontSizeVal;
late double strokeWidth;
late double danmakuDurationVal; late double danmakuDurationVal;
late List<double> speedsList; late List<double> speedsList;
// 缓存 // 缓存
@ -275,6 +276,9 @@ class PlPlayerController {
// 弹幕时间 // 弹幕时间
danmakuDurationVal = danmakuDurationVal =
localCache.get(LocalCacheKey.danmakuDuration, defaultValue: 4.0); localCache.get(LocalCacheKey.danmakuDuration, defaultValue: 4.0);
// 描边粗细
strokeWidth =
localCache.get(LocalCacheKey.strokeWidth, defaultValue: 1.5);
playRepeat = PlayRepeat.values.toList().firstWhere( playRepeat = PlayRepeat.values.toList().firstWhere(
(e) => (e) =>
e.value == e.value ==
@ -1086,6 +1090,7 @@ class PlPlayerController {
localCache.put(LocalCacheKey.danmakuOpacity, opacityVal); localCache.put(LocalCacheKey.danmakuOpacity, opacityVal);
localCache.put(LocalCacheKey.danmakuFontScale, fontSizeVal); localCache.put(LocalCacheKey.danmakuFontScale, fontSizeVal);
localCache.put(LocalCacheKey.danmakuDuration, danmakuDurationVal); localCache.put(LocalCacheKey.danmakuDuration, danmakuDurationVal);
localCache.put(LocalCacheKey.strokeWidth, strokeWidth);
if (_videoPlayerController != null) { if (_videoPlayerController != null) {
var pp = _videoPlayerController!.platform as NativePlayer; var pp = _videoPlayerController!.platform as NativePlayer;
await pp.setProperty('audio-files', ''); await pp.setProperty('audio-files', '');

View File

@ -3,13 +3,11 @@ import 'dart:io';
import 'package:hive_flutter/hive_flutter.dart'; import 'package:hive_flutter/hive_flutter.dart';
import 'package:path_provider/path_provider.dart'; import 'package:path_provider/path_provider.dart';
import 'package:pilipala/models/home/rcmd/result.dart';
import 'package:pilipala/models/model_owner.dart'; import 'package:pilipala/models/model_owner.dart';
import 'package:pilipala/models/search/hot.dart'; import 'package:pilipala/models/search/hot.dart';
import 'package:pilipala/models/user/info.dart'; import 'package:pilipala/models/user/info.dart';
class GStrorage { class GStrorage {
static late final Box<dynamic> recVideo;
static late final Box<dynamic> userInfo; static late final Box<dynamic> userInfo;
static late final Box<dynamic> historyword; static late final Box<dynamic> historyword;
static late final Box<dynamic> localCache; static late final Box<dynamic> localCache;
@ -21,13 +19,6 @@ class GStrorage {
final String path = dir.path; final String path = dir.path;
await Hive.initFlutter('$path/hive'); await Hive.initFlutter('$path/hive');
regAdapter(); regAdapter();
// 首页推荐视频
recVideo = await Hive.openBox(
'recVideo',
compactionStrategy: (int entries, int deletedEntries) {
return deletedEntries > 12;
},
);
// 登录用户信息 // 登录用户信息
userInfo = await Hive.openBox( userInfo = await Hive.openBox(
'userInfo', 'userInfo',
@ -54,10 +45,6 @@ class GStrorage {
} }
static void regAdapter() { static void regAdapter() {
Hive.registerAdapter(RecVideoItemAppModelAdapter());
Hive.registerAdapter(RcmdReasonAdapter());
Hive.registerAdapter(RcmdStatAdapter());
Hive.registerAdapter(RcmdOwnerAdapter());
Hive.registerAdapter(OwnerAdapter()); Hive.registerAdapter(OwnerAdapter());
Hive.registerAdapter(UserInfoDataAdapter()); Hive.registerAdapter(UserInfoDataAdapter());
Hive.registerAdapter(LevelInfoAdapter()); Hive.registerAdapter(LevelInfoAdapter());
@ -73,8 +60,6 @@ class GStrorage {
static Future<void> close() async { static Future<void> close() async {
// user.compact(); // user.compact();
// user.close(); // user.close();
recVideo.compact();
recVideo.close();
userInfo.compact(); userInfo.compact();
userInfo.close(); userInfo.close();
historyword.compact(); historyword.compact();
@ -158,12 +143,13 @@ class LocalCacheKey {
wbiKeys = 'wbiKeys', wbiKeys = 'wbiKeys',
timeStamp = 'timeStamp', timeStamp = 'timeStamp',
// 弹幕相关设置 屏蔽类型 显示区域 透明度 字体大小 弹幕时间 // 弹幕相关设置 屏蔽类型 显示区域 透明度 字体大小 弹幕时间 描边粗细
danmakuBlockType = 'danmakuBlockType', danmakuBlockType = 'danmakuBlockType',
danmakuShowArea = 'danmakuShowArea', danmakuShowArea = 'danmakuShowArea',
danmakuOpacity = 'danmakuOpacity', danmakuOpacity = 'danmakuOpacity',
danmakuFontScale = 'danmakuFontScale', danmakuFontScale = 'danmakuFontScale',
danmakuDuration = 'danmakuDuration', danmakuDuration = 'danmakuDuration',
strokeWidth = 'strokeWidth',
// 代理host port // 代理host port
systemProxyHost = 'systemProxyHost', systemProxyHost = 'systemProxyHost',