import 'dart:io'; import '../../core/download_detect.dart'; import 'settings_group.dart'; /// 약속 (설정 A): 환경 설정 > 다운로드 · YouTube (yt-dlp · aria2) - 자기 키 (이름 · 처음 값 · 읽기 · 쓰기) 를 스스로 갖는다. /// 설정 하나를 더할 때는 이 파일만 고친다. 저장 파일의 키 이름은 예전 그대로 (평평한 키) class DownloadSettings implements SettingsGroup { /// 다운로드 위치 (아래에 jj_yt-dlp, jj_aria2 생성). null 이면 프로그램 폴더 String? root; /// Ctrl+C 로 복사한 주소를 자동으로 다운로드 bool clipboardWatch = true; /// 다운로드가 끝난 동영상을 편집 목록(MKV 만들기)에 자동으로 추가 bool addFinished = true; /// 마그넷 · 토렌트가 이 초 동안 메타데이터 · 피어를 못 받으면 그 줄에 이유 후보 · [다시 시도] (0 = 알리지 않음, 관리자 지시 10/20) int torrentStallSeconds = 60; /// YouTube 받을 형식 · 화질 (기본: MP4 최고 화질) YtContainer ytContainer = YtContainer.mp4; YtQuality ytQuality = YtQuality.best; /// 36: 같은 크기면 H.264 를 먼저 (휴대폰 · 태블릿은 AV1 · VP9 을 하드웨어로 못 푸는 일이 많음). 기본: Android 켜짐, PC 꺼짐 bool ytPreferH264 = Platform.isAndroid; /// 재생목록 주소면 목록 전체를 받기 bool ytExpandPlaylists = true; /// YouTube 로봇 확인 대응: 쿠키를 가져올 브라우저 (빈 값 = 사용 안 함) 또는 cookies.txt 경로 String ytCookiesBrowser = internalBrowserCookies; // 기본: 앱 안 브라우저 로그인 사용 /// 53: 앱 안 브라우저 로그인 쿠키를 넘길 사이트 (처음은 모두 - 28) List loginCookieSites = [...loginCookieDomains]; String ytCookiesFile = ''; /// 동시에 받는 다운로드 수 (0 = 무제한) int maxParallel = 3; @override void write(Map j, {required bool plainSecrets}) { j['downloadRoot'] = root; j['clipboardWatch'] = clipboardWatch; j['addFinishedDownloads'] = addFinished; j['torrentStallSeconds'] = torrentStallSeconds; j['ytContainer'] = ytContainer.name; j['ytQuality'] = ytQuality.name; j['ytPreferH264'] = ytPreferH264; j['ytExpandPlaylists'] = ytExpandPlaylists; j['ytCookiesBrowser'] = ytCookiesBrowser; j['loginCookieSites'] = loginCookieSites; j['ytCookiesFile'] = ytCookiesFile; j['maxParallelDownloads'] = maxParallel; } @override void read(Map j) { root = j['downloadRoot'] as String?; clipboardWatch = j['clipboardWatch'] as bool? ?? true; addFinished = j['addFinishedDownloads'] as bool? ?? true; torrentStallSeconds = const [0, 30, 60, 120, 300].contains(j['torrentStallSeconds']) ? j['torrentStallSeconds'] as int : 60; ytContainer = pickEnum(YtContainer.values, j['ytContainer'], YtContainer.mp4); ytPreferH264 = j['ytPreferH264'] is bool ? j['ytPreferH264'] as bool : Platform.isAndroid; ytQuality = pickEnum(YtQuality.values, j['ytQuality'], YtQuality.best); ytExpandPlaylists = j['ytExpandPlaylists'] as bool? ?? true; ytCookiesBrowser = j['ytCookiesBrowser'] as String? ?? internalBrowserCookies; loginCookieSites = j['loginCookieSites'] is List ? [for (final x in j['loginCookieSites'] as List) if (loginCookieDomains.contains(x)) '$x'] : [...loginCookieDomains]; ytCookiesFile = j['ytCookiesFile'] as String? ?? ''; maxParallel = (j['maxParallelDownloads'] as num?)?.toInt() ?? 3; } }