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 = """ stream $(s.title) download $(s.title) """ push!(list, el) end else push!(list, """ stream download """) end # application/octet-stream return """ $(sh.description) User: $(sh.username) shared $(sh.item.title) with you!
Description: $(sh.description)
Expires: $(sh.expires)
Viewed: $(sh.count) times

$(join(list, "
")) """ 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 )