Skip to content

Commit a0e11b9

Browse files
committed
现在远程访问可以访问文件夹了
1 parent da152fb commit a0e11b9

12 files changed

+2928
-18
lines changed

lib/main.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -524,7 +524,7 @@ void main(List<String> args) async {
524524
// 统一使用 ServiceProvider 中的全局实例,避免重复初始化与事件风暴
525525
ChangeNotifierProvider.value(
526526
value: ServiceProvider.watchHistoryProvider),
527-
ChangeNotifierProvider(create: (_) => ScanService()),
527+
ChangeNotifierProvider.value(value: ServiceProvider.scanService),
528528
ChangeNotifierProvider(create: (_) => DeveloperOptionsProvider()),
529529
ChangeNotifierProvider(create: (_) => AppearanceSettingsProvider()),
530530
ChangeNotifierProvider(create: (_) => UIThemeProvider()),

lib/models/shared_remote_library.dart

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,3 +155,96 @@ class SharedRemoteEpisode {
155155
);
156156
}
157157
}
158+
159+
class SharedRemoteScannedFolder {
160+
SharedRemoteScannedFolder({
161+
required this.path,
162+
required this.name,
163+
required this.exists,
164+
});
165+
166+
final String path;
167+
final String name;
168+
final bool exists;
169+
170+
factory SharedRemoteScannedFolder.fromJson(Map<String, dynamic> json) {
171+
return SharedRemoteScannedFolder(
172+
path: json['path'] as String? ?? '',
173+
name: json['name'] as String? ?? '',
174+
exists: json['exists'] as bool? ?? false,
175+
);
176+
}
177+
}
178+
179+
class SharedRemoteScanStatus {
180+
SharedRemoteScanStatus({
181+
required this.isScanning,
182+
required this.progress,
183+
required this.message,
184+
required this.totalFilesFound,
185+
});
186+
187+
final bool isScanning;
188+
final double progress;
189+
final String message;
190+
final int totalFilesFound;
191+
192+
factory SharedRemoteScanStatus.fromJson(Map<String, dynamic> json) {
193+
return SharedRemoteScanStatus(
194+
isScanning: json['isScanning'] as bool? ?? false,
195+
progress: (json['progress'] as num?)?.toDouble() ?? 0.0,
196+
message: json['message'] as String? ?? '',
197+
totalFilesFound: json['totalFilesFound'] as int? ?? 0,
198+
);
199+
}
200+
}
201+
202+
class SharedRemoteFileEntry {
203+
SharedRemoteFileEntry({
204+
required this.path,
205+
required this.name,
206+
required this.isDirectory,
207+
this.size,
208+
this.modifiedTime,
209+
this.animeName,
210+
this.episodeTitle,
211+
this.animeId,
212+
this.episodeId,
213+
this.isFromScan,
214+
});
215+
216+
final String path;
217+
final String name;
218+
final bool isDirectory;
219+
final int? size;
220+
final DateTime? modifiedTime;
221+
final String? animeName;
222+
final String? episodeTitle;
223+
final int? animeId;
224+
final int? episodeId;
225+
final bool? isFromScan;
226+
227+
factory SharedRemoteFileEntry.fromJson(Map<String, dynamic> json) {
228+
int? parseInt(dynamic value) {
229+
if (value is int) return value;
230+
if (value is num) return value.toInt();
231+
if (value is String) return int.tryParse(value);
232+
return null;
233+
}
234+
235+
return SharedRemoteFileEntry(
236+
path: json['path'] as String? ?? '',
237+
name: json['name'] as String? ?? '',
238+
isDirectory: json['isDirectory'] as bool? ?? false,
239+
size: json['size'] as int?,
240+
modifiedTime: json['modifiedTime'] != null
241+
? DateTime.tryParse(json['modifiedTime'] as String)
242+
: null,
243+
animeName: json['animeName'] as String?,
244+
episodeTitle: json['episodeTitle'] as String?,
245+
animeId: parseInt(json['animeId']),
246+
episodeId: parseInt(json['episodeId']),
247+
isFromScan: json['isFromScan'] as bool?,
248+
);
249+
}
250+
}

lib/providers/service_provider.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:flutter/foundation.dart';
22
import 'package:nipaplay/services/server_history_sync_service.dart';
33
import 'package:nipaplay/services/web_server_service.dart';
4+
import 'package:nipaplay/services/scan_service.dart';
45

56
import 'dandanplay_remote_provider.dart';
67
import 'emby_provider.dart';
@@ -17,6 +18,7 @@ class ServiceProvider {
1718
DandanplayRemoteProvider();
1819
static final WatchHistoryProvider watchHistoryProvider =
1920
WatchHistoryProvider();
21+
static final ScanService scanService = ScanService();
2022
static final ServerHistorySyncService serverHistorySyncService =
2123
ServerHistorySyncService.instance;
2224

@@ -31,6 +33,8 @@ class ServiceProvider {
3133

3234
// 本地观看历史需要同步等待加载完成
3335
await watchHistoryProvider.loadHistory();
36+
// 让 WatchHistoryProvider 能响应扫描完成(包括来自远程 API 的扫描请求)
37+
watchHistoryProvider.setScanService(scanService);
3438

3539
// 初始化服务器观看历史同步(当前仅支持 Jellyfin 下行同步)
3640
serverHistorySyncService.initialize(

0 commit comments

Comments
 (0)