import 'dart:io'; import 'package:path/path.dart' as p; import '../../core/ftp.dart' show FtpRegistry; import '../../core/hwp_source.dart' show removeStaleHwpWork; import '../../core/output_paths.dart'; import '../../core/remote_idle.dart'; import '../../core/sftp.dart' show SftpRegistry; import '../../core/smb.dart' show SmbRegistry; import '../../core/languages.dart' show preferredSubtitleSetting; import '../../core/vault_view.dart' show cleanVaultExportJournal, removeStaleVaultViews; import '../../core/webdav.dart'; import '../../l10n/tr.dart'; import '../../services/media_player.dart' show playerSubtitleScale; import '../settings.dart'; /// 앱 전체에 걸린 실행 중 값과 켤 때의 정리. /// 약속: [applyRuntimeSettings] 는 설정을 그 설정을 쓰는 곳 (플레이어 자막 크기 · 기본 자막 언어 · 원격 서버 목록 · /// 원격 조각 사이 기다리기 · MKV 저장 위치) 에 건다. [cleanLeftovers] 는 지난번 강제로 꺼져 남은 임시 (문서 보기 · 보관함 보기 · /// 보관함에서 꺼내다 남은 평문) 를 지우고 지운 것을 [log] 에 남긴다 (실패는 조용히 건너뜀). void applyRuntimeSettings(AppSettings settings) { playerSubtitleScale.value = settings.playback.subtitleScale; // 61: 기본 자막 언어 (MKV 기본 자막 트랙 · 플레이어가 먼저 켜는 자막) preferredSubtitleSetting = settings.playback.preferredSubtitleLanguage; // WebDAV 서버 (파일 탐색기 · Rsync 화면 · 복사 · 동기화가 dav:// 경로로 쓴다) DavRegistry.configure(settings.remote.webdavServers); // 88: SFTP 서버 (sftp:// 경로) SftpRegistry.configure(settings.remote.sftpServers); // 88: Android SMB 서버 (smb:// 경로) SmbRegistry.requireSecure = settings.remote.smbRequireSecure; // 관리자 판단 (10/20): 원격 서버 받기 · 올리기의 조각 사이 기다리기 RemoteIdle.limit = Duration(seconds: settings.remote.idleSeconds); SmbRegistry.configure(settings.remote.smbServers); FtpRegistry.configure(settings.remote.ftpServers); outputRootOverride = (settings.mkv.outputRoot?.isNotEmpty ?? false) ? settings.mkv.outputRoot : null; } /// [tempDir]: 앱의 임시 폴더 · [viewRoot]: 보관함 [보기] 자리 (VaultLocation.viewRoot) Future cleanLeftovers(Future Function() tempDir, Future Function() viewRoot, void Function(String msg) log) async { // 관리자 지시 (10/20): 강제로 끝나 남은 HWP 보기 작업 폴더 (바꾼 PDF 들) try { final hwp = removeStaleHwpWork(await tempDir()); if (hwp.isNotEmpty) log(trf('지난번에 남은 문서 보기 임시 폴더를 지움: {0}개', [hwp.length])); } catch (_) {} // 관리자 지시 (10/21): 강제로 꺼져 남은 암호 보관함 보기 폴더 (잠깐 푼 평문) try { final vault = removeStaleVaultViews((await viewRoot()).path); if (vault.isNotEmpty) log(trf('지난번에 남은 보관함 보기 임시 폴더를 지움: {0}개', [vault.length])); } catch (_) {} // 관리자 지시 (10/21): 꺼내다 강제로 꺼져 받는 폴더에 남은 평문 "이름.jjvtmp" (기록에 있는 것만) try { final left = cleanVaultExportJournal((await viewRoot()).path); if (left.isNotEmpty) log(trf('지난번에 보관함에서 꺼내다 남은 임시 파일을 지움: {0}개', [left.length])); } catch (_) {} } /// 다운로드 폴더가 있는 드라이브 (예: "M:\\") - 위쪽 막대의 디스크 표시. 약속: 다운로드 폴더 설정이 바뀔 때만 다시 알아내고, /// 알 수 없으면 빈 값 class DownloadDisk { final AppSettings Function() settings; DownloadDisk(this.settings); String? _for, _root; String of() { final s = settings(); final key = s.download.root ?? ''; if (_root == null || _for != key) { _for = key; try { _root = p.rootPrefix(p.absolute(s.resolvedDownloadRoot())); } catch (_) { _root = ''; } } return _root!; } }