audio_monster 1.1.2 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3a057b2a1f3a759502c32a054151db67b29c7f94
4
- data.tar.gz: 8dc01f649e809dedc68c1530bc58a591071cf32b
3
+ metadata.gz: a8ff1806c90f459f01c8c8c804be6a9924f37e91
4
+ data.tar.gz: 93fab5211b9c7c2663353071ac67916d0f5fc700
5
5
  SHA512:
6
- metadata.gz: 228c4f3616a61b1e9bb0fa49baf2e8ae4dbac65f2c13916d4b121f196f1ae5272c3382f5f65944e7dfd09014ce6fdfd3eacf2aa958bda5dd74335696ac557fe3
7
- data.tar.gz: f433d041ae8ea1d4ba0c964ebd6bb879e8ea48b77b436c104b0ed93995b2c53f7e1ef274fc772a2c1eee14ad302d591c5f756969bc0d1e0b9fa6fdba44820783
6
+ metadata.gz: e4485524174726a344b16386d0fdfb3aca441948bd8cb5de59b3449395206329206a0b2e72b509d01b56e166cf40944fb73fdf283bf242e7f75c9208fbf1ac5e
7
+ data.tar.gz: 4c5441ac587e4bd2d76e074cf5cfc1b7ef2514e9ec3323bd986930c033d535f37acc3c0c1e30901e97903b226cc920689ce8f94274766bfe82f39952ada3a891
@@ -35,7 +35,7 @@ module AudioMonster
35
35
 
36
36
  AES46_2002_TIME_FORMAT = '%H:%M:%S'
37
37
 
38
- BINARIES_KEYS = [:file, :ffmpeg, :flac, :lame, :mpck, :mp3val, :sox, :soxi, :madplay, :twolame].freeze
38
+ BINARIES_KEYS = [:file, :ffmpeg, :ffprobe, :flac, :lame, :mpck, :mp3val, :sox, :soxi, :madplay, :twolame].freeze
39
39
 
