Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
281 commits
Select commit Hold shift + click to select a range
d9e8eb8
Merge pull request #147 from Radexito/feat/auto-normalize-on-import
Radexito Apr 2, 2026
58c9afe
fix: prevent navigating away from YT-DLP tab during active download (…
Radexito Apr 2, 2026
4c0d85e
feat: persist yt-dlp tab state via DownloadContext
Radexito Apr 2, 2026
1f56d84
fix: yt-dlp progress 1/1 bug + grayed-out track tooltip
Radexito Apr 2, 2026
fee93b3
fix: pagination infinite scroll and analyzing tooltip
Radexito Apr 2, 2026
1b74a2d
style: fix prettier formatting in DownloadView.jsx
Radexito Apr 2, 2026
7e3341e
fix: skip unavailable videos instead of aborting download
Radexito Apr 2, 2026
b1bdc2e
fix: handle all-unavailable playlist gracefully with per-track UI
Radexito Apr 2, 2026
712e292
fix: detect unavailable playlist tracks before download via flat-play…
Radexito Apr 3, 2026
9178aaf
fix: robust unavailable-video handling — no raw errors, clean result …
Radexito Apr 3, 2026
97c5a79
feat: pre-filter unavailable YouTube videos via oEmbed before selecti…
Radexito Apr 3, 2026
dbf6b65
fix: auto-prepend https:// to URLs and always pass --playlist-items w…
Radexito Apr 3, 2026
c195746
fix: add right-click context menu and fix URL input type
Radexito Apr 3, 2026
c5eda64
fix: switch unavailability check from oEmbed to InnerTube player API
Radexito Apr 3, 2026
94d19cf
fix: use WEB+TV_EMBEDDED InnerTube clients for availability check
Radexito Apr 3, 2026
32245c7
fix: drop TVHTML5 client, single WEB client with correct version
Radexito Apr 3, 2026
03aebc4
fix: replace InnerTube API with yt-dlp availability check
Radexito Apr 3, 2026
d213e52
perf: increase availability check concurrency from 4 to 16
Radexito Apr 3, 2026
7f572a3
feat: show yt-dlp download progress in sidebar
Radexito Apr 3, 2026
31b94c4
feat: add progress feedback during yt-dlp availability pre-check
Radexito Apr 3, 2026
8638083
fix: restore yt-dlp download progress in sidebar
Radexito Apr 3, 2026
26d9ef8
fix: split yt-dlp output on \r as well as \n for progress parsing
Radexito Apr 3, 2026
6b51303
fix: force PYTHONUNBUFFERED=1 to prevent yt-dlp progress batching
Radexito Apr 3, 2026
ac98872
feat: remove separate 'Current track' progress bar
Radexito Apr 3, 2026
1f60b2f
fix: use --print before_dl marker for reliable sidebar progress
Radexito Apr 3, 2026
f3d6176
feat: 3-state checkbox for in-library tracks + sidebar fetch loading …
Radexito Apr 3, 2026
c1f1ca2
fix: allow cancelling/escaping stuck loading state in DownloadView
Radexito Apr 3, 2026
adc3f8a
Merge pull request #144 from Radexito/fix/ytdlp-tab-navigation
Radexito Apr 3, 2026
4e9f555
Merge origin/dev into feat/ytdlp-availability-precheck
Radexito Apr 3, 2026
539561d
fix: preserve tab state on switch; make YT-DLP sidebar progress click…
Radexito Apr 3, 2026
858cb18
feat: live check list, filter buttons, fix double download progress
Radexito Apr 3, 2026
2a5c3e5
Merge pull request #156 from Radexito/feat/ytdlp-availability-precheck
Radexito Apr 3, 2026
c497e7d
Merge origin/dev into feat/track-animation-import-dialog
Radexito Apr 3, 2026
8fd02ed
Merge remote-tracking branch 'origin/dev' into feat/artist-detection-…
Radexito Apr 3, 2026
0f3216d
Merge remote-tracking branch 'origin/dev' into fix/deps-folder-not-empty
Radexito Apr 3, 2026
1d74332
fix: preserve selection on data reload, only clear on view change
Radexito Apr 3, 2026
8b6f3ab
Merge pull request #146 from Radexito/feat/track-animation-import-dialog
Radexito Apr 3, 2026
fcf5f0b
Merge remote-tracking branch 'origin/dev' into fix/deps-folder-not-empty
Radexito Apr 3, 2026
20ba5ad
Merge remote-tracking branch 'origin/dev' into feat/artist-detection-…
Radexito Apr 3, 2026
f981539
fix: advance progress counter immediately when track download starts
Radexito Apr 3, 2026
9830633
fix: progress counter shows completed count (0/8 → 1/8 → 2/8)
Radexito Apr 3, 2026
4db708b
fix: remove unused loading variable from DownloadView
Radexito Apr 3, 2026
0671e2f
Merge pull request #158 from Radexito/fix/ytdlp-progress-off-by-one
Radexito Apr 3, 2026
283a6ba
Merge remote-tracking branch 'origin/dev' into fix/deps-folder-not-empty
Radexito Apr 3, 2026
4642795
Merge remote-tracking branch 'origin/dev' into feat/artist-detection-…
Radexito Apr 3, 2026
d547e7d
Merge pull request #141 from Radexito/fix/deps-folder-not-empty
Radexito Apr 3, 2026
06554be
fix: destructure createPlaylist return value correctly in import dialog
Radexito Apr 3, 2026
2983adc
fix: show per-file progress when importing audio files
Radexito Apr 3, 2026
5d1a2c7
Merge pull request #142 from Radexito/feat/artist-detection-from-file…
Radexito Apr 3, 2026
7808b05
chore(deps-dev): bump eslint from 10.0.3 to 10.1.0 in /renderer (#105)
dependabot[bot] Apr 3, 2026
c157e5c
chore(deps-dev): bump @vitejs/plugin-react in /renderer (#106)
dependabot[bot] Apr 3, 2026
fe4cf4e
chore(deps-dev): bump vitest in the build-tools group (#117)
dependabot[bot] Apr 3, 2026
0aed6b0
chore(deps-dev): bump vitest from 4.1.0 to 4.1.2 in /renderer (#119)
dependabot[bot] Apr 3, 2026
96945fb
chore(deps-dev): bump jsdom from 28.1.0 to 29.0.1 in /renderer (#107)
dependabot[bot] Apr 3, 2026
bfaff06
chore(deps-dev): bump @vitest/coverage-v8 from 4.1.0 to 4.1.2 (#118)
dependabot[bot] Apr 3, 2026
9467b49
chore(deps-dev): bump vite from 8.0.0 to 8.0.3 in /renderer (#120)
dependabot[bot] Apr 3, 2026
876889e
docs: rewrite README with full current feature set (#164)
Radexito Apr 3, 2026
81e8a64
Merge pull request #165 from Radexito/dev
Radexito Apr 3, 2026
1125e54
chore: bump version to 1.0.13 [skip ci]
github-actions[bot] Apr 3, 2026
b1500da
chore: bump version to 1.0.14 [skip ci]
github-actions[bot] Apr 4, 2026
6557118
feat: add TIDAL download tab powered by tidal-dl-ng
Radexito Mar 30, 2026
202f515
feat: auto-install tidal-dl-ng with one-click button and progress log
Radexito Apr 5, 2026
f92c5a1
feat: install tidal-dl-ng at startup alongside other deps
Radexito Apr 5, 2026
66d7f80
feat: use bundled uv to install tidal-dl-ng without system Python
Radexito Apr 5, 2026
4ac9704
fix: install tidal-dl-ng from GitHub fork, not PyPI
Radexito Apr 5, 2026
152b6d1
fix: use tidal_dl_ng (underscores) config dir path
Radexito Apr 5, 2026
53aca36
fix: clear tdn download history before each download
Radexito Apr 5, 2026
3fb9f9b
fix: patch all tidal config dirs and clear history with correct schema
Radexito Apr 5, 2026
1186565
feat(tidal): 3-step download UX with progressive library import
Radexito Apr 5, 2026
ed45d8c
feat(tidal): duplicate checking in select step
Radexito Apr 5, 2026
7df97c2
fix(tidal): sidebar progress bar + fix dedup source_url
Radexito Apr 5, 2026
ccb6fff
feat(tidal): add playlist membership re-check on dropdown change
Radexito Apr 5, 2026
3b8a585
fix(tidal): fallback ID pattern-match for old source_url format in me…
Radexito Apr 5, 2026
481f857
Merge pull request #168 from Radexito/feature/tidal-dl-for-dj
Radexito Apr 5, 2026
0c523ae
feat: use channel name as artist when video title has no delimiter
Radexito Apr 5, 2026
d20476f
Merge pull request #169 from Radexito/fix/162-channel-name-as-artist
Radexito Apr 5, 2026
957783b
fix(#159): add regression tests for import-to-playlist association
Radexito Apr 10, 2026
12f91f5
feat(#24 #115): cue points editor + CueGen auto-cue + Rekordbox PCOB …
Radexito Apr 10, 2026
6069c7d
feat: expose cue points as standalone panel with column indicator
Radexito Apr 10, 2026
2dae0f6
fix: outro_secs is absolute position, fix seekbar refresh, add auto-c…
Radexito Apr 10, 2026
b376348
chore: sync master → dev after release [skip ci]
github-actions[bot] Apr 11, 2026
597bd8f
chore: bump version to 1.0.15 [skip ci]
github-actions[bot] Apr 11, 2026
00b987b
fix(#189): cue markers on first load, delete confirm, selection follo…
Radexito Apr 11, 2026
493788a
fix(lint): avoid synchronous setState in useEffect in PlayerBar
Radexito Apr 11, 2026
a4717f1
fix(#204): dedup soft-append to prevent duplicate keys on import
Radexito Apr 11, 2026
626fa1d
fix: correct PCOB/PCO2 ANLZ binary format for Rekordbox compatibility
Radexito Apr 11, 2026
5cfed66
Merge pull request #180 from Radexito/feat/24-115-cue-points-cuegen
Radexito Apr 11, 2026
0f81d38
Disable choc (temporarly)
Radexito Apr 12, 2026
3bc608d
Merge pull request #215 from Radexito/fix/remove_chocolatey
Radexito Apr 12, 2026
67cff8b
fix(#218): correct PWV4 byte encoding and 3-band frequency separation
Radexito Apr 12, 2026
28c94b1
fix(#219): assign hot cue slots A-H to all generated cues; fix PCP2 l…
Radexito Apr 13, 2026
8fbfced
fix(#220): add Pioneer color stubs, revert color_code=0 pending palet…
Radexito Apr 13, 2026
425de4c
Merge pull request #221 from Radexito/fix/208-pcob2-memory-cues
Radexito Apr 13, 2026
eeaf9e5
fix(#220): implement Pioneer palette color codes in PCPT and PCP2 ent…
Radexito Apr 13, 2026
7fd8988
fix(#204): deduplicate tracks on soft-append to prevent duplicate Rea…
Radexito Apr 13, 2026
4370e4a
fix(#213): keep player queue in sync when tracks are added during pla…
Radexito Apr 13, 2026
70e3431
fix(#204 #213 #220): correct soft-append offset, playlist queue sync,…
Radexito Apr 13, 2026
22b40a4
merge(dev): integrate dev branch changes and resolve MusicLibrary con…
Radexito Apr 13, 2026
5cfbf91
feat: cue type toggle (hot/memory) and visibility filters per cue type
Radexito Apr 13, 2026
b174701
chore: apply prettier formatting to all files (fixes CI format:check)
Radexito Apr 13, 2026
b0f2928
Merge pull request #233 from Radexito/fix/204-duplicate-key-on-import
Radexito Apr 13, 2026
d60251b
feat(#209): per-cue export enable/disable toggle
Radexito Apr 13, 2026
44a619f
Merge pull request #235 from Radexito/dev
Radexito Apr 13, 2026
56bb28d
chore: bump version to 1.0.16 [skip ci]
github-actions[bot] Apr 13, 2026
5db59f1
Merge branch 'dev' into feat/209-cue-export-toggle
Radexito Apr 13, 2026
9f48c73
fix(#210): move 'Save to playlist' above track list in Tidal and yt-d…
Radexito Apr 13, 2026
146f49b
feat(#202): auto-generate cue points on import when setting is enabled
Radexito Apr 13, 2026
eaeb461
feat(#160 #161): show analysis progress bar in sidebar during track a…
Radexito Apr 14, 2026
a4e626c
feat(#157): Ctrl+Scroll and Ctrl+=/−/0 zoom control with persistence
Radexito Apr 14, 2026
4b83a80
feat(#126): add tap tempo button and manual Set BPM in context menu
Radexito Apr 14, 2026
f1bc4e1
fix: suppress expected AbortError in all audio play() catch handlers
Radexito Apr 14, 2026
a684c53
Merge pull request #245 from Radexito/fix/aborterror-play-interruption
Radexito Apr 14, 2026
80a03f2
debug: Windows 11 diagnostics + fix drive-not-ready after format
Radexito Apr 14, 2026
20fb676
docs: thank meiremans for beirbox-gui reverse engineering work
Radexito Apr 14, 2026
0ea93fe
Merge pull request #248 from Radexito/docs/thank-you-meiremans
Radexito Apr 14, 2026
9389e72
docs: expand acknowledgements with full credits for Rekordbox reverse…
Radexito Apr 14, 2026
96018bb
Merge pull request #249 from Radexito/docs/acknowledgements-expanded
Radexito Apr 14, 2026
3256bc8
Merge pull request #236 from Radexito/feat/209-cue-export-toggle
Radexito Apr 14, 2026
648d452
Merge pull request #238 from Radexito/fix/210-tidal-playlist-checkboxes
Radexito Apr 14, 2026
7e76e09
Merge remote-tracking branch 'origin/dev' into feat/202-auto-cue-on-i…
Radexito Apr 14, 2026
72df7b5
feat: cue point library generation and analysis tools
Radexito Apr 14, 2026
721342c
fix: add missing mocks in importManager tests for cuePointRepository
Radexito Apr 14, 2026
32ed887
test: add cuePointRepository tests to fix coverage threshold
Radexito Apr 14, 2026
b06b468
Merge pull request #240 from Radexito/feat/202-auto-cue-on-import
Radexito Apr 14, 2026
fa9b84a
Merge remote-tracking branch 'origin/dev' into feat/160-161-analysis-…
Radexito Apr 14, 2026
d7ece13
fix: silent re-analysis after auto-normalize to prevent double progre…
Radexito Apr 14, 2026
a487419
Merge pull request #241 from Radexito/feat/160-161-analysis-progress
Radexito Apr 14, 2026
07b0966
feat(#157): Ctrl+Scroll / Ctrl+=/−/0 zoom control with persistence
Radexito Apr 14, 2026
5b7a7dc
feat: zoom indicator pill with auto-hide and click-to-reset
Radexito Apr 14, 2026
fcfd93b
feat: add countdown bar to zoom indicator pill
Radexito Apr 14, 2026
eeb94cd
fix: move zoom indicator to top-right and remove percentage label
Radexito Apr 14, 2026
0cf88fe
fix: give zoom indicator pill a minimum width so X is not a tiny square
Radexito Apr 14, 2026
7fc5a9f
fix: restore percentage label to zoom indicator pill
Radexito Apr 14, 2026
4555389
fix: move zoom indicator pill to top-left
Radexito Apr 14, 2026
4cd466f
fix: counter-scale zoom indicator so it stays the same size when UI i…
Radexito Apr 15, 2026
88b26c0
fix: double zoom indicator label font size to 22px
Radexito Apr 15, 2026
6e8353b
fix: eliminate zoom indicator size jump via flushSync + scoped key
Radexito Apr 15, 2026
851ad99
Merge pull request #252 from Radexito/fix/157-zoom-control
Radexito Apr 15, 2026
7fc78da
Merge remote-tracking branch 'origin/dev' into debug/windows11-diagno…
Radexito Apr 15, 2026
4349e99
chore: merge origin/dev into feat/126-tap-tempo-manual-bpm
Radexito Apr 15, 2026
79cded5
feat(#190): waveform seek bar with Classic/RGB/3-Band color modes
Radexito Apr 15, 2026
028c746
fix(#190): fix canvas sizing + add library waveform generation
Radexito Apr 15, 2026
e0ea2e3
feat(#190): show waveform generation progress in Sidebar
Radexito Apr 15, 2026
5e5879b
fix(#190): auto-generate missing waveforms on startup + fix import error
Radexito Apr 15, 2026
70d4197
fix: make waveform seekbar clickable across full 40px height
Radexito Apr 15, 2026
24046f8
fix: normalize waveform band values per column for RGB/3-band color m…
Radexito Apr 15, 2026
73b1005
fix: drive seekbar position via requestAnimationFrame for smooth wave…
Radexito Apr 15, 2026
cf4956f
fix: center seekbar thumb on value position in waveform context
Radexito Apr 15, 2026
7258a3f
feat(#201 #126): beatgrid offset shift + tap tempo + manual BPM — com…
Radexito Apr 15, 2026
ba4db8c
fix + feat: beat grid editor modal, fix TAP button layout & BPM sync
Radexito Apr 15, 2026
080cde4
feat: Prepare Track window — cue editor, zoom, vinyl-stop scrub, TAP …
Radexito Apr 15, 2026
bdfccaf
chore: remove TAP tempo button from PlayerBar
Radexito Apr 15, 2026
2489831
fix(#190): waveform RGB colors, live color mode switch, intro/outro z…
Radexito Apr 15, 2026
7337f27
fix(#190): move drawWaveform/paintWaveform before useEffects to fix l…
Radexito Apr 16, 2026
bb31c92
Merge pull request #265 from Radexito/feat/190-waveform-seek-bar
Radexito Apr 16, 2026
d1fa7f3
chore: merge origin/dev into feat/201-126-beatgrid-bpm-editor
Radexito Apr 16, 2026
e52e865
fix: resolve ESLint errors blocking CI on feat/201-126-beatgrid-bpm-e…
Radexito Apr 16, 2026
234f5ab
Merge pull request #254 from Radexito/feat/201-126-beatgrid-bpm-editor
Radexito Apr 16, 2026
ba45456
fix(beatgrid): deferred cues, waveform colors, zoom wheel, spacebar, …
Radexito Apr 16, 2026
fe7a366
chore: merge dev into debug/windows11-diagnostics
Radexito Apr 16, 2026
673e18d
Merge pull request #246 from Radexito/debug/windows11-diagnostics
Radexito Apr 16, 2026
6cd5edc
Merge pull request #268 from Radexito/fix/beatgrid-editor-fixes
Radexito Apr 16, 2026
ed61449
fix: playlist view shows all-music tracks after import + restore DevT…
Radexito Apr 16, 2026
6ab7390
fix: close SQLite connection before deleting userData on Windows reset
Radexito Apr 16, 2026
19dd626
fix: make clear-user-data remove database reliably
Radexito Apr 16, 2026
d9fe034
Merge pull request #271 from Radexito/fix/clear-user-data-db
Radexito Apr 16, 2026
684bc6e
Merge pull request #269 from Radexito/dev
Radexito Apr 16, 2026
9b20b62
chore: bump version to 1.0.17 [skip ci]
github-actions[bot] Apr 16, 2026
6b1a7bf
feat: add File Explorer view + app icon
Radexito Apr 17, 2026
e111758
fix: add missing explorer DB/import functions
Radexito Apr 17, 2026
f3ade66
feat: add FileExplorerView component and explorer API
Radexito Apr 17, 2026
358875c
fix: ExplorerRow receives spread props, not nested rowProps
Radexito Apr 17, 2026
aeb8977
fix: set app.name to 'Dj Manager' (was showing 'Electron')
Radexito Apr 17, 2026
5c59a55
feat: overhaul FileExplorerView with full table, context menu, playba…
Radexito Apr 17, 2026
dbfc7e9
feat: auto-analyze on play + Analyze folder button in Explorer
Radexito Apr 17, 2026
553ef2a
feat: explorer live analysis updates + linked badge in music/playlist…
Radexito Apr 17, 2026
df7463a
feat(explorer): +Library dialog, live analysis fix, artist fallback, …
Radexito Apr 18, 2026
1602f6c
fix(explorer): path-aware analyze button with cancel and completion t…
Radexito Apr 18, 2026
6cde59f
feat(explorer): explicit confirm dialogs for all mass operations
Radexito Apr 18, 2026
27f124f
fix(explorer): show file count in +Library dialog matching Analyze di…
Radexito Apr 18, 2026
a02cebe
fix(explorer): TrackDetails side panel layout, BeatGridEditor, unlink…
Radexito Apr 18, 2026
f69dd9c
feat(explorer): favourites sidebar, promoted BeatGrid, delete-file wi…
Radexito Apr 18, 2026
208de5e
docs: update README with File Explorer feature set
Radexito Apr 18, 2026
64f2772
fix(e2e): scope library selectors to .music-library to avoid explorer…
Radexito Apr 18, 2026
e56bed0
fix(explorer): guard favourites parse — getSetting may return JSON st…
Radexito Apr 18, 2026
462b6f2
fix(player): clear waveform canvas when track has no data; auto-reloa…
Radexito Apr 18, 2026
47383dd
fix(player): emit waveform-ready after generation completes; reload s…
Radexito Apr 18, 2026
d15762d
chore: bump version to 1.0.18 [skip ci]
github-actions[bot] Apr 18, 2026
08efaf0
feat(normalization): apply gain non-destructively at playback and exp…
Radexito Apr 18, 2026
2003462
fix(normalization): use Web Audio GainNode for uncapped positive gain…
Radexito Apr 18, 2026
885480d
fix(player): guard AudioContext setup in try-catch to prevent black s…
Radexito Apr 18, 2026
ae34d28
test(player): guard against AudioContext crash causing black screen
Radexito Apr 19, 2026
7828657
Merge pull request #282 from Radexito/test/player-audioctx-black-screen
Radexito Apr 19, 2026
05c9a74
Merge remote-tracking branch 'origin/dev' into feat/260-non-destructi…
Radexito Apr 19, 2026
8f64c9b
test(trackRepository): add coverage for getLegacyNormalizedTracks and…
Radexito Apr 19, 2026
6083fa2
fix(player): guard against StrictMode double-invoke silencing audio
Radexito Apr 19, 2026
9b361d4
fix(player): build Web Audio graph lazily on first play, not at mount
Radexito Apr 19, 2026
8b1b30b
debug(player): forward renderer console to terminal; log AudioContext…
Radexito Apr 19, 2026
096f798
fix(player): add CORS headers to media server; set crossOrigin=anonym…
Radexito Apr 19, 2026
87628cd
fix(lint): replace empty catch blocks with ignored-error catch
Radexito Apr 19, 2026
4391cfe
fix(player): wrap to first track when next() called on last track wit…
Radexito Apr 19, 2026
75a5bbe
docs(re): add Rekordbox binary capture guide and index
Radexito Apr 20, 2026
6726a72
docs(re): refactor capture guide into master + software + hardware files
Radexito Apr 20, 2026
38121fa
docs(re): fix stale beatgrid folder reference in diff example
Radexito Apr 20, 2026
b0ac8ed
feat(re): add Python binary analysis scripts for capture diffing
Radexito Apr 20, 2026
4c676e7
fix(usb): write replay_gain as CDJ auto-gain into PDB track rows
Radexito Apr 20, 2026
8fb6a79
Merge pull request #298 from Radexito/fix/287-auto-gain-pdb
Radexito Apr 24, 2026
50c4f3a
Merge remote-tracking branch 'origin/dev' into feat/260-non-destructi…
Radexito Apr 24, 2026
51b4afe
fix(player): use empty catch blocks to satisfy no-unused-vars lint rule
Radexito Apr 24, 2026
c5a4aa5
chore(deps): bump the react group in /renderer with 2 updates (#289)
dependabot[bot] Apr 24, 2026
4fe2b8c
chore(deps-dev): bump electron in the electron group (#290)
dependabot[bot] Apr 24, 2026
cd837ff
chore(deps-dev): bump eslint from 10.1.0 to 10.2.1 in /renderer (#292)
dependabot[bot] Apr 24, 2026
c1a2a41
chore(deps-dev): bump the build-tools group with 3 updates (#293)
dependabot[bot] Apr 24, 2026
f5cf6ed
chore(deps-dev): bump vite from 8.0.3 to 8.0.9 in /renderer (#294)
dependabot[bot] Apr 24, 2026
ff163fa
chore(deps-dev): bump globals from 17.4.0 to 17.5.0 in /renderer (#295)
dependabot[bot] Apr 24, 2026
159315f
chore(deps): bump better-sqlite3 from 12.8.0 to 12.9.0 (#296)
dependabot[bot] Apr 24, 2026
23be0f0
Merge remote-tracking branch 'origin/dev' into feat/260-non-destructi…
Radexito Apr 24, 2026
d6e2f54
fix(export): preserve source bitrate when re-encoding with normalizat…
Radexito Apr 24, 2026
83e26b8
Merge pull request #280 from Radexito/feat/260-non-destructive-normal…
Radexito Apr 24, 2026
9c5984b
chore(deps-dev): bump vite from 8.0.9 to 8.0.10 in /renderer (#303)
dependabot[bot] Apr 27, 2026
ef518bc
chore(deps-dev): bump electron in the electron group (#304)
dependabot[bot] Apr 27, 2026
1c29cdb
chore(deps-dev): bump @vitest/coverage-v8 in /renderer (#307)
dependabot[bot] Apr 27, 2026
f02662e
chore(deps-dev): bump vitest in the build-tools group (#308)
dependabot[bot] Apr 27, 2026
5d70c8d
chore(deps-dev): bump @vitest/coverage-v8 from 4.1.4 to 4.1.5 (#309)
dependabot[bot] Apr 27, 2026
f1ad0f9
chore(deps-dev): bump vitest from 4.1.2 to 4.1.5 in /renderer (#305)
dependabot[bot] Apr 27, 2026
20bcd76
chore(deps-dev): bump jsdom from 29.0.1 to 29.1.0 in /renderer (#306)
dependabot[bot] Apr 27, 2026
c1b5772
feat(deps): rework first-run overlay with step list, bytes, speed, an…
Radexito Apr 25, 2026
421bf48
Merge pull request #302 from Radexito/feat/270-rework-deps-overlay
Radexito May 1, 2026
b48f143
docs(protocol): document exportLibrary.db schema and SQLCipher key
Radexito May 1, 2026
5630e68
Merge pull request #315 from Radexito/docs/exportlibrary-db-schema
Radexito May 1, 2026
13a5c51
docs(protocol): document exportLibrary.db schema and SQLCipher key
Radexito May 1, 2026
2149e45
Merge pull request #316 from Radexito/docs/exportlibrary-db-schema-v2
Radexito May 1, 2026
840fdff
Merge pull request #318 from Radexito/feat/rekordbox-reverse-engineer…
Radexito May 1, 2026
6b980ff
chore(deps-dev): bump @vitest/coverage-v8 from 4.1.5 to 4.1.6 (#331)
dependabot[bot] May 16, 2026
ac87189
chore(deps-dev): bump the build-tools group across 1 directory with 3…
dependabot[bot] May 16, 2026
d34801f
chore(deps-dev): bump @vitest/coverage-v8 in /renderer (#329)
dependabot[bot] May 16, 2026
590cff1
chore(deps): bump the react group in /renderer with 2 updates (#327)
dependabot[bot] May 16, 2026
3de732d
chore(deps-dev): bump jsdom from 29.1.0 to 29.1.1 in /renderer (#325)
dependabot[bot] May 16, 2026
53a4fc5
chore(deps-dev): bump electron in the electron group (#322)
dependabot[bot] May 16, 2026
0e4522f
chore(deps-dev): bump wait-on from 9.0.4 to 9.0.10 (#328)
dependabot[bot] May 16, 2026
18b9ef3
chore(deps-dev): bump globals from 17.4.0 to 17.6.0 (#326)
dependabot[bot] May 16, 2026
14b62b8
chore(deps-dev): bump eslint from 10.2.1 to 10.4.0 in /renderer (#323)
dependabot[bot] May 16, 2026
21ba0cb
chore(deps-dev): bump globals from 17.5.0 to 17.6.0 in /renderer (#321)
dependabot[bot] May 16, 2026
50c4624
chore(deps): bump actions/checkout from 6 to 7 (#349)
dependabot[bot] Jun 24, 2026
fd438ff
chore(deps-dev): bump the build-tools group across 1 directory with 5…
dependabot[bot] Jun 24, 2026
9b391f4
chore(deps): bump the react group across 1 directory with 3 updates (…
dependabot[bot] Jun 24, 2026
a291d08
chore(deps-dev): bump vite from 8.0.10 to 8.0.14 in /renderer (#344)
dependabot[bot] Jun 24, 2026
70974d3
chore(deps-dev): bump @vitest/coverage-v8 in /renderer (#343)
dependabot[bot] Jun 24, 2026
7a49fb2
chore(deps): bump better-sqlite3 from 12.9.0 to 12.10.0 (#338)
dependabot[bot] Jun 24, 2026
0413843
chore(deps-dev): bump @playwright/test from 1.58.2 to 1.60.0 (#337)
dependabot[bot] Jun 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .dev-url
Original file line number Diff line number Diff line change
@@ -1 +1 @@
http://localhost:5174
http://localhost:5175
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ jobs:
if: github.event_name != 'pull_request' || github.base_ref != 'master' || github.head_ref == 'dev'
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7

- name: Setup Node.js
uses: actions/setup-node@v6
Expand Down Expand Up @@ -61,7 +61,7 @@ jobs:
if: github.event_name != 'pull_request' || github.base_ref != 'master' || github.head_ref == 'dev'
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7

- name: Setup Node.js
uses: actions/setup-node@v6
Expand Down
112 changes: 56 additions & 56 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ jobs:
name: Build (${{ matrix.platform }})

steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7

- uses: actions/setup-node@v6
with:
Expand Down Expand Up @@ -128,60 +128,60 @@ jobs:
# Requires secret: CHOCOLATEY_API_KEY
# One-time setup: submit chocolatey/djmanager.nuspec to chocolatey.org for
# initial package approval, then CI pushes all future updates automatically.
chocolatey:
if: github.ref_name == 'master'
needs: [setup, create-release]
runs-on: windows-latest
steps:
- uses: actions/checkout@v6

- uses: actions/download-artifact@v8
with:
name: dist-win
path: dist-win/

- name: Compute installer SHA256 and build download URL
id: installer
shell: pwsh
run: |
$exe = Get-ChildItem dist-win\*.exe | Select-Object -First 1
if (-not $exe) { throw "No .exe found in dist-win/" }
$sha256 = (Get-FileHash $exe.FullName -Algorithm SHA256).Hash.ToLower()
$url = "https://github.com/${{ github.repository }}/releases/download/${{ needs.setup.outputs.tag }}/$($exe.Name)"
"sha256=$sha256" >> $env:GITHUB_OUTPUT
"url=$url" >> $env:GITHUB_OUTPUT
Write-Host "Installer: $($exe.Name)"
Write-Host "SHA256: $sha256"
Write-Host "URL: $url"

- name: Generate chocolateyInstall.ps1 from template
shell: pwsh
run: |
$script = Get-Content chocolatey/tools/chocolateyInstall.ps1.template -Raw
$script = $script -replace '{{INSTALLER_URL}}', '${{ steps.installer.outputs.url }}'
$script = $script -replace '{{INSTALLER_SHA256}}', '${{ steps.installer.outputs.sha256 }}'
Set-Content chocolatey/tools/chocolateyInstall.ps1 $script
Write-Host "Generated install script:"
Get-Content chocolatey/tools/chocolateyInstall.ps1

- name: Stamp version in nuspec
shell: pwsh
run: |
(Get-Content chocolatey/djmanager.nuspec) `
-replace '<version>.*</version>', '<version>${{ needs.setup.outputs.version }}</version>' |
Set-Content chocolatey/djmanager.nuspec

- name: Pack Chocolatey package
shell: pwsh
run: choco pack chocolatey/djmanager.nuspec --out dist-choco/

- name: Push to Chocolatey.org
shell: pwsh
run: |
$pkg = Get-ChildItem dist-choco\*.nupkg | Select-Object -First 1
if (-not $pkg) { throw "No .nupkg found in dist-choco/" }
Write-Host "Pushing $($pkg.Name)"
choco push $pkg.FullName --source https://push.chocolatey.org --api-key ${{ secrets.CHOCOLATEY_API_KEY }}
#chocolatey:
# if: github.ref_name == 'master'
# needs: [setup, create-release]
# runs-on: windows-latest
# steps:
# - uses: actions/checkout@v7
#
# - uses: actions/download-artifact@v8
# with:
# name: dist-win
# path: dist-win/
#
# - name: Compute installer SHA256 and build download URL
# id: installer
# shell: pwsh
# run: |
# $exe = Get-ChildItem dist-win\*.exe | Select-Object -First 1
# if (-not $exe) { throw "No .exe found in dist-win/" }
# $sha256 = (Get-FileHash $exe.FullName -Algorithm SHA256).Hash.ToLower()
# $url = "https://github.com/${{ github.repository }}/releases/download/${{ needs.setup.outputs.tag }}/$($exe.Name)"
# "sha256=$sha256" >> $env:GITHUB_OUTPUT
# "url=$url" >> $env:GITHUB_OUTPUT
# Write-Host "Installer: $($exe.Name)"
# Write-Host "SHA256: $sha256"
# Write-Host "URL: $url"
#
# - name: Generate chocolateyInstall.ps1 from template
# shell: pwsh
# run: |
# $script = Get-Content chocolatey/tools/chocolateyInstall.ps1.template -Raw
# $script = $script -replace '{{INSTALLER_URL}}', '${{ steps.installer.outputs.url }}'
# $script = $script -replace '{{INSTALLER_SHA256}}', '${{ steps.installer.outputs.sha256 }}'
# Set-Content chocolatey/tools/chocolateyInstall.ps1 $script
# Write-Host "Generated install script:"
# Get-Content chocolatey/tools/chocolateyInstall.ps1
#
# - name: Stamp version in nuspec
# shell: pwsh
# run: |
# (Get-Content chocolatey/djmanager.nuspec) `
# -replace '<version>.*</version>', '<version>${{ needs.setup.outputs.version }}</version>' |
# Set-Content chocolatey/djmanager.nuspec
#
# - name: Pack Chocolatey package
# shell: pwsh
# run: choco pack chocolatey/djmanager.nuspec --out dist-choco/
#
# - name: Push to Chocolatey.org
# shell: pwsh
# run: |
# $pkg = Get-ChildItem dist-choco\*.nupkg | Select-Object -First 1
# if (-not $pkg) { throw "No .nupkg found in dist-choco/" }
# Write-Host "Pushing $($pkg.Name)"
# choco push $pkg.FullName --source https://push.chocolatey.org --api-key ${{ secrets.CHOCOLATEY_API_KEY }}

# ── Sync dev + bump version after master release ─────────────────────────────
# Always merges master → dev first so dev has the exact released code,
Expand All @@ -193,7 +193,7 @@ jobs:
permissions:
contents: write
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
with:
ref: dev
fetch-depth: 0
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,9 @@ env/
# Sample/test audio files
samples/

# Reverse-engineering test tracks (generated locally, not for version control)
reverse-engineering/test-tracks/

# Dev-only downloaded binaries (generated by scripts/download-analyzer.sh)
build-resources/analysis
build-resources/analysis.exe
Expand Down
32 changes: 32 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,27 @@ Audio is served over a local HTTP server (`src/audio/mediaServer.js`) instead of

`--playlist-items "1,3,5"` is passed when the user deselects tracks in the selection step.

### TIDAL Download

`src/audio/tidalDlManager.js` wraps the `tdn` CLI from the [tidal-dl-ng](https://github.com/Radexito/tidal-dl-ng-For-DJ) Python package:

- `findTidalDlPath()` — searches `~/.local/bin`, common platform paths, then falls back to `which tdn`
- `checkTidalSetup()` — checks binary presence + reads `~/.config/tidal-dl-ng/token.json` for login state
- `startLogin(onUrl)` — spawns `tdn login` with `NO_COLOR=1 TERM=dumb`, parses `link.tidal.com` URL from stdout via regex, resolves when the process exits 0
- `downloadTidal(url, outputDir, onProgress)` — saves the tidal-dl-ng `settings.json`, patches `download_base_path` to `userData/tidal_tmp` and `quality_audio` to `HiRes_Lossless`, spawns `tdn dl <url>`, **always restores** the original config in both success and error paths, then scans the output dir for new audio files by mtime

IPC channels: `tidal-check`, `tidal-login`, `tidal-download-url`. Events pushed to renderer: `tidal-progress` (per-line stdout), `tidal-login-url` (device-link URL for browser).

### Top-level navigation

`Sidebar.jsx` has a `MENU_ITEMS` array that drives the top nav. Each item has an `id` string. `App.jsx` receives `selectedPlaylistId` and branches on it:

- `'download'` → `<DownloadView>` (yt-dlp)
- `'tidal'` → `<TidalDownloadView>`
- anything else → `<MusicLibrary selectedPlaylist={id}>` (handles both `'music'` and playlist UUIDs)

**Adding a new top-level view**: add entry to `MENU_ITEMS`, add a branch in `App.jsx`, create the view component.

### Renderer / UI

- Track list uses `react-window` (`FixedSizeList`) for virtualization — `ROW_HEIGHT = 50`, `PAGE_SIZE = 50`
Expand Down Expand Up @@ -171,6 +192,17 @@ Handled client-side by `renderer/src/searchParser.js`. Supports field-qualified
- **Platform-specific test stubs**: `usbUtils.test.js` stubs `process.platform` via `vi.stubGlobal` so Linux-branch tests run correctly on Windows. Use the same pattern for any test that branches on `process.platform`.
- **Windows path in tests**: when constructing HTTP URLs from OS file paths in tests, convert with `'/' + filePath.replace(/\\/g, '/')` so paths are valid on Windows (e.g. `/C:/path/to/file`).

## GitHub API

`gh` CLI is **not installed** on this machine. Use `git credential fill` to retrieve the stored OAuth token, then call the GitHub REST API directly with `curl`:

```bash
TOKEN=$(git credential fill <<< $'protocol=https\nhost=github.com' | grep password | cut -d= -f2)
curl -s -X POST "https://api.github.com/repos/Radexito/DjManager/issues" \
-H "Authorization: token $TOKEN" -H "Content-Type: application/json" \
-d '{"title":"...", "body":"..."}'
```

## Known Issues

- **yt-dlp ffmpeg path**: yt-dlp spawned as subprocess can't find bundled ffmpeg. Pass `--ffmpeg-location <bundled ffmpeg dir>` to the yt-dlp spawn call using `getFfmpegRuntimePath()` from `deps.js`.
Loading
Loading