Skip to content

Commit 719c308

Browse files
committed
fix(*)
1 parent 06b1b76 commit 719c308

12 files changed

Lines changed: 142 additions & 50 deletions

android/build.gradle.kts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ val pubspecVersionCode: String by lazy {
1515
val pubspecFile = rootProject.file("../pubspec.yaml")
1616
if (pubspecFile.exists()) {
1717
val versionLine = pubspecFile.readLines().find { it.trim().startsWith("version:") }
18-
// 提取 + 之后的数字,例如 "2.0.7+18" 提取出 "18"
1918
versionLine?.substringAfterLast("+")?.trim() ?: "1"
2019
} else {
2120
"1"

assets/version.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
2-
"version": "2.0.7",
3-
"version_num": 10507,
4-
"version_desc": "-Fix: 禁用Impeller, 新的渲染引擎可能导致无法打开",
2+
"version": "2.0.8",
3+
"version_num": 10508,
4+
"version_desc": "-Fix: 修复虎牙断流",
55
"prerelease":false,
66
"download_url": "https://github.com/liuchuancong/pure_live/releases"
77
}

lib/common/index.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,4 @@ export 'package:shared_preferences/shared_preferences.dart';
1919
export 'package:group_button/group_button.dart';
2020
export 'package:flutter_screenutil/flutter_screenutil.dart';
2121
export 'package:pure_live/common/base/constant.dart';
22+
export 'package:flv_lzc/fijkplayer.dart';

lib/common/utils/version_util.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import 'package:get/get.dart';
33
import 'package:http/http.dart' as http;
44

55
class VersionUtil {
6-
static const String version = '2.0.7';
6+
static const String version = '2.0.8';
77
static const String projectUrl = 'https://github.com/liuchuancong/pure_live_TV';
88
static const String releaseUrl = 'https://api.github.com/repos/liuchuancong/pure_live_TV/releases';
99
static const String issuesUrl = 'https://github.com/liuchuancong/pure_live_TV/issues';

lib/modules/live_play/live_play_controller.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import 'package:get/get.dart';
44
import 'package:flutter/services.dart';
55
import 'package:pure_live/common/index.dart';
66
import 'package:pure_live/app/app_focus_node.dart';
7-
import 'package:pure_live/core/site/huya_site.dart';
87
import 'package:pure_live/plugins/emoji_manager.dart';
98
import 'package:pure_live/model/live_play_quality.dart';
109
import 'package:pure_live/core/interface/live_danmaku.dart';
@@ -380,7 +379,7 @@ class LivePlayController extends StateController {
380379
"referer": "https://live.bilibili.com",
381380
};
382381
} else if (currentSite.id == 'huya') {
383-
var ua = await HuyaSite().getHuYaUA();
382+
var ua = "HYSDK(Windows,30000002)_APP(pc_exe&7030003&official)_SDK(trans&2.29.0.5493)";
384383
headers = {"user-agent": ua, "origin": "https://www.huya.com", "cookie": settings.huyaCookie.value};
385384
}
386385
videoController = VideoController(

lib/modules/live_play/widgets/video_player/video_controller.dart

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,11 @@ class VideoController with ChangeNotifier {
133133
}
134134
}
135135
});
136+
globalPlayer.onComplete.listen((bool isComplete) {
137+
if (isComplete) {
138+
refresh();
139+
}
140+
});
136141
}
137142

138143
// Danmaku player control

