releases/VideoDownloader.App
2026-08-16 08:46:54 +09:00
..
Assets Phase D (T2-10): media playlist - auto-collect detected media, flyout management, player window (native+hls.js+dash.js bundles), persistence, auto-next (101 tests GREEN) 2026-08-15 15:25:10 +09:00
Browser 데스크톱 T3 잔여 완성 + 스타일 폴리시: 도메인 라우팅(WorkspaceRoutingRules 자동 워크스페이스 전환), 탭 아카이브(TabArchive 영속·팔레트 복구), 페이지 액션(흑백/세피아 필터), 노트 패널(NotesStore+플라이아웃), 컴팩트 모드(크롬 숨김+엣지 호버). 스타일: 한국어 폰트 폴백, 암시 폰트 통일, 다크 툴팁, 텍스트 대비 상향. UpdateNavState dispose 가드. 164/164 GREEN + 실창 스크린샷 검증 2026-08-16 08:46:54 +09:00
Core M0: remote access server - Kestrel embedded (token auth/pair/queue API/library/range streaming/web companion zero-install), QR pairing window, DownloadQueueAdapter, auto-start+palette commands. Server E2E green (102 tests) 2026-08-15 15:30:35 +09:00
Services T3-11/14/15 + M2 잔여: 권한 정책 UI(PermissionGate/PermissionRequested 다이얼로그+SavesInProfile), 추적 방지(TrackerBlocklist/WebResourceRequested 차단+실드 배지·팝업), 주소창 진행 바+파라미터 제거 복사(UrlCleaner/NavProgressTracker), U5 완료 알림(Mobile.Core 감지기+Plugin.LocalNotification), 재생중 ongoing 미디어 알림, 썸네일/해상도 API(Thumbnailer 사이드카 캐시+/thumb)+라이브러리 그리드, 외부망 안내(ConnectionTroubleshoot). 147 tests GREEN 2026-08-15 18:11:49 +09:00
Themes 데스크톱 T3 잔여 완성 + 스타일 폴리시: 도메인 라우팅(WorkspaceRoutingRules 자동 워크스페이스 전환), 탭 아카이브(TabArchive 영속·팔레트 복구), 페이지 액션(흑백/세피아 필터), 노트 패널(NotesStore+플라이아웃), 컴팩트 모드(크롬 숨김+엣지 호버). 스타일: 한국어 폰트 폴백, 암시 폰트 통일, 다크 툴팁, 텍스트 대비 상향. UpdateNavState dispose 가드. 164/164 GREEN + 실창 스크린샷 검증 2026-08-16 08:46:54 +09:00
ViewModels M0: remote access server - Kestrel embedded (token auth/pair/queue API/library/range streaming/web companion zero-install), QR pairing window, DownloadQueueAdapter, auto-start+palette commands. Server E2E green (102 tests) 2026-08-15 15:30:35 +09:00
App.xaml Baseline: WPF/Avalonia/Cli/Core + plans (BROWSER_FEATURES_PLAN v2, MOBILE_PLAN v1) 2026-08-15 11:59:25 +09:00
App.xaml.cs Baseline: WPF/Avalonia/Cli/Core + plans (BROWSER_FEATURES_PLAN v2, MOBILE_PLAN v1) 2026-08-15 11:59:25 +09:00
AppPaths.cs refactor(3): VideoDownloader.Browser library - tabs/find/search-engine/zoom/bookmark-history stores extracted from App (66 GREEN) 2026-08-15 15:02:23 +09:00
AssemblyInfo.cs Baseline: WPF/Avalonia/Cli/Core + plans (BROWSER_FEATURES_PLAN v2, MOBILE_PLAN v1) 2026-08-15 11:59:25 +09:00
Converters.cs Baseline: WPF/Avalonia/Cli/Core + plans (BROWSER_FEATURES_PLAN v2, MOBILE_PLAN v1) 2026-08-15 11:59:25 +09:00
MainWindow.xaml 데스크톱 T3 잔여 완성 + 스타일 폴리시: 도메인 라우팅(WorkspaceRoutingRules 자동 워크스페이스 전환), 탭 아카이브(TabArchive 영속·팔레트 복구), 페이지 액션(흑백/세피아 필터), 노트 패널(NotesStore+플라이아웃), 컴팩트 모드(크롬 숨김+엣지 호버). 스타일: 한국어 폰트 폴백, 암시 폰트 통일, 다크 툴팁, 텍스트 대비 상향. UpdateNavState dispose 가드. 164/164 GREEN + 실창 스크린샷 검증 2026-08-16 08:46:54 +09:00
MainWindow.xaml.cs 데스크톱 T3 잔여 완성 + 스타일 폴리시: 도메인 라우팅(WorkspaceRoutingRules 자동 워크스페이스 전환), 탭 아카이브(TabArchive 영속·팔레트 복구), 페이지 액션(흑백/세피아 필터), 노트 패널(NotesStore+플라이아웃), 컴팩트 모드(크롬 숨김+엣지 호버). 스타일: 한국어 폰트 폴백, 암시 폰트 통일, 다크 툴팁, 텍스트 대비 상향. UpdateNavState dispose 가드. 164/164 GREEN + 실창 스크린샷 검증 2026-08-16 08:46:54 +09:00
README.md Baseline: WPF/Avalonia/Cli/Core + plans (BROWSER_FEATURES_PLAN v2, MOBILE_PLAN v1) 2026-08-15 11:59:25 +09:00
SettingsWindow.xaml Phase 0 (T1-3/4/7/9/11): find bar w/ native Find API + search engine + site zoom + force reload + F11, wired into MainWindow, E2E smoke (39 tests) 2026-08-15 12:14:35 +09:00
SettingsWindow.xaml.cs refactor(3): VideoDownloader.Browser library - tabs/find/search-engine/zoom/bookmark-history stores extracted from App (66 GREEN) 2026-08-15 15:02:23 +09:00
VideoDownloader.App.csproj M0: remote access server - Kestrel embedded (token auth/pair/queue API/library/range streaming/web companion zero-install), QR pairing window, DownloadQueueAdapter, auto-start+palette commands. Server E2E green (102 tests) 2026-08-15 15:30:35 +09:00

