configurable minimum number of sprites

This commit is contained in:
cacheflush 2026-01-22 20:26:10 +01:00
parent f174989d18
commit 8171b27095
7 changed files with 29 additions and 4 deletions

View file

@ -187,6 +187,8 @@ input ConfigGeneralInput {
"Time between two different scrubber sprites"
spriteInterval: Int
"Minimum number of sprites to be generated"
minimumSprites: Int
}
type ConfigGeneralResult {
@ -292,6 +294,8 @@ type ConfigGeneralResult {
logFileMaxSize: Int!
"Time between two different scrubber sprites"
spriteInterval: Int!
"Minimum number of sprites to be generated"
minimumSprites: Int!
"Array of video file extensions"
videoExtensions: [String!]!
"Array of image file extensions"

View file

@ -288,6 +288,7 @@ func (r *mutationResolver) ConfigureGeneral(ctx context.Context, input ConfigGen
c.SetString(config.PreviewPreset, input.PreviewPreset.String())
}
r.setConfigInt(config.SpriteInterval, input.SpriteInterval)
r.setConfigInt(config.MinimumSprites, input.MinimumSprites)
r.setConfigBool(config.TranscodeHardwareAcceleration, input.TranscodeHardwareAcceleration)
if input.MaxTranscodeSize != nil {

View file

@ -97,6 +97,7 @@ func makeConfigGeneralResult() *ConfigGeneralResult {
VideoFileNamingAlgorithm: config.GetVideoFileNamingAlgorithm(),
ParallelTasks: config.GetParallelTasks(),
SpriteInterval: config.GetSpriteInterval(),
MinimumSprites: config.GetMinimumSprites(),
PreviewAudio: config.GetPreviewAudio(),
PreviewSegments: config.GetPreviewSegments(),
PreviewSegmentDuration: config.GetPreviewSegmentDuration(),

View file

@ -86,6 +86,9 @@ const (
SpriteInterval = "sprite_interval"
SpriteIntervalDefault = 0
MinimumSprites = "minimum_sprites"
MinimumSpritesDefault = 10
PreviewPreset = "preview_preset"
TranscodeHardwareAcceleration = "ffmpeg.hardware_acceleration"
@ -982,6 +985,11 @@ func (i *Config) GetSpriteInterval() int {
return i.getInt(SpriteInterval)
}
// GetMinimumSprites return the minimum number of sprites that have to be generated
func (i *Config) GetMinimumSprites() int {
return i.getInt(MinimumSprites)
}
func (i *Config) GetPreviewAudio() bool {
return i.getBool(PreviewAudio)
}
@ -1862,6 +1870,7 @@ func (i *Config) setDefaultValues() {
i.setDefault(SoundOnPreview, false)
i.setDefault(SpriteInterval, SpriteIntervalDefault)
i.setDefault(MinimumSprites, MinimumSpritesDefault)
i.setDefault(ThemeColor, DefaultThemeColor)

View file

@ -18,7 +18,6 @@ import (
const (
DefaultSpriteInterval = 30
MinimalSpriteCount = 10
)
type SpriteGenerator struct {
@ -47,9 +46,12 @@ func NewSpriteGenerator(videoFile ffmpeg.VideoFile, videoChecksum string, imageO
if config.GetSpriteInterval() != 0 {
spriteInterval = config.GetSpriteInterval()
}
minimumSpriteCount := config.GetMinimumSprites()
spriteCount := int64(math.Ceil(videoFile.VideoStreamDuration / float64(spriteInterval)))
// For files with small duration / low frame count try to seek using frame number intead of seconds
if (spriteCount == 0) || (videoFile.VideoStreamDuration < float64(spriteInterval*MinimalSpriteCount)) || (0 < videoFile.FrameCount && videoFile.FrameCount <= spriteCount) { // some files can have FrameCount == 0
if (spriteCount == 0) || (videoFile.VideoStreamDuration < float64(spriteInterval*minimumSpriteCount)) || (0 < videoFile.FrameCount && videoFile.FrameCount <= spriteCount) { // some files can have FrameCount == 0
if videoFile.VideoStreamDuration <= 0 {
s := fmt.Sprintf("video %s: duration(%.3f)/frame count(%d) invalid, skipping sprite creation", videoFile.Path, videoFile.VideoStreamDuration, videoFile.FrameCount)
return nil, errors.New(s)
@ -71,10 +73,10 @@ func NewSpriteGenerator(videoFile ffmpeg.VideoFile, videoChecksum string, imageO
if err != nil {
return nil, err
}
if spriteCount > int64(MinimalSpriteCount) {
if spriteCount > int64(minimumSpriteCount) {
generator.ChunkCount = int(spriteCount)
} else {
generator.ChunkCount = MinimalSpriteCount
generator.ChunkCount = minimumSpriteCount
}
if err := generator.configure(); err != nil {
return nil, err

View file

@ -40,6 +40,7 @@ fragment ConfigGeneralData on ConfigGeneralResult {
logAccess
logFileMaxSize
spriteInterval
minimumSprites
createGalleriesFromFolders
galleryCoverRegex
videoExtensions

View file

@ -435,6 +435,13 @@ export const SettingsConfigurationPanel: React.FC = () => {
value={general.spriteInterval ?? 0}
onChange={(v) => saveGeneral({ spriteInterval: v })}
/>
<NumberSetting
id="scrubber-sprites-minimum"
headingID=/*"config.general.include_audio_head"todo*/"Minimum sprites"
subHeadingID=/*"config.general.include_audio_desc"*/"todo: Minimum number of sprites to be generated"
value={general.minimumSprites ?? 10}
onChange={(v) => saveGeneral({ minimumSprites: v })}
/>
</SettingSection>
<SettingSection headingID="config.general.heatmap_generation">