1
Fork 0
photoview/api/scanner/scanner_tasks/video_metadata_task.go

95 lines
2.3 KiB
Go
Raw Normal View History

2022-03-02 17:26:06 +01:00
package scanner_tasks
2020-07-12 14:17:49 +02:00
import (
"fmt"
2022-03-02 17:26:06 +01:00
"log"
2020-07-12 14:17:49 +02:00
"strconv"
"strings"
2020-12-17 22:51:43 +01:00
"github.com/photoview/photoview/api/graphql/models"
2022-03-02 17:26:06 +01:00
"github.com/photoview/photoview/api/scanner/scanner_task"
"github.com/photoview/photoview/api/scanner/scanner_tasks/processing_tasks"
2020-07-12 14:17:49 +02:00
"github.com/pkg/errors"
2020-11-24 11:46:49 +01:00
"gorm.io/gorm"
2020-07-12 14:17:49 +02:00
)
2022-03-02 17:26:06 +01:00
type VideoMetadataTask struct {
scanner_task.ScannerTaskBase
}
func (t VideoMetadataTask) AfterMediaFound(ctx scanner_task.TaskContext, media *models.Media, newMedia bool) error {
if !newMedia || media.Type != models.MediaTypeVideo {
return nil
}
err := ScanVideoMetadata(ctx.GetDB(), media)
if err != nil {
log.Printf("WARN: ScanVideoMetadata for %s failed: %s\n", media.Title, err)
}
return nil
}
2020-11-24 11:46:49 +01:00
func ScanVideoMetadata(tx *gorm.DB, video *models.Media) error {
2020-07-12 14:17:49 +02:00
2022-03-02 17:26:06 +01:00
data, err := processing_tasks.ReadVideoMetadata(video.Path)
2020-07-12 14:17:49 +02:00
if err != nil {
return errors.Wrapf(err, "scan video metadata failed (%s)", video.Title)
}
stream := data.FirstVideoStream()
if stream == nil {
return errors.New(fmt.Sprintf("could not get video stream from metadata (%s)", video.Path))
}
audio := data.FirstAudioStream()
var audioText string
if audio == nil {
audioText = "No audio"
} else {
switch audio.Channels {
case 0:
audioText = "No audio"
case 1:
audioText = "Mono audio"
case 2:
audioText = "Stereo audio"
default:
audioText = fmt.Sprintf("Audio (%d channels)", audio.Channels)
}
}
var framerate *float64 = nil
if stream.AvgFrameRate != "" {
parts := strings.Split(stream.AvgFrameRate, "/")
if len(parts) == 2 {
if numerator, err := strconv.ParseInt(parts[0], 10, 64); err == nil {
if denominator, err := strconv.ParseInt(parts[1], 10, 64); err == nil {
result := float64(numerator) / float64(denominator)
framerate = &result
}
}
}
}
2020-11-25 23:06:47 +01:00
videoMetadata := models.VideoMetadata{
Width: stream.Width,
Height: stream.Height,
Duration: data.Format.DurationSeconds,
Codec: &stream.CodecLongName,
Framerate: framerate,
Bitrate: &stream.BitRate,
ColorProfile: &stream.Profile,
Audio: &audioText,
2020-07-12 14:17:49 +02:00
}
2020-11-25 23:06:47 +01:00
video.VideoMetadata = &videoMetadata
2020-07-12 14:17:49 +02:00
2020-11-25 23:06:47 +01:00
if err := tx.Save(video).Error; err != nil {
return errors.Wrapf(err, "failed to add video metadata to database (%s)", video.Title)
2020-07-12 14:17:49 +02:00
}
return nil
}