JJ_MKVMaker/lib/startup/app_start.dart

81 lines
4.2 KiB
Dart

/// 약속: Windows · Android 가 같이 하는 시작 단계와 다운로드 연결.
/// [startCore] 는 저장소 위치 (컴포넌트 · AI · 버전별 설정 보관) → 설정 읽기 → DNS 강제 · Tor → 마스터 잠금 → rsync ·
/// 실시간 동기화 → 화면 언어 → 즐겨찾기 차례로 준비한다 (인터넷 · 저장된 비밀번호를 쓰는 것보다 먼저 네트워크 · 잠금).
/// [createDownloads] 는 다운로드 목록을 만들고 알림 · 다 받은 동영상을 MKV 목록에 넣기 · 설정 바꾸기를 잇는다.
library;
import 'package:flutter/material.dart';
import '../app/ai_local.dart';
import '../app/app_controller.dart';
import '../app/bookmarks_controller.dart';
import '../app/component_store.dart';
import '../app/download_manager.dart';
import '../app/live_sync.dart';
import '../app/version_snapshot.dart';
import '../l10n/tr.dart';
import '../app/i18n_controller.dart';
import '../ui/added_to_mkv_notice.dart';
import '../ui/master_prompt.dart';
import 'startup_helpers.dart';
/// [startCore] 가 준비한 것
typedef StartedCore = ({LiveSync live, BookmarksController bookmarks});
/// [sharedSnapshots]: 버전별 설정 보관을 함께 둘 공용 폴더 (Android - 앱을 지웠다 다시 설치해도 남게).
/// [afterLanguage]: 화면 언어를 정한 바로 뒤 (즐겨찾기 전) 에 할 것 (Android: 화면 방향 · 앱 아이콘)
Future<StartedCore> startCore(AppController controller, String dataDir,
{String? sharedSnapshots, Future<void> Function()? afterLanguage}) async {
ComponentStore.dataDirectory = dataDir;
AiStore.instance = AiStore(dataDir); // 123 · 121: AI 모델 · 엔진 (앱 데이터 폴더의 ai)
AiStore.log = controller.note;
VersionSnapshot.instance = VersionSnapshot(dataDir, sharedDir: sharedSnapshots);
await controller.init();
await setupNetwork(controller, dataDir); // DNS 강제 · Tor (인터넷을 쓰는 다른 것보다 먼저)
await setupMasterLock(controller); // 124: 저장된 비밀번호를 쓰기 전에 (실시간 동기화보다 먼저)
// 실시간 동기화 (환경 설정 > 파일 탐색기): 앱이 켜져 있는 동안. 다시 켤 때 바로 / 골라서 / 시작 안 함
await findBundledRsync(); // 앱에 들어 있는 rsync
final live = LiveSync(controller)..start(hold: controller.settings.copy.liveSyncOnStart != 'auto');
// 화면 언어 (환경 설정 > 화면 언어)
i18n.init(controller, dataDir);
await i18n.apply(controller.settings.display.language, save: false);
await afterLanguage?.call();
final bookmarks = BookmarksController();
await bookmarks.load();
return (live: live, bookmarks: bookmarks);
}
DownloadManager createDownloads(AppController controller,
{required GlobalKey<ScaffoldMessengerState> messengerKey, required GlobalKey<NavigatorState> navigatorKey}) {
final services = controller.services;
final downloads = DownloadManager(
backends: services.createDownloadBackends?.call(() => controller.settings) ?? const [],
settings: () => controller.settings,
);
// 클립보드 · 브라우저로 추가된 다운로드 알림
downloads.onAdded.listen((t) => messengerKey.currentState
?.showSnackBar(SnackBar(content: Text(trf('다운로드 추가: {0}', [t.source])))));
// 다 받은 동영상 → 편집 목록 (설정에서 끌 수 있음)
downloads.onFinished.listen((t) async {
if (!controller.settings.download.addFinished) return;
final files = DownloadManager.videoFilesOf(t);
if (files.isEmpty) return;
final n = await controller.addDownloaded(files);
// MKV 만들기 목록으로 넘어갔으므로 다운로드 목록에서는 뺀다 (받은 파일은 그대로)
downloads.dropFromList(t);
// 줄이 사라진 이유와 [보기] (MKV 화면 · 그 동영상)
showAddedToMkvNotice(messengerKey, navigatorKey, controller, title: t.title, files: files, added: n);
});
downloads.setAutoAdd = (on) async {
await controller.updateSettings((x) => x.download.addFinished = on);
downloads.refresh();
};
downloads.useSystemDns = () async {
await controller.updateSettings((x) => x.network.mode = 'system');
downloads.refresh();
};
downloads.addToEditList = controller.addDownloaded;
downloads.log = controller.note;
return downloads;
}