| 
									
										
										
										
											2021-04-01 20:46:45 +02:00
										 |  |  | /* | 
					
						
							|  |  |  |    GoToSocial | 
					
						
							|  |  |  |    Copyright (C) 2021 GoToSocial Authors admin@gotosocial.org | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This program is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  |    it under the terms of the GNU Affero General Public License as published by | 
					
						
							|  |  |  |    the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  |    (at your option) any later version. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |    GNU Affero General Public License for more details. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    You should have received a copy of the GNU Affero General Public License | 
					
						
							|  |  |  |    along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-19 19:42:19 +02:00
										 |  |  | package gtsmodel | 
					
						
							| 
									
										
										
										
											2021-04-01 20:46:45 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"time" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // MediaAttachment represents a user-uploaded media attachment: an image/video/audio/gif that is | 
					
						
							|  |  |  | // somewhere in storage and that can be retrieved and served by the router. | 
					
						
							|  |  |  | type MediaAttachment struct { | 
					
						
							|  |  |  | 	// ID of the attachment in the database | 
					
						
							| 
									
										
										
										
											2021-06-13 18:42:28 +02:00
										 |  |  | 	ID string `pg:"type:CHAR(26),pk,notnull,unique"` | 
					
						
							| 
									
										
										
										
											2021-04-01 20:46:45 +02:00
										 |  |  | 	// ID of the status to which this is attached | 
					
						
							| 
									
										
										
										
											2021-06-13 18:42:28 +02:00
										 |  |  | 	StatusID string `pg:"type:CHAR(26)"` | 
					
						
							| 
									
										
										
										
											2021-04-19 19:42:19 +02:00
										 |  |  | 	// Where can the attachment be retrieved on *this* server | 
					
						
							|  |  |  | 	URL string | 
					
						
							|  |  |  | 	// Where can the attachment be retrieved on a remote server (empty for local media) | 
					
						
							| 
									
										
										
										
											2021-04-01 20:46:45 +02:00
										 |  |  | 	RemoteURL string | 
					
						
							|  |  |  | 	// When was the attachment created | 
					
						
							|  |  |  | 	CreatedAt time.Time `pg:"type:timestamp,notnull,default:now()"` | 
					
						
							|  |  |  | 	// When was the attachment last updated | 
					
						
							|  |  |  | 	UpdatedAt time.Time `pg:"type:timestamp,notnull,default:now()"` | 
					
						
							|  |  |  | 	// Type of file (image/gif/audio/video) | 
					
						
							|  |  |  | 	Type FileType `pg:",notnull"` | 
					
						
							|  |  |  | 	// Metadata about the file | 
					
						
							|  |  |  | 	FileMeta FileMeta | 
					
						
							|  |  |  | 	// To which account does this attachment belong | 
					
						
							| 
									
										
										
										
											2021-08-20 12:26:56 +02:00
										 |  |  | 	AccountID string   `pg:"type:CHAR(26),notnull"` | 
					
						
							|  |  |  | 	Account   *Account `pg:"rel:belongs-to"` | 
					
						
							| 
									
										
										
										
											2021-04-01 20:46:45 +02:00
										 |  |  | 	// Description of the attachment (for screenreaders) | 
					
						
							|  |  |  | 	Description string | 
					
						
							|  |  |  | 	// To which scheduled status does this attachment belong | 
					
						
							| 
									
										
										
										
											2021-06-13 18:42:28 +02:00
										 |  |  | 	ScheduledStatusID string `pg:"type:CHAR(26)"` | 
					
						
							| 
									
										
										
										
											2021-04-01 20:46:45 +02:00
										 |  |  | 	// What is the generated blurhash of this attachment | 
					
						
							|  |  |  | 	Blurhash string | 
					
						
							|  |  |  | 	// What is the processing status of this attachment | 
					
						
							|  |  |  | 	Processing ProcessingStatus | 
					
						
							|  |  |  | 	// metadata for the whole file | 
					
						
							|  |  |  | 	File File | 
					
						
							|  |  |  | 	// small image thumbnail derived from a larger image, video, or audio file. | 
					
						
							|  |  |  | 	Thumbnail Thumbnail | 
					
						
							|  |  |  | 	// Is this attachment being used as an avatar? | 
					
						
							|  |  |  | 	Avatar bool | 
					
						
							|  |  |  | 	// Is this attachment being used as a header? | 
					
						
							|  |  |  | 	Header bool | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // File refers to the metadata for the whole file | 
					
						
							|  |  |  | type File struct { | 
					
						
							|  |  |  | 	// What is the path of the file in storage. | 
					
						
							|  |  |  | 	Path string | 
					
						
							|  |  |  | 	// What is the MIME content type of the file. | 
					
						
							|  |  |  | 	ContentType string | 
					
						
							|  |  |  | 	// What is the size of the file in bytes. | 
					
						
							|  |  |  | 	FileSize int | 
					
						
							|  |  |  | 	// When was the file last updated. | 
					
						
							|  |  |  | 	UpdatedAt time.Time `pg:"type:timestamp,notnull,default:now()"` | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Thumbnail refers to a small image thumbnail derived from a larger image, video, or audio file. | 
					
						
							|  |  |  | type Thumbnail struct { | 
					
						
							|  |  |  | 	// What is the path of the file in storage | 
					
						
							|  |  |  | 	Path string | 
					
						
							|  |  |  | 	// What is the MIME content type of the file. | 
					
						
							|  |  |  | 	ContentType string | 
					
						
							|  |  |  | 	// What is the size of the file in bytes | 
					
						
							|  |  |  | 	FileSize int | 
					
						
							|  |  |  | 	// When was the file last updated | 
					
						
							|  |  |  | 	UpdatedAt time.Time `pg:"type:timestamp,notnull,default:now()"` | 
					
						
							| 
									
										
										
										
											2021-04-19 19:42:19 +02:00
										 |  |  | 	// What is the URL of the thumbnail on the local server | 
					
						
							|  |  |  | 	URL string | 
					
						
							|  |  |  | 	// What is the remote URL of the thumbnail (empty for local media) | 
					
						
							| 
									
										
										
										
											2021-04-01 20:46:45 +02:00
										 |  |  | 	RemoteURL string | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // ProcessingStatus refers to how far along in the processing stage the attachment is. | 
					
						
							|  |  |  | type ProcessingStatus int | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const ( | 
					
						
							| 
									
										
										
										
											2021-04-20 18:14:23 +02:00
										 |  |  | 	// ProcessingStatusReceived indicates the attachment has been received and is awaiting processing. No thumbnail available yet. | 
					
						
							| 
									
										
										
										
											2021-04-01 20:46:45 +02:00
										 |  |  | 	ProcessingStatusReceived ProcessingStatus = 0 | 
					
						
							| 
									
										
										
										
											2021-04-20 18:14:23 +02:00
										 |  |  | 	// ProcessingStatusProcessing indicates the attachment is currently being processed. Thumbnail is available but full media is not. | 
					
						
							| 
									
										
										
										
											2021-04-01 20:46:45 +02:00
										 |  |  | 	ProcessingStatusProcessing ProcessingStatus = 1 | 
					
						
							| 
									
										
										
										
											2021-04-20 18:14:23 +02:00
										 |  |  | 	// ProcessingStatusProcessed indicates the attachment has been fully processed and is ready to be served. | 
					
						
							| 
									
										
										
										
											2021-04-01 20:46:45 +02:00
										 |  |  | 	ProcessingStatusProcessed ProcessingStatus = 2 | 
					
						
							| 
									
										
										
										
											2021-04-20 18:14:23 +02:00
										 |  |  | 	// ProcessingStatusError indicates something went wrong processing the attachment and it won't be tried again--these can be deleted. | 
					
						
							| 
									
										
										
										
											2021-04-01 20:46:45 +02:00
										 |  |  | 	ProcessingStatusError ProcessingStatus = 666 | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // FileType refers to the file type of the media attaachment. | 
					
						
							|  |  |  | type FileType string | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const ( | 
					
						
							|  |  |  | 	// FileTypeImage is for jpegs and pngs | 
					
						
							| 
									
										
										
										
											2021-05-08 14:25:55 +02:00
										 |  |  | 	FileTypeImage FileType = "Image" | 
					
						
							| 
									
										
										
										
											2021-04-01 20:46:45 +02:00
										 |  |  | 	// FileTypeGif is for native gifs and soundless videos that have been converted to gifs | 
					
						
							| 
									
										
										
										
											2021-05-08 14:25:55 +02:00
										 |  |  | 	FileTypeGif FileType = "Gif" | 
					
						
							| 
									
										
										
										
											2021-04-01 20:46:45 +02:00
										 |  |  | 	// FileTypeAudio is for audio-only files (no video) | 
					
						
							| 
									
										
										
										
											2021-05-08 14:25:55 +02:00
										 |  |  | 	FileTypeAudio FileType = "Audio" | 
					
						
							| 
									
										
										
										
											2021-04-01 20:46:45 +02:00
										 |  |  | 	// FileTypeVideo is for files with audio + visual | 
					
						
							| 
									
										
										
										
											2021-05-08 14:25:55 +02:00
										 |  |  | 	FileTypeVideo FileType = "Video" | 
					
						
							| 
									
										
										
										
											2021-04-19 19:42:19 +02:00
										 |  |  | 	// FileTypeUnknown is for unknown file types (surprise surprise!) | 
					
						
							| 
									
										
										
										
											2021-05-08 14:25:55 +02:00
										 |  |  | 	FileTypeUnknown FileType = "Unknown" | 
					
						
							| 
									
										
										
										
											2021-04-01 20:46:45 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // FileMeta describes metadata about the actual contents of the file. | 
					
						
							|  |  |  | type FileMeta struct { | 
					
						
							|  |  |  | 	Original Original | 
					
						
							|  |  |  | 	Small    Small | 
					
						
							| 
									
										
										
										
											2021-04-19 19:42:19 +02:00
										 |  |  | 	Focus    Focus | 
					
						
							| 
									
										
										
										
											2021-04-01 20:46:45 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-19 19:42:19 +02:00
										 |  |  | // Small can be used for a thumbnail of any media type | 
					
						
							| 
									
										
										
										
											2021-04-01 20:46:45 +02:00
										 |  |  | type Small struct { | 
					
						
							|  |  |  | 	Width  int | 
					
						
							|  |  |  | 	Height int | 
					
						
							|  |  |  | 	Size   int | 
					
						
							|  |  |  | 	Aspect float64 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-19 19:42:19 +02:00
										 |  |  | // Original can be used for original metadata for any media type | 
					
						
							| 
									
										
										
										
											2021-04-01 20:46:45 +02:00
										 |  |  | type Original struct { | 
					
						
							|  |  |  | 	Width  int | 
					
						
							|  |  |  | 	Height int | 
					
						
							|  |  |  | 	Size   int | 
					
						
							|  |  |  | 	Aspect float64 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2021-04-19 19:42:19 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-20 18:14:23 +02:00
										 |  |  | // Focus describes the 'center' of the image for display purposes. | 
					
						
							|  |  |  | // X and Y should each be between -1 and 1 | 
					
						
							| 
									
										
										
										
											2021-04-19 19:42:19 +02:00
										 |  |  | type Focus struct { | 
					
						
							|  |  |  | 	X float32 | 
					
						
							|  |  |  | 	Y float32 | 
					
						
							|  |  |  | } |