flac2mp3 0.4.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ OWJhM2U1ZThkNTUyZGQ3NGQ0YzU4ODY0YjU1ZTY5YmUyODBlNzBhNA==
5
+ data.tar.gz: !binary |-
6
+ ZjRhMzhmYTdlNTJhNGUyYzVlOWQzNGQ1YzUxYzA3MjFhY2UwMjlmNg==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ YzRlOWFmMmVmMTk3YTM0NjY0ODk3M2NhZWY5ZTZmMDA0YTIwYWY3NWZjZWFm
10
+ MGMzOThiN2YxMjU0NTAzNzIwMjk3ZDIwMTY1NDNmN2RhZGQ0YTM5OWI3ZTJj
11
+ NTIwZDczMWQ0M2E2ZTM5NTQyZDZhMWI4ZDYxOTgxZDNlNzhlMGU=
12
+ data.tar.gz: !binary |-
13
+ MmQ1Yjk0YzUxMDc3MjZjNmM5YWZlYTNkZDQ1YWRiYzNiZjc5YTA5NGQwNGE1
14
+ ODMwZTM3YWFhZTA1ZjYyNTZhYjZjZjQ1MzVkZWU5YzdmNTVhZDZhYmQ5NGE5
15
+ YzMzOTUzMWIwZjE1YjJkZjVhNDg2N2Y1MGFkMDgwOGRiODc5ZjA=
@@ -1,3 +1,8 @@
1
+ == 0.4.1 2013-04-20
2
+
3
+ * 1 tiny enhancement:
4
+ * Switched from iconv to built-in encoding
5
+
1
6
  == 0.4.0 2009-09-22
2
7
 
3
8
  * 1 enhancement:
@@ -22,7 +27,7 @@
22
27
  * 2 enhancements:
23
28
  * Now has a configuration file, ~/.flac2mp3, where options can be stored.
24
29
  Options given on the command-line override any configuration options.
25
- * Greatly refactored internals, though the command-line operation remains the same.
30
+ * Greatly refactored internals, though the command-line operation remains the same.
26
31
 
27
32
  == 0.2.8 2008-07-21
28
33
 
@@ -43,7 +48,7 @@
43
48
 
44
49
  * 1 bug fix:
45
50
  * Composer now actually carried over from FLAC to MP3 tags, not just thought to be.
46
-
51
+
47
52
  * 3 enhancements:
48
53
  * Compilation flag carried over.
49
54
  * Track total carried over in addition to track number.
@@ -2,60 +2,62 @@ $:.unshift File.dirname(__FILE__)
2
2
  require 'flacinfo'
3
3
  require 'mp3info'
4
4
  require 'yaml'
5
- require 'iconv'
6
5
 
7
6
  class Flac2mp3
8
7
  def initialize(options = {})
9
8
  load_config
10
9
  set_options(options)
11
10
  end
12
-
11
+
13
12
  def convert(filename)
14
13
  raise TypeError, "'#{filename}' is not a file" unless FileTest.file?(filename)
15
14
  process_conversion(filename)
16
15
  File.delete(filename) if delete?
17
16
  end
18
-
17
+
19
18
  def process_conversion(filename)
20
19
  outfile = output_filename(filename)
21
20
  convert_data(filename, outfile)
22
21
  convert_metadata(filename, outfile)
23
22
  end
24
-
23
+
25
24
  def convert_data(filename, outfile)
26
25
  system "#{flac_command(filename)} | #{mp3_command(outfile)}"
27
26
  end
28
-
27
+
29
28
  def flac_command(filename)
30
29
  command = 'flac'
31
30
  command << ' --silent' if silent?
32
-
31
+
33
32
  "#{command} --stdout --decode #{safequote(filename)}"
34
33
  end
35
-
34
+
36
35
  def mp3_command(filename)
37
36
  command = 'lame'
38
37
  command << ' --silent' if silent?
39
-
38
+
40
39
  "#{command} #{encoding} - #{safequote(filename)}"
41
40
  end
42
-
41
+
43
42
  def convert_metadata(filename, outfile)
44
43
  set_mp3data(outfile, get_flacdata(filename))
45
44
  end
46
-
45
+
47
46
  def get_flacdata(filename)
48
- FlacInfo.new(filename).tags.inject({}) do |hash, (key, value)|
47
+ hash = {}
48
+
49
+ FlacInfo.new(filename).tags.each do |(key, value)|
49
50
  key = key.to_s.downcase.to_sym
50
51
  value = value.to_i if value.respond_to?(:match) and value.match(/^\d+$/)
51
52
  value = value.to_s if self.class.string_fields.include?(key)
52
- value = Iconv.conv('ISO-8859-1//TRANSLIT', 'UTF-8', value) if value.is_a?(String)
53
-
53
+ value = value.force_encoding('UTF-8') if value.is_a?(String)
54
+
54
55
  hash[key] = value
55
- hash
56
56
  end
57
+
58
+ hash
57
59
  end
58
-
60
+
59
61
  def set_mp3data(filename, tags)
60
62
  raise TypeError, "Tags must be a hash" unless tags.is_a?(Hash)
61
63
  Mp3Info.open(filename) do |mp3|
@@ -65,56 +67,56 @@ class Flac2mp3
65
67
  end
66
68
  end
67
69
  end
68
-
70
+
69
71
  def load_config
70
72
  @config = {}
71
73
  yaml = YAML.load(File.read(File.expand_path('~/.flac2mp3'))) || {}
72
74
  yaml.each { |k, v| @config[k.to_sym] = v }
73
75
  rescue Errno::ENOENT
74
76
  end
75
-
77
+
76
78
  def set_options(options)
77
79
  raise TypeError, 'options must be a hash' unless options.is_a?(Hash)
78
80
  @options = config.merge(options)
79
81
  end
80
-
82
+
81
83
  def options
82
84
  @options.dup
83
85
  end
84
-
86
+
85
87
  def config
86
88
  @config.dup
87
89
  end
88
-
90
+
89
91
  def delete?
90
92
  !!options[:delete]
91
93
  end
92
-
94
+
93
95
  def silent?
94
96
  !!options[:silent]
95
97
  end
96
-
98
+
97
99
  def encoding
98
100
  options[:encoding] || self.class.default_encoding
