48 lines
1.3 KiB
Julia
48 lines
1.3 KiB
Julia
|
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]
|