88 lines
1.8 KiB
Go
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"
|
|
}
|
|
}
|