music_metadata_score 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,330 +1,332 @@
1
- class TitleCase
2
- # Split string
3
- # Capitalize all
4
- # Find list of words
5
- # If they're not first or last, or have a bracket on the beginning or end make em lower case
6
-
7
- def self.featuring_words
8
- [
9
- ' Featuring',
10
- 'Feat ',
11
- ' Feat.',
12
- ' With '
13
-
14
- ]
15
- end
16
-
17
- def self.title_case(string)
18
- if string.is_a?(String)
19
- string = TitleCase.add_spacing_to_punctuation(string)
20
- array = TitleCase.lower_case_array(TitleCase.titleize_array(TitleCase.split_string(string.downcase)))
21
- new_string = TitleCase.capitalize_artist_the(array.join(' '))
22
- return TitleCase.capitalize_anomalies(new_string)
23
- else
24
- ""
1
+ module MusicMetadataScore
2
+ class TitleCase
3
+ # Split string
4
+ # Capitalize all
5
+ # Find list of words
6
+ # If they're not first or last, or have a bracket on the beginning or end make em lower case
7
+
8
+ def self.featuring_words
9
+ [
10
+ ' Featuring',
11
+ 'Feat ',
12
+ ' Feat.',
13
+ ' With '
14
+
15
+ ]
25
16
  end
26
- end
27
-
28
- # Add spaces after any punctuation if it doesn't already exist
29
- def self.add_spacing_to_punctuation(string)
30
- newstring = ""
31
- string.split('').each_with_index do |letter, i|
32
- newstring += ' ' if TitleCase.add_space_before?(string, letter, i)
33
- newstring += letter
34
- newstring += ' ' if TitleCase.add_space_after?(string, letter, i)
17
+
18
+ def self.title_case(string)
19
+ if string.is_a?(String)
20
+ string = MusicMetadataScore::TitleCase.add_spacing_to_punctuation(string)
21
+ array = MusicMetadataScore::TitleCase.lower_case_array(MusicMetadataScore::TitleCase.titleize_array(MusicMetadataScore::TitleCase.split_string(string.downcase)))
22
+ new_string = MusicMetadataScore::TitleCase.capitalize_artist_the(array.join(' '))
23
+ return MusicMetadataScore::TitleCase.capitalize_anomalies(new_string)
24
+ else
25
+ ""
26
+ end
35
27
  end
36
- return newstring
37
- end
38
-
39
- def self.add_space_after?(string, letter, i)
40
- if letter =~ /[,.)]/ && string[i + 1] != ' '
41
- true
42
- elsif letter == '"'
43
- if string[i - 1] =~ /[[:alpha:]]/ && string[i + 1] != ' '
28
+
29
+ # Add spaces after any punctuation if it doesn't already exist
30
+ def self.add_spacing_to_punctuation(string)
31
+ newstring = ""
32
+ string.split('').each_with_index do |letter, i|
33
+ newstring += ' ' if MusicMetadataScore::TitleCase.add_space_before?(string, letter, i)
34
+ newstring += letter
35
+ newstring += ' ' if MusicMetadataScore::TitleCase.add_space_after?(string, letter, i)
36
+ end
37
+ return newstring
38
+ end
39
+
40
+ def self.add_space_after?(string, letter, i)
41
+ if letter =~ /[,.)]/ && string[i + 1] != ' '
44
42
  true
43
+ elsif letter == '"'
44
+ if string[i - 1] =~ /[[:alpha:]]/ && string[i + 1] != ' '
45
+ true
46
+ end
47
+ else
48
+ false
45
49
  end
46
- else
47
- false
48
50
  end
