Skip to content

Commit b052eab

Browse files
committed
feat: dynamic ftp stream url
1 parent 3b46a0c commit b052eab

6 files changed

Lines changed: 1861 additions & 440 deletions

File tree

lib/hooks/use_fvp_player.dart

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'package:iris/globals.dart' as globals;
77
import 'package:iris/models/file.dart';
88
import 'package:iris/models/player.dart';
99
import 'package:iris/models/progress.dart';
10+
import 'package:iris/models/storages/storage.dart';
1011
import 'package:iris/models/store/app_state.dart';
1112
import 'package:iris/store/use_app_store.dart';
1213
import 'package:iris/store/use_history_store.dart';
@@ -15,6 +16,7 @@ import 'package:iris/store/use_storage_store.dart';
1516
import 'package:iris/utils/check_data_source_type.dart';
1617
import 'package:iris/utils/logger.dart';
1718
import 'package:iris/utils/platform.dart';
19+
import 'package:media_stream/media_stream.dart';
1820
import 'package:saf_util/saf_util.dart';
1921
import 'package:video_player/video_player.dart';
2022
import 'package:wakelock_plus/wakelock_plus.dart';
@@ -60,6 +62,9 @@ FvpPlayer useFvpPlayer(BuildContext context) {
6062

6163
Future<void> init() async => initValue.value = true;
6264

65+
MediaStream mediaStream = MediaStream();
66+
final streamUrl = mediaStream.url;
67+
6368
final controllerFuture = useMemoized(() async {
6469
if (file == null) return VideoPlayerController.networkUrl(Uri.parse(''));
6570
isInitializing.value = true;
@@ -79,7 +84,9 @@ FvpPlayer useFvpPlayer(BuildContext context) {
7984
);
8085
default:
8186
return VideoPlayerController.networkUrl(
82-
Uri.parse(file.uri),
87+
Uri.parse(file.storageType == StorageType.ftp
88+
? '$streamUrl/${file.uri}'
89+
: file.uri),
8390
httpHeaders: auth != null ? {'authorization': auth} : {},
8491
);
8592
}
@@ -167,17 +174,21 @@ FvpPlayer useFvpPlayer(BuildContext context) {
167174
} else if (externalSubtitle.value! < externalSubtitles.length) {
168175
bool isExists = true;
169176

177+
final uri = file?.storageType == StorageType.ftp
178+
? '$streamUrl/${externalSubtitles[currentExternalSubtitle].uri}'
179+
: externalSubtitles[currentExternalSubtitle].uri;
180+
181+
logger('External subtitle uri: $uri');
182+
170183
if (Platform.isAndroid &&
171184
externalSubtitles[currentExternalSubtitle]
172185
.uri
173186
.startsWith('content://')) {
174-
isExists = await SafUtil()
175-
.exists(externalSubtitles[currentExternalSubtitle].uri, false);
187+
isExists = await SafUtil().exists(uri, false);
176188
}
177189

178190
if (isExists) {
179-
controller.setExternalSubtitle(
180-
externalSubtitles[currentExternalSubtitle].uri);
191+
controller.setExternalSubtitle(uri);
181192
} else {
182193
externalSubtitle.value = null;
183194
}

lib/hooks/use_media_kit_player.dart

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import 'package:iris/globals.dart' as globals;
77
import 'package:iris/models/file.dart';
88
import 'package:iris/models/player.dart';
99
import 'package:iris/models/progress.dart';
10+
import 'package:iris/models/storages/storage.dart';
1011
import 'package:iris/models/store/app_state.dart';
1112
import 'package:iris/store/use_app_store.dart';
1213
import 'package:iris/store/use_history_store.dart';
@@ -16,6 +17,7 @@ import 'package:iris/utils/logger.dart';
1617
import 'package:iris/utils/platform.dart';
1718
import 'package:media_kit/media_kit.dart';
1819
import 'package:media_kit_video/media_kit_video.dart';
20+
import 'package:media_stream/media_stream.dart';
1921
import 'package:path_provider/path_provider.dart';
2022

2123
MediaKitPlayer useMediaKitPlayer(BuildContext context) {
@@ -130,6 +132,9 @@ MediaKitPlayer useMediaKitPlayer(BuildContext context) {
130132

131133
final isInitializing = useState(false);
132134

135+
MediaStream mediaStream = MediaStream();
136+
final streamUrl = mediaStream.url;
137+
133138
Future<void> init(FileItem file) async {
134139
if (file.uri == '') return;
135140
isInitializing.value = true;
@@ -140,7 +145,9 @@ MediaKitPlayer useMediaKitPlayer(BuildContext context) {
140145
logger('Open file: $file');
141146
await player.open(
142147
Media(
143-
file.uri,
148+
file.storageType == StorageType.ftp
149+
? '$streamUrl/${file.uri}'
150+
: file.uri,
144151
httpHeaders: auth != null ? {'authorization': auth} : {},
145152
),
146153
play: autoPlay,
@@ -202,9 +209,13 @@ MediaKitPlayer useMediaKitPlayer(BuildContext context) {
202209
// 设置字幕
203210
if (externalSubtitles!.isNotEmpty) {
204211
logger('Set external subtitle: ${externalSubtitles[0]}');
212+
final uri = file?.storageType == StorageType.ftp
213+
? '$streamUrl/${externalSubtitles[0].uri}'
214+
: externalSubtitles[0].uri;
215+
logger('External subtitle uri: $uri');
205216
await player.setSubtitleTrack(
206217
SubtitleTrack.uri(
207-
externalSubtitles[0].uri,
218+
uri,
208219
title: externalSubtitles[0].name,
209220
),
210221
);

lib/models/storages/ftp.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ Future<List<FileItem>> getFTPFiles(
3333
await client.disconnect();
3434

3535
final baseUri =
36-
'http://localhost:8760/ftp?host=${storage.host}&port=${storage.port}&path=${path.join('/').replaceFirst('//', '/')}';
36+
'ftp?host=${storage.host}&port=${storage.port}&path=${path.join('/').replaceFirst('//', '/')}';
3737

3838
return await Future.wait(files.map(
3939
(file) async => FileItem(

0 commit comments

Comments
 (0)