Compare commits
4 Commits
c8b33572da
...
8545e098c1
Author | SHA1 | Date |
---|---|---|
Astra | 8545e098c1 | |
Astra | 137f570aca | |
Astra | 32514d2324 | |
Astra | 055afd90f9 |
|
@ -7,10 +7,7 @@ package api
|
||||||
// Parameters:
|
// Parameters:
|
||||||
// uuid: string PhotoUID as returned by the API
|
// uuid: string PhotoUID as returned by the API
|
||||||
func (v1 *V1Client) GetPhoto(uuid string) (Photo, error) {
|
func (v1 *V1Client) GetPhoto(uuid string) (Photo, error) {
|
||||||
photo := Photo{
|
photo := Photo{}
|
||||||
UUID: uuid,
|
|
||||||
PhotoUID: uuid,
|
|
||||||
}
|
|
||||||
err := v1.GET("/api/v1/photos/%s", uuid).JSON(&photo)
|
err := v1.GET("/api/v1/photos/%s", uuid).JSON(&photo)
|
||||||
return photo, err
|
return photo, err
|
||||||
}
|
}
|
||||||
|
|
475
api/v1/types.go
|
@ -1,7 +1,6 @@
|
||||||
package api
|
package api
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"database/sql"
|
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -9,335 +8,237 @@ type Photos []Photo
|
||||||
|
|
||||||
// Photo represents a photo, all its properties, and link to all its images and sidecar files.
|
// Photo represents a photo, all its properties, and link to all its images and sidecar files.
|
||||||
type Photo struct {
|
type Photo struct {
|
||||||
UUID string `gorm:"type:VARBINARY(42);index;" json:"DocumentID,omitempty" yaml:"DocumentID,omitempty"`
|
PhotoID int `json:"ID,omitempty"`
|
||||||
TakenAt time.Time `gorm:"type:datetime;index:idx_photos_taken_uid;" json:"TakenAt" yaml:"TakenAt"`
|
TakenAt time.Time `json:"TakenAt"`
|
||||||
TakenAtLocal time.Time `gorm:"type:datetime;" yaml:"-"`
|
TakenAtLocal time.Time `json:"TakenAtLocal"`
|
||||||
TakenSrc string `gorm:"type:VARBINARY(8);" json:"TakenSrc" yaml:"TakenSrc,omitempty"`
|
TakenSrc string `json:"TakenSrc"`
|
||||||
PhotoUID string `gorm:"type:VARBINARY(42);unique_index;index:idx_photos_taken_uid;" json:"UID" yaml:"UID"`
|
PhotoUID string `json:"UID"`
|
||||||
PhotoType string `gorm:"type:VARBINARY(8);default:'image';" json:"Type" yaml:"Type"`
|
PhotoType string `json:"Type"`
|
||||||
TypeSrc string `gorm:"type:VARBINARY(8);" json:"TypeSrc" yaml:"TypeSrc,omitempty"`
|
TypeSrc string `json:"TypeSrc"`
|
||||||
PhotoTitle string `gorm:"type:VARCHAR(255);" json:"Title" yaml:"Title"`
|
PhotoTitle string `json:"Title"`
|
||||||
TitleSrc string `gorm:"type:VARBINARY(8);" json:"TitleSrc" yaml:"TitleSrc,omitempty"`
|
TitleSrc string `json:"TitleSrc"`
|
||||||
PhotoDescription string `gorm:"type:TEXT;" json:"Description" yaml:"Description,omitempty"`
|
PhotoDescription string `json:"Description"`
|
||||||
DescriptionSrc string `gorm:"type:VARBINARY(8);" json:"DescriptionSrc" yaml:"DescriptionSrc,omitempty"`
|
DescriptionSrc string `json:"DescriptionSrc"`
|
||||||
PhotoPath string `gorm:"type:VARBINARY(500);index:idx_photos_path_name;" json:"Path" yaml:"-"`
|
PhotoPath string `json:"Path"`
|
||||||
PhotoName string `gorm:"type:VARBINARY(255);index:idx_photos_path_name;" json:"Name" yaml:"-"`
|
PhotoName string `json:"Name"`
|
||||||
OriginalName string `gorm:"type:VARBINARY(755);" json:"OriginalName" yaml:"OriginalName,omitempty"`
|
OriginalName string `json:"OriginalName"`
|
||||||
PhotoStack int8 `json:"Stack" yaml:"Stack,omitempty"`
|
PhotoStack int8 `json:"Stack"`
|
||||||
PhotoFavorite bool `json:"Favorite" yaml:"Favorite,omitempty"`
|
PhotoFavorite bool `json:"Favorite"`
|
||||||
PhotoPrivate bool `json:"Private" yaml:"Private,omitempty"`
|
PhotoPrivate bool `json:"Private"`
|
||||||
PhotoScan bool `json:"Scan" yaml:"Scan,omitempty"`
|
PhotoScan bool `json:"Scan"`
|
||||||
PhotoPanorama bool `json:"Panorama" yaml:"Panorama,omitempty"`
|
PhotoPanorama bool `json:"Panorama"`
|
||||||
TimeZone string `gorm:"type:VARBINARY(64);" json:"TimeZone" yaml:"-"`
|
TimeZone string `json:"TimeZone"`
|
||||||
PlaceID string `gorm:"type:VARBINARY(42);index;default:'zz'" json:"PlaceID" yaml:"-"`
|
PlaceID string `json:"PlaceID"`
|
||||||
PlaceSrc string `gorm:"type:VARBINARY(8);" json:"PlaceSrc" yaml:"PlaceSrc,omitempty"`
|
PlaceSrc string `json:"PlaceSrc"`
|
||||||
CellID string `gorm:"type:VARBINARY(42);index;default:'zz'" json:"CellID" yaml:"-"`
|
CellID string `json:"CellID"`
|
||||||
CellAccuracy int `json:"CellAccuracy" yaml:"CellAccuracy,omitempty"`
|
CellAccuracy int `json:"CellAccuracy"`
|
||||||
PhotoAltitude int `json:"Altitude" yaml:"Altitude,omitempty"`
|
PhotoAltitude int `json:"Altitude"`
|
||||||
PhotoLat float32 `gorm:"type:FLOAT;index;" json:"Lat" yaml:"Lat,omitempty"`
|
PhotoLat float32 `json:"Lat"`
|
||||||
PhotoLng float32 `gorm:"type:FLOAT;index;" json:"Lng" yaml:"Lng,omitempty"`
|
PhotoLng float32 `json:"Lng"`
|
||||||
PhotoCountry string `gorm:"type:VARBINARY(2);index:idx_photos_country_year_month;default:'zz'" json:"Country" yaml:"-"`
|
PhotoCountry string `json:"Country"`
|
||||||
PhotoYear int `gorm:"index:idx_photos_country_year_month;" json:"Year" yaml:"Year"`
|
PhotoYear int `json:"Year"`
|
||||||
PhotoMonth int `gorm:"index:idx_photos_country_year_month;" json:"Month" yaml:"Month"`
|
PhotoMonth int `json:"Month"`
|
||||||
PhotoDay int `json:"Day" yaml:"Day"`
|
PhotoDay int `json:"Day"`
|
||||||
PhotoIso int `json:"Iso" yaml:"ISO,omitempty"`
|
PhotoIso int `json:"Iso"`
|
||||||
PhotoExposure string `gorm:"type:VARBINARY(64);" json:"Exposure" yaml:"Exposure,omitempty"`
|
PhotoExposure string `json:"Exposure"`
|
||||||
PhotoFNumber float32 `gorm:"type:FLOAT;" json:"FNumber" yaml:"FNumber,omitempty"`
|
PhotoFNumber float32 `json:"FNumber"`
|
||||||
PhotoFocalLength int `json:"FocalLength" yaml:"FocalLength,omitempty"`
|
PhotoFocalLength int `json:"FocalLength"`
|
||||||
PhotoQuality int `gorm:"type:SMALLINT" json:"Quality" yaml:"-"`
|
PhotoQuality int `json:"Quality"`
|
||||||
PhotoResolution int `gorm:"type:SMALLINT" json:"Resolution" yaml:"-"`
|
PhotoResolution int `json:"Resolution"`
|
||||||
PhotoColor uint8 `json:"Color" yaml:"-"`
|
PhotoColor uint8 `json:"Color"`
|
||||||
CameraID uint `gorm:"index:idx_photos_camera_lens;default:1" json:"CameraID" yaml:"-"`
|
CameraID uint `json:"CameraID"`
|
||||||
CameraSerial string `gorm:"type:VARBINARY(255);" json:"CameraSerial" yaml:"CameraSerial,omitempty"`
|
CameraSerial string `json:"CameraSerial"`
|
||||||
CameraSrc string `gorm:"type:VARBINARY(8);" json:"CameraSrc" yaml:"-"`
|
CameraSrc string `json:"CameraSrc"`
|
||||||
LensID uint `gorm:"index:idx_photos_camera_lens;default:1" json:"LensID" yaml:"-"`
|
LensID uint `json:"LensID"`
|
||||||
Details *Details `gorm:"association_autoupdate:false;association_autocreate:false;association_save_reference:false" json:"Details" yaml:"Details"`
|
Details *Details `json:"Details"`
|
||||||
Camera *Camera `gorm:"association_autoupdate:false;association_autocreate:false;association_save_reference:false" json:"Camera" yaml:"-"`
|
Camera *Camera `json:"Camera"`
|
||||||
Lens *Lens `gorm:"association_autoupdate:false;association_autocreate:false;association_save_reference:false" json:"Lens" yaml:"-"`
|
Lens *Lens `json:"Lens"`
|
||||||
Cell *Cell `gorm:"association_autoupdate:false;association_autocreate:false;association_save_reference:false" json:"Cell" yaml:"-"`
|
Cell *Cell `json:"Cell"`
|
||||||
Place *Place `gorm:"association_autoupdate:false;association_autocreate:false;association_save_reference:false" json:"Place" yaml:"-"`
|
Place *Place `json:"Place"`
|
||||||
Keywords []Keyword `json:"-" yaml:"-"`
|
Files []File `json:"Files"`
|
||||||
Albums []Album `json:"-" yaml:"-"`
|
Labels []PhotoLabel `json:"Labels"`
|
||||||
Files []File `yaml:"-"`
|
CreatedAt time.Time `json:"CreatedAt"`
|
||||||
Labels []PhotoLabel `yaml:"-"`
|
UpdatedAt time.Time `json:"UpdatedAt"`
|
||||||
CreatedAt time.Time `yaml:"CreatedAt,omitempty"`
|
EditedAt *time.Time `json:"EditedAt"`
|
||||||
UpdatedAt time.Time `yaml:"UpdatedAt,omitempty"`
|
CheckedAt *time.Time `json:"CheckedAt"`
|
||||||
EditedAt *time.Time `yaml:"EditedAt,omitempty"`
|
DeletedAt *time.Time `json:"DeletedAt"`
|
||||||
CheckedAt *time.Time `sql:"index" yaml:"-"`
|
|
||||||
DeletedAt *time.Time `sql:"index" yaml:"DeletedAt,omitempty"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Details stores additional metadata fields for each photo to improve search performance.
|
// Details stores additional metadata fields for each photo to improve search performance.
|
||||||
type Details struct {
|
type Details struct {
|
||||||
PhotoID uint `gorm:"primary_key;auto_increment:false" yaml:"-"`
|
PhotoID uint `json:"PhotoID"`
|
||||||
Keywords string `gorm:"type:TEXT;" json:"Keywords" yaml:"Keywords"`
|
Keywords string `json:"Keywords"`
|
||||||
KeywordsSrc string `gorm:"type:VARBINARY(8);" json:"KeywordsSrc" yaml:"KeywordsSrc,omitempty"`
|
KeywordsSrc string `json:"KeywordsSrc"`
|
||||||
Notes string `gorm:"type:TEXT;" json:"Notes" yaml:"Notes,omitempty"`
|
Notes string `json:"Notes"`
|
||||||
NotesSrc string `gorm:"type:VARBINARY(8);" json:"NotesSrc" yaml:"NotesSrc,omitempty"`
|
NotesSrc string `json:"NotesSrc"`
|
||||||
Subject string `gorm:"type:VARCHAR(255);" json:"Subject" yaml:"Subject,omitempty"`
|
Subject string `json:"Subject"`
|
||||||
SubjectSrc string `gorm:"type:VARBINARY(8);" json:"SubjectSrc" yaml:"SubjectSrc,omitempty"`
|
SubjectSrc string `json:"SubjectSrc"`
|
||||||
Artist string `gorm:"type:VARCHAR(255);" json:"Artist" yaml:"Artist,omitempty"`
|
Artist string `json:"Artist"`
|
||||||
ArtistSrc string `gorm:"type:VARBINARY(8);" json:"ArtistSrc" yaml:"ArtistSrc,omitempty"`
|
ArtistSrc string `json:"ArtistSrc"`
|
||||||
Copyright string `gorm:"type:VARCHAR(255);" json:"Copyright" yaml:"Copyright,omitempty"`
|
Copyright string `json:"Copyright"`
|
||||||
CopyrightSrc string `gorm:"type:VARBINARY(8);" json:"CopyrightSrc" yaml:"CopyrightSrc,omitempty"`
|
CopyrightSrc string `json:"CopyrightSrc"`
|
||||||
License string `gorm:"type:VARCHAR(255);" json:"License" yaml:"License,omitempty"`
|
License string `json:"License"`
|
||||||
LicenseSrc string `gorm:"type:VARBINARY(8);" json:"LicenseSrc" yaml:"LicenseSrc,omitempty"`
|
LicenseSrc string `json:"LicenseSrc"`
|
||||||
CreatedAt time.Time `yaml:"-"`
|
Software string `json:"Software"`
|
||||||
UpdatedAt time.Time `yaml:"-"`
|
SoftwareSrc string `json:"SoftwareSrc"`
|
||||||
|
CreatedAt time.Time `json:"CreatedAt"`
|
||||||
|
UpdatedAt time.Time `json:"UpdatedAt"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Camera model and make (as extracted from UpdateExif metadata)
|
// Camera model and make (as extracted from UpdateExif metadata)
|
||||||
type Camera struct {
|
type Camera struct {
|
||||||
ID uint `gorm:"primary_key" json:"ID" yaml:"ID"`
|
ID uint `json:"ID"`
|
||||||
CameraSlug string `gorm:"type:VARBINARY(255);unique_index;" json:"Slug" yaml:"-"`
|
CameraSlug string `json:"Slug"`
|
||||||
CameraName string `gorm:"type:VARCHAR(255);" json:"Name" yaml:"Name"`
|
CameraName string `json:"Name"`
|
||||||
CameraMake string `gorm:"type:VARCHAR(255);" json:"Make" yaml:"Make,omitempty"`
|
CameraMake string `json:"Make"`
|
||||||
CameraModel string `gorm:"type:VARCHAR(255);" json:"Model" yaml:"Model,omitempty"`
|
CameraModel string `json:"Model"`
|
||||||
CameraType string `gorm:"type:VARCHAR(255);" json:"Type,omitempty" yaml:"Type,omitempty"`
|
CameraType string `json:"Type,omitempty"`
|
||||||
CameraDescription string `gorm:"type:TEXT;" json:"Description,omitempty" yaml:"Description,omitempty"`
|
CameraDescription string `json:"Description,omitempty"`
|
||||||
CameraNotes string `gorm:"type:TEXT;" json:"Notes,omitempty" yaml:"Notes,omitempty"`
|
CameraNotes string `json:"Notes,omitempty"`
|
||||||
CreatedAt time.Time `json:"-" yaml:"-"`
|
|
||||||
UpdatedAt time.Time `json:"-" yaml:"-"`
|
|
||||||
DeletedAt *time.Time `sql:"index" json:"-" yaml:"-"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Lens represents camera lens (as extracted from UpdateExif metadata)
|
// Lens represents camera lens (as extracted from UpdateExif metadata)
|
||||||
type Lens struct {
|
type Lens struct {
|
||||||
ID uint `gorm:"primary_key" json:"ID" yaml:"ID"`
|
ID uint `json:"ID"`
|
||||||
LensSlug string `gorm:"type:VARBINARY(255);unique_index;" json:"Slug" yaml:"Slug,omitempty"`
|
LensSlug string `json:"Slug"`
|
||||||
LensName string `gorm:"type:VARCHAR(255);" json:"Name" yaml:"Name"`
|
LensName string `json:"Name"`
|
||||||
LensMake string `gorm:"type:VARCHAR(255);" json:"Make" yaml:"Make,omitempty"`
|
LensMake string `json:"Make"`
|
||||||
LensModel string `gorm:"type:VARCHAR(255);" json:"Model" yaml:"Model,omitempty"`
|
LensModel string `json:"Model"`
|
||||||
LensType string `gorm:"type:VARCHAR(255);" json:"Type" yaml:"Type,omitempty"`
|
LensType string `json:"Type"`
|
||||||
LensDescription string `gorm:"type:TEXT;" json:"Description,omitempty" yaml:"Description,omitempty"`
|
LensDescription string `json:"Description,omitempty"`
|
||||||
LensNotes string `gorm:"type:TEXT;" json:"Notes,omitempty" yaml:"Notes,omitempty"`
|
LensNotes string `json:"Notes,omitempty"`
|
||||||
CreatedAt time.Time `json:"-" yaml:"-"`
|
|
||||||
UpdatedAt time.Time `json:"-" yaml:"-"`
|
|
||||||
DeletedAt *time.Time `sql:"index" json:"-" yaml:"-"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Cell represents a S2 cell with location data.
|
// Cell represents a S2 cell with location data.
|
||||||
type Cell struct {
|
type Cell struct {
|
||||||
ID string `gorm:"type:VARBINARY(42);primary_key;auto_increment:false;" json:"ID" yaml:"ID"`
|
ID string `json:"ID"`
|
||||||
CellName string `gorm:"type:VARCHAR(255);" json:"Name" yaml:"Name,omitempty"`
|
CellName string `json:"Name"`
|
||||||
CellCategory string `gorm:"type:VARCHAR(64);" json:"Category" yaml:"Category,omitempty"`
|
CellStreet string `json:"Street"`
|
||||||
PlaceID string `gorm:"type:VARBINARY(42);default:'zz'" json:"-" yaml:"PlaceID"`
|
CellPostcode string `json:"Postcode"`
|
||||||
Place *Place `gorm:"PRELOAD:true" json:"Place" yaml:"-"`
|
CellCategory string `json:"Category"`
|
||||||
CreatedAt time.Time `json:"CreatedAt" yaml:"-"`
|
Place *Place `json:"Place"`
|
||||||
UpdatedAt time.Time `json:"UpdatedAt" yaml:"-"`
|
CreatedAt time.Time `json:"CreatedAt"`
|
||||||
|
UpdatedAt time.Time `json:"UpdatedAt"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Place used to associate photos to places
|
// Place used to associate photos to places
|
||||||
type Place struct {
|
type Place struct {
|
||||||
ID string `gorm:"type:VARBINARY(42);primary_key;auto_increment:false;" json:"PlaceID" yaml:"PlaceID"`
|
ID string `json:"PlaceID"`
|
||||||
PlaceLabel string `gorm:"type:VARBINARY(755);unique_index;" json:"Label" yaml:"Label"`
|
PlaceLabel string `json:"Label"`
|
||||||
PlaceCity string `gorm:"type:VARCHAR(255);" json:"City" yaml:"City,omitempty"`
|
PlaceCity string `json:"City"`
|
||||||
PlaceState string `gorm:"type:VARCHAR(255);" json:"State" yaml:"State,omitempty"`
|
PlaceState string `json:"State"`
|
||||||
PlaceCountry string `gorm:"type:VARBINARY(2);" json:"Country" yaml:"Country,omitempty"`
|
PlaceCountry string `json:"Country"`
|
||||||
PlaceKeywords string `gorm:"type:VARCHAR(255);" json:"Keywords" yaml:"Keywords,omitempty"`
|
PlaceKeywords string `json:"Keywords"`
|
||||||
PlaceFavorite bool `json:"Favorite" yaml:"Favorite,omitempty"`
|
PlaceFavorite bool `json:"Favorite"`
|
||||||
PhotoCount int `gorm:"default:1" json:"PhotoCount" yaml:"-"`
|
PhotoCount int `json:"PhotoCount"`
|
||||||
CreatedAt time.Time `json:"CreatedAt" yaml:"-"`
|
CreatedAt time.Time `json:"CreatedAt"`
|
||||||
UpdatedAt time.Time `json:"UpdatedAt" yaml:"-"`
|
UpdatedAt time.Time `json:"UpdatedAt"`
|
||||||
}
|
|
||||||
|
|
||||||
// Keyword used for full text search
|
|
||||||
type Keyword struct {
|
|
||||||
ID uint `gorm:"primary_key"`
|
|
||||||
Keyword string `gorm:"type:VARCHAR(64);index;"`
|
|
||||||
Skip bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Album represents a photo album
|
// Album represents a photo album
|
||||||
type Album struct {
|
type Album struct {
|
||||||
ID uint `gorm:"primary_key" json:"ID" yaml:"-"`
|
ID uint `json:"ID"`
|
||||||
AlbumUID string `gorm:"type:VARBINARY(42);unique_index;" json:"UID" yaml:"UID"`
|
AlbumUID string `json:"UID"`
|
||||||
CoverUID string `gorm:"type:VARBINARY(42);" json:"CoverUID" yaml:"CoverUID,omitempty"`
|
AlbumSlug string `json:"Slug"`
|
||||||
FolderUID string `gorm:"type:VARBINARY(42);index;" json:"FolderUID" yaml:"FolderUID,omitempty"`
|
AlbumType string `json:"Type"`
|
||||||
AlbumSlug string `gorm:"type:VARBINARY(255);index;" json:"Slug" yaml:"Slug"`
|
AlbumTitle string `json:"Title"`
|
||||||
AlbumPath string `gorm:"type:VARBINARY(500);index;" json:"Path" yaml:"-"`
|
AlbumLocation string `json:"Location"`
|
||||||
AlbumType string `gorm:"type:VARBINARY(8);default:'album';" json:"Type" yaml:"Type,omitempty"`
|
AlbumCategory string `json:"Category"`
|
||||||
AlbumTitle string `gorm:"type:VARCHAR(255);" json:"Title" yaml:"Title"`
|
AlbumCaption string `json:"Caption"`
|
||||||
AlbumLocation string `gorm:"type:VARCHAR(255);" json:"Location" yaml:"Location,omitempty"`
|
AlbumDescription string `json:"Description"`
|
||||||
AlbumCategory string `gorm:"type:VARCHAR(255);index;" json:"Category" yaml:"Category,omitempty"`
|
AlbumNotes string `json:"Notes"`
|
||||||
AlbumCaption string `gorm:"type:TEXT;" json:"Caption" yaml:"Caption,omitempty"`
|
AlbumFilter string `json:"Filter"`
|
||||||
AlbumDescription string `gorm:"type:TEXT;" json:"Description" yaml:"Description,omitempty"`
|
AlbumOrder string `json:"Order"`
|
||||||
AlbumNotes string `gorm:"type:TEXT;" json:"Notes" yaml:"Notes,omitempty"`
|
AlbumTemplate string `json:"Template"`
|
||||||
AlbumFilter string `gorm:"type:VARBINARY(1024);" json:"Filter" yaml:"Filter,omitempty"`
|
AlbumCountry string `json:"Country"`
|
||||||
AlbumOrder string `gorm:"type:VARBINARY(32);" json:"Order" yaml:"Order,omitempty"`
|
AlbumYear int `json:"Year"`
|
||||||
AlbumTemplate string `gorm:"type:VARBINARY(255);" json:"Template" yaml:"Template,omitempty"`
|
AlbumMonth int `json:"Month"`
|
||||||
AlbumCountry string `gorm:"type:VARBINARY(2);index:idx_albums_country_year_month;default:'zz'" json:"Country" yaml:"Country,omitempty"`
|
AlbumDay int `json:"Day"`
|
||||||
AlbumYear int `gorm:"index:idx_albums_country_year_month;" json:"Year" yaml:"Year,omitempty"`
|
AlbumFavorite bool `json:"Favorite"`
|
||||||
AlbumMonth int `gorm:"index:idx_albums_country_year_month;" json:"Month" yaml:"Month,omitempty"`
|
AlbumPrivate bool `json:"Private"`
|
||||||
AlbumDay int `json:"Day" yaml:"Day,omitempty"`
|
CreatedAt time.Time `json:"CreatedAt"`
|
||||||
AlbumFavorite bool `json:"Favorite" yaml:"Favorite,omitempty"`
|
UpdatedAt time.Time `json:"UpdatedAt"`
|
||||||
AlbumPrivate bool `json:"Private" yaml:"Private,omitempty"`
|
DeletedAt *time.Time `json:"DeletedAt"`
|
||||||
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"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type PhotoAlbums []PhotoAlbum
|
type PhotoAlbums []PhotoAlbum
|
||||||
|
|
||||||
// PhotoAlbum represents the many_to_many relation between Photo and Album
|
// PhotoAlbum represents the many_to_many relation between Photo and Album
|
||||||
type PhotoAlbum struct {
|
type PhotoAlbum struct {
|
||||||
PhotoUID string `gorm:"type:VARBINARY(42);primary_key;auto_increment:false" json:"PhotoUID" yaml:"UID"`
|
PhotoUID string `json:"PhotoUID"`
|
||||||
AlbumUID string `gorm:"type:VARBINARY(42);primary_key;auto_increment:false;index" json:"AlbumUID" yaml:"-"`
|
AlbumUID string `json:"AlbumUID"`
|
||||||
Order int `json:"Order" yaml:"Order,omitempty"`
|
Order int `json:"Order"`
|
||||||
Hidden bool `json:"Hidden" yaml:"Hidden,omitempty"`
|
Hidden bool `json:"Hidden"`
|
||||||
Missing bool `json:"Missing" yaml:"Missing,omitempty"`
|
Missing bool `json:"Missing"`
|
||||||
CreatedAt time.Time `json:"CreatedAt" yaml:"CreatedAt,omitempty"`
|
CreatedAt time.Time `json:"CreatedAt"`
|
||||||
UpdatedAt time.Time `json:"UpdatedAt" yaml:"-"`
|
UpdatedAt time.Time `json:"UpdatedAt"`
|
||||||
Photo *Photo `gorm:"PRELOAD:false" yaml:"-"`
|
Photo *Photo
|
||||||
Album *Album `gorm:"PRELOAD:true" yaml:"-"`
|
Album *Album
|
||||||
}
|
}
|
||||||
|
|
||||||
type Files []File
|
type Files []File
|
||||||
|
|
||||||
// File represents an image or sidecar file that belongs to a photo.
|
// File represents an image or sidecar file that belongs to a photo.
|
||||||
type File struct {
|
type File struct {
|
||||||
ID uint `gorm:"primary_key" json:"-" yaml:"-"`
|
PhotoUID string `json:"PhotoUID"`
|
||||||
Photo *Photo `json:"-" yaml:"-"`
|
FileUID string `json:"UID"`
|
||||||
PhotoID uint `gorm:"index;" json:"-" yaml:"-"`
|
FileName string `json:"Name"`
|
||||||
PhotoUID string `gorm:"type:VARBINARY(42);index;" json:"PhotoUID" yaml:"PhotoUID"`
|
FileRoot string `json:"Root"`
|
||||||
InstanceID string `gorm:"type:VARBINARY(42);index;" json:"InstanceID,omitempty" yaml:"InstanceID,omitempty"`
|
OriginalName string `json:"OriginalName"`
|
||||||
FileUID string `gorm:"type:VARBINARY(42);unique_index;" json:"UID" yaml:"UID"`
|
FileHash string `json:"Hash"`
|
||||||
FileName string `gorm:"type:VARBINARY(755);unique_index:idx_files_name_root;" json:"Name" yaml:"Name"`
|
FileSize int64 `json:"Size"`
|
||||||
FileRoot string `gorm:"type:VARBINARY(16);default:'/';unique_index:idx_files_name_root;" json:"Root" yaml:"Root,omitempty"`
|
FileCodec string `json:"Codec"`
|
||||||
OriginalName string `gorm:"type:VARBINARY(755);" json:"OriginalName" yaml:"OriginalName,omitempty"`
|
FileType string `json:"Type"`
|
||||||
FileHash string `gorm:"type:VARBINARY(128);index" json:"Hash" yaml:"Hash,omitempty"`
|
FileMime string `json:"Mime"`
|
||||||
FileSize int64 `json:"Size" yaml:"Size,omitempty"`
|
FilePrimary bool `json:"Primary"`
|
||||||
FileCodec string `gorm:"type:VARBINARY(32)" json:"Codec" yaml:"Codec,omitempty"`
|
FileSidecar bool `json:"Sidecar"`
|
||||||
FileType string `gorm:"type:VARBINARY(32)" json:"Type" yaml:"Type,omitempty"`
|
FileMissing bool `json:"Missing"`
|
||||||
FileMime string `gorm:"type:VARBINARY(64)" json:"Mime" yaml:"Mime,omitempty"`
|
FilePortrait bool `json:"Portrait"`
|
||||||
FilePrimary bool `json:"Primary" yaml:"Primary,omitempty"`
|
FileVideo bool `json:"Video"`
|
||||||
FileSidecar bool `json:"Sidecar" yaml:"Sidecar,omitempty"`
|
FileDuration time.Duration `json:"Duration"`
|
||||||
FileMissing bool `json:"Missing" yaml:"Missing,omitempty"`
|
FileWidth int `json:"Width"`
|
||||||
FilePortrait bool `json:"Portrait" yaml:"Portrait,omitempty"`
|
FileHeight int `json:"Height"`
|
||||||
FileVideo bool `json:"Video" yaml:"Video,omitempty"`
|
FileOrientation int `json:"Orientation"`
|
||||||
FileDuration time.Duration `json:"Duration" yaml:"Duration,omitempty"`
|
FileProjection string `json:"Projection,omitempty"`
|
||||||
FileWidth int `json:"Width" yaml:"Width,omitempty"`
|
FileAspectRatio float32 `json:"AspectRatio"`
|
||||||
FileHeight int `json:"Height" yaml:"Height,omitempty"`
|
FileMainColor string `json:"MainColor"`
|
||||||
FileOrientation int `json:"Orientation" yaml:"Orientation,omitempty"`
|
FileColors string `json:"Colors"`
|
||||||
FileProjection string `gorm:"type:VARBINARY(16);" json:"Projection,omitempty" yaml:"Projection,omitempty"`
|
FileLuminance string `json:"Luminance"`
|
||||||
FileAspectRatio float32 `gorm:"type:FLOAT;" json:"AspectRatio" yaml:"AspectRatio,omitempty"`
|
FileDiff uint32 `json:"Diff"`
|
||||||
FileMainColor string `gorm:"type:VARBINARY(16);index;" json:"MainColor" yaml:"MainColor,omitempty"`
|
FileChroma uint8 `json:"Chroma"`
|
||||||
FileColors string `gorm:"type:VARBINARY(9);" json:"Colors" yaml:"Colors,omitempty"`
|
FileError string `json:"Error"`
|
||||||
FileLuminance string `gorm:"type:VARBINARY(9);" json:"Luminance" yaml:"Luminance,omitempty"`
|
ModTime int64 `json:"ModTime"`
|
||||||
FileDiff uint32 `json:"Diff" yaml:"Diff,omitempty"`
|
CreatedAt time.Time `json:"CreatedAt"`
|
||||||
FileChroma uint8 `json:"Chroma" yaml:"Chroma,omitempty"`
|
CreatedIn int64 `json:"CreatedIn"`
|
||||||
FileError string `gorm:"type:VARBINARY(512)" json:"Error" yaml:"Error,omitempty"`
|
UpdatedAt time.Time `json:"UpdatedAt"`
|
||||||
ModTime int64 `json:"ModTime" yaml:"-"`
|
UpdatedIn int64 `json:"UpdatedIn"`
|
||||||
CreatedAt time.Time `json:"CreatedAt" yaml:"-"`
|
DeletedAt *time.Time `json:"DeletedAt,omitempty"`
|
||||||
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
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// PhotoLabel represents the many-to-many relation between Photo and label.
|
// PhotoLabel represents the many-to-many relation between Photo and label.
|
||||||
// Labels are weighted by uncertainty (100 - confidence)
|
// Labels are weighted by uncertainty (100 - confidence)
|
||||||
type PhotoLabel struct {
|
type PhotoLabel struct {
|
||||||
PhotoID uint `gorm:"primary_key;auto_increment:false"`
|
PhotoID uint `json:"PhotoID"`
|
||||||
LabelID uint `gorm:"primary_key;auto_increment:false;index"`
|
LabelID uint `json:"LabelID"`
|
||||||
LabelSrc string `gorm:"type:VARBINARY(8);"`
|
LabelSrc string `json:"LabelSrc""`
|
||||||
Uncertainty int `gorm:"type:SMALLINT"`
|
Uncertainty int `json:"Uncertainty"`
|
||||||
Photo *Photo `gorm:"PRELOAD:false"`
|
Photo *Photo `json:"Photo"`
|
||||||
Label *Label `gorm:"PRELOAD:true"`
|
Label *Label `json:"Label"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// Label is used for photo, album and location categorization
|
// Label is used for photo, album and location categorization
|
||||||
type Label struct {
|
type Label struct {
|
||||||
ID uint `gorm:"primary_key" json:"ID" yaml:"-"`
|
ID uint `json:"ID"`
|
||||||
LabelUID string `gorm:"type:VARBINARY(42);unique_index;" json:"UID" yaml:"UID"`
|
LabelUID string `json:"UID"`
|
||||||
LabelSlug string `gorm:"type:VARBINARY(255);unique_index;" json:"Slug" yaml:"-"`
|
LabelSlug string `json:"Slug"`
|
||||||
CustomSlug string `gorm:"type:VARBINARY(255);index;" json:"CustomSlug" yaml:"-"`
|
CustomSlug string `json:"CustomSlug"`
|
||||||
LabelName string `gorm:"type:VARCHAR(255);" json:"Name" yaml:"Name"`
|
LabelName string `json:"Name"`
|
||||||
LabelPriority int `json:"Priority" yaml:"Priority,omitempty"`
|
LabelPriority int `json:"Priority"`
|
||||||
LabelFavorite bool `json:"Favorite" yaml:"Favorite,omitempty"`
|
LabelFavorite bool `json:"Favorite"`
|
||||||
LabelDescription string `gorm:"type:TEXT;" json:"Description" yaml:"Description,omitempty"`
|
LabelDescription string `json:"Description"`
|
||||||
LabelNotes string `gorm:"type:TEXT;" json:"Notes" yaml:"Notes,omitempty"`
|
LabelNotes string `json:"Notes"`
|
||||||
LabelCategories []*Label `gorm:"many2many:categories;association_jointable_foreignkey:category_id" json:"-" yaml:"-"`
|
PhotoCount int `json:"PhotoCount"`
|
||||||
PhotoCount int `gorm:"default:1" json:"PhotoCount" yaml:"-"`
|
LabelThumb string `json:"Thumb"`
|
||||||
CreatedAt time.Time `json:"CreatedAt" yaml:"-"`
|
CreatedAt time.Time `json:"CreatedAt"`
|
||||||
UpdatedAt time.Time `json:"UpdatedAt" yaml:"-"`
|
UpdatedAt time.Time `json:"UpdatedAt"`
|
||||||
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"`
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@ import (
|
||||||
"net/url"
|
"net/url"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
v1 "github.com/astravexton/photoprism-client-go/api/v1"
|
v1 "git.zio.sh/astra/photoprism-client-go/api/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
ignore_*
|
|
|
@ -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.
|
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
|
### 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.
|
Run the examples. Make sure to pass both the file you wish to run, as well as `common.go` to include the convenience functions.
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
photoprism "git.zio.sh/astra/photoprism-client-go"
|
||||||
|
"git.zio.sh/astra/photoprism-client-go/api/v1"
|
||||||
"github.com/astravexton/logger"
|
"github.com/astravexton/logger"
|
||||||
photoprism "github.com/astravexton/photoprism-client-go"
|
|
||||||
"github.com/astravexton/photoprism-client-go/api/v1"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|
|
@ -4,7 +4,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
photoprism "github.com/astravexton/photoprism-client-go"
|
photoprism "git.zio.sh/astra/photoprism-client-go"
|
||||||
|
|
||||||
"github.com/astravexton/logger"
|
"github.com/astravexton/logger"
|
||||||
)
|
)
|
||||||
|
|
|
@ -3,8 +3,8 @@ package main
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
|
photoprism "git.zio.sh/astra/photoprism-client-go"
|
||||||
"github.com/astravexton/logger"
|
"github.com/astravexton/logger"
|
||||||
photoprism "github.com/astravexton/photoprism-client-go"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
photoprism "git.zio.sh/astra/photoprism-client-go"
|
||||||
"github.com/astravexton/logger"
|
"github.com/astravexton/logger"
|
||||||
photoprism "github.com/astravexton/photoprism-client-go"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|
|
@ -5,8 +5,8 @@ import (
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"path"
|
"path"
|
||||||
|
|
||||||
|
photoprism "git.zio.sh/astra/photoprism-client-go"
|
||||||
"github.com/astravexton/logger"
|
"github.com/astravexton/logger"
|
||||||
photoprism "github.com/astravexton/photoprism-client-go"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|
9
go.mod
|
@ -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 (
|
require github.com/astravexton/logger v0.2.2-0.20211216142523-c1e08a465709 // indirect
|
||||||
github.com/astravexton/logger v0.2.1
|
|
||||||
github.com/kris-nova/logger v0.2.1
|
|
||||||
)
|
|
||||||
|
|
12
go.sum
|
@ -1,4 +1,8 @@
|
||||||
github.com/astravexton/logger v0.2.1 h1:nYxhV6oCHIJzUzaPhawbAc51EEvJowIViVsB5EbdeJQ=
|
github.com/astravexton/logger v0.2.2-0.20211216142523-c1e08a465709 h1:S+dBCax7wdg3ikWx5t6cClPKQIerrmD404qAzWhO2V4=
|
||||||
github.com/astravexton/logger v0.2.1/go.mod h1:6uxVhLlWlvZn48W8F52dsMXt4yztlrInpRhdWiJ9RXc=
|
github.com/astravexton/logger v0.2.2-0.20211216142523-c1e08a465709/go.mod h1:6BlG5E0U3CImXLmDtGpEwdoc8PHiiDv0kbvJBCbfiMY=
|
||||||
github.com/kris-nova/logger v0.2.1 h1:hbZusgXXXTSd0rNAMBBe/8lhjxXkqWs0+nzjwewCI+E=
|
github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
|
||||||
github.com/kris-nova/logger v0.2.1/go.mod h1:++9BgZujZd4v0ZTZCb5iPsaomXdZWyxotIAh1IiDm44=
|
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=
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
# Internal
|
|
||||||
|
|
||||||
This directory is used to store backend code while developing.
|
|
||||||
|
|
||||||
This directory should NEVER contain SDK code.
|
|
||||||
|
|
|
@ -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
|
|
||||||
```
|
|
|
@ -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
|
|
||||||
}
|
|
|
@ -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
|
|
||||||
}
|
|
|
@ -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
|
|
||||||
|
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
####################################
|
|
||||||
#####
|
|
||||||
###
|
|
||||||
##
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# Startup Script for the Application
|
|
||||||
####################################
|
|
||||||
echo "Destroying [SampleApp]"
|
|
||||||
docker stop photoprism
|
|
||||||
docker rm photoprism
|
|
||||||
|
|
Before Width: | Height: | Size: 592 KiB |
Before Width: | Height: | Size: 114 KiB |
Before Width: | Height: | Size: 380 KiB |
Before Width: | Height: | Size: 134 KiB |
Before Width: | Height: | Size: 380 KiB |
Before Width: | Height: | Size: 592 KiB |
Before Width: | Height: | Size: 114 KiB |
Before Width: | Height: | Size: 134 KiB |
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|