JJ_MKVMaker/lib/app/controller/app_runtime.dart

79 lines
3.9 KiB
Dart

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<void> cleanLeftovers(Future<String> Function() tempDir, Future<Directory> 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!;
}
}