audio_monster 1.2.3 → 1.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +3 -2
- data/README.md +16 -8
- data/lib/audio_monster/configuration.rb +1 -6
- data/lib/audio_monster/monster.rb +1 -88
- data/lib/audio_monster/version.rb +1 -1
- data/test/audio_monster_test.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c2f4df3869b78f65dc95459fe8bcb28d306a30e1
|
4
|
+
data.tar.gz: f13f261b25dc162762ff3988ec6a909f7f7a1201
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b98ae9df3cc40799244ac59b21e3e481d7c90d421c9543a8af0615aa909ab2f80a3094311e57f0831dbab9b4709caf59bb33d4db75e524db89833597693ac48c
|
7
|
+
data.tar.gz: 2e760fb680f90fa4bc4619063894a8fdfa48e80baf97673d4cc868c0b0ab1b8d2c7d1d18503c3b0b16131328a09b4cff3be009981796a8302c0d5537ebbdea77
|
data/.travis.yml
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
language: ruby
|
2
2
|
rvm:
|
3
3
|
- "2.2.1"
|
4
|
+
- "2.3.1"
|
4
5
|
before_install:
|
5
|
-
- sudo add-apt-repository ppa:
|
6
|
+
- sudo add-apt-repository ppa:jonathonf/ffmpeg -y
|
6
7
|
- sudo apt-get update -qq
|
7
|
-
- sudo apt-get install -qq libsndfile1-dev
|
8
|
+
- sudo apt-get install -qq libsndfile1-dev libsox-fmt-all lame mp3val sox twolame
|
8
9
|
- sudo apt-get install -qq ffmpeg
|
data/README.md
CHANGED
@@ -1,20 +1,20 @@
|
|
1
1
|
# AudioMonster
|
2
2
|
|
3
3
|
AudioMonster manipulates and transcodes audio.
|
4
|
-
It wraps a number of different command line binaries such as sox, lame,
|
4
|
+
It wraps a number of different command line binaries such as sox, lame, twolame, and ffmpeg.
|
5
|
+
|
6
|
+
[![Build Status](https://travis-ci.org/PRX/audio_monster.svg?branch=master)](https://travis-ci.org/PRX/audio_monster)
|
5
7
|
|
6
8
|
## Dependencies
|
7
9
|
|
8
|
-
The following binary tools are required. They are available via most OS package managers.
|
10
|
+
The following binary tools are required. They are available via most OS package managers.
|
9
11
|
|
10
12
|
For OS X use homebrew:
|
11
13
|
|
12
14
|
```
|
13
15
|
brew install lame
|
14
|
-
brew install flac
|
15
16
|
brew install sox
|
16
17
|
brew install twolame --frontend
|
17
|
-
brew install madplay
|
18
18
|
brew install mp3val
|
19
19
|
brew install ffmpeg
|
20
20
|
```
|
@@ -26,10 +26,8 @@ http://wiki.centos.org/TipsAndTricks/MultimediaOnCentOS7
|
|
26
26
|
|
27
27
|
```
|
28
28
|
yum install lame
|
29
|
-
yum install
|
30
|
-
yum install
|
31
|
-
yum install twolame
|
32
|
-
yum install madplay
|
29
|
+
yum install sox
|
30
|
+
yum install twolame
|
33
31
|
yum install mp3val
|
34
32
|
yum install ffmpeg
|
35
33
|
yum install libsndfile-devel libsndfile-utils
|
@@ -61,6 +59,16 @@ For convenience, all methods can be called from the AudioMonster module.
|
|
61
59
|
|
62
60
|
The `monster_test.rb` contains examples of method calls.
|
63
61
|
|
62
|
+
## Development
|
63
|
+
To print potential expect checks, I sometimes change `AudioMonster`:
|
64
|
+
```ruby
|
65
|
+
def self.method_missing(method, *args, &block)
|
66
|
+
r = monster.send(method, *args)
|
67
|
+
puts "audio_monster.expect(:#{method}, #{r}, #{args.map { |a| a.class.name }})"
|
68
|
+
r
|
69
|
+
end
|
70
|
+
```
|
71
|
+
|
64
72
|
## Contributing
|
65
73
|
|
66
74
|
1. Fork it ( https://github.com/[my-github-username]/audio_monster/fork )
|
@@ -12,8 +12,6 @@ module AudioMonster
|
|
12
12
|
MP3VAL_WARNING_RE = /WARNING/
|
13
13
|
MP3VAL_ERROR_RE = /ERROR/
|
14
14
|
MP3VAL_IGNORE_RE = /(^Done!|Non-layer-III frame encountered. See related INFO message for details.|No supported tags in the file|It seems that file is truncated or there is garbage at the end of the file|MPEG stream error, resynchronized successfully)/
|
15
|
-
MPCK_ERROR_RE = /(mpck:|errors)/
|
16
|
-
MPCK_IGNORE_RE = /errors(\s*)(CRC error|none)/
|
17
15
|
LAME_SUCCESS_RE = /0/
|
18
16
|
LAME_ERROR_RE = /fatal error/
|
19
17
|
SOX_ERROR_RE = /error:/
|
@@ -35,7 +33,7 @@ module AudioMonster
|
|
35
33
|
|
36
34
|
AES46_2002_TIME_FORMAT = '%H:%M:%S'
|
37
35
|
|
38
|
-
BINARIES_KEYS = [:file, :ffmpeg, :ffprobe, :
|
36
|
+
BINARIES_KEYS = [:file, :ffmpeg, :ffprobe, :lame, :mp3val, :sox, :soxi, :twolame].freeze
|
39
37
|
|
40
38
|
VALID_OPTIONS_KEYS = ([
|
41
39
|
:logger,
|
@@ -115,13 +113,10 @@ module AudioMonster
|
|
115
113
|
self.file = 'file'
|
116
114
|
self.ffmpeg = 'ffmpeg'
|
117
115
|
self.ffprobe = 'ffprobe'
|
118
|
-
self.flac = 'flac'
|
119
116
|
self.lame = 'lame'
|
120
|
-
self.mpck = 'mpck'
|
121
117
|
self.mp3val = 'mp3val'
|
122
118
|
self.sox = 'sox'
|
123
119
|
self.soxi = 'soxi'
|
124
|
-
self.madplay = 'madplay'
|
125
120
|
self.twolame = 'twolame'
|
126
121
|
self
|
127
122
|
end
|
@@ -24,6 +24,7 @@ module AudioMonster
|
|
24
24
|
COMMON_EXTENSIONS = {
|
25
25
|
'application/xml' => 'xml',
|
26
26
|
'audio/mpeg' => 'mp3',
|
27
|
+
'audio/flac' => 'flac',
|
27
28
|
'audio/mp4' => 'm4a',
|
28
29
|
'audio/ogg' => 'ogg',
|
29
30
|
'image/jpeg' => 'jpg',
|
@@ -170,39 +171,6 @@ module AudioMonster
|
|
170
171
|
ranges
|
171
172
|
end
|
172
173
|
|
173
|
-
def encode_wav_pcm_from_mpeg(original_path, wav_path, options={})
|
174
|
-
logger.info "encode_wav_pcm_from_mpeg: #{original_path}, #{wav_path}, #{options.inspect}"
|
175
|
-
# check to see if there is an original
|
176
|
-
check_local_file(original_path)
|
177
|
-
|
178
|
-
logger.debug "encode_wav_pcm_from_mpeg: start"
|
179
|
-
command = "#{bin(:madplay)} -Q -i --output=wave:'#{wav_path}' '#{original_path}'"
|
180
|
-
|
181
|
-
out, err = run_command(command)
|
182
|
-
|
183
|
-
# check to see if there is a file created, or don't go on.
|
184
|
-
check_local_file(wav_path)
|
185
|
-
return [out, err]
|
186
|
-
end
|
187
|
-
|
188
|
-
def encode_wav_pcm_from_flac(original_path, wav_path, options={})
|
189
|
-
logger.info "encode_wav_pcm_from_flac: #{original_path}, #{wav_path}, #{options.inspect}"
|
190
|
-
# check to see if there is an original
|
191
|
-
check_local_file(original_path)
|
192
|
-
|
193
|
-
logger.debug "encode_wav_pcm_from_mpeg: start"
|
194
|
-
command = "#{bin(:flac)} -s -f --decode '#{original_path}' --output-name='#{wav_path}'"
|
195
|
-
out, err = run_command(command)
|
196
|
-
|
197
|
-
# check to see if there is a file created, or don't go on.
|
198
|
-
check_local_file(wav_path)
|
199
|
-
return [out, err]
|
200
|
-
end
|
201
|
-
|
202
|
-
alias encode_wav_pcm_from_mp2 encode_wav_pcm_from_mpeg
|
203
|
-
alias encode_wav_pcm_from_mp3 encode_wav_pcm_from_mpeg
|
204
|
-
|
205
|
-
# experimental...should work on any ffmpeg compatible file
|
206
174
|
def decode_audio(original_path, wav_path, options={})
|
207
175
|
# check to see if there is an original
|
208
176
|
logger.info "decode_audio: #{original_path}, #{wav_path}, #{options.inspect}"
|
@@ -771,44 +739,6 @@ module AudioMonster
|
|
771
739
|
return true
|
772
740
|
end
|
773
741
|
|
774
|
-
def append_mp3_to_wav(wav_path, mp3_path, out_path, add_length, fade_length=5)
|
775
|
-
# raise "append_mp3_to_wav: Can't find file to create mp3 preview of: #{mp3_path}" unless File.exist?(mp3_path)
|
776
|
-
|
777
|
-
mp3info = Mp3Info.new(mp3_path)
|
778
|
-
raise "mp3 is not sufficiently long enough (#{mp3info.length.to_i}) to add length (#{add_length})" if mp3info.length.to_i < add_length
|
779
|
-
append_length = [mp3info.length.to_i, (add_length - 1)].min
|
780
|
-
append_fade_length = [mp3info.length.to_i, fade_length].min
|
781
|
-
|
782
|
-
|
783
|
-
# find out if the wav file is stereo or mono as this meeds to match the wav from the mp3
|
784
|
-
wavinfo = info_for_wav(wav_path)
|
785
|
-
channels = wavinfo[:channel_mode] == 'Mono' ? 1 : 2
|
786
|
-
sample_rate = wavinfo[:sample_rate]
|
787
|
-
append_file = nil
|
788
|
-
|
789
|
-
begin
|
790
|
-
append_file = create_temp_file(mp3_path)
|
791
|
-
append_file.close
|
792
|
-
|
793
|
-
# create the mp3 to append
|
794
|
-
command = "#{bin(:madplay)} -q -o wave:- '#{mp3_path}' - | #{bin(:sox)} -t wav - -t raw -s -b 16 -c #{channels} - trim 0 #{append_length} | #{bin(:sox)} -t raw -r #{sample_rate} -s -b 16 -c #{channels} - -t wav - fade h 0 #{append_length} #{append_fade_length} | #{bin(:sox)} -t wav - -t wav '#{append_file.path}' pad 1 0"
|
795
|
-
out, err = run_command(command)
|
796
|
-
response = out + err
|
797
|
-
response.split("\n").each{ |out| raise("append_mp3_to_wav: create append file error: '#{response}' on:\n #{command}") if out =~ SOX_ERROR_RE }
|
798
|
-
|
799
|
-
# append the files to out_filew
|
800
|
-
command = "#{bin(:sox)} -t wav '#{wav_path}' -t wav '#{append_file.path}' -t wav '#{out_path}'"
|
801
|
-
out, err = run_command(command)
|
802
|
-
response = out + err
|
803
|
-
response.split("\n").each{ |out| raise("append_mp3_to_wav: create append file error: '#{response}' on:\n #{command}") if out =~ SOX_ERROR_RE }
|
804
|
-
ensure
|
805
|
-
append_file.close rescue nil
|
806
|
-
append_file.unlink rescue nil
|
807
|
-
end
|
808
|
-
|
809
|
-
return true
|
810
|
-
end
|
811
|
-
|
812
742
|
def normalize_wav(wav_path, out_path, level=-9)
|
813
743
|
logger.info "normalize_wav: wav_path:#{wav_path}, level:#{level}"
|
814
744
|
command = "#{bin(:sox)} -t wav '#{wav_path}' -t wav '#{out_path}' gain -n #{level.to_i}"
|
@@ -824,10 +754,6 @@ module AudioMonster
|
|
824
754
|
|
825
755
|
info = mp3info_validation(audio_file_path, options)
|
826
756
|
|
827
|
-
# there are condtions where this spews output uncontrollably - so lose it for now: AK on 20080915
|
828
|
-
# e.g. mpck:/home/app/mediajoint/tmp/audio_monster/prxfile-66097_111955868219902-0:3366912:read error
|
829
|
-
# mpck_validation(audio_file_path, errors) if errors.size <= 0
|
830
|
-
|
831
757
|
# if the format seems legit, check the audio itself
|
832
758
|
mp3val_validation(audio_file_path, options)
|
833
759
|
|
@@ -1016,19 +942,6 @@ module AudioMonster
|
|
1016
942
|
end
|
1017
943
|
end
|
1018
944
|
|
1019
|
-
def mpck_validation(audio_file_path, options)
|
1020
|
-
errors= []
|
1021
|
-
# validate using mpck
|
1022
|
-
response = run_command("nice -n 19 #{bin(:mpck)} #{audio_file_path}")
|
1023
|
-
response.split("\n").each { |o|
|
1024
|
-
if ((o =~ MPCK_ERROR_RE) && !(o =~ MPCK_IGNORE_RE))
|
1025
|
-
errors << "is not a valid mp2 file. The file is bad according to the 'mpck' audio check."
|
1026
|
-
end
|
1027
|
-
}
|
1028
|
-
|
1029
|
-
errors
|
1030
|
-
end
|
1031
|
-
|
1032
945
|
def method_missing(name, *args, &block)
|
1033
946
|
if name.to_s.starts_with?('encode_wav_pcm_from_')
|
1034
947
|
decode_audio(*args)
|
data/test/audio_monster_test.rb
CHANGED
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.
|
4
|
+
version: 1.3.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:
|
11
|
+
date: 2018-03-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nu_wav
|