releases/VideoDownloader.Core/Config/AppConfig.cs

80 lines
4.4 KiB
C#

namespace VideoDownloader.Core.Config;
/// <summary>앱 설정 (JSON 직렬화). %AppData%/VideoDownloader/config.json 에 저장.</summary>
public class AppConfig
{
public string OutputFolder { get; set; } = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.MyVideos), "VideoDownloader");
/// <summary>홈 버튼이 이동할 URL</summary>
public string HomeUrl { get; set; } = "https://www.google.com";
public int Concurrency { get; set; } = 8;
public int Retries { get; set; } = 6;
/// <summary>동시에 실행할 다운로드(항목) 수 상한. 세그먼트 단위 Concurrency 와 별개.</summary>
public int MaxConcurrentDownloads { get; set; } = 3;
/// <summary>감지/다운로드에 반응할 형식 키: hls/dash/mp4/webm/mkv/m4v/mov/avi/audio</summary>
public List<string> EnabledFormats { get; set; } = new()
{ "hls", "dash", "mp4", "webm", "mkv", "m4v", "mov", "avi", "audio" };
/// <summary>직링크 감지 최소 크기(MB). 이보다 작으면(포스터 등) 무시.</summary>
public long MinSizeMB { get; set; } = 2;
/// <summary>null 이면 시스템 PATH 의 ffmpeg 사용</summary>
public string? FfmpegPath { get; set; }
/// <summary>yt-dlp 실행 파일 경로(null → 번들/PATH/자동다운로드). 소셜 영상(YouTube·Instagram·X) 다운로드용.</summary>
public string? YtDlpPath { get; set; }
/// <summary>소셜 다운로드 시 로그인 콘텐츠(인스타·X·멤버 영상 등) 를 위해 브라우저 쿠키를 yt-dlp 에 전달.</summary>
public bool UseCookiesForSocial { get; set; } = true;
/// <summary>yt-dlp 가 없으면 %AppData%/VideoDownloader/tools 로 자동 다운로드.</summary>
public bool AutoInstallYtDlp { get; set; } = true;
/// <summary>YouTube 안티봇 실패(n 챌린지/PO 토큰/서명 누락 등) 감지 시 yt-dlp 를 최신 버전으로 갱신해 1회 재시도.
/// YouTube 가 난독화를 바꿀 때 yt-dlp 는 보통 몇 시간~며칠 내 대응 릴리스를 내보내므로, 최신화만으로 대부분 복구됨.</summary>
public bool AutoUpdateYtDlp { get; set; } = true;
/// <summary>Deno(JS 런타임) 실행 파일 경로(null → 번들/PATH/자동다운로드). yt-dlp 의 EJS(n 챌린지 해석) 실행에 필요.</summary>
public string? DenoPath { get; set; }
/// <summary>Deno 가 없으면 %AppData%/VideoDownloader/tools 로 자동 다운로드. YouTube n 챌린지(EJS) 해석에 필수.</summary>
public bool AutoInstallDeno { get; set; } = true;
/// <summary>소셜 카드의 기본 화질 프리셋 키: best/1080/720/480/360/audio.</summary>
public string DefaultSocialQuality { get; set; } = "best";
/// <summary>YouTube player_client 오버라이드(예: "tv,android_vr,web"). null/빈 → yt-dlp 공식 기본값 사용(권장).
/// 2026년 기준 android/ios 는 GVS/Player PO 토큰이 필요하고 쿠키를 지원하지 않으며, web_sns 는
/// yt-dlp 에 존재하지 않는 클라이언트라 비워두는 것이 가장 안정적임.</summary>
public string? YoutubePlayerClients { get; set; }
public string UserAgent { get; set; } =
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " +
"(KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36";
/// <summary>테마: "dark" (기본) 또는 "light".</summary>
public string Theme { get; set; } = "dark";
/// <summary>우측 패널 펼침 폭(px). 접기/펼치기 + 드래그 리사이즈 후 저장.</summary>
public double RightPanelWidth { get; set; } = 420;
/// <summary>우측 패널 접힘 여부.</summary>
public bool RightPanelCollapsed { get; set; } = false;
/// <summary>개인정보 보호(InPrivate) 모드: 쿠키·세션·localStorage 를 디스크에 저장하지 않는다. 적용 시 앱 재시작.</summary>
public bool PrivateMode { get; set; } = false;
/// <summary>주소창 기본 검색 엔진(SearchEngines.Presets 의 Name). 검색어 입력 시 이 엔진으로 검색.</summary>
public string SearchEngine { get; set; } = "Google";
/// <summary>종료 시 탭을 저장하고 다음 시작에 복원(T1-10 세션 복원).</summary>
public bool RestoreSession { get; set; } = true;
/// <summary>M0 원격 접근(모바일 연동) 서버 켜기. 토큰은 자동 생성/저장.</summary>
public bool RemoteAccessEnabled { get; set; } = false;
public string? RemoteAccessToken { get; set; }
}