Commit Graph

300 Commits (dfed3fa6bbad81bb78427116d29b2f666b063b0b)

Author SHA1 Message Date
RyuJongJin 3a220ab073 [MKV 만들기] 와 AI 버튼 구별 · AI 작업 전에 계획 보이기 (138)
[MKV 만들기] 와 [자막 만들기 & MKV 만들기] 를 헷갈려 오래 걸리는 AI 자막이 돌던 것.
- AI 버튼 (자막 만들기 · 자막 & MKV) 은 보라 테두리 · 글자 · ✨ 아이콘, [MKV 만들기] 는 청록 채움 · ▶.
  좁은 화면에서는 AI 버튼을 맨 뒤 구분선 너머로 (넓은 화면은 왼쪽 · 오른쪽으로 원래 떨어져 있음).
- AI 설정 창 맨 위에 계획: 할 일 · 대상 수 · 자막 언어 · 예상 시간 (영상 1시간 ≈ 음성인식 15~30분 + 번역 언어마다 10~20분).
- 환경 설정에서 "매번 묻기" 를 끈 경우는 사용자 설정대로 묻지 않되, 3초 알림
  "AI 자막 (동영상 n개 · 약 m분) 을 시작합니다 [취소]" 뒤에 시작해 잘못 누른 것을 되돌릴 수 있게.
- ai_confirm_test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 03:12:14 +09:00
RyuJongJin 8c1ef5a03b 실패한 다운로드 줄을 쉬운 말로 (136): 진행 막대 대신 실패 · 이유 · [자세히] · [다시 시도]
- 실패하면 진행 막대 ("준비 중…") 를 지우고 사람 말 이유 (화면 언어): 주소에 영상이 없습니다 (404) · 로그인이 필요합니다 (403) ·
  연결할 수 없습니다 · 지원하지 않는 사이트입니다 · 저장 공간이 모자랍니다 · 받지 못했습니다 (그 밖). yt-dlp · aria2 (errorCode) 같은 모양.
