audio_monster 1.1.2 → 1.2.0

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.
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