dev24 foundation: implement state manager, CRF/VBR modes, unified player integration

This commit is contained in:
Stu Leak 2026-01-06 17:01:12 -05:00
parent 895c696b88
commit 3edb956fdf

View File

@ -1,117 +0,0 @@
package state
import (
"strings"
"sync"
)
// ConvertManager centralizes convert UI state and change notifications.
// It is intentionally UI-agnostic; widgets should subscribe via callbacks.
type ConvertManager struct {
mu sync.RWMutex
quality string
bitrateMode string
manualQualityOption string
onQualityChange []func(string)
onBitrateModeChange []func(string)
}
func NewConvertManager(quality, bitrateMode, manualQualityOption string) *ConvertManager {
if strings.TrimSpace(manualQualityOption) == "" {
manualQualityOption = "Manual (CRF)"
}
return &ConvertManager{
quality: quality,
bitrateMode: bitrateMode,
manualQualityOption: manualQualityOption,
}
}
func (m *ConvertManager) Quality() string {
m.mu.RLock()
defer m.mu.RUnlock()
return m.quality
}
func (m *ConvertManager) BitrateMode() string {
m.mu.RLock()
defer m.mu.RUnlock()
return m.bitrateMode
}
func (m *ConvertManager) ManualQualityOption() string {
m.mu.RLock()
defer m.mu.RUnlock()
return m.manualQualityOption
}
func (m *ConvertManager) SetQuality(val string) bool {
m.mu.Lock()
if m.quality == val {
m.mu.Unlock()
return false
}
m.quality = val
callbacks := append([]func(string){}, m.onQualityChange...)
m.mu.Unlock()
for _, cb := range callbacks {
cb(val)
}
return true
}
func (m *ConvertManager) SetBitrateMode(val string) bool {
m.mu.Lock()
if m.bitrateMode == val {
m.mu.Unlock()
return false
}
m.bitrateMode = val
callbacks := append([]func(string){}, m.onBitrateModeChange...)
m.mu.Unlock()
for _, cb := range callbacks {
cb(val)
}
return true
}
func (m *ConvertManager) OnQualityChange(fn func(string)) {
if fn == nil {
return
}
m.mu.Lock()
m.onQualityChange = append(m.onQualityChange, fn)
m.mu.Unlock()
}
func (m *ConvertManager) OnBitrateModeChange(fn func(string)) {
if fn == nil {
return
}
m.mu.Lock()
m.onBitrateModeChange = append(m.onBitrateModeChange, fn)
m.mu.Unlock()
}
func (m *ConvertManager) IsManualQuality() bool {
m.mu.RLock()
defer m.mu.RUnlock()
return m.quality == m.manualQualityOption
}
func NormalizeBitrateMode(mode string) string {
switch {
case strings.HasPrefix(mode, "CRF"):
return "CRF"
case strings.HasPrefix(mode, "CBR"):
return "CBR"
case strings.HasPrefix(mode, "VBR"):
return "VBR"
case strings.HasPrefix(mode, "Target Size"):
return "Target Size"
default:
return mode
}
}