|
| 1 | +# ScriptPlayer+ Development Log |
| 2 | + |
| 3 | +## Project Overview |
| 4 | + |
| 5 | +FunPlayer라는 이름으로 다른 계정에서 만들던 funscript 플레이어를 이어받아 ScriptPlayer+로 리브랜딩하고 기능을 완성한 프로젝트. |
| 6 | + |
| 7 | +- **Stack**: Electron + React + TypeScript + Tailwind CSS + Vite |
| 8 | +- **Repo**: https://github.com/sioaeko/scriptplayer-plus |
| 9 | + |
| 10 | +--- |
| 11 | + |
| 12 | +## Session Summary (2026-03-08) |
| 13 | + |
| 14 | +### 1. 타임라인/히트맵 토글 버튼 수정 |
| 15 | +- 히트맵 버튼만 있고 타임라인 토글 버튼이 없는 문제 → 둘 다 존재했으나 아이콘만 있어서 구분 불가 |
| 16 | +- 각 버튼에 텍스트 라벨 추가 (`TL`, `HM`), 활성화 시 배경색 추가 |
| 17 | + |
| 18 | +### 2. Handy 디바이스 연동 수정 |
| 19 | +- **스크립트 업로드 URL 수정**: `handyfeeling.com/api/handy-rest/v3/uploads` (404) → `scripts01.handyfeeling.com/api/script/v0/temp/upload` (공식 SDK가 사용하는 올바른 엔드포인트) |
| 20 | +- 공식 Handy SDK (`@ohdoki/handy-sdk`) 소스코드 분석하여 올바른 엔드포인트 확인 |
| 21 | +- 모든 Handy API 호출에 `console.log`/`console.error` 추가 |
| 22 | +- 업로드 상태 UI 표시 (uploading → setting-up → ready / error) |
| 23 | +- 드래그 & 드롭으로 파일 열 때도 Handy에 스크립트 업로드하도록 수정 |
| 24 | +- `uploadScript` + `setHSSP`를 `uploadAndSetup` 메서드로 통합 |
| 25 | + |
| 26 | +### 3. Windows/macOS Standalone 빌드 |
| 27 | +- `electron-builder` 설정으로 Windows portable 빌드 (`dir` target) |
| 28 | +- macOS는 Windows에서 빌드 불가 → GitHub Actions workflow 생성 (`.github/workflows/build.yml`) |
| 29 | +- macOS: `titleBarStyle: 'hiddenInset'`, traffic light position, `app.on('activate')` 처리 |
| 30 | +- `signAndEditExecutable: false`로 코드사인 우회 (symlink 권한 문제) |
| 31 | +- `rcedit`로 빌드 후 아이콘 수동 적용 (`scripts/set-icon.js` 자동화) |
| 32 | + |
| 33 | +### 4. Handy 자동 연결 & 연결 기록 |
| 34 | +- localStorage에 연결 기록 저장 (최대 5개) |
| 35 | +- 최근 기록에서 원클릭 연결 |
| 36 | +- 자동 연결 토글 (앱 시작 시 마지막 키로 자동 연결) |
| 37 | +- i18n 키 추가 (en/ko/ja/zh) |
| 38 | + |
| 39 | +### 5. 앱 리브랜딩 |
| 40 | +- `FunPlayer` → `ScriptPlayer+` 로 전체 이름 변경 |
| 41 | +- package.json, i18n 파일, 타이틀바, Handy CSV 헤더 등 모두 반영 |
| 42 | +- `productName: "ScriptPlayerPlus"` (파일명에 `+` 사용 불가) |
| 43 | + |
| 44 | +### 6. 앱 아이콘 생성 |
| 45 | +- Node.js로 1024x1024 PNG 아이콘 프로그래밍 방식 생성 (S+ 로고, 퍼플 그라데이션) |
| 46 | +- `png2icons`로 `.ico` (Windows) / `.icns` (macOS) 변환 |
| 47 | +- `rcedit`로 exe에 아이콘 삽입 자동화 |
| 48 | + |
| 49 | +### 7. EroScripts 브라우저 로그인 |
| 50 | +- API 키 입력 방식 제거 → 앱 내 BrowserWindow로 EroScripts 직접 로그인 |
| 51 | +- Electron `session.cookies.get()`으로 `_t` 쿠키 감지 → 세션 캡처 |
| 52 | +- 모든 EroScripts API 호출을 main process에서 프록시 (쿠키 포함) |
| 53 | +- **로그인 유지**: `userData` 폴더에 쿠키+유저네임 저장, 앱 재시작 시 `checkSession`으로 자동 복원 |
| 54 | +- 설정의 EroScripts 섹션 (API키 입력) 완전 제거 |
| 55 | + |
| 56 | +### 8. NAS WebDAV/FTP 기능 |
| 57 | +- 백엔드 구현은 있었으나 프론트엔드 미구현 상태 발견 |
| 58 | +- 파일 탭에 NAS 브라우징 UI 구현 (폴더/파일 탐색, WebDAV 프록시 스트리밍) |
| 59 | +- 설정에 연결 테스트 버튼 + 프로토콜 안내 추가 |
| 60 | +- **이후 사용자 요청으로 NAS 기능 전체 제거** (폴더 선택 기능으로 충분) |
| 61 | + |
| 62 | +### 9. 설정 기능 정리 |
| 63 | +- 미구현/미연동 설정 제거: `autoLoadScript`, `autoSearchEroScripts`, `rememberVolume`, `rememberPosition`, `handyKey` (Sidebar에서 관리) |
| 64 | +- 실제 연동 구현: |
| 65 | + - `timeOffset` → HSSP play/seek에 오프셋 적용 |
| 66 | + - `timelineHeight` → VideoPlayer 타임라인 높이 반영 |
| 67 | + - `timelineWindow` → ScriptTimeline 표시 범위 반영 (`windowSize` prop) |
| 68 | + - `speedColors` → 토글 연동 |
| 69 | + - `strokeRangeMin/Max` → 설정 UI에서 조절 |
| 70 | +- EroScripts 관련 설정 잔여물 제거 (`eroScriptsApiKey`, `eroScriptsUsername`) |
| 71 | + |
| 72 | +### 10. EroScripts 첨부파일명 수정 |
| 73 | +- Discourse 업로드 파일명이 해시값 (`hxitVoMKzrmu9U...funscript`)으로 표시되는 문제 |
| 74 | +- `cooked` HTML에서 `<a href="...">원본파일명.funscript</a>` 링크 텍스트 파싱으로 변경 |
| 75 | +- URL 인코딩된 파일명도 `safeDecodeURI`로 디코딩 |
| 76 | + |
| 77 | +### 11. 스크립트 저장 폴더 설정 |
| 78 | +- 설정에 "스크립트 저장 폴더" 추가 (i18n 4개 언어) |
| 79 | +- EroScripts 다운로드 → 지정 폴더에 원본 파일명으로 저장 |
| 80 | +- 영상 재생 시 영상 옆에 `.funscript` 없으면 → 스크립트 폴더에서 같은 이름 자동 검색 |
| 81 | +- 드래그 & 드롭에도 fallback 적용 |
| 82 | + |
| 83 | +### 12. 영상/클라우드 링크 표시 |
| 84 | +- EroScripts 게시물에서 영상 호스팅 링크 자동 감지 |
| 85 | +- 지원: MEGA, Google Drive, Pixeldrain, Dropbox, MediaFire, GoFile, OneDrive, SpankBang, Pornhub, Erome, RedGIFs 등 20개 서비스 |
| 86 | +- 스크립트: `FileText` 아이콘 (보라색) → 다운로드 |
| 87 | +- 영상 링크: `Film` 아이콘 (파란색) → 브라우저에서 열기 |
| 88 | + |
| 89 | +### 13. GitHub 리포 & 릴리스 |
| 90 | +- `sioaeko/scriptplayer-plus` 리포 생성 |
| 91 | +- README 4개 언어 (EN/KO/JA/ZH) + 스크린샷 8장 |
| 92 | +- macOS 스크린샷 추가, 다운로드 안내 추가 |
| 93 | +- `gh` CLI 설치 및 인증 (`workflow` scope 포함) |
| 94 | +- v1.0.0 릴리스: Windows + macOS Universal zip |
| 95 | +- v0.1.1 릴리스: 위 변경점 반영 + 타이틀바 버전 표시 |
| 96 | + |
| 97 | +--- |
| 98 | + |
| 99 | +## File Structure |
| 100 | + |
| 101 | +``` |
| 102 | +FunPlayer/ |
| 103 | +├── .github/workflows/build.yml # CI build (Win + Mac) |
| 104 | +├── electron/ |
| 105 | +│ ├── main.ts # Electron main process |
| 106 | +│ └── preload.ts # Context bridge |
| 107 | +├── public/ |
| 108 | +│ ├── icon.png # 1024x1024 app icon |
| 109 | +│ ├── icon.ico # Windows icon |
| 110 | +│ └── icon.icns # macOS icon |
| 111 | +├── scripts/ |
| 112 | +│ └── set-icon.js # Post-build icon setter |
| 113 | +├── src/ |
| 114 | +│ ├── App.tsx # Main app component |
| 115 | +│ ├── components/ |
| 116 | +│ │ ├── EroScriptsPanel.tsx # EroScripts search & download |
| 117 | +│ │ ├── ScriptHeatmap.tsx # Full-video heatmap canvas |
| 118 | +│ │ ├── ScriptTimeline.tsx # Scrolling timeline canvas |
| 119 | +│ │ ├── Settings.tsx # Settings modal |
| 120 | +│ │ ├── Sidebar.tsx # File browser, device, search tabs |
| 121 | +│ │ ├── TitleBar.tsx # Custom title bar |
| 122 | +│ │ └── VideoPlayer.tsx # Video player with controls |
| 123 | +│ ├── i18n/ |
| 124 | +│ │ ├── index.ts # i18n provider |
| 125 | +│ │ └── locales/ # en, ko, ja, zh |
| 126 | +│ ├── services/ |
| 127 | +│ │ ├── eroscripts.ts # EroScripts API (legacy, mostly replaced by IPC) |
| 128 | +│ │ ├── funscript.ts # Funscript parsing |
| 129 | +│ │ ├── handy.ts # Handy device service (HSSP) |
| 130 | +│ │ └── settings.ts # App settings persistence |
| 131 | +│ └── types.ts # TypeScript types + electronAPI |
| 132 | +├── docs/ |
| 133 | +│ ├── DEVLOG.md # This file |
| 134 | +│ ├── README_KO.md |
| 135 | +│ ├── README_JA.md |
| 136 | +│ ├── README_ZH.md |
| 137 | +│ └── screenshots/ # App screenshots |
| 138 | +├── package.json |
| 139 | +├── vite.config.ts |
| 140 | +└── README.md |
| 141 | +``` |
| 142 | + |
| 143 | +## Key Technical Decisions |
| 144 | + |
| 145 | +1. **Handy Script Upload**: 공식 SDK 소스 분석 → `scripts01.handyfeeling.com/api/script/v0/temp/upload` 엔드포인트 사용 |
| 146 | +2. **EroScripts Auth**: API 키 대신 BrowserWindow 로그인 → 세션 쿠키 캡처 → main process 프록시 |
| 147 | +3. **아이콘**: `signAndEditExecutable: false`로 빌드 후 `rcedit`로 수동 적용 (symlink 권한 문제 우회) |
| 148 | +4. **NAS 제거**: 백엔드는 유지하되 프론트엔드 제거 (폴더 선택으로 충분) |
| 149 | +5. **스크립트 폴더**: 영상 옆 → 스크립트 폴더 순서로 fallback 검색 |
0 commit comments