From a87081746d891f0c441a0493df34860d230cfce7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Balzarotti?= Date: Thu, 22 Aug 2019 10:54:19 +0200 Subject: [PATCH] Search similar artists on lastfm --- similar.jl | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 similar.jl diff --git a/similar.jl b/similar.jl new file mode 100644 index 0000000..6eee0a8 --- /dev/null +++ b/similar.jl @@ -0,0 +1,47 @@ +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]