Compare commits

..

1 Commits

Author SHA1 Message Date
3d2c6a122a feat: 充电视频试看 2024-02-16 21:30:29 +08:00
6 changed files with 68 additions and 33 deletions

View File

@ -229,7 +229,9 @@ class VideoContent extends StatelessWidget {
), ),
if (crossAxisCount > 1) ...[ if (crossAxisCount > 1) ...[
const SizedBox(height: 2), const SizedBox(height: 2),
VideoStat(videoItem: videoItem, crossAxisCount: crossAxisCount), VideoStat(
videoItem: videoItem,
),
], ],
if (crossAxisCount == 1) const SizedBox(height: 4), if (crossAxisCount == 1) const SizedBox(height: 4),
Row( Row(
@ -290,14 +292,10 @@ class VideoContent extends StatelessWidget {
color: Theme.of(context).colorScheme.outline, color: Theme.of(context).colorScheme.outline,
), ),
), ),
Expanded( VideoStat(
flex: 1, videoItem: videoItem,
child: VideoStat(
videoItem: videoItem,
crossAxisCount: crossAxisCount,
),
), ),
// const Spacer(), const Spacer(),
], ],
if (videoItem.goto == 'av' && crossAxisCount != 1) ...[ if (videoItem.goto == 'av' && crossAxisCount != 1) ...[
VideoPopupMenu( VideoPopupMenu(
@ -319,12 +317,10 @@ class VideoContent extends StatelessWidget {
class VideoStat extends StatelessWidget { class VideoStat extends StatelessWidget {
final dynamic videoItem; final dynamic videoItem;
final int crossAxisCount;
const VideoStat({ const VideoStat({
Key? key, Key? key,
required this.videoItem, required this.videoItem,
required this.crossAxisCount,
}) : super(key: key); }) : super(key: key);
@override @override
@ -341,7 +337,7 @@ class VideoStat extends StatelessWidget {
danmu: videoItem.stat.danmu, danmu: videoItem.stat.danmu,
), ),
if (videoItem is RecVideoItemModel) ...<Widget>[ if (videoItem is RecVideoItemModel) ...<Widget>[
crossAxisCount > 1 ? const Spacer() : const SizedBox(width: 8), const Spacer(),
RichText( RichText(
maxLines: 1, maxLines: 1,
text: TextSpan( text: TextSpan(

View File

@ -1,5 +1,3 @@
import 'package:pilipala/utils/id_utils.dart';
class RecVideoItemAppModel { class RecVideoItemAppModel {
RecVideoItemAppModel({ RecVideoItemAppModel({
this.id, this.id,
@ -52,15 +50,14 @@ class RecVideoItemAppModel {
? json['player_args']['aid'] ? json['player_args']['aid']
: int.parse(json['param'] ?? '-1'); : int.parse(json['param'] ?? '-1');
aid = json['player_args'] != null ? json['player_args']['aid'] : -1; aid = json['player_args'] != null ? json['player_args']['aid'] : -1;
bvid = json['player_args'] != null bvid = null;
? IdUtils.av2bv(json['player_args']['aid'])
: '';
cid = json['player_args'] != null ? json['player_args']['cid'] : -1; cid = json['player_args'] != null ? json['player_args']['cid'] : -1;
pic = json['cover']; pic = json['cover'];
stat = RcmdStat.fromJson(json); stat = RcmdStat.fromJson(json);
// 改用player_args中的duration作为原始数据秒数 // 改用player_args中的duration作为原始数据秒数
duration = duration = json['player_args'] != null
json['player_args'] != null ? json['player_args']['duration'] : -1; ? json['player_args']['duration']
: -1;
//duration = json['cover_right_text']; //duration = json['cover_right_text'];
title = json['title']; title = json['title'];
owner = RcmdOwner.fromJson(json); owner = RcmdOwner.fromJson(json);

View File

@ -34,6 +34,7 @@ class PlayUrlModel {
String? seekParam; String? seekParam;
String? seekType; String? seekType;
Dash? dash; Dash? dash;
List<Durl>? durl;
List<FormatItem>? supportFormats; List<FormatItem>? supportFormats;
// String? highFormat; // String? highFormat;
int? lastPlayTime; int? lastPlayTime;
@ -52,7 +53,8 @@ class PlayUrlModel {
videoCodecid = json['video_codecid']; videoCodecid = json['video_codecid'];
seekParam = json['seek_param']; seekParam = json['seek_param'];
seekType = json['seek_type']; seekType = json['seek_type'];
dash = Dash.fromJson(json['dash']); dash = json['dash'] != null ? Dash.fromJson(json['dash']) : null;
durl = json['durl']?.map<Durl>((e) => Durl.fromJson(e)).toList();
supportFormats = json['support_formats'] != null supportFormats = json['support_formats'] != null
? json['support_formats'] ? json['support_formats']
.map<FormatItem>((e) => FormatItem.fromJson(e)) .map<FormatItem>((e) => FormatItem.fromJson(e))
@ -250,3 +252,30 @@ class Flac {
audio = json['audio'] != null ? AudioItem.fromJson(json['audio']) : null; audio = json['audio'] != null ? AudioItem.fromJson(json['audio']) : null;
} }
} }
class Durl {
Durl({
this.order,
this.length,
this.size,
this.ahead,
this.vhead,
this.url,
});
int? order;
int? length;
int? size;
String? ahead;
String? vhead;
String? url;
Durl.fromJson(Map<String, dynamic> json) {
order = json['order'];
length = json['length'];
size = json['size'];
ahead = json['ahead'];
vhead = json['vhead'];
url = json['url'];
}
}

View File

@ -102,12 +102,15 @@ class _ImagePreviewState extends State<ImagePreview>
); );
} }
// 隐藏状态栏,避免遮挡图片内容 // 设置状态栏图标透明
setStatusBar() async { setStatusBar() async {
if (Platform.isIOS || Platform.isAndroid) { if (Platform.isIOS) {
await StatusBarControl.setHidden(true, await StatusBarControl.setHidden(true,
animation: StatusBarAnimation.SLIDE); animation: StatusBarAnimation.SLIDE);
} }
if (Platform.isAndroid) {
await StatusBarControl.setColor(Colors.transparent);
}
} }
@override @override

View File

@ -229,9 +229,11 @@ class VideoDetailController extends GetxController
seekTo: seekToTime ?? defaultST, seekTo: seekToTime ?? defaultST,
duration: duration ?? Duration(milliseconds: data.timeLength ?? 0), duration: duration ?? Duration(milliseconds: data.timeLength ?? 0),
// 宽>高 水平 否则 垂直 // 宽>高 水平 否则 垂直
direction: (firstVideo.width! - firstVideo.height!) > 0 direction: firstVideo.width != null && firstVideo.height != null
? 'horizontal' ? ((firstVideo.width! - firstVideo.height!) > 0
: 'vertical', ? 'horizontal'
: 'vertical')
: null,
bvid: bvid, bvid: bvid,
cid: cid.value, cid: cid.value,
enableHeart: enableHeart, enableHeart: enableHeart,
@ -248,6 +250,21 @@ class VideoDetailController extends GetxController
var result = await VideoHttp.videoUrl(cid: cid.value, bvid: bvid); var result = await VideoHttp.videoUrl(cid: cid.value, bvid: bvid);
if (result['status']) { if (result['status']) {
data = result['data']; data = result['data'];
if (data.acceptDesc!.isNotEmpty && data.acceptDesc!.contains('试看')) {
SmartDialog.showToast(
'该视频为专属视频,仅提供试看',
displayTime: const Duration(seconds: 3),
);
videoUrl = data.durl!.first.url!;
audioUrl = '';
defaultST = Duration.zero;
firstVideo = VideoItem();
if (autoPlay.value) {
await playerInit();
isShowCover.value = false;
}
return result;
}
final List<VideoItem> allVideosList = data.dash!.video!; final List<VideoItem> allVideosList = data.dash!.video!;
try { try {
// 当前可播放的最高质量视频 // 当前可播放的最高质量视频

View File

@ -20,15 +20,11 @@ class AudioSessionHandler {
session.interruptionEventStream.listen((event) { session.interruptionEventStream.listen((event) {
final player = PlPlayerController.getInstance(); final player = PlPlayerController.getInstance();
if (event.begin) { if (event.begin) {
if (player.playerStatus != PlayerStatus.playing) return;
switch (event.type) { switch (event.type) {
case AudioInterruptionType.duck: case AudioInterruptionType.duck:
player.setVolume(player.volume.value * 0.5); player.setVolume(player.volume.value * 0.5);
break; break;
case AudioInterruptionType.pause: case AudioInterruptionType.pause:
player.pause(isInterrupt: true);
_playInterrupted = true;
break;
case AudioInterruptionType.unknown: case AudioInterruptionType.unknown:
player.pause(isInterrupt: true); player.pause(isInterrupt: true);
_playInterrupted = true; _playInterrupted = true;
@ -40,7 +36,7 @@ class AudioSessionHandler {
player.setVolume(player.volume.value * 2); player.setVolume(player.volume.value * 2);
break; break;
case AudioInterruptionType.pause: case AudioInterruptionType.pause:
if (_playInterrupted) player.play(); if (_playInterrupted) PlPlayerController.getInstance().play();
break; break;
case AudioInterruptionType.unknown: case AudioInterruptionType.unknown:
break; break;
@ -51,10 +47,7 @@ class AudioSessionHandler {
// 耳机拔出暂停 // 耳机拔出暂停
session.becomingNoisyEventStream.listen((_) { session.becomingNoisyEventStream.listen((_) {
final player = PlPlayerController.getInstance(); PlPlayerController.getInstance().pause();
if (player.playerStatus == PlayerStatus.playing) {
player.pause();
}
}); });
} }
} }