Both machines now reflect each other's changes within a couple seconds, and
genuine Syncthing conflicts auto-merge with a backup and an alert.
- sync_watcher.py: QFileSystemWatcher (debounced, re-arms after atomic renames)
emits a single `changed`; the manager decides if it was external.
- library_manager: `reload_from_disk()` re-reads and reconciles disk into memory
(max play/skip counts, newest edit wins, playlist membership unioned), keeping
local unsaved edits and object identity so open views stay valid, then refreshes
the UI without touching the player. `flush()` records each file's (mtime, size)
so our own writes are never mistaken for an external change. New signals
library_reloaded / conflict_resolved.
- conflict_resolver: back up BOTH sides into .resolved/<ts>/{original,incoming}/
before merging, return list[ConflictSummary], add restore_backup(); runs at
startup and live.
- gui/conflict_dialog.py: modeless summary with Open/Restore backup; main_window
shows it from a status-bar notice and preserves scroll+selection on reload.
Tests: tests/test_round16.py (9) + full suite green (225).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
6.4 KiB
LinTunes — master task list
Open / future
-
when hovering the cursor over a song's rating field in the tracklist view it should light up 5 dots. Whichever song is currently hovered over there should show 5 dots and if I click on one it rates it that many stars. And if it already has stars it should only show dots where there aren't stars (so if it's rated 4 stars then there's a dot on the right of the 4 stars). I can click on already rated songs to set the rating.
-
move search to the right of library and the browse comes up to be in line with the top of the playlist list
-
[~] we need to be able to make smart playlists. They should also be properly imported from itunes. We need all the fields that itunes 12 is able to work with when creating a smart playlist. This is a complicated feature! We also need to be able to edit the criteria of a smart playlist once it is created. Smart playlists should have a little Rotated Floral Heart Bullet (❧) to the left of their title in the playlist list on the left. (Round 14 — Phase 1 done: full iTunes import (incl. nested groups, which parse + evaluate) and a flat-rule editor. Phase 2 TODO: nested-group editing UI in the dialog — until then, imported nested playlists are shown read-only. See tasks-done.md.)
-
the app should be a little more agressive about comandeering the play/pause button from other media playing on the system. If I was playing a youtube video and that was associated with play/pause, but it's been hours since I played it, and I started playing music in lintunes, I would expect the play/pause button to pause the lintunes music when I hit it— not also start playing a youtube video, you know what I mean?
-
ability to right-click a song and download album art. Is there a repo we can search to get it? Wikipedia? It should ask for confirmation the art is correct.
-
Minor: LinTunes segfaults during Qt-Multimedia/FFmpeg pipeline teardown on app exit (fires after the GUI is gone — cosmetic, no data risk since writes are atomic). Tidy the shutdown so the media objects are released cleanly.
-
Live-sync v2 (Round 16 shipped v1): per-playlist tombstones so a deletion made on one machine while the other edits the same playlist isn't resurrected by the union merge; optional per-change accept/refuse review (v1 offers whole-file restore only). Also consider a lighter per-file reload for very large libraries (v1 does a full reload + smart recompute on each external change).
-
(
tagging.read_embedded_artwork); it is NOT stored in library.json. -
Make the data dir location a preference (currently only settable via
--data-dir/--save-config).Artwork migration still to run against the live library (before relying on it):
python3 scripts/audit_artwork.py --data-dir <data> --xml "<iTunes XML>"(read-only) to re-confirm the counts on the freshly-imported library.python3 scripts/recover_artwork.py --data-dir <data> --dry-run, review, then re-run with--writeto embed the covers into the files.
done
-
confirm last fm works
-
do do a volume slider, this can some space between the visualizer and the timeline.
-
I'd like in the preferences to have a colors adjustment for each area setting: background, round-rec of buttons, the (currently white) behind the track/artist/album text, the color of that text itself, and the color of the gray of the stripes in the tracklisting. Each of those should have a slider from black to white that appears immediately so the user can tweak it to their liking.
-
visualizer should have more discrete mode that's a light gray on light gray
-
the ability to not just copy/paste a song but also to ctrl-x cut a song from one space and ctrl-v paste it somewhere else. AND when pasting a song(s) it should paste above the currently selected track. That's where it pastes to, not to the end of the playlist.
-
if the user is dragging a track around and they drag above the top of the track list, the track list should scroll up. Same if they hover the track below the track list at the bottom it scrolls down. The track list should scroll in the direction the user is hovering the track. This helps the user move a track to a place in a playlist that isn't currently seen.
-
Move data dir to
/run/media/trav/tummult/music/lintunes/— done 2026-07-01 (fresh import written there, config saved with--save-config). Track paths are now stored relative to the data dir (lintunes/paths.py, applied at thejson_storageboundary) so the Syncthing-shared library is portable to the second machine regardless of its mount point. See tasks-done.md Round 15.- Run the real import on trav's library — done 2026-07-01: 21,382 tracks,
462 playlists + 21 folders, 18 smart playlists (3 kept as snapshot), 5 missing
files, 1,324 case/unicode path fixes. Imported to the synced data dir; old
./datakept as a rollback backup until machine 2 is confirmed.
- Run the real import on trav's library — done 2026-07-01: 21,382 tracks,
462 playlists + 21 folders, 18 smart playlists (3 kept as snapshot), 5 missing
files, 1,324 case/unicode path fixes. Imported to the synced data dir; old