Files
seanime-docker/seanime-2.9.10/internal/mediastream/optimizer/optimizer.go
2025-09-20 14:08:38 +01:00

88 lines
1.8 KiB
Go

package optimizer
import (
"fmt"
"github.com/rs/zerolog"
"github.com/samber/mo"
"seanime/internal/events"
"seanime/internal/mediastream/videofile"
"seanime/internal/util"
)
const (
QualityLow Quality = "low"
QualityMedium Quality = "medium"
QualityHigh Quality = "high"
QualityMax Quality = "max"
)
type (
Quality string
Optimizer struct {
wsEventManager events.WSEventManagerInterface
logger *zerolog.Logger
libraryDir mo.Option[string]
concurrentTasks int
}
NewOptimizerOptions struct {
Logger *zerolog.Logger
WSEventManager events.WSEventManagerInterface
}
)
func NewOptimizer(opts *NewOptimizerOptions) *Optimizer {
ret := &Optimizer{
logger: opts.Logger,
wsEventManager: opts.WSEventManager,
libraryDir: mo.None[string](),
concurrentTasks: 2,
}
return ret
}
func (o *Optimizer) SetLibraryDir(libraryDir string) {
o.libraryDir = mo.Some[string](libraryDir)
}
/////////////
type StartMediaOptimizationOptions struct {
Filepath string
Quality Quality
AudioChannelIndex int
MediaInfo *videofile.MediaInfo
}
func (o *Optimizer) StartMediaOptimization(opts *StartMediaOptimizationOptions) (err error) {
defer util.HandlePanicInModuleWithError("mediastream/optimizer/StartMediaOptimization", &err)
o.logger.Debug().Any("opts", opts).Msg("mediastream: Starting media optimization")
if !o.libraryDir.IsPresent() {
return fmt.Errorf("library directory not set")
}
if opts.Filepath == "" {
return fmt.Errorf("no filepath")
}
return
}
func qualityToPreset(quality Quality) string {
switch quality {
case QualityLow:
return "ultrafast"
case QualityMedium:
return "veryfast"
case QualityHigh:
return "fast"
case QualityMax:
return "medium"
default:
return "veryfast"
}
}