Compare commits

...

4 Commits

Author SHA1 Message Date
Astra 8545e098c1 Code cleanup 2023-01-18 00:48:30 +00:00
Astra 137f570aca Remove unnecessary files 2023-01-18 00:21:09 +00:00
Astra 32514d2324 Update import paths 2023-01-18 00:20:55 +00:00
Astra 055afd90f9 Remove unnecessary files 2023-01-18 00:16:07 +00:00
197 changed files with 207 additions and 3311 deletions

View File

@ -7,10 +7,7 @@ package api
// Parameters:
// uuid: string PhotoUID as returned by the API
func (v1 *V1Client) GetPhoto(uuid string) (Photo, error) {
photo := Photo{
UUID: uuid,
PhotoUID: uuid,
}
photo := Photo{}
err := v1.GET("/api/v1/photos/%s", uuid).JSON(&photo)
return photo, err
}

View File

@ -1,7 +1,6 @@
package api
import (
"database/sql"
"time"
)
@ -9,335 +8,237 @@ type Photos []Photo
// Photo represents a photo, all its properties, and link to all its images and sidecar files.
type Photo struct {
UUID string `gorm:"type:VARBINARY(42);index;" json:"DocumentID,omitempty" yaml:"DocumentID,omitempty"`
TakenAt time.Time `gorm:"type:datetime;index:idx_photos_taken_uid;" json:"TakenAt" yaml:"TakenAt"`
TakenAtLocal time.Time `gorm:"type:datetime;" yaml:"-"`
TakenSrc string `gorm:"type:VARBINARY(8);" json:"TakenSrc" yaml:"TakenSrc,omitempty"`
PhotoUID string `gorm:"type:VARBINARY(42);unique_index;index:idx_photos_taken_uid;" json:"UID" yaml:"UID"`
PhotoType string `gorm:"type:VARBINARY(8);default:'image';" json:"Type" yaml:"Type"`
TypeSrc string `gorm:"type:VARBINARY(8);" json:"TypeSrc" yaml:"TypeSrc,omitempty"`
PhotoTitle string `gorm:"type:VARCHAR(255);" json:"Title" yaml:"Title"`
TitleSrc string `gorm:"type:VARBINARY(8);" json:"TitleSrc" yaml:"TitleSrc,omitempty"`
PhotoDescription string `gorm:"type:TEXT;" json:"Description" yaml:"Description,omitempty"`
DescriptionSrc string `gorm:"type:VARBINARY(8);" json:"DescriptionSrc" yaml:"DescriptionSrc,omitempty"`
PhotoPath string `gorm:"type:VARBINARY(500);index:idx_photos_path_name;" json:"Path" yaml:"-"`
PhotoName string `gorm:"type:VARBINARY(255);index:idx_photos_path_name;" json:"Name" yaml:"-"`
OriginalName string `gorm:"type:VARBINARY(755);" json:"OriginalName" yaml:"OriginalName,omitempty"`
PhotoStack int8 `json:"Stack" yaml:"Stack,omitempty"`
PhotoFavorite bool `json:"Favorite" yaml:"Favorite,omitempty"`
PhotoPrivate bool `json:"Private" yaml:"Private,omitempty"`
PhotoScan bool `json:"Scan" yaml:"Scan,omitempty"`
PhotoPanorama bool `json:"Panorama" yaml:"Panorama,omitempty"`
TimeZone string `gorm:"type:VARBINARY(64);" json:"TimeZone" yaml:"-"`
PlaceID string `gorm:"type:VARBINARY(42);index;default:'zz'" json:"PlaceID" yaml:"-"`
PlaceSrc string `gorm:"type:VARBINARY(8);" json:"PlaceSrc" yaml:"PlaceSrc,omitempty"`
CellID string `gorm:"type:VARBINARY(42);index;default:'zz'" json:"CellID" yaml:"-"`
CellAccuracy int `json:"CellAccuracy" yaml:"CellAccuracy,omitempty"`
PhotoAltitude int `json:"Altitude" yaml:"Altitude,omitempty"`
PhotoLat float32 `gorm:"type:FLOAT;index;" json:"Lat" yaml:"Lat,omitempty"`
PhotoLng float32 `gorm:"type:FLOAT;index;" json:"Lng" yaml:"Lng,omitempty"`
PhotoCountry string `gorm:"type:VARBINARY(2);index:idx_photos_country_year_month;default:'zz'" json:"Country" yaml:"-"`
PhotoYear int `gorm:"index:idx_photos_country_year_month;" json:"Year" yaml:"Year"`
PhotoMonth int `gorm:"index:idx_photos_country_year_month;" json:"Month" yaml:"Month"`
PhotoDay int `json:"Day" yaml:"Day"`
PhotoIso int `json:"Iso" yaml:"ISO,omitempty"`
PhotoExposure string `gorm:"type:VARBINARY(64);" json:"Exposure" yaml:"Exposure,omitempty"`
PhotoFNumber float32 `gorm:"type:FLOAT;" json:"FNumber" yaml:"FNumber,omitempty"`
PhotoFocalLength int `json:"FocalLength" yaml:"FocalLength,omitempty"`
PhotoQuality int `gorm:"type:SMALLINT" json:"Quality" yaml:"-"`
PhotoResolution int `gorm:"type:SMALLINT" json:"Resolution" yaml:"-"`
PhotoColor uint8 `json:"Color" yaml:"-"`
CameraID uint `gorm:"index:idx_photos_camera_lens;default:1" json:"CameraID" yaml:"-"`
CameraSerial string `gorm:"type:VARBINARY(255);" json:"CameraSerial" yaml:"CameraSerial,omitempty"`
CameraSrc string `gorm:"type:VARBINARY(8);" json:"CameraSrc" yaml:"-"`
LensID uint `gorm:"index:idx_photos_camera_lens;default:1" json:"LensID" yaml:"-"`
Details *Details `gorm:"association_autoupdate:false;association_autocreate:false;association_save_reference:false" json:"Details" yaml:"Details"`
Camera *Camera `gorm:"association_autoupdate:false;association_autocreate:false;association_save_reference:false" json:"Camera" yaml:"-"`
Lens *Lens `gorm:"association_autoupdate:false;association_autocreate:false;association_save_reference:false" json:"Lens" yaml:"-"`
Cell *Cell `gorm:"association_autoupdate:false;association_autocreate:false;association_save_reference:false" json:"Cell" yaml:"-"`
Place *Place `gorm:"association_autoupdate:false;association_autocreate:false;association_save_reference:false" json:"Place" yaml:"-"`
Keywords []Keyword `json:"-" yaml:"-"`
Albums []Album `json:"-" yaml:"-"`
Files []File `yaml:"-"`
Labels []PhotoLabel `yaml:"-"`
CreatedAt time.Time `yaml:"CreatedAt,omitempty"`
UpdatedAt time.Time `yaml:"UpdatedAt,omitempty"`
EditedAt *time.Time `yaml:"EditedAt,omitempty"`
CheckedAt *time.Time `sql:"index" yaml:"-"`
DeletedAt *time.Time `sql:"index" yaml:"DeletedAt,omitempty"`
PhotoID int `json:"ID,omitempty"`
TakenAt time.Time `json:"TakenAt"`
TakenAtLocal time.Time `json:"TakenAtLocal"`
TakenSrc string `json:"TakenSrc"`
PhotoUID string `json:"UID"`
PhotoType string `json:"Type"`
TypeSrc string `json:"TypeSrc"`
PhotoTitle string `json:"Title"`
TitleSrc string `json:"TitleSrc"`
PhotoDescription string `json:"Description"`
DescriptionSrc string `json:"DescriptionSrc"`
PhotoPath string `json:"Path"`
PhotoName string `json:"Name"`
OriginalName string `json:"OriginalName"`
PhotoStack int8 `json:"Stack"`
PhotoFavorite bool `json:"Favorite"`
PhotoPrivate bool `json:"Private"`
PhotoScan bool `json:"Scan"`
PhotoPanorama bool `json:"Panorama"`
TimeZone string `json:"TimeZone"`
PlaceID string `json:"PlaceID"`
PlaceSrc string `json:"PlaceSrc"`
CellID string `json:"CellID"`
CellAccuracy int `json:"CellAccuracy"`
PhotoAltitude int `json:"Altitude"`
PhotoLat float32 `json:"Lat"`
PhotoLng float32 `json:"Lng"`
PhotoCountry string `json:"Country"`
PhotoYear int `json:"Year"`
PhotoMonth int `json:"Month"`
PhotoDay int `json:"Day"`
PhotoIso int `json:"Iso"`
PhotoExposure string `json:"Exposure"`
PhotoFNumber float32 `json:"FNumber"`
PhotoFocalLength int `json:"FocalLength"`
PhotoQuality int `json:"Quality"`
PhotoResolution int `json:"Resolution"`
PhotoColor uint8 `json:"Color"`
CameraID uint `json:"CameraID"`
CameraSerial string `json:"CameraSerial"`
CameraSrc string `json:"CameraSrc"`
LensID uint `json:"LensID"`
Details *Details `json:"Details"`
Camera *Camera `json:"Camera"`
Lens *Lens `json:"Lens"`
Cell *Cell `json:"Cell"`
Place *Place `json:"Place"`
Files []File `json:"Files"`
Labels []PhotoLabel `json:"Labels"`
CreatedAt time.Time `json:"CreatedAt"`
UpdatedAt time.Time `json:"UpdatedAt"`
EditedAt *time.Time `json:"EditedAt"`
CheckedAt *time.Time `json:"CheckedAt"`
DeletedAt *time.Time `json:"DeletedAt"`
}
// Details stores additional metadata fields for each photo to improve search performance.
type Details struct {
PhotoID uint `gorm:"primary_key;auto_increment:false" yaml:"-"`
Keywords string `gorm:"type:TEXT;" json:"Keywords" yaml:"Keywords"`
KeywordsSrc string `gorm:"type:VARBINARY(8);" json:"KeywordsSrc" yaml:"KeywordsSrc,omitempty"`
Notes string `gorm:"type:TEXT;" json:"Notes" yaml:"Notes,omitempty"`
NotesSrc string `gorm:"type:VARBINARY(8);" json:"NotesSrc" yaml:"NotesSrc,omitempty"`
Subject string `gorm:"type:VARCHAR(255);" json:"Subject" yaml:"Subject,omitempty"`
SubjectSrc string `gorm:"type:VARBINARY(8);" json:"SubjectSrc" yaml:"SubjectSrc,omitempty"`
Artist string `gorm:"type:VARCHAR(255);" json:"Artist" yaml:"Artist,omitempty"`
ArtistSrc string `gorm:"type:VARBINARY(8);" json:"ArtistSrc" yaml:"ArtistSrc,omitempty"`
Copyright string `gorm:"type:VARCHAR(255);" json:"Copyright" yaml:"Copyright,omitempty"`
CopyrightSrc string `gorm:"type:VARBINARY(8);" json:"CopyrightSrc" yaml:"CopyrightSrc,omitempty"`
License string `gorm:"type:VARCHAR(255);" json:"License" yaml:"License,omitempty"`
LicenseSrc string `gorm:"type:VARBINARY(8);" json:"LicenseSrc" yaml:"LicenseSrc,omitempty"`
CreatedAt time.Time `yaml:"-"`
UpdatedAt time.Time `yaml:"-"`
PhotoID uint `json:"PhotoID"`
Keywords string `json:"Keywords"`
KeywordsSrc string `json:"KeywordsSrc"`
Notes string `json:"Notes"`
NotesSrc string `json:"NotesSrc"`
Subject string `json:"Subject"`
SubjectSrc string `json:"SubjectSrc"`
Artist string `json:"Artist"`
ArtistSrc string `json:"ArtistSrc"`
Copyright string `json:"Copyright"`
CopyrightSrc string `json:"CopyrightSrc"`
License string `json:"License"`
LicenseSrc string `json:"LicenseSrc"`
Software string `json:"Software"`
SoftwareSrc string `json:"SoftwareSrc"`
CreatedAt time.Time `json:"CreatedAt"`
UpdatedAt time.Time `json:"UpdatedAt"`
}
// Camera model and make (as extracted from UpdateExif metadata)
type Camera struct {
ID uint `gorm:"primary_key" json:"ID" yaml:"ID"`
CameraSlug string `gorm:"type:VARBINARY(255);unique_index;" json:"Slug" yaml:"-"`
CameraName string `gorm:"type:VARCHAR(255);" json:"Name" yaml:"Name"`
CameraMake string `gorm:"type:VARCHAR(255);" json:"Make" yaml:"Make,omitempty"`
CameraModel string `gorm:"type:VARCHAR(255);" json:"Model" yaml:"Model,omitempty"`
CameraType string `gorm:"type:VARCHAR(255);" json:"Type,omitempty" yaml:"Type,omitempty"`
CameraDescription string `gorm:"type:TEXT;" json:"Description,omitempty" yaml:"Description,omitempty"`
CameraNotes string `gorm:"type:TEXT;" json:"Notes,omitempty" yaml:"Notes,omitempty"`
CreatedAt time.Time `json:"-" yaml:"-"`
UpdatedAt time.Time `json:"-" yaml:"-"`
DeletedAt *time.Time `sql:"index" json:"-" yaml:"-"`
ID uint `json:"ID"`
CameraSlug string `json:"Slug"`
CameraName string `json:"Name"`
CameraMake string `json:"Make"`
CameraModel string `json:"Model"`
CameraType string `json:"Type,omitempty"`
CameraDescription string `json:"Description,omitempty"`
CameraNotes string `json:"Notes,omitempty"`
}
// Lens represents camera lens (as extracted from UpdateExif metadata)
type Lens struct {
ID uint `gorm:"primary_key" json:"ID" yaml:"ID"`
LensSlug string `gorm:"type:VARBINARY(255);unique_index;" json:"Slug" yaml:"Slug,omitempty"`
LensName string `gorm:"type:VARCHAR(255);" json:"Name" yaml:"Name"`
LensMake string `gorm:"type:VARCHAR(255);" json:"Make" yaml:"Make,omitempty"`
LensModel string `gorm:"type:VARCHAR(255);" json:"Model" yaml:"Model,omitempty"`
LensType string `gorm:"type:VARCHAR(255);" json:"Type" yaml:"Type,omitempty"`
LensDescription string `gorm:"type:TEXT;" json:"Description,omitempty" yaml:"Description,omitempty"`
LensNotes string `gorm:"type:TEXT;" json:"Notes,omitempty" yaml:"Notes,omitempty"`
CreatedAt time.Time `json:"-" yaml:"-"`
UpdatedAt time.Time `json:"-" yaml:"-"`
DeletedAt *time.Time `sql:"index" json:"-" yaml:"-"`
ID uint `json:"ID"`
LensSlug string `json:"Slug"`
LensName string `json:"Name"`
LensMake string `json:"Make"`
LensModel string `json:"Model"`
LensType string `json:"Type"`
LensDescription string `json:"Description,omitempty"`
LensNotes string `json:"Notes,omitempty"`
}
// Cell represents a S2 cell with location data.
type Cell struct {
ID string `gorm:"type:VARBINARY(42);primary_key;auto_increment:false;" json:"ID" yaml:"ID"`
CellName string `gorm:"type:VARCHAR(255);" json:"Name" yaml:"Name,omitempty"`
CellCategory string `gorm:"type:VARCHAR(64);" json:"Category" yaml:"Category,omitempty"`
PlaceID string `gorm:"type:VARBINARY(42);default:'zz'" json:"-" yaml:"PlaceID"`
Place *Place `gorm:"PRELOAD:true" json:"Place" yaml:"-"`
CreatedAt time.Time `json:"CreatedAt" yaml:"-"`
UpdatedAt time.Time `json:"UpdatedAt" yaml:"-"`
ID string `json:"ID"`
CellName string `json:"Name"`
CellStreet string `json:"Street"`
CellPostcode string `json:"Postcode"`
CellCategory string `json:"Category"`
Place *Place `json:"Place"`
CreatedAt time.Time `json:"CreatedAt"`
UpdatedAt time.Time `json:"UpdatedAt"`
}
// Place used to associate photos to places
type Place struct {
ID string `gorm:"type:VARBINARY(42);primary_key;auto_increment:false;" json:"PlaceID" yaml:"PlaceID"`
PlaceLabel string `gorm:"type:VARBINARY(755);unique_index;" json:"Label" yaml:"Label"`
PlaceCity string `gorm:"type:VARCHAR(255);" json:"City" yaml:"City,omitempty"`
PlaceState string `gorm:"type:VARCHAR(255);" json:"State" yaml:"State,omitempty"`
PlaceCountry string `gorm:"type:VARBINARY(2);" json:"Country" yaml:"Country,omitempty"`
PlaceKeywords string `gorm:"type:VARCHAR(255);" json:"Keywords" yaml:"Keywords,omitempty"`
PlaceFavorite bool `json:"Favorite" yaml:"Favorite,omitempty"`
PhotoCount int `gorm:"default:1" json:"PhotoCount" yaml:"-"`
CreatedAt time.Time `json:"CreatedAt" yaml:"-"`
UpdatedAt time.Time `json:"UpdatedAt" yaml:"-"`
}
// Keyword used for full text search
type Keyword struct {
ID uint `gorm:"primary_key"`
Keyword string `gorm:"type:VARCHAR(64);index;"`
Skip bool
ID string `json:"PlaceID"`
PlaceLabel string `json:"Label"`
PlaceCity string `json:"City"`
PlaceState string `json:"State"`
PlaceCountry string `json:"Country"`
PlaceKeywords string `json:"Keywords"`
PlaceFavorite bool `json:"Favorite"`
PhotoCount int `json:"PhotoCount"`
CreatedAt time.Time `json:"CreatedAt"`
UpdatedAt time.Time `json:"UpdatedAt"`
}
// Album represents a photo album
type Album struct {
ID uint `gorm:"primary_key" json:"ID" yaml:"-"`
AlbumUID string `gorm:"type:VARBINARY(42);unique_index;" json:"UID" yaml:"UID"`
CoverUID string `gorm:"type:VARBINARY(42);" json:"CoverUID" yaml:"CoverUID,omitempty"`
FolderUID string `gorm:"type:VARBINARY(42);index;" json:"FolderUID" yaml:"FolderUID,omitempty"`
AlbumSlug string `gorm:"type:VARBINARY(255);index;" json:"Slug" yaml:"Slug"`
AlbumPath string `gorm:"type:VARBINARY(500);index;" json:"Path" yaml:"-"`
AlbumType string `gorm:"type:VARBINARY(8);default:'album';" json:"Type" yaml:"Type,omitempty"`
AlbumTitle string `gorm:"type:VARCHAR(255);" json:"Title" yaml:"Title"`
AlbumLocation string `gorm:"type:VARCHAR(255);" json:"Location" yaml:"Location,omitempty"`
AlbumCategory string `gorm:"type:VARCHAR(255);index;" json:"Category" yaml:"Category,omitempty"`
AlbumCaption string `gorm:"type:TEXT;" json:"Caption" yaml:"Caption,omitempty"`
AlbumDescription string `gorm:"type:TEXT;" json:"Description" yaml:"Description,omitempty"`
AlbumNotes string `gorm:"type:TEXT;" json:"Notes" yaml:"Notes,omitempty"`
AlbumFilter string `gorm:"type:VARBINARY(1024);" json:"Filter" yaml:"Filter,omitempty"`
AlbumOrder string `gorm:"type:VARBINARY(32);" json:"Order" yaml:"Order,omitempty"`
AlbumTemplate string `gorm:"type:VARBINARY(255);" json:"Template" yaml:"Template,omitempty"`
AlbumCountry string `gorm:"type:VARBINARY(2);index:idx_albums_country_year_month;default:'zz'" json:"Country" yaml:"Country,omitempty"`
AlbumYear int `gorm:"index:idx_albums_country_year_month;" json:"Year" yaml:"Year,omitempty"`
AlbumMonth int `gorm:"index:idx_albums_country_year_month;" json:"Month" yaml:"Month,omitempty"`
AlbumDay int `json:"Day" yaml:"Day,omitempty"`
AlbumFavorite bool `json:"Favorite" yaml:"Favorite,omitempty"`
AlbumPrivate bool `json:"Private" yaml:"Private,omitempty"`
CreatedAt time.Time `json:"CreatedAt" yaml:"CreatedAt,omitempty"`
UpdatedAt time.Time `json:"UpdatedAt" yaml:"UpdatedAt,omitempty"`
DeletedAt *time.Time `sql:"index" json:"DeletedAt" yaml:"DeletedAt,omitempty"`
Photos PhotoAlbums `gorm:"foreignkey:AlbumUID;association_foreignkey:AlbumUID" json:"-" yaml:"Photos,omitempty"`
ID uint `json:"ID"`
AlbumUID string `json:"UID"`
AlbumSlug string `json:"Slug"`
AlbumType string `json:"Type"`
AlbumTitle string `json:"Title"`
AlbumLocation string `json:"Location"`
AlbumCategory string `json:"Category"`
AlbumCaption string `json:"Caption"`
AlbumDescription string `json:"Description"`
AlbumNotes string `json:"Notes"`
AlbumFilter string `json:"Filter"`
AlbumOrder string `json:"Order"`
AlbumTemplate string `json:"Template"`
AlbumCountry string `json:"Country"`
AlbumYear int `json:"Year"`
AlbumMonth int `json:"Month"`
AlbumDay int `json:"Day"`
AlbumFavorite bool `json:"Favorite"`
AlbumPrivate bool `json:"Private"`
CreatedAt time.Time `json:"CreatedAt"`
UpdatedAt time.Time `json:"UpdatedAt"`
DeletedAt *time.Time `json:"DeletedAt"`
}
type PhotoAlbums []PhotoAlbum
// PhotoAlbum represents the many_to_many relation between Photo and Album
type PhotoAlbum struct {
PhotoUID string `gorm:"type:VARBINARY(42);primary_key;auto_increment:false" json:"PhotoUID" yaml:"UID"`
AlbumUID string `gorm:"type:VARBINARY(42);primary_key;auto_increment:false;index" json:"AlbumUID" yaml:"-"`
Order int `json:"Order" yaml:"Order,omitempty"`
Hidden bool `json:"Hidden" yaml:"Hidden,omitempty"`
Missing bool `json:"Missing" yaml:"Missing,omitempty"`
CreatedAt time.Time `json:"CreatedAt" yaml:"CreatedAt,omitempty"`
UpdatedAt time.Time `json:"UpdatedAt" yaml:"-"`
Photo *Photo `gorm:"PRELOAD:false" yaml:"-"`
Album *Album `gorm:"PRELOAD:true" yaml:"-"`
PhotoUID string `json:"PhotoUID"`
AlbumUID string `json:"AlbumUID"`
Order int `json:"Order"`
Hidden bool `json:"Hidden"`
Missing bool `json:"Missing"`
CreatedAt time.Time `json:"CreatedAt"`
UpdatedAt time.Time `json:"UpdatedAt"`
Photo *Photo
Album *Album
}
type Files []File
// File represents an image or sidecar file that belongs to a photo.
type File struct {
ID uint `gorm:"primary_key" json:"-" yaml:"-"`
Photo *Photo `json:"-" yaml:"-"`
PhotoID uint `gorm:"index;" json:"-" yaml:"-"`
PhotoUID string `gorm:"type:VARBINARY(42);index;" json:"PhotoUID" yaml:"PhotoUID"`
InstanceID string `gorm:"type:VARBINARY(42);index;" json:"InstanceID,omitempty" yaml:"InstanceID,omitempty"`
FileUID string `gorm:"type:VARBINARY(42);unique_index;" json:"UID" yaml:"UID"`
FileName string `gorm:"type:VARBINARY(755);unique_index:idx_files_name_root;" json:"Name" yaml:"Name"`
FileRoot string `gorm:"type:VARBINARY(16);default:'/';unique_index:idx_files_name_root;" json:"Root" yaml:"Root,omitempty"`
OriginalName string `gorm:"type:VARBINARY(755);" json:"OriginalName" yaml:"OriginalName,omitempty"`
FileHash string `gorm:"type:VARBINARY(128);index" json:"Hash" yaml:"Hash,omitempty"`
FileSize int64 `json:"Size" yaml:"Size,omitempty"`
FileCodec string `gorm:"type:VARBINARY(32)" json:"Codec" yaml:"Codec,omitempty"`
FileType string `gorm:"type:VARBINARY(32)" json:"Type" yaml:"Type,omitempty"`
FileMime string `gorm:"type:VARBINARY(64)" json:"Mime" yaml:"Mime,omitempty"`
FilePrimary bool `json:"Primary" yaml:"Primary,omitempty"`
FileSidecar bool `json:"Sidecar" yaml:"Sidecar,omitempty"`
FileMissing bool `json:"Missing" yaml:"Missing,omitempty"`
FilePortrait bool `json:"Portrait" yaml:"Portrait,omitempty"`
FileVideo bool `json:"Video" yaml:"Video,omitempty"`
FileDuration time.Duration `json:"Duration" yaml:"Duration,omitempty"`
FileWidth int `json:"Width" yaml:"Width,omitempty"`
FileHeight int `json:"Height" yaml:"Height,omitempty"`
FileOrientation int `json:"Orientation" yaml:"Orientation,omitempty"`
FileProjection string `gorm:"type:VARBINARY(16);" json:"Projection,omitempty" yaml:"Projection,omitempty"`
FileAspectRatio float32 `gorm:"type:FLOAT;" json:"AspectRatio" yaml:"AspectRatio,omitempty"`
FileMainColor string `gorm:"type:VARBINARY(16);index;" json:"MainColor" yaml:"MainColor,omitempty"`
FileColors string `gorm:"type:VARBINARY(9);" json:"Colors" yaml:"Colors,omitempty"`
FileLuminance string `gorm:"type:VARBINARY(9);" json:"Luminance" yaml:"Luminance,omitempty"`
FileDiff uint32 `json:"Diff" yaml:"Diff,omitempty"`
FileChroma uint8 `json:"Chroma" yaml:"Chroma,omitempty"`
FileError string `gorm:"type:VARBINARY(512)" json:"Error" yaml:"Error,omitempty"`
ModTime int64 `json:"ModTime" yaml:"-"`
CreatedAt time.Time `json:"CreatedAt" yaml:"-"`
CreatedIn int64 `json:"CreatedIn" yaml:"-"`
UpdatedAt time.Time `json:"UpdatedAt" yaml:"-"`
UpdatedIn int64 `json:"UpdatedIn" yaml:"-"`
DeletedAt *time.Time `sql:"index" json:"DeletedAt,omitempty" yaml:"-"`
Share []FileShare `json:"-" yaml:"-"`
Sync []FileSync `json:"-" yaml:"-"`
}
// FileSync represents a one-to-many relation between File and Account for syncing with remote services.
type FileSync struct {
RemoteName string `gorm:"primary_key;auto_increment:false;type:VARBINARY(255)"`
AccountID uint `gorm:"primary_key;auto_increment:false"`
FileID uint `gorm:"index;"`
RemoteDate time.Time
RemoteSize int64
Status string `gorm:"type:VARBINARY(16);"`
Error string `gorm:"type:VARBINARY(512);"`
Errors int
File *File
Account *Account
CreatedAt time.Time
UpdatedAt time.Time
}
// FileShare represents a one-to-many relation between File and Account for pushing files to remote services.
type FileShare struct {
FileID uint `gorm:"primary_key;auto_increment:false"`
AccountID uint `gorm:"primary_key;auto_increment:false"`
RemoteName string `gorm:"primary_key;auto_increment:false;type:VARBINARY(255)"`
Status string `gorm:"type:VARBINARY(16);"`
Error string `gorm:"type:VARBINARY(512);"`
Errors int
File *File
Account *Account
CreatedAt time.Time
UpdatedAt time.Time
PhotoUID string `json:"PhotoUID"`
FileUID string `json:"UID"`
FileName string `json:"Name"`
FileRoot string `json:"Root"`
OriginalName string `json:"OriginalName"`
FileHash string `json:"Hash"`
FileSize int64 `json:"Size"`
FileCodec string `json:"Codec"`
FileType string `json:"Type"`
FileMime string `json:"Mime"`
FilePrimary bool `json:"Primary"`
FileSidecar bool `json:"Sidecar"`
FileMissing bool `json:"Missing"`
FilePortrait bool `json:"Portrait"`
FileVideo bool `json:"Video"`
FileDuration time.Duration `json:"Duration"`
FileWidth int `json:"Width"`
FileHeight int `json:"Height"`
FileOrientation int `json:"Orientation"`
FileProjection string `json:"Projection,omitempty"`
FileAspectRatio float32 `json:"AspectRatio"`
FileMainColor string `json:"MainColor"`
FileColors string `json:"Colors"`
FileLuminance string `json:"Luminance"`
FileDiff uint32 `json:"Diff"`
FileChroma uint8 `json:"Chroma"`
FileError string `json:"Error"`
ModTime int64 `json:"ModTime"`
CreatedAt time.Time `json:"CreatedAt"`
CreatedIn int64 `json:"CreatedIn"`
UpdatedAt time.Time `json:"UpdatedAt"`
UpdatedIn int64 `json:"UpdatedIn"`
DeletedAt *time.Time `json:"DeletedAt,omitempty"`
}
// PhotoLabel represents the many-to-many relation between Photo and label.
// Labels are weighted by uncertainty (100 - confidence)
type PhotoLabel struct {
PhotoID uint `gorm:"primary_key;auto_increment:false"`
LabelID uint `gorm:"primary_key;auto_increment:false;index"`
LabelSrc string `gorm:"type:VARBINARY(8);"`
Uncertainty int `gorm:"type:SMALLINT"`
Photo *Photo `gorm:"PRELOAD:false"`
Label *Label `gorm:"PRELOAD:true"`
PhotoID uint `json:"PhotoID"`
LabelID uint `json:"LabelID"`
LabelSrc string `json:"LabelSrc""`
Uncertainty int `json:"Uncertainty"`
Photo *Photo `json:"Photo"`
Label *Label `json:"Label"`
}
// Label is used for photo, album and location categorization
type Label struct {
ID uint `gorm:"primary_key" json:"ID" yaml:"-"`
LabelUID string `gorm:"type:VARBINARY(42);unique_index;" json:"UID" yaml:"UID"`
LabelSlug string `gorm:"type:VARBINARY(255);unique_index;" json:"Slug" yaml:"-"`
CustomSlug string `gorm:"type:VARBINARY(255);index;" json:"CustomSlug" yaml:"-"`
LabelName string `gorm:"type:VARCHAR(255);" json:"Name" yaml:"Name"`
LabelPriority int `json:"Priority" yaml:"Priority,omitempty"`
LabelFavorite bool `json:"Favorite" yaml:"Favorite,omitempty"`
LabelDescription string `gorm:"type:TEXT;" json:"Description" yaml:"Description,omitempty"`
LabelNotes string `gorm:"type:TEXT;" json:"Notes" yaml:"Notes,omitempty"`
LabelCategories []*Label `gorm:"many2many:categories;association_jointable_foreignkey:category_id" json:"-" yaml:"-"`
PhotoCount int `gorm:"default:1" json:"PhotoCount" yaml:"-"`
CreatedAt time.Time `json:"CreatedAt" yaml:"-"`
UpdatedAt time.Time `json:"UpdatedAt" yaml:"-"`
DeletedAt *time.Time `sql:"index" json:"DeletedAt,omitempty" yaml:"-"`
New bool `gorm:"-" json:"-" yaml:"-"`
}
// FileInfos represents meta data about a file
type FileInfos struct {
FileWidth int
FileHeight int
FileOrientation int
FileAspectRatio float32
FileMainColor string
FileColors string
FileLuminance string
FileDiff uint32
FileChroma uint8
}
// Account represents a remote service account for uploading, downloading or syncing media files.
type Account struct {
ID uint `gorm:"primary_key"`
AccName string `gorm:"type:VARCHAR(255);"`
AccOwner string `gorm:"type:VARCHAR(255);"`
AccURL string `gorm:"type:VARBINARY(512);"`
AccType string `gorm:"type:VARBINARY(255);"`
AccKey string `gorm:"type:VARBINARY(255);"`
AccUser string `gorm:"type:VARBINARY(255);"`
AccPass string `gorm:"type:VARBINARY(255);"`
AccError string `gorm:"type:VARBINARY(512);"`
AccErrors int
AccShare bool
AccSync bool
RetryLimit int
SharePath string `gorm:"type:VARBINARY(500);"`
ShareSize string `gorm:"type:VARBINARY(16);"`
ShareExpires int
SyncPath string `gorm:"type:VARBINARY(500);"`
SyncStatus string `gorm:"type:VARBINARY(16);"`
SyncInterval int
SyncDate sql.NullTime `deepcopier:"skip"`
SyncUpload bool
SyncDownload bool
SyncFilenames bool
SyncRaw bool
CreatedAt time.Time `deepcopier:"skip"`
UpdatedAt time.Time `deepcopier:"skip"`
DeletedAt *time.Time `deepcopier:"skip" sql:"index"`
ID uint `json:"ID"`
LabelUID string `json:"UID"`
LabelSlug string `json:"Slug"`
CustomSlug string `json:"CustomSlug"`
LabelName string `json:"Name"`
LabelPriority int `json:"Priority"`
LabelFavorite bool `json:"Favorite"`
LabelDescription string `json:"Description"`
LabelNotes string `json:"Notes"`
PhotoCount int `json:"PhotoCount"`
LabelThumb string `json:"Thumb"`
CreatedAt time.Time `json:"CreatedAt"`
UpdatedAt time.Time `json:"UpdatedAt"`
}

