v0.11.1: a web mix stops shipping an .m3u

It was there on the theory that it cost nothing and let the folder double as a
plain music folder. But a web mix is a folder you upload, and a stray playlist
file next to index.html is one more thing to explain to whoever receives it.

plan.m3u_name is now "" for WEB, so the plan doesn't name a file it won't
write, and index.html is simply the last thing written — which is what the
manifest-last invariant always meant for that branch. Folder exports keep
their m3u unchanged.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JBSM2bFC6UToiEg8BE4dqj
This commit is contained in:
2026-08-22 15:22:01 -04:00
co-authored by Claude Opus 5
parent 800e8ffb5d
commit a61cbaa369
5 changed files with 37 additions and 18 deletions
+4 -2
View File
@@ -171,8 +171,10 @@ persistence) → GUI (Qt widgets that read the manager and connect to its signal
and `build_m3u`: pure `plan_export()` first, then `ExportWorker` on a daemon
thread. Two destinations — a **folder** (files as `Artist - Title.ext` plus an
`.m3u`) or a **web mix** (`index.html` + `audios/` + hero image, from
`templates/`). **The manifest is written last**, so an interrupted export
never leaves a page or m3u naming files that aren't there. `web_support.py`
`templates/`; **no m3u** — it's a folder you upload, not one you open in a
player, so `plan.m3u_name` is `""` there). **The manifest is written last**,
so an interrupted export never leaves a page or m3u naming files that aren't
there. `web_support.py`
is the format gate, shaped like `cast/support.py`: deny-by-default on the
suffix with the iTunes `kind` breaking the `.m4a` tie. **Bitrate never
triggers a conversion** — only unplayability does — and every conversion