40
40
  VALID_OPTIONS_KEYS = ([
41
41
  :logger,
@@ -114,6 +114,7 @@ module AudioMonster
114
114
  self.tmp_dir = '/tmp/audio_monster'
115
115
  self.file = 'file'
116
116
  self.ffmpeg = 'ffmpeg'
117
+ self.ffprobe = 'ffprobe'
117
118
  self.flac = 'flac'
118
119
  self.lame = 'lame'
119
120
  self.mpck = 'mpck'
@@ -11,6 +11,7 @@ require 'nu_wav'
11
11
  require 'tempfile'
12
12
  require 'mimemagic'
13
13
  require 'digest/sha2'
14
+ require 'bigdecimal'
14
15
 
15
16
  module AudioMonster
16
17
 
@@ -252,38 +253,74 @@ module AudioMonster
252
253
  end
253
254
 
254
255
  def info_for_audio(path)
256
+ info = audio_file_info_ffprobe(path)
255
257
  {
256
- :size => File.size(path),
257
- :content_type => (MimeMagic.by_path(path) || MimeMagic.by_magic(path)).to_s,
258
- :channel_mode => audio_file_channels(path) <= 1 ? 'Mono' : 'Stereo',
259
- :bit_rate => audio_file_bit_rate(path),
260
- :length => audio_file_duration(path),
261
- :sample_rate => audio_file_sample_rate(path)
258
+ size: info['format']['size'].to_i,
259
+ content_type: (MimeMagic.by_path(path) || MimeMagic.by_magic(path)).to_s,
260
+ format: audio_file_format(path, info),
261
+ channel_mode: audio_file_channels(path, info) <= 1 ? 'Mono' : 'Stereo',
262
+ bit_rate: audio_file_bit_rate(path, info),
263
+ length: audio_file_duration(path, info),
264
+ sample_rate: audio_file_sample_rate(path, info)
262
265
  }
263
266
  end
264
267
 
265
- def audio_file_duration(path)
266
- audio_file_info(path, 'D').to_f
268
+ def audio_file_format(path, info = nil)
269
+ info ||= audio_file_info_ffprobe(path)
270
+ f = info['format']['format_name']
271
+ if f == 'mp3'
272
+ stream = info['streams'].detect { |s| s['codec_type'] == 'audio' }
273
+ f = stream['codec_name']
274
+ end
275
+ f.downcase
276
+ end
277
+
278
+ def audio_file_duration(path, info = nil)
279
+ # audio_file_info_soxi(path, 'D').to_f
280
+ info ||= audio_file_info_ffprobe(path)
281
+ info['format']['duration'].to_f
267
282
  end
268
283
 
269
- def audio_file_channels(path)
270
- audio_file_info(path, 'c').to_i
284
+ def audio_file_channels(path, info = nil)
285
+ # audio_file_info_soxi(path, 'c').to_i
286
+ info ||= audio_file_info_ffprobe(path)
287
+ stream = info['streams'].detect { |s| s['codec_type'] == 'audio' }
288
+ stream['channels'].to_i
271
289
  end
272
290
 
273
- def audio_file_sample_rate(path)
274
- audio_file_info(path, 'r').to_i
291
+ def audio_file_sample_rate(path, info = nil)
292
+ # audio_file_info_soxi(path, 'r').to_i
293
+ info ||= audio_file_info_ffprobe(path)
294
+ stream = info['streams'].detect { |s| s['codec_type'] == 'audio' }
295
+ stream['sample_rate'].to_i
275
296
  end
276
297
 
277
- def audio_file_bit_rate(path)
278
- audio_file_info(path, 'B').to_i
298
+ def audio_file_bit_rate(path, info = nil)
299
+ # audio_file_info_soxi(path, 'B').to_i
300
+ info ||= audio_file_info_ffprobe(path)
301
+ stream = info['streams'].detect { |s| s['codec_type'] == 'audio' }
302
+ bit_rate = stream['bit_rate'] || info['format']['bit_rate']
303
+ (BigDecimal.new(bit_rate) / 1000).round
279
304
  end
280
305
 
281
- def audio_file_info(path, flag)
306
+ def audio_file_info_soxi(path, flag)
282
307
  check_local_file(path)
283
308
  out, err = run_command("#{bin(:soxi)} -V0 -#{flag} '#{path}'", nice: 'n', echo_return: false)
284
309
  out.chomp
285
310
  end
286
311
 
312
+ def audio_file_info_ffprobe(path)
313
+ check_local_file(path)
314
+ cmd = bin(:ffprobe) +
315
+ " -v quiet -print_format json -show_format -show_streams" +
316
+ " '#{path}'"
317
+ out, err = run_command(cmd, nice: 'n', echo_return: false)
318
+ json = out.chomp
319
+ JSON.parse(json)
320
+ end
321
+
322
+ alias audio_file_info audio_file_info_ffprobe
323
+
287
324
  # valid options
288
325
  # :sample_rate
289
326
  # :bit_rate
@@ -984,6 +1021,5 @@ module AudioMonster
984
1021
  def get_lame_channel_mode(channel_mode)
985
1022
  ["Stereo", "JStereo"].include?(channel_mode) ? "j" : "m"
986
1023
  end
987
-
988
1024
  end
989
1025
  end
@@ -1,5 +1,5 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
 
3
3
  module AudioMonster
4
- VERSION = "1.1.2"
4
+ VERSION = '1.2.0'
5
5
  end
@@ -84,7 +84,6 @@ describe AudioMonster::Monster do
84
84
  info[:content_type].must_equal "audio/ogg"
85
85
  end
86
86
 
87
-
88
87
  it 'should create a wav wrapped mp2' do
89
88
  start_at = '2010-06-19T00:00:00-04:00'
90
89
  end_at = DateTime.parse(start_at) + 6.days
@@ -129,4 +128,55 @@ describe AudioMonster::Monster do
129
128
  File.basename(file.path)[0, 64].must_equal Digest::SHA256.hexdigest(base_file_name)
130
129
  File.extname(file.path).must_equal '.exten'
131
130
  end
131
+
132
+ describe 'test info' do
133
+ let(:audio_files) do
134
+ {
135
+ 'test_short.mp2' => ['mp2', 5, 2, 48000, 256],
136
+ 'test_long.mp3' => ['mp3', 48, 1, 44100, 128],
137
+ 'test.ogg' => ['ogg', 12, 2, 44100, 128],
138
+ 'test.flac' => ['flac', 15, 2, 44100, 246],
139
+ 'test_short.wav' => ['wav', 5, 2, 48000, 1536]
140
+ }
141
+ end
142
+
143
+ it 'can get the ffprobe info on a file' do
144
+ audio_files.keys.each do |file|
145
+ info = monster.audio_file_info_ffprobe(in_file(file))
146
+ info.wont_be_nil
147
+ info['streams'].wont_be_nil
148
+ info['format'].wont_be_nil
149
+ end
150
+ end
151
+
152
+ it 'can get the format of a file' do
153
+ audio_files.keys.each do |file|
154
+ monster.audio_file_format(in_file(file)).must_equal audio_files[file][0]
155
+ end
156
+ end
157
+
158
+ it 'can get the duration of a file' do
159
+ audio_files.keys.each do |file|
160
+ monster.audio_file_duration(in_file(file)).to_i.must_equal audio_files[file][1]
161
+ end
162
+ end
163
+
164
+ it 'can get the number of channels for a file' do
165
+ audio_files.keys.each do |file|
166
+ monster.audio_file_channels(in_file(file)).must_equal audio_files[file][2]
167
+ end
168
+ end
169
+
170
+ it 'can get the sample rate of a file' do
171
+ audio_files.keys.each do |file|
172
+ monster.audio_file_sample_rate(in_file(file)).must_equal audio_files[file][3]
173
+ end
174
+ end
175
+
176
+ it 'can get the bit rate of a file' do
177
+ audio_files.keys.each do |file|
178
+ monster.audio_file_bit_rate(in_file(file)).must_equal audio_files[file][4]
179
+ end
180
+ end
181
+ end
132
182
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: audio_monster
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.2
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Kuklewicz
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-02 00:00:00.000000000 Z
11
+ date: 2015-06-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: nu_wav