---
id: plugin.now_playing
title: Song Overlay
scope: plugins
status: active
priority: 10
visibility: user
category: Plugin
tags: plugin, now_playing
generated: true
editable: false
---
# Song Overlay
Provider-neutral song state, chat announcements, and a customizable Lumi Overlay source.
## Metadata
Plugin ID: now_playing
Version: 0.1.3
Default state: enabled
## Web Routes
- /plugins/now_playing
- GET /plugins/now_playing
- POST /plugins/now_playing/settings
- POST /plugins/now_playing/overlay/install
- POST /plugins/now_playing/overlay/remove
- POST /plugins/now_playing/test-announcement
- GET /plugins/now_playing/api/companion/ping
- POST /plugins/now_playing/api/companion/state
- GET /plugins/now_playing/render/:token
- GET /plugins/now_playing/render/:token/state
- GET /plugins/now_playing/render/:token/events
- GET /plugins/now_playing/render/:token/cover/:hash
## Route Reference
### MOUNT /plugins/now_playing

- Purpose: Mounts the plugin router at this base WebUI path.
- Inputs: No request parameters detected by static analysis.
- Response format: Plugin router mount point.
- Access: Access is controlled by the mount options and individual plugin routes.
- Side effects: No direct route action; child routes handle requests.
- Limits/notes: Mount metadata is inferred from static source scanning.

### GET /plugins/now_playing

- Purpose: Renders or serves the now_playing plugin page.
- Inputs: No request parameters detected by static analysis.
- Response format: HTML page rendered from an EJS view
- Access: No explicit access guard detected in the route handler; check surrounding router/mount middleware.
- Side effects: Usually read-only.
- Limits/notes: Generated from static route source analysis; confirm exact behavior in the handler before changing integrations.

### POST /plugins/now_playing/settings

- Purpose: Processes the now_playing plugin action for settings.
- Inputs: body: full submitted body is passed to a helper; exact fields are defined by the matching form/service
- Response format: HTTP redirect after handling the request
- Access: No explicit access guard detected in the route handler; check surrounding router/mount middleware.
- Side effects: writes or mutates server-side state
- Limits/notes: Generated from static route source analysis; confirm exact behavior in the handler before changing integrations. Errors are caught and usually returned as a flash message, JSON error, or error page. Most non-API POST routes are browser form submissions and usually redirect after completion.

### POST /plugins/now_playing/overlay/install

- Purpose: Processes the now_playing plugin action for overlay install.
- Inputs: body: `scene_id`
- Response format: HTTP redirect after handling the request
- Access: No explicit access guard detected in the route handler; check surrounding router/mount middleware.
- Side effects: writes or mutates server-side state
- Limits/notes: Generated from static route source analysis; confirm exact behavior in the handler before changing integrations. Errors are caught and usually returned as a flash message, JSON error, or error page. Most non-API POST routes are browser form submissions and usually redirect after completion.

### POST /plugins/now_playing/overlay/remove

- Purpose: Processes the now_playing plugin action for overlay remove.
- Inputs: No request parameters detected by static analysis.
- Response format: HTTP redirect after handling the request
- Access: No explicit access guard detected in the route handler; check surrounding router/mount middleware.
- Side effects: writes or mutates server-side state
- Limits/notes: Generated from static route source analysis; confirm exact behavior in the handler before changing integrations. Errors are caught and usually returned as a flash message, JSON error, or error page. Most non-API POST routes are browser form submissions and usually redirect after completion.

### POST /plugins/now_playing/test-announcement

- Purpose: Processes the now_playing plugin action for test announcement.
- Inputs: No request parameters detected by static analysis.
- Response format: HTTP redirect after handling the request
- Access: logged-in session required or used
- Side effects: Action route; side effects were not detected statically.
- Limits/notes: Generated from static route source analysis; confirm exact behavior in the handler before changing integrations. Errors are caught and usually returned as a flash message, JSON error, or error page. Most non-API POST routes are browser form submissions and usually redirect after completion.

### GET /plugins/now_playing/api/companion/ping

- Purpose: Renders or serves the now_playing plugin page for api companion ping.
- Inputs: No request parameters detected by static analysis.
- Response format: JSON response
- Access: No explicit access guard detected in the route handler; check surrounding router/mount middleware.
- Side effects: Usually read-only.
- Limits/notes: Generated from static route source analysis; confirm exact behavior in the handler before changing integrations. API consumers should expect JSON unless the response format says otherwise.

### POST /plugins/now_playing/api/companion/state

- Purpose: Processes the now_playing plugin action for api companion state.
- Inputs: body: full submitted body is passed to a helper; exact fields are defined by the matching form/service
- Response format: JSON response
- Access: No explicit access guard detected in the route handler; check surrounding router/mount middleware.
- Side effects: writes or mutates server-side state
- Limits/notes: Generated from static route source analysis; confirm exact behavior in the handler before changing integrations. Errors are caught and usually returned as a flash message, JSON error, or error page. Most non-API POST routes are browser form submissions and usually redirect after completion. API consumers should expect JSON unless the response format says otherwise.

### GET /plugins/now_playing/render/:token

- Purpose: Renders or serves the now_playing plugin page for render token.
- Inputs: path params: `token`
- Response format: HTML page rendered from an EJS view
- Access: No explicit access guard detected in the route handler; check surrounding router/mount middleware.
- Side effects: Usually read-only.
- Limits/notes: Generated from static route source analysis; confirm exact behavior in the handler before changing integrations.

### GET /plugins/now_playing/render/:token/state

- Purpose: Renders or serves the now_playing plugin page for render token state.
- Inputs: path params: `token`
- Response format: JSON response
- Access: No explicit access guard detected in the route handler; check surrounding router/mount middleware.
- Side effects: Usually read-only.
- Limits/notes: Generated from static route source analysis; confirm exact behavior in the handler before changing integrations.

### GET /plugins/now_playing/render/:token/events

- Purpose: Renders or serves the now_playing plugin page for render token events.
- Inputs: path params: `token`
- Response format: streaming event response
- Access: No explicit access guard detected in the route handler; check surrounding router/mount middleware.
- Side effects: writes or mutates server-side state
- Limits/notes: Generated from static route source analysis; confirm exact behavior in the handler before changing integrations.

### GET /plugins/now_playing/render/:token/cover/:hash

- Purpose: Renders or serves the now_playing plugin page for render token cover hash.
- Inputs: path params: `hash`, `token`
- Response format: static file response
- Access: No explicit access guard detected in the route handler; check surrounding router/mount middleware.
- Side effects: Usually read-only.
- Limits/notes: Generated from static route source analysis; confirm exact behavior in the handler before changing integrations.
## Commands
- No plugin command triggers detected.
## Source
Plugin folder: plugins/now_playing
