Commit graph

125 commits

Author SHA1 Message Date
Troll (Hermes Agent)
0a01381d44 v0.6.0: form limits, callback expiry, dashboard filter, payment ref, STEMS interest, helper refactor 2026-08-09 05:18:40 +00:00
Troll (Hermes Agent)
0bfe8c315c Add STEMS note to FAQ file format answer (v0.5.9) 2026-08-09 04:58:19 +00:00
Troll (Hermes Agent)
613abf8041 Add FAQ entry for supported languages (v0.5.8) 2026-08-09 04:40:24 +00:00
Troll (Hermes Agent)
5ba4f28faf feat: add ntfy access token support
- ntfy push notifications now include a Bearer access token when configured
- Add Access Token field to /admin/settings next to server and topic
- Token is stored encrypted like the SMTP password
- Bump version to 0.5.7
2026-08-07 17:21:04 +00:00
Troll (Hermes Agent)
a56f6e498b feat: add ntfy push notifications for new requests
- Add ntfy server/topic settings in /admin/settings next to Hermes API key
- POST a push notification to the configured topic on every new customer request
- Add a Send Test ntfy button to verify configuration
- Add requests dependency for ntfy HTTP calls
- Bump version to 0.5.6
2026-08-07 17:14:02 +00:00
Troll (Hermes Agent)
410a9cf021 chore: migrate build context label to Gitea; bump version to 0.5.5 2026-08-07 16:25:20 +00:00
Troll (Hermes Agent)
214b9f803d ci: allow web/manual pipeline trigger for CI skeleton 2026-08-07 02:31:09 +00:00
Troll (Hermes Agent)
2e203d8c58 ci: add minimal syntax-check CI skeleton; docs: update REVIEW.md accordingly 2026-08-07 02:10:08 +00:00
Troll (Hermes Agent)
ac95ebdef1 docs: update REVIEW.md with recent features, correct callback expiry, add CI skeleton notes 2026-08-07 02:08:59 +00:00
Troll (Hermes Agent)
52415c41fe Show request ID in kiosk queue
Each active request in the kiosk Live Queue now displays its
request number before the customer name (e.g. #42 jess) so
multiple requests from the same email can be distinguished.

Bumps version to 0.5.4.
2026-08-05 20:31:55 +00:00
Troll (Hermes Agent)
52558010e8 Add Live Queue slide to kiosk rotation
- Added a third kiosk slide showing the active customer queue.
- Customer names are derived from the local-part of their email address.
- Statuses are mapped to friendly labels:
    pending -> Received
    prompt_ready / songs_uploaded -> Trollgorithm Recording in Studio
    revisions_requested -> Waiting for Customer Response
    awaiting_payment -> Payment Due
- Completed/delivered statuses are not shown.
- If the queue overflows, a note points customers to the status page.
- Added queue-only mode (kiosk_cycle_seconds = 1) and updated the
  cycle logic to rotate QR -> pricing -> queue.
- Updated /admin/settings help text for the new mode.

Bumps version to 0.5.3.
2026-08-05 20:27:33 +00:00
Troll (Hermes Agent)
96b6470c25 Fix delete-song checkbox alignment on admin request page
- Wrapped each Version A/B row in a flex .song-row container so the
  checkbox sits inline with the label instead of floating above it.
- Added generous gaps/margins since this page is desktop-only.

Bumps version to 0.5.2.
2026-08-05 20:08:22 +00:00
Troll (Hermes Agent)
7eb72e511d Add delete-songs controls to admin request page
Operators can now select Version A and/or Version B in the Upload Songs
section and click 'Delete Selected Songs'. The handler removes the
chosen MP3 files, clears their DB paths, resets customer_approved to
'none', and sets the request status back to 'prompt_ready' so new
songs can be uploaded.

Bumps version to 0.5.1.
2026-08-05 20:05:20 +00:00
Troll (Hermes Agent)
d7e54809c9 Add Limitations section to FAQ
Added a new 'Limitations' section after 'Versions & revisions' using
the content from /mnt/Storage/FAQ.txt. Covers prohibited topics,
explicit lyrics, customer-provided lyrics, and karaoke-style
requests.

Bumps version to 0.5.0.
2026-08-05 19:59:24 +00:00
Troll (Hermes Agent)
d9566f4158 Update extra requests label and placeholder on customer form
- Label now reads: 'Anything else you want in the song? (Trollgorithm is very literal, so be careful!)'
- Placeholder updated to: 'Specific Lyrics, clean/explicit...'

Bumps version to 0.4.9.
2026-08-05 19:27:27 +00:00
Troll (Hermes Agent)
da7dd0e9ee Include lyrics in delivery email
The final delivery email now appends a Song Lyrics section in the same
format shown on the customer player page: section headers like
[Chorus] are stripped, blank lines are preserved as stanza breaks,
and the lyric lines are rendered as plain text.

Bumps version to 0.4.8.
2026-08-05 17:44:11 +00:00
Troll (Hermes Agent)
3f7bbf4b12 Add required pronouns dropdown and fix admin vocal gender selector
- Added a required Pronouns dropdown to /request and /admin/request:
  He/Him/His, She/Her/Hers, They/Them/Their.
- Moved Email to the top of the customer request form; Pronouns sit just below Name.
- Added  column to the requests schema with automatic migration.
- Stored pronouns are included in confirmation emails and Hermes prompt copy.
- Fixed /admin/request so Preferred singer voice / gender is a dropdown
  matching the customer form instead of a free-text input.
- Updated README to describe pronouns and the structured style selectors.

Bumps version to 0.4.7.
2026-08-05 17:21:38 +00:00
Troll (Hermes Agent)
10ee182558 Replace free-text genre field with structured style dropdowns
The customer request form previously had an open 'Style / genre / mood'
text field, which produced inconsistent genre descriptions and confused
Suno. Replace it with three dropdowns:

- Decade / era (required) — loaded from /mnt/Storage/Decades.txt
- Basic style (required) — loaded from /mnt/Storage/Music Genres.txt
- Additional style (optional) — same genre list

The combined value is stored in the existing style_genre column as a
comma-separated string (e.g. '1980's, Pop, Funk'), so no schema change
is required. The admin request page exposes the same dropdowns for
corrections, and the copy-to-Hermes prompt formats the style as a clean
sentence like '1980's-era Pop with Funk influences'.

The canonical lists live in /mnt/Storage; bundled copies under lists/
act as a fallback when that mount is unavailable in the container.

Bumps version to 0.4.6 and updates README.
2026-08-05 17:03:28 +00:00
Troll (Hermes Agent)
d79c58691a Document config vars and rewrite README
- Clarified HERMES_API_KEY and PRICE_PER_VERSION comments in config.py.
- Completely rewrote README.md with:
  - version, overview, and table of contents
  - page-by-page customer and admin guide
  - status flow table
  - detailed /admin/settings section
  - Docker / Portainer install process
  - full environment variable table
  - local development and troubleshooting sections
2026-08-05 16:20:08 +00:00
Troll (Hermes Agent)
235507f499 Extend callback token expiry from 1 hour to 7 days
The signed callback token for /api/prompt/<rid> expired after 1 hour.
That was too short for a workflow where the operator may copy the URL and
paste it to Hermes, then wait for a response. Extend to 7 days.

Also fixes the misleading 401 on expired tokens (token check runs before
API key check). The new /api/key-test endpoint lets callers verify the
API key independently.

Bump version 0.4.4 -> 0.4.5.
2026-08-05 14:44:25 +00:00
Troll (Hermes Agent)
2637cdba61 Add /api/key-test diagnostic endpoint for API key verification
Provides a simple GET endpoint that validates the Authorization Bearer
token against HERMES_API_KEY and returns JSON:
  {"ok": true, "reason": "valid"} or
  {"ok": false, "reason": "key_mismatch" / "missing_bearer" / "not_configured"}

Rate limited to 4 per minute to prevent brute-force guessing.

Bump version 0.4.3 -> 0.4.4.
2026-08-05 14:41:39 +00:00
Troll (Hermes Agent)
4b48e0a44f Fix TypeError when revision_count is stored as TEXT
The previous schema migration added revision_count as TEXT. SQLite stores
the default as TEXT, but the app does integer arithmetic on it, causing:

  TypeError: unsupported operand type(s) for -: 'int' and 'str'

- init_db() now adds revision_count as INTEGER.
- app.py casts revision_count to int in play() and revise() and when
  incrementing in revise(), so existing TEXT values also work.

Bump version 0.4.2 -> 0.4.3.
2026-08-05 14:25:07 +00:00
Troll (Hermes Agent)
f5d3d487af Fix 500 on /play/<token>/revise for missing revision_count column
Deployed DBs persisted without the revision_count column / revision_history
table, causing customer revision requests to 500.

- init_db() now migrates existing tables by adding missing columns.
- log_revision() falls back to init_db() on missing table for full repair.
- Bump version 0.4.1 -> 0.4.2.
2026-08-05 13:51:53 +00:00
Troll (Hermes Agent)
3f9de1449c Fix 500 on customer revision when revision_history table is missing
Deployed databases can persist without the revision_history table,
causing /play/<token>/revise to crash with sqlite3.OperationalError.

- log_revision() now creates the table on the fly if it is missing.
- app.py runs init_db() at import time (safe CREATE TABLE IF NOT EXISTS)
  so new deployments auto-create missing tables on startup.

Bump patch version 0.4.0 -> 0.4.1.
2026-08-05 13:42:10 +00:00
Troll (Hermes Agent)
7ab8388741 Allow Hermes callback endpoint to accept revision prompts
/api/prompt/<rid> previously rejected any request not in 'pending'
status. This blocked the revision workflow from using the callback.

Now the endpoint accepts 'pending' (sets status to 'prompt_ready') and
'revisions_requested' (keeps status as 'revisions_requested' so the
operator still sees it needs new song uploads).
2026-08-05 03:30:51 +00:00
Troll (Hermes Agent)
51f7ffd5ab Add revision prompt copy button for Hermes on admin request page
When a request has revision_note set, the operator now sees a
'Copy revision prompt for Hermes' button in the revision note box.
It copies a prompt that includes:
- the original customer brief,
- the previously generated title/style/lyrics,
- the customer's revision request,
- the signed callback URL and expected JSON shape.

Minor version bump: 0.3.0 → 0.4.0.
2026-08-05 03:25:34 +00:00
Troll (Hermes Agent)
da6df64fbf Update README with current version v0.3.0 2026-08-05 03:19:00 +00:00
Troll (Hermes Agent)
db249e80bd Add VERSION file and live version display on settings page
- New VERSION file at project root, starting at 0.3.0.
- config.py reads VERSION and exposes it as Config.VERSION.
- Admin settings page now renders the live version from config.
- Semantic versioning convention: MAJOR for breaking/user-facing changes,
  MINOR for new features, PATCH for bug fixes and small polish.
2026-08-05 03:17:16 +00:00
Troll (Hermes Agent)
d9e198e397 Bump version tag to v0.3 on admin settings page 2026-08-05 03:13:21 +00:00
Troll (Hermes Agent)
2b46f7d3dc Guard customer_approved null/None in all templates
Some rows (schema drift, cancelled requests, manual status edits) have
customer_approved = NULL instead of the default 'none'. Templates called
.upper() on it blindly, causing a Jinja2 UndefinedError / 500 when the
customer player or admin pages loaded.

Replace all .upper() calls with (value or 'none').upper() and add truthy
checks before rendering the approved choice in status.html and
dashboard.html.
2026-08-05 03:11:21 +00:00
Troll (Hermes Agent)
9524a24715 Fix TypeError when loading max_revisions from settings JSON
The customer player page (/play/<token>) and revision endpoint were
reading max_revisions directly from booth_settings.json, where it is
stored as a string. Arithmetic/comparison with revision_count (an int)
raised TypeError and caused a 500 error when opening the customer player.

Add get_max_revisions() helper that always returns a non-negative int,
and use it in play(), revise(), and admin_settings().
2026-08-05 03:04:48 +00:00
Troll (Hermes Agent)
b8ddff9afe Update README and REVIEW with all new features (kiosk, pricing, cancelled status, revision history, stems, sales, backups) 2026-08-04 20:46:47 +00:00
Troll (Hermes Agent)
8de32d91b7 Move revision history above operator notes, move cancel button next to status with confirmation 2026-08-04 18:58:49 +00:00
Troll (Hermes Agent)
968a6fb43c Add Cancelled status and cancel request button 2026-08-04 17:56:02 +00:00
Troll (Hermes Agent)
fd58cf47da Reorder Suno copy buttons to Lyrics, Style, Title 2026-08-04 17:49:44 +00:00
Troll (Hermes Agent)
985092d629 Remove footer URL from kiosk page 2026-08-04 17:46:49 +00:00
Troll (Hermes Agent)
9cc1bd94a6 Trim Hermes API key section on settings page 2026-08-04 17:45:16 +00:00
Troll (Hermes Agent)
c726525c8e Add public kiosk page with QR/pricing cycle and configurable slide timing 2026-08-04 17:41:33 +00:00
Troll (Hermes Agent)
a25bf3a9c9 Add admin Pricing page with fixed and custom items 2026-08-04 17:17:57 +00:00
Troll (Hermes Agent)
a3fd5938a5 Detect missing tables in DB health check and always show schema fix button 2026-08-04 16:59:54 +00:00
Troll (Hermes Agent)
cda4d57859 Add revision history log and music files ZIP backup 2026-08-04 16:54:51 +00:00
Troll (Hermes Agent)
8246f641a2 Move request status badge to top of admin request page 2026-08-04 16:45:24 +00:00
Troll (Hermes Agent)
0c90b5a298 Make all customer info fields editable from admin request page 2026-08-04 16:32:17 +00:00
Troll (Hermes Agent)
da917692f0 Add admin Sales report page 2026-08-04 01:20:56 +00:00
Troll (Hermes Agent)
d02d0b3d25 Add stems_link support for Pingvin-Share-X delivery 2026-08-04 01:10:15 +00:00
Troll (Hermes Agent)
02f1d05301 chore: remove stray test settings file 2026-08-03 22:55:59 +00:00
Troll (Hermes Agent)
a72da4c5da ui: remove Hermes API key regenerate button from admin settings
Key is now managed via HERMES_API_KEY env var only.
2026-08-03 22:55:55 +00:00
Troll (Hermes Agent)
107e558aea revert: HERMES_API_KEY env var takes precedence over runtime settings
Simpler ops model: set the key in Portainer environment variables.
2026-08-03 22:54:45 +00:00
Troll (Hermes Agent)
fc700f2d82 fix: tolerate plaintext Hermes API key in booth_settings.json
The regenerate button stores encrypted keys, but legacy/manual writes may
save plaintext. get_hermes_api_key now falls back to returning the raw
value if Fernet decryption fails.
2026-08-03 22:47:57 +00:00
Troll (Hermes Agent)
06d87eb600 fix: persist runtime settings next to database so they survive redeploys 2026-08-03 22:37:57 +00:00