163 lines
5.7 KiB
Julia
163 lines
5.7 KiB
Julia
function restpath!(target, req)
|
|
# @show req[:path]
|
|
length(req[:path]) < 2 && return false
|
|
return req[:path][1] == "rest" &&
|
|
startswith(req[:path][2], target)
|
|
end
|
|
restp(p, app...) = branch(req -> restpath!(p, req), app...)
|
|
|
|
function share!(req)
|
|
return (length(req[:path]) == 2) &&
|
|
(req[:path][1] == "share")
|
|
end
|
|
share(app...) = branch(req -> share!(req), app...)
|
|
|
|
function torrentdl(query::AbstractString)
|
|
global rpc, me
|
|
TransmissionRPC.getauth(rpc)
|
|
todl = RuTrackers.getdiscography(me, query)
|
|
TransmissionRPC.add.(Ref(rpc), RuTrackers.download.(Ref(me), todl))
|
|
todl
|
|
end
|
|
|
|
function albumdl(query::AbstractString)
|
|
global rpc, me
|
|
TransmissionRPC.getauth(rpc)
|
|
todl = RuTrackers.search(me, query)
|
|
# @show todl
|
|
lossless = RuTrackers.islossless.(todl)
|
|
discog = RuTrackers.isdiscography.(todl)
|
|
m = findfirst(lossless .& .!discog)
|
|
m === nothing && return
|
|
TransmissionRPC.add(rpc, RuTrackers.download(me, todl[m]))
|
|
end
|
|
|
|
function showshare(req)
|
|
notfound = Dict(:status => 404, :body => "Not found")
|
|
length(req[:path]) != 2 && return notfound
|
|
el = findfirst(x -> x.uuid == req[:path][2],
|
|
JlSonic.shared)
|
|
el == nothing && return notfound
|
|
sh = JlSonic.shared[el]
|
|
if JlSonic.expired(JlSonic.shared[el])
|
|
deleteat!(JlSonic.shared, el)
|
|
return notfound
|
|
end
|
|
sh.lastvisit = Dates.now()
|
|
query = split(req[:query], '/')
|
|
if query[1] == "dl"
|
|
sh.count += 1
|
|
if isa(sh.item, Beets.Song)
|
|
return JlSonic.sendfile(sh.item.path)
|
|
else
|
|
if length(query) == 2
|
|
el = parse(Int, query[2])
|
|
if 0 < el <= length(sh.item.songs)
|
|
return JlSonic.sendfile(sh.item.songs[el].path)
|
|
end
|
|
return JlSonic.upgrade_server("Not found")
|
|
else
|
|
return JlSonic.upgrade_server("Wrong request?")
|
|
end
|
|
end
|
|
elseif query[1] == "stream"
|
|
sh.count += 1
|
|
if isa(sh.item, Beets.Song)
|
|
return JlSonic.giveconverted(sh.item.path, 192, "oga"; stream = true)
|
|
else
|
|
if length(query) == 2
|
|
el = parse(Int, query[2])
|
|
if 0 < el <= length(sh.item.songs)
|
|
return JlSonic.giveconverted(sh.item.songs[el].path, 192, "oga"; stream = true)
|
|
end
|
|
return JlSonic.upgrade_server("Not found")
|
|
else
|
|
return JlSonic.upgrade_server("Not implemented")
|
|
end
|
|
end
|
|
end
|
|
list = []
|
|
if isa(sh.item, Beets.Album)
|
|
push!(list, "It's an Album, here's the song list:")
|
|
for (n, s) in enumerate(sh.item.songs)
|
|
el = """
|
|
<a href="./$(sh.uuid)?stream/$n">stream $(s.title)</a>
|
|
<a href="./$(sh.uuid)?dl/$n" download="$(s.title).flac">download $(s.title)</a>
|
|
"""
|
|
push!(list, el)
|
|
end
|
|
else
|
|
push!(list, """
|
|
<a href="./$(sh.uuid)?stream">stream</a>
|
|
<a href="./$(sh.uuid)?dl" download="$(sh.item.title).flac">download</a>
|
|
""")
|
|
end
|
|
# application/octet-stream
|
|
return """
|
|
<html>
|
|
<head>
|
|
<title>$(sh.description)</title>
|
|
</head>
|
|
User: $(sh.username) shared <b>$(sh.item.title)</b> with you!<br/>
|
|
Description: $(sh.description)<br/>
|
|
Expires: $(sh.expires)<br/>
|
|
Viewed: $(sh.count) times<br/>
|
|
<br/>
|
|
$(join(list, "<br/>"))
|
|
</html>
|
|
"""
|
|
end
|
|
|
|
config = JlSonic.config_create(disk_cache_size = 5 * 1024 * 1024,
|
|
memory_cache_size = 5 * 1024 * 1024)
|
|
|
|
dispatch = stack(
|
|
# Browsing
|
|
restp("getMusicFolders", _ -> getMusicFolders()),
|
|
restp("getMusicDirectory", req -> getMusicDirectory(req)),
|
|
restp("getAlbumList2", req -> getAlbumList2(req)),
|
|
restp("getAlbumList", req -> getAlbumList(req)),
|
|
restp("getGenres", _ -> getGenres()),
|
|
restp("getArtists", _ -> getArtists()),
|
|
restp("getArtist", r -> getArtist(r)),
|
|
restp("getAlbum", req -> getAlbum(req)),
|
|
restp("getSong", req -> getSong(req)),
|
|
restp("getLyrics", req -> getLyrics(req)),
|
|
restp("getShares", req -> getShares(req)),
|
|
restp("createShare", req -> createShare(req)),
|
|
restp("updateShare", req -> updateShare(req)),
|
|
restp("deleteShare", req -> deleteShare(req)),
|
|
# Album/song list
|
|
restp("getRandomSongs", req -> getRandomSongs(req)),
|
|
restp("getStarred2", req -> getStarred2(req)),
|
|
restp("getStarred", req -> getStarred(req)),
|
|
restp("scrobble", req -> scrobble(req)),
|
|
restp("savePlayQueue", req -> savePlayQueue(req)),
|
|
restp("getPlayQueue", req -> getPlayQueue(req)),
|
|
restp("star", req -> star(req)),
|
|
restp("unstar", req -> unstar(req)),
|
|
restp("setRating", req -> setRating(req)),
|
|
# Searching
|
|
restp("search3", req -> search3(req;
|
|
dlalbum = albumdl,
|
|
dlall = torrentdl)),
|
|
restp("search", req -> search3(req;
|
|
dlalbum = albumdl,
|
|
dlall = torrentdl)),
|
|
# Playlists
|
|
restp("createPlaylist", req -> createPlaylist(req)),
|
|
restp("getPlaylists", req -> getPlaylists(req)),
|
|
restp("getPlaylist", req -> getPlaylist(req)),
|
|
restp("updatePlaylist", req -> updatePlaylist(req)),
|
|
restp("deletePlaylist", req -> deletePlaylist(req)),
|
|
# User management
|
|
restp("getUsers", req -> getUsers(req)),
|
|
restp("getUser", req -> getUser(req)),
|
|
restp("updateUser", req -> updateUser(req)),
|
|
# Media retrieval
|
|
restp("stream", req -> stream(req)),
|
|
restp("getCoverArt", req -> getCoverArt(req, config)),
|
|
# Media library scanning (can be used to check download status!)
|
|
# getScanStatus startScan
|
|
)
|