-
Notifications
You must be signed in to change notification settings - Fork 0
/
song.rb
116 lines (101 loc) · 3.77 KB
/
song.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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
###########################################################################
# Copyright (C) 2006 by Paul Betts #
# paul.betts@gmail.com #
# #
# This program is free software; you can redistribute it and/or modify #
# it under the terms of the GNU General Public License as published by #
# the Free Software Foundation; either version 2 of the License, or #
# (at your option) any later version. #
# #
# This program is distributed in the hope that it will be useful, #
# but WITHOUT ANY WARRANTY; without even the implied warranty of #
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
# GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with this program; if not, write to the #
# Free Software Foundation, Inc., #
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #
###########################################################################
$:.unshift File.join(File.dirname(__FILE__))
# Ruby standard library
require 'rubygems'
require 'logger'
require 'gettext'
require 'pathname'
require 'digest/md5'
require 'utility'
include GetText
FeaturingList = ['Featuring', 'Feat.', 'featuring', 'feat.', 'FEATURING', 'FEAT.']
class Song
def initialize(hash = {})
@data = hash.clone
end
def get_canonical_artist
return nil unless @data[:artist]
# First, replace everything in the 'Featuring' list with a comma
s = @data[:artist].clone
FeaturingList.each { |x| s.sub!(x, ',') }
# Then, split on any sort of punctuation
artists = s.split(/[;,:\|-]/)
artists.delete_if { |x| x.chomp.empty? }
@data[:canonical_artist] = (artists.sort.join ',')
end
def [](key)
case key
when :path
@data[key].to_s
when :canonical_artist
return @data[key] if @data.has_key? key
@data[key] = get_canonical_artist
else
@data[key]
end
end
def []=(key, val)
case key
when :ext
# This is a generated property - don't let anyone set it
nil
when :path
@data[key] = Pathname.new val
@data[:ext] = @data[key].extname[1..25]
when :length
@data[key] = val
seconds = val.to_i
@data[:hours] = (seconds / 3600).to_s; seconds %= 3600
@data[:minutes] = (seconds / 60).to_s; seconds %= 60
@data[:seconds] = seconds.to_s
when :seconds, :minutes, :hours
@data[key] = val
h = @data[:hours].to_i; m = @data[:minutes].to_i; s = @data[:seconds].to_i
@data[:length] = (h*3600+m*60+s).to_s
when :artist
@data[key] = super_chomp(val)
@data.delete :canonical_artist if @data.has_key? :canonical_artist
else
@data[key] = super_chomp(val)
end
end
def checked_tag(key, invalid_chars, checking_proc)
@@sub_table ||= {}
data = @data[key] || "<#{key}>" # Write the original key back
# Switch out the data with a replacement if we've got one
data = @@sub_table[data] || data
return data unless data =~ invalid_chars
# Prompt the user for a replacement
default = data.gsub(invalid_chars, ' ')
repl = data
while repl =~ invalid_chars
repl = checking_proc.call(repl.clone, invalid_chars, default)
repl = default if repl.chomp.empty?
end
@@sub_table[data] = repl;
repl = _("(Unknown)") if repl.chomp.empty?
repl
end
def Song.sub_table; @@sub_table end
def Song.sub_table=(val); @@sub_table=val end
def to_hash; @data.clone end
def to_s; @data.to_s end
end