package roverd import ( "bytes" "fmt" "os" "path/filepath" ) const publisherEnvPath = "/var/lib/roverd/video.env" func UpdatePublisherEnv(media MediaConfig, audio AudioConfig) error { if media.PublishURL == "" { return fmt.Errorf("media publishUrl missing") } if media.AudioPublishURL == "" && audio.CaptureEnabled { return fmt.Errorf("audio publishUrl missing") } if media.VideoWidth < 0 || media.VideoHeight < 0 || media.VideoFPS < 0 || media.VideoBitrate <= 0 { return fmt.Errorf("invalid media dimensions/bitrate") } if err := os.MkdirAll(filepath.Dir(publisherEnvPath), 0o755); err != nil { return err } var buf bytes.Buffer fmt.Fprintf(&buf, "PUBLISH_URL=%s\n", media.PublishURL) if audio.CaptureEnabled && media.AudioPublishURL != "" { fmt.Fprintf(&buf, "AUDIO_PUBLISH_URL=%s\n", media.AudioPublishURL) } if media.AudioForwardURL != "" { fmt.Fprintf(&buf, "AUDIO_FORWARD_URL=%s\n", media.AudioForwardURL) } if media.VideoWidth > 0 { fmt.Fprintf(&buf, "VIDEO_WIDTH=%d\n", media.VideoWidth) } if media.VideoHeight > 0 { fmt.Fprintf(&buf, "VIDEO_HEIGHT=%d\n", media.VideoHeight) } if media.VideoFPS > 0 { fmt.Fprintf(&buf, "VIDEO_FPS=%d\n", media.VideoFPS) } fmt.Fprintf(&buf, "VIDEO_BITRATE=%d\n", media.VideoBitrate) audioDevice := audio.CaptureDevice if audioDevice == "" || audioDevice == "rovermic" { audioDevice = "hw:0,0" } if audio.SampleRate <= 0 { audio.SampleRate = 48000 } if audio.Channels <= 0 { audio.Channels = 2 } fmt.Fprintf(&buf, "AUDIO_ENABLE=%d\n", boolToInt(audio.CaptureEnabled)) fmt.Fprintf(&buf, "AUDIO_DEVICE=%s\n", audioDevice) playbackDevice := audio.PlaybackDevice if playbackDevice == "" { playbackDevice = "default" } fmt.Fprintf(&buf, "AUDIO_PLAYBACK_DEVICE=%s\n", playbackDevice) fmt.Fprintf(&buf, "AUDIO_RATE=%d\n", audio.SampleRate) fmt.Fprintf(&buf, "AUDIO_CHANNELS=%d\n", audio.Channels) if err := os.WriteFile(publisherEnvPath, buf.Bytes(), 0o640); err != nil { return err } return nil } func boolToInt(v bool) int { if v { return 1 } return 0 }