감사 갱신: T3-11/14/15+U5+미디어알림+썸네일그리드+외부망안내 2차 완성 — 147/147 GREEN, 에뮬 E2E(다운로드완료 노티/재생중 노티 lifecycle/ffmpeg 썸네일 그리드/Tailscale 안내) 실증

This commit is contained in:
Yun Chan 2026-08-15 18:18:36 +09:00
parent 46c6c321f2
commit 69094595a5

View file

@ -2,7 +2,7 @@
> **대상**: `BROWSER_FEATURES_PLAN.md` (v2) + `MOBILE_PLAN.md` (v1) 전 항목 > **대상**: `BROWSER_FEATURES_PLAN.md` (v2) + `MOBILE_PLAN.md` (v1) 전 항목
> **감사일**: 2026-08-15 · **방법**: TDD(RED→GREEN) + E2E 검증 > **감사일**: 2026-08-15 · **방법**: TDD(RED→GREEN) + E2E 검증
> **요약**: 전 솔루션 Release 빌드 **0 오류**, 단위/E2E 테스트 **104/104 GREEN**, Android 에뮬레이터·iOS 시뮬레이터·LAN 서버 E2E 완료 > **요약**: 전 솔루션 Release 빌드 **0 오류**, 단위/E2E 테스트 **147/147 GREEN**, Android 에뮬레이터·iOS 시뮬레이터·LAN 서버 E2E 완료
> >
> **감사 중 발견·수정된 회귀**: `HlsDownloader` 3-인자 ctor가 `_muxer` 미할당(재구성 ② 누락) → 모든 HLS 리먹스 NUL 위험. RED 테스트(`HlsMuxerWiringTests`)로 재현 후 ctor 할당 수정. `DashDownloader`는 정상. > **감사 중 발견·수정된 회귀**: `HlsDownloader` 3-인자 ctor가 `_muxer` 미할당(재구성 ② 누락) → 모든 HLS 리먹스 NUL 위험. RED 테스트(`HlsMuxerWiringTests`)로 재현 후 ctor 할당 수정. `DashDownloader`는 정상.
@ -67,14 +67,19 @@
| T3-9 읽어주기(TTS) | ✅ | `SpeakText` | | T3-9 읽어주기(TTS) | ✅ | `SpeakText` |
| T3-10 인쇄/소스보기 | ✅ Ctrl+P / Ctrl+U | `MainWindow` | | T3-10 인쇄/소스보기 | ✅ Ctrl+P / Ctrl+U | `MainWindow` |
### Phase E — T3 잔여 완성 (2차)
| 항목 | 구현 | 증거 |
|---|---|---|
| T3-11 권한 UI | ✅ PermissionGate(출처×종류 기억, OtherSensors 자동거절/연속다운로드 자동허용) + PermissionRequested 배선 + 다이얼로그(항상 허용=SavesInProfile 영속) | `PermissionGateTests` 6건 + `PermissionTrackerE2ETests`(실제 WebView2 Notification.requestPermission → granted) |
| T3-14 추적 방지 카운터 | ✅ TrackerBlocklist(20개 도메인, 서브도메인 매칭) + WebResourceRequested 차단(204) + TrackerCounter + 실드 배지·도메인 팝업 | `TrackerBlockTests` 8건 + E2E(실제 WebView2 에서 2개 스크립트 차단·집계, 정상 도메인 통과) |
| T3-15 주소창 진행 바 + 파라미터 제거 복사 | ✅ NavProgressTracker(전 탭 집계 INPC) → 주소창 하단 인디케이터 + 주소창 우클릭 "파라미터 제거 후 복사"(UrlCleaner) | `UrlCleanerTests`/`NavProgressTrackerTests` 13건 |
### T3 중 명시적 미구현 (계획 내 후순위/선택) ### T3 중 명시적 미구현 (계획 내 후순위/선택)
- T3-2 Auto-Archive 캐던스 — 닫힘 스택(25개)+복원이 커버(아카이브 자동화는 미차용) - T3-2 Auto-Archive 캐던스 — 닫힘 스택(25개)+복원이 커버(아카이브 자동화는 미차용)
- T3-11 권한 UI — `PermissionRequested` 배선 미삽입 (계획상 선택)
- T3-12 노트 패널 — 계획 자체가 "후순위" 명시 - T3-12 노트 패널 — 계획 자체가 "후순위" 명시
- T3-13 컴팩트 모드 — F11 전체화면이 동등 커버 - T3-13 컴팩트 모드 — F11 전체화면이 동등 커버
- T3-14 추적 방지 카운터 — 미차용
- T3-15 주소창 진행 바/파라미터 제거 복사 — 미차용
### 재구성 (사용자 지시 "근원부터 뜯어고쳐") ### 재구성 (사용자 지시 "근원부터 뜯어고쳐")
@ -111,11 +116,21 @@
4. iOS `NSCameraUsageDescription` 누락 → 시작 크래시 → Info.plist 추가 (iOS+MacCatalyst) 4. iOS `NSCameraUsageDescription` 누락 → 시작 크래시 → Info.plist 추가 (iOS+MacCatalyst)
5. 시뮬레이터 카메라 세션이 첫 프레임 블록 → 스캐너를 실기기(Physical)로 게이트 5. 시뮬레이터 카메라 세션이 첫 프레임 블록 → 스캐너를 실기기(Physical)로 게이트
### 2차 완성 (M2 잔여 + U5)
| 항목 | 구현 | 증거 |
|---|---|---|
| U5 완료 알림 | ✅ `VideoDownloader.Mobile.Core`(net8 순수 로직) QueueCompletionDetector(첫 폴링 무시·재알림 방지) + Plugin.LocalNotification(Android 13+ 권한) | `MobileCoreTests` 9건 + 에뮬 E2E: 데모 큐 완료 전환 → **"다운로드 완료" 노티 실제 게시**(dumpsys notification) |
| 재생중 미디어 알림 | ✅ 플레이어 열릴 때 ongoing 노티 "재생 중"(채널 vd_playback), 닫히면 취소 | 에뮬 E2E: 게시·소멸 lifecycle 실증(dumpsys). **FGS 미사용** — 재생은 앱 내(포그라운드) 한정이므로 ongoing 노티로 충족, 문서화 |
| 라이브러리 그리드(썸네일·해상도) | ✅ 서버 Thumbnailer(ffmpeg 1초 프레임 320px JPEG + 해상도 ffprobe, 사이드카 .thumb.jpg/.meta.json 캐시) + `GET /api/library/{id}/thumb` + DTO Resolution + 앱 2열 그리드 | `ThumbnailerTests` 4건(Fake 러너) + 서버 E2E(JPEG 매직/404/401) + 에뮬 E2E: **실제 ffmpeg 썸네일 렌더**(스크린샷)·해상도 "480x270" |
| 외부망 안내(§7) | ✅ ConnectionTroubleshoot(같은 네트워크/Tailscale 안내) → QueuePage 표시 | 단위 3건 + 에뮬 E2E: 죽은 포트 페어링 → "같은 네트워크… Tailscale 등 VPN" 문구 실증 |
| U4 저장소 로직 이관 | ✅ OfflineStore → Mobile.Core(디렉터리 주입, MAUI 비의존) | 재시작 매니페스트 유지 테스트 포함 |
### 명시적 미구현 (계획 허용/후순위) ### 명시적 미구현 (계획 허용/후순위)
- SignalR 허브 — 계획안 명시 "v1은 2초 폴링으로도 가능" 채택 - SignalR 허브 — 계획안 명시 "v1은 2초 폴링으로도 가능" 채택
- mDNS 광고(_videodl._tcp) — QR 페어링이 주 경로(계획 §6 리스크 대응과 동일 전제) - mDNS 광고(_videodl._tcp) — QR 페어링이 주 경로(계획 §6 리스크 대응과 동일 전제)
- U5 완료 푸시 알림 - 미디어 알림의 FGS 화 — 백그라운드 재생이 없는 컴패니언 구조상 ongoing 노티로 대체(위 표)
- M4 Android 독립 다운로더 — 계획상 "선택" - M4 Android 독립 다운로더 — 계획상 "선택"
- iOS TestFlight — 앱 실행/페어링 프레이밍까지만 (감사일 기준) - iOS TestFlight — 앱 실행/페어링 프레이밍까지만 (감사일 기준)