49
- end
50
-
51
- def self.add_space_before?(string, letter, i)
52
- if letter =~ /[(]/ && string[i - 1] != ' '
53
- true
54
- else
55
- false
51
+
52
+ def self.add_space_before?(string, letter, i)
53
+ if letter =~ /[(]/ && string[i - 1] != ' '
54
+ true
55
+ else
56
+ false
57
+ end
56
58
  end
57
- end
58
-
59
- # String to Array
60
- def self.split_string(string)
61
- if string && string.is_a?(String)
62
- string.split(' ')
63
- else
64
- []
59
+
60
+ # String to Array
61
+ def self.split_string(string)
62
+ if string && string.is_a?(String)
63
+ string.split(' ')
64
+ else
65
+ []
66
+ end
65
67
  end
66
- end
67
-
68
- # Capitalize all first letters
69
- def self.titleize_array(array)
70
- array.each do |a|
71
- a = TitleCase.titleize(a)
68
+
69
+ # Capitalize all first letters
70
+ def self.titleize_array(array)
71
+ array.each do |a|
72
+ a = MusicMetadataScore::TitleCase.titleize(a)
73
+ end
74
+ return array
72
75
  end
73
- return array
74
- end
75
-
76
- def self.titleize(string)
77
- if string[0] =~ /[[:alpha:]]/
78
- string.capitalize!
79
- elsif string.length > 1 && !string.include?('feat.')
80
- string[1] = string[1].capitalize
76
+
77
+ def self.titleize(string)
78
+ if string[0] =~ /[[:alpha:]]/
79
+ string.capitalize!
80
+ elsif string.length > 1 && !string.include?('feat.')
81
+ string[1] = string[1].capitalize
82
+ end
83
+ return string
81
84
  end
82
- return string
83
- end
84
-
85
- # Pick words for lower case
86
- def self.lower_case_array(array)
87
- array.each do |a|
88
- if a != array.first && a != array.last
89
- a = TitleCase.lower_case_string(a)
85
+
86
+ # Pick words for lower case
87
+ def self.lower_case_array(array)
88
+ array.each do |a|
89
+ if a != array.first && a != array.last
90
+ a = MusicMetadataScore::TitleCase.lower_case_string(a)
91
+ end
90
92
  end
93
+ return array
91
94
  end
92
- return array
93
- end
94
-
95
- def self.lower_case_string(string)
96
- #a, an, and, as, at, but, by, for, from, in, into, nor, of, off, on, onto, or, out, over, so, the, to, up, with and yet
97
- words = ["a", "an", "and", "as", "at", "but", "by", "for", "from", "in", "into", "nor", "of", "off", "on", "onto", "or", "out", "over", "so", "the", "to", "up", "with", "yet"]
98
- if words.include?(string.downcase)
99
- string.downcase!
100
- else
101
- string
95
+
96
+ def self.lower_case_string(string)
97
+ #a, an, and, as, at, but, by, for, from, in, into, nor, of, off, on, onto, or, out, over, so, the, to, up, with and yet
98
+ words = ["a", "an", "and", "as", "at", "but", "by", "for", "from", "in", "into", "nor", "of", "off", "on", "onto", "or", "out", "over", "so", "the", "to", "up", "with", "yet"]
99
+ if words.include?(string.downcase)
100
+ string.downcase!
101
+ else
102
+ string
103
+ end
102
104
  end
103
- end
104
-
105
- # Includes Featuring Artistst
106
- def self.is_proper_title_format?(title, primary_artists, featuring_artists)
107
- if MusicMetadataScore.is_title_case?(title) && TitleCase.includes_proper_featuring_artists?(title, featuring_artists) && !TitleCase.includes_version?(title) && !TitleCase.improper_abbreviations?(title)
108
- true
109
- else
110
- false
105
+
106
+ # Includes Featuring artistst
107
+ def self.is_proper_title_format?(title, primary_artists, featuring_artists)
108
+ if MusicMetadataScore.is_title_case?(title) && MusicMetadataScore::TitleCase.includes_proper_featuring_artists?(title, featuring_artists) && !MusicMetadataScore::TitleCase.includes_version?(title) && !MusicMetadataScore::TitleCase.improper_abbreviations?(title)
109
+ true
110
+ else
111
+ false
112
+ end
111
113
  end
112
- end
113
-
114
- def self.includes_proper_featuring_artists?(title, featuring_artists)
115
- count = featuring_artists.count rescue 0
116
- if count > 0
117
- TitleCase.is_proper_featuring_artists?(title, featuring_artists)
118
- else
119
- true
114
+
115
+ def self.includes_proper_featuring_artists?(title, featuring_artists)
116
+ count = featuring_artists.count rescue 0
117
+ if count > 0
118
+ MusicMetadataScore::TitleCase.is_proper_featuring_artists?(title, featuring_artists)
119
+ else
120
+ true
121
+ end
120
122
  end
121
- end
122
-
123
- def self.includes_featuring_artists?(title, featuring_artists)
124
- value = false
125
- featuring_artists.each do |a|
126
- if title.include?(a)
127
- value = true
128
- break
123
+
124
+ def self.includes_featuring_artists?(title, featuring_artists)
125
+ value = false
126
+ featuring_artists.each do |a|
127
+ if title.include?(a)
128
+ value = true
129
+ break
130
+ end
129
131
  end
132
+ value
130
133
  end
131
- value
132
- end
133
-
134
- def self.is_proper_featuring_artists?(title, featuring_artists)
135
- if title.include?(TitleCase.featuring_artists_string(featuring_artists, "feat.")) || title.include?(TitleCase.featuring_artists_string(featuring_artists, "with")) || title.include?(TitleCase.featuring_artists_string(featuring_artists, "vs.")) || title.include?(TitleCase.featuring_artists_string(featuring_artists, "Meets"))
136
- true
137
- else
138
- false
134
+
135
+ def self.is_proper_featuring_artists?(title, featuring_artists)
136
+ if title.include?(MusicMetadataScore::TitleCase.featuring_artists_string(featuring_artists, "feat.")) || title.include?(MusicMetadataScore::TitleCase.featuring_artists_string(featuring_artists, "with")) || title.include?(MusicMetadataScore::TitleCase.featuring_artists_string(featuring_artists, "vs.")) || title.include?(MusicMetadataScore::TitleCase.featuring_artists_string(featuring_artists, "Meets"))
137
+ true
138
+ else
139
+ false
140
+ end
139
141
  end
140
- end
141
-
142
- def self.featuring_artists_string(featuring_artists, type)
143
- string = ""
144
- if featuring_artists.count > 0
145
- string = " (#{type} " if type != 'vs.'
146
- string = TitleCase.add_artists_to_string(string, featuring_artists, type)
147
- string += ")"
142
+
143
+ def self.featuring_artists_string(featuring_artists, type)
144
+ string = ""
145
+ if featuring_artists.count > 0
146
+ string = " (#{type} " if type != 'vs.'
147
+ string = MusicMetadataScore::TitleCase.add_artists_to_string(string, featuring_artists, type)
148
+ string += ")"
149
+ end
150
+ return string
148
151
  end
149
- return string
150
- end
151
-
152
- def self.add_artists_to_string(string, featuring_artists, type)
153
- featuring_artists.each do |a|
154
- string += a
155
- string += TitleCase.featuring_artists_join(featuring_artists, a, type)
152
+
153
+ def self.add_artists_to_string(string, featuring_artists, type)
154
+ featuring_artists.each do |a|
155
+ string += a
156
+ string += MusicMetadataScore::TitleCase.featuring_artists_join(featuring_artists, a, type)
157
+ end
158
+ return string
156
159
  end
157
- return string
158
- end
159
-
160
- def self.featuring_artists_join(featuring_artists, a, type)
161
- if featuring_artists.count == 1 || a == featuring_artists.last
162
- ""
163
- elsif featuring_artists.index(a) == featuring_artists.count - 2 && type != "vs."
164
- " & "
165
- elsif type == "vs."
166
- " vs. "
167
- elsif type == "Meets"
168
- " Meets "
169
- else
170
- ", "
160
+
161
+ def self.featuring_artists_join(featuring_artists, a, type)
162
+ if featuring_artists.count == 1 || a == featuring_artists.last
163
+ ""
164
+ elsif featuring_artists.index(a) == featuring_artists.count - 2 && type != "vs."
165
+ " & "
166
+ elsif type == "vs."
167
+ " vs. "
168
+ elsif type == "Meets"
169
+ " Meets "
170
+ else
171
+ ", "
172
+ end
171
173
  end
172
- end
173
-
174
- def self.combined_artists(primary_artists, featuring_artists)
175
- featuring_artists.each do |a|
176
- primary_artists << a
174
+
175
+ def self.combined_artists(primary_artists, featuring_artists)
176
+ featuring_artists.each do |a|
177
+ primary_artists << a
178
+ end
179
+ primary_artists
177
180
  end
178
- primary_artists
179
- end
180
-
181
- # Includes a Version
182
- def self.includes_version?(title)
183
- if title.downcase.include?('version') || title.downcase.include?('edition') || title.downcase.include?('issue') || title.downcase.include?('print') || title.downcase.include?('anniversary')
184
- true
185
- else
186
- false
181
+
182
+ # Includes a Version
183
+ def self.includes_version?(title)
184
+ if title.downcase.include?('version') || title.downcase.include?('edition') || title.downcase.include?('issue') || title.downcase.include?('print') || title.downcase.include?('anniversary') || title.downcase.include?('remix')
185
+ true
186
+ else
187
+ false
188
+ end
187
189
  end
188
- end
189
-
190
- # Check for abbreviations
191
- def self.improper_abbreviations?(title)
192
- # TODO find pt. and vol. not formatted properly
193
- if title.downcase.include?(' part') || title.downcase.include?(' volume') || title.downcase.include?(' number') || title.downcase.include?(' aka') || title.downcase.include?(' d.j') || title.downcase.include?(' num')
194
- true
195
- else
196
- false
190
+
191
+ # Check for abbreviations
192
+ def self.improper_abbreviations?(title)
193
+ # TODO find pt. and vol. not formatted properly
194
+ if title.downcase.include?(' part') || title.downcase.include?(' volume') || title.downcase.include?(' number') || title.downcase.include?(' aka') || title.downcase.include?(' d.j') || title.downcase.include?(' num')
195
+ true
196
+ else
197
+ false
198
+ end
197
199
  end
198
- end
199
-
200
- def self.replace_improper_abbreviations(title)
201
- title.gsub!(" part", " Pt.")
202
- title.gsub!(" volume", " Vol.")
203
- title.gsub!(" number", " No.")
204
- title.gsub!(" no ", " No. ")
205
- title.gsub!(" num ", " No. ")
206
- title.gsub!(" d.j", " DJ")
207
- title.gsub!(" d.j.", " DJ")
208
- title.gsub!(" aka", " a.k.a")
209
- title.gsub!(" AKA", " a.k.a")
210
- title.gsub!("featuring", "feat.")
211
- title.gsub!("(feat ", "(feat. ")
212
- title.gsub!(" feat ", " feat. ")
213
- title.gsub!(" vs ", " Vs. ")
214
- title.gsub!(" VS ", " Vs. ")
215
-
216
- return title
217
- end
218
-
219
- # Capitalize The's in Artist Names
220
- def self.capitalize_artist_the(title)
221
- if title[0] != '(' && title.include?('(')
222
- split_title = title.split('(')
223
- inside_bracket = split_title[1].split(')')
224
- new_inside_bracket = inside_bracket[0].gsub('the', 'The')
225
- string = split_title[0] + "(" + new_inside_bracket + ")"
226
- string += inside_bracket[1] if inside_bracket[1]
227
- return string
228
- else
200
+
201
+ def self.replace_improper_abbreviations(title)
202
+ title.gsub!(" part", " Pt.")
203
+ title.gsub!(" volume", " Vol.")
204
+ title.gsub!(" number", " No.")
205
+ title.gsub!(" no ", " No. ")
206
+ title.gsub!(" num ", " No. ")
207
+ title.gsub!(" d.j", " DJ")
208
+ title.gsub!(" d.j.", " DJ")
209
+ title.gsub!(" aka", " a.k.a")
210
+ title.gsub!(" AKA", " a.k.a")
211
+ title.gsub!("featuring", "feat.")
212
+ title.gsub!("(feat ", "(feat. ")
213
+ title.gsub!(" feat ", " feat. ")
214
+ title.gsub!(" vs ", " Vs. ")
215
+ title.gsub!(" VS ", " Vs. ")
216
+
229
217
  return title
230
218
  end
231
- end
232
-
233
- # Capitalize any anomalies, like DJ
234
- def self.capitalize_anomalies(title)
235
- title.gsub('Dj ', 'DJ ')
236
- end
237
-
238
- # Get Value Inside Brackets
239
- def self.get_inside_brackets(string)
240
- if string.include?('(') && string.include?(')')
241
- split_string = string.split('(')
242
- array = []
243
- split_string.each do |s|
244
- stripped = s.strip
245
- if stripped[stripped.length - 1] == ')'
246
- array << stripped[0..stripped.length - 2]
219
+
220
+ # Capitalize The's in MusicMetadataScore::Artist Names
221
+ def self.capitalize_artist_the(title)
222
+ if title[0] != '(' && title.include?('(')
223
+ split_title = title.split('(')
224
+ inside_bracket = split_title[1].split(')')
225
+ new_inside_bracket = inside_bracket[0].gsub('the', 'The')
226
+ string = split_title[0] + "(" + new_inside_bracket + ")"
227
+ string += inside_bracket[1] if inside_bracket[1]
228
+ return string
229
+ else
230
+ return title
231
+ end
232
+ end
233
+
234
+ # Capitalize any anomalies, like DJ
235
+ def self.capitalize_anomalies(title)
236
+ title.gsub('Dj ', 'DJ ')
237
+ end
238
+
239
+ # Get Value Inside Brackets
240
+ def self.get_inside_brackets(string)
241
+ if string.include?('(') && string.include?(')')
242
+ split_string = string.split('(')
243
+ array = []
244
+ split_string.each do |s|
245
+ stripped = s.strip
246
+ if stripped[stripped.length - 1] == ')'
247
+ array << stripped[0..stripped.length - 2]
248
+ end
247
249
  end
250
+ array
248
251
  end
249
- array
250
252
  end
251
- end
252
-
253
- # Build proper title
254
- def self.build_proper_title(title, version, primary_artists, featuring_artists)
255
- # Title Case
256
- title = TitleCase.title_case(title)
257
- # find any versions
258
- split_out_version = TitleCase.strip_version_from_title(title, version)
259
- # reformat featuring artists
260
- title = TitleCase.strip_artists_from_title(split_out_version[:title], primary_artists, featuring_artists)
261
- title += TitleCase.featuring_artists_string(featuring_artists, "feat.")
262
- # replace abbreviations
263
- return {:title => title, :version => split_out_version[:version]}
264
- end
265
-
266
- def self.strip_version_from_title(title, version)
267
- inside_brackets = TitleCase.get_inside_brackets(title)
268
- #version = nil
269
- if inside_brackets
270
- inside_brackets.each do |b|
271
- if TitleCase.includes_version?(b)
272
- title.gsub!(" (#{b})", "")
273
- version = b.strip
253
+
254
+ # Build proper title
255
+ def self.build_proper_title(title, version, primary_artists, featuring_artists)
256
+ # Title Case
257
+ title = MusicMetadataScore::TitleCase.title_case(title)
258
+ # find any versions
259
+ split_out_version = MusicMetadataScore::TitleCase.strip_version_from_title(title, version)
260
+ # reformat featuring artists
261
+ title = MusicMetadataScore::TitleCase.strip_artists_from_title(split_out_version[:title], primary_artists, featuring_artists)
262
+ title += MusicMetadataScore::TitleCase.featuring_artists_string(featuring_artists, "feat.")
263
+ # replace abbreviations
264
+ return {:title => title, :version => split_out_version[:version]}
265
+ end
266
+
267
+ def self.strip_version_from_title(title, version)
268
+ inside_brackets = MusicMetadataScore::TitleCase.get_inside_brackets(title)
269
+ #version = nil
270
+ if inside_brackets
271
+ inside_brackets.each do |b|
272
+ if MusicMetadataScore::TitleCase.includes_version?(b)
273
+ title.gsub!(" (#{b})", "")
274
+ version = b.strip
275
+ end
274
276
  end
275
277
  end
278
+ return {
279
+ :title => title.strip,
280
+ :version => version
281
+ }
276
282
  end
277
- return {
278
- :title => title.strip,
279
- :version => version
280
- }
281
- end
282
-
283
- def self.strip_artists_from_title(title, primary_artists, featuring_artists)
284
- title = TitleCase.strip_artists_in_brackets_from_title(title, primary_artists, featuring_artists)
285
- title = TitleCase.strip_artists_from_outside_brackets_from_title(title, primary_artists, featuring_artists)
286
- title
287
- end
288
-
289
- def self.strip_artists_in_brackets_from_title(title, primary_artists, featuring_artists)
290
- inside_brackets = TitleCase.get_inside_brackets(title)
291
- if inside_brackets
292
- inside_brackets.each do |b|
293
- if TitleCase.includes_featuring_artists?(b, featuring_artists)
294
- title.gsub!(" (#{b})", "")
283
+
284
+ def self.strip_artists_from_title(title, primary_artists, featuring_artists)
285
+ title = MusicMetadataScore::TitleCase.strip_artists_in_brackets_from_title(title, primary_artists, featuring_artists)
286
+ title = MusicMetadataScore::TitleCase.strip_artists_from_outside_brackets_from_title(title, primary_artists, featuring_artists)
287
+ title
288
+ end
289
+
290
+ def self.strip_artists_in_brackets_from_title(title, primary_artists, featuring_artists)
291
+ inside_brackets = MusicMetadataScore::TitleCase.get_inside_brackets(title)
292
+ if inside_brackets
293
+ inside_brackets.each do |b|
294
+ if MusicMetadataScore::TitleCase.includes_featuring_artists?(b, featuring_artists)
295
+ title.gsub!(" (#{b})", "")
296
+ end
295
297
  end
296
298
  end
299
+ title
297
300
  end
298
- title
299
- end
300
-
301
- def self.strip_artists_from_outside_brackets_from_title(title, primary_artists, featuring_artists)
302
- title = TitleCase.remove_artist_names_from_title(title, TitleCase.combined_artists(primary_artists, featuring_artists))
303
- TitleCase.strip_featuring_words_from_title(title)
304
- end
305
-
306
- def self.remove_artist_names_from_title(title, artists)
307
- artists.each do |a|
308
- if title.include?(" #{a} &")
309
- title.gsub!(" #{a} &", "")
310
- elsif title.include?(" #{a} and")
311
- title.gsub!(" #{a} and", "")
312
- elsif title.include?(" #{a} And")
313
- title.gsub!(" #{a} And", "")
314
- elsif title.include?(" #{a},")
315
- title.gsub!(" #{a},", "")
316
- else
317
- title.gsub!(" #{a}", "")
301
+
302
+ def self.strip_artists_from_outside_brackets_from_title(title, primary_artists, featuring_artists)
303
+ title = MusicMetadataScore::TitleCase.remove_artist_names_from_title(title, MusicMetadataScore::TitleCase.combined_artists(primary_artists, featuring_artists))
304
+ MusicMetadataScore::TitleCase.strip_featuring_words_from_title(title)
305
+ end
306
+
307
+ def self.remove_artist_names_from_title(title, artists)
308
+ artists.each do |a|
309
+ if title.include?(" #{a} &")
310
+ title.gsub!(" #{a} &", "")
311
+ elsif title.include?(" #{a} and")
312
+ title.gsub!(" #{a} and", "")
313
+ elsif title.include?(" #{a} And")
314
+ title.gsub!(" #{a} And", "")
315
+ elsif title.include?(" #{a},")
316
+ title.gsub!(" #{a},", "")
317
+ else
318
+ title.gsub!(" #{a}", "")
319
+ end
318
320
  end
321
+ title
319
322
  end
320
- title
321
- end
322
-
323
- def self.strip_featuring_words_from_title(title)
324
- TitleCase.featuring_words.each do |w|
325
- title.gsub!(" #{w.strip}", "")
323
+
324
+ def self.strip_featuring_words_from_title(title)
325
+ MusicMetadataScore::TitleCase.featuring_words.each do |w|
326
+ title.gsub!(" #{w.strip}", "")
327
+ end
328
+ title
326
329
  end
327
- title
330
+
328
331
  end
329
-
330
332
  end
@@ -1,3 +1,3 @@
1
1
  module MusicMetadataScore
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end