JlSonic/JlSonic/types.jl

114 lines
2.7 KiB
Julia

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, "")