Init V4 community edition (#2265)
* Init V4 community edition * Init V4 community edition
This commit is contained in:
79
pkg/thumb/music.go
Normal file
79
pkg/thumb/music.go
Normal file
@@ -0,0 +1,79 @@
|
||||
package thumb
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"github.com/cloudreve/Cloudreve/v4/pkg/filemanager/manager/entitysource"
|
||||
"github.com/cloudreve/Cloudreve/v4/pkg/logging"
|
||||
"github.com/cloudreve/Cloudreve/v4/pkg/setting"
|
||||
"github.com/cloudreve/Cloudreve/v4/pkg/util"
|
||||
"github.com/dhowden/tag"
|
||||
"github.com/gofrs/uuid"
|
||||
"os"
|
||||
"path/filepath"
|
||||
)
|
||||
|
||||
func NewMusicCoverGenerator(l logging.Logger, settings setting.Provider) *MusicCoverGenerator {
|
||||
return &MusicCoverGenerator{l: l, settings: settings}
|
||||
}
|
||||
|
||||
type MusicCoverGenerator struct {
|
||||
l logging.Logger
|
||||
settings setting.Provider
|
||||
}
|
||||
|
||||
func (v *MusicCoverGenerator) Generate(ctx context.Context, es entitysource.EntitySource, ext string, previous *Result) (*Result, error) {
|
||||
if !util.IsInExtensionListExt(v.settings.MusicCoverThumbExts(ctx), ext) {
|
||||
return nil, fmt.Errorf("unsupported music format: %w", ErrPassThrough)
|
||||
}
|
||||
|
||||
if es.Entity().Size() > v.settings.MusicCoverThumbMaxSize(ctx) {
|
||||
return nil, fmt.Errorf("file is too big: %w", ErrPassThrough)
|
||||
}
|
||||
|
||||
m, err := tag.ReadFrom(es)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("faield to read audio tags from file: %w", err)
|
||||
}
|
||||
|
||||
p := m.Picture()
|
||||
if p == nil || len(p.Data) == 0 {
|
||||
return nil, fmt.Errorf("no cover found in given file")
|
||||
}
|
||||
|
||||
thumbExt := ".jpg"
|
||||
if p.Ext != "" {
|
||||
thumbExt = p.Ext
|
||||
}
|
||||
|
||||
tempPath := filepath.Join(
|
||||
util.DataPath(v.settings.TempPath(ctx)),
|
||||
thumbTempFolder,
|
||||
fmt.Sprintf("thumb_%s.%s", uuid.Must(uuid.NewV4()).String(), thumbExt),
|
||||
)
|
||||
|
||||
thumbFile, err := util.CreatNestedFile(tempPath)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to create temp file: %w", err)
|
||||
}
|
||||
|
||||
defer thumbFile.Close()
|
||||
|
||||
if _, err := thumbFile.Write(p.Data); err != nil {
|
||||
return &Result{Path: tempPath}, fmt.Errorf("failed to write cover to file: %w", err)
|
||||
}
|
||||
|
||||
return &Result{
|
||||
Path: tempPath,
|
||||
Continue: true,
|
||||
Cleanup: []func(){func() { _ = os.Remove(tempPath) }},
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (v *MusicCoverGenerator) Priority() int {
|
||||
return 50
|
||||
}
|
||||
|
||||
func (v *MusicCoverGenerator) Enabled(ctx context.Context) bool {
|
||||
return v.settings.MusicCoverThumbGeneratorEnabled(ctx)
|
||||
}
|
||||
Reference in New Issue
Block a user