v0.36.0: a playlist link says so before it downloads

Pasting a song from a YouTube Mix (watch?v=…&list=RD…) imported song
after song: yt-dlp takes the whole list by default, and a Mix runs to
thousands of rows and loops back on itself, so the linked song came in
again and again with nothing on screen saying why.

Now anything but a plain song link is listed first (--flat-playlist,
streamed into the dialog). One song goes straight through. Several become
a checklist: a song-in-a-list link ticks only its song and offers Just
This Song without waiting, and a playlist link ticks everything. Rows are
de-duplicated by id. The chosen songs download by their own pages, never
the list link, and more than one gets a per-song progress window (Hide
keeps downloading; the status-bar line brings it back).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-02 17:41:55 -07:00
co-authored by Claude Opus 5.5
parent ad1d152948
commit ac682774e9
9 changed files with 1185 additions and 102 deletions
+14
View File
@@ -351,6 +351,20 @@ persistence) → GUI (Qt widgets that read the manager and connect to its signal
Firefox first), and a browser that worked is saved as
`ytdlp_cookies_browser` in **`config.json`**, not preferences — which
browser holds a YouTube login is this machine's business (Round 59).
**A link is listed before it downloads** (Round 75): trav pasted a song
from a YouTube Mix (`watch?v=…&list=RD…`), yt-dlp took the whole list,
and songs kept arriving with no word why. `link_kind` (URL alone) lets
only a plain song link skip the listing; everything else goes through
`PlaylistProbe` (`--flat-playlist`, one `LTENTRY` line per song, streamed
into the dialog's checklist). A song-in-a-list ticks only its song (plus a
**Just This Song** button that doesn't wait), a playlist link ticks all.
Measured on the real Mix: ~36 s to the first row, 2,967 rows, the linked
song **8 times** (a Mix loops), so rows are de-duplicated by id. Chosen
songs download by **their own page URLs**, never the list link or
`--playlist-items`, since a Mix reshuffles on every listing. Several songs
get `gui/url_import_progress.py`, a non-modal per-song list (Hide keeps
downloading; clicking the status-bar line reopens it). `LTSTART` carries
the id, and `ERROR: [site] <id>: …` lines become `item_failed`.
- **`lintunes/mpris.py`** — registers `org.mpris.MediaPlayer2.lintunes` over D-Bus
so the desktop's media keys / now-playing popup control playback. Spacebar and