JJ_MKVMaker/lib/app/settings/download_settings.dart

77 lines
3.5 KiB
Dart

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<String> loginCookieSites = [...loginCookieDomains];
String ytCookiesFile = '';
/// 동시에 받는 다운로드 수 (0 = 무제한)
int maxParallel = 3;
@override
void write(Map<String, Object?> 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<String, dynamic> 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;
}
}