99
101
  end
100
-
102
+
101
103
  def output_filename(filename)
102
104
  filename.chomp('.flac') + '.mp3'
103
105
  end
104
-
106
+
105
107
  def safequote(filename)
106
108
  filename.gsub(/(\W)/, '\\\\\1')
107
109
  end
108
-
110
+
109
111
  class << self
110
112
  def convert(filename, options = {})
111
113
  new(options).convert(filename)
112
114
  end
113
-
115
+
114
116
  def convert_metadata(infile, outfile)
115
117
  new.convert_metadata(infile, outfile)
116
118
  end
117
-
119
+
118
120
  def tag_mapping
119
121
  {
120
122
  :album => :album,
@@ -133,39 +135,39 @@ class Flac2mp3
133
135
  :tag => :TIT1
134
136
  }
135
137
  end
136
-
138
+
137
139
  def convert_tags(tags)
138
140
  mp3_tags = {}
139
-
141
+
140
142
  tags.each do |key, value|
141
143
  next unless mp3tag = tag_mapping[key]
142
-
144
+
143
145
  if format = tag_formats[mp3tag]
144
- value = format.gsub(/:(\w+)/) do
146
+ value = format.gsub(/:(\w+)/) do
145
147
  field = $1
146
148
  tags[field.to_sym]
147
149
  end
148
150
  end
149
-
151
+
150
152
  target = tag2_fields.include?(key) ? :tag2 : :tag
151
153
  mp3_tags[mp3tag] = { :target => target, :value => value }
152
154
  end
153
-
155
+
154
156
  mp3_tags
155
157
  end
156
-
158
+
157
159
  def default_encoding
158
160
  '--preset standard'
159
161
  end
160
-
162
+
161
163
  def string_fields
162
164
  [:title, :description]
163
165
  end
164
-
166
+
165
167
  def tag2_fields
166
168
  [:bpm, :composer, :compilation, :tracktotal, :tracknumber, :disctotal, :discnumber, :tag]
167
169
  end
168
-
170
+
169
171
  def tag_formats
