File Types: Add experimental support for animated GIFs #590 #2207

Animated GIFs are transcoded to AVC because it is much smaller and
thus also suitable for long/large animations. In addition, this commit
adds support for more metadata fields such as frame rate, number of
frames, file capture timestamp (unix milliseconds), media type,
and software version. Support for SVG files can later be implemented in
a similar way.
This commit is contained in:
Michael Mayer
2022-04-13 22:17:59 +02:00
parent 4253045b14
commit 82d61d1f93
165 changed files with 1569 additions and 768 deletions

View File

@@ -10,21 +10,27 @@ func (m *File) MarshalJSON() ([]byte, error) {
return json.Marshal(&struct {
UID string
PhotoUID string
InstanceID string `json:",omitempty"`
Name string
Root string
OriginalName string `json:",omitempty"`
Hash string
Size int64
Codec string `json:",omitempty"`
Type string
Mime string `json:",omitempty"`
Primary bool
MetaUTC int64 `json:",omitempty"`
TimeIndex *string `json:",omitempty"`
MediaID *string `json:",omitempty"`
InstanceID string `json:",omitempty"`
OriginalName string `json:",omitempty"`
Codec string `json:",omitempty"`
FileType string `json:"FileType"`
MediaType string `json:"MediaType"`
Mime string `json:",omitempty"`
Sidecar bool `json:",omitempty"`
Missing bool `json:",omitempty"`
Portrait bool `json:",omitempty"`
Video bool `json:",omitempty"`
Duration time.Duration `json:",omitempty"`
FPS float64 `json:",omitempty"`
Frames int `json:",omitempty"`
Width int `json:",omitempty"`
Height int `json:",omitempty"`
Orientation int `json:",omitempty"`
@@ -37,6 +43,8 @@ func (m *File) MarshalJSON() ([]byte, error) {
Diff uint32 `json:",omitempty"`
Chroma uint8 `json:",omitempty"`
HDR bool `json:",omitempty"`
Watermark bool `json:",omitempty"`
Software string `json:",omitempty"`
Error string `json:",omitempty"`
ModTime int64 `json:",omitempty"`
CreatedAt time.Time `json:",omitempty"`
@@ -48,21 +56,27 @@ func (m *File) MarshalJSON() ([]byte, error) {
}{
UID: m.FileUID,
PhotoUID: m.PhotoUID,
InstanceID: m.InstanceID,
Name: m.FileName,
Root: m.FileRoot,
OriginalName: m.OriginalName,
Hash: m.FileHash,
Size: m.FileSize,
Codec: m.FileCodec,
Type: m.FileType,
Mime: m.FileMime,
Primary: m.FilePrimary,
MetaUTC: m.MetaUTC,
TimeIndex: m.TimeIndex,
MediaID: m.MediaID,
InstanceID: m.InstanceID,
OriginalName: m.OriginalName,
Codec: m.FileCodec,
FileType: m.FileType,
MediaType: m.MediaType,
Mime: m.FileMime,
Sidecar: m.FileSidecar,
Missing: m.FileMissing,
Portrait: m.FilePortrait,
Video: m.FileVideo,
Duration: m.FileDuration,
FPS: m.FileFPS,
Frames: m.FileFrames,
Width: m.FileWidth,
Height: m.FileHeight,
Orientation: m.FileOrientation,
@@ -75,6 +89,8 @@ func (m *File) MarshalJSON() ([]byte, error) {
Diff: m.FileDiff,
Chroma: m.FileChroma,
HDR: m.FileHDR,
Watermark: m.FileWatermark,
Software: m.FileSoftware,
Error: m.FileError,
ModTime: m.ModTime,
CreatedAt: m.CreatedAt,