mediaattachment.go (9022B)
1 // GoToSocial 2 // Copyright (C) GoToSocial Authors admin@gotosocial.org 3 // SPDX-License-Identifier: AGPL-3.0-or-later 4 // 5 // This program is free software: you can redistribute it and/or modify 6 // it under the terms of the GNU Affero General Public License as published by 7 // the Free Software Foundation, either version 3 of the License, or 8 // (at your option) any later version. 9 // 10 // This program is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 // GNU Affero General Public License for more details. 14 // 15 // You should have received a copy of the GNU Affero General Public License 16 // along with this program. If not, see <http://www.gnu.org/licenses/>. 17 18 package gtsmodel 19 20 import ( 21 "time" 22 ) 23 24 // MediaAttachment represents a user-uploaded media attachment: an image/video/audio/gif that is 25 // somewhere in storage and that can be retrieved and served by the router. 26 type MediaAttachment struct { 27 ID string `validate:"required,ulid" bun:"type:CHAR(26),pk,nullzero,notnull,unique"` // id of this item in the database 28 CreatedAt time.Time `validate:"-" bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` // when was item created 29 UpdatedAt time.Time `validate:"-" bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` // when was item last updated 30 StatusID string `validate:"omitempty,ulid" bun:"type:CHAR(26),nullzero"` // ID of the status to which this is attached 31 URL string `validate:"required_without=RemoteURL,omitempty,url" bun:",nullzero"` // Where can the attachment be retrieved on *this* server 32 RemoteURL string `validate:"required_without=URL,omitempty,url" bun:",nullzero"` // Where can the attachment be retrieved on a remote server (empty for local media) 33 Type FileType `validate:"oneof=Image Gifv Audio Video Unknown" bun:",nullzero,notnull"` // Type of file (image/gifv/audio/video) 34 FileMeta FileMeta `validate:"required" bun:",embed:,nullzero,notnull"` // Metadata about the file 35 AccountID string `validate:"required,ulid" bun:"type:CHAR(26),nullzero,notnull"` // To which account does this attachment belong 36 Description string `validate:"-" bun:""` // Description of the attachment (for screenreaders) 37 ScheduledStatusID string `validate:"omitempty,ulid" bun:"type:CHAR(26),nullzero"` // To which scheduled status does this attachment belong 38 Blurhash string `validate:"required_if=Type Image,required_if=Type Gif,required_if=Type Video" bun:",nullzero"` // What is the generated blurhash of this attachment 39 Processing ProcessingStatus `validate:"oneof=0 1 2 666" bun:",notnull,default:2"` // What is the processing status of this attachment 40 File File `validate:"required" bun:",embed:file_,notnull,nullzero"` // metadata for the whole file 41 Thumbnail Thumbnail `validate:"required" bun:",embed:thumbnail_,notnull,nullzero"` // small image thumbnail derived from a larger image, video, or audio file. 42 Avatar *bool `validate:"-" bun:",nullzero,notnull,default:false"` // Is this attachment being used as an avatar? 43 Header *bool `validate:"-" bun:",nullzero,notnull,default:false"` // Is this attachment being used as a header? 44 Cached *bool `validate:"-" bun:",nullzero,notnull,default:false"` // Is this attachment currently cached by our instance? 45 } 46 47 // File refers to the metadata for the whole file 48 type File struct { 49 Path string `validate:"required,file" bun:",nullzero,notnull"` // Path of the file in storage. 50 ContentType string `validate:"required" bun:",nullzero,notnull"` // MIME content type of the file. 51 FileSize int `validate:"required" bun:",notnull"` // File size in bytes 52 UpdatedAt time.Time `validate:"-" bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` // When was the file last updated. 53 } 54 55 // Thumbnail refers to a small image thumbnail derived from a larger image, video, or audio file. 56 type Thumbnail struct { 57 Path string `validate:"required,file" bun:",nullzero,notnull"` // Path of the file in storage. 58 ContentType string `validate:"required" bun:",nullzero,notnull"` // MIME content type of the file. 59 FileSize int `validate:"required" bun:",notnull"` // File size in bytes 60 UpdatedAt time.Time `validate:"-" bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` // When was the file last updated. 61 URL string `validate:"required_without=RemoteURL,omitempty,url" bun:",nullzero"` // What is the URL of the thumbnail on the local server 62 RemoteURL string `validate:"required_without=URL,omitempty,url" bun:",nullzero"` // What is the remote URL of the thumbnail (empty for local media) 63 } 64 65 // ProcessingStatus refers to how far along in the processing stage the attachment is. 66 type ProcessingStatus int 67 68 // MediaAttachment processing states. 69 const ( 70 ProcessingStatusReceived ProcessingStatus = 0 // ProcessingStatusReceived indicates the attachment has been received and is awaiting processing. No thumbnail available yet. 71 ProcessingStatusProcessing ProcessingStatus = 1 // ProcessingStatusProcessing indicates the attachment is currently being processed. Thumbnail is available but full media is not. 72 ProcessingStatusProcessed ProcessingStatus = 2 // ProcessingStatusProcessed indicates the attachment has been fully processed and is ready to be served. 73 ProcessingStatusError ProcessingStatus = 666 // ProcessingStatusError indicates something went wrong processing the attachment and it won't be tried again--these can be deleted. 74 ) 75 76 // FileType refers to the file type of the media attaachment. 77 type FileType string 78 79 // MediaAttachment file types. 80 const ( 81 FileTypeImage FileType = "Image" // FileTypeImage is for jpegs, pngs, and standard gifs 82 FileTypeGifv FileType = "Gifv" // FileTypeGif is for soundless looping videos that behave like gifs 83 FileTypeAudio FileType = "Audio" // FileTypeAudio is for audio-only files (no video) 84 FileTypeVideo FileType = "Video" // FileTypeVideo is for files with audio + visual 85 FileTypeUnknown FileType = "Unknown" // FileTypeUnknown is for unknown file types (surprise surprise!) 86 ) 87 88 // FileMeta describes metadata about the actual contents of the file. 89 type FileMeta struct { 90 Original Original `validate:"required" bun:"embed:original_"` 91 Small Small `bun:"embed:small_"` 92 Focus Focus `bun:"embed:focus_"` 93 } 94 95 // Small can be used for a thumbnail of any media type 96 type Small struct { 97 Width int `validate:"required_with=Height Size Aspect"` // width in pixels 98 Height int `validate:"required_with=Width Size Aspect"` // height in pixels 99 Size int `validate:"required_with=Width Height Aspect"` // size in pixels (width * height) 100 Aspect float32 `validate:"required_with=Width Height Size"` // aspect ratio (width / height) 101 } 102 103 // Original can be used for original metadata for any media type 104 type Original struct { 105 Width int `validate:"required_with=Height Size Aspect"` // width in pixels 106 Height int `validate:"required_with=Width Size Aspect"` // height in pixels 107 Size int `validate:"required_with=Width Height Aspect"` // size in pixels (width * height) 108 Aspect float32 `validate:"required_with=Width Height Size"` // aspect ratio (width / height) 109 Duration *float32 `validate:"-"` // video-specific: duration of the video in seconds 110 Framerate *float32 `validate:"-"` // video-specific: fps 111 Bitrate *uint64 `validate:"-"` // video-specific: bitrate 112 } 113 114 // Focus describes the 'center' of the image for display purposes. 115 // X and Y should each be between -1 and 1 116 type Focus struct { 117 X float32 `validate:"omitempty,max=1,min=-1"` 118 Y float32 `validate:"omitempty,max=1,min=-1"` 119 }