근거: 감독 세션 지시 (폰 Z Fold6 · S10 Ultra 를 사용자처럼 써 본 결과) 1 · 5 · 6 · 10 · 11 · 12 · 14번.
감사 A-13 (지시와 반대였던 기본값) 되돌림 포함.
- 1: "모든 파일 접근" 권한이 없으면 목록 위에 이유 · 할 일 · [권한 허용 화면 열기] · [다시 확인].
듀얼 앱 (복제한 앱) 이면 그 사실과 원래 앱으로 여는 방법을 안내. [동영상 추가] 권한 화면에도.
허용하고 돌아오면 다시 확인해 목록을 새로 읽음.
- 5 · 14: 경로를 "SD 카드 › JJ_sdtest › jj_mkv" · "디바이스 저장공간 › Download" · "☁ ds1815 › 폴더" 로 (Android · WebDAV).
- 6: Rsync 창이 위아래면 버튼도 "위 → 아래 · 위 ← 아래 · 위 ⇄ 아래" (화살표도).
- 10 · 5: 기본값을 사용자 입장으로 - 창 배치 기본 '화면 크기 따라' (넓으면 두 창, 폰 세로는 한 창),
Android 는 한 번 누르면 바로 실행. 예전 기본값 (사용자가 고른 것 아님) 은 한 번 옮김, 고른 값은 그대로.
- 11: 창마다 따로 읽음 - WebDAV 서버를 기다리는 동안에도 이 기기 파일이 바로 보임 (읽는 중 막대).
- 12: 읽을 수 없으면 이유 (서버에 닿지 않음 → 같은 네트워크 · Tailscale, 비밀번호, 인증서, 권한, 없음) ·
[다시 시도] · [서버 설정 고치기].
- 감사 A-13: ZIP 은 기본 목록 보기 (사용자 지시 10-08 "zip 은 기본 목록 보기, 만화 보기는 설정에서"). 예전 기본 (만화) 은 한 번 끔.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
근거: 사용자 지적 ("가로 · 세로를 왜 막았나, 지시한 적 없다") + 감독 세션 지시.
예전 결정 (bf6429d · bca0c04, 내 판단 - 사용자 지시 없음): "데스크톱 화면이니까" 시작할 때 가로 고정을 강제하고
기본값 · 모르는 값도 가로 고정으로 해 휴대폰 · 태블릿의 세로 보기를 막았다.
- 시작할 때 가로 고정 강제 (runAndroid) 삭제
- 기본값 auto, 값이 없거나 틀리면 auto
- 예전 설정 파일 (orientationV2 없음) 의 가로 고정은 사용자가 고른 값이 아니므로 한 번 auto 로
- applyScreenOrientation: 모르는 값은 기기 방향 따라 (빈 목록)
- 환경 설정 > 화면 방향: 자동 (기본) · 가로 고정 · 세로 고정
- 시험: player_test 화면 방향
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- ComponentStore: GitHub 릴리스 "components" 의 components.json 을 읽어 설치 (받기 · SHA-256 확인 · 풀기) · 제거.
앱 데이터 폴더 components/(id) 에 둔다 (앱 업데이트에 지워지지 않게).
- 문서 미리보기 (Windows): LibreOffice 26.2.6 (MSI 관리 설치, 관리자 권한 없이) + Temurin JRE 21 + H2Orestart
(HWP · HWPX). DOC · DOCX · HWP · HWPX · XLS · XLSX · PPT · PPTX · ODT 등을 PDF 로 바꿔 보기.
Android 는 다른 앱으로 연다.
- 환경 설정 > 컴포넌트: 문서 미리보기 켜면 진행 창과 함께 설치, 끄면 지움.
- 버전 목록: 이 기기용 설치 파일이 있는 버전 릴리스만 (components 릴리스 제외).
- 웹 브라우저: 좌우로 밀기는 위쪽 막대에서만 (웹 페이지의 위 · 아래 스크롤과 다투던 것).
- 화면 순서: 끌어 놓기 대신 ▲ ▼ (화면 배율 때문에 놓는 자리가 어긋나던 것).
- 시험: component_store_test (JJ_COMPONENTS_URL 일 때 실제 설치 · HWP 변환), components_test 순서 버튼.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- reader_page: 그림 · 만화 · PDF 보기. 오른쪽 1/3 누르면 다음, 왼쪽은 이전, 가운데는 막대 보이기 · 숨기기,
좌우로 밀어도 넘김. 한 쪽 맞추기 · 좌우 맞추기, 넘기는 방향 (오른쪽→왼쪽 만화), 어둡게 · 밝게, 쪽 막대.
- 그림: 탐색기의 지금 정렬 순서대로 같은 폴더 그림을 넘김. 대상 확장자는 환경 설정 > 파일 탐색기에서 고름.
- PDF (pdfrx): 보기, 페이지 지우기, 그림을 페이지로 넣기, 저장 (빈 새 문서에 보이는 순서대로 조립 -
원본 문서 페이지 목록을 바꾸면 pdfrx 가 엉뚱한 페이지를 남겼음). 원본은 사본으로 열어 덮어쓰기 가능하게.
- 그림 → PDF: 탐색기 메뉴 "PDF 로 만들기" (표시한 그림들을 한 장씩).
- ZIP · CBZ: 목록 · 골라서 / 모두 풀기 (다른 창 · 새 폴더 · 같은 폴더), 만화 보기 (설정에서 바로 보기 켜기 · 끄기).
- 탐색기 메뉴 "보기", WebDAV 파일도 (받아서).
- 시험: reader_test (ZIP · 넘기기 · 설정), integration_test/pdf_test (실제 pdfium).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- app/components.dart: 기능 묶음 (MKV · 웹 브라우저 · 파일 탐색기 · Rsync · 다운로드 · 이미지/PDF/ZIP 보기 · 문서 미리보기).
설정 components (설치한 것) · navOrder (화면 순서) · swipeNav.
- 위쪽 이동 버튼: 설치한 화면만 순서대로 (하나뿐이면 그것만). 홈 화면을 제거했으면 설치된 첫 화면.
- SwipeNav: 화면 가운데를 왼쪽으로 밀면 다음, 오른쪽으로 밀면 이전 화면 (끝 다음은 처음).
- 환경 설정 > 컴포넌트: 켜기 · 끄기, 화면 순서 (끌어서), 좌우로 밀기 켜기 · 끄기.
- Android 작업 알림: 받는 중이면 내려받기 아이콘, 동기화 · 작업 중이면 좌우로 오가는 화살표 (animation-list).
- 시험: components_test (설치 · 순서 · 저장, 버튼 줄, 좌우로 밀기).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- AppTopBar: 폭 720 미만이면 위쪽 막대를 두 줄로 (위: 화면 이동 · 화면 크기 · 설정 · 종료, 아래: 화면의 도구).
모든 화면 (MKV · 브라우저 · 탐색기 · Rsync · 모니터링 · 다운로드 · 설정 · 플레이어 · 자막 편집 · 작업 현황 · 즐겨찾기) 에 적용.
접은 폴드에서 설정 · 종료 버튼이 화면 밖으로 밀려 누를 수 없던 것.
- MKV 화면: 좁으면 목록 위 · 자세히 보기 아래, 변환 설정 줄은 옆으로 밀어 보기, 자막 버튼은 줄바꿈.
- 대화 상자 37개: 내용이 화면보다 길면 스크롤 (가로 폴드에서 버튼이 내용과 겹치던 것).
- SettingTile: 좁은 화면에서 설정 줄의 고르기 상자 · 입력 칸을 설명 아래로.
- 다운로드 도구 줄 옆으로 밀어 보기, 빈 목록 안내 글 여백.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- mpv keep-open=always: 파일 끝에서 mpv 가 스스로 다음 파일로 넘어가지 않게 하고 앱이 정한다.
건너뛴 직후 (3초 안, 끝 5초 전보다 앞) 의 "끝" 은 잘못 본 것 → 그 곳으로 키프레임 기준 다시 건너뜀.
진짜 끝이면 다음 파일로 넘어가 계속 재생.
- 탐색기: 설정에서 지운 WebDAV 서버를 보던 창은 이 기기의 첫 저장 장치로.
- integration_test/seek_repro_test.dart (JJ_SEEK_FILE 일 때): 여러 곳 건너뛰기 · 진짜 끝에서 다음 파일.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 플레이어 (mpv) 에 주소 + 인증 헤더로 넘김 (자체 서명 인증서면 tls-verify=no), 건너뛰기는 서버 Range 요청
- 같은 폴더 동영상으로 재생 목록, 같은 폴더 자막은 작으니 임시로 받아서
- 외부 플레이어 · VLC · 기본 프로그램에는 아이디를 넣은 주소로
- 탐색기의 "이 폴더의 동영상 재생" 도 WebDAV 에서
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 환경 설정 > 파일 탐색기 > WebDAV: 서버 추가 · 고치기 · 지우기 · 연결 확인 (기본 인증, 인증서 확인 안 함)
- 위쪽 "SD 카드" 옆 서버 탭 (없으면 "WebDAV" 탭 → 바로 추가), 경로 dav://서버/경로
- 목록 · 새 폴더 · 이름 변경 · 삭제 · 찾기 · 복사 · 이동 (같은 서버는 MOVE), 열기 · 재생은 임시로 받아서
- Rsync · lsync: 한쪽이 WebDAV 면 앱이 크기 · 시각 비교로 맞춤 (-u · --remove-source-files 따름)
- PROPFIND 에 Content-Length (chunked 면 일부 서버가 남은 본문을 다음 요청으로 오해)
- Android: http:// NAS 연결 허용 (usesCleartextTraffic)
- 화면에는 내부 id 대신 "☁ 서버 이름/경로"
- 시험: webdav_test (시험 서버) · explorer_webdav_test · real_dav_test (JJ_REAL_DAV 일 때 실제 서버)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 설정 [업데이트 · 버전 고르기]: GitHub 의 모든 릴리스 (지금 · 최신 · 시험판 표시, 바뀐 내용) 중 골라 설치.
새 버전으로 · 예전 정상 버전으로 되돌리기 · 다시 설치. 자동 확인 (하루 한 번) 은 지금처럼 최신만.
- 버전을 바꾸기 전 지금 버전의 설정 (설정 · 동영상 목록 · 즐겨찾기 · 창 위치) 을 version_snapshots 에 보관
(자막 API 키 · 비밀번호는 넣지 않음). 그 버전으로 돌아오면 (lastRunVersion 이 다르면) 되살릴지 묻고 다시 시작.
- Windows 되돌리기: 설치 스크립트가 Lib 를 그 버전과 똑같이 맞춤 (robocopy /MIR, 받은 파일 · 모델 폴더 제외).
- Android 되돌리기: 낮은 버전은 위에 설치 불가 → APK · 설정을 Download/JJ_MKVMaker 에 저장 후 앱 지우기 창,
다시 설치한 앱이 시작할 때 저장해 둔 설정을 되살릴지 묻는다.
- 두 번째 실행 (앱이 켜져 있을 때 다시 실행) 이 끝나며 coremessaging.dll 접근 위반으로 꺼지던 것: 바로 끝내기로.
- Rsync 화면: 새 폴더를 만들면 그 줄로 스크롤하고 그 창의 원본 · 대상으로 바로 고름 (트리 위치 계산도 폴더만 기준으로).
- 모니터링: 끝나지 않은 (실행 중 · 실패 · 취소) 작업도 lsync 로 이동 (실행 중이면 물어보고 멈춘 뒤),
진행 막대 위 = 지금 파일 (그 파일의 % · 전송 속도), 아래 = 폴더 전체 (rsync to-chk 기준 항목 수),
전송 속도 표시 (rsync -P · 현재 방식은 최근 3초)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Rsync 화면의 한 방향 (좌 → 우 · 좌 ← 우): 확인 창에서 [원본 파일 지우기 (--remove-source-files)] 를 고를 수 있고,
고르면 끝난 뒤 원본의 빈 폴더를 지움 (find 원본/ -type d -empty -delete) - 원본 폴더는 남김 / 지움 중 고르기.
양쪽 (⇄) 에는 없음
- 모니터링 lsync 의 쌍마다 [최종 정리]: rsync -avHPOg --remove-source-files 원본/ 대상/ 뒤 빈 폴더 지우기,
원본 폴더 남김 / 지움 고르기. 원본이 비므로 그 실시간 동기화는 끔 (지우기 포함이면 대상까지 비우지 않게),
진행은 복사 · rsync 탭에 남음
- 기억한 작업에 원본 정리 (prune) 저장, 모니터링 카드에서 바꾸기 · 진행 막대에 "빈 폴더 N개 지움"
- 원본 정리를 고른 이동은 예전의 "비면 원본 폴더째 지우기" 대신 고른 대로
- Windows 실제 rsync 로 시험 (integration_test/rsync_page_test.dart)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 위쪽 파일 탐색기 옆 [Rsync]: 파일 탐색기와 같은 모양, 늘 좌우 두 창 · 폴더만 · 창마다 폴더 하나만 고르기
- 가운데 좌 → 우 (왼쪽 → 오른쪽) · 좌 ← 우 (오른쪽 → 왼쪽) · 좌 ⇄ 우 (둘 다 함께, -u 로 받는 쪽의 새 파일은 덮어쓰지 않음)
폴더 안의 것을 맞춤 (원본/ → 대상/), 확인 창에 경로 · 옵션, 진행 막대는 방향마다
- 가운데 [모니터링]: 실행한 rsync 가 남아 옵션 고치기 · 다시 실행 · lsync 로 옮기기 · 일정 (앞의 모니터링 그대로)
확인 창에서 취소하면 남기지 않음, 고른 폴더는 다음에 열 때 그대로 (rsyncPaths)
- 파일 탐색기: 모니터링 버튼 · rsync 빼고 현재 방식 · robocopy 만 (예전 값 rsync 는 현재 방식으로), 복사는 모니터링에 남기지 않음
- 환경 설정: [Rsync] 묶음 (rsync 옵션 · 가져오기 · 실시간 동기화 · 백그라운드로 실행), 복사 모니터링 스위치 없앰
- Windows 실제 rsync 로 → · ⇄ 시험 (integration_test/rsync_page_test.dart)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 다른 곳에서 지워진 폴더 (탐색기 목록에는 남아 있던 것) 를 복사 · 이동하면 rsync 오류 대신 알리고 목록을 새로 고침
- 폴더를 자기 자신 (또는 그 안) 으로 복사 · 이동하는 것을 막음 (현재 방식만 막고 있었고 rsync 는 막지 않았음)
- 모니터링의 실행 · 재개도 같은 확인: 시작하지 않고 실패와 이유를 남김
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 선택 모드: 폴더를 누르면 자기 자신과 안의 파일 · 폴더 모두 선택 (펼쳐서 ✔), 다시 누르면 모두 취소.
고른 폴더 안의 항목 하나를 누르면 그것만 빠지고 나머지는 고른 채로
- rsync 내장: Windows 는 실행 파일 옆 rsync\ (tool/fetch_rsync.ps1, MSYS2 패키지 SHA256 고정),
Android 는 NDK 로 rsync 3.4.1 소스를 빌드한 librsync.so (tool/build_rsync_android.sh, jniLibs)
- rsync 가져오기 기본 = 앱에 들어 있는 것 (Windows 는 없으면 내려받기), 폴더 복사 기본 = rsync (예전 기본값도 rsync 로)
- Android rsync 는 -8 로 한글 이름을 그대로 출력, lsync (실시간 동기화) 도 rsync 로 동작
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Android 뒤로 키: 앞 웹 페이지가 있으면 웹 페이지 뒤로 (위쪽 ← 화면 이동은 그대로 브라우저 닫기)
- 실행 취소 · 목록 보기 · 허용 알림이 사라지지 않던 것 (Flutter 3.47 부터 action 이 있으면 기본 persist) → persist: false
- 웹뷰를 텍스처로 그림 (useHybridComposition: false): 백그라운드로 실행 중 앱을 밀었다가 다시 열면
Impeller "EGL Bad Access" 로 앱 화면이 비던 것
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 설정 > 파일 탐색기 > 실시간 동기화 (모니터링 > lsync 위에도): [백그라운드로 실행], [앱을 다시 켤 때 동기화]
- Windows: 백그라운드로 실행 = 창 ✕ 를 누르면 트레이로 (종료 동작 설정과 같은 값), 끄면 닫을 때 종료
- Android: 켜면 ← · 최근 앱에서 밀어도 Dart 엔진을 살려 두고 (엔진 캐시) 동기화 · MKV 만들기 · 다운로드 계속,
작업 알림 서비스가 동기화를 지켜보는 동안에도 유지 (Android 14+ specialUse), [종료] 는 프로세스까지 끝냄
- lsync: 이번 실행 동안 멈춤 / 시작, 모두 멈춤 / 모두 시작, 켤 때 고르기 창
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 설정 [복사 모니터링] 켜면 파일 탐색기 가운데에 [모니터링] 버튼
- 복사 · rsync 탭: 복사 대상 기억, 진행률, 대상 디스크 용량, 옵션 고치기 → 저장 후 현재 유지 / 설정 반영 후 실행, 실행 · 재개 · 취소 · 지우기, lsync 로 이동
- lsync 탭: 맞출 파일 자동 표시, 지금 맞추기, 복사 · rsync 로 이동
- 동기화 시간: 계속 / cron 시간 창 (요일 × 시 격자로 칠해서 편집)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 환경 설정 > 파일 탐색기: 파일 / 폴더 복사 방법, rsync · robocopy 옵션 (기본 -avPog · /E /COPY:DAT /DCOPY:T /R:2 /W:2,
바꿀 수 있음), 여러 개를 고르면 항목마다 따로 (기본) / 한 번에, 속도 제한 KB/s (rsync --bwlimit · 현재 방식 앱 조절 · robocopy /IPG)
- rsync (Windows): 처음 쓸 때 MSYS2 공식 저장소에서 rsync 3.5.1 과 필요한 DLL 을 내려받기 (파일마다 SHA256 고정 검증),
설정 폴더 rsync\ 에 둔다. 경로는 /cygdrive/c/... 로 바꿔 넘김. 또는 직접 지정 (Android 도 지정하면 사용)
- robocopy (Windows): 폴더마다 실행, 파일은 같은 폴더끼리, 출력에서 파일 수를 세어 진행 표시
- 실시간 동기화 (lsyncd 처럼): 원본 · 대상 폴더 쌍, Windows 는 폴더 감시로 바로, Android 는 30초마다, 방법 · 지우기 선택
- 복사 · 이동 진행: 아래에서 올라오는 막대 두 줄 (위: 전체 항목 중 · 아래: 지금 폴더의 파일 중), 끝나면 내려감
- 선택 모드의 ✔: 고르지 않은 것은 흐리게, 고른 것은 진하게
Android 태블릿 (Galaxy Tab S6 Lite) 에서 속도 제한 복사 · 진행 막대 확인. rsync 는 실제로 내려받아 시험 (JJ_NET_TESTS=1).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 폴더는 한 번 누르면 바로 펼치기 · 접기 (오른쪽 파일 목록은 들어가기). 두 번 누르기는 파일만
- 선택 동그라미는 평소 숨기고 선택 모드에서만 (✔ 표시). 가운데 [선택] 버튼 · 길게 누르기 메뉴 [선택] · Ctrl + 클릭으로 시작
- 선택 모드에서 누르기: 파일은 선택 · 취소, 폴더는 처음엔 선택, 고른 폴더를 다시 누르면
폴더는 풀고 펼쳐서 안의 파일 · 폴더를 모두 선택
- 아래 막대: n개 표시함 · 모두 선택 · 표시 지우기 · 선택 끝. 복사 · 이동 · 삭제가 끝나면 선택 모드도 끝
- 화면을 닫은 뒤 끝난 파일 작업이 닫힌 창을 다시 그리려던 오류 수정
Android 태블릿 (Galaxy Tab S6 Lite) 에서 확인.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
"폴더 + 파일 목록" · 한 창 배치에서는 복사 · 이동이 막혀 있었다 (다른 창이 없음).
길게 누르기 메뉴 · 버튼의 [복사] · [이동] 으로 담아 두고, 넣을 폴더에서 [붙여넣기] (메뉴 · 버튼).
두 창은 지금처럼 "다른 창으로 복사 · 이동" 도 그대로. 붙여넣은 폴더는 펼쳐서 새 항목이 바로 보인다.
Android 태블릿 (Galaxy Tab S6 Lite) 에서 확인.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 환경 설정 > 파일 탐색기: 누르기 (한 번 선택 · 두 번 실행 (기본) / 한 번 바로 실행), 스타일, 창 배치
- 선택 모드: 폴더는 고르기만 (› 화살표로 펼치기), 두 번 누르면 펼치기 · 실행, Ctrl + 클릭 = 여러 개 고르기,
길게 누르기 · 오른쪽 클릭 = 기능 메뉴. 표시 동그라미는 두 번 누르기를 기다리지 않고 바로
- 스타일: X-plore (썸네일 · 두 줄), Windows 탐색기 (컬러 아이콘 · 이름 / 수정한 날짜 / 유형 / 크기 열),
Total Commander (촘촘한 줄 · [폴더] · 확장자 / <DIR> / 날짜 열)
- 창 배치 "폴더 + 파일 목록": 왼쪽 폴더 트리, 오른쪽 고른 폴더의 내용 (맨 위 ".." = 상위 폴더, 두 번 누르면 들어가기)
- 모양 · 배치가 바뀌면 보던 폴더로 다시 스크롤
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 위쪽 공통 버튼에 [파일 탐색기], 환경 설정 > 홈 화면에 "파일 탐색기" (앱을 켜면 바로)
- 두 창 (트리: 누르면 그 자리에서 펼치기 · 접기), 저장 장치 고르기 (Windows 드라이브 · Android 저장소)
- 동영상: 누르면 기본 동작 (내장 플레이어 또는 확장자별 재생 프로그램), 길게 누르기 · 오른쪽 클릭 메뉴
(내장 플레이어로 재생 · 다른 앱으로 열기 · MKV 목록에 추가 · 이름 변경 · 복사 / 이동 · 삭제 · 정보)
- 썸네일 · 해상도 · 길이 (작업 중에는 썸네일을 만들지 않음), 그림 파일 미리 보기
- 가운데 버튼: 상위 폴더 · 새로 고침 · 재생 · MKV 목록에 추가 · 새 폴더 · 이름 변경 · 복사 · 이동 · 삭제 ·
찾기 · 정렬 기준 · 숨은 항목 · 내역 · 창 배치 · 버튼 구성
- 창 배치: 두 창 / 한 창, 좌우 / 위아래 / 화면 모양 따라, 버튼 줄 두 창 사이 / 끝 / 숨김
- 버튼 구성: 보일 버튼 · 순서
- 다른 앱으로 열기: Windows "연결 프로그램" 창 · Android 앱 고르기 (FileProvider, SD 카드 포함)
- 여러 개 지울 때 확인 창에 이름 · 폴더를 보여 준다
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
"이 출처의 앱 설치 허용" 설정 화면을 연 뒤 "다시 [업데이트]" 로 끝나
허용하고 돌아오면 같은 APK (약 90MB) 를 처음부터 다시 받아야 했다.
설치 허용 필요 (PERMISSION) 를 따로 알려, 돌아와 [설치 계속] 을 누르면 받은 파일로 바로 설치한다.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
같은 PC 에서 설정 파일을 같이 쓰는 새 버전 (개발 빌드 등) 이 "확인함" 을 남기면
옛 버전 (Windows 배포 폴더) 이 20시간 동안 확인을 건너뛰어 10월 1일 판에 머물렀다.
확인한 버전 (lastUpdateCheckVersion) 을 함께 저장해 지금 버전과 다르면 바로 확인한다.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 웹 페이지 자동 번역 (기본 끔): 다른 언어 페이지를 화면 언어로 (Google 번역, 원문 언어 자동 감지).
주소창 옆 번역 버튼으로 원문 · 번역 바꾸기, 새로 생긴 글도 2초마다 번역 (lib/core/web_translate.dart)
- JavaScript 사용 (기본 켬): Edge · Android 는 바로 다시 읽어 적용, Chrome (CEF) 은 웹뷰를 새로 만든다.
Edge 는 JavaScript 를 꺼도 번역됨 (TreeWalker 거르기 함수를 쓰지 않음)
- webview_cef: create 에 {url, javascript} 를 받아 CefBrowserSettings.javascript 를 끔 (JJ_PATCH.md 5)
- 통합 테스트 (Windows Edge · Android WebView): integration_test/web_translate_test.dart
debug 빌드만 평문 http 허용 (기기 안 시험 페이지)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 아이콘 5종: 노랑(기본) · 검정 · 필름+JJ · 필름 · 처음 아이콘(파랑)
- Android: 아이콘마다 activity-alias, 중계 LauncherActivity 로 바꿔도 앱 화면 유지
- Windows: 창 · 작업 표시줄 · 트레이 아이콘, 앱 안 홈 버튼도 고른 아이콘으로
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 모든 화면 글자를 tr() / trf() 로 (한국어 원문이 사전 열쇠), assets/l10n 에 영어 · 일본어 · 중국어 사전
- 더한 언어는 이 기기의 NLLB 번역 모델로 영어 사전을 자동 번역해 설정 폴더 l10n 에 저장
- 언어 이름 · 선택 목록 · 모델 이름은 화면에 보일 때 번역 (파일명 인식 규칙은 그대로)
- tool/l10n: 새 글자 감싸기 · 사전 점검
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
브라우저에서 [다운로드] → 목록 보기 (또는 플레이어 · 설정 등) 로 가면 가려진 브라우저에서
YouTube 가 계속 재생되어 소리만 났다. 브라우저 위에 다른 화면이 올라오면 (RouteAware.didPushNext)
페이지의 video · audio 를 멈춘다 (WebNav.pauseMedia, Edge · Chrome · Android 웹뷰 공통).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
브라우저에서 [다운로드] → "목록 보기" 로 다운로드 목록에 간 뒤 위쪽 [웹 브라우저] 를 누르면
새 브라우저가 홈 주소로 열려 보던 페이지를 잃었다. 이미 열린 브라우저가 있으면 그 화면까지 돌아간다 (BrowserPage.open).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 파일 앱 "다음으로 열기" · 다른 앱의 동영상 열기 (VIEW video/*) 와 공유 (SEND · SEND_MULTIPLE) 에 JJ_MKVMaker
- content:// 주소를 실제 파일 경로로 (저장소 문서 ID · MediaStore _data · 경로 조각 + 크기 확인) → 옆에 MKV 를 만들 수 있게
- 설정 "다른 앱에서 동영상을 열 때": 바로 재생 (기본, MKV 목록에도 추가) / 편집 목록에 추가. 앱이 꺼져 있을 때 · 켜져 있을 때 모두
- 실제 경로를 알 수 없는 앱에서 온 것은 재생만 하고 안내
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 앱 안 파일 고르기: 바로 가기에 저장소 (내장 · SD 카드 · USB) 를 보이고, 그 안에서 폴더 이동 · 위로 가기
- 설정 > 저장 위치 (MKV · 자막, 다운로드): Android 는 앱 안 폴더 고르기 (SD 카드 폴더를 실제 경로로)
- [폴더 열기] · [결과 폴더]: SD 카드 경로도 파일 앱으로 (문서 ID XXXX-XXXX:경로)
- MainActivity.storageVolumes: StorageManager 의 연결된 저장소 목록
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 환경 설정 맨 위에 지금 버전 · [최신 버전 확인] · 시작할 때 확인 (아래쪽 예전 업데이트 칸은 옮김)
- Android: GitHub 최신 Release 의 APK 를 받아 SHA256 확인 후 Android 설치 화면으로 (AndroidUpdater, MainActivity.installApk,
FileProvider, REQUEST_INSTALL_PACKAGES). 앱을 끝내지 않고 설치 화면이 이어서 설치. 시작할 때 하루 한 번 자동 확인
- Release 해석: 플랫폼별 설치 파일 (win64.zip / android_arm64.apk), 설명의 SHA256 은 그 파일 이름이 있는 줄에서
- 시험용 --dart-define=JJ_VERSION_OVERRIDE (지금 버전을 낮춰 업데이트 과정 점검)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Android [폴더 열기]: 다른 파일 관리자 (X-plore 등) 가 열려 폴더로 가지 않던 것 → 삼성 내 파일 (그 폴더로 바로) · 시스템 파일 앱 순으로
- MKV 화면: MKV 만들기 옆에 [결과 폴더] (보고 있는 동영상의 jj_mkv 폴더 열기, 아직 없으면 알림)
- 웹 브라우저 버튼: MKV 만들기 옆 → 위쪽 왼쪽 공통 버튼 (MKV 화면 다음, 뒤로 앞). 모든 화면 같은 자리
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 자막 편집기: 폭이 좁으면 위 도구 줄 · 아래 버튼 줄이 화면 밖으로 밀려 설정 · 종료 · 저장 버튼이 안 보이던 것 → 가로로 밀어서 보기
- 플레이어: 같은 폴더 자막이 있어도 mpv 가 켜지 않아 자막 없이 재생되던 것 → 한국어 먼저 자동으로 켬
- 다운로드 목록 안내: Android 는 클립보드를 감시하지 않으므로 Ctrl+C 안내 대신 붙여 넣기 · 브라우저 [다운로드] 안내
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- CP949 등 UTF-8 이 아닌 자막: MKV 만들기 · 자막 편집기 열기가 실패하던 것 (Android 의 FFmpeg 에 iconv 없음)
→ 앱이 UTF-8 사본을 만들어 넘김 (모든 플랫폼 같은 방식)
- 플레이어: CP949 SMI 자막이 보이지 않던 것 → UTF-8 SRT 사본으로 (Android). 'auto' 를 켜진 자막으로 여겨
jj_mkv 자막 (번역 · 받은 자막) 을 자동으로 켜지 않던 것. 같은 자막이 메뉴에 두 번 보이던 것
- 자막 편집기 미리보기: 같은 폴더 자막을 열지 못하면 "영상 재생 오류" 가 뜨던 것
- MKV 만들기 실패 시 0 바이트 MKV 가 남던 것 (시작 전 실패는 전에 만든 MKV 를 그대로 둠)
- AV1 영상 재인코딩 (Android FFmpeg 에 AV1 디코더 없음): "ffmpeg 오류 (코드 69)" 대신 원본 유지 안내
- 임시 파일: 캐시 폴더 → 앱 데이터 폴더 (저장 공간이 모자라면 Android 가 쓰는 중인 임시 파일을 지움)
- [폴더 열기] · 다운로드 폴더 · 외부 브라우저로 열기: Android 에서 아무 동작도 안 하던 것 → 파일 앱 · 기본 브라우저
- 플레이어의 팝업 · 창 크기 · 끌어다 놓기 안내 숨김 (PC 전용), "이 PC" → "이 기기"
- 취소한 다운로드에 속도 · 남은 시간이 남던 것
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 백그라운드: 다운로드 · MKV · AI 작업 중이면 포그라운드 서비스 (진행 알림, 화면 꺼짐에도 계속), 끝나면 내림
- 상태 표시줄: 앱 화면을 시스템 표시줄 아래로 (위쪽 버튼이 시계 · 배터리와 겹치던 것)
- YouTube: 같은 크기면 H.264 먼저 (하드웨어 재생)
- AI 번역 (NLLB): 번역 모델을 여는 순간 1.3~2.3GB 를 써서 Android 가 앱을 강제로 끄던 문제
· 처음 한 번 모델을 외부 데이터 형식으로 바꾼다 (onnx_external.dart): 가중치를 메모리 맵으로
· 디코더 마지막 단계 (lm_head) 를 정수 곱으로: int8 공유 임베딩을 매번 float 1GB 로 풀던 것을
DynamicQuantizeLinear → MatMulInteger 로, 전치한 가중치는 미리 만들어 둠
· 그래프 최적화 끔 (상수 접기가 int8 가중치를 float 로 풀어 커짐), 인코더 · 디코더를 따로 연다
· 태블릿 (4GB) 측정: 최대 2.3GB (강제 종료) → 736MB, 번역 결과 같음 (tool/check_onnx_external.py)
- AI 창 안내 "이 PC" → Android 는 "이 기기"
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- youtubedl-android 0.18.1 (Python · yt-dlp · ffmpeg · aria2c) 을 넣고, MainActivity 가 처음 켤 때 풀어
실행 경로 · 환경 변수를 알려 준다. 받을 때마다 새 yt-dlp 확인 (못 받아도 계속)
- YtDlpBackend · Aria2Backend: 실행 명령 앞 인수 · 환경 변수 · JS 실행기 (deno / quickjs) 를 받게 해 Windows 와 같은 코드로 실행
- 다운로드 엔진은 처음 쓸 때 준비 (앱 시작을 늦추지 않음), 실패하면 다음에 다시 시도
- 기본 위치: 내장 저장소 Download/JJ_MKVMaker. 환경 설정에 다운로드 위치 · YouTube 형식 · 화질 · 쿠키 · 동시 다운로드 수 표시
- R8 keep 규칙 (youtubedl-android 의 Jackson · 압축 풀기 클래스)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 끌어다 놓기를 앱 전체에서 받아 동영상 목록에 추가 (안내 테두리 · 결과 알림)
- 화면 크기 조절 버튼 (70~160%) 과 기본 화면 크기 설정
- MKV 화면: 폴더 열기 버튼, 동영상 목록 오른쪽 클릭 메뉴
- 위쪽 막대가 창 너비에 맞춰 줄어듦 (설정 · 종료 버튼이 밀려나지 않게)
- WebView2 환경을 만들기 전에 COM 을 다시 준비, 실패 결과를 붙들지 않음,
3초마다 COM 상태 확인 (풀려 있으면 다시 준비하고 작업 기록에 남김)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- 버전 표기를 년.월.일_순번 으로 변경 (tool/next_version.ps1)
- 동영상 목록 여러 개 선택 · 정렬, 자막 만들기 / 자막 만들기 & MKV 만들기 /
선택한 파일 재생 일괄 실행
- 다운로드: 동영상 추가 버튼, 완료시 자동 동영상추가, 받은 크기 / 전체 크기,
yt-dlp 진행률 출력 복구 (--no-quiet --progress), 영상 + 음성 진행률 합산
- YouTube 쿠키를 못 읽으면 앱 안 브라우저 쿠키 → 쿠키 없이 순서로 재시도
- 모든 화면 오른쪽 위에 CPU · MEM · DISK, 환경 설정 · 종료 버튼
- 단축키로 창 보이기 / 숨기기 전환, 종료 시간 단축 (exit.log 에 단계별 시간)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>