90 lines
2.7 KiB
Markdown
90 lines
2.7 KiB
Markdown
# Viewer Count Setup
|
|
|
|
Viewer counts are read from MediaMTX HLS sessions, deduplicated by Laravel-signed visitor identity, cached in Redis, and materialized into `channels.viewer_count` for list sorting and page display.
|
|
|
|
Laravel signs each live HLS URL with a short query string. Logged-in users get an opaque account-based viewer key, while guests get an encrypted `nyone_visitor_id` browser cookie and an opaque browser-based viewer key. MediaMTX still proves that playback is active; Laravel does not receive viewer heartbeats.
|
|
|
|
## MediaMTX Control API
|
|
|
|
MediaMTX must expose its Control API on a private address that Laravel can reach:
|
|
|
|
```yaml
|
|
api: yes
|
|
apiAddress: 127.0.0.1:9997
|
|
```
|
|
|
|
Keep this API private. Do not expose `127.0.0.1:9997` through a public firewall rule or reverse proxy.
|
|
|
|
## Laravel Environment
|
|
|
|
Configure Laravel with the MediaMTX API URL and Redis cache store:
|
|
|
|
```env
|
|
STREAMING_MEDIAMTX_API_URL=http://127.0.0.1:9997
|
|
STREAMING_VIEWER_COUNT_CACHE_STORE=redis
|
|
STREAMING_VIEWER_COUNT_TTL=10
|
|
STREAMING_VIEWER_SYNC_INTERVAL=2
|
|
STREAMING_VIEWER_IDENTITY_COOKIE=nyone_visitor_id
|
|
STREAMING_VIEWER_IDENTITY_COOKIE_LIFETIME_DAYS=365
|
|
STREAMING_VIEWER_IDENTITY_TTL=86400
|
|
STREAMING_VIEWER_STATS_POLL_INTERVAL=30000
|
|
|
|
REDIS_CLIENT=phpredis
|
|
REDIS_HOST=127.0.0.1
|
|
REDIS_PORT=6379
|
|
```
|
|
|
|
After changing these values, reload Laravel config:
|
|
|
|
```bash
|
|
php artisan config:clear
|
|
```
|
|
|
|
## Verify Sync
|
|
|
|
With MediaMTX running and at least one active HLS viewer, run one sync pass:
|
|
|
|
```bash
|
|
php artisan streaming:sync-viewer-counts --once -v
|
|
```
|
|
|
|
The command should report the number of viewers and live channels it synced.
|
|
|
|
Multiple HLS sessions with the same valid signed viewer key count as one viewer. Direct HLS clients without a valid signed viewer key are still counted, but each MediaMTX session is counted separately because Laravel has no browser or user identity for those clients.
|
|
|
|
## Run Continuously
|
|
|
|
Run the sync worker under Supervisor:
|
|
|
|
```ini
|
|
[program:nyone-viewer-counts]
|
|
process_name=%(program_name)s
|
|
command=php /var/www/nyone/artisan streaming:sync-viewer-counts --isolated
|
|
directory=/var/www/nyone
|
|
autostart=true
|
|
autorestart=true
|
|
stopasgroup=true
|
|
killasgroup=true
|
|
user=www-data
|
|
redirect_stderr=true
|
|
stdout_logfile=/var/www/nyone/storage/logs/viewer-counts.log
|
|
stopwaitsecs=10
|
|
```
|
|
|
|
Reload Supervisor:
|
|
|
|
```bash
|
|
sudo supervisorctl reread
|
|
sudo supervisorctl update
|
|
sudo supervisorctl status nyone-viewer-counts
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
If counts stay at `0`, check:
|
|
|
|
- MediaMTX has active HLS sessions.
|
|
- `STREAMING_MEDIAMTX_API_URL` is reachable from Laravel.
|
|
- Redis is running and Laravel can write to `STREAMING_VIEWER_COUNT_CACHE_STORE`.
|
|
- `storage/logs/viewer-counts.log` has no connection errors.
|