import Random import Dates mutable struct User name::String password::String email::String # scrobbling::Bool admin::Bool settings::Bool download::Bool upload::Bool cover::Bool playlist::Bool comment::Bool # podcast::Bool stream::Bool # jukebox::Bool share::Bool end # FIXME: add uuid format check abstract type BeetUUID end struct SongUUID <: BeetUUID uuid::String end struct ArtistUUID <: BeetUUID uuid::String end struct AlbumUUID <: BeetUUID uuid::String end struct PlaylistUUID <: BeetUUID uuid::String end convert(::Type{SongUUID}, s::String) = SongUUID(s) convert(::Type{ArtistUUID}, s::String) = ArtistUUID(s) convert(::Type{AlbumUUID}, s::String) = AlbumUUID(s) convert(::Type{PlaylistUUID}, s::String) = PlaylistUUID(s) convert(::Type{String}, s::BeetUUID) = s.uuid import Beets.songbyid songbyid(id::SongUUID) = songbyid(convert(String, id)) mutable struct Playlist uuid::PlaylistUUID name::String comment::String owner::String public::Bool songs::Vector{SongUUID} cover::String allowed::Vector{String} created::Dates.DateTime end function Playlist(owner::String ; uuid = string(UUIDs.uuid4()), name = "New Playlist", comment = "", public = false, songs = SongUUID[], cover = "", allowed = String[], creation = Dates.now()) Playlist(uuid, name, comment, owner, public, songs, cover, allowed, creation) end function User(name::String) User(name, Random.randstring(30), string(name, "@", domain), false, false, false, false, false, false, false, false, false) end mutable struct Rating item::Union{Artist,Album,Song} rating::Int end mutable struct Star item::Union{Artist,Album,Song} starred::Dates.DateTime end mutable struct Share id::UInt32 uuid::String item::BeetUUID username::String description::String created::Dates.DateTime expires::Dates.DateTime lastvisit::Union{Missing,Dates.DateTime} count::Int end function Share(item::BeetUUID, username::AbstractString, description::AbstractString; expires = Dates.now() + Dates.Day(7)) Share(Random.rand(UInt32), Random.randstring(8), item, username, description, # FIXME: do not hardcode Dates.now(), expires, missing, 0) end Share(i::BeetUUID, u::AbstractString, e::Dates.DateTime) = Share(i, u, ""; expires = e) Share(i::BeetUUID, u::AbstractString) = Share(i, u, "")