feat(cast): add server-managed Google Cast playback (#34)
Add server-side Google Cast discovery and sessions, signed cast media URLs, browser device picker integration, and deployment documentation. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
45
README.md
45
README.md
@ -119,6 +119,37 @@ LAYA_BASE_URL=http://localhost:8000 npm start
|
||||
|
||||
Repository maintainers can build and publish both the nodecast-tv and Laya images with `./scripts/docker-build-push.sh`; this script is not needed by Compose users. `REGISTRY`, `OWNER`, `IMAGE_NAME`, `LAYA_IMAGE_NAME`, and `TAG` can override the publication targets. Use `--no-push` to build both images locally without publishing them.
|
||||
|
||||
#### Server-side Google Cast
|
||||
|
||||
Nodecast can discover and control Chromecast and compatible Android TV devices from the server. This makes casting available from any browser: the browser asks Nodecast to start playback, while the Nodecast server performs LAN discovery and communicates with the receiver.
|
||||
|
||||
Configure both of these variables:
|
||||
|
||||
- `CAST_PUBLIC_BASE_URL`: the absolute Nodecast URL that the receiver can reach on the LAN. It must not use `localhost`, `127.0.0.1`, or `::1`.
|
||||
- `CAST_SIGNING_SECRET`: a dedicated secret of at least 32 bytes, used for temporary cookie-free media URLs. Do not reuse a public value or commit the secret.
|
||||
|
||||
For example, add the following entries to the `nodecast-tv` service in `docker-compose.yml`, replacing the address and secret:
|
||||
|
||||
```yaml
|
||||
services:
|
||||
nodecast-tv:
|
||||
environment:
|
||||
- CAST_PUBLIC_BASE_URL=http://192.168.1.50:3000
|
||||
- CAST_SIGNING_SECRET=${CAST_SIGNING_SECRET}
|
||||
```
|
||||
|
||||
Then define the secret in the deployment `.env` file. A suitable value can be generated with `openssl rand -hex 32`:
|
||||
|
||||
```env
|
||||
CAST_SIGNING_SECRET=replace-with-a-random-secret-of-at-least-32-bytes
|
||||
```
|
||||
|
||||
Restart Nodecast, open a Live or Watch player in any browser, select the Cast control, and refresh the device list if necessary. Nodecast discovers Google Cast receivers over mDNS from its own network environment; the browser itself does not need native Chromecast support.
|
||||
|
||||
Docker bridge networks may not pass multicast DNS traffic from the LAN. Depending on the host platform, discovery may require host networking or an explicitly configured Docker/LAN network. The receiver must also be able to open `CAST_PUBLIC_BASE_URL` and its media URLs.
|
||||
|
||||
Fire TV / Fire Stick is not a native Google Cast target. Matter Casting or Fire TV playback requires a compatible receiver application that is outside the scope of this integration; unsupported devices are shown as **Receiver required** rather than being presented as castable.
|
||||
|
||||
|
||||
### Hardware Acceleration Setup
|
||||
|
||||
@ -279,6 +310,20 @@ docker compose --profile laya pull laya
|
||||
docker compose --profile laya up -d --force-recreate laya
|
||||
```
|
||||
|
||||
### Server-side Cast
|
||||
|
||||
If no Chromecast or Android TV appears:
|
||||
|
||||
- Confirm that Nodecast and the receiver are on reachable LAN segments and that multicast DNS (`_googlecast._tcp`) is not blocked by Wi-Fi isolation, a firewall, VLAN rules, or Docker networking.
|
||||
- When Nodecast runs in Docker, test a host-network or LAN-compatible container configuration if the default bridge cannot see mDNS advertisements.
|
||||
- Refresh the device list from the Cast dialog and inspect `docker compose logs nodecast-tv` for discovery errors.
|
||||
|
||||
If a device is found but cannot start playback, open `CAST_PUBLIC_BASE_URL` from another device on the same network. The URL must contain the host's reachable LAN address or DNS name and the published port; a container name or `localhost` will not work from the receiver. Also check firewall access to that address.
|
||||
|
||||
If Nodecast reports that Cast signing is unavailable, set a dedicated `CAST_SIGNING_SECRET` containing at least 32 bytes and recreate the container. Nodecast deliberately refuses to issue predictable unsigned or weakly signed media URLs.
|
||||
|
||||
Fire TV, Fire Stick, and Matter Casting do not automatically provide Google Cast compatibility. Without a compatible receiver application, Nodecast reports **Receiver required**; use a Chromecast or Google Cast-enabled Android TV for this server-cast integration.
|
||||
|
||||
### Video Won't Play (Black Screen or Loading Forever)
|
||||
|
||||
| Symptom | Likely Cause | Solution |
|
||||
|
||||
Reference in New Issue
Block a user