summaryrefslogtreecommitdiff
path: root/internal/db/model/mediaattachment.go
blob: 3aff18d80b3a0957344892fd5af288708cb5fd35 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
   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/>.
*/

package model

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
	ID string `pg:"type:uuid,default:gen_random_uuid(),pk,notnull,unique"`
	// ID of the status to which this is attached
	StatusID string
	// Where can the attachment be retrieved on a remote server
	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
	AccountID string `pg:",notnull"`
	// Description of the attachment (for screenreaders)
	Description string
	// To which scheduled status does this attachment belong
	ScheduledStatusID string
	// 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()"`
	// What is the remote URL of the thumbnail
	RemoteURL string
}

// ProcessingStatus refers to how far along in the processing stage the attachment is.
type ProcessingStatus int

const (
	// ProcessingStatusReceived: the attachment has been received and is awaiting processing. No thumbnail available yet.
	ProcessingStatusReceived ProcessingStatus = 0
	// ProcessingStatusProcessing: the attachment is currently being processed. Thumbnail is available but full media is not.
	ProcessingStatusProcessing ProcessingStatus = 1
	// ProcessingStatusProcessed: the attachment has been fully processed and is ready to be served.
	ProcessingStatusProcessed ProcessingStatus = 2
	// ProcessingStatusError: something went wrong processing the attachment and it won't be tried again--these can be deleted.
	ProcessingStatusError ProcessingStatus = 666
)

// FileType refers to the file type of the media attaachment.
type FileType string

const (
	// FileTypeImage is for jpegs and pngs
	FileTypeImage FileType = "image"
	// FileTypeGif is for native gifs and soundless videos that have been converted to gifs
	FileTypeGif FileType = "gif"
	// FileTypeAudio is for audio-only files (no video)
	FileTypeAudio FileType = "audio"
	// FileTypeVideo is for files with audio + visual
	FileTypeVideo FileType = "video"
)

// FileMeta describes metadata about the actual contents of the file.
type FileMeta struct {
	Original Original
	Small    Small
}

// Small implements SmallMeta and can be used for a thumbnail of any media type
type Small struct {
	Width  int
	Height int
	Size   int
	Aspect float64
}

// ImageOriginal implements OriginalMeta for still images
type Original struct {
	Width  int
	Height int
	Size   int
	Aspect float64
}