using HTTP, JSON url(j, mbid; method = "artist.getsimilar") = "https://ws.audioscrobbler.com/2.0/?method=$method&mbid=$mbid&api_key=$(j["key"])&format=json" lastfm = JSON.parse(read("lastfm.json", String)) function similar(lastfm, mbid::AbstractString) r = HTTP.get(url(lastfm, mbid)).body |> String |> JSON.parse if "error" in keys(r) @warn "error: $(r["error"])" return [] else filter!(!isempty, get.(r["similarartists"]["artist"], "mbid", "")) end end # Example # similar(lastfm, "elis") names = getfield.(Beets.artists(), :name) uuids = getfield.(Beets.artists(), :uuid) similars = similar.(Ref(lastfm), uuids) similar_list = Iterators.flatten(similars) |> collect open("simiar.json", "w") do f; write(f, JSON.json(similar_list)); end filtered = [i for i in similar_list if ! (i in uuids)] u=unique(filtered) d=[(i,count(x->x==i,filtered)) for i in u] best = sort(d, by = x -> x[2], rev = true) ## TODO: decide a cut criterion top = best[1:5] rnd = [rand(best) for _ in 1:5] push!(top, rnd) top = unique(top) todl_artists = let ids = first.(top) Dict("names" => MusicBrainz.name.(ids), "uuids" => ids) end todl = RuTrackers.getdiscography.(Ref(me), todl_artists["names"]) TransmissionRPC.getauth(rpc) [TransmissionRPC.add.(Ref(rpc), RuTrackers.download.(Ref(me), l)) for l in todl]