View File

@ -9,7 +9,7 @@ import (
"net/url"
"strings"
v1 "github.com/astravexton/photoprism-client-go/api/v1"
v1 "git.zio.sh/astra/photoprism-client-go/api/v1"
)
const (

1
examples/.gitignore vendored
View File

@ -1 +0,0 @@
ignore_*

View File

@ -4,8 +4,6 @@ Here are good examples and working code snippets to start from.
A lot of these files are used for development and are subject to change.
For more complete sample code, see the integration testing suite in `/test`.
### Running the examples
Run the examples. Make sure to pass both the file you wish to run, as well as `common.go` to include the convenience functions.

View File

@ -1,9 +1,9 @@
package main
import (
photoprism "git.zio.sh/astra/photoprism-client-go"
"git.zio.sh/astra/photoprism-client-go/api/v1"
"github.com/astravexton/logger"
photoprism "github.com/astravexton/photoprism-client-go"
"github.com/astravexton/photoprism-client-go/api/v1"
)
func main() {

View File

@ -4,7 +4,7 @@ import (
"fmt"
"os"
photoprism "github.com/astravexton/photoprism-client-go"
photoprism "git.zio.sh/astra/photoprism-client-go"
"github.com/astravexton/logger"
)

View File

@ -3,8 +3,8 @@ package main
import (
"fmt"
photoprism "git.zio.sh/astra/photoprism-client-go"
"github.com/astravexton/logger"
photoprism "github.com/astravexton/photoprism-client-go"
)
func main() {

View File

@ -1,8 +1,8 @@
package main
import (
photoprism "git.zio.sh/astra/photoprism-client-go"
"github.com/astravexton/logger"
photoprism "github.com/astravexton/photoprism-client-go"
)
func main() {

View File

@ -5,8 +5,8 @@ import (
"io/ioutil"
"path"
photoprism "git.zio.sh/astra/photoprism-client-go"
"github.com/astravexton/logger"
photoprism "github.com/astravexton/photoprism-client-go"
)
func main() {

9
go.mod
View File

@ -1,8 +1,5 @@
module github.com/astravexton/photoprism-client-go
module git.zio.sh/astra/photoprism-client-go
go 1.15
go 1.18
require (
github.com/astravexton/logger v0.2.1
github.com/kris-nova/logger v0.2.1
)
require github.com/astravexton/logger v0.2.2-0.20211216142523-c1e08a465709 // indirect

12
go.sum
View File

@ -1,4 +1,8 @@
github.com/astravexton/logger v0.2.1 h1:nYxhV6oCHIJzUzaPhawbAc51EEvJowIViVsB5EbdeJQ=
github.com/astravexton/logger v0.2.1/go.mod h1:6uxVhLlWlvZn48W8F52dsMXt4yztlrInpRhdWiJ9RXc=
github.com/kris-nova/logger v0.2.1 h1:hbZusgXXXTSd0rNAMBBe/8lhjxXkqWs0+nzjwewCI+E=
github.com/kris-nova/logger v0.2.1/go.mod h1:++9BgZujZd4v0ZTZCb5iPsaomXdZWyxotIAh1IiDm44=
github.com/astravexton/logger v0.2.2-0.20211216142523-c1e08a465709 h1:S+dBCax7wdg3ikWx5t6cClPKQIerrmD404qAzWhO2V4=
github.com/astravexton/logger v0.2.2-0.20211216142523-c1e08a465709/go.mod h1:6BlG5E0U3CImXLmDtGpEwdoc8PHiiDv0kbvJBCbfiMY=
github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
github.com/kris-nova/lolgopher v0.0.0-20210112022122-73f0047e8b65/go.mod h1:V0HF/ZBlN86HqewcDC/cVxMmYDiRukWjSrgKLUAn9Js=
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=

View File

@ -1,6 +0,0 @@
# Internal
This directory is used to store backend code while developing.
This directory should NEVER contain SDK code.

View File

@ -1,17 +0,0 @@
# Sample App
This is bad code.
We shell exec the start/stop/create/destroy docker commands (poorly)
and this is how the unit testing suite attempts to start/stop/create/destroy
the local persistent store.
### Running The Sample App
```bash
./pcreate # Will create the sample app running locally
./pdestroy # Will destroy the sample app, but the data will persist regardles of running this command
./pstop # Will stop the photoprism app from running/serving
./plogs # Will tail the photoprism logs
./pstart # Will start an already created, and then stopped Photoprism application
```

View File

@ -1,91 +0,0 @@
package sampleapp
import (
"path/filepath"
"runtime"
"github.com/astravexton/logger"
"github.com/astravexton/photoprism-client-go"
)
type SampleApplication struct {
}
func New() *SampleApplication {
app := &SampleApplication{}
return app
}
// These are the bash scripts that can be used
// to start/stop the Photoprism test application
var (
CreateCommand = `pcreate`
DestroyCommand = `pdestroy`
LogsCommand = `plogs`
StartCommand = `pstart`
StopCommand = `pstop"`
)
func (a *SampleApplication) Start() error {
logger.Info("Starting Application...")
script, err := NewScriptFromPath(filepath.Join(PrintWorkingDirectory(), StartCommand))
if err != nil {
return err
}
return script.Interpret()
}
func (a *SampleApplication) Stop() error {
logger.Info("Stopping Application...")
script, err := NewScriptFromPath(filepath.Join(PrintWorkingDirectory(), StopCommand))
if err != nil {
return err
}
return script.Interpret()
}
func (a *SampleApplication) Create() error {
logger.Info("Create Application...")
script, err := NewScriptFromPath(filepath.Join(PrintWorkingDirectory(), CreateCommand))
if err != nil {
return err
}
return script.Interpret()
}
func (a *SampleApplication) Destroy() error {
logger.Info("Destroying Application...")
script, err := NewScriptFromPath(filepath.Join(PrintWorkingDirectory(), DestroyCommand))
if err != nil {
return err
}
return script.Interpret()
}
func (a *SampleApplication) Logs() error {
logger.Info("Logging Application...")
script, err := NewScriptFromPath(filepath.Join(PrintWorkingDirectory(), LogsCommand))
if err != nil {
return err
}
return script.Interpret()
}
func (a *SampleApplication) GetAuth() photoprism.ClientAuthenticator {
return nil
}
func PrintWorkingDirectory() string {
_, filename, _, ok := runtime.Caller(1)
if !ok {
logger.Info("Unable to PWD")
return ""
}
dir, err := filepath.Abs(filepath.Dir(filename))
if err != nil {
logger.Info("Unable to PWD: %v", err)
return ""
}
return dir
}

View File

@ -1,169 +0,0 @@
package sampleapp
import (
"bytes"
"fmt"
"io/ioutil"
"os/exec"
"path/filepath"
"strings"
"github.com/astravexton/logger"
)
// Script is a set of commands delimited by newlines
// Comments # and // are ignored.
type Script struct {
commands []string
}
// NewScriptFromPath is used to build an executable script from a path of disk.
func NewScriptFromPath(path string) (*Script, error) {
path, err := filepath.Abs(path)
if err != nil {
return nil, fmt.Errorf("unable to calculate fully qualified path for path: %s: %v", path, err)
}
bytes, err := ioutil.ReadFile(path)
if err != nil {
return nil, fmt.Errorf("unable to read from path %s: %v", path, err)
}
content := string(bytes)
return NewScriptFromString(content), nil
}
const (
// IgnoreSpacesBash is the amount of (spaces - 1) that we see in common \\n delimited commands
IgnoreSpacesBash string = " "
// IgnoreTabs is the tab character
IgnoreTabs string = "\t"
)
// NewScriptFromString is used to build an executable script from the content in string form.
func NewScriptFromString(str string) *Script {
script := &Script{}
removeRuleF := func(str string, rs []string) string {
for _, r := range rs {
str = strings.Replace(str, r, "", -1)
}
return str
}
str = strings.Replace(str, "\\\n", "", -1)
str = removeRuleF(str, []string{IgnoreSpacesBash, IgnoreTabs})
spl := strings.Split(str, "\n")
//logger.Info("Script lines: %d", len(spl))
for _, line := range spl {
script.commands = append(script.commands, line)
}
return script
}
// Interpret is used to procedurally execute a script. The script will execute each line independently
// and can error at any point in the executation path.
func (s *Script) Interpret() error {
//logger.Info("Running script...")
for i, cmdStr := range s.commands {
// Exec will hang for output
// Ignore newlines
// Ignore comments starting with #
// Ignore comments starting with //
if cmdStr == "\n" || cmdStr == "" || strings.HasPrefix(cmdStr, "#") || strings.HasPrefix(cmdStr, "//") {
continue
}
logger.Info("Executing: [%s]", cmdStr)
result, err := Exec(cmdStr)
if err != nil {
return fmt.Errorf("error executing running command [%s] on line [%d]\n%v\n", cmdStr, i+1, err)
} else if result.exitCode != 0 {
return fmt.Errorf("non zero exit code running command [%s] on line [%d]\n%s\n%s\n", cmdStr, i+1, result.Stdout(), result.Stderr())
}
// Here is where we log STDOUT from a "script"
// Right now it is set to DEBUG which can be enabled by
// setting logger.Level = 4
logger.Debug(result.Stdout())
}
return nil
}
type ExecResult struct {
stderr string
stdout string
exitCode int
execErr exec.ExitError
}
func (e *ExecResult) Stdout() string {
return e.stdout
}
func (e *ExecResult) Stderr() string {
return e.stderr
}
func (e *ExecResult) ExitCode() int {
if e == nil {
return 0
}
return e.exitCode
}
func (e *ExecResult) ExecError() exec.ExitError {
return e.execErr
}
// Exec will take an arbitrary executable string
// and hang until the command exits
func Exec(str string) (*ExecResult, error) {
//logger.Info("Exec [%s]", str)
var cmdstr string
var args []string
var l int
spl := strings.Split(str, " ")
l = len(spl)
if l == 1 {
// <cmd>
cmdstr = spl[0]
} else if l > 1 {
// <cmd> <arg>...
cmdstr = spl[0]
for i := 1; i < l; i++ {
args = append(args, spl[i])
}
} else if l < 1 {
return nil, fmt.Errorf("invalid Exec() string %s", str)
}
fqpcmd, err := exec.LookPath(cmdstr)
if err != nil {
logger.Debug("unable to find fully qualified path for executable %s: %v", cmdstr, err)
}
//logger.Info("Command: %s", fqpcmd)
//logger.Info("Args: %v", args)
stdoutBuffer := bytes.Buffer{}
stderrBuffer := bytes.Buffer{}
e := []string{fqpcmd}
for _, arg := range args {
e = append(e, arg)
}
cmd := exec.Command(e[0], e[1:]...)
cmd.Stdout = &stdoutBuffer
cmd.Stderr = &stderrBuffer
result := &ExecResult{}
err = cmd.Run()
if err != nil {
if eerr, ok := err.(*exec.ExitError); ok {
result.stderr = stderrBuffer.String()
result.stdout = stdoutBuffer.String()
result.exitCode = eerr.ExitCode()
result.execErr = *eerr
return result, nil
}
return nil, fmt.Errorf("major error running command [%s]: %v", str, err)
}
result.stderr = stderrBuffer.String()
result.stdout = stdoutBuffer.String()
result.exitCode = 0
return result, nil
}

View File

@ -1,25 +0,0 @@
#!/bin/bash
####################################
#####
###
##
#
#
# Startup Script for the Application
####################################
echo "Creating [SampleApp]"
# TODO Nova
# TODO Per edude03ontwitch we want to actually mount /photoprism/whatever
docker run -d \
--name photoprism \
-p 8080:2342 \
-e PHOTOPRISM_UPLOAD_NSFW="true" \
-e PHOTOPRISM_ADMIN_PASSWORD="missy" \
-v ${GOPATH}/src/github.com/astravexton/photoprism-client-go/sample-app/photoprism/import:/photoprism/import \
-v ${GOPATH}/src/github.com/astravexton/photoprism-client-go/sample-app/photoprism/originals:/photoprism/originals \
-v ${GOPATH}/src/github.com/astravexton/photoprism-client-go/sample-app/photoprism/storage:/photoprism/storage \
photoprism/photoprism:latest

View File

@ -1,13 +0,0 @@
#!/bin/bash
####################################
#####
###
##
#
#
# Startup Script for the Application
####################################
echo "Destroying [SampleApp]"
docker stop photoprism
docker rm photoprism

Binary file not shown.

Before

Width:  |  Height:  |  Size: 592 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 380 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 380 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 592 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 134 KiB

View File

@ -1,17 +0,0 @@
UID: aqnzih81icziiyae
Slug: february-2021
Type: album
Title: February 2021
Order: oldest
Country: zz
CreatedAt: 2021-02-04T03:17:32Z
UpdatedAt: 2021-02-04T03:17:32Z
Photos:
- UID: pqnzigq156lndozm
CreatedAt: 2021-02-04T03:17:40.83892969Z
- UID: pqnzigq1jb1bibrz
CreatedAt: 2021-02-04T03:17:40.846632301Z
- UID: pqnzigq351j2fqgn
CreatedAt: 2021-02-04T03:17:40.851856107Z
- UID: pqnzigq3sidxb0j0
CreatedAt: 2021-02-04T03:17:40.857083572Z

View File

@ -1,9 +0,0 @@
UID: aqoe01hgxpo1hjih
Slug: novaalbum
Type: album
Title: NovaAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-11T23:03:18Z
UpdatedAt: 2021-02-11T23:03:18Z
DeletedAt: 2021-02-11T23:14:45.771988424Z

View File

@ -1,9 +0,0 @@
UID: aqoe0941aw0wz0rj
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-11T23:07:53Z
UpdatedAt: 2021-02-11T23:07:53Z
DeletedAt: 2021-02-11T23:14:36.400063828Z

View File

@ -1,9 +0,0 @@
UID: aqoe0j0nog2wtd98
Slug: february-2021
Type: album
Title: February 2021
Order: oldest
Country: zz
CreatedAt: 2021-02-11T23:13:49Z
UpdatedAt: 2021-02-11T23:13:49Z
DeletedAt: 2021-02-11T23:14:30.637709439Z

View File

@ -1,10 +0,0 @@
UID: aqoe0o1v8rjprqy6
Slug: testalbum
Type: album
Title: TestAlbum
Description: An updated album description
Order: oldest
Country: zz
CreatedAt: 2021-02-11T23:16:49Z
UpdatedAt: 2021-02-11T23:16:49.091245891Z
DeletedAt: 2021-02-11T23:18:32.10184988Z

View File

@ -1,10 +0,0 @@
UID: aqoe0xu1149t43i3
Slug: testalbum
Type: album
Title: TestAlbum
Description: An updated album description
Order: oldest
Country: zz
CreatedAt: 2021-02-11T23:22:42Z
UpdatedAt: 2021-02-11T23:22:42.31692892Z
DeletedAt: 2021-02-12T00:14:52.285222547Z

View File

@ -1,10 +0,0 @@
UID: aqoe0zl3h1wak08f
Slug: testalbum
Type: album
Title: TestAlbum
Description: An updated album description
Order: oldest
Country: zz
CreatedAt: 2021-02-11T23:23:46Z
UpdatedAt: 2021-02-11T23:23:45.864716162Z
DeletedAt: 2021-02-11T23:24:31.729202695Z

View File

@ -1,10 +0,0 @@
UID: aqoe1231tb94a48k
Slug: testalbum
Type: album
Title: TestAlbum
Description: An updated album description
Order: oldest
Country: zz
CreatedAt: 2021-02-11T23:25:16Z
UpdatedAt: 2021-02-11T23:25:15.61908592Z
DeletedAt: 2021-02-12T00:14:52.285222547Z

View File

@ -1,9 +0,0 @@
UID: aqoe1981fbhzaou2
Slug: novaalbum
Type: album
Title: NovaAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-11T23:29:33Z
UpdatedAt: 2021-02-11T23:29:33Z
DeletedAt: 2021-02-12T00:14:52.285222547Z

View File

@ -1,9 +0,0 @@
UID: aqoe1bw1ywyawhlb
Slug: novaalbum
Type: album
Title: NovaAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-11T23:31:08Z
UpdatedAt: 2021-02-11T23:31:08Z
DeletedAt: 2021-02-11T23:31:08.058407849Z

View File

@ -1,10 +0,0 @@
UID: aqoe1cs1rrfaer9d
Slug: testalbum
Type: album
Title: TestAlbum
Description: An updated album description
Order: oldest
Country: zz
CreatedAt: 2021-02-11T23:31:41Z
UpdatedAt: 2021-02-11T23:31:40.791556222Z
DeletedAt: 2021-02-11T23:31:40.798855984Z

View File

@ -1,10 +0,0 @@
UID: aqoe1mn3669ed8vc
Slug: testalbum
Type: album
Title: TestAlbum
Description: An updated album description
Order: oldest
Country: zz
CreatedAt: 2021-02-11T23:37:36Z
UpdatedAt: 2021-02-11T23:37:35.931076271Z
DeletedAt: 2021-02-11T23:37:35.938663557Z

View File

@ -1,9 +0,0 @@
UID: aqoe1mnib00h33mh
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-11T23:37:36Z
UpdatedAt: 2021-02-11T23:37:36Z
DeletedAt: 2021-02-11T23:37:35.984813813Z

View File

@ -1,9 +0,0 @@
UID: aqoe1su2yz12rn7r
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-11T23:41:19Z
UpdatedAt: 2021-02-11T23:41:19Z
DeletedAt: 2021-02-11T23:41:18.568153261Z

View File

@ -1,10 +0,0 @@
UID: aqoe1su312pday8a
Slug: testalbum
Type: album
Title: TestAlbum
Description: An updated album description
Order: oldest
Country: zz
CreatedAt: 2021-02-11T23:41:18Z
UpdatedAt: 2021-02-11T23:41:18.505274668Z
DeletedAt: 2021-02-11T23:41:18.517183797Z

View File

@ -1,9 +0,0 @@
UID: aqoe1su3gj3q7mrk
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-11T23:41:19Z
UpdatedAt: 2021-02-11T23:41:19Z
DeletedAt: 2021-02-11T23:41:18.592298473Z

View File

@ -1,9 +0,0 @@
UID: aqoe2nw1mc3m0c95
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-11T23:59:57Z
UpdatedAt: 2021-02-11T23:59:57Z
DeletedAt: 2021-02-11T23:59:56.834221161Z

View File

@ -1,9 +0,0 @@
UID: aqoe2nw2mtjrlyuq
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-11T23:59:57Z
UpdatedAt: 2021-02-11T23:59:57Z
DeletedAt: 2021-02-11T23:59:56.78263971Z

View File

@ -1,9 +0,0 @@
UID: aqoe2nw310xqz9f1
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-11T23:59:57Z
UpdatedAt: 2021-02-11T23:59:57Z
DeletedAt: 2021-02-11T23:59:56.805849627Z

View File

@ -1,10 +0,0 @@
UID: aqoe2nws4nefmwtt
Slug: testalbum
Type: album
Title: TestAlbum
Description: An updated album description
Order: oldest
Country: zz
CreatedAt: 2021-02-11T23:59:57Z
UpdatedAt: 2021-02-11T23:59:56.727315788Z
DeletedAt: 2021-02-11T23:59:56.734742155Z

View File

@ -1,9 +0,0 @@
UID: aqoe2u021a4zjufp
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:03:37Z
UpdatedAt: 2021-02-12T00:03:37Z
DeletedAt: 2021-02-12T00:03:36.899233684Z

View File

@ -1,9 +0,0 @@
UID: aqoe2u0299hfp9uf
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:03:37Z
UpdatedAt: 2021-02-12T00:03:37Z
DeletedAt: 2021-02-12T00:03:36.927067016Z

View File

@ -1,10 +0,0 @@
UID: aqoe2u03t1k09mbq
Slug: testalbum
Type: album
Title: TestAlbum
Description: An updated album description
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:03:37Z
UpdatedAt: 2021-02-12T00:03:36.846932177Z
DeletedAt: 2021-02-12T00:03:36.854999187Z

View File

@ -1,9 +0,0 @@
UID: aqoe2u0zakwm0kh4
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:03:37Z
UpdatedAt: 2021-02-12T00:03:37Z
DeletedAt: 2021-02-12T00:03:36.955701902Z

View File

@ -1,10 +0,0 @@
UID: aqoe2y1x2v9ulekw
Slug: testalbum
Type: album
Title: TestAlbum
Description: An updated album description
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:06:02Z
UpdatedAt: 2021-02-12T00:06:01.997666242Z
DeletedAt: 2021-02-12T00:06:02.008962725Z

View File

@ -1,9 +0,0 @@
UID: aqoe2y233f9xc3me
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:06:02Z
UpdatedAt: 2021-02-12T00:06:02Z
DeletedAt: 2021-02-12T00:06:02.061930815Z

View File

@ -1,9 +0,0 @@
UID: aqoe2y23iah7q8dd
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:06:02Z
UpdatedAt: 2021-02-12T00:06:02Z
DeletedAt: 2021-02-12T00:06:02.107878556Z

View File

@ -1,9 +0,0 @@
UID: aqoe2y23n8shfo26
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:06:02Z
UpdatedAt: 2021-02-12T00:06:02Z
DeletedAt: 2021-02-12T00:06:02.083118581Z

View File

@ -1,9 +0,0 @@
UID: aqoe310mqejp7sjx
Slug: novaalbum
Type: album
Title: NovaAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:07:48Z
UpdatedAt: 2021-02-12T00:07:48Z
DeletedAt: 2021-02-12T00:07:48.087397413Z

View File

@ -1,10 +0,0 @@
UID: aqoe3di2oe0gj7eb
Slug: testalbum
Type: album
Title: TestAlbum
Description: An updated album description
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:15:18Z
UpdatedAt: 2021-02-12T00:15:18.326635885Z
DeletedAt: 2021-02-12T00:15:18.337623732Z

View File

@ -1,9 +0,0 @@
UID: aqoe3di3f013g098
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:15:18Z
UpdatedAt: 2021-02-12T00:15:18Z
DeletedAt: 2021-02-12T00:15:18.387748516Z

View File

@ -1,9 +0,0 @@
UID: aqoe3di3rfrp4osq
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:15:18Z
UpdatedAt: 2021-02-12T00:15:18Z
DeletedAt: 2021-02-12T00:15:18.417353099Z

View File

@ -1,9 +0,0 @@
UID: aqoe3di9wl91qjy1
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:15:18Z
UpdatedAt: 2021-02-12T00:15:18Z
DeletedAt: 2021-02-12T00:15:18.441462643Z

View File

@ -1,9 +0,0 @@
UID: aqoe3go3alpu9g42
Slug: february-2021-2
Type: album
Title: February 2021 (2)
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:17:12Z
UpdatedAt: 2021-02-12T00:17:12Z
DeletedAt: 2021-02-12T00:25:55.610343844Z

View File

@ -1,9 +0,0 @@
UID: aqoe3sj140onsu3u
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:24:20Z
UpdatedAt: 2021-02-12T00:24:20Z
DeletedAt: 2021-02-12T00:24:19.584898324Z

View File

@ -1,10 +0,0 @@
UID: aqoe3sj2oim76rfl
Slug: testalbum
Type: album
Title: TestAlbum
Description: An updated album description
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:24:19Z
UpdatedAt: 2021-02-12T00:24:19.452079212Z
DeletedAt: 2021-02-12T00:24:19.46454459Z

View File

@ -1,9 +0,0 @@
UID: aqoe3sj3d9vpwfs6
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:24:19Z
UpdatedAt: 2021-02-12T00:24:19Z
DeletedAt: 2021-02-12T00:24:19.513541437Z

View File

@ -1,9 +0,0 @@
UID: aqoe3sj5v7uxy0xi
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:24:20Z
UpdatedAt: 2021-02-12T00:24:20Z
DeletedAt: 2021-02-12T00:24:19.539899181Z

View File

@ -1,10 +0,0 @@
UID: aqoe3uk1ztdf4ly1
Slug: testalbum
Type: album
Title: TestAlbum
Description: An updated album description
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:25:32Z
UpdatedAt: 2021-02-12T00:25:32.382246374Z
DeletedAt: 2021-02-12T00:25:32.39451528Z

View File

@ -1,9 +0,0 @@
UID: aqoe3uk2ssh3wlmu
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:25:32Z
UpdatedAt: 2021-02-12T00:25:32Z
DeletedAt: 2021-02-12T00:25:32.501491328Z

View File

@ -1,9 +0,0 @@
UID: aqoe3uk3quu1oau5
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:25:32Z
UpdatedAt: 2021-02-12T00:25:32Z
DeletedAt: 2021-02-12T00:25:32.438255604Z

View File

@ -1,9 +0,0 @@
UID: aqoe3ukef6k7pr1n
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:25:32Z
UpdatedAt: 2021-02-12T00:25:32Z
DeletedAt: 2021-02-12T00:25:32.457679012Z

View File

@ -1,10 +0,0 @@
UID: aqoe43017x1x557a
Slug: testalbum
Type: album
Title: TestAlbum
Description: An updated album description
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:30:36Z
UpdatedAt: 2021-02-12T00:30:36.452565204Z
DeletedAt: 2021-02-12T00:30:36.466024116Z

View File

@ -1,9 +0,0 @@
UID: aqoe43038gpo8o62
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:30:37Z
UpdatedAt: 2021-02-12T00:30:37Z
DeletedAt: 2021-02-12T00:30:36.541728272Z

View File

@ -1,9 +0,0 @@
UID: aqoe4303e2k7fowx
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:30:36Z
UpdatedAt: 2021-02-12T00:30:36Z
DeletedAt: 2021-02-12T00:30:36.515616836Z

View File

@ -1,9 +0,0 @@
UID: aqoe430hjepljox7
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:30:37Z
UpdatedAt: 2021-02-12T00:30:37Z
DeletedAt: 2021-02-12T00:30:36.590399562Z

View File

@ -1,9 +0,0 @@
UID: aqoe46u1y7nllowc
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:32:55Z
UpdatedAt: 2021-02-12T00:32:55Z
DeletedAt: 2021-02-12T00:32:54.670452125Z

View File

@ -1,10 +0,0 @@
UID: aqoe46u2eytps9ks
Slug: testalbum
Type: album
Title: TestAlbum
Description: An updated album description
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:32:55Z
UpdatedAt: 2021-02-12T00:32:54.621067369Z
DeletedAt: 2021-02-12T00:32:54.629069306Z

View File

@ -1,9 +0,0 @@
UID: aqoe46ugvoopsx2c
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:32:55Z
UpdatedAt: 2021-02-12T00:32:55Z
DeletedAt: 2021-02-12T00:32:54.738939626Z

View File

@ -1,9 +0,0 @@
UID: aqoe46uh3251f3o5
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:32:55Z
UpdatedAt: 2021-02-12T00:32:55Z
DeletedAt: 2021-02-12T00:32:54.694577526Z

View File

@ -1,9 +0,0 @@
UID: aqoe4k41ws8kl303
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:40:52Z
UpdatedAt: 2021-02-12T00:40:52Z
DeletedAt: 2021-02-12T00:40:52.236143624Z

View File

@ -1,10 +0,0 @@
UID: aqoe4k420c8937zq
Slug: testalbum
Type: album
Title: TestAlbum
Description: An updated album description
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:40:52Z
UpdatedAt: 2021-02-12T00:40:52.149620745Z
DeletedAt: 2021-02-12T00:40:52.157633931Z

View File

@ -1,9 +0,0 @@
UID: aqoe4k423kseyeok
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:40:52Z
UpdatedAt: 2021-02-12T00:40:52Z
DeletedAt: 2021-02-12T00:40:52.205835621Z

View File

@ -1,9 +0,0 @@
UID: aqoe4k42wb7vdpy4
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:40:52Z
UpdatedAt: 2021-02-12T00:40:52Z
DeletedAt: 2021-02-12T00:40:52.346059642Z

View File

@ -1,9 +0,0 @@
UID: aqoe4m917yd0x5d8
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:42:10Z
UpdatedAt: 2021-02-12T00:42:10Z
DeletedAt: 2021-02-12T00:42:09.739048804Z

View File

@ -1,10 +0,0 @@
UID: aqoe4m91dd475mc2
Slug: testalbum
Type: album
Title: TestAlbum
Description: An updated album description
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:42:10Z
UpdatedAt: 2021-02-12T00:42:09.68534495Z
DeletedAt: 2021-02-12T00:42:09.697602792Z

View File

@ -1,9 +0,0 @@
UID: aqoe4m9204aigugh
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:42:10Z
UpdatedAt: 2021-02-12T00:42:10Z
DeletedAt: 2021-02-12T01:19:49.19521169Z

View File

@ -1,9 +0,0 @@
UID: aqoe4m93kl5118yf
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T00:42:10Z
UpdatedAt: 2021-02-12T00:42:10Z
DeletedAt: 2021-02-12T00:42:09.764632667Z

View File

@ -1,9 +0,0 @@
UID: aqoe5s018umhsg2z
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T01:07:12Z
UpdatedAt: 2021-02-12T01:07:12Z
DeletedAt: 2021-02-12T01:07:12.278795475Z

View File

@ -1,10 +0,0 @@
UID: aqoe5s02eypzy49n
Slug: testalbum
Type: album
Title: TestAlbum
Description: An updated album description
Order: oldest
Country: zz
CreatedAt: 2021-02-12T01:07:12Z
UpdatedAt: 2021-02-12T01:07:12.18606883Z
DeletedAt: 2021-02-12T01:07:12.20368425Z

View File

@ -1,9 +0,0 @@
UID: aqoe5s02htbyx02a
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T01:07:12Z
UpdatedAt: 2021-02-12T01:07:12Z
DeletedAt: 2021-02-12T01:07:12.25672608Z

View File

@ -1,9 +0,0 @@
UID: aqoe5s0kcesnf038
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T01:07:12Z
UpdatedAt: 2021-02-12T01:07:12Z
DeletedAt: 2021-02-12T01:07:12.311501625Z

View File

@ -1,9 +0,0 @@
UID: aqoe5um2nxaam1jf
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T01:08:46Z
UpdatedAt: 2021-02-12T01:08:46Z
DeletedAt: 2021-02-12T01:08:46.441203314Z

View File

@ -1,10 +0,0 @@
UID: aqoe5um3k2bjzdz3
Slug: testalbum
Type: album
Title: TestAlbum
Description: An updated album description
Order: oldest
Country: zz
CreatedAt: 2021-02-12T01:08:46Z
UpdatedAt: 2021-02-12T01:08:46.349964437Z
DeletedAt: 2021-02-12T01:08:46.364581421Z

View File

@ -1,9 +0,0 @@
UID: aqoe5umo46cx9up1
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T01:08:46Z
UpdatedAt: 2021-02-12T01:08:46Z
DeletedAt: 2021-02-12T01:08:46.414981534Z

View File

@ -1,9 +0,0 @@
UID: aqoe5zd1dhchzyrt
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T01:11:37Z
UpdatedAt: 2021-02-12T01:11:37Z
DeletedAt: 2021-02-12T01:11:37.410053582Z

View File

@ -1,10 +0,0 @@
UID: aqoe5zd1n8nyjezg
Slug: testalbum
Type: album
Title: TestAlbum
Description: An updated album description
Order: oldest
Country: zz
CreatedAt: 2021-02-12T01:11:37Z
UpdatedAt: 2021-02-12T01:11:37.317189151Z
DeletedAt: 2021-02-12T01:11:37.337078186Z

View File

@ -1,9 +0,0 @@
UID: aqoe5zdgv8bbtzbn
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T01:11:37Z
UpdatedAt: 2021-02-12T01:11:37Z
DeletedAt: 2021-02-12T01:11:37.38408389Z

View File

@ -1,10 +0,0 @@
UID: aqoe63g15cp92acg
Slug: testalbum
Type: album
Title: TestAlbum
Description: An updated album description
Order: oldest
Country: zz
CreatedAt: 2021-02-12T01:14:05Z
UpdatedAt: 2021-02-12T01:14:04.617839652Z
DeletedAt: 2021-02-12T01:14:04.630483844Z

View File

@ -1,9 +0,0 @@
UID: aqoe63g1hvf4c37t
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T01:14:05Z
UpdatedAt: 2021-02-12T01:14:05Z
DeletedAt: 2021-02-12T01:14:04.683342935Z

View File

@ -1,9 +0,0 @@
UID: aqoe63g1wp37dwns
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T01:14:05Z
UpdatedAt: 2021-02-12T01:14:05Z
DeletedAt: 2021-02-12T01:14:04.720807005Z

View File

@ -1,10 +0,0 @@
UID: aqoe66r266y7x2ct
Slug: testalbum
Type: album
Title: TestAlbum
Description: An updated album description
Order: oldest
Country: zz
CreatedAt: 2021-02-12T01:16:03Z
UpdatedAt: 2021-02-12T01:16:03.089952155Z
DeletedAt: 2021-02-12T01:16:03.103617951Z

View File

@ -1,9 +0,0 @@
UID: aqoe66r304v81itt
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T01:16:03Z
UpdatedAt: 2021-02-12T01:16:03Z
DeletedAt: 2021-02-12T01:16:03.147574525Z

View File

@ -1,9 +0,0 @@
UID: aqoe66r3bjgymp2o
Slug: testalbum
Type: album
Title: TestAlbum
Order: oldest
Country: zz
CreatedAt: 2021-02-12T01:16:03Z
UpdatedAt: 2021-02-12T01:16:03Z
DeletedAt: 2021-02-12T01:16:03.168746489Z

Some files were not shown because too many files have changed in this diff Show More