mirror of
https://github.com/HChaZZY/PiliPlus.git
synced 2025-12-06 09:13:48 +08:00
feat: sponsor block
This commit is contained in:
@@ -1,6 +1,8 @@
|
||||
import 'dart:async';
|
||||
import 'dart:io';
|
||||
import 'package:PiliPalaX/http/danmaku.dart';
|
||||
import 'package:PiliPalaX/http/init.dart';
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:floating/floating.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
||||
@@ -90,6 +92,8 @@ class VideoDetailController extends GetxController
|
||||
|
||||
PlayerStatus? playerStatus;
|
||||
|
||||
StreamSubscription<Duration>? positionSubscription;
|
||||
|
||||
@override
|
||||
void onInit() {
|
||||
super.onInit();
|
||||
@@ -147,6 +151,57 @@ class VideoDetailController extends GetxController
|
||||
cacheAudioQa = setting.get(SettingBoxKey.defaultAudioQa,
|
||||
defaultValue: AudioQuality.hiRes.code);
|
||||
oid.value = IdUtils.bv2av(Get.parameters['bvid']!);
|
||||
_sponsorBlock();
|
||||
}
|
||||
|
||||
List? _segmentList;
|
||||
|
||||
Future _sponsorBlock() async {
|
||||
dynamic result = await Request().get(
|
||||
'https://www.bsbsb.top/api/skipSegments',
|
||||
data: {'videoID': bvid},
|
||||
options: Options(
|
||||
headers: {
|
||||
'env': '',
|
||||
'app-key': '',
|
||||
'x-bili-mid': '',
|
||||
'x-bili-aurora-eid': '',
|
||||
'x-bili-aurora-zone': '',
|
||||
HttpHeaders.cookieHeader:
|
||||
'buvid3= ; SESSDATA= ; bili_jct= ; DedeUserID= ; DedeUserID__ckMd5= ; sid= ',
|
||||
},
|
||||
),
|
||||
);
|
||||
if (result.data is List && result.data.isNotEmpty) {
|
||||
_segmentList = (result.data as List)
|
||||
.where((item) => item['category'] == 'sponsor')
|
||||
.toList()
|
||||
.map((item) => item['segment'])
|
||||
.toList();
|
||||
}
|
||||
}
|
||||
|
||||
void _initSkip() {
|
||||
if (_segmentList != null && _segmentList!.isNotEmpty) {
|
||||
positionSubscription = plPlayerController
|
||||
.videoPlayerController?.stream.position
|
||||
.listen((position) async {
|
||||
for (List item in _segmentList!) {
|
||||
// debugPrint(
|
||||
// '${position.inSeconds},,${(item.first as double).round()}');
|
||||
if ((item.first as double).round() == position.inSeconds) {
|
||||
try {
|
||||
await plPlayerController
|
||||
.seekTo(Duration(seconds: (item[1] as double).round()));
|
||||
SmartDialog.showToast('已跳过赞助商广告');
|
||||
} catch (e) {
|
||||
debugPrint('failed to skip: $e');
|
||||
SmartDialog.showToast('广告跳过失败');
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/// 发送弹幕
|
||||
@@ -346,6 +401,8 @@ class VideoDetailController extends GetxController
|
||||
autoplay: autoplay,
|
||||
);
|
||||
|
||||
_initSkip();
|
||||
|
||||
/// 开启自动全屏时,在player初始化完成后立即传入headerControl
|
||||
plPlayerController.headerControl = headerControl;
|
||||
}
|
||||
|
||||
@@ -277,6 +277,7 @@ class _VideoDetailPageState extends State<VideoDetailPage>
|
||||
ScreenBrightness().resetScreenBrightness();
|
||||
PlPlayerController.setPlayCallBack(null);
|
||||
}
|
||||
videoDetailController.positionSubscription?.cancel();
|
||||
appbarStream.close();
|
||||
floating.dispose();
|
||||
videoDetailController.floating?.dispose();
|
||||
@@ -308,6 +309,8 @@ class _VideoDetailPageState extends State<VideoDetailPage>
|
||||
|
||||
ScreenBrightness().resetScreenBrightness();
|
||||
|
||||
videoDetailController.positionSubscription?.cancel();
|
||||
|
||||
videoDetailController.playerStatus =
|
||||
plPlayerController?.playerStatus.status.value;
|
||||
|
||||
|
||||
@@ -1321,6 +1321,7 @@ class PlPlayerController {
|
||||
var pp = _videoPlayerController!.platform as NativePlayer;
|
||||
await pp.setProperty('audio-files', '');
|
||||
removeListeners();
|
||||
await _videoPlayerController?.stop();
|
||||
await _videoPlayerController?.dispose();
|
||||
_videoPlayerController = null;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user