mirror of
https://github.com/got-feedBack/feedBack.git
synced 2026-08-10 18:59:56 +00:00
Pass per-stem name/description through to the stems payloads (#1013)
ship-ci / ci (push) Waiting to run
ship-ci / ci (push) Waiting to run
feedpak 1.16.0 (spec §5.3) added two OPTIONAL presentational fields to a
stems[] entry: `name` (display label, Readers fall back to the id) and
`description` (free text). The server dropped both while normalizing
manifest stems, so no client could ever display them.
Pass them through at the one place stem descriptors are built
(sloppak.load_song) and let both payload builders — the WS `ready` stems
list and the REST `/api/song/{f}?stems=1` preload list, which are pinned
against each other by test — carry them forward. Omit-when-absent, so a
stem without the fields does not grow null keys; non-string or blank
values are dropped rather than surfaced.
No behaviour change for existing packs or clients: the fields are
additive and every consumer that reads {id,url,default} keeps working
unchanged. The stems plugin / stem mixer display work lands separately.
Signed-off-by: topkoa <topkoa@gmail.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5
parent
270cb39f41
commit
35c0d0ea0d
@@ -59,7 +59,8 @@ def _ws_payload(tmp_path, pak):
|
||||
return {
|
||||
"stems": [
|
||||
{"id": s["id"], "url": f"/api/sloppak/{q}/file/{quote(s['file'])}",
|
||||
"default": s["default"]}
|
||||
"default": s["default"],
|
||||
**{k: s[k] for k in ("name", "description") if k in s}}
|
||||
for s in loaded.stems
|
||||
],
|
||||
"full_mix_url": f"/api/sloppak/{q}/file/{quote(loaded.full_mix)}" if loaded.full_mix else None,
|
||||
@@ -128,6 +129,33 @@ def test_rest_matches_the_ws_for_a_single_full_pack(tmp_path):
|
||||
assert rest["full_mix_url"] is None
|
||||
|
||||
|
||||
def test_stem_name_and_description_pass_through(tmp_path):
|
||||
"""feedpak 1.16.0 per-stem `name`/`description` (spec §5.3) reach the payload.
|
||||
|
||||
Presentational, so the rule is passthrough-or-omit: a stem that carries the
|
||||
fields keeps them, a stem that doesn't must NOT grow null keys, and
|
||||
non-string / blank values are dropped rather than surfaced.
|
||||
"""
|
||||
pak = _pak(tmp_path, [
|
||||
{"id": "guitar", "file": "stems/guitar.ogg", "name": "Rhythm Guitar"},
|
||||
{"id": "click", "file": "stems/click.ogg", "name": "Click",
|
||||
"description": "Metronome click with 4-count lead-in.", "default": "off"},
|
||||
{"id": "bass", "file": "stems/bass.ogg"},
|
||||
{"id": "junk", "file": "stems/junk.ogg", "name": 7, "description": " "},
|
||||
], name="Labelled.feedpak")
|
||||
|
||||
rest = _payload(tmp_path, pak)
|
||||
assert rest == _ws_payload(tmp_path, pak)
|
||||
by_id = {s["id"]: s for s in rest["stems"]}
|
||||
assert by_id["guitar"]["name"] == "Rhythm Guitar"
|
||||
assert "description" not in by_id["guitar"]
|
||||
assert by_id["click"]["name"] == "Click"
|
||||
assert by_id["click"]["description"] == "Metronome click with 4-count lead-in."
|
||||
assert by_id["click"]["default"] is False
|
||||
assert "name" not in by_id["bass"] and "description" not in by_id["bass"]
|
||||
assert "name" not in by_id["junk"] and "description" not in by_id["junk"]
|
||||
|
||||
|
||||
def test_a_broken_pack_yields_an_empty_list_not_an_error(tmp_path):
|
||||
# Preloading is an optimisation: an unreadable pack must fall back to the
|
||||
# normal WS-driven path, never break the song-info request.
|
||||
|
||||
Reference in New Issue
Block a user