diff --git a/README.md b/README.md index 3382fa1..9a4d085 100644 --- a/README.md +++ b/README.md @@ -18,10 +18,13 @@ | **자막 편집** | SRT · SMI · ASS · VTT · 내장 자막 편집, 문자셋 변환(UTF-8 · CP949 · Shift-JIS · GBK · UTF-16) | | **싱크 맞추기** | 영상을 보면서 편집, 타임라인에서 끌어서 이동·길이 조절, "선택 줄부터 여기로 맞추기" | | **AI 자막** | Whisper 음성인식 → `파일명_AI.srt`, NLLB 번역 → `파일명_ko.srt` · `_en` · `_ja` … (200개 언어) | +| **자막 번역** | 이미 있는 자막(예: 영어)을 원하는 언어로 번역해 MKV 에 추가. 인터넷에서 받은 자막도 한국어로 함께 번역 | | **인터넷 자막 찾기** | OpenSubtitles.com 검색 (영상 해시로 "이 파일용" 자막 우선) | | **동영상 플레이어** | 재생 목록, 전체 화면, 팝업(항상 위), 원본의 0.5·1·2·4배, 자막·음성 트랙 선택, 속도 | | **탐색기 연결** | 오른쪽 클릭 "JJ_MKVMaker 로 재생" / "JJ_MKVMaker 로 자막 만들기", 끌어다 놓기 | -| **다운로드** | Ctrl+C 로 복사한 YouTube 주소 → yt-dlp, 마그넷 · .torrent → aria2 (백그라운드, 트레이) | +| **다운로드** | Ctrl+C 로 복사한 YouTube 주소 → yt-dlp, 마그넷 · .torrent → aria2 (백그라운드, 트레이). 다 받은 영상은 편집 목록에 자동 추가 | +| **웹 브라우저** | 앱 안 브라우저(Edge WebView2)로 보다가 [다운로드], 즐겨찾기(Chrome · Edge · Whale 에서 가져오기), 로그인 쿠키를 yt-dlp 와 공유 | +| **작업 대기열 · 화면 분할** | AI 자막 · 번역 · MKV 만들기를 차례로 백그라운드 실행, 브라우저 옆 [작업 현황] 에서 진행 확인 | ## 실행 @@ -52,11 +55,12 @@ OpenSubtitles 의 무료 API 키가 필요합니다. |---|---| | 플레이어 | Space 재생/정지 · ←/→ 10초 · Shift+←/→ 1분 · ↑/↓ 음량 · F 전체 화면 · Esc 나가기 · N/P 다음/이전 · M 음소거 · S 자막 · L 재생 목록 | | 자막 편집 | Ctrl+Space 재생/정지 · Alt+←/→ 1초 · Alt+Shift+←/→ 0.1초 · F7 새 줄 · F8 선택 줄 재생 · F9 시작=현재 · F10 끝=현재 | +| 브라우저 | Ctrl+L 주소창 · F5 새로고침 · Alt+←/→ 뒤로/앞으로 · Ctrl+D 즐겨찾기 · Ctrl+Shift+B 즐겨찾기 관리 · Ctrl+Shift+J 작업 현황 | | 어디서나 | Ctrl+Shift+X 창 보이기 (환경 설정에서 변경) | ## 소스에서 빌드 -필요: Flutter 3.47+, Visual Studio 2022 Build Tools (C++ 데스크톱), Windows 개발자 모드 +필요: Flutter 3.47+, Visual Studio 2022 Build Tools (C++ 데스크톱), Windows 개발자 모드, PATH 에 `nuget.exe` (앱 안 브라우저 WebView2 빌드용) ```powershell git clone <이 저장소> diff --git a/THIRD_PARTY_NOTICES.txt b/THIRD_PARTY_NOTICES.txt index ff0dd8b..0940cb7 100644 --- a/THIRD_PARTY_NOTICES.txt +++ b/THIRD_PARTY_NOTICES.txt @@ -23,6 +23,10 @@ JJ_MKVMaker - 포함된 오픈 소스 구성 요소 및 라이선스 고지 - onnxruntime (Dart) MIT https://pub.dev/packages/onnxruntime - window_manager, tray_manager, hotkey_manager, screen_retriever, nativeapi MIT https://github.com/leanflutter +- flutter_inappwebview Apache-2.0 https://pub.dev/packages/flutter_inappwebview +- Microsoft Edge WebView2 SDK (WebView2Loader.dll) + BSD 3-Clause (Microsoft) https://www.nuget.org/packages/Microsoft.Web.WebView2 + 앱 안 브라우저는 Windows 에 설치된 Edge WebView2 런타임을 사용합니다 (Windows 11 기본 포함). - desktop_drop Apache-2.0 https://pub.dev/packages/desktop_drop - file_picker MIT https://pub.dev/packages/file_picker - charset Apache-2.0 https://pub.dev/packages/charset diff --git a/integration_test/browser_real_test.dart b/integration_test/browser_real_test.dart new file mode 100644 index 0000000..69e25ca --- /dev/null +++ b/integration_test/browser_real_test.dart @@ -0,0 +1,111 @@ +import 'dart:io'; + +import 'package:flutter/material.dart'; +import 'package:flutter_inappwebview/flutter_inappwebview.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test.dart'; +import 'package:jj_mkvmaker/app/app_controller.dart'; +import 'package:jj_mkvmaker/app/bookmarks_controller.dart'; +import 'package:jj_mkvmaker/app/download_manager.dart'; +import 'package:jj_mkvmaker/core/download_detect.dart'; +import 'package:jj_mkvmaker/platform/windows/desktop_storage_service.dart'; +import 'package:jj_mkvmaker/platform/windows/process_media_tool.dart'; +import 'package:jj_mkvmaker/platform/windows/ytdlp_backend.dart'; +import 'package:jj_mkvmaker/services/platform_services.dart'; +import 'package:jj_mkvmaker/ui/browser_page.dart'; +import 'package:path/path.dart' as p; + +/// 실제 Edge(WebView2): 페이지 열기 · 동영상 감지 · 쿠키 저장 → yt-dlp 가 같은 쿠키를 읽는지 +void main() { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + + testWidgets('앱 안 브라우저 → 쿠키 → yt-dlp', (tester) async { + final server = await HttpServer.bind(InternetAddress.loopbackIPv4, 0); + server.listen((req) async { + req.response + ..headers.contentType = ContentType.html + ..headers.add('Set-Cookie', 'jjserver=ok; Max-Age=3600; Path=/') + ..write('JJ 테스트' + '' + ''); + await req.response.close(); + }); + final url = 'http://127.0.0.1:${server.port}/'; + final dataDir = Directory.systemTemp.createTempSync('jj_webview_').path; + + final c = AppController(PlatformServices(mediaTool: ProcessMediaTool('x', 'y'), storage: DesktopStorageService())); + c.settings.webViewDataDir = dataDir; + final bm = BookmarksController(p.join(dataDir, 'bm.json')); + final d = DownloadManager(backends: const [], settings: () => c.settings, readClipboard: () async => null); + + await tester.pumpWidget(MaterialApp(home: BrowserPage(c: c, bookmarks: bm, downloads: d, initialUrl: url))); + + // 페이지가 열리고