audio_monster 1.2.3 → 1.3.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 +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
|
+
[](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
|