thingfish-processor-mp3 0.1.pre20161114101332

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 1505fe072de36708f9174f85fd94ee9f87034063
4
+ data.tar.gz: 72169bff7affe8f15cc37431d49c63967378e658
5
+ SHA512:
6
+ metadata.gz: d7b0e23ba171c5b4ed3d93ca448e6438b7349f87ef05f2dd1394667ebcbf9174ebe4548febcaa435102b127c3c6a10c77d425bb538445216d34685a9d6d7aa9f
7
+ data.tar.gz: cd99a5c9e3ef314c78381e69138e1a51172ecab323796f9e831e9d93188fdf17cbaeb6a59dee865d0b0fc3db613e90efbaaadfc606caf0a5ff9de1d7e2633fe5
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ README.md
3
+ ChangeLog.md
4
+
5
+ LICENSE.txt
data/.editorconfig ADDED
@@ -0,0 +1,14 @@
1
+ # http://EditorConfig.org
2
+
3
+ # top-most EditorConfig file
4
+ root = true
5
+
6
+ # Unix-style newlines with a newline ending every file
7
+ [*]
8
+ end_of_line = lf
9
+ insert_final_newline = true
10
+
11
+ # Tab indentation
12
+ [**.*]
13
+ indent_style = tab
14
+
data/.rdoc_options ADDED
@@ -0,0 +1,16 @@
1
+ --- !ruby/object:RDoc::Options
2
+ encoding: UTF-8
3
+ static_path: []
4
+ rdoc_include:
5
+ - .
6
+ charset: UTF-8
7
+ exclude:
8
+ hyperlink_all: false
9
+ line_numbers: false
10
+ main_page: README.md
11
+ markup: markdown
12
+ show_hash: false
13
+ tab_width: 8
14
+ title: Thingfish-Processor-MP3 Documentation
15
+ visibility: :protected
16
+ webcvs:
data/.simplecov ADDED
@@ -0,0 +1,9 @@
1
+ # Simplecov config
2
+
3
+ SimpleCov.start do
4
+ add_filter 'spec'
5
+ add_filter 'integration'
6
+ add_group "Needing tests" do |file|
7
+ file.covered_percent < 90
8
+ end
9
+ end
data/ChangeLog ADDED
@@ -0,0 +1,16 @@
1
+ 2016-11-13 Michael Granger <ged@FaerieMUD.org>
2
+
3
+ * .hgignore, History.md, Rakefile, lib/thingfish/processor/mp3.rb,
4
+ thingfish-processor-mp3.gemspec:
5
+ Add dependencies, update initial version, add gemspec.
6
+ [b0c42d67ea2f] [github/master, tip]
7
+
8
+ * .document, .editorconfig, .gems, .hgignore, .pryrc, .rdoc_options,
9
+ .ruby-gemset, .ruby-version, .simplecov, Gemfile, History.md,
10
+ LICENSE.txt, Manifest.txt, README.md, Rakefile, certs/ged.pem,
11
+ lib/thingfish/processor/mp3.rb, spec/data/APIC-1-image.mp3,
12
+ spec/data/APIC-2-images.mp3, spec/data/PIC-1-image.mp3,
13
+ spec/data/PIC-2-images.mp3, spec/spec_helper.rb,
14
+ spec/thingfish/processor/mp3_spec.rb:
15
+ Exported from Thingfish
16
+ [2405efefa05e]
data/History.md ADDED
@@ -0,0 +1,4 @@
1
+ ## v0.1.0 [YYYY-MM-DD] Michael Granger <ged@FaerieMUD.org>
2
+
3
+ Initial release.
4
+
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2016 Michael Granger
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Manifest.txt ADDED
@@ -0,0 +1,17 @@
1
+ .document
2
+ .editorconfig
3
+ .rdoc_options
4
+ .simplecov
5
+ ChangeLog
6
+ History.md
7
+ LICENSE.txt
8
+ Manifest.txt
9
+ README.md
10
+ Rakefile
11
+ lib/thingfish/processor/mp3.rb
12
+ spec/data/APIC-1-image.mp3
13
+ spec/data/APIC-2-images.mp3
14
+ spec/data/PIC-1-image.mp3
15
+ spec/data/PIC-2-images.mp3
16
+ spec/spec_helper.rb
17
+ spec/thingfish/processor/mp3_spec.rb
data/README.md ADDED
@@ -0,0 +1,75 @@
1
+ # Thingfish-Processor-MP3
2
+
3
+ home
4
+ : http://deveiate.org/projects/Thingfish-Processor-MP3
5
+
6
+ code
7
+ : http://bitbucket.org/ged/Thingfish-Processor-MP3
8
+
9
+ github
10
+ : https://github.com/ged/thingfish-processor-mp3
11
+
12
+ docs
13
+ : http://deveiate.org/code/thingfish-processor-mp3
14
+
15
+
16
+ ## Description
17
+
18
+
19
+
20
+
21
+ ## Prerequisites
22
+
23
+ * Ruby
24
+
25
+
26
+ ## Installation
27
+
28
+ $ gem install thingfish-processor-mp3
29
+
30
+
31
+ ## Contributing
32
+
33
+ You can check out the current development source with Mercurial via its
34
+ {project page}[http://bitbucket.org/ged/thingfish-processor-mp3]. Or if you prefer Git, via
35
+ {its Github mirror}[https://github.com/ged/thingfish-processor-mp3].
36
+
37
+ After checking out the source, run:
38
+
39
+ $ rake newb
40
+
41
+ This task will install any missing dependencies, run the tests/specs,
42
+ and generate the API documentation.
43
+
44
+
45
+ ## License
46
+
47
+ Copyright (c) 2016, Michael Granger
48
+ All rights reserved.
49
+
50
+ Redistribution and use in source and binary forms, with or without
51
+ modification, are permitted provided that the following conditions are met:
52
+
53
+ * Redistributions of source code must retain the above copyright notice,
54
+ this list of conditions and the following disclaimer.
55
+
56
+ * Redistributions in binary form must reproduce the above copyright notice,
57
+ this list of conditions and the following disclaimer in the documentation
58
+ and/or other materials provided with the distribution.
59
+
60
+ * Neither the name of the author/s, nor the names of the project's
61
+ contributors may be used to endorse or promote products derived from this
62
+ software without specific prior written permission.
63
+
64
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
65
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
66
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
67
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
68
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
69
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
70
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
71
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
72
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
73
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
74
+
75
+
data/Rakefile ADDED
@@ -0,0 +1,100 @@
1
+ #!/usr/bin/env rake
2
+
3
+ begin
4
+ require 'hoe'
5
+ rescue LoadError
6
+ abort "This Rakefile requires hoe (gem install hoe)"
7
+ end
8
+
9
+ GEMSPEC = 'thingfish-processor-mp3.gemspec'
10
+
11
+
12
+ Hoe.plugin :mercurial
13
+ Hoe.plugin :signing
14
+ Hoe.plugin :deveiate
15
+
16
+ Hoe.plugins.delete :rubyforge
17
+ Hoe.plugins.delete :gemcutter # Remove for public gems
18
+
19
+ hoespec = Hoe.spec 'thingfish-processor-mp3' do |spec|
20
+ spec.readme_file = 'README.md'
21
+ spec.history_file = 'History.md'
22
+ spec.extra_rdoc_files = FileList[ '*.rdoc', '*.md' ]
23
+ spec.urls = {
24
+ home: 'https://bitbucket.org/ged/thingfish-processor-mp3',
25
+ code: 'https://bitbucket.org/ged/thingfish-processor-mp3',
26
+ docs: 'https://deveiate.org/code/thingfish-processor-mp3',
27
+ github: 'https://github.com/ged/thingfish-processor-mp3',
28
+ }
29
+
30
+ spec.extra_rdoc_files = FileList[ '*.rdoc', '*.md' ]
31
+ spec.license 'BSD-3-Clause'
32
+
33
+ spec.developer 'Michael Granger', 'ged@FaerieMUD.org'
34
+
35
+ spec.dependency 'thingfish', '~> 0.5'
36
+ spec.dependency 'ruby-mp3info', '~> 0.8'
37
+ spec.dependency 'loggability', '~> 0.11'
38
+
39
+ spec.dependency 'hoe-deveiate', '~> 0.8', :developer
40
+ spec.dependency 'simplecov', '~> 0.12', :developer
41
+ spec.dependency 'rdoc-generator-fivefish', '~> 0.1', :developer
42
+
43
+ spec.require_ruby_version( '>=2.3.1' )
44
+ spec.hg_sign_tags = true if spec.respond_to?( :hg_sign_tags= )
45
+ spec.check_history_on_release = true if spec.respond_to?( :check_history_on_release= )
46
+
47
+ self.rdoc_locations << "deveiate:/usr/local/www/public/code/#{remote_rdoc_dir}"
48
+ end
49
+
50
+
51
+ ENV['VERSION'] ||= hoespec.spec.version.to_s
52
+
53
+ # Run the tests before checking in
54
+ task 'hg:precheckin' => [ :check_history, :check_manifest, :gemspec, :spec ]
55
+
56
+ task :test => :spec
57
+
58
+ # Rebuild the ChangeLog immediately before release
59
+ task :prerelease => 'ChangeLog'
60
+ CLOBBER.include( 'ChangeLog' )
61
+
62
+ desc "Build a coverage report"
63
+ task :coverage do
64
+ ENV["COVERAGE"] = 'yes'
65
+ Rake::Task[:spec].invoke
66
+ end
67
+ CLOBBER.include( 'coverage' )
68
+
69
+
70
+ # Use the fivefish formatter for docs generated from development checkout
71
+ if File.directory?( '.hg' )
72
+ require 'rdoc/task'
73
+
74
+ Rake::Task[ 'docs' ].clear
75
+ RDoc::Task.new( 'docs' ) do |rdoc|
76
+ rdoc.main = "README.rdoc"
77
+ rdoc.markup = 'markdown'
78
+ rdoc.rdoc_files.include( "*.rdoc", "ChangeLog", "lib/**/*.rb" )
79
+ rdoc.generator = :fivefish
80
+ rdoc.title = 'Thingfish-Processor-MP3'
81
+ rdoc.rdoc_dir = 'doc'
82
+ end
83
+ end
84
+
85
+ task :gemspec => GEMSPEC
86
+ file GEMSPEC => __FILE__
87
+ task GEMSPEC do |task|
88
+ spec = $hoespec.spec
89
+ spec.files.delete( '.gemtest' )
90
+ spec.signing_key = nil
91
+ spec.cert_chain = Rake::FileList[ 'certs/*.pem' ].to_a
92
+ spec.version = "#{spec.version.bump}.pre#{Time.now.strftime("%Y%m%d%H%M%S")}"
93
+ File.open( task.name, 'w' ) do |fh|
94
+ fh.write( spec.to_ruby )
95
+ end
96
+ end
97
+ CLOBBER.include( GEMSPEC.to_s )
98
+
99
+ task :default => :gemspec
100
+
@@ -0,0 +1,177 @@
1
+ # -*- ruby -*-
2
+ #encoding: utf-8
3
+
4
+ require 'mp3info'
5
+
6
+ require 'strelka'
7
+ require 'thingfish' unless defined?( Thingfish )
8
+ require 'thingfish/processor' unless defined?( Thingfish::Processor )
9
+
10
+
11
+ # Attach ID3 data to an mp3, along with any embedded album art as a related resource.
12
+ class Thingfish::Processor::MP3 < Thingfish::Processor
13
+ extend Loggability
14
+
15
+
16
+ # Package version
17
+ VERSION = '0.1.0'
18
+
19
+ # Version control revision
20
+ REVISION = %q$Revision: b0c42d67ea2f $
21
+
22
+
23
+ # Loggability API -- log to the :thingfish logger
24
+ log_to :thingfish
25
+
26
+ # The list of handled types
27
+ handled_types 'audio/mpeg', 'audio/mpg', 'audio/mp3'
28
+
29
+
30
+ # Null character
31
+ NULL = "\x0"
32
+
33
+ # Attached picture "PIC"
34
+ # Frame size $xx xx xx
35
+ # ---- mp3info is 'helpfully' cropping out frame size.
36
+ # Text encoding $xx
37
+ # Image format $xx xx xx
38
+ # Picture type $xx
39
+ # Description <textstring> $00 (00)
40
+ # Picture data <binary data>
41
+ PIC_FORMAT = 'h a3 h Z* a*'
42
+
43
+ # Attached picture "APIC"
44
+ # Text encoding $xx
45
+ # MIME type <text string> $00
46
+ # Picture type $xx
47
+ # Description <text string according to encoding> $00 (00)
48
+ # Picture data <binary data>
49
+ APIC_FORMAT = 'h Z* h Z* a*'
50
+
51
+
52
+ ### Synchronous processor API -- extract metadata from uploaded MP3s
53
+ def on_request( request )
54
+ mp3info = Mp3Info.new( request.body )
55
+
56
+ mp3_metadata = self.extract_id3_metadata( mp3info )
57
+ request.add_metadata( mp3_metadata )
58
+
59
+ self.extract_images( mp3info ) do |imageio, metadata|
60
+ metadata[:title] = "Album art for %s - %s" % mp3_metadata.values_at( 'mp3:artist', 'mp3:title' )
61
+ request.add_related_resource( imageio, metadata )
62
+ end
63
+ end
64
+
65
+
66
+ ### Normalize metadata from the MP3Info object and return it as a hash.
67
+ def extract_id3_metadata( mp3info )
68
+ self.log.debug "Extracting MP3 metadata"
69
+
70
+ mp3_metadata = {
71
+ 'mp3:frequency' => mp3info.samplerate,
72
+ 'mp3:bitrate' => mp3info.bitrate,
73
+ 'mp3:vbr' => mp3info.vbr,
74
+ 'mp3:title' => mp3info.tag.title,
75
+ 'mp3:artist' => mp3info.tag.artist,
76
+ 'mp3:album' => mp3info.tag.album,
77
+ 'mp3:year' => mp3info.tag.year,
78
+ 'mp3:genre' => mp3info.tag.genre,
79
+ 'mp3:tracknum' => mp3info.tag.tracknum,
80
+ 'mp3:comments' => mp3info.tag.comments,
81
+ }
82
+
83
+ # ID3V2 2.2.0 has three-letter tags, so map those if the artist info isn't set
84
+ if mp3info.hastag2?
85
+ if mp3_metadata['mp3:artist'].nil?
86
+ self.log.debug " extracting old-style ID3v2 info" % [mp3info.tag2.version]
87
+
88
+ mp3_metadata.merge!({
89
+ 'mp3:title' => mp3info.tag2.TT2,
90
+ 'mp3:artist' => mp3info.tag2.TP1,
91
+ 'mp3:album' => mp3info.tag2.TAL,
92
+ 'mp3:year' => mp3info.tag2.TYE,
93
+ 'mp3:tracknum' => mp3info.tag2.TRK,
94
+ 'mp3:comments' => mp3info.tag2.COM,
95
+ 'mp3:genre' => mp3info.tag2.TCO,
96
+ })
97
+ end
98
+ end
99
+
100
+ self.log.debug " raw metadata: %p" % [ mp3_metadata ]
101
+ return sanitize_values( mp3_metadata )
102
+ end
103
+
104
+
105
+ ### Extract image data from ID3 information, supports both APIC (2.3) and the older style
106
+ ### PIC (2.2). Return value is a hash with IO keys and mimetype values.
107
+ ### {
108
+ ### io => { format => 'image/jpeg' }
109
+ ### io2 => { format => 'image/jpeg' }
110
+ ### }
111
+ def extract_images( mp3info )
112
+ self.log.debug "Extracting embedded images"
113
+ raise LocalJumpError, "no block given" unless block_given?
114
+
115
+ unless mp3info.hastag2?
116
+ self.log.debug "...no id3v2 tag, so no embedded images possible."
117
+ return
118
+ end
119
+
120
+ self.log.debug "...id3v2 tag present..."
121
+
122
+ if mp3info.tag2.APIC
123
+ self.log.debug "...extracting APIC (id3v2.3+) image data."
124
+
125
+ images = [ mp3info.tag2.APIC ].flatten
126
+ images.each do |img|
127
+ blob, mime = img.unpack( APIC_FORMAT ).values_at( 4, 1 )
128
+ yield( StringIO.new(blob),
129
+ :format => mime,
130
+ :extent => blob.length,
131
+ :relationship => 'album-art' )
132
+ end
133
+
134
+ elsif mp3info.tag2.PIC
135
+ self.log.debug "...extracting PIC (id3v2.2) image data."
136
+
137
+ images = [ mp3info.tag2.PIC ].flatten
138
+ images.each do |img|
139
+ blob, type = img.unpack( PIC_FORMAT ).values_at( 4, 1 )
140
+ mime = Mongrel2::Config.mimetypes[ ".#{type.downcase}" ] or next
141
+ yield( StringIO.new(blob),
142
+ :format => mime,
143
+ :extent => blob.length,
144
+ :relationship => 'album-art' )
145
+ end
146
+
147
+ else
148
+ self.log.debug "...no known image tag types in tags: %p" % [ mp3info.tag2.keys.sort ]
149
+ end
150
+ end
151
+
152
+
153
+
154
+ #######
155
+ private
156
+ #######
157
+
158
+ ### Strip NULLs from the values of the given +metadata_hash+ and return it.
159
+ def sanitize_values( metadata_hash )
160
+ metadata_hash.each do |k,v|
161
+ case v
162
+ when String
163
+ metadata_hash[k] = v.chomp(NULL).strip
164
+ when Array
165
+ metadata_hash[k] = v.collect {|vv| vv.chomp(NULL).strip }
166
+ when Numeric, TrueClass, FalseClass
167
+ # No-op
168
+ end
169
+ end
170
+
171
+ return metadata_hash.delete_if {|_,v| v.nil? }
172
+ end
173
+
174
+
175
+ end # class Thingfish::Processor::MP3
176
+
177
+
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,49 @@
1
+ # -*- ruby -*-
2
+ #encoding: utf-8
3
+
4
+ require 'simplecov' if ENV['COVERAGE']
5
+
6
+ require 'rspec'
7
+
8
+ require 'mongrel2'
9
+ require 'mongrel2/testing'
10
+
11
+ require 'thingfish'
12
+ require 'thingfish/spechelpers'
13
+ require 'thingfish/processor/mp3'
14
+
15
+ require 'loggability/spechelpers'
16
+
17
+
18
+ module Thingfish::Processor::MP3::SpecHelpers
19
+
20
+ FIXTURE_DIR = Pathname( __FILE__ ).dirname + 'data'
21
+
22
+
23
+ ### Load and return the data from the fixture with the specified +filename+.
24
+ def fixture_data( filename )
25
+ fixture = FIXTURE_DIR + filename
26
+ return fixture.open( 'r', encoding: 'binary' )
27
+ end
28
+
29
+ end
30
+
31
+
32
+
33
+ ### Mock with RSpec
34
+ RSpec.configure do |config|
35
+ config.run_all_when_everything_filtered = true
36
+ config.filter_run :focus
37
+ config.order = 'random'
38
+ config.mock_with( :rspec ) do |mock|
39
+ mock.syntax = :expect
40
+ end
41
+
42
+ config.include( Mongrel2::SpecHelpers )
43
+ config.include( Thingfish::SpecHelpers )
44
+ config.include( Loggability::SpecHelpers )
45
+ config.include( Thingfish::Processor::MP3::SpecHelpers )
46
+ end
47
+
48
+
49
+
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative '../../spec_helper'
4
+
5
+ require 'rspec'
6
+
7
+ require 'thingfish'
8
+ require 'thingfish/processor'
9
+
10
+ require 'strelka'
11
+ require 'strelka/httprequest/metadata'
12
+
13
+
14
+ describe Thingfish::Processor, "MP3" do
15
+
16
+ before( :all ) do
17
+ Strelka::HTTPRequest.class_eval { include Strelka::HTTPRequest::Metadata }
18
+ end
19
+
20
+
21
+ let( :processor ) { described_class.create(:mp3) }
22
+
23
+ let( :factory ) do
24
+ Mongrel2::RequestFactory.new(
25
+ :route => '/',
26
+ :headers => {:accept => '*/*'})
27
+ end
28
+
29
+
30
+ it "extracts metadata from uploaded MP3 ID3 tags" do
31
+ req = factory.post( '/tf', fixture_data('APIC-1-image.mp3'), 'Content-type' => 'audio/mp3' )
32
+
33
+ processor.process_request( req )
34
+
35
+ expect( req.metadata ).to include( 'mp3:artist', 'mp3:bitrate', 'mp3:comments' )
36
+ end
37
+
38
+
39
+ it "attaches album art as a related resource" do
40
+ req = factory.post( '/tf', fixture_data('APIC-1-image.mp3'), 'Content-type' => 'audio/mp3' )
41
+
42
+ processor.process_request( req )
43
+
44
+ related = req.related_resources
45
+ expect( related.size ).to eq( 1 )
46
+ expect( related.values.first ).
47
+ to include( 'format' => 'image/jpeg', 'extent' => 7369, 'relationship' => 'album-art' )
48
+ expect( related.keys.first ).to respond_to( :read )
49
+ end
50
+
51
+ end
52
+
53
+ # vim: set nosta noet ts=4 sw=4 ft=rspec:
metadata ADDED
@@ -0,0 +1,234 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: thingfish-processor-mp3
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.pre20161114101332
5
+ platform: ruby
6
+ authors:
7
+ - Michael Granger
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain:
11
+ - |
12
+ -----BEGIN CERTIFICATE-----
13
+ MIIEbDCCAtSgAwIBAgIBATANBgkqhkiG9w0BAQsFADA+MQwwCgYDVQQDDANnZWQx
14
+ GTAXBgoJkiaJk/IsZAEZFglGYWVyaWVNVUQxEzARBgoJkiaJk/IsZAEZFgNvcmcw
15
+ HhcNMTYwODIwMTgxNzQyWhcNMTcwODIwMTgxNzQyWjA+MQwwCgYDVQQDDANnZWQx
16
+ GTAXBgoJkiaJk/IsZAEZFglGYWVyaWVNVUQxEzARBgoJkiaJk/IsZAEZFgNvcmcw
17
+ ggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAwggGKAoIBgQC/JWGRHO+USzR97vXjkFgt
18
+ 83qeNf2KHkcvrRTSnR64i6um/ziin0I0oX23H7VYrDJC9A/uoUa5nGRJS5Zw/+wW
19
+ ENcvWVZS4iUzi4dsYJGY6yEOsXh2CcF46+QevV8iE+UmbkU75V7Dy1JCaUOyizEt
20
+ TH5UHsOtUU7k9TYARt/TgYZKuaoAMZZd5qyVqhF1vV+7/Qzmp89NGflXf2xYP26a
21
+ 4MAX2qqKX/FKXqmFO+AGsbwYTEds1mksBF3fGsFgsQWxftG8GfZQ9+Cyu2+l1eOw
22
+ cZ+lPcg834G9DrqW2zhqUoLr1MTly4pqxYGb7XoDhoR7dd1kFE2a067+DzWC/ADt
23
+ +QkcqWUm5oh1fN0eqr7NsZlVJDulFgdiiYPQiIN7UNsii4Wc9aZqBoGcYfBeQNPZ
24
+ soo/6za/bWajOKUmDhpqvaiRv9EDpVLzuj53uDoukMMwxCMfgb04+ckQ0t2G7wqc
25
+ /D+K9JW9DDs3Yjgv9k4h7YMhW5gftosd+NkNC/+Y2CkCAwEAAaN1MHMwCQYDVR0T
26
+ BAIwADALBgNVHQ8EBAMCBLAwHQYDVR0OBBYEFHKN/nkRusdqCJEuq3lgB3fJvyTg
27
+ MBwGA1UdEQQVMBOBEWdlZEBGYWVyaWVNVUQub3JnMBwGA1UdEgQVMBOBEWdlZEBG
28
+ YWVyaWVNVUQub3JnMA0GCSqGSIb3DQEBCwUAA4IBgQAPJzKiT0zBU7kpqe0aS2qb
29
+ FI0PJ4y5I8buU4IZGUD5NEt/N7pZNfOyBxkrZkXhS44Fp+xwBH5ebLbq/WY78Bqd
30
+ db0z6ZgW4LMYMpWFfbXsRbd9TU2f52L8oMAhxOvF7Of5qJMVWuFQ8FPagk2iHrdH
31
+ inYLQagqAF6goWTXgAJCdPd6SNeeSNqA6vlY7CV1Jh5kfNJJ6xu/CVij1GzCLu/5
32
+ DMOr26DBv+qLJRRC/2h34uX71q5QgeOyxvMg+7V3u/Q06DXyQ2VgeeqiwDFFpEH0
33
+ PFkdPO6ZqbTRcLfNH7mFgCBJjsfSjJrn0sPBlYyOXgCoByfZnZyrIMH/UY+lgQqS
34
+ 6Von1VDsfQm0eJh5zYZD64ZF86phSR7mUX3mXItwH04HrZwkWpvgd871DZVR3i1n
35
+ w8aNA5re5+Rt/Vvjxj5AcEnZnZiz5x959NaddQocX32Z1unHw44pzRNUur1GInfW
36
+ p4vpx2kUSFSAGjtCbDGTNV2AH8w9OU4xEmNz8c5lyoA=
37
+ -----END CERTIFICATE-----
38
+ date: 2016-11-14 00:00:00.000000000 Z
39
+ dependencies:
40
+ - !ruby/object:Gem::Dependency
41
+ name: thingfish
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '0.5'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '0.5'
54
+ - !ruby/object:Gem::Dependency
55
+ name: ruby-mp3info
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '0.8'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '0.8'
68
+ - !ruby/object:Gem::Dependency
69
+ name: loggability
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '0.11'
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '0.11'
82
+ - !ruby/object:Gem::Dependency
83
+ name: hoe-mercurial
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '1.4'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '1.4'
96
+ - !ruby/object:Gem::Dependency
97
+ name: hoe-deveiate
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '0.8'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '0.8'
110
+ - !ruby/object:Gem::Dependency
111
+ name: hoe-highline
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '0.2'
117
+ type: :development
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '0.2'
124
+ - !ruby/object:Gem::Dependency
125
+ name: simplecov
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '0.12'
131
+ type: :development
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '0.12'
138
+ - !ruby/object:Gem::Dependency
139
+ name: rdoc-generator-fivefish
140
+ requirement: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '0.1'
145
+ type: :development
146
+ prerelease: false
147
+ version_requirements: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '0.1'
152
+ - !ruby/object:Gem::Dependency
153
+ name: rdoc
154
+ requirement: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: '4.0'
159
+ type: :development
160
+ prerelease: false
161
+ version_requirements: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - "~>"
164
+ - !ruby/object:Gem::Version
165
+ version: '4.0'
166
+ - !ruby/object:Gem::Dependency
167
+ name: hoe
168
+ requirement: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '3.15'
173
+ type: :development
174
+ prerelease: false
175
+ version_requirements: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: '3.15'
180
+ description: ''
181
+ email:
182
+ - ged@FaerieMUD.org
183
+ executables: []
184
+ extensions: []
185
+ extra_rdoc_files:
186
+ - History.md
187
+ - LICENSE.txt
188
+ - Manifest.txt
189
+ - README.md
190
+ files:
191
+ - ".document"
192
+ - ".editorconfig"
193
+ - ".rdoc_options"
194
+ - ".simplecov"
195
+ - ChangeLog
196
+ - History.md
197
+ - LICENSE.txt
198
+ - Manifest.txt
199
+ - README.md
200
+ - Rakefile
201
+ - lib/thingfish/processor/mp3.rb
202
+ - spec/data/APIC-1-image.mp3
203
+ - spec/data/APIC-2-images.mp3
204
+ - spec/data/PIC-1-image.mp3
205
+ - spec/data/PIC-2-images.mp3
206
+ - spec/spec_helper.rb
207
+ - spec/thingfish/processor/mp3_spec.rb
208
+ homepage: https://bitbucket.org/ged/thingfish-processor-mp3
209
+ licenses:
210
+ - BSD-3-Clause
211
+ metadata: {}
212
+ post_install_message:
213
+ rdoc_options:
214
+ - "--main"
215
+ - README.md
216
+ require_paths:
217
+ - lib
218
+ required_ruby_version: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - ">="
221
+ - !ruby/object:Gem::Version
222
+ version: 2.3.1
223
+ required_rubygems_version: !ruby/object:Gem::Requirement
224
+ requirements:
225
+ - - ">"
226
+ - !ruby/object:Gem::Version
227
+ version: 1.3.1
228
+ requirements: []
229
+ rubyforge_project:
230
+ rubygems_version: 2.5.1
231
+ signing_key:
232
+ specification_version: 4
233
+ summary: ''
234
+ test_files: []