8975c781c5
Signed-off-by: Michael Mayer <michael@photoprism.app>
96 lines
2.2 KiB
Go
96 lines
2.2 KiB
Go
package video
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/photoprism/photoprism/pkg/fs"
|
|
"github.com/photoprism/photoprism/pkg/media"
|
|
)
|
|
|
|
// Info represents video file information.
|
|
type Info struct {
|
|
FileName string
|
|
FileSize int64
|
|
FileType fs.Type
|
|
MediaType media.Type
|
|
ThumbOffset int64
|
|
ThumbMimeType string
|
|
VideoOffset int64
|
|
VideoMimeType string
|
|
VideoType Type
|
|
VideoCodec Codec
|
|
VideoWidth int
|
|
VideoHeight int
|
|
Duration time.Duration
|
|
Frames int
|
|
FPS float64
|
|
Tracks int
|
|
Encrypted bool
|
|
FastStart bool
|
|
Compatible bool
|
|
}
|
|
|
|
// NewInfo returns a new Info struct with default values.
|
|
func NewInfo() Info {
|
|
return Info{
|
|
FileType: fs.TypeUnknown,
|
|
FileSize: -1,
|
|
MediaType: media.Unknown,
|
|
ThumbOffset: -1,
|
|
VideoOffset: -1,
|
|
VideoType: Unknown,
|
|
VideoCodec: CodecUnknown,
|
|
FPS: 0.0,
|
|
}
|
|
}
|
|
|
|
// VideoSize returns the size of the embedded video, if possible.
|
|
func (info Info) VideoSize() int64 {
|
|
if info.FileSize < 0 || info.VideoOffset < 0 {
|
|
return 0
|
|
}
|
|
|
|
return info.FileSize - info.VideoOffset
|
|
}
|
|
|
|
// VideoBitrate returns the bitrate of the embedded video in MBit/s.
|
|
func (info Info) VideoBitrate() float64 {
|
|
videoSize := info.VideoSize()
|
|
|
|
// Return 0 if video size or duration are unknown.
|
|
if videoSize <= 0 || info.Duration <= 0 {
|
|
return 0
|
|
}
|
|
|
|
// Divide number of bits through the duration in seconds.
|
|
return ((float64(videoSize) * 8) / info.Duration.Seconds()) / 1e6
|
|
}
|
|
|
|
// VideoContentType composes the video content type from its mime type and codec.
|
|
func (info Info) VideoContentType() string {
|
|
if info.VideoMimeType == "" {
|
|
return ContentTypeDefault
|
|
}
|
|
|
|
return ContentType(info.VideoMimeType, info.VideoCodec)
|
|
}
|
|
|
|
// VideoFileExt returns the appropriate video file extension based on the mime type and defaults to fs.ExtMP4 otherwise.
|
|
func (info Info) VideoFileExt() string {
|
|
switch info.VideoMimeType {
|
|
case fs.MimeTypeMOV:
|
|
return fs.ExtMOV
|
|
default:
|
|
return fs.ExtMP4
|
|
}
|
|
}
|
|
|
|
// VideoFileType returns the video type based on the mime type and defaults to fs.VideoMP4 otherwise.
|
|
func (info Info) VideoFileType() fs.Type {
|
|
switch info.VideoMimeType {
|
|
case fs.MimeTypeMOV:
|
|
return fs.VideoMOV
|
|
default:
|
|
return fs.VideoMP4
|
|
}
|
|
}
|