Stops double-counting when iPod Nano 7G regenerates Play Counts
file after a DB write (firmware quirk, new mtime with stale data).
Architecture:
- Mount: only max(cache, base) — never reads Play Counts delta
- 2s after mount → auto-sync worker: reads delta, subtracts stored
(persistent guard), applies effective to cache, defers DB write
- iTunesDB commit deferred to next stable mount (checks W_OK first)
- read_play_stats() uses 3s retry + read_play_counts_delta() fallback
(filesystem-based PC parsing, independent of iTunesDB I/O errors)
Changes:
- ipod_nano7_db.py: sync_itunescdb() returns bool; new
read_play_counts_delta() method; get_all_tracks() no longer adds
delta; _merge_play_stats() drops delta addition; suppress iOpenPod
ERROR logs to CRITICAL
- library_cache.py: schema v2 with playcounts_log table +
get/set_last_synced_delta, migration from v1
- worker.py: session guards (_processed_fwids, _auto_synced_fwids,
_pending_commit_fwids); auto_sync_playcounts task; deferred commit
in mount
- app.py: QTimer.singleShot(2000) after mount for auto-sync
- ipod_tab.py: _on_auto_state_changed rewritten (no unmount, mp guard)
- library_tab.py: refresh_play_counts_from_cache() method