170
172
  {
171
173
  :TRCK => ':tracknumber/:tracktotal',
@@ -2,7 +2,7 @@ class Flac2mp3 #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 4
5
- TINY = 0
5
+ TINY = 1
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
@@ -12,127 +12,127 @@ describe 'flac2mp3 command' do
12
12
  before do
13
13
  Flac2mp3.stub!(:convert)
14
14
  Flac2mp3.stub!(:convert_metadata)
15
-
15
+
16
16
  [:ARGV, :OPTIONS, :MANDATORY_OPTIONS].each do |const|
17
17
  Object.send(:remove_const, const) if Object.const_defined?(const)
18
18
  end
19
19
  end
20
-
20
+
21
21
  it 'should exist' do
22
22
  lambda { run_command('blah') }.should.not.raise(Errno::ENOENT)
23
23
  end
24
-
24
+
25
25
  it 'should require a filename' do
26
26
  self.should.receive(:puts) do |output|
27
27
  output.should.match(/usage.+filename/i)
28
28
  end
29
29
  run_command
30
30
  end
31
-
31
+
32
32
  it 'should pass the filename to Flac2mp3 for conversion' do
33
33
  Flac2mp3.should.receive(:convert) do |filename, _|
34
34
  filename.should == 'blah'
35
35
  end
36
36
  run_command('blah')
37
37
  end
38
-
38
+
39
39
  it 'should pass on a true flac-deletion option if specified on the command line (using --delete)' do
40
40
  Flac2mp3.should.receive(:convert) do |_, options|
41
41
  options[:delete].should == true
42
42
  end
43
43
  run_command('blah', '--delete')
44
44
  end
45
-
45
+
46
46
  it 'should pass on a false flac-deletion option if specified on the command line (using --no-delete)' do
47
47
  Flac2mp3.should.receive(:convert) do |_, options|
48
48
  options[:delete].should == false
49
49
  end
50
50
  run_command('blah', '--no-delete')
51
51
  end
52
-
52
+
53
53
  it 'should pass on a true flac-deletion option if specified on the command line (using -d)' do
54
54
  Flac2mp3.should.receive(:convert) do |_, options|
55
55
  options[:delete].should == true
56
56
  end
57
57
  run_command('blah', '-d')
58
58
  end
59
-
59
+
60
60
  it 'should not pass on any flac-deletion option if nothing specified on the command line' do
61
61
  Flac2mp3.should.receive(:convert) do |_, options|
62
62
  options.should.not.include(:delete)
63
63
  end
64
64
  run_command('blah')
65
65
  end
66
-
66
+
67
67
  it 'should pass on a true silence option if specified on the command line (using --silent)' do
68
68
  Flac2mp3.should.receive(:convert) do |_, options|
69
69
  options[:silent].should == true
70
70
  end
71
71
  run_command('blah', '--silent')
72
72
  end
73
-
73
+
74
74
  it 'should pass on a true silence option if specified on the command line (using -s)' do
75
75
  Flac2mp3.should.receive(:convert) do |_, options|
76
76
  options[:silent].should == true
77
77
  end
78
78
  run_command('blah', '-s')
79
79
  end
80
-
80
+
81
81
  it 'should not pass on any silence option if nothing specified on the command line' do
82
82
  Flac2mp3.should.receive(:convert) do |_, options|
83
83
  options.should.not.include(:silent)
84
84
  end
85
85
  run_command('blah')
86
86
  end
87
-
87
+
88
88
  it 'should pass on the encoding option specified on the command line' do
89
89
  Flac2mp3.should.receive(:convert) do |_, options|
90
90
  options[:encoding].should == '--preset fast standard'
91
91
  end
92
92
  run_command('blah', '--encoding', '--preset fast standard')
93
93
  end
94
-
94
+
95
95
  it 'should pass on the encoding option specified in shorthand on the command line' do
96
96
  Flac2mp3.should.receive(:convert) do |_, options|
97
97
  options[:encoding].should == '--preset fast standard'
98
98
  end
99
99
  run_command('blah', '-e', '--preset fast standard')
100
100
  end
101
-
101
+
102
102
  it 'should pass on no encoding option if none specified on the command line' do
103
103
  Flac2mp3.should.receive(:convert) do |_, options|
104
104
  options.should.not.include(:encoding)
105
105
  end
106
106
  run_command('blah')
107
107
  end
108
-
108
+
109
109
  it 'should take a --meta option to convert metadata' do
110
110
  lambda { run_command('--meta', 'blah.flac', 'something.mp3') }.should.not.raise(OptionParser::InvalidOption)
111
111
  end
112
-
112
+
113
113
  describe 'when converting metadata' do
114
114
  before do
115
115
  @infile = 'blah.flac'
116
116
  @outfile = 'something.mp3'
117
117
  end
118
-
118
+
119
119
  it 'should require two filenames' do
120
120
  self.should.receive(:puts) do |output|
121
121
  output.should.match(/usage.+filename/i)
122
122
  end
123
123
  run_command('--meta', @infile)
124
124
  end
125
-
125
+
126
126
  it 'should pass the filenames to Flac2mp3 for metadata conversion' do
127
127
  Flac2mp3.should.receive(:convert_metadata).with(@infile, @outfile)
128
128
  run_command('--meta', @infile, @outfile)
129
129
  end
130
-
130
+
131
131
  it 'should not attempt to convert any files' do
132
132
  Flac2mp3.should.receive(:convert).never
133
133
  run_command('--meta', @infile, @outfile)
134
134
  end
135
-
135
+
136
136
  it 'should accept a shorthand -m option' do
137
137
  Flac2mp3.should.receive(:convert_metadata).with(@infile, @outfile)
138
138
  run_command('-m', @infile, @outfile)
@@ -4,49 +4,49 @@ describe Flac2mp3 do
4
4
  before do
5
5
  @flac2mp3 = Flac2mp3.new
6
6
  end
7
-
7
+
8
8
  describe 'when initialized' do
9
9
  before do
10
10
  @options = { :silent => true, :delete => false }
11
11
  end
12
-
12
+
13
13
  it 'should accept options' do
14
14
  lambda { Flac2mp3.new(@options) }.should.not.raise(ArgumentError)
15
15
  end
16
-
16
+
17
17
  it 'should not require options' do
18
18
  lambda { Flac2mp3.new }.should.not.raise(ArgumentError)
19
19
  end
20
-
20
+
21
21
  describe do
22
22
  # unnamed describe block just to give a level of organization
23
23
  # to this subclass-based initialize-behavior testing
24
24
  before do
25
25
  @subclass = Class.new(Flac2mp3) do
26
26
  attr_reader :config_loaded, :options_set, :options
27
-
27
+
28
28
  def load_config
29
29
  @config_loaded = true
30
30
  end
31
-
31
+
32
32
  def set_options(*args)
33
33
  @options_set = true
34
34
  @options = args
35
35
  end
36
36
  end
37
37
  end
38
-
38
+
39
39
  it 'should load the configuration' do
40
40
  obj = @subclass.new
41
41
  obj.config_loaded.should == true
42
42
  end
43
-
43
+
44
44
  it 'should set the options' do
45
45
  obj = @subclass.new(@options)
46
46
  obj.options_set.should == true
47
47
  obj.options.should == [@options]
48
48
  end
49
-
49
+
50
50
  it 'should default to empty options' do
51
51
  obj = @subclass.new
52
52
  obj.options_set.should == true
@@ -54,251 +54,251 @@ describe Flac2mp3 do
54
54
  end
55
55
  end
56
56
  end
57
-
57
+
58
58
  it 'should load the configuration' do
59
59
  @flac2mp3.should.respond_to(:load_config)
60
60
  end
61
-
61
+
62
62
  describe 'loading the configuration' do
63
63
  it 'should look for a config file' do
64
64
  File.should.receive(:read).with(File.expand_path('~/.flac2mp3')).and_return('')
65
65
  @flac2mp3.load_config
66
66
  end
67
-
67
+
68
68
  describe 'when a config file is found' do
69
69
  before do
70
70
  @config = { :silent => true, :delete => false }
71
71
  @contents = @config.to_yaml
72
72
  File.stub!(:read).and_return(@contents)
73
73
  end
74
-
74
+
75
75
  it 'should parse the file as YAML' do
76
76
  YAML.should.receive(:load).with(@contents)
77
77
  @flac2mp3.load_config
78
78
  end
79
-
79
+
80
80
  it 'should store the config' do
81
81
  @flac2mp3.load_config
82
82
  @flac2mp3.config.should == @config
83
83
  end
84
-
84
+
85
85
  it 'should convert string keys to symbols' do
86
86
  File.stub!(:read).and_return({ 'silent' => true, 'delete' => false }.to_yaml)
87
87
  @flac2mp3.load_config
88
88
  @flac2mp3.config.should == @config
89
89
  end
90
-
90
+
91
91
  it 'should handle an empty file' do
92
92
  File.stub!(:read).and_return('')
93
93
  @flac2mp3.load_config
94
94
  @flac2mp3.config.should == {}
95
95
  end
96
-
96
+
97
97
  it 'should not allow changes to the config' do
98
98
  @flac2mp3.load_config
99
99
  @flac2mp3.config[:some_key] = 'some value'
100
100
  @flac2mp3.config.should == @config
101
101
  end
102
102
  end
103
-
103
+
104
104
  describe 'when no config file is found' do
105
105
  before do
106
106
  File.stub!(:read).and_raise(Errno::ENOENT)
107
107
  end
108
-
108
+
109
109
  it 'should store an empty config' do
110
110
  Flac2mp3.new.config.should == {}
111
111
  end
112
112
  end
113
113
  end
114
-
114
+
115
115
  it 'should set options' do
116
116
  @flac2mp3.should.respond_to(:set_options)
117
117
  end
118
-
118
+
119
119
  describe 'setting options' do
120
120
  before do
121
121
  @options = { :silent => true, :delete => false }
122
122
  end
123
-
123
+
124
124
  it 'should accept options' do
125
125
  lambda { @flac2mp3.set_options(:silent => true) }.should.not.raise(ArgumentError)
126
126
  end
127
-
127
+
128
128
  it 'should require options' do
129
129
  lambda { @flac2mp3.set_options }.should.raise(ArgumentError)
130
130
  end
131
-
131
+
132
132
  it 'should accept a hash of options' do
133
133
  lambda { @flac2mp3.set_options(:silent => true) }.should.not.raise(TypeError)
134
134
  end
135
-
135
+
136
136
  it 'should require a hash of options' do
137
137
  lambda { @flac2mp3.set_options('silent') }.should.raise(TypeError)
138
138
  end
139
-
139
+
140
140
  it 'should store the options' do
141
141
  @flac2mp3.set_options(@options)
142
142
  @flac2mp3.options.should == @options
143
143
  end
144
-
144
+
145
145
  it 'should not allow changes to the options' do
146
146
  @flac2mp3.set_options(@options.dup)
147
147
  @flac2mp3.options[:some_key] = 'some value'
148
148
  @flac2mp3.options.should == @options
149
149
  end
150
150
  end
151
-
151
+
152
152
  describe 'querying options' do
153
153
  before do
154
154
  File.stub!(:read).and_return('')
155
155
  @flac2mp3.load_config
156
156
  end
157
-
157
+
158
158
  it 'should indicate the original file should be deleted when a true option is given' do
159
159
  @flac2mp3.set_options(:delete => true)
160
160
  @flac2mp3.delete?.should == true
161
161
  end
162
-
162
+
163
163
  it 'should indicate the original file should not be deleted when a false option is given' do
164
164
  @flac2mp3.set_options(:delete => false)
165
165
  @flac2mp3.delete?.should == false
166
166
  end
167
-
167
+
168
168
  it 'should indicate the original file should not be deleted when no option is given' do
169
169
  @flac2mp3.set_options({})
170
170
  @flac2mp3.delete?.should == false
171
171
  end
172
-
172
+
173
173
  it 'should indicate the conversion should be silent when a true option is given' do
174
174
  @flac2mp3.set_options(:silent => true)
175
175
  @flac2mp3.silent?.should == true
176
176
  end
177
-
177
+
178
178
  it 'should indicate the conversion should not be silent when a false option is given' do
179
179
  @flac2mp3.set_options(:silent => false)
180
180
  @flac2mp3.silent?.should == false
181
181
  end
182
-
182
+
183
183
  it 'should indicate the conversion should not be silent when no option is given' do
184
184
  @flac2mp3.set_options({})
185
185
  @flac2mp3.silent?.should == false
186
186
  end
187
-
187
+
188
188
  it 'should store the given encoding' do
189
189
  encoding = '-VAWESOME'
190
190
  @flac2mp3.set_options(:encoding => encoding)
191
191
  @flac2mp3.encoding.should == encoding
192
192
  end
193
-
193
+
194
194
  it 'should default the encoding to --preset standard' do
195
195
  @flac2mp3.set_options({})
196
196
  @flac2mp3.encoding.should == '--preset standard'
197
197
  end
198
-
198
+
199
199
  it 'should use values from the configuration' do
200
200
  config = {:silent => true}
201
201
  File.stub!(:read).and_return(config.to_yaml)
202
202
  Flac2mp3.new.silent?.should == true
203
203
  end
204
-
204
+
205
205
  it 'should override configuration values with options' do
206
206
  config = {:silent => true}
207
207
  File.stub!(:read).and_return(config.to_yaml)
208
208
  Flac2mp3.new(:silent => false).silent?.should == false
209
209
  end
210
-
210
+
211
211
  it 'should combine configuration and option values' do
212
212
  config = {:silent => true}
213
213
  File.stub!(:read).and_return(config.to_yaml)
214
214
  flac2mp3 = Flac2mp3.new(:delete => true)
215
-
215
+
216
216
  flac2mp3.silent?.should == true
217
217
  flac2mp3.delete?.should == true
218
218
  end
219
219
  end
220
-
220
+
221
221
  it 'should convert' do
222
222
  @flac2mp3.should.respond_to(:convert)
223
223
  end
224
-
224
+
225
225
  describe 'when converting' do
226
226
  before do
227
227
  @filename = 'test.flac'
228
228
  @flac2mp3.stub!(:process_conversion)
229
229
  FileTest.stub!(:file?).and_return(true)
230
230
  end
231
-
231
+
232
232
  it 'should accept a filename' do
233
233
  lambda { @flac2mp3.convert(@filename) }.should.not.raise(ArgumentError)
234
234
  end
235
-
235
+
236
236
  it 'should require a filename' do
237
237
  lambda { @flac2mp3.convert }.should.raise(ArgumentError)
238
238
  end
239
-
239
+
240
240
  it 'should check if the filename belongs to a regular file' do
241
241
  FileTest.should.receive(:file?).with(@filename).and_return(true)
242
242
  @flac2mp3.convert(@filename)
243
243
  end
244
-
244
+
245
245
  describe 'when given a filename belonging to a regular file' do
246
246
  before do
247
247
  FileTest.stub!(:file?).and_return(true)
248
248
  end
249
-
249
+
250
250
  it 'should not error' do
251
251
  lambda { @flac2mp3.convert(@filename) }.should.not.raise(TypeError)
252
252
  end
253
-
253
+
254
254
  it 'should process the conversion' do
255
255
  @flac2mp3.should.receive(:process_conversion).with(@filename)
256
256
  @flac2mp3.convert(@filename)
257
257
  end
258
-
258
+
259
259
  it 'should check if the original file should be deleted' do
260
260
  @flac2mp3.should.receive(:delete?)
261
261
  @flac2mp3.convert(@filename)
262
262
  end
263
-
263
+
264
264
  describe 'when the original file should be deleted' do
265
265
  before do
266
266
  @flac2mp3.stub!(:delete?).and_return(true)
267
267
  end
268
-
268
+
269
269
  it 'should delete the original file' do
270
270
  File.should.receive(:delete).with(@filename)
271
271
  @flac2mp3.convert(@filename)
272
272
  end
273
273
  end
274
-
274
+
275
275
  describe 'when the original file should not be deleted' do
276
276
  before do
277
277
  @flac2mp3.stub!(:delete?).and_return(false)
278
278
  end
279
-
279
+
280
280
  it 'should not delete the original file' do
281
281
  File.should.receive(:delete).never
282
282
  @flac2mp3.convert(@filename)
283
283
  end
284
284
  end
285
285
  end
286
-
286
+
287
287
  describe 'when given a filename not belonging to a regular file' do
288
288
  before do
289
289
  FileTest.stub!(:file?).and_return(false)
290
290
  end
291
-
291
+
292
292
  it 'should error' do
293
293
  lambda { @flac2mp3.convert(@filename) }.should.raise(TypeError)
294
294
  end
295
295
  end
296
296
  end
297
-
297
+
298
298
  it 'should process conversion' do
299
299
  @flac2mp3.should.respond_to(:process_conversion)
300
300
  end
301
-
301
+
302
302
  describe 'when processing conversion' do
303
303
  before do
304
304
  @filename = 'test.flac'
@@ -307,35 +307,35 @@ describe Flac2mp3 do
307
307
  @flac2mp3.stub!(:convert_data)
308
308
  @flac2mp3.stub!(:convert_metadata)
309
309
  end
310
-
310
+
311
311
  it 'should accept a filename' do
312
312
  lambda { @flac2mp3.process_conversion(@filename) }.should.not.raise(ArgumentError)
313
313
  end
314
-
314
+
315
315
  it 'should require a filename' do
316
316
  lambda { @flac2mp3.process_conversion }.should.raise(ArgumentError)
317
317
  end
318
-
318
+
319
319
  it 'get the output filename from the given filename' do
320
320
  @flac2mp3.should.receive(:output_filename).with(@filename)
321
321
  @flac2mp3.process_conversion(@filename)
322
322
  end
323
-
323
+
324
324
  it 'should convert data' do
325
325
  @flac2mp3.should.receive(:convert_data).with(@filename, @out_filename)
326
326
  @flac2mp3.process_conversion(@filename)
327
327
  end
328
-
328
+
329
329
  it 'should convert metadata' do
330
330
  @flac2mp3.should.receive(:convert_metadata).with(@filename, @out_filename)
331
331
  @flac2mp3.process_conversion(@filename)
332
332
  end
333
333
  end
334
-
334
+
335
335
  it 'should provide an output filename' do
336
336
  @flac2mp3.should.respond_to(:output_filename)
337
337
  end
338
-
338
+
339
339
  describe 'providing an output filename' do
340
340
  it 'should accept a filename' do
341
341
  lambda { @flac2mp3.output_filename('blah.flac') }.should.not.raise(ArgumentError)
@@ -353,11 +353,11 @@ describe Flac2mp3 do
353
353
  @flac2mp3.output_filename('blah').should == 'blah.mp3'
354
354
  end
355
355
  end
356
-
356
+
357
357
  it 'should convert data' do
358
358
  @flac2mp3.should.respond_to(:convert_data)
359
359
  end
360
-
360
+
361
361
  describe 'when converting data' do
362
362
  before do
363
363
  @filename = 'test.flac'
@@ -368,39 +368,39 @@ describe Flac2mp3 do
368
368
  @flac2mp3.stub!(:mp3_command).and_return(@mp3_command)
369
369
  @flac2mp3.stub!(:system)
370
370
  end
371
-
371
+
372
372
  it 'should accept a filename and an output filename' do
373
373
  lambda { @flac2mp3.convert_data(@filename, @out_filename) }.should.not.raise(ArgumentError)
374
374
  end
375
-
375
+
376
376
  it 'should require an output filename' do
377
377
  lambda { @flac2mp3.convert_data(@filename) }.should.raise(ArgumentError)
378
378
  end
379
-
379
+
380
380
  it 'should require a filename' do
381
381
  lambda { @flac2mp3.convert_data }.should.raise(ArgumentError)
382
382
  end
383
-
383
+
384
384
  it 'should call the flac command with the given filename' do
385
385
  @flac2mp3.should.receive(:flac_command).with(@filename)
386
386
  @flac2mp3.convert_data(@filename, @out_filename)
387
387
  end
388
-
388
+
389
389
  it 'should call the mp3 command with the given output filename' do
390
390
  @flac2mp3.should.receive(:mp3_command).with(@out_filename)
391
391
  @flac2mp3.convert_data(@filename, @out_filename)
392
392
  end
393
-
393
+
394
394
  it 'should shell out to the system with the flac and mp3 commands' do
395
395
  @flac2mp3.should.receive(:system).with("#{@flac_command} | #{@mp3_command}")
396
396
  @flac2mp3.convert_data(@filename, @out_filename)
397
397
  end
398
398
  end
399
-
399
+
400
400
  it 'should provide a flac command' do
401
401
  @flac2mp3.should.respond_to(:flac_command)
402
402
  end
403
-
403
+
404
404
  describe 'when providing a flac command' do
405
405
  before do
406
406
  @filename = 'test.flac'
@@ -408,50 +408,50 @@ describe Flac2mp3 do
408
408
  @flac2mp3.stub!(:safequote).and_return(@safe_filename)
409
409
  @flac2mp3.stub!(:silent?)
410
410
  end
411
-
411
+
412
412
  it 'should accept a filename' do
413
413
  lambda { @flac2mp3.flac_command(@filename) }.should.not.raise(ArgumentError)
414
414
  end
415
-
415
+
416
416
  it 'should require a filename' do
417
417
  lambda { @flac2mp3.flac_command }.should.raise(ArgumentError)
418
418
  end
419
-
419
+
420
420
  it 'should safequote the filename' do
421
421
  @flac2mp3.should.receive(:safequote).with(@filename)
422
422
  @flac2mp3.flac_command(@filename)
423
423
  end
424
-
424
+
425
425
  it 'should check if the command should be silent' do
426
426
  @flac2mp3.should.receive(:silent?)
427
427
  @flac2mp3.flac_command(@filename)
428
428
  end
429
-
429
+
430
430
  describe 'when the command should be silent' do
431
431
  before do
432
432
  @flac2mp3.stub!(:silent?).and_return(true)
433
433
  end
434
-
434
+
435
435
  it 'should provide a flac shell command that will be silent' do
436
436
  @flac2mp3.flac_command(@filename).should == "flac --silent --stdout --decode #{@safe_filename}"
437
437
  end
438
438
  end
439
-
439
+
440
440
  describe 'when the command should not be silent' do
441
441
  before do
442
442
  @flac2mp3.stub!(:silent?).and_return(false)
443
443
  end
444
-
444
+
445
445
  it 'should provide a flac shell command that will not be silent' do
446
446
  @flac2mp3.flac_command(@filename).should == "flac --stdout --decode #{@safe_filename}"
447
447
  end
448
448
  end
449
449
  end
450
-
450
+
451
451
  it 'should provide an mp3 command' do
452
452
  @flac2mp3.should.respond_to(:mp3_command)
453
453
  end
454
-
454
+
455
455
  describe 'when providing an mp3 command' do
456
456
  before do
457
457
  @filename = 'test.mp3'
@@ -461,64 +461,64 @@ describe Flac2mp3 do
461
461
  @encoding = '--VAWESOME'
462
462
  @flac2mp3.stub!(:encoding).and_return(@encoding)
463
463
  end
464
-
464
+
465
465
  it 'should accept a filename' do
466
466
  lambda { @flac2mp3.mp3_command(@filename) }.should.not.raise(ArgumentError)
467
467
  end
468
-
468
+
469
469
  it 'should require a filename' do
470
470
  lambda { @flac2mp3.mp3_command }.should.raise(ArgumentError)
471
471
  end
472
-
472
+
473
473
  it 'should safequote the filename' do
474
474
  @flac2mp3.should.receive(:safequote).with(@filename)
475
475
  @flac2mp3.mp3_command(@filename)
476
476
  end
477
-
477
+
478
478
  it 'should check if the command should be silent' do
479
479
  @flac2mp3.should.receive(:silent?)
480
480
  @flac2mp3.mp3_command(@filename)
481
481
  end
482
-
482
+
483
483
  it 'should check the encoding to use' do
484
484
  @flac2mp3.should.receive(:encoding)
485
485
  @flac2mp3.mp3_command(@filename)
486
486
  end
487
-
487
+
488
488
  describe 'when the command should be silent' do
489
489
  before do
490
490
  @flac2mp3.stub!(:silent?).and_return(true)
491
491
  end
492
-
492
+
493
493
  it 'should provide an mp3 shell command that will be silent' do
494
494
  @flac2mp3.mp3_command(@filename).should == "lame --silent #{@encoding} - #{@safe_filename}"
495
495
  end
496
496
  end
497
-
497
+
498
498
  describe 'when the command should not be silent' do
499
499
  before do
500
500
  @flac2mp3.stub!(:silent?).and_return(false)
501
501
  end
502
-
502
+
503
503
  it 'should provide an mp3 shell command that will not be silent' do
504
504
  @flac2mp3.mp3_command(@filename).should == "lame #{@encoding} - #{@safe_filename}"
505
505
  end
506
506
  end
507
507
  end
508
-
508
+
509
509
  it 'should quote filenames safely' do
510
510
  @flac2mp3.should.respond_to(:safequote)
511
511
  end
512
-
512
+
513
513
  describe 'when quoting a filename safely' do
514
514
  it 'should accept a filename' do
515
515
  lambda { @flac2mp3.safequote('test.flac') }.should.not.raise(ArgumentError)
516
516
  end
517
-
517
+
518
518
  it 'should require a filename' do
519
519
  lambda { @flac2mp3.safequote }.should.raise(ArgumentError)
520
520
  end
521
-
521
+
522
522
  it 'should leave alphanumeric characters alone' do
523
523
  @flac2mp3.safequote('abc_123').should == 'abc_123'
524
524
  end
@@ -527,11 +527,11 @@ describe Flac2mp3 do
527
527
  @flac2mp3.safequote(%q[a-b"c 12'3]).should == %q[a\-b\"c\ 12\'3]
528
528
  end
529
529
  end
530
-
530
+
531
531
  it 'should convert metadata' do
532
532
  @flac2mp3.should.respond_to(:convert_metadata)
533
533
  end
534
-
534
+
535
535
  describe 'when converting metadata' do
536
536
  before do
537
537
  @filename = 'test.flac'
@@ -540,34 +540,34 @@ describe Flac2mp3 do
540
540
  @flac2mp3.stub!(:get_flacdata).and_return(@flacdata)
541
541
  @flac2mp3.stub!(:set_mp3data)
542
542
  end
543
-
543
+
544
544
  it 'should accept a filename and an output filename' do
545
545
  lambda { @flac2mp3.convert_metadata(@filename, @out_filename) }.should.not.raise(ArgumentError)
546
546
  end
547
-
547
+
548
548
  it 'should require an output filename' do
549
549
  lambda { @flac2mp3.convert_metadata(@filename) }.should.raise(ArgumentError)
550
550
  end
551
-
551
+
552
552
  it 'should require a filename' do
553
553
  lambda { @flac2mp3.convert_metadata }.should.raise(ArgumentError)
554
554
  end
555
-
555
+
556
556
  it 'should get the flac metadata' do
557
557
  @flac2mp3.should.receive(:get_flacdata).with(@filename)
558
558
  @flac2mp3.convert_metadata(@filename, @out_filename)
559
559
  end
560
-
560
+
561
561
  it 'should set the mp3 metadata with the flac metadata' do
562
562
  @flac2mp3.should.receive(:set_mp3data).with(@out_filename, @flacdata)
563
563
  @flac2mp3.convert_metadata(@filename, @out_filename)
564
564
  end
565
565
  end
566
-
566
+
567
567
  it 'should get flac metadata' do
568
568
  @flac2mp3.should.respond_to(:get_flacdata)
569
569
  end
570
-
570
+
571
571
  describe 'when getting flac metadata' do
572
572
  before do
573
573
  @filename = 'test.flac'
@@ -575,15 +575,15 @@ describe Flac2mp3 do
575
575
  @flacinfo = mock('flac info', :tags => @tags)
576
576
  FlacInfo.stub!(:new).and_return(@flacinfo)
577
577
  end
578
-
578
+
579
579
  it 'should accept a filename' do
580
580
  lambda { @flac2mp3.get_flacdata(@filename) }.should.not.raise(ArgumentError)
581
581
  end
582
-
582
+
583
583
  it 'should require a filename' do
584
584
  lambda { @flac2mp3.get_flacdata }.should.raise(ArgumentError)
585
585
  end
586
-
586
+
587
587
  it 'should create a FlacInfo object' do
588
588
  FlacInfo.should.receive(:new).with(@filename).and_return(@flacinfo)
589
589
  @flac2mp3.get_flacdata(@filename)
@@ -593,7 +593,7 @@ describe Flac2mp3 do
593
593
  @flacinfo.should.receive(:tags).and_return(@tags)
594
594
  @flac2mp3.get_flacdata(@filename)
595
595
  end
596
-
596
+
597
597
  it 'should return a hash of the tag data' do
598
598
  @tags[:artist] = 'blah'
599
599
  @tags[:blah] = 'boo'
@@ -604,7 +604,7 @@ describe Flac2mp3 do
604
604
  data[:blah].should == 'boo'
605
605
  data[:comment].should == 'hey'
606
606
  end
607
-
607
+
608
608
  it 'should convert tags to symbols' do
609
609
  @tags['artist'] = 'blah'
610
610
  @tags['blah'] = 'boo'
@@ -619,7 +619,7 @@ describe Flac2mp3 do
619
619
  data.should.not.include('blah')
620
620
  data.should.not.include('comment')
621
621
  end
622
-
622
+
623
623
  it 'should convert tags to lowercase' do
624
624
  @tags['Artist'] = 'blah'
625
625
  @tags[:BLAH] = 'boo'
@@ -634,21 +634,21 @@ describe Flac2mp3 do
634
634
  data.should.not.include(:BLAH)
635
635
  data.should.not.include('cOmMeNt')
636
636
  end
637
-
637
+
638
638
  it 'should convert values consisting only of digits to actual numbers' do
639
639
  @tags[:track] = '12'
640
640
 
641
641
  data = @flac2mp3.get_flacdata(@filename)
642
642
  data[:track].should == 12
643
643
  end
644
-
644
+
645
645
  it 'should leave numeric values as numbers' do
646
646
  @tags[:track] = 12
647
-
647
+
648
648
  data = @flac2mp3.get_flacdata(@filename)
649
649
  data[:track].should == 12
650
650
  end
651
-
651
+
652
652
  it 'should leave numeric titles as strings' do
653
653
  @tags[:title] = '45' # This was my first run-in with this problem, the opening track on Elvis Costello's /When I Was Cruel/
654
654
 
@@ -676,55 +676,55 @@ describe Flac2mp3 do
676
676
  data = @flac2mp3.get_flacdata(@filename)
677
677
  data[:description].should == '1938'
678
678
  end
679
-
679
+
680
680
  # iTunes wants ISO-8859-1, and I want my MP3s to display well in iTunes
681
- it 'should convert UTF-8 titles to ISO-8859-1' do
681
+ it 'should result in ISO-8859-1 titles' do
682
682
  @tags[:title] = "L\303\251gende"
683
683
 
684
684
  data = @flac2mp3.get_flacdata(@filename)
685
- data[:title].should == "L\351gende"
685
+ data[:title].should == "L\351gende".force_encoding('ISO-8859-1')
686
686
  end
687
-
688
- it 'should convert UTF-8 titles to ISO-8859-1 even if the title key is not a simple downcased symbol' do
687
+
688
+ it 'should result in ISO-8859-1 titles even if the title key is not a simple downcased symbol' do
689
689
  @tags['TITLE'] = "L\303\251gende"
690
690
 
691
691
  data = @flac2mp3.get_flacdata(@filename)
692
- data[:title].should == "L\351gende"
692
+ data[:title].should == "L\351gende".force_encoding('ISO-8859-1')
693
693
  end
694
-
695
- it 'should convert UTF-8 artist names to ISO-8859-1' do
694
+
695
+ it 'should result in ISO-8859-1 artist names' do
696
696
  @tags[:artist] = "St\303\251phane Grappelli"
697
697
 
698
698
  data = @flac2mp3.get_flacdata(@filename)
699
- data[:artist].should == "St\351phane Grappelli"
699
+ data[:artist].should == "St\351phane Grappelli".force_encoding('ISO-8859-1')
700
700
  end
701
-
702
- it 'should convert UTF-8 artist names to ISO-8859-1 even if the artist key is not a simple downcased symbol' do
701
+
702
+ it 'should result in ISO-8859-1 artist names even if the artist key is not a simple downcased symbol' do
703
703
  @tags['ARTIST'] = "St\303\251phane Grappelli"
704
704
 
705
705
  data = @flac2mp3.get_flacdata(@filename)
706
- data[:artist].should == "St\351phane Grappelli"
706
+ data[:artist].should == "St\351phane Grappelli".force_encoding('ISO-8859-1')
707
707
  end
708
-
709
- it 'should convert UTF-8 album titles to ISO-8859-1' do
708
+
709
+ it 'should result in ISO-8859-1 album titles' do
710
710
  @tags[:album] = "Still on Top \342\200\224 The Greatest Hits"
711
711
 
712
712
  data = @flac2mp3.get_flacdata(@filename)
713
- data[:album].should == "Still on Top - The Greatest Hits" # not a strict conversion, but a transliteration
713
+ data[:album].should == "Still on Top - The Greatest Hits".force_encoding('ISO-8859-1') # not a strict conversion, but a transliteration
714
714
  end
715
-
716
- it 'should convert UTF-8 album titles to ISO-8859-1 even if the album key is not a simple downcased symbol' do
715
+
716
+ it 'should result in ISO-8859-1 album titles even if the album key is not a simple downcased symbol' do
717
717
  @tags['ALBUM'] = "Still on Top \342\200\224 The Greatest Hits"
718
718
 
719
719
  data = @flac2mp3.get_flacdata(@filename)
720
- data[:album].should == "Still on Top - The Greatest Hits" # not a strict conversion, but a transliteration
720
+ data[:album].should == "Still on Top - The Greatest Hits".force_encoding('ISO-8859-1') # not a strict conversion, but a transliteration
721
721
  end
722
722
  end
723
-
723
+
724
724
  it 'should set mp3 metadata' do
725
725
  @flac2mp3.should.respond_to(:set_mp3data)
726
726
  end
727
-
727
+
728
728
  describe 'when setting mp3 metadata' do
729
729
  before do
730
730
  @filename = 'test.mp3'
@@ -734,32 +734,32 @@ describe Flac2mp3 do
734
734
  @mp3info = mock('mp3 info', :tag => @mp3tags, :tag2 => @mp3tags2)
735
735
  Mp3Info.stub!(:open).and_yield(@mp3info)
736
736
  end
737
-
737
+
738
738
  it 'should accept a filename and tag data' do
739
739
  lambda { @flac2mp3.set_mp3data(@filename, {}) }.should.not.raise(ArgumentError)
740
740
  end
741
-
741
+
742
742
  it 'should require tag data' do
743
743
  lambda { @flac2mp3.set_mp3data(@filename) }.should.raise(ArgumentError)
744
744
  end
745
-
745
+
746
746
  it 'should require a filename' do
747
747
  lambda { @flac2mp3.set_mp3data }.should.raise(ArgumentError)
748
748
  end
749
-
749
+
750
750
  it 'should accept a hash of tag data' do
751
751
  lambda { @flac2mp3.set_mp3data(@filename, 'tag data') }.should.raise(TypeError)
752
752
  end
753
-
753
+
754
754
  it 'should require a hash of tag data' do
755
755
  lambda { @flac2mp3.set_mp3data(@filename, {}) }.should.not.raise(TypeError)
756
756
  end
757
-
757
+
758
758
  it 'should use an Mp3Info object' do
759
759
  Mp3Info.should.receive(:open).with(@filename)
760
760
  @flac2mp3.set_mp3data(@filename, @tags)
761
761
  end
762
-
762
+
763
763
  it 'should set tags in the Mp3Info object' do
764
764
  @tags[:album] = 'blah'
765
765
  @tags[:artist] = 'boo'
@@ -820,7 +820,7 @@ describe Flac2mp3 do
820
820
 
821
821
  @flac2mp3.set_mp3data(@filename, @tags)
822
822
  end
823
-
823
+
824
824
  it "should use tag2 for 'tag' ('grouping')" do
825
825
  @tags[:tag] = 'one, two, three, oclock'
826
826
 
@@ -847,12 +847,12 @@ describe Flac2mp3 do
847
847
  @flac2mp3.set_mp3data(@filename, @tags)
848
848
  end
849
849
  end
850
-
850
+
851
851
  describe 'as a class' do
852
852
  it 'should convert' do
853
853
  Flac2mp3.should.respond_to(:convert)
854
854
  end
855
-
855
+
856
856
  describe 'when converting' do
857
857
  before do
858
858
  @filename = 'test.flac'
@@ -860,39 +860,39 @@ describe Flac2mp3 do
860
860
  @flac2mp3 = mock('flac2mp3', :convert => nil)
861
861
  Flac2mp3.stub!(:new).and_return(@flac2mp3)
862
862
  end
863
-
863
+
864
864
  it 'should accept a filename and a hash of options' do
865
865
  lambda { Flac2mp3.convert(@filename, @options) }.should.not.raise(ArgumentError)
866
866
  end
867
-
867
+
868
868
  it 'should not require options' do
869
869
  lambda { Flac2mp3.convert(@filename) }.should.not.raise(ArgumentError)
870
870
  end
871
-
871
+
872
872
  it 'should require a filename' do
873
873
  lambda { Flac2mp3.convert }.should.raise(ArgumentError)
874
874
  end
875
-
875
+
876
876
  it 'should instantiate a new Flac2mp3 object' do
877
877
  Flac2mp3.should.receive(:new).and_return(@flac2mp3)
878
878
  Flac2mp3.convert(@filename)
879
879
  end
880
-
880
+
881
881
  it 'should pass the options when instantiating the Flac2mp3 object' do
882
882
  Flac2mp3.should.receive(:new).with(@options).and_return(@flac2mp3)
883
883
  Flac2mp3.convert(@filename, @options)
884
884
  end
885
-
885
+
886
886
  it 'should use the Flac2mp3 object to convert the given file' do
887
887
  @flac2mp3.should.receive(:convert).with(@filename)
888
888
  Flac2mp3.convert(@filename)
889
889
  end
890
890
  end
891
-
891
+
892
892
  it 'should convert metadata' do
893
893
  Flac2mp3.should.respond_to(:convert_metadata)
894
894
  end
895
-
895
+
896
896
  describe 'when converting metadata' do
897
897
  before do
898
898
  @infile = 'test.flac'
@@ -900,30 +900,30 @@ describe Flac2mp3 do
900
900
  @flac2mp3 = mock('flac2mp3', :convert_metadata => nil)
901
901
  Flac2mp3.stub!(:new).and_return(@flac2mp3)
902
902
  end
903
-
903
+
904
904
  it 'should accept two filenames' do
905
905
  lambda { Flac2mp3.convert_metadata(@infile, @outfile) }.should.not.raise(ArgumentError)
906
906
  end
907
-
907
+
908
908
  it 'should require two filenames' do
909
909
  lambda { Flac2mp3.convert_metadata(@infile) }.should.raise(ArgumentError)
910
910
  end
911
-
911
+
912
912
  it 'should instantiate a new Flac2mp3 object' do
913
913
  Flac2mp3.should.receive(:new).and_return(@flac2mp3)
914
914
  Flac2mp3.convert_metadata(@infile, @outfile)
915
915
  end
916
-
916
+
917
917
  it 'should use the Flac2mp3 object to convert the metadata between the given files' do
918
918
  @flac2mp3.should.receive(:convert_metadata).with(@infile, @outfile)
919
919
  Flac2mp3.convert_metadata(@infile, @outfile)
920
920
  end
921
921
  end
922
-
922
+
923
923
  it 'should provide a tag mapping' do
924
924
  Flac2mp3.should.respond_to(:tag_mapping)
925
925
  end
926
-
926
+
927
927
  describe 'providing a tag mapping' do
928
928
  it 'should return a hash' do
929
929
  Flac2mp3.tag_mapping.should.be.kind_of(Hash)
@@ -980,7 +980,7 @@ describe Flac2mp3 do
980
980
  it "should map 'compilation' to 'TCMP'" do
981
981
  Flac2mp3.tag_mapping[:compilation].should == :TCMP
982
982
  end
983
-
983
+
984
984
  it "should map 'tag' to 'TIT1'" do
985
985
  Flac2mp3.tag_mapping[:tag].should == :TIT1
986
986
  end