Replace full innerHTML re-render with incremental DOM updates:
- renderedDisks map tracks what's already in the DOM
- On refresh: only update diskProgress_KEY and diskBtns_KEY elements
- Full card re-render only on first appearance or state/disk_id change
- If an edited disk disconnects: toast error, panel removed cleanly
- openPanels Set persists panel open state across partial updates
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- dashboard.html: remove standalone "Mounted Disk" input panel; show all disks
from GET /api/disks (watcher), auto-refresh every 5s
- detect.go: use avg_frame_rate when r_frame_rate is unrealistic (>120 fps or 0),
fixes MJPEG/mjpeg showing 90000fps
- transcoder.go: parse fps= from ffmpeg progress output and expose in Progress struct
- copier.go: update task message with real-time encoding fps (@ 45.3 fps),
clear speed_bps/eta during transcoding to avoid showing stale copy speed
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
ShuffleDepth in DiskProfile controls how files are selected:
-1 = no shuffle (preserve source order)
0 = all files in random order
N = group files by folder at depth N from /media, shuffle groups,
copy entire group before moving to next
Exposed in disk profile UI as a select with level descriptions.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- handlers_sources.go: revert to relative paths rooted at /media (remove standalone absolute-path mode)
- settings.html: remove manual path input, restore auto-loading source tree from /media
- config.go: remove filesystem existence checks from Validate() — paths may be temporarily unavailable
- transcoder.go: always specify fps in ffmpeg args when MaxFPS is set, preserving source fps if lower than limit
- copier.go: include source codec/format and target codec/format in transcoding task message
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Profile panel is now hidden by default; a gear Settings button in
the disk card toggles it open/closed. Reduces visual clutter for
the common case when no profile changes are needed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Native OS dialog (zenity/AppleScript/PowerShell) fails on Linux with
"native folder picker is not supported on this platform". Replaced:
- dashboard: removed the "+" button, users type mount path manually
- settings: replaced "Add source folder" native dialog with inline
text input field
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Each disk stores .jukebox/profile.json with copy parameters (dest
folder, overwrite mode, file select, reserve space, auto-copy) and
optional transcoding limits for the target player (codec, resolution,
bitrate, FPS, audio channels, output format).
On copy, video files are probed with ffprobe; if they exceed the
profile limits they are transcoded via ffmpeg (-threads 0 for full
CPU usage), otherwise copied as-is. Scale filter never upscales.
New: internal/disk/profile.go, internal/transcoder/{detect,transcoder}.go
API: GET/PUT /api/disks/profile?mount_path=
UI: disk profile panel in dashboard for known disks
Dockerfile: adds ffmpeg to the runtime image
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Прогрессбар по скопированным байтам (doneBytes / totalBytes)
- SpeedBPS и ETASec добавлены в Task
- Dashboard показывает скорость (МБ/с) и ETA справа от прогрессбара
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- rsync --partial --append-verify для возобновления передачи
- --no-perms --chmod=ugo=rwx — права 777 на диске
- Структура: <mount>/<dest_folder>/<rel path from /media>, default media
- Shuffle файлов перед копированием
- Диск заполняется пока есть место, файлы которые не влезают пропускаются
- Прогресс по количеству обработанных файлов
- rsync добавлен в Dockerfile
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Заменить ручное копирование на rsync --partial --append-verify
- Структура на диске: <mount>/<dest_folder>/<rel path from /media>
- dest_folder настраивается (default: media)
- Права на диске: --no-perms --chmod=ugo=rwx
- rsync добавлен в Dockerfile
- Режим "удалить": удаляет только dest_folder, а не весь диск
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Если указан image — собирает мультиарч и пушит.
Если image пустой — локальная сборка без пуша.
push-image.sh удалён.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
printf шёл в stdout внутри $(...), поэтому prompt не выводился
и read висел. Теперь prompt идёт в stderr напрямую.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
build-image.sh теперь тегирует как git.mchus.pro/reanimator/jukebox-maker.
push-image.sh собирает мультиарч образ и пушит в Gitea registry.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Go web application for filling USB drives with media files.
Runs in Docker on Unraid with /media, /mnt/usb, /config volumes.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>