mediaattachment.go (8702B)
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 type MediaAttachment struct { 25 ID string `validate:"required,ulid" bun:"type:CHAR(26),pk,nullzero,notnull,unique"` // id of this item in the database 26 CreatedAt time.Time `validate:"-" bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` // when was item created 27 UpdatedAt time.Time `validate:"-" bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` // when was item last updated 28 StatusID string `validate:"omitempty,ulid" bun:"type:CHAR(26),nullzero"` // ID of the status to which this is attached 29 URL string `validate:"required_without=RemoteURL,omitempty,url" bun:",nullzero"` // Where can the attachment be retrieved on *this* server 30 RemoteURL string `validate:"required_without=URL,omitempty,url" bun:",nullzero"` // Where can the attachment be retrieved on a remote server (empty for local media) 31 Type FileType `validate:"oneof=Image Gif Audio Video Unknown" bun:",nullzero,notnull"` // Type of file (image/gif/audio/video) 32 FileMeta FileMeta `validate:"required" bun:",embed:,nullzero,notnull"` // Metadata about the file 33 AccountID string `validate:"required,ulid" bun:"type:CHAR(26),nullzero,notnull"` // To which account does this attachment belong 34 Account *Account `validate:"-" bun:"rel:has-one"` // Account corresponding to accountID 35 Description string `validate:"-" bun:""` // Description of the attachment (for screenreaders) 36 ScheduledStatusID string `validate:"omitempty,ulid" bun:"type:CHAR(26),nullzero"` // To which scheduled status does this attachment belong 37 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 38 Processing ProcessingStatus `validate:"oneof=0 1 2 666" bun:",notnull,default:2"` // What is the processing status of this attachment 39 File File `validate:"required" bun:",embed:file_,notnull,nullzero"` // metadata for the whole file 40 Thumbnail Thumbnail `validate:"required" bun:",embed:thumbnail_,notnull,nullzero"` // small image thumbnail derived from a larger image, video, or audio file. 41 Avatar bool `validate:"-" bun:",notnull,default:false"` // Is this attachment being used as an avatar? 42 Header bool `validate:"-" bun:",notnull,default:false"` // Is this attachment being used as a header? 43 Cached bool `validate:"-" bun:",notnull"` // Is this attachment currently cached by our instance? 44 } 45 46 // File refers to the metadata for the whole file 47 type File struct { 48 Path string `validate:"required,file" bun:",nullzero,notnull"` // Path of the file in storage. 49 ContentType string `validate:"required" bun:",nullzero,notnull"` // MIME content type of the file. 50 FileSize int `validate:"required" bun:",notnull"` // File size in bytes 51 UpdatedAt time.Time `validate:"-" bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` // When was the file last updated. 52 } 53 54 // Thumbnail refers to a small image thumbnail derived from a larger image, video, or audio file. 55 type Thumbnail struct { 56 Path string `validate:"required,file" bun:",nullzero,notnull"` // Path of the file in storage. 57 ContentType string `validate:"required" bun:",nullzero,notnull"` // MIME content type of the file. 58 FileSize int `validate:"required" bun:",notnull"` // File size in bytes 59 UpdatedAt time.Time `validate:"-" bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` // When was the file last updated. 60 URL string `validate:"required_without=RemoteURL,omitempty,url" bun:",nullzero"` // What is the URL of the thumbnail on the local server 61 RemoteURL string `validate:"required_without=URL,omitempty,url" bun:",nullzero"` // What is the remote URL of the thumbnail (empty for local media) 62 } 63 64 // ProcessingStatus refers to how far along in the processing stage the attachment is. 65 type ProcessingStatus int 66 67 // MediaAttachment processing states. 68 const ( 69 ProcessingStatusReceived ProcessingStatus = 0 // ProcessingStatusReceived indicates the attachment has been received and is awaiting processing. No thumbnail available yet. 70 ProcessingStatusProcessing ProcessingStatus = 1 // ProcessingStatusProcessing indicates the attachment is currently being processed. Thumbnail is available but full media is not. 71 ProcessingStatusProcessed ProcessingStatus = 2 // ProcessingStatusProcessed indicates the attachment has been fully processed and is ready to be served. 72 ProcessingStatusError ProcessingStatus = 666 // ProcessingStatusError indicates something went wrong processing the attachment and it won't be tried again--these can be deleted. 73 ) 74 75 // FileType refers to the file type of the media attaachment. 76 type FileType string 77 78 // MediaAttachment file types. 79 const ( 80 FileTypeImage FileType = "Image" // FileTypeImage is for jpegs and pngs 81 FileTypeGif FileType = "Gif" // FileTypeGif is for native gifs and soundless videos that have been converted to gifs 82 FileTypeAudio FileType = "Audio" // FileTypeAudio is for audio-only files (no video) 83 FileTypeVideo FileType = "Video" // FileTypeVideo is for files with audio + visual 84 FileTypeUnknown FileType = "Unknown" // FileTypeUnknown is for unknown file types (surprise surprise!) 85 ) 86 87 // FileMeta describes metadata about the actual contents of the file. 88 type FileMeta struct { 89 Original Original `validate:"required" bun:"embed:original_"` 90 Small Small `bun:"embed:small_"` 91 Focus Focus `bun:"embed:focus_"` 92 } 93 94 // Small can be used for a thumbnail of any media type 95 type Small struct { 96 Width int `validate:"required_with=Height Size Aspect"` // width in pixels 97 Height int `validate:"required_with=Width Size Aspect"` // height in pixels 98 Size int `validate:"required_with=Width Height Aspect"` // size in pixels (width * height) 99 Aspect float64 `validate:"required_with=Widhth Height Size"` // aspect ratio (width / height) 100 } 101 102 // Original can be used for original metadata for any media type 103 type Original struct { 104 Width int `validate:"required_with=Height Size Aspect"` // width in pixels 105 Height int `validate:"required_with=Width Size Aspect"` // height in pixels 106 Size int `validate:"required_with=Width Height Aspect"` // size in pixels (width * height) 107 Aspect float64 `validate:"required_with=Widhth Height Size"` // aspect ratio (width / height) 108 } 109 110 // Focus describes the 'center' of the image for display purposes. 111 // X and Y should each be between -1 and 1 112 type Focus struct { 113 X float32 `validate:"omitempty,max=1,min=-1"` 114 Y float32 `validate:"omitempty,max=1,min=-1"` 115 }