-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathload_genres.rb
70 lines (61 loc) · 1.64 KB
/
load_genres.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
require "open-uri"
require "nokogiri"
require "json"
require "byebug"
Genre = Struct.new(:name, :uri) do
def id
"genre_" + name.gsub(/[^a-z0-9]/, "_")
end
def synonyms
[
name.gsub("-", " "),
name.gsub(/^nu[- ](\w+)/, 'new \1').gsub("-", " "),
name.gsub(/(?<=[[:alpha:]])(core|folk|gaze|pop|punk|rock)$/, ' \1').gsub("-", " "),
("acapella" if name == "a cappella")
].compact.uniq - [name]
end
def to_js
{
"name" => name,
"uri" => uri
}
end
def to_model
{
"id" => id,
"name" => {
"value" => name,
"synonyms" => synonyms
}
}
end
end
html = open("http://everynoise.com/everynoise1d.cgi?scope=all")
doc = Nokogiri::HTML(html)
rows = doc.css("body > table > tr")
SPOTIFY_ID = /[A-Za-z0-9]{22}/
PLAYLIST_URI = /spotify:user:thesoundsofspotify:playlist:#{SPOTIFY_ID}/
genres = rows.map do |row|
name = row.at("td.note:last").text
link = row.at("a.note")[:href]
uri = link[PLAYLIST_URI]
Genre.new(name, uri)
end.sort_by(&:name)
if genres.size < 2000
raise "Too few genres found (#{genres.size} for #{rows.size} rows)"
end
File.open("genre_playlists.js", "w") do |f|
f << "module.exports = "
f << JSON.pretty_generate(genres.map(&:to_js))
f << ";"
end
model_path = File.join(__dir__, "models/en-US.json")
model = JSON.parse(open(model_path).read)
types = model.fetch("interactionModel").fetch("languageModel").fetch("types")
unless type = types.find { |t| t["name"] == "EVERYNOISE_GENRES" }
types << { "name" => "EVERYNOISE_GENRES" }
end
type["values"] = genres.map(&:to_model)
File.open(model_path, "w") do |f|
f << JSON.pretty_generate(model)
end