Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Playlists and Plex

One current m3u8 per playlist kind lives in playlists/ (weekly-jams.m3u8, weekly-exploration.m3u8, daily-jams.m3u8), replaced on every sync and mirroring the playlist on Plex. The week it replaces is kept under playlists/archive/<kind>/<period>.m3u8, ISO week for weekly kinds and the date for daily ones, never pushed unless you ask. Tracks that drop out of a playlist are never deleted: they stay in the library, only the playlist changes. Playlist folders and files are lowercase slugs; your library’s own paths follow path_template and the targets show playlist_title.

td push takes a fetched playlist or any m3u8 file (the archive, a backup, something hand-written); a same-titled playlist on the target is backed up first and replaced. td unpush removes a playlist from a target only, backup first. td remote ls, rm, backup and restore manage what another tool left on the target.

YouTube playlists

td import <link> takes a YouTube or YouTube Music playlist (any link with list=, album lists OLAK5uy_… included). Each video is matched to a MusicBrainz recording the way a request is, then downloaded through the normal path, YouTube Music’s song first, length checked. So a playlist of music videos still ends up as album audio without the intros and skits. The playlist keeps YouTube’s title and order, gets its own m3u8 (youtube-<list id>.m3u8) and is pushed like any other. Running it again later picks up new entries; a video imported before keeps the recording it got then, and a row an earlier run added that is no longer on the playlist (and was never downloaded) is dropped. An import downloads its own playlist only, not the rest of the queue. For an album’s playlist, a recording from the release the playlist is named after wins over the same song on a best-of.

td import "https://www.youtube.com/playlist?list=PL…"            # dry run: what matches, what is unsure
td import "https://www.youtube.com/playlist?list=PL…" --apply    # import the sure ones
td import "https://www.youtube.com/playlist?list=PL…" --apply --also 4,9   # and the top match of 4 and 9

An entry is sure when title, artist and version match its MusicBrainz recording and the uploader is the artist, a label or Topic channel, or the playlist’s own curator. Everything else is listed with the reason. Close matches are asked about too, never taken on their own: an entry found only under the primary artist (“S.A.R.S.” for “S.A.R.S. & Ničim izazvan”), or, for an album’s playlist, the album track at the same position with a similar title or a fitting length (“Razguliana” ≈ “Razgulijana”, track 7). Their note says why, and --also takes the match it found. What an external library (Lidarr) already has is not downloaded. Mixes (RD… lists, which YouTube makes up as you go) and private lists (liked music, watch later; they need a signed-in account) are refused; unlisted playlists work.

Plex

The library (as Plex sees it, after path_map) has to be inside one of the folders the section scans, or Plex will never index the files. tapedeck checks this before pushing and fails with the section’s folder list if it isn’t; add the library as another folder of the section in Plex’s settings.

On each push tapedeck triggers a scan of the section, waits for it to finish, matches files by path, deletes any existing playlist with the same name and recreates it. The Plex playlist is named after the playlist kind (Weekly Jams), so it is replaced each week rather than piling up. The m3u8 on disk (playlists/weekly-jams.m3u8) follows the same rule; the week it replaces is kept under playlists/archive/weekly-jams/2026-w41.m3u8. Tracks that leave a playlist stay in the library.