- Add Hermes webhook settings form in /admin/settings (URL + HMAC secret)
- Add /admin/request/<id>/send-to-hermes action
- POST request data to Hermes with V2 HMAC signature and callback URL
- Hermes can POST the generated MusicGPT prompt back to /api/prompt/<id>
- Add test button, update README workflow, bump version to 0.9.0
Add regina_dt Jinja2 template filter that converts UTC ISO-8601 timestamps
to America/Regina timezone and formats them as 'Weekday, Month D, YYYY @ H:MMam/pm'.
Applied to preview_sent_at and delivery_sent_at on the admin request page.
- New reprocess_stems admin action triggers Gokapi upload manually
- Button appears in Stems/Extras Link section when stems_url exists
but stems_link is empty (webhook fired before Gokapi was configured)
- Updated share link description and placeholder for Gokapi URLs
- New helpers: parse_stems_urls, upload_to_gokapi, process_stems_to_gokapi
- Stems webhook handler now downloads stem files from MusicGPT CDN,
zips them, uploads to Gokapi with 30-day expiry, saves the Gokapi
download URL to stems_link in the DB
- Download Stems button uses stems_link (Gokapi URL) when available,
falls back to the zip endpoint if not
- Config: GOKAPI_URL, GOKAPI_API_KEY, GOKAPI_EXPIRY_DAYS env vars
- docker-compose: GOKAPI_* environment variables added
- Both steppers now show green checkmark on final step when completed
instead of leaving it highlighted as 'current' (blue)
- Stems error is cleared at the start of every generate_stems attempt,
not just on success — no stale error messages after retry
- Radio buttons in stems section use same compact spacing as checkboxes
- Webhook no longer overwrites cost estimate with 0 when conversion_cost
is missing from the payload
- Per-version costs (A/B) are tracked separately and summed into total
- Stems cost is only overwritten when a non-zero cost is reported
- Template shows combined total (songs + stems) with breakdown
- Added musicgpt_cost_a and musicgpt_cost_b columns to schema
- New /admin/request/<id>/download-stems endpoint
- Parses stems_url (label: url; label: url format), fetches each stem file,
bundles them into a zip served as an attachment download
- If MusicGPT returns a single .zip bundle URL, redirects directly
- Template button now points to the zip endpoint instead of raw CDN URLs
- Radio buttons to select Version A or B MP3 as stems source
- New /api/audio-source endpoint serves single MP3 for Extraction API
- Backend reads radio selection, constructs public URL automatically
- Download Stems button appears when stems are ready
- Generate button disabled when no MP3s are available