Tuner v1: HLS pipeline with playback/ingest modes
FFmpeg -> MediaMTX -> HLS relay with runtime-configurable modes: - PLAYBACK_MODE: standard (mpegts), fmp4 (HEVC), llhls - INGEST_MODE: rtmp, rtsp - INGEST_AUDIO_MODE: aac, copy - Hourly playlist auto-refresh from upstream URL - Fullscreen video UI with collapsible sidebar, upstream-down banner - Same-origin HLS proxy for HTTPS deployments Tagged as the last HLS-based version before the mpegts.js (v2) rework.
This commit is contained in:
35
backend/api/playlist.go
Normal file
35
backend/api/playlist.go
Normal file
@@ -0,0 +1,35 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
)
|
||||
|
||||
// FetchPlaylist downloads a playlist from url and writes it to destPath.
|
||||
func FetchPlaylist(url, destPath string) error {
|
||||
log.Printf("[playlist] fetching from %s", url)
|
||||
resp, err := http.Get(url) //nolint:gosec
|
||||
if err != nil {
|
||||
return fmt.Errorf("fetch playlist: %w", err)
|
||||
}
|
||||
defer resp.Body.Close()
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
return fmt.Errorf("fetch playlist: server returned %s", resp.Status)
|
||||
}
|
||||
if err := os.MkdirAll("/data", 0o755); err != nil {
|
||||
return fmt.Errorf("mkdir /data: %w", err)
|
||||
}
|
||||
f, err := os.Create(destPath)
|
||||
if err != nil {
|
||||
return fmt.Errorf("create playlist file: %w", err)
|
||||
}
|
||||
defer f.Close()
|
||||
if _, err := io.Copy(f, resp.Body); err != nil {
|
||||
return fmt.Errorf("write playlist file: %w", err)
|
||||
}
|
||||
log.Printf("[playlist] saved to %s", destPath)
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user