audio_monster 1.0.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 +7 -0
- data/.gitignore +15 -0
- data/.travis.yml +3 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +38 -0
- data/Rakefile +9 -0
- data/audio_monster.gemspec +29 -0
- data/lib/audio_monster/configuration.rb +143 -0
- data/lib/audio_monster/monster.rb +951 -0
- data/lib/audio_monster/version.rb +5 -0
- data/lib/audio_monster.rb +18 -0
- data/test/audio_monster_test.rb +20 -0
- data/test/files/test.flac +0 -0
- data/test/files/test.ogg +0 -0
- data/test/files/test_long.mp2 +0 -0
- data/test/files/test_long.mp3 +0 -0
- data/test/files/test_long.wav +0 -0
- data/test/files/test_long_2.mp2 +0 -0
- data/test/files/test_short.mp2 +0 -0
- data/test/files/test_short.wav +0 -0
- data/test/files/test_stereo.wav +0 -0
- data/test/minitest_helper.rb +24 -0
- data/test/monster_test.rb +111 -0
- metadata +177 -0
@@ -0,0 +1,18 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
require 'audio_monster/version'
|
4
|
+
require 'audio_monster/configuration'
|
5
|
+
require 'audio_monster/monster'
|
6
|
+
|
7
|
+
module AudioMonster
|
8
|
+
extend Configuration
|
9
|
+
|
10
|
+
def self.monster
|
11
|
+
@_monster ||= AudioMonster::Monster.new
|
12
|
+
end
|
13
|
+
|
14
|
+
# delegate to the monster inside
|
15
|
+
def self.method_missing(method, *args, &block)
|
16
|
+
monster.send(method, *args)
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require 'minitest_helper'
|
2
|
+
|
3
|
+
describe AudioMonster do
|
4
|
+
|
5
|
+
it 'has a version number' do
|
6
|
+
AudioMonster::VERSION.wont_be_nil
|
7
|
+
end
|
8
|
+
|
9
|
+
it 'has configuration options' do
|
10
|
+
AudioMonster.options.wont_be_nil
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'delegates methods to monster' do
|
14
|
+
AudioMonster.flac.must_equal 'flac'
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'returns an instance of monster' do
|
18
|
+
AudioMonster.monster.wont_be_nil
|
19
|
+
end
|
20
|
+
end
|
Binary file
|
data/test/files/test.ogg
ADDED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,24 @@
|
|
1
|
+
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
2
|
+
require 'audio_monster'
|
3
|
+
|
4
|
+
require 'minitest'
|
5
|
+
require 'minitest/autorun'
|
6
|
+
require 'minitest/spec'
|
7
|
+
require 'minitest/mock'
|
8
|
+
require 'fileutils'
|
9
|
+
|
10
|
+
def out_dir
|
11
|
+
File.expand_path(File.join(File.dirname(__FILE__), 'tmp'))
|
12
|
+
end
|
13
|
+
|
14
|
+
def out_file(o)
|
15
|
+
File.join(out_dir, o)
|
16
|
+
end
|
17
|
+
|
18
|
+
def in_dir
|
19
|
+
File.expand_path(File.join(File.dirname(__FILE__), 'files'))
|
20
|
+
end
|
21
|
+
|
22
|
+
def in_file(i)
|
23
|
+
File.join(in_dir, i)
|
24
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'minitest_helper'
|
2
|
+
|
3
|
+
describe AudioMonster::Monster do
|
4
|
+
|
5
|
+
let(:monster) { AudioMonster::Monster.new(logger: Logger.new('/dev/null')) }
|
6
|
+
|
7
|
+
before {
|
8
|
+
FileUtils.mkdir_p(out_dir)
|
9
|
+
}
|
10
|
+
|
11
|
+
it 'can create an mp2 from a wav file' do
|
12
|
+
# try to create the mp2
|
13
|
+
monster.encode_mp2_from_wav(in_file('test_long.wav'), out_file('out.mp2')).wont_be_nil
|
14
|
+
|
15
|
+
# now parse it and test that the info is right
|
16
|
+
mp2_info = Mp3Info.new(out_file('out.mp2'))
|
17
|
+
mp2_info.bitrate.must_equal 128
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'can validate an mpeg audio file\'s attributes' do
|
21
|
+
validations = {
|
22
|
+
:version=>2,
|
23
|
+
:layer=>3,
|
24
|
+
:channel_mode=>['Joint Stereo', 'Stereo'],
|
25
|
+
:channels=>2,
|
26
|
+
:sample_rate=>'<= 44000',
|
27
|
+
:bit_rate=>'< 100',
|
28
|
+
:per_channel_bit_rate=>'>= 256'
|
29
|
+
}
|
30
|
+
|
31
|
+
errors, info = monster.validate_mpeg(in_file('test_long.mp2'), validations)
|
32
|
+
# puts "\n\nerrors: " + errors.inspect
|
33
|
+
# puts "\n\ninfo: " + info.inspect
|
34
|
+
errors.keys.must_equal validations.keys
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should encode an mp2 from a mono wav' do
|
38
|
+
# try to create the mp2
|
39
|
+
monster.encode_mp2_from_wav(in_file('test_long.wav'), out_file('out_mono.mp2')).must_equal true
|
40
|
+
|
41
|
+
# now parse it and test that the info is right
|
42
|
+
mp2_info = Mp3Info.new(out_file('out_mono.mp2'))
|
43
|
+
|
44
|
+
mp2_info.mpeg_version.must_equal 1
|
45
|
+
mp2_info.layer.must_equal 2
|
46
|
+
mp2_info.bitrate.must_equal 128
|
47
|
+
mp2_info.samplerate.must_equal 44100
|
48
|
+
mp2_info.channel_mode.must_equal 'Single Channel'
|
49
|
+
mp2_info.header[:padding].must_equal false
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'should encode an mp2 from a stereo wav' do
|
53
|
+
# try to create the mp2
|
54
|
+
monster.encode_mp2_from_wav(in_file('test_stereo.wav'), out_file('out_stereo.mp2')).must_equal true
|
55
|
+
|
56
|
+
# now parse it and test that the info is right
|
57
|
+
mp2_info = Mp3Info.new(out_file('out_stereo.mp2'))
|
58
|
+
|
59
|
+
mp2_info.mpeg_version.must_equal 1
|
60
|
+
mp2_info.layer.must_equal 2
|
61
|
+
mp2_info.bitrate.must_equal 256
|
62
|
+
mp2_info.samplerate.must_equal 44100
|
63
|
+
mp2_info.channel_mode.must_equal "Stereo"
|
64
|
+
mp2_info.header[:padding].must_equal false
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'should get the length using soxi' do
|
68
|
+
info = monster.info_for_mpeg(in_file('test_long.mp2'))
|
69
|
+
info[:length].must_equal 48
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'should get info for ogg file' do
|
73
|
+
info = monster.info_for_ogg(in_file('test.ogg'))
|
74
|
+
info[:length].to_i.must_equal 12
|
75
|
+
info[:content_type].must_equal "audio/ogg"
|
76
|
+
end
|
77
|
+
|
78
|
+
|
79
|
+
it 'should create a wav wrapped mp2' do
|
80
|
+
start_at = '2010-06-19T00:00:00-04:00'
|
81
|
+
end_at = DateTime.parse(start_at) + 6.days
|
82
|
+
options = {}
|
83
|
+
options[:title] = "REMIX Episode 1"
|
84
|
+
options[:artist] = "PRX REMIX"
|
85
|
+
options[:cut_id] = "12345"
|
86
|
+
options[:start_at] = start_at
|
87
|
+
options[:end_at] = end_at
|
88
|
+
options[:producer_app_id] = 'PRX'
|
89
|
+
options[:no_pad_byte] = false
|
90
|
+
wave_file = out_file('test_long.wav')
|
91
|
+
monster.create_wav_wrapped_mp2(in_file('test_long.mp2'), out_file('test_long.wav'), options)
|
92
|
+
|
93
|
+
wave = NuWav::WaveFile.parse(wave_file)
|
94
|
+
|
95
|
+
wave.chunks[:cart].title.must_equal "REMIX Episode 1"
|
96
|
+
wave.chunks[:cart].artist.must_equal "PRX REMIX"
|
97
|
+
wave.chunks[:cart].cut_id.must_equal "12345"
|
98
|
+
wave.chunks[:cart].start_date.must_equal "2010/06/19"
|
99
|
+
wave.chunks[:cart].start_time.must_equal "00:00:00"
|
100
|
+
wave.chunks[:cart].end_date.must_equal "2010/06/25"
|
101
|
+
wave.chunks[:cart].end_time.must_equal "00:00:00"
|
102
|
+
wave.chunks[:cart].producer_app_id.must_equal "PRX"
|
103
|
+
end
|
104
|
+
|
105
|
+
it 'can slice a section out of an audio file' do
|
106
|
+
monster.slice_wav(in_file('test_long.wav'), out_file('slice.wav'), 10, 5).wont_be_nil
|
107
|
+
slice_wav = NuWav::WaveFile.parse(out_file('slice.wav'))
|
108
|
+
slice_wav.duration.must_equal 5
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
metadata
ADDED
@@ -0,0 +1,177 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: audio_monster
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Andrew Kuklewicz
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-01-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: nu_wav
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: mp3info
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: mimemagic
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: activesupport
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: bundler
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '1.7'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '1.7'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rake
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '10.0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '10.0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: minitest
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
description: audio_monster manipulates and transcodes audio
|
112
|
+
email:
|
113
|
+
- andrew@beginsinwonder.com
|
114
|
+
executables: []
|
115
|
+
extensions: []
|
116
|
+
extra_rdoc_files: []
|
117
|
+
files:
|
118
|
+
- ".gitignore"
|
119
|
+
- ".travis.yml"
|
120
|
+
- Gemfile
|
121
|
+
- LICENSE.txt
|
122
|
+
- README.md
|
123
|
+
- Rakefile
|
124
|
+
- audio_monster.gemspec
|
125
|
+
- lib/audio_monster.rb
|
126
|
+
- lib/audio_monster/configuration.rb
|
127
|
+
- lib/audio_monster/monster.rb
|
128
|
+
- lib/audio_monster/version.rb
|
129
|
+
- test/audio_monster_test.rb
|
130
|
+
- test/files/test.flac
|
131
|
+
- test/files/test.ogg
|
132
|
+
- test/files/test_long.mp2
|
133
|
+
- test/files/test_long.mp3
|
134
|
+
- test/files/test_long.wav
|
135
|
+
- test/files/test_long_2.mp2
|
136
|
+
- test/files/test_short.mp2
|
137
|
+
- test/files/test_short.wav
|
138
|
+
- test/files/test_stereo.wav
|
139
|
+
- test/minitest_helper.rb
|
140
|
+
- test/monster_test.rb
|
141
|
+
homepage: https://github.com/PRX/audio-monster
|
142
|
+
licenses:
|
143
|
+
- MIT
|
144
|
+
metadata: {}
|
145
|
+
post_install_message:
|
146
|
+
rdoc_options: []
|
147
|
+
require_paths:
|
148
|
+
- lib
|
149
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
150
|
+
requirements:
|
151
|
+
- - ">="
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: '0'
|
154
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
155
|
+
requirements:
|
156
|
+
- - ">="
|
157
|
+
- !ruby/object:Gem::Version
|
158
|
+
version: '0'
|
159
|
+
requirements: []
|
160
|
+
rubyforge_project:
|
161
|
+
rubygems_version: 2.2.2
|
162
|
+
signing_key:
|
163
|
+
specification_version: 4
|
164
|
+
summary: audio_monster manipulates and transcodes audio
|
165
|
+
test_files:
|
166
|
+
- test/audio_monster_test.rb
|
167
|
+
- test/files/test.flac
|
168
|
+
- test/files/test.ogg
|
169
|
+
- test/files/test_long.mp2
|
170
|
+
- test/files/test_long.mp3
|
171
|
+
- test/files/test_long.wav
|
172
|
+
- test/files/test_long_2.mp2
|
173
|
+
- test/files/test_short.mp2
|
174
|
+
- test/files/test_short.wav
|
175
|
+
- test/files/test_stereo.wav
|
176
|
+
- test/minitest_helper.rb
|
177
|
+
- test/monster_test.rb
|