Files
go2rtc/internal/streams/preload.go
T
2026-01-26 00:40:48 +03:00

70 lines
1.3 KiB
Go

package streams
import (
"fmt"
"maps"
"net/url"
"sync"
"github.com/AlexxIT/go2rtc/pkg/probe"
)
type Preload struct {
stream *Stream // Don't include the stream in JSON to avoid leaking secrets.
Cons *probe.Probe `json:"consumer"`
Query string `json:"query"`
}
var preloads = map[string]*Preload{}
var preloadsMu sync.Mutex
func AddPreload(name, rawQuery string) error {
if rawQuery == "" {
rawQuery = "video&audio"
}
query, err := url.ParseQuery(rawQuery)
if err != nil {
return err
}
preloadsMu.Lock()
defer preloadsMu.Unlock()
if p := preloads[name]; p != nil {
p.stream.RemoveConsumer(p.Cons)
}
stream := Get(name)
if stream == nil {
return fmt.Errorf("streams: stream not found: %s", name)
}
cons := probe.Create("preload", query)
if err = stream.AddConsumer(cons); err != nil {
return err
}
preloads[name] = &Preload{stream: stream, Cons: cons, Query: rawQuery}
return nil
}
func DelPreload(name string) error {
preloadsMu.Lock()
defer preloadsMu.Unlock()
if p := preloads[name]; p != nil {
p.stream.RemoveConsumer(p.Cons)
delete(preloads, name)
return nil
}
return fmt.Errorf("streams: preload not found: %s", name)
}
func GetPreloads() map[string]*Preload {
preloadsMu.Lock()
defer preloadsMu.Unlock()
return maps.Clone(preloads)
}