lib/player/fijk_adapter.dart

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1+
import 'dart:developer';
12
import 'package:get/get.dart';
23
import 'package:rxdart/rxdart.dart';
34
import 'unified_player_interface.dart';
4-
import 'package:flv_lzc/fijkplayer.dart';
55
import 'package:pure_live/common/index.dart';
66
import 'package:pure_live/player/fijk_helper.dart';
77
import 'package:pure_live/player/player_consts.dart';
@@ -17,8 +17,10 @@ class FijkPlayerAdapter implements UnifiedPlayer {
1717

1818
final BehaviorSubject<int?> _heightSubject = BehaviorSubject.seeded(null);
1919
final BehaviorSubject<int?> _widthSubject = BehaviorSubject.seeded(null);
20-
bool _isPlaying = false;
20+
final BehaviorSubject<bool> _completeSubject = BehaviorSubject.seeded(false);
2121

22+
bool _isPlaying = false;
23+
bool isInitialized = false;
2224
@override
2325
Future<void> init() async {
2426
_player.addListener(_playerListener);
@@ -29,12 +31,20 @@ class FijkPlayerAdapter implements UnifiedPlayer {
2931
if (_isPlaying != isPlaying) {
3032
_isPlaying = isPlaying;
3133
}
34+
if (_player.state == FijkState.completed) {
35+
log('Fijkplayer: The Video is completed');
36+
_completeSubject.add(true);
37+
}
38+
if (!isInitialized) {
39+
isInitialized = true;
40+
_player.setVolume(1.0);
41+
}
3242
if (_playingSubject.value != isPlaying) {
3343
_playingSubject.add(isPlaying);
3444
}
3545
if (_player.state == FijkState.error) {
3646
_errorSubject.add("FijkPlayer error: ${_player.value.exception.message}");
37-
SmartDialog.showToast("FijkPlayer error: ${_player.value.exception.message}", displayTime: Duration(seconds: 5));
47+
SmartDialog.showToast('FijkPlayer error: ${_player.value.exception.message}');
3848
}
3949
if (_player.state == FijkState.prepared ||
4050
_player.state == FijkState.started ||
@@ -105,11 +115,8 @@ class FijkPlayerAdapter implements UnifiedPlayer {
105115
Stream<int?> get height => _heightSubject.stream;
106116

107117
@override
108-
Stream<double?> get volume => 1.0.obs.stream;
109-
110-
@override
111-
Future<void> setVolume(double value) async {
112-
await _player.setVolume(value);
118+
Future<void> setVolume(double value) {
119+
throw UnimplementedError();
113120
}
114121

115122
@override
@@ -121,4 +128,7 @@ class FijkPlayerAdapter implements UnifiedPlayer {
121128
void release() {
122129
_player.release();
123130
}
131+
132+
@override
133+
Stream<bool> get onComplete => _completeSubject.stream;
124134
}

lib/player/fijk_helper.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import 'package:flv_lzc/fijkplayer.dart';
21
import 'package:pure_live/common/index.dart';
32

43
/// FijkPlayer Helper

lib/player/media_kit_adapter.dart

Lines changed: 74 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,41 @@
11
import 'dart:io';
2+
import 'dart:developer';
23
import 'package:get/get.dart';
3-
import 'package:flutter/material.dart';
4+
import 'package:rxdart/rxdart.dart';
45
import 'unified_player_interface.dart';
56
import 'package:media_kit/media_kit.dart';
7+
import 'package:pure_live/common/index.dart';
68
import 'package:pure_live/player/player_consts.dart';
79
import 'package:media_kit_video/media_kit_video.dart';
8-
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
9-
import 'package:pure_live/common/services/settings_service.dart';
1010

1111
class MediaKitPlayerAdapter implements UnifiedPlayer {
1212
late Player _player;
1313
late VideoController _controller;
1414
final SettingsService settings = Get.find<SettingsService>();
15+
16+
// 👇 使用 BehaviorSubject 缓存状态(与 FijkPlayerAdapter 一致)
17+
final _playingSubject = BehaviorSubject<bool>.seeded(false);
18+
final _errorSubject = BehaviorSubject<String?>.seeded(null);
19+
final _loadingSubject = BehaviorSubject<bool>.seeded(false);
20+
final _widthSubject = BehaviorSubject<int?>.seeded(null);
21+
final _heightSubject = BehaviorSubject<int?>.seeded(null);
22+
final _completeSubject = BehaviorSubject<bool>.seeded(false);
23+
1524
bool _isPlaying = false;
25+
bool isInitialized = false;
26+
1627
@override
1728
Future<void> init() async {
1829
_isPlaying = false;
30+
isInitialized = false;
31+
1932
_player = Player();
2033

2134
var pp = _player.platform as NativePlayer;
2235
if (Platform.isAndroid) {
2336
await pp.setProperty('force-seekable', 'yes');
24-
} else if (Platform.isWindows) {
25-
await pp.setProperty('cache', 'no');
26-
await pp.setProperty('cache-secs', '0');
27-
await pp.setProperty('cache-size', '0');
28-
await pp.setProperty('demuxer-seekable-cache', 'no');
29-
await pp.setProperty('demuxer-max-back-bytes', '0'); // --demuxer-max-back-bytes=<bytesize>
30-
await pp.setProperty('demuxer-donate-buffer', 'no'); // --demuxer-donate-buffer==<yes|no>
3137
}
38+
3239
_controller = settings.playerCompatMode.value
3340
? VideoController(
3441
_player,
@@ -41,8 +48,49 @@ class MediaKitPlayerAdapter implements UnifiedPlayer {
4148
androidAttachSurfaceAfterVideoParameters: false,
4249
),
4350
);
51+
52+
// 👇 监听 media_kit 原生流,并同步到 BehaviorSubject
4453
_player.stream.playing.listen((playing) {
4554
_isPlaying = playing;
55+
if (_playingSubject.value != playing) {
56+
_playingSubject.add(playing);
57+
}
58+
59+
if (!isInitialized) {
60+
isInitialized = true;
61+
_player.setVolume(100);
62+
}
63+
});
64+
65+
_player.stream.error.listen((error) {
66+
final msg = 'MediaKitPlayer error: $error';
67+
SmartDialog.showToast(msg);
68+
_errorSubject.add(msg);
69+
});
70+
71+
_player.stream.completed.listen((isComplete) {
72+
if (isComplete) {
73+
log('MediakitPlayer: The Video is completed');
74+
_completeSubject.add(true);
75+
}
76+
});
77+
78+
_player.stream.buffering.listen((buffering) {
79+
if (_loadingSubject.value != buffering) {
80+
_loadingSubject.add(buffering);
81+
}
82+
});
83+
84+
_player.stream.width.listen((w) {
85+
if (_widthSubject.value != w) {
86+
_widthSubject.add(w);
87+
}
88+
});
89+
90+
_player.stream.height.listen((h) {
91+
if (_heightSubject.value != h) {
92+
_heightSubject.add(h);
93+
}
4694
});
4795
_player.stream.error.listen((error) {
4896
SmartDialog.showToast("MediaKit error: $error", displayTime: Duration(seconds: 5));
@@ -75,32 +123,42 @@ class MediaKitPlayerAdapter implements UnifiedPlayer {
75123

76124
@override
77125
void dispose() {
126+
// 👇 先关闭所有 subject
127+
_playingSubject.close();
128+
_errorSubject.close();
129+
_loadingSubject.close();
130+
_widthSubject.close();
131+
_heightSubject.close();
132+
_completeSubject.close();
133+
78134
try {
79135
_player.dispose();
80136
} catch (e) {
81137
debugPrint(e.toString());
82138
}
83139
}
84140

141+
// 👇 统一返回缓存流
85142
@override
86-
Stream<bool> get onPlaying => _player.stream.playing;
143+
Stream<bool> get onPlaying => _playingSubject.stream;
87144

88145
@override
89-
Stream<String?> get onError => _player.stream.error.map((e) => e);
146+
Stream<String?> get onError => _errorSubject.stream;
147+
90148
@override
91-
Stream<bool> get onLoading => _player.stream.buffering;
149+
Stream<bool> get onLoading => _loadingSubject.stream;
92150

93151
@override
94152
bool get isPlayingNow => _isPlaying;
95153

96154
@override
97-
Stream<int?> get height => _player.stream.height;
155+
Stream<int?> get width => _widthSubject.stream;
98156

99157
@override
100-
Stream<int?> get width => _player.stream.width;
158+
Stream<int?> get height => _heightSubject.stream;
101159

102160
@override
103-
Stream<double?> get volume => _player.stream.volume;
161+
Stream<bool> get onComplete => _completeSubject.stream;
104162

105163
@override
106164
Future<void> setVolume(double value) async {

0 commit comments

Comments
 (0)