Files
gwutilz/gwutils/config.go
2026-03-23 15:48:34 -07:00

183 lines
4.5 KiB
Go
Executable File

package gwutils
import (
"encoding/json"
"fmt"
"os"
"time"
)
// Config represents the unified configuration structure
type Config struct {
LastCodec string `json:"last_codec"`
LastAudioCodec string `json:"last_audio_codec"`
LastContainer string `json:"last_container"`
LastResolution string `json:"last_resolution"`
LastCRF string `json:"last_crf"`
LastPreset string `json:"last_preset"`
LastBitrate string `json:"last_bitrate"`
ExtractSubtitles bool `json:"extract_subtitles"`
AudioBitrate int `json:"audio_bitrate"`
}
// EncodingMode represents a predefined encoding configuration
type EncodingMode struct {
Name string `json:"name"`
Description string `json:"description"`
Codec string `json:"codec"`
CRF string `json:"crf"`
Preset string `json:"preset"`
Bitrate string `json:"bitrate"`
AudioCodec string `json:"audio_codec"`
Container string `json:"container"`
Resolution string `json:"resolution"`
Maxrate string `json:"maxrate"`
AudioBitrate string `json:"audio_bitrate"`
}
// Preset represents a predefined encoding preset
type Preset struct {
Name string
Description string
Codec string
CRF string
Preset string
Bitrate string
AudioCodec string
Container string
Resolution string
}
// ProgressTracker tracks encoding progress
type ProgressTracker struct {
StartTime time.Time
TotalDuration float64
LastUpdate time.Time
LastProgress float64
}
// DefaultConfig returns a default configuration
func DefaultConfig() Config {
return Config{
LastCodec: "1",
LastAudioCodec: "1",
LastContainer: "1",
LastResolution: "original",
LastCRF: "29",
LastPreset: "10",
LastBitrate: "2000",
ExtractSubtitles: true,
AudioBitrate: 80,
}
}
// LoadConfig loads configuration from file
func LoadConfig(filename string) Config {
config := DefaultConfig()
data, err := os.ReadFile(filename)
if err != nil {
return config
}
if err := json.Unmarshal(data, &config); err != nil {
fmt.Printf("Error parsing config file: %v\n", err)
return DefaultConfig()
}
return config
}
// SaveConfig saves configuration to file
func SaveConfig(config Config, filename string) error {
data, err := json.MarshalIndent(config, "", " ")
if err != nil {
return fmt.Errorf("error marshaling config: %v", err)
}
if err := os.WriteFile(filename, data, 0644); err != nil {
return fmt.Errorf("error writing config file: %v", err)
}
return nil
}
// GetDefaultPresets returns the default encoding presets
func GetDefaultPresets() []Preset {
return []Preset{
{
Name: "Fast AV1",
Description: "Quick AV1 encoding for web/streaming",
Codec: "1",
CRF: "29",
Preset: "10",
Bitrate: "2000",
AudioCodec: "1",
Container: "1",
Resolution: "720",
},
}
}
// GetDefaultModes returns the default encoding modes for quick/template functionality
// Updated to align with Tdarr AV1 defaults (CRF 29, Preset 10) and small file size targets
func GetDefaultModes() map[string]EncodingMode {
return map[string]EncodingMode{
"fast": {
Name: "Fast",
Description: "Daily driver (MKV, CRF 29, AAC 80k/ch, preset 10)",
Codec: "av1",
CRF: "29",
Preset: "10",
AudioBitrate: "80",
AudioCodec: "aac",
Container: "mkv",
Maxrate: "2000",
},
"web": {
Name: "Web",
Description: "Streaming/Discord (WEBM, CRF 35, Opus 64k/ch, preset 10)",
Codec: "av1",
CRF: "35",
Preset: "10",
AudioBitrate: "64",
AudioCodec: "opus",
Container: "webm",
Maxrate: "2000",
},
"tiny": {
Name: "Tiny",
Description: "Smallest size (MP4, CRF 42, AAC 64k/ch, preset 8)",
Codec: "av1",
CRF: "42",
Preset: "8",
AudioBitrate: "64",
AudioCodec: "aac",
Container: "mp4",
Maxrate: "1500",
},
"hq": {
Name: "HQ",
Description: "High quality (MKV, CRF 22, AAC 128k/ch, preset 6)",
Codec: "av1",
CRF: "22",
Preset: "6",
AudioBitrate: "128",
AudioCodec: "aac",
Container: "mkv",
Maxrate: "4000",
},
"slow": {
Name: "Slow",
Description: "Archival (MKV, CRF 18, AAC 160k/ch, preset 4)",
Codec: "av1",
CRF: "18",
Preset: "4",
AudioBitrate: "160",
AudioCodec: "aac",
Container: "mkv",
Maxrate: "6000",
},
}
}