Video Downloader (WPF 데스크톱 앱)

임베디드 브라우저(WebView2)로 영상을 재생하면, 네트워크 요청을 자동으로 관찰해 .m3u8(HLS)를 감지하고 즉시 MP4로 다운로드하는 Windows 데스크톱 앱.

브라우저에서 재생만 하면 됩니다 — m3u8 주소를 직접 찾을 필요가 없습니다.

구조

  • VideoDownloader.Core (net8.0) — HLS 다운로더 엔진 (파서/AES-128/fMP4/병렬다운로드/ffmpeg 리먹스). UI/브라우저 의존성 없음.
  • VideoDownloader.Cli (net8.0) — 엔진 단독 테스트 하네스 (m3u8 URL 직접 입력 → MP4).
  • VideoDownloader.App (net8.0-windows, WPF + WebView2) — 데스크톱 앱 본체.

요구사항

  • .NET 8 SDK 이상 (Windows)
  • WebView2 런타임 — Windows 11 은 기본 설치됨 (Win10 은 Microsoft Edge 기반 자동 설치)
  • ffmpeg — 시스템 PATH 에 있으면 자동 사용 (TS/fMP4 → MP4 리먹스). 없으면 설정에서 경로 지정.

빌드 및 실행

# 빌드 (x64 필수 — net8.0-windows WPF)
dotnet build VideoDownloader.App/VideoDownloader.App.csproj -c Debug -p:Platform=x64

# 실행
VideoDownloader.App\bin\x64\Debug\net8.0-windows\VideoDownloader.exe
# 또는
dotnet run --project VideoDownloader.App -p:Platform=x64

배포용 단일 디렉토리 게시:

dotnet publish VideoDownloader.App/VideoDownloader.App.csproj -c Release -p:Platform=x64 -r win-x64 --self-contained false -o publish

사용법

  1. 앱 실행 → 주소창에 재생페이지 URL 입력 후 Enter (또는 이동)
  2. 페이지에서 영상 재생
  3. 영상이 재생되는 순간 앱이 .m3u8 요청을 자동 감지 → 하단 다운로드 목록에 진행률 표시
  4. 완료되면 %USERPROFILE%\Videos\VideoDownloader\ 에 MP4 저장
    • 파일명은 페이지 제목(document.title)에서 자동 생성
    • 같은 영상은 자동으로 중복 다운로드 방지

설정 (상단 설정 버튼)

  • 저장 폴더 (기본: %USERPROFILE%\Videos\VideoDownloader)
  • 동시 다운로드 연결 수 (기본 8)
  • 자동 다운로드 토글 (기본 켜짐 — 감지 즉시 받기)
  • ffmpeg 경로 (비워두면 PATH 사용)

작동 원리

  1. 탐지: WebView2 의 WebResourceRequested + All 리소스 필터로 모든 네트워크 요청 관찰 → URL 경로에 .m3u8 이면 감지
  2. 해석: 감지된 m3u8 을 재요청(브라우저 쿠키 + Referer 복사) → 마스터 재생목록이면 최고 화질 변환 선택 → 미디어 재생목록 확정 (최종 URL 기준 중복제거)
  3. 다운로드: 세그먼트 병렬 다운로드(이어백기 지원) + AES-128 복호화 + fMP4 처리 → 병합 → ffmpeg -c copy 무손실 리먹스 → MP4

문제 해결

  • 영상이 감지되지 않음 — 사이트가 DRM(Widevine)을 쓰거나 비-HLS(mp4 직링크/재생자체 난독화)일 수 있음. DRM 영상은 다운로드 불가.
  • 403/401 오류 — 쿠키/Referer 자동 복사가 안 된 경우. 페이지에서 실제로 재생을 시작했는지 확인 (재생해야 토큰 URL이 발행됨).
  • MP4가 안 만들어짐 — ffmpeg 확인 (ffmpeg -version). 설정에서 경로 지정.
  • 라이브 방송 — VOD(EXT-X-ENDLIST) 우선 지원. 슬라이딩 윈도우 라이브는 v1 미지원.
  • 엔진 단독 점검: dotnet run --project VideoDownloader.Cli -- "<m3u8-url>"

범위 외

  • DRM/Widevine 암호화 영상 (복호화 불가)
  • 라이브 스트림(sliding window)
  • 오디오/자막 트랙 분리