feat(ads/seo/release): v1.2.0 with live Google Ads, isolated ad profile, ads.txt, and SEO/AEO/GEO optimization

This commit is contained in:
Yun Chan 2026-09-14 00:39:44 +09:00
parent a88aafa1e5
commit 0e568f1f0a
975 changed files with 130593 additions and 16783 deletions

View file

@ -13,7 +13,7 @@
1. **제품 형태 = "컴패니언 앱" 우선**. PC가 일꾼(추출·다운로드), 폰은 리모컨+뷰어. 이는 Jellyfin/VLC 리모컨/Chromecast 모델로 검증된 구조이며, 양쪽 앱스토어 정책 리스크도 최소화함.
- 폰에서: ① 링크 보내 PC가 받게 하기 ② 다운로드 큐 원격 제어(진행률 실시간) ③ PC 라이브러리 스트리밍 시청 ④ 완료된 영상 폰으로 저장(오프라인)
2. **아키텍처 = 클라우드 없는 LAN 직결**. 데스크톱 앱에 Kestrel 서버를 내장(REST + SignalR), QR 코드로 페어링(주소+토큰 동시 전달). LocalSend/KDE Connect가 증명한 계정 없는 지속 가능한 모델. 원격 접근은 자체 릴레이 대신 Tailscale/VPN 문서화.
3. **기술 스택 = .NET MAUI 10 (net10.0-android/ios)**. 기존 `VideoDownloader.Core`(net8.0) 엔진을 **~90% 그대로 재사용** — 모바일 비호환 지점은 단 4곳(§4 검증 표). Flutter/네이티브는 Core 재사용이라는 이 프로젝트의 존재 이유를 포기해야 하므로 기각. Avalonia는 데스크톱 실험용 유지.
3. **기술 스택 = .NET MAUI 10 (net10.0-android/ios)**. 기존 `Paca.Core`(net8.0) 엔진을 **~90% 그대로 재사용** — 모바일 비호환 지점은 단 4곳(§4 검증 표). Flutter/네이티브는 Core 재사용이라는 이 프로젝트의 존재 이유를 포기해야 하므로 기각. Avalonia는 데스크톱 실험용 유지.
4. **플랫폼 전략 = Android 먼저(APK/GitHub 배포), iOS는 컴패니언 프레이밍**.
- **Android**: 자유도 최대 — 나중에 독립 다운로더 모드 추가 가능(YoutubeExplode 순수 C#).
- **iOS**: WebKit 강제 사실상 지속 + **Apple이 Brave의 오프라인 영상 저장을 금지한 전례** → 기기 내 추출 코드 배제, "내 PC 라이브러리 원격 시청" 프레이밍만.
@ -84,7 +84,7 @@
**버전 주의**: MAUI 8/9는 이미 지원 종료 → 신규 MAUI 앱은 **.NET 10 대상 필수**. 다행히 `net10.0-android`는 기존 `net8.0` Core 어셈블리를 그대로 참조 가능.
**`VideoDownloader.Core` 모바일 공유 분석 (파일:라인 검증 완료)**:
**`Paca.Core` 모바일 공유 분석 (파일:라인 검증 완료)**:
| 상태 | 위치 | 내용 |
|---|---|---|
@ -120,7 +120,7 @@
│ WebView2 브라우저 + 감지 DownloadManager (Core) │
│ ▲ │
│ ┌───────────────┴────────────────┐ │
│ VideoDownloader.Server (신규 클래스 라이브러리) │
│ Paca.Server (신규 클래스 라이브러리) │
│ · Kestrel (동적 포트, ListenAnyIP) │
│ · Bearer 페어링 토큰 (256bit, QR로 배포) │
│ · mDNS 광고 (_videodl._tcp, Makaretu.Dns) │
@ -170,12 +170,12 @@
- [x] net10.0-ios 타겟 + Info.plist 키 3종(ATS/로컬네트워크/Bonjour)
- [ ] TestFlight 배포 — **외부 전제 차단**: Apple Developer Program($99/년) 가입 필요. 시뮬레이터 실행·페어링·큐 조회까지는 실증 완료. "내 PC 라이브러리 리모컨" 프레이밍(기기 내 추출 코드 엄격 배제)은 유지
### Tier M4 — Android 독립 다운로더 (선택, PC 없는 모드)
- [ ] Core HLS/DASH/직접 다운로더 + 모바일 muxer 어댑터
- [ ] YoutubeExplode로 YouTube 직접 수신
- [ ] WorkManager 백그라운드 큐 + 재시작 생존
- [ ] 내장 브라우저 탭(하단 주소창·탭 그리드·제스처 관례 준수, §1.1) + 감지 배지
- [ ] 저장: MediaStore.Downloads
### Tier M4 — Android 독립 다운로더 (2026-08-31 ~ 2026-09-04 완료)
- [x] Core HLS/DASH/직접 다운로더 + 순수 C# 모바일 엔진 (`MobileDownloadEngine.cs`)
- [x] 인앱 웹뷰 스니퍼 + 스푸핑 엔진으로 YouTube/SNS 직접 수신 (`MediaPlaybackBypassScript.cs`, `PacaAndroidWebViewCustomizer.cs`, `VideoSnifferParser.cs`)
- [x] 모바일 다운로드 큐 + 앱 오프라인 영속화 (`MobileDownloadEngine.cs`, `AppOfflineStore.cs`)
- [x] 내장 브라우저 탭(하단 툴바·탭 그리드 카드 스위처·원터치 UA 전환) + 감지 배지 (`BrowserPage.cs`, `TabManagerPage.cs`, `VideoSnifferModal.cs`)
- [x] 저장: 로컬 비디오 및 다운로드 디렉터리 분기 보관 (`Movies/Paca`)
### 시기상조/미차용 (명시적 제외)
- 클라우드 동기화/계정, 알림 미러링, 클립보드 동기, BLE 근접 전송, 자체 릴레이 서버, iOS 기기 내 yt-dlp(기술적·정책적 불가)
@ -186,13 +186,13 @@
### Phase M0 — 데스크톱 준비 (필수 선행, 1~2주)
- [x] **Core 추상화 리팩터**: `IProcessRunner`·`IToolLocator`·`IMediaMuxer`·경로 제공자 인터페이스 추출 (데스크톱 구현은 무변화, 기존 4개 프로젝트 무영향. BACKLOG Avalonia 로드맵 2단계와 동일 작업)
- [x] **`VideoDownloader.Server` 신규 라이브러리**: Kestrel 내장 + 토큰 인증 + `/api/pair`·`/api/queue` + SignalR 허브(`/hubs/queue` — 큐 변경 시 queueUpdated 푸시, E2E 검증)
- [x] **`Paca.Server` 신규 라이브러리**: Kestrel 내장 + 토큰 인증 + `/api/pair`·`/api/queue` + SignalR 허브(`/hubs/queue` — 큐 변경 시 queueUpdated 푸시, E2E 검증)
- [x] WPF 설정에 QR 페어링 다이얼로그(QRCoder) + mDNS 광고(Makaretu.Dns `_videodl._tcp` — 광고→발견 실증)
- [x] **검증 관문**: 폰 브라우저로 QR 스캔 → 웹 컴패니언에서 큐 조회/추가 동작 (앱 개발 전 서버 완성 입증)
- ~~⚠️ git 아님 → `git init` 후 착수~~ → git 저장소 전환 완료
### Phase M1 — Android 컴패니언 앱 (2~3주)
- MAUI 10(net10.0-android) 신규 프로젝트 `VideoDownloader.Mobile` + Core 참조
- MAUI 10(net10.0-android) 신규 프로젝트 `Paca.Mobile` + Core 참조
- Tier M1 전체. **APK/GitHub Releases 배포** (Play 정책 회피 — YTDLnis 선례)
### Phase M2 — 라이브러리/시청 (2~3주)