Replaces the per-scene HTML directories (landing/, loading/, game/,
desktop/, goodbye/, music-box/, music/) with a single Laravel app
serving every overlay over HTTP. Supervisord runs `php artisan serve`
on 127.0.0.1:1118 and the OBS scene JSON now references HTTP routes
instead of file:// URLs.
Highlights:
- public/css/hud.css consolidates the duplicated HUD chrome,
scanlines/vignette/flicker, terminal styling, and pulse keyframes
that were copy-pasted across all seven scenes.
- Blade partials own hud-strip, crt-overlays, obs-ws-scripts,
camera-frame, screen-frame; the seven scenes extend a shared
overlay layout.
- Artisan commands (`rig:setup`, `rig:telemetry`, `rig:loading`,
`rig:playlist`, `rig:cmd`) replace the shell scripts that wrote
per-rig JSON snapshots. TwitchHelix + HardwareSnapshot services
handle the work the bash + Python helpers used to.
- ObsWsClient + MusicCommandController kill the 250 ms cmd.js poll
in the music daemon: POST /cmd/{skip|prev|pause|resume} opens a
short-lived Pawl WS, authenticates, and broadcasts mpd:cmd.
- AudioController streams files from the configured music dirs so
CEF can load tracks under the HTTP origin (Chromium blocks
HTTP-origin pages from loading file:// media).
- DataController serves /data/playlist.js (with ETag mtime cache)
and /cover.jpg (no-store) so the existing overlays' window.__PLAYLIST
and cover.jpg cache-bust pattern keeps working.
scripts/obs-webapp.supervisord.conf is the supervisord unit; install
to /etc/supervisor.d/obs-webapp.conf.
scripts/rewrite-scene-urls.py is a one-shot tool that rewrites
basic/scenes/Default_Stream_HUD.json from file:// to HTTP URLs.
basic/scenes/Default_Stream_HUD.json.pre-webapp is the rollback
artifact (made with OBS closed; full pre-migration state).
The seven old scene directories, vendor/, and the bash scripts are
still on disk pending visual verification; the next commit will
prune them.
43 lines
1.6 KiB
PHP
43 lines
1.6 KiB
PHP
<?php
|
||
|
||
namespace App\Console\Commands;
|
||
|
||
use App\Services\HardwareSnapshot;
|
||
use App\Support\RigData;
|
||
use Illuminate\Console\Command;
|
||
|
||
class RigTelemetryCommand extends Command
|
||
{
|
||
protected $signature = 'rig:telemetry {--collect : Re-read hardware + OBS profile (default: only refresh if file is missing)}';
|
||
protected $description = 'Capture rig hardware + OBS profile snapshot → storage/data/telemetry.json';
|
||
|
||
public function handle(HardwareSnapshot $snap, RigData $rig): int
|
||
{
|
||
$path = rtrim(config('rig.storage_data'), '/') . '/telemetry.json';
|
||
|
||
if ($this->option('collect') || !is_file($path)) {
|
||
$data = $snap->collect();
|
||
@mkdir(dirname($path), 0775, true);
|
||
file_put_contents(
|
||
$path,
|
||
json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE) . "\n"
|
||
);
|
||
$this->info(" ✓ wrote {$path}");
|
||
} else {
|
||
$this->line(" · {$path} already exists — use --collect to re-read hardware.");
|
||
}
|
||
|
||
$current = $rig->telemetry();
|
||
$this->line('');
|
||
$this->line(" rig = " . ($current['rig'] ?? '?'));
|
||
$this->line(" cpu = " . ($current['cpu']['model'] ?? '?'));
|
||
if (!empty($current['gpu']['name'])) {
|
||
$this->line(" gpu = " . $current['gpu']['name']);
|
||
}
|
||
if (!empty($current['obs']['output']['w'])) {
|
||
$this->line(" output = {$current['obs']['output']['w']}×{$current['obs']['output']['h']} @ {$current['obs']['fps']} fps");
|
||
}
|
||
return self::SUCCESS;
|
||
}
|
||
}
|