mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2024-12-01 16:12:45 +00:00
c1375ca5c1
* [chore] Remove go-playground/validator It turns out we're not actually using the validator code. This is a remnant from when we intended to use it, but the presence of it and its struct tags creates the illusion we're validating a lot of things we're not. It resulted in some confusion when we were trying to figure out language valdiation. Remove all this code, so that only the validation functions from the validate package we actually use remain. I'm not touching the struct tags in the migrations in order to avoid things potentially thinking migrations need to be re-run. * [chore] Bring back a struct tag on api The validate on internal/api is Gin doing form validation, not the validator from go-playground/validator.
120 lines
7.6 KiB
Go
120 lines
7.6 KiB
Go
// GoToSocial
|
|
// Copyright (C) GoToSocial Authors admin@gotosocial.org
|
|
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
//
|
|
// 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 gtsmodel
|
|
|
|
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 string `bun:"type:CHAR(26),pk,nullzero,notnull,unique"` // id of this item in the database
|
|
CreatedAt time.Time `bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` // when was item created
|
|
UpdatedAt time.Time `bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` // when was item last updated
|
|
StatusID string `bun:"type:CHAR(26),nullzero"` // ID of the status to which this is attached
|
|
URL string `bun:",nullzero"` // Where can the attachment be retrieved on *this* server
|
|
RemoteURL string `bun:",nullzero"` // Where can the attachment be retrieved on a remote server (empty for local media)
|
|
Type FileType `bun:",nullzero,notnull"` // Type of file (image/gifv/audio/video)
|
|
FileMeta FileMeta `bun:",embed:,nullzero,notnull"` // Metadata about the file
|
|
AccountID string `bun:"type:CHAR(26),nullzero,notnull"` // To which account does this attachment belong
|
|
Description string `bun:""` // Description of the attachment (for screenreaders)
|
|
ScheduledStatusID string `bun:"type:CHAR(26),nullzero"` // To which scheduled status does this attachment belong
|
|
Blurhash string `bun:",nullzero"` // What is the generated blurhash of this attachment
|
|
Processing ProcessingStatus `bun:",notnull,default:2"` // What is the processing status of this attachment
|
|
File File `bun:",embed:file_,notnull,nullzero"` // metadata for the whole file
|
|
Thumbnail Thumbnail `bun:",embed:thumbnail_,notnull,nullzero"` // small image thumbnail derived from a larger image, video, or audio file.
|
|
Avatar *bool `bun:",nullzero,notnull,default:false"` // Is this attachment being used as an avatar?
|
|
Header *bool `bun:",nullzero,notnull,default:false"` // Is this attachment being used as a header?
|
|
Cached *bool `bun:",nullzero,notnull,default:false"` // Is this attachment currently cached by our instance?
|
|
}
|
|
|
|
// File refers to the metadata for the whole file
|
|
type File struct {
|
|
Path string `bun:",nullzero,notnull"` // Path of the file in storage.
|
|
ContentType string `bun:",nullzero,notnull"` // MIME content type of the file.
|
|
FileSize int `bun:",notnull"` // File size in bytes
|
|
UpdatedAt time.Time `bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` // When was the file last updated.
|
|
}
|
|
|
|
// Thumbnail refers to a small image thumbnail derived from a larger image, video, or audio file.
|
|
type Thumbnail struct {
|
|
Path string `bun:",nullzero,notnull"` // Path of the file in storage.
|
|
ContentType string `bun:",nullzero,notnull"` // MIME content type of the file.
|
|
FileSize int `bun:",notnull"` // File size in bytes
|
|
UpdatedAt time.Time `bun:"type:timestamptz,nullzero,notnull,default:current_timestamp"` // When was the file last updated.
|
|
URL string `bun:",nullzero"` // What is the URL of the thumbnail on the local server
|
|
RemoteURL string `bun:",nullzero"` // What is the remote URL of the thumbnail (empty for local media)
|
|
}
|
|
|
|
// ProcessingStatus refers to how far along in the processing stage the attachment is.
|
|
type ProcessingStatus int
|
|
|
|
// MediaAttachment processing states.
|
|
const (
|
|
ProcessingStatusReceived ProcessingStatus = 0 // ProcessingStatusReceived indicates the attachment has been received and is awaiting processing. No thumbnail available yet.
|
|
ProcessingStatusProcessing ProcessingStatus = 1 // ProcessingStatusProcessing indicates the attachment is currently being processed. Thumbnail is available but full media is not.
|
|
ProcessingStatusProcessed ProcessingStatus = 2 // ProcessingStatusProcessed indicates the attachment has been fully processed and is ready to be served.
|
|
ProcessingStatusError ProcessingStatus = 666 // ProcessingStatusError indicates something went wrong processing the attachment and it won't be tried again--these can be deleted.
|
|
)
|
|
|
|
// FileType refers to the file type of the media attaachment.
|
|
type FileType string
|
|
|
|
// MediaAttachment file types.
|
|
const (
|
|
FileTypeImage FileType = "Image" // FileTypeImage is for jpegs, pngs, and standard gifs
|
|
FileTypeGifv FileType = "Gifv" // FileTypeGif is for soundless looping videos that behave like gifs
|
|
FileTypeAudio FileType = "Audio" // FileTypeAudio is for audio-only files (no video)
|
|
FileTypeVideo FileType = "Video" // FileTypeVideo is for files with audio + visual
|
|
FileTypeUnknown FileType = "Unknown" // FileTypeUnknown is for unknown file types (surprise surprise!)
|
|
)
|
|
|
|
// FileMeta describes metadata about the actual contents of the file.
|
|
type FileMeta struct {
|
|
Original Original `bun:"embed:original_"`
|
|
Small Small `bun:"embed:small_"`
|
|
Focus Focus `bun:"embed:focus_"`
|
|
}
|
|
|
|
// Small can be used for a thumbnail of any media type
|
|
type Small struct {
|
|
Width int // width in pixels
|
|
Height int // height in pixels
|
|
Size int // size in pixels (width * height)
|
|
Aspect float32 // aspect ratio (width / height)
|
|
}
|
|
|
|
// Original can be used for original metadata for any media type
|
|
type Original struct {
|
|
Width int // width in pixels
|
|
Height int // height in pixels
|
|
Size int // size in pixels (width * height)
|
|
Aspect float32 // aspect ratio (width / height)
|
|
Duration *float32 // video-specific: duration of the video in seconds
|
|
Framerate *float32 // video-specific: fps
|
|
Bitrate *uint64 // video-specific: bitrate
|
|
}
|
|
|
|
// Focus describes the 'center' of the image for display purposes.
|
|
// X and Y should each be between -1 and 1
|
|
type Focus struct {
|
|
X float32
|
|
Y float32
|
|
}
|