- yt-dlp 백엔드는 원문을 저장하고 화면에서 바꾼다. [자세히] 는 원문 - 주소의 서명 · 키 (?… · #… · 아이디:비밀번호@) 는 가림 (redactUrlSecrets).
- [다시 시도] 는 기존 다시 받기. 진행 막대만 쓰는 곳도 실패면 "실패".
- download_error_test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 02:52:57 +09:00
RyuJongJin 26f6389f02 MKV 화면 맨 위 줄: 다른 언어에서 버튼 글이 잘리던 것 (61)
줄이기 순서 (제목 → 버튼 글 → …) 를 정할 때 버튼 너비를 한국어 글로 잰 고정 값으로 셈해, 글이 긴 일본어
("字幕作成 & MKV 作成") 에서는 줄이기 전에 잘렸다 (S10 Ultra 가로). 지금 언어의 글 너비를 재어 차이를 더한다
(한국어는 그대로). 캡처 시험: 실제 서비스로 일본어 1644 · 1480 · 1280 · 1138 · 960, 체크 0 · 50개.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 02:41:14 +09:00
RyuJongJin c986690b3c 환경 설정 > MKV 만들기 > 기본 자막 언어 (MKV 기본 자막 트랙 · 플레이어가 먼저 켜는 자막)
화면 언어 따르기 (처음 값) / 한국어 / English / 日本語 / 中文 / 직접 고르기 (자막 언어 목록).
화면은 일본어인데 한국어 자막을 기본으로 원하는 경우처럼, 고른 언어가 화면 언어보다 먼저.
설정 preferredSubtitleLanguage ('' = 화면 언어 따르기). i18n_small_test 에 시험.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 02:41:14 +09:00
RyuJongJin f429c59502 다국어 작은 것들 (61)
- 영어 복수형: 영어 글에서 수가 1 이면 단수 ("1 videos" → "1 video"). 11 · 21 · 1.5 는 그대로.
- 탐색기 복사 · 이동 확인: 문장 조각 + "복사할까요?" 를 잇던 것을 두 문장으로 (언어마다 어순이 깨졌음).
- MKV 기본 자막 트랙 · 플레이어가 먼저 켜는 자막: 늘 한국어 → 화면 언어 (목록에 없는 언어면 한국어).
- robocopy 진행: 종류 글 ("New File" 등) 이 아니라 탭 모양으로 파일 줄을 알아봐 일본어 · 중국어 Windows 에서도.
- Android 저장소 이름: 내장 · SD 카드는 앱 화면 언어로 (Kotlin 이 isPrimary 를 넘김), USB 등은 기기 이름 그대로.
- 기본 즐겨찾기 ("YouTube 구독" · 표시줄 · 기타): 한국어 열쇠로 저장하고 이름을 바꾸지 않았으면 화면 언어로
  (예전 판이 다른 언어로 저장한 기본 이름 포함). 바꾼 이름 · 사용자 항목은 그대로.
- i18n_small_test · sync_tools_test (일본어 · 중국어 robocopy 줄), 캡처 시험에 일본어 가로 첫 화면.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 02:29:58 +09:00
RyuJongJin f33a4b3547 휴지통 시험: 기본은 가짜 휴지통, 실제 휴지통은 JJ_TEST_REAL_RECYCLE=1 일 때만
전체 시험 도중에 끊기면 사용자 휴지통에 시험 흔적이 남았다 (10/10 01:31).
- 탐색기는 recycle() · restoreRecycled() 를 쓴다 (앱은 늘 실제 휴지통, 시험만 recycleBinForTest 로 바꿈).
- test/support/fake_recycle_bin.dart: 실제와 같은 규칙 (긴 경로 거부 · 되돌릴 때 덮지 않음 · 원래 폴더 없으면 안 만듦),
  다른 드라이브면 복사 후 지움. useTestRecycleBin() 은 JJ_TEST_REAL_RECYCLE=1 이 아니면 가짜로.
- recycle_bin_test 의 실제 휴지통 시험 3개와 긴 경로의 실제 함수 부르기는 실제 모드에서만.
  explorer_conflict · explorer · 캡처 시험 (b3 · check) 은 기본 가짜.
- windows_check_shot_test 의 "65 · 94 · 98" 은 144 뒤로 깨져 있었다 ([그대로 두기] 창을 닫지 않아 다음 크기에서 막힘) - 닫게 고침.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 02:11:38 +09:00
RyuJongJin 5601f9d4fb 화면 글자 검사기가 놓치던 것 잡기 · 찾은 번역 빠짐 고치기 (60)
- tool/l10n: trf( 뒤에서 줄을 바꾼 열쇠도 (앞 200글자까지 봄). tr 로 감싸지 않은 한글 글이 사전에 없으면
  "번역 안 된 글" 로 실패 (tr(변수) 로 쓰이는 글 포함). 일부러 번역하지 않는 자료는 // l10n-skip (줄) · // l10n-skip-file.
- 찾아 고친 것: Rsync 위아래 배치 버튼 "위 → 아래 · 위 ← 아래 · 위 ⇄ 아래", 컴포넌트 "AI 그림" 설명,
  AI 목록의 NVIDIA 라이선스 이름 (받기 화면), 라이선스 화면의 이름 · stable-diffusion.cpp 요약 (화면을 열 때 언어로),
  Android 되돌리기 안내 한 줄, 파일 작업 오류 글 (같은 이름 · 원본 없음 · 자기 안으로 · 쓸 수 없는 이름).
- 자료로 표시: 음성인식 말버릇 목록 (ai_subtitle) · 실제 폴더 이름 · PowerShell 스크립트.
- l10n_check_test: check.py 가 통과하는지, 검사기가 줄 바꾼 trf( · tr(변수) 글을 잡고 skip · raw 는 넘기는지.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 01:39:33 +09:00
RyuJongJin 388d01a0e3 오류 메시지 안쪽을 화면 언어로 (59)
- 컴포넌트 설치 (진행 단계 글 포함) · WebDAV (실패 글 · 상태별 힌트 · 동작 이름) · cron · rsync 설치 · 복사 (rsync · robocopy 종료 코드) ·
  이름 바꾸기 · 설정 복구 · 웹 번역 응답 · 그림 읽기의 오류 글을 tr / trf 로 (번역 3개 언어).
- explainFileError (예전 탐색기 _explain) 는 한국어 글과 화면 언어로 바뀐 글을 둘 다 보고 오류 종류를 가른다.
  WebDAV 실패 글은 상태 번호 앞 빈칸 (" 401") 을 번역에서도 지킨다.
- 컴포넌트 설정의 trStep (한국어 진행 글 앞부분만 번역) 은 할 일이 없어 지움.
- file_error_test: ja 에서 로컬 서버의 401 · 403 · 404 오류 글에 한국어가 없고 종류를 맞게 가르는지
  (시험 바인딩이 HttpClient 를 가짜로 바꾸므로 이 시험에서만 HttpOverrides 를 풂).
- 폴더 이름 "설정 보관" · "AI 모델 보관" 은 예전 보관을 찾아야 하므로 그대로 둔다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 01:11:17 +09:00
RyuJongJin cd81f6db37 라이선스 원문 (175): 네이티브 구성 요소 · 받는 AI 모델의 저작권 줄과 허가 문구를 그 판 그대로
- assets/licenses 에 원문 9개를 더한다 (tool/licenses/fetch_licenses.py 로 상류에서 그 판 그대로 받아 만든다):
  · STABLE_DIFFUSION_CPP_LICENSES: sd.cpp 228c707 과 sd-cli 에 함께 묶인 ggml · libwebp · libwebm · Oniguruma · Darts-clone ·
    utf8proc · nlohmann/json · miniz · stb · zip
  · WHISPER_CPP_LICENSE (v1.9.1) · ONNXRUNTIME_LICENSES (1.15.1, Third Party Notices 포함)
  · 받는 모델: CreativeML OpenRAIL-M (SD1.5) · OpenRAIL++-M (LCM-LoRA) · TAESD · Real-ESRGAN · Whisper 모델 · NLLB (CC BY-NC 4.0)
- 라이선스 화면에 원문으로 등록. AI 그림 받기 화면의 줄마다 [원문], 동의 창에 [라이선스 원문 보기].
- NLLB 를 받는 곳 (AI 자막 · 번역 · 화면 언어 더하기) 에 "비상업적 이용만 허용" 과 [원문].
- SD1.5 licenseUrl 을 원문이 있는 CompVis 저장소로 (사본 저장소의 LICENSE.md 는 없음).
- THIRD_PARTY_NOTICES (Windows · Android) 에 원문 위치. Windows 는 whisper.cpp · onnxruntime 원문을 실행 파일 옆에도.
- licenses_test: MIT 는 Copyright 줄 + "Permission is hereby granted", BSD 는 "Redistribution and use", OpenRAIL 은 부속서 A,
  NLLB 는 NonCommercial 정의까지. AI 목록의 파일마다 원문 asset 이 있는지.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 00:29:19 +09:00
RyuJongJin f331672e3a 진행 표시: 해상도 올리기는 모델을 읽는 동안 숫자 없이 (167) · 큰 파일 하나도 보낸 바이트로 오름 · 끝난 진행 창의 이름 (171)
- 167: sd-cli 의 모델 읽기 막대를 올리기 진행으로 읽어 처음부터 100% 였다. 읽는 동안은 움직이는 막대,
  올리기는 타일 n/m 으로 % 와 "약 n초 남음" (upscaleProgressOf)
- 앱이 직접 복사할 때 항목마다 바이트 크기와 보낸 바이트로 진행률 (이름 바꾸기로 옮기면 파일 수로),
  보내는 동안 0.2초마다 알림 - 큰 파일 하나가 끝날 때까지 0% 에 머물던 것
- 171: 끝난 진행 창의 " 안의 파일" 에 마지막 항목 이름
- 시험: upscaleProgressOf, 256KB 를 256KB/s 로 복사하는 도중 20~100%

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 23:14:31 +09:00
RyuJongJin daac19a514 157 · 162 끝난 작업 알림은 따로 "끝난 작업" 채널로 · [열기] 는 Android 에서 이 앱의 탐색기로
- 157: 끝 알림이 진행 알림 채널 (조용히, 낮은 중요도) 에 올라가 알림 창의 조용한 칸에 묻혔다 -
  새 채널 "끝난 작업" (보통 중요도, 소리 없음, 설정에서 따로 끌 수 있음)
- 162: ExplorerPage.openAt - 이 앱의 탐색기를 그 폴더로 (이미 열려 있으면 그 화면에서, 처음 열면 첫 창으로).
  AI 해상도 끝 알림 · 작업 현황의 [열기] 가 Android 에서 이것을 씀 (Windows 는 Windows 탐색기).
  폴더 메뉴의 "파일 관리자에서 보기" 로 다른 파일 앱도 그대로 열 수 있다
- 시험: openAt 으로 열기 · 열린 채로 다른 폴더

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 23:03:55 +09:00
RyuJongJin cc05fcad3c 174 MKV 화면이 맨 처음 화면이 아니어도 (홈 화면 = 탐색기 등) MKV 아이콘이 "지금 여기"
- 위쪽 아이콘 줄이 MKV 를 맨 처음 화면일 때만 알아봐, 홈 화면이 다른 화면인 사용자는 MKV 화면에서 아무것도 파랗지 않았다
- 다른 화면처럼 MKV 화면이 스스로 알린다 (AppNavButtons onMkvPage)
- 시험: 다른 화면 위에 연 MKV 화면에서 MKV 아이콘이 지금 여기

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 22:52:18 +09:00
RyuJongJin 746082db22 147 좁은 화면의 버튼 줄: 들어가지 않는 버튼은 [더 보기] 메뉴로 · 창 배치 버튼은 늘 줄에 · 처음 값은 자주 쓰는 것부터
- 버튼 줄은 밀어 넘기는 줄이라 아래쪽 버튼 (숨은 항목 표시 등) 을 찾지 못했다 - 들어가는 만큼 보이고 나머지는 [더 보기 ⋯]
- 창 배치 (두 창으로 / 좌우 ⇆) 는 사용자 요청대로 늘 줄에 (넘치면 마지막 자리를 내줌)
- 처음 값 (버튼 구성을 바꾸지 않았을 때 · [기본값]) 순서: 복사 · 이동 · 삭제 · 새 폴더 · 이름 변경 · 선택 · 찾기 · 창 배치 → 나머지.
  사용자가 정한 순서는 그대로
- 시험: 낮은 화면에서 [더 보기] · 메뉴로 숨은 항목 표시 · 창 배치 버튼은 줄에 · 처음 값 순서 · 정한 순서 유지

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 21:52:34 +09:00
RyuJongJin 6a5aea5ff2 135 · 146 · 37-2 같은 폴더로 이동 · 복사는 창으로 알림 · 경로 입력은 칸 아래 오류 · 지워진 폴더는 상위로
- 135: [이동] 을 모두 이미 그 폴더에 있는 것으로 하면 "이미 이 폴더에 있습니다" 창 (짧은 알림은 놓치기 쉬움).
  섞어 고르면 이미 있는 것만 건너뛰고 나머지를 옮김 (확인 창 · 끝난 알림에 "이미 이 폴더에 있어 건너뜀: …").
  [복사] 를 모두 같은 폴더로 하면 "같은 폴더에 사본을 만들까요? (이름 (2))" [취소] / [사본 만들기] (확인 창은 한 번만)
- 146: 경로 입력 창은 없는 경로면 닫지 않고 칸 아래 "폴더가 없거나 열 수 없습니다", 고치면 오류를 지움
- 37-2: 보던 폴더가 밖에서 지워지면 새로 읽을 때 남아 있는 가장 가까운 상위 폴더로, "보던 폴더가 없어져 상위 폴더로 옮겼습니다"
- 시험: explorer_conflict_test (135 · 135 보충 · 146 · 37-2), explorer_parallel_test 의 경로 입력 시험은 창이 열린 채로

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 21:23:29 +09:00
RyuJongJin 6a90ae5706 51 MKV 목록: 동영상 줄을 길게 누르면 오른쪽 클릭과 같은 메뉴 · "목록에서 빼기 (파일은 그대로)"
- 터치 화면에서 길게 누르면 누른 자리에 메뉴 (그 줄 선택, 짧은 진동). 한 번 · 두 번 · 세 번 누르기는 그대로
- 메뉴의 "삭제 (목록에서 제거)" 를 "목록에서 빼기 (파일은 그대로)" 로 - 파일이 지워진다고 오해하지 않게
- AI 자막 만들기 · 인터넷 자막 찾기는 쓸 수 있을 때 (오른쪽 클릭 메뉴와 같은 조건) 나온다
- 시험: 길게 누르기 → 선택 · 메뉴, 한 번 누르기는 메뉴 없음

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 21:02:24 +09:00
RyuJongJin ba332f9f84 E10 · 50 보충: 로컬 폴더를 읽지 못하면 빈 폴더로 보이지 않게 ("읽을 수 없습니다 · 이유" 와 [다시 시도])
- listEntries 가 Directory.list 의 오류를 버려 권한 없는 폴더 · 빠진 USB · 없는 폴더가 빈 폴더로 보였다.
  하나도 읽지 못했으면 그 오류를 던지고, 일부를 읽은 뒤의 오류는 읽은 것까지 보여 준다
- 부르는 다른 곳: [폴더 재생] 은 이유 알림, [MKV 목록에 추가] 는 읽지 못한 폴더를 건너뛰고 알림, 그림 보기는 고른 그림만
- 시험: 빈 폴더 · 없는 폴더 · C:\System Volume Information (권한 없음) - 탐색기에 "이 폴더를 읽을 권한이 없습니다" 와 [다시 시도]

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:52:38 +09:00
RyuJongJin c25a754035 50 Android 가 막은 폴더 (Android/data · obb): 빈 폴더가 아니라 "이 폴더는 Android 가 막아 볼 수 없습니다" · [위 폴더로]
- Android 11 부터 이런 폴더는 오류 없이 빈 목록으로 읽힌다 - 막힌 것이라고 알리고 그 앱의 내보내기 · 공유를 안내
- 다시 해도 같으므로 [다시 시도] 대신 [위 폴더로]
- 시험: file_error_test (경로 판별 · 안내 글)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:52:03 +09:00
RyuJongJin de967d190a 49 탐색기 뒤로 키: 먼저 고른 것 풀기 → 상위 폴더 → 맨 위에서 화면 닫기 (위쪽 ← 는 늘 닫기)
- 탐색기 · Rsync 화면에 PopScope: 시스템 뒤로 (Android 뒤로 키 · 몸짓 · 마우스 뒤로 · Esc) 만 차례를 거친다
- 위쪽 ← 는 브라우저처럼 늘 바로 닫기 (Navigator.pop)
- 시험: 선택 → 뒤로 (풀기) → 뒤로 (상위) → 뒤로 (닫기). 66-2 캡처 시험 (integration_test/windows_662_shot_test) 도 함께

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:29:03 +09:00
RyuJongJin 01600ec69a 66-2 화면 옮기기: 지금 화면 아이콘 파랗게 · 민 쪽으로 미끄러지는 전환 · 처음으로 / 끝 알림 · 브라우저 안내 한 줄 (한 번)
- 지금 화면 아이콘: 넓은 화면도 파란 글자 + 옅은 바탕 (좁은 화면은 바탕 더함)
- 좌우로 밀기 · 이전 · 다음으로 옮길 때만 민 쪽에서 미끄러져 들어옴 (NavSlideTransitionsBuilder, 그 밖은 기본 전환)
- 끝에서 처음으로 넘어가면 "처음으로: …", 처음에서 끝이면 "마지막으로: …", 돌기를 끈 채 끝이면 "마지막 화면입니다" / "첫 화면입니다"
- 웹 브라우저 처음 열 때 위쪽 막대 아래 한 줄 안내 (✕ 로 닫음, browserSwipeHinted) - 알림이면 다른 알림을 뒤로 밀어서 한 줄로
- 캡처 시험: 154 · 155 를 새 화면에서 알림을 지운 뒤 찍음

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 20:16:08 +09:00
RyuJongJin 1450b51316 묶음 3 Windows 확인 캡처 · 휴지통 시험 흔적 스스로 확인 · 꺼내는 드라이브가 비면 "비어 있음"
- integration_test/windows_b3_shot_test: 165 · 48 · 154 · 52 · 148 · 144 를 실제 화면으로 눌러 PNG (JJ_SHOT_DIR)
- 휴지통을 건드리는 시험은 끝에 사용자 휴지통 전체에서 시험 폴더 아래 (하위 포함) 가 원래 위치인 항목이 0 인지 확인
  (test/support/recycle_leftovers.dart)
- 165 보충: 카드 리더 · USB · CD (GetDriveType 2 · 5) 가 열리지 않으면 "연결 안 됨" 이 아니라 "비어 있음" (회색)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 19:55:29 +09:00
RyuJongJin f97f63df79 144 긴 경로 지우기: 휴지통에 넣지 못한 이유는 한 줄 · 이름만 · [그대로 두기] / [영구 삭제 (n개, 되돌릴 수 없음)]
- 휴지통이 받지 않는 긴 경로 (260자 넘음) 는 LongPathException 으로 따로 모아, 실패 창 위에 이유 한 줄과 이름만
- [영구 삭제] 는 그 항목만 지우고 결과를 알림. 긴 경로가 없으면 예전처럼 [확인]
- 시험: 긴 경로 폴더 → 이유 한 줄 · [그대로 두기] 면 남음 · [영구 삭제] 면 지움
- recycle_bin_test: 148 의 "원래 폴더 없음" 시험이 휴지통에 남긴 것을 정확히 그 폴더로 찾아 지우게 (사용자 휴지통에 남던 것)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 19:31:07 +09:00
RyuJongJin e1e3316d8d 탐색기: 이동해도 그 폴더를 고르지 않음 · 148 휴지통으로 보낸 뒤 [되돌리기]
- 드라이브 탭 · 경로로 가기 · 상위 폴더 · .. · [열기] 로 가도 그 폴더를 복사 · 이동 대상으로 잡지 않는다
  (누르거나 표시하지 않은 폴더가 대상이 되지 않게, 위치는 지금 폴더 표시 · 스크롤로)
- 148: 휴지통으로 보낸 알림 (10초) 에 [되돌리기]. 이 사용자 (SID) 의 휴지통에서 보낸 시각 뒤의 $I 를 찾아 $R 을 원래 경로로.
  원래 자리에 같은 이름이 있거나 원래 폴더가 그사이 지워졌으면 되돌리지 않고 알림 (폴더를 다시 만들지 않음)
- 시험: 실제 휴지통으로 되돌리기 · 같은 이름 · 원래 폴더 없음 · 휴지통에 없음, 탐색기 [휴지통으로] → [되돌리기], 상위 폴더 뒤 [복사]

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 19:23:58 +09:00
RyuJongJin 1c919ce8c6 52 복사 · 이동 진행 막대: 화면을 떠났다 돌아와도 다시 보이고, 끝나면 받는 폴더를 새로 읽음
- 화면을 열 때 CopyCenter 에서 아직 도는 작업을 찾아 진행 막대를 다시 붙이고, 끝나면 받는 · 원본 폴더를 새로 읽은 뒤 내린다
  (.jjpart 가 남아 보이지 않게)
- 시험: 속도 제한으로 오래 걸리는 복사 도중 화면을 없앴다가 다시 열기 (수정 전 코드에서는 실패)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 18:57:50 +09:00
RyuJongJin f01fe96151 48 보충: 탐색기를 처음 열면 고른 항목 없음 · 같은 이름 처리 기본값을 환경 설정으로
- 처음 열 때 지금 폴더를 고르지 않는다 (열자마자 폴더 통째가 복사 · 이동 대상이 되지 않게). 바로 [복사] 하면 "복사할 항목을 고르세요"
- 환경 설정 > 파일 탐색기 > 같은 이름이 있을 때: 묻기 (처음 값) · 늘 이름 바꾸기 · 늘 덮어쓰기 · 늘 건너뛰기.
  늘 … 이면 확인 창에 고르는 칸 없이 "환경 설정대로 …" 한 줄

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 18:57:50 +09:00
RyuJongJin 7d76af382d 165 탐색기 첫 열기 멈춤: 드라이브 목록은 GetLogicalDrives (열어 보지 않음) · 드라이브마다 비동기 확인 · 연결 안 됨 ⟳
- 예전: 드라이브 26개를 isDirectorySync 로 열어 봄 → 끊긴 · 느린 NAS 드라이브에서 화면이 멈춤 (이 PC 11,181ms → 2ms)
- 끊긴 드라이브도 숨기지 않고 탭에 "X: · 연결 안 됨 ⟳" - 누르면 다시 연결 (다시 확인), 안 되면 이유
- 네트워크 드라이브는 GetDriveTypeW 로 알아 네트워크 아이콘
- 지난 폴더는 비동기로 확인 (2초 넘으면 열어 보고, 못 읽으면 그 창에 이유)
- 시험: 응답 없는 드라이브가 있어도 첫 화면이 바로 뜬다 · 연결 안 됨 · 다시 연결

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 18:41:05 +09:00
RyuJongJin a878e3b1cc 48 같은 이름 충돌: 덮어쓰기 · 건너뛰기 · 이름 바꾸기 고르기 · 154 · 155 복사 · 이동 대상 규칙과 확인 창의 항목 이름
- 48: 앱이 직접 복사 · 이동할 때 받는 폴더에 같은 이름이 있으면 확인 창에서 고른다 (기본 이름 바꾸기 = 원래 파일 그대로).
  덮어쓰기는 새 파일을 .jjpart 에 다 쓴 뒤에만 옛 파일을 지움, 폴더는 합침. 같은 폴더 · 종류가 다르면 새 이름.
  건너뛰기는 그대로 두고 끝난 알림에 알림. 확인 창은 바로 뜨고 같은 이름은 창 안에서 찾음 (다 찾기 전엔 이름 바꾸기)
- 154 · 155: 확인 창 · 담기 알림에 항목 이름 (앞 3개 + 외 n개), 고른 것이 없으면 "옮길 · 복사할 항목을 고르세요",
  길게 누르기의 다른 창으로 복사 · 이동도 표시한 것 모두
- 시험: explorer_conflict_test · file_ops_test, explorer_webdav_test 는 시험 폴더 드라이브로 고정

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 18:41:05 +09:00
RyuJongJin f34cbe5a69 P0 보충: 되돌리기의 AI 모델 복사 체크는 [저장하고 계속] 때만 설정에 ([취소] 하면 그대로, 건드리지 않으면 자동 유지)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 18:27:25 +09:00
RyuJongJin e4524cdb9a P0 Android 되돌리기: 남는 것 / 사라지는 것을 사실대로 · 두 번 확인 · 받은 AI 모델 복사해 두었다가 되살리기
- 되돌리기 창: 남는 것 (설정 · 목록 · 즐겨찾기 · 공용 폴더 파일) / 사라지는 것 (AI 모델 실제 크기, 비밀번호 · API 키,
  마스터 · 최상 비밀번호, 브라우저 로그인, 작업 기록). 되돌릴 판이 설정 · 모델을 되살리지 못하면 그렇다고 알림.
  [저장하고 계속] 뒤 "정말 되돌릴까요?" 한 번 더. 버전 고르기 문구에 Android 는 앱을 지운다는 줄
- 받은 AI 모델 (ai · 자막 모델) 을 Download/JJ_MKVMaker/AI 모델 보관 에 SHA-256 목록과 함께 복사 (설정 rollbackKeepModels,
  자동 = 남은 공간이 2배 이상이면 켬). 복사 실패하면 앱을 지우지 않고 멈춤. 다시 설치한 앱 (이 판 이후) 이 켜질 때
  SHA-256 을 확인하며 되살리고 사본을 지움 (맞지 않으면 사본을 남김)
- 공용 폴더가 아직 없어도 남은 공간을 상위 폴더로 잰다

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 18:03:47 +09:00
RyuJongJin 1cc2741b16 릴리스 전: 가짜 AI 결과 막기 · S10 해상도 속도 · 예상 시간 (156-2) · 라이선스 (64) · zip 실행 흔적 검사 (166)
- 156-2: sd-cli 는 업스케일러 · 장치를 만들지 못해도 원본을 저장하고 0 으로 끝난다 (앞 판 Android 의 --backend cuda0).
  엔진 기록의 실패 줄 (new_upscaler_ctx failed 등) 과 결과 크기 (정확히 4배 · 그림은 정한 크기) 로 알아채 실패로 알린다
- Android CPU 해상도 올리기: 모든 코어 · 타일 512 (S10 512x384 만화 모델 88~92초 → 45~50초)
- [이 장] 진행 창 · [모든 장] 확인 창에 지난번 걸린 시간으로 "한 장 약 n초" (처리 장치 · 모델별)
- 64: LGPL 원문을 libmpv 이름으로, Android 고지 문서는 APK 에 맞는 내용 (THIRD_PARTY_NOTICES_ANDROID.txt)
- 166: make_layout 이 Logs · *.log · *.dmp 를 빼고, tool/make_zip.ps1 이 zip 목록을 검사 (실행 흔적이 있으면 실패)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 17:11:31 +09:00
RyuJongJin b098a301d8 라이선스 고지 (62 · 63 · 64) · AI 릴리스 전 수정 (152 · 156 · 157 · 159)
- 62 · 63 · 64: assets/licenses 에 GPL-2.0 · GPL-3.0 · LGPL-2.1 원문, PDFium (chromium/7811) 고지,
  yt-dlp THIRD_PARTY_LICENSES (2026.08.19), rsync COPYING (3.5.1). 앱 안 라이선스 화면에 등록 (Android 포함),
  [고지 문서] 를 Android 에서도 앱 안에서 연다. Windows 는 실행 파일 옆 · tools · rsync 에도 둔다.
  고지문: yt-dlp.exe 는 GPLv3+, FFmpeg 9.0.2 · rsync 3.5.1 · FFmpegKit (FFmpeg n8.1.2) 판 번호와 소스 주소,
  LibreOffice · Temurin · H2Orestart 0.7.14, Real-ESRGAN, Android 판 GPLv3 대응 소스 (같은 판 번호의 태그)
- 156: Android 에서 CUDA 장치를 잘못 세던 것 (사진용 모델을 찾음). 자동이면 받아 둔 모델을 쓰고,
  없으면 그 자리에서 만화 · 그림용 / 사진용을 골라 받은 뒤 이어서 올린다
- 157: 모든 장이 끝나면 "n장 저장: 폴더" 와 [열기] (화면 · 작업 현황 · Android 알림 · 작업 기록)
- 159: 프롬프트 · 만든 그림 목록을 설정에 남겨 되살림, 빈 프롬프트는 바로 보이게 알림
- 152: 모델 읽는 동안 지난 남은 시간이 남아 있던 것

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 16:20:15 +09:00
RyuJongJin 300ccdde99 AI 해상도: CPU 에서 자동이 만화용을 고르면 알리고 '사진' 모델로 바꿔 다시 할 수 있게
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 15:45:16 +09:00
RyuJongJin 986688eafa AI 해상도 올리기 (121) · AI 마무리 (150~153) · 받기 범위 확인 · 확인됨 표시
- 121: Real-ESRGAN (BSD-3) x4plus · x4plus anime 6B, 공식 주소 · SHA-256 고정. sd-cli -M upscale 로 4배 → 2 · 3배로 줄임
  · 보기 화면 [AI 해상도 올리기 (이 장 · 모든 장)], 진행 · 취소, [원본 / 올린 것] 비교 → 새 파일로 저장 (덮어쓰지 않음, ZIP 은 옆 폴더)
  · 모든 장은 백그라운드 (작업 알림 · 작업 현황, 남은 장 · 예상 시간)
  · 설정: 모델 (자동 = GPU 면 사진용 · CPU 면 만화용) · 배율 · 형식 · 저장 위치 · 저장한 뒤, 자동 장치는 Vulkan → CUDA → CPU
- 150: 취소는 "취소했습니다" 만 (회색), 실패는 쉬운 한 줄 + 엔진 원문은 [자세히]
- 151: 그리는 · 올리는 동안 쓰는 모델은 지우기를 끔
- 152: 모델 읽는 동안 남은 시간 없음 · 돌아와도 자판이 올라오지 않음
- 153: 지워진 결과 그림은 "파일이 없습니다" · [목록에서 빼기]
- 받기: 206 의 범위 시작이 다르거나 맞지 않는 416 이면 조각을 버리고 처음부터, 받은 파일에 "확인됨" (SHA-256)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 15:31:13 +09:00
RyuJongJin 92556f62ed AI 모델 받기: 이어 받기 · 화면이 꺼져도 계속 · 쉬운 실패 문구 (149) · 진행 · 차례 · 공간 표시 (121 받기 ①②③)
- 149: 받다 만 조각을 남겨 Range 로 받은 곳부터 이어 받고 (SHA-256 은 조각까지 합쳐 확인),
  끊기면 저절로 몇 번 다시 잇는다. 실패는 "연결이 끊겼습니다 · [이어 받기]" 한 줄 (서명 주소는 보이지 않음).
  Android 작업 알림에 받는 진행 (화면이 꺼지거나 다른 앱으로 가도 계속). 라이선스 동의는 한 번만.
- ① % · 받은 크기 / 전체 · 남은 시간, ② 한꺼번에 받을 때 "차례 기다림", ③ 필요한 공간 · 남은 공간을 늘 한 줄로

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 14:58:22 +09:00
RyuJongJin 7d6c653d5f AI 그림 1차 (123) · WebDAV 안내 (133 · 134 · 142 · 143) · 긴 경로 휴지통 보호 · AI 화면 작은 것 (139 · 140 · 141)
- 123: 기기 안 그림 만들기 (stable-diffusion.cpp 228c707, SD1.5 + LCM-LoRA + TAESD)
  · 공식 배포처 · SHA-256 고정, OpenRAIL-M 용도 제한을 보이고 동의 뒤 받기, 공간 확인
  · Windows 실행 파일은 받음 (Vulkan, NVIDIA 면 CUDA 12), Android 는 APK 에 libsdcli.so (tool/build_sdcpp_android.sh)
  · 처리 장치 자동 (짧게 재서 가장 빠른 것), 진행 · 남은 장 · 예상 시간 · 취소, 작업 알림 · 작업 현황
  · 글 → 그림 · 그림 → 그림, 결과는 새 PNG + json (프롬프트 · 시드 · 모델), 보기 화면의 [AI 그림으로]
  · 사용자가 추가하는 서버 · 서비스 (Automatic1111 · ComfyUI · OpenAI 형식), 기기 밖으로 나간다고 늘 알림, API 키는 안전 저장소
  · 컴포넌트 "AI 그림" · 환경 설정 > AI 그림 · 라이선스 고지
- 133 · 134 · 142: WebDAV 를 읽는 곳에서 마스터로 막히면 [마스터 비밀번호 넣기], 서버에 닿지 않으면 알아볼 수 있는 말
- 143: WebDAV 서버 고치기 창에서도 지우기
- 긴 경로 (260자 넘음) 는 휴지통이 받지 않아 Windows 가 묻지 않고 영구 삭제하던 것 - 보내기 전에 막고 이유를 알림
- 139 · 140 · 141: 받을 크기 한 값으로 · 뒤로 버튼 이름 · 시드 칸 이름, 바탕 그림 작은 그림
- Windows 확인용 화면 캡처 시험 (integration_test/windows_check_shot_test.dart)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 14:35:57 +09:00
RyuJongJin 70056b0db3 보안 · 비밀번호 (124 · 127~132) · 쿠키 (53) · http 경고 (56) · 안내 고침 (116 · 125 · 126) · 시험 안정화
- 124: 최상 · 마스터 비밀번호 (솔트 PBKDF2-HMAC-SHA256, 안전 저장소에 해시만), 묻는 때 (안전 저장소),
  저장된 비밀번호를 쓰는 곳의 문 (WebDAV · OpenSubtitles · 재생 · 환경 설정), 최상으로 초기화 · 잊었을 때 초기화,
  틀리면 기다리기, 서버 지우기 전 쓰는 곳 알림, 실시간 동기화 폴더에 WebDAV 고르기
- 127: 서버 고치기 창은 마스터 뒤에 (저장된 비밀번호가 보이지 않게)
- 128: 마스터 창은 하나로 · 취소하면 배경 작업은 묻지 않고 "기다리는 중" 으로 표시
- 129: 묻는 때를 설정 파일이 아니라 안전 저장소에 (값이 없거나 틀리면 쓸 때 묻기)
- 130: Windows secrets.dat 를 쓰기 · 지우기 전에 다시 읽어 다른 창의 값과 합침
- 131: 앱 안 브라우저 쿠키를 쓰지 않게 바꾸면 내보낸 쿠키 파일을 지움
- 132: 최상 비밀번호 [끄기] 가 넓은 화면에서 잘리지 않게
- 53: 쿠키 파일 안내 · 넘길 사이트 고르기 · 쿠키 · 방문 기록 지우기 · 범위 넓힘 알림
- 56: http:// WebDAV 경고 · 인증서 확인 끄기가 다른 재생에 남지 않게
- 116 · 125 · 126: 권한 안내 다시 · "2-1 / 3장" · 바뀐 기본 설정 창을 닫으면 바로 저장
- 시험판 데이터 폴더 (JJ_MKVMAKER_DATA, Windows) · 휴지통 판정을 $I 정보로 · 모니터링 시험 기다림

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 12:22:47 +09:00
RyuJongJin 597d853943 비밀번호 안전 저장 · 동기화 안전장치 · 휴지통 · 시작 메뉴 알림 · 보기 화면 (계속 보기 · 두 쪽 · 회전) · 탐색기 배치 등
- 40/54: WebDAV · OpenSubtitles 비밀번호를 안전 저장소 (Android Keystore · Windows DPAPI) 로
- 95~114: rsync 지우기 확인 · 미리 보기 · 좁은 화면 확인 창 · 실시간 동기화 멈춤 알림
- 99: 시작 메뉴 바로 가기 (AUMID) · jjmkvmaker:// · Windows 알림 꺼짐 안내
- 102: 질문을 설정으로 · 시스템 언어 따르기
- 113 · 117~120: 보기 화면 막대 · 계속 보기 · 두 쪽 나눠 보기 · 회전 · 반전 · 좁으면 ⋮ 메뉴
- 115 · 116: 자동 백업 복원 알림 · 권한 안내와 자동 다시 분석
- 118 · 122: 탐색기 좌우 ⇆ / 위아래 ⇅ 버튼 · 경로로 가면 새로 읽어 펼침

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-09 10:25:08 +09:00
RyuJongJin ec37fa28e4 MKV 화면: 좁은 화면에서도 변환 설명 · '원본보다 커서' 경고 보이기
근거: 감독 세션 지시 31번 (7번은 필요 없는 경고를 없애라는 것, 이 경고는 필요한 것).
- 좁은 화면 (폰 세로 · 접은 폴드) 의 변환 설정 줄에서 빠지던 설명 · ⚠ 경고를 한 줄을 다 써서 보여 줌 (말줄임 없이)
- 화면 · 색 보정을 켜도 ⚠ 경고가 함께 보이게 (보정 요약이 경고를 가리던 것)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 23:57:57 +09:00
RyuJongJin 3dba07dd62 설정 파일: 안전하게 저장 · 깨지면 백업으로 되살리고 알림
근거: 감독 세션 지시 20번 (설정 파일을 읽다 실패하면 말없이 모든 설정을 처음 상태로 켜고, 무엇이든 바꾸면 원래 설정이 영영 사라짐).

- 저장: settings.json.tmp 에 다 쓴 뒤 바꿔치기 (쓰는 도중 앱이 끝나도 깨지지 않게), 한 번에 하나씩.
  바꿔치기 전의 정상 파일은 settings.json.bak.
- 읽기 실패: 깨진 파일은 settings.broken-(시각).json 으로 보관 (다음 저장에 덮이지 않게), .bak 으로 되살림.
  settings.json 만 없으면 (바꿔치기 도중 끝남) .bak 으로. 백업도 없으면 처음 설정.
- 켤 때 알림 창 (Windows · Android): 백업으로 되살렸는지 / 처음 설정인지, 보관한 파일 위치, 원인. 작업 기록에도.
- 시험: settings_store_test (바꿔치기 · .bak · 깨진 파일 · 백업 없음 · .bak 만 있음).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 23:54:30 +09:00
RyuJongJin 951a1c927c MKV 화면 · 맨 위 줄 · 브라우저 주소 · 재생 버튼 · 브라우저 소리 설정 · 정리 창 체크
근거:
- 감독 세션 지시 (폰 · S10 Ultra 를 사용자처럼 써 본 결과) 2 · 3 · 4 · 7 · 8 · 9 · 13 · 15번
- 사용자 결정 (10/8): 브라우저 소리 멈춤을 설정으로 (기본 켜짐), 정리 창은 임시 · 받다 만 다운로드만 미리 체크

- 2: 좁은 화면 MKV 화면 둘째 줄은 글자를 숨기지 않고 옆으로 밀어 봄, [MKV 만들기] 맨 앞.
     변환 설정 줄은 줄바꿈 ([화면 · 색 보정] 이 세로에서 안 보이던 것).
- 3: 좁은 화면 맨 위 줄: 이동 아이콘 아래 짧은 이름 (홈 · MKV · 브라우저 · 탐색기 · Rsync · 다운로드 · 뒤로),
     [환경 설정] 옆에는 ⋮ 메뉴 (화면 크게 · 작게 · 기본 크기 · 종료) - 종료가 설정 바로 옆이라 잘못 누르던 것.
- 4 · 15: 브라우저 주소 칸이 좁으면 (폰 세로 · 태블릿 세로 · 폰 가로) 홈 · 번역 · 즐겨찾기 · 작업 현황 · 외부 브라우저를
     ⋮ 메뉴로 (없애지 않음). 주소가 "http" 만 보이거나 사라지던 것.
- 7: Android 에서 "탐색기에서 끌어다 놓아도" 안내 뺌. 켤 때 "⚠ 사용할 수 없는 코덱" 기록 뺌 (코덱 목록에 "(사용 불가)" 로 보임).
- 8: 좁은 화면에 동영상이 없으면 한 화면에 안내 + [동영상 추가].
- 9: Android 재생 화면 버튼 크게, 재생 버튼 줄과 나머지 줄을 나눔.
- 13: 넓은 화면의 동영상 목록 칸을 화면 너비의 40% (320~640) 로 - 태블릿 세로에서 제목이 앞부분만 보이던 것.
- 사용자 결정: 환경 설정 > 웹 브라우저 "다른 화면으로 가면 페이지 소리 멈춤" (기본 켜짐).
- 사용자 결정: 저장 공간 정리 창은 작업 임시 파일 · 받다 만 다운로드만 미리 체크.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 23:36:21 +09:00
RyuJongJin fead23ce2f 파일 탐색기: 폰 한 창 · 한 번 누르면 실행 · 경로 이름 · 권한 · WebDAV 오류 안내 · 첫 화면 바로
근거: 감독 세션 지시 (폰 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>
2026-10-08 23:23:48 +09:00
RyuJongJin b39678f8f6 Android 화면 방향: 기본 자동 (가로 고정 강제 없앰)
근거: 사용자 지적 ("가로 · 세로를 왜 막았나, 지시한 적 없다") + 감독 세션 지시.
예전 결정 (bf6429d · bca0c04, 내 판단 - 사용자 지시 없음): "데스크톱 화면이니까" 시작할 때 가로 고정을 강제하고
기본값 · 모르는 값도 가로 고정으로 해 휴대폰 · 태블릿의 세로 보기를 막았다.

- 시작할 때 가로 고정 강제 (runAndroid) 삭제
- 기본값 auto, 값이 없거나 틀리면 auto
- 예전 설정 파일 (orientationV2 없음) 의 가로 고정은 사용자가 고른 값이 아니므로 한 번 auto 로
- applyScreenOrientation: 모르는 값은 기기 방향 따라 (빈 목록)
- 환경 설정 > 화면 방향: 자동 (기본) · 가로 고정 · 세로 고정
- 시험: player_test 화면 방향

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 22:08:15 +09:00
RyuJongJin 70e2b87c11 문서 미리보기 컴포넌트 · 컴포넌트 설치 · 브라우저 위아래 · 화면 순서 버튼
- 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>
2026-10-08 16:18:50 +09:00
RyuJongJin ac8fd8ad9a 이미지 · PDF · ZIP 보기 (컴포넌트 "viewer")
- 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>
2026-10-08 15:24:47 +09:00
RyuJongJin 6eb0dfc70a 컴포넌트 · 화면 순서 · 좌우로 밀어 화면 이동 · 알림 아이콘
- 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>
2026-10-08 14:37:24 +09:00
RyuJongJin 2553107aa5 좁은 화면 (접은 폴드 · 휴대폰 세로) 배치 정리
- AppTopBar: 폭 720 미만이면 위쪽 막대를 두 줄로 (위: 화면 이동 · 화면 크기 · 설정 · 종료, 아래: 화면의 도구).
  모든 화면 (MKV · 브라우저 · 탐색기 · Rsync · 모니터링 · 다운로드 · 설정 · 플레이어 · 자막 편집 · 작업 현황 · 즐겨찾기) 에 적용.
  접은 폴드에서 설정 · 종료 버튼이 화면 밖으로 밀려 누를 수 없던 것.
- MKV 화면: 좁으면 목록 위 · 자세히 보기 아래, 변환 설정 줄은 옆으로 밀어 보기, 자막 버튼은 줄바꿈.
- 대화 상자 37개: 내용이 화면보다 길면 스크롤 (가로 폴드에서 버튼이 내용과 겹치던 것).
- SettingTile: 좁은 화면에서 설정 줄의 고르기 상자 · 입력 칸을 설명 아래로.
- 다운로드 도구 줄 옆으로 밀어 보기, 빈 목록 안내 글 여백.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 14:10:04 +09:00
RyuJongJin 44ae09a31f 플레이어: 건너뛴 뒤 다음 편으로 넘어가던 것 · 지운 WebDAV 서버를 보던 창
- 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>
2026-10-08 13:42:47 +09:00
RyuJongJin b3707e2ce5 WebDAV 동영상: 받지 않고 바로 스트리밍 재생
- 플레이어 (mpv) 에 주소 + 인증 헤더로 넘김 (자체 서명 인증서면 tls-verify=no), 건너뛰기는 서버 Range 요청
- 같은 폴더 동영상으로 재생 목록, 같은 폴더 자막은 작으니 임시로 받아서
- 외부 플레이어 · VLC · 기본 프로그램에는 아이디를 넣은 주소로
- 탐색기의 "이 폴더의 동영상 재생" 도 WebDAV 에서

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 12:12:53 +09:00
RyuJongJin 8f779fa7e6 WebDAV: 파일 탐색기 · Rsync 화면 · lsync 에서 연결 · 복사 · 동기화
- 환경 설정 > 파일 탐색기 > 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>
2026-10-08 11:30:54 +09:00
RyuJongJin 0cf7a9a7b7 업데이트: 올려 둔 모든 버전 중 골라 설치 (예전 버전으로 되돌리기) · Rsync 화면 · 모니터링 개선 · 두 번째 실행 충돌 수정
- 설정 [업데이트 · 버전 고르기]: 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>
2026-10-08 09:05:45 +09:00
RyuJongJin 1ac48354af rsync 원본 파일 지우기 (--remove-source-files) · 빈 폴더 정리 · lsync 최종 정리
- 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>
2026-10-05 21:47:20 +09:00
RyuJongJin c273297b11 Rsync 화면 (파일 탐색기 옆) · 파일 탐색기에서 모니터링 · rsync · lsync 빼기
- 위쪽 파일 탐색기 옆 [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>
2026-10-05 18:28:32 +09:00
RyuJongJin 9ce55bbb74 복사 · 이동 시작 전 확인: 없는 원본 · 없는 대상 · 폴더를 자기 안으로 · 같은 폴더로 이동
- 다른 곳에서 지워진 폴더 (탐색기 목록에는 남아 있던 것) 를 복사 · 이동하면 rsync 오류 대신 알리고 목록을 새로 고침
- 폴더를 자기 자신 (또는 그 안) 으로 복사 · 이동하는 것을 막음 (현재 방식만 막고 있었고 rsync 는 막지 않았음)
- 모니터링의 실행 · 재개도 같은 확인: 시작하지 않고 실패와 이유를 남김

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 14:08:53 +09:00
RyuJongJin c5a44f2f3f 폴더 선택 = 자기 자신과 안의 것 전체 · rsync 앱에 내장 (Windows · Android)
- 선택 모드: 폴더를 누르면 자기 자신과 안의 파일 · 폴더 모두 선택 (펼쳐서 ✔), 다시 누르면 모두 취소.
  고른 폴더 안의 항목 하나를 누르면 그것만 빠지고 나머지는 고른 채로
- 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>
2026-10-05 13:57:59 +09:00
RyuJongJin 967b729e50 Android 브라우저 점검 수정: 뒤로 키 · 알림 · 백그라운드 복귀 화면
- Android 뒤로 키: 앞 웹 페이지가 있으면 웹 페이지 뒤로 (위쪽 ← 화면 이동은 그대로 브라우저 닫기)
- 실행 취소 · 목록 보기 · 허용 알림이 사라지지 않던 것 (Flutter 3.47 부터 action 이 있으면 기본 persist) → persist: false
- 웹뷰를 텍스처로 그림 (useHybridComposition: false): 백그라운드로 실행 중 앱을 밀었다가 다시 열면
  Impeller "EGL Bad Access" 로 앱 화면이 비던 것

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 12:51:14 +09:00
RyuJongJin fa0b7e56b2 백그라운드로 실행 · 다시 켤 때 동기화 (바로 / 골라서 / 시작 안 함)
- 설정 > 파일 탐색기 > 실시간 동기화 (모니터링 > lsync 위에도): [백그라운드로 실행], [앱을 다시 켤 때 동기화]
- Windows: 백그라운드로 실행 = 창 ✕ 를 누르면 트레이로 (종료 동작 설정과 같은 값), 끄면 닫을 때 종료
- Android: 켜면 ← · 최근 앱에서 밀어도 Dart 엔진을 살려 두고 (엔진 캐시) 동기화 · MKV 만들기 · 다운로드 계속,
  작업 알림 서비스가 동기화를 지켜보는 동안에도 유지 (Android 14+ specialUse), [종료] 는 프로세스까지 끝냄
- lsync: 이번 실행 동안 멈춤 / 시작, 모두 멈춤 / 모두 시작, 켤 때 고르기 창

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 11:53:20 +09:00
RyuJongJin b38253fd67 복사 모니터링 · 복사 기억 · lsync 일정 (cron + 격자 편집)
- 설정 [복사 모니터링] 켜면 파일 탐색기 가운데에 [모니터링] 버튼
- 복사 · rsync 탭: 복사 대상 기억, 진행률, 대상 디스크 용량, 옵션 고치기 → 저장 후 현재 유지 / 설정 반영 후 실행, 실행 · 재개 · 취소 · 지우기, lsync 로 이동
- lsync 탭: 맞출 파일 자동 표시, 지금 맞추기, 복사 · rsync 로 이동
- 동기화 시간: 계속 / cron 시간 창 (요일 × 시 격자로 칠해서 편집)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 11:16:05 +09:00
RyuJongJin 7308f8ce1b 파일 탐색기: 복사 · 이동 방법 (현재 방식 · rsync · robocopy), 속도 제한, 실시간 동기화, 아래 진행 막대
- 환경 설정 > 파일 탐색기: 파일 / 폴더 복사 방법, 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>
2026-10-05 10:38:09 +09:00
RyuJongJin 626117995d 파일 탐색기: 폴더 한 번 누르기 = 펼치기, 선택 모드 (X-plore 처럼)
- 폴더는 한 번 누르면 바로 펼치기 · 접기 (오른쪽 파일 목록은 들어가기). 두 번 누르기는 파일만
- 선택 동그라미는 평소 숨기고 선택 모드에서만 (✔ 표시). 가운데 [선택] 버튼 · 길게 누르기 메뉴 [선택] · Ctrl + 클릭으로 시작
- 선택 모드에서 누르기: 파일은 선택 · 취소, 폴더는 처음엔 선택, 고른 폴더를 다시 누르면
  폴더는 풀고 펼쳐서 안의 파일 · 폴더를 모두 선택
- 아래 막대: n개 표시함 · 모두 선택 · 표시 지우기 · 선택 끝. 복사 · 이동 · 삭제가 끝나면 선택 모드도 끝
- 화면을 닫은 뒤 끝난 파일 작업이 닫힌 창을 다시 그리려던 오류 수정
Android 태블릿 (Galaxy Tab S6 Lite) 에서 확인.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 09:43:28 +09:00
RyuJongJin 35ca463287 파일 탐색기: 어느 배치에서나 복사 · 이동 → 붙여넣기
"폴더 + 파일 목록" · 한 창 배치에서는 복사 · 이동이 막혀 있었다 (다른 창이 없음).
길게 누르기 메뉴 · 버튼의 [복사] · [이동] 으로 담아 두고, 넣을 폴더에서 [붙여넣기] (메뉴 · 버튼).
두 창은 지금처럼 "다른 창으로 복사 · 이동" 도 그대로. 붙여넣은 폴더는 펼쳐서 새 항목이 바로 보인다.
Android 태블릿 (Galaxy Tab S6 Lite) 에서 확인.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 08:48:56 +09:00
RyuJongJin a485d0d997 파일 탐색기: 한 번 = 선택 · 두 번 = 실행, 스타일 (X-plore · Windows 탐색기 · Total Commander), 폴더 + 파일 목록 배치
- 환경 설정 > 파일 탐색기: 누르기 (한 번 선택 · 두 번 실행 (기본) / 한 번 바로 실행), 스타일, 창 배치
- 선택 모드: 폴더는 고르기만 (› 화살표로 펼치기), 두 번 누르면 펼치기 · 실행, Ctrl + 클릭 = 여러 개 고르기,
  길게 누르기 · 오른쪽 클릭 = 기능 메뉴. 표시 동그라미는 두 번 누르기를 기다리지 않고 바로
- 스타일: X-plore (썸네일 · 두 줄), Windows 탐색기 (컬러 아이콘 · 이름 / 수정한 날짜 / 유형 / 크기 열),
  Total Commander (촘촘한 줄 · [폴더] · 확장자 / <DIR> / 날짜 열)
- 창 배치 "폴더 + 파일 목록": 왼쪽 폴더 트리, 오른쪽 고른 폴더의 내용 (맨 위 ".." = 상위 폴더, 두 번 누르면 들어가기)
- 모양 · 배치가 바뀌면 보던 폴더로 다시 스크롤

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 08:25:46 +09:00
RyuJongJin aa9c431a47 파일 탐색기: 복사 · 이동 확인 문구의 '?:' 정리
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 07:55:33 +09:00
RyuJongJin 058a57e558 파일 탐색기: 창 배치를 바꾼 뒤에도 보던 폴더가 보이게 (Android 태블릿에서 확인)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 05:47:15 +09:00
RyuJongJin 99024d3c6e 파일 탐색기 (X-plore 참고): 두 창 트리 · 가운데 기능 버튼 · 창 배치 · 버튼 구성
- 위쪽 공통 버튼에 [파일 탐색기], 환경 설정 > 홈 화면에 "파일 탐색기" (앱을 켜면 바로)
- 두 창 (트리: 누르면 그 자리에서 펼치기 · 접기), 저장 장치 고르기 (Windows 드라이브 · Android 저장소)
- 동영상: 누르면 기본 동작 (내장 플레이어 또는 확장자별 재생 프로그램), 길게 누르기 · 오른쪽 클릭 메뉴
  (내장 플레이어로 재생 · 다른 앱으로 열기 · MKV 목록에 추가 · 이름 변경 · 복사 / 이동 · 삭제 · 정보)
- 썸네일 · 해상도 · 길이 (작업 중에는 썸네일을 만들지 않음), 그림 파일 미리 보기
- 가운데 버튼: 상위 폴더 · 새로 고침 · 재생 · MKV 목록에 추가 · 새 폴더 · 이름 변경 · 복사 · 이동 · 삭제 ·
  찾기 · 정렬 기준 · 숨은 항목 · 내역 · 창 배치 · 버튼 구성
- 창 배치: 두 창 / 한 창, 좌우 / 위아래 / 화면 모양 따라, 버튼 줄 두 창 사이 / 끝 / 숨김
- 버튼 구성: 보일 버튼 · 순서
- 다른 앱으로 열기: Windows "연결 프로그램" 창 · Android 앱 고르기 (FileProvider, SD 카드 포함)
- 여러 개 지울 때 확인 창에 이름 · 폴더를 보여 준다

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 04:14:05 +09:00
RyuJongJin ed9f00118c Android 업데이트: 설치 허용이 꺼져 있으면 [설치 계속] 으로 받은 파일 그대로 설치
"이 출처의 앱 설치 허용" 설정 화면을 연 뒤 "다시 [업데이트]" 로 끝나
허용하고 돌아오면 같은 APK (약 90MB) 를 처음부터 다시 받아야 했다.
설치 허용 필요 (PERMISSION) 를 따로 알려, 돌아와 [설치 계속] 을 누르면 받은 파일로 바로 설치한다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 03:12:45 +09:00
RyuJongJin 81d6e6afa3 업데이트 확인: 다른 버전이 남긴 확인 기록이면 다시 확인 · 결과를 작업 기록에
같은 PC 에서 설정 파일을 같이 쓰는 새 버전 (개발 빌드 등) 이 "확인함" 을 남기면
옛 버전 (Windows 배포 폴더) 이 20시간 동안 확인을 건너뛰어 10월 1일 판에 머물렀다.
확인한 버전 (lastUpdateCheckVersion) 을 함께 저장해 지금 버전과 다르면 바로 확인한다.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-05 02:49:32 +09:00
RyuJongJin be0c08834d 웹 브라우저: 페이지 자동 번역 · JavaScript 끄기 (환경 설정 > 웹 브라우저)
- 웹 페이지 자동 번역 (기본 끔): 다른 언어 페이지를 화면 언어로 (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>
2026-10-05 01:58:53 +09:00
RyuJongJin 758eb41d72 노란 앱 아이콘 (노랑·검정 두 색) 추가 및 환경 설정에서 앱 아이콘 고르기
- 아이콘 5종: 노랑(기본) · 검정 · 필름+JJ · 필름 · 처음 아이콘(파랑)
- Android: 아이콘마다 activity-alias, 중계 LauncherActivity 로 바꿔도 앱 화면 유지
- Windows: 창 · 작업 표시줄 · 트레이 아이콘, 앱 안 홈 버튼도 고른 아이콘으로

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 23:47:00 +09:00
RyuJongJin 8fec4ae091 앱 안 홈 버튼: 작아도 또렷한 노란 JJ 아이콘 (런처 아이콘과 같은 색감)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 22:53:38 +09:00
RyuJongJin e3282c2c38 Android 파일 · 폴더 고르기: [닫기] 는 어느 폴더에서든 바로 닫기 (뒤로 가기 키는 위 폴더로)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 21:23:04 +09:00
RyuJongJin 4257b97305 Android 폴더 고르기: [이 폴더 선택] 왼쪽에 [폴더 만들기] (지금 폴더 아래에 만들고 그 폴더로)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 21:17:37 +09:00
RyuJongJin d7efce87a6 이동 버튼 여러 개 (표시 이름 · 폴더, 환경 설정 > MKV 만들기), 세부 정보 오른쪽 아래에 표시 이름으로 위로 쌓기. 예전 이동 폴더는 '이동' 버튼으로
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 20:52:11 +09:00
RyuJongJin ad01fd5671 Android 작업 알림을 누르면 작업 현황 화면, 위쪽 작업 표시에 진행률 · 누르면 작업 현황, 앱 화면은 하나만 (singleTask). AI 음성인식 중 취소가 바로 먹히게 (whisper abort, Android 태그 포인터)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 20:18:27 +09:00
RyuJongJin 98122539e7 전체 점검에서 고침: 다시 켜면 전에 만든 자막 (jj_mkv) 다시 연결, Android 16 태블릿에서 화면 방향 고정 동작, 목록 머리글 한 줄, '이 기기에서' 띄어쓰기
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 19:18:56 +09:00
RyuJongJin 52deef4118 환경 설정: 위쪽 묶음 버튼으로 화면 밖 묶음 (다운로드 등) 에도 이동, 묶음 버튼 줄은 위에 고정
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 18:36:55 +09:00
RyuJongJin d4ab2f87b7 환경 설정 > 저장 공간 정리: 작업 임시 파일 · 받다 만 다운로드 (.part 등) · 받다 만 AI 모델 · 업데이트 남은 파일 · 지난 기록 (진행 중인 것은 건너뜀). AI 자막 임시 폴더가 남던 것 수정
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 18:09:31 +09:00
RyuJongJin 31a4672971 MKV 완료 메시지는 이번 작업 기준, 목록 머리글 한 줄, 큰 화면에서 화면 · 색 보정 창 크게
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 16:12:28 +09:00
RyuJongJin 1410dad2aa MKV 만들기: 화면 비율 (가로 16:9 · 세로 9:16 · 1:1 · 4:5, 채우기 · 맞추기 · 흐린 배경) · 회전 · 색 보정 (밝기 · 대비 · 채도 · 색온도), 미리보기 창
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 15:19:35 +09:00
RyuJongJin 6184b6ea71 환경 설정: 묶음별 정리 (일반 · 화면 · MKV 만들기 · 자막 · 재생 · 웹 브라우저 · 다운로드 · 실행 · 정보) + 맨 위 바로가기
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 14:54:02 +09:00
RyuJongJin 7df26039c9 화면 언어: 한국어 · English · 日本語 · 简体中文, 언어 추가 (AI 자동 번역) · 삭제, 바꾸면 화면 전체가 바로 그 언어로
- 모든 화면 글자를 tr() / trf() 로 (한국어 원문이 사전 열쇠), assets/l10n 에 영어 · 일본어 · 중국어 사전
- 더한 언어는 이 기기의 NLLB 번역 모델로 영어 사전을 자동 번역해 설정 폴더 l10n 에 저장
- 언어 이름 · 선택 목록 · 모델 이름은 화면에 보일 때 번역 (파일명 인식 규칙은 그대로)
- tool/l10n: 새 글자 감싸기 · 사전 점검

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 14:13:02 +09:00
RyuJongJin 9a0d361565 웹 브라우저: YouTube 광고 자동 건너뛰기 · 광고 배너 숨기기 (환경 설정에서 켜기 · 끄기)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 13:46:22 +09:00
RyuJongJin fb92349176 MKV 목록: 선택 0개면 보고 있는 동영상만 만들기, [이동] 버튼 · 세 번 누르면 이동, 이동 폴더 설정
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 13:43:48 +09:00
RyuJongJin bca0c04459 다운로드 알림 [✕] 닫기 · Android 화면 방향 설정 (가로 고정 · 세로 고정 · 자동)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 13:17:25 +09:00
RyuJongJin 14b2489938 다운로드 알림: 준비가 끝나면 닫힘, 화면을 오간 뒤에도 '목록 보기' 동작 (다운로드 목록은 열린 화면으로 돌아가기)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 13:02:50 +09:00
RyuJongJin 8c03efd489 웹 브라우저: MKV 화면과 오가도 보던 페이지 · 세션 · 뒤로 가기 기록 유지 (앱을 새로 켤 때까지)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 09:17:59 +09:00
RyuJongJin 07ec8cd4a5 웹 브라우저: 다른 화면으로 가면 페이지의 동영상 · 소리 멈춤
브라우저에서 [다운로드] → 목록 보기 (또는 플레이어 · 설정 등) 로 가면 가려진 브라우저에서
YouTube 가 계속 재생되어 소리만 났다. 브라우저 위에 다른 화면이 올라오면 (RouteAware.didPushNext)
페이지의 video · audio 를 멈춘다 (WebNav.pauseMedia, Edge · Chrome · Android 웹뷰 공통).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 04:49:33 +09:00
RyuJongJin 39f65f414c 웹 브라우저 버튼: 열려 있는 브라우저로 돌아가기
브라우저에서 [다운로드] → "목록 보기" 로 다운로드 목록에 간 뒤 위쪽 [웹 브라우저] 를 누르면
새 브라우저가 홈 주소로 열려 보던 페이지를 잃었다. 이미 열린 브라우저가 있으면 그 화면까지 돌아간다 (BrowserPage.open).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 04:38:29 +09:00
RyuJongJin 6c15f74e72 Android: 동영상 연결 프로그램 · 공유
- 파일 앱 "다음으로 열기" · 다른 앱의 동영상 열기 (VIEW video/*) 와 공유 (SEND · SEND_MULTIPLE) 에 JJ_MKVMaker
- content:// 주소를 실제 파일 경로로 (저장소 문서 ID · MediaStore _data · 경로 조각 + 크기 확인) → 옆에 MKV 를 만들 수 있게
- 설정 "다른 앱에서 동영상을 열 때": 바로 재생 (기본, MKV 목록에도 추가) / 편집 목록에 추가. 앱이 꺼져 있을 때 · 켜져 있을 때 모두
- 실제 경로를 알 수 없는 앱에서 온 것은 재생만 하고 안내

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 04:28:23 +09:00
RyuJongJin 519877105c Android: 외장 SD 카드 · USB 메모리 선택
- 앱 안 파일 고르기: 바로 가기에 저장소 (내장 · SD 카드 · USB) 를 보이고, 그 안에서 폴더 이동 · 위로 가기
- 설정 > 저장 위치 (MKV · 자막, 다운로드): Android 는 앱 안 폴더 고르기 (SD 카드 폴더를 실제 경로로)
- [폴더 열기] · [결과 폴더]: SD 카드 경로도 파일 앱으로 (문서 ID XXXX-XXXX:경로)
- MainActivity.storageVolumes: StorageManager 의 연결된 저장소 목록

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 03:44:08 +09:00
RyuJongJin 18d003f392 설정 맨 위: 프로그램 정보 · 최신 버전 확인 (Windows · Android), Android 업데이트
- 환경 설정 맨 위에 지금 버전 · [최신 버전 확인] · 시작할 때 확인 (아래쪽 예전 업데이트 칸은 옮김)
- 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>
2026-10-03 03:31:30 +09:00
RyuJongJin 7a34bedbb6 폴더 열기 · 결과 폴더 버튼 · 웹 브라우저 버튼 위치
- Android [폴더 열기]: 다른 파일 관리자 (X-plore 등) 가 열려 폴더로 가지 않던 것 → 삼성 내 파일 (그 폴더로 바로) · 시스템 파일 앱 순으로
- MKV 화면: MKV 만들기 옆에 [결과 폴더] (보고 있는 동영상의 jj_mkv 폴더 열기, 아직 없으면 알림)
- 웹 브라우저 버튼: MKV 만들기 옆 → 위쪽 왼쪽 공통 버튼 (MKV 화면 다음, 뒤로 앞). 모든 화면 같은 자리

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 02:15:04 +09:00
RyuJongJin 4cf2ac29ee 휴대폰 (Galaxy Z Fold6 커버 화면) 점검에서 찾은 문제 수정
- 자막 편집기: 폭이 좁으면 위 도구 줄 · 아래 버튼 줄이 화면 밖으로 밀려 설정 · 종료 · 저장 버튼이 안 보이던 것 → 가로로 밀어서 보기
- 플레이어: 같은 폴더 자막이 있어도 mpv 가 켜지 않아 자막 없이 재생되던 것 → 한국어 먼저 자동으로 켬
- 다운로드 목록 안내: Android 는 클립보드를 감시하지 않으므로 Ctrl+C 안내 대신 붙여 넣기 · 브라우저 [다운로드] 안내

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 01:46:53 +09:00
RyuJongJin acf82dc323 휴대폰 가로 화면: 작업 기록 창 높이를 화면 높이에 맞춤 (목록 · 자세히 보기를 가리던 것)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-03 01:16:32 +09:00
RyuJongJin 4592dc7943 Android 전체 기능 점검에서 찾은 문제 수정
- 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>
2026-10-03 00:59:01 +09:00
RyuJongJin 752e4da999 Android: 백그라운드 작업 · 상태 표시줄 · H.264 우선 · AI 번역 메모리 (4GB 기기에서 앱이 꺼지던 문제)
- 백그라운드: 다운로드 · 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>
2026-10-02 23:17:30 +09:00
RyuJongJin 0160c7591d Android 다운로드: 앱 안 브라우저 [다운로드] · 다운로드 목록 (yt-dlp · aria2c)
- 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>
2026-10-02 21:36:15 +09:00
RyuJongJin bf6429dc76 Android 판 (APK): FFmpeg (ffmpeg-kit) 로 MKV 만들기, 앱 안 파일 고르기, 저장소 접근 권한, Windows 전용 설정 숨김
- 플러그인 사본: flutter_inappwebview_android (AGP 9 빌드 오류), ffmpeg_kit_flutter_new_min_gpl (Android 만), whisper_ggml (같은 FFmpeg 사용)
- 64비트 ARM 만, 배포 키 서명 (android/key.properties, 저장소에 올리지 않음)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 12:46:08 +09:00
RyuJongJin 2713517456 v2026.10.01_003: 즐겨찾기 폴더 · 관리자, 모든 화면 공통 이동 버튼, MKV 전체 만들기 확인, 내장 Chrome 엔진 (선택)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-01 20:51:05 +09:00
RyuJongJin 996dd44cb5 v2026.09.30_002: 모든 화면 끌어다 놓기, 화면 크기 조절, 브라우저 COM 오류 수정
- 끌어다 놓기를 앱 전체에서 받아 동영상 목록에 추가 (안내 테두리 · 결과 알림)
- 화면 크기 조절 버튼 (70~160%) 과 기본 화면 크기 설정
- MKV 화면: 폴더 열기 버튼, 동영상 목록 오른쪽 클릭 메뉴
- 위쪽 막대가 창 너비에 맞춰 줄어듦 (설정 · 종료 버튼이 밀려나지 않게)
- WebView2 환경을 만들기 전에 COM 을 다시 준비, 실패 결과를 붙들지 않음,
  3초마다 COM 상태 확인 (풀려 있으면 다시 준비하고 작업 기록에 남김)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 22:28:00 +09:00
RyuJongJin 1ba49ffa8d v2026.09.30_001: 일괄 작업, 다운로드 진행률 · 쿠키 재시도, 상태 표시
- 버전 표기를 년.월.일_순번 으로 변경 (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>
2026-09-30 21:31:07 +09:00
RyuJongJin c05a657756 JJ_MKVMaker v1.0.0
동영상 + 자막 → MKV, 자막 편집 · AI 자막 · 번역, 플레이어,
웹 브라우저 · 다운로드 (yt-dlp · aria2), 작업 대기열, 자동 업데이트.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 19:35:19 +09:00