record_me 0.0.1

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.
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in record_me.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Marco Gallardo
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,89 @@
1
+ # RecordMe
2
+
3
+ record_me gem is a very simple gem that allows you to record user's audio input by using a simple javascript interface and an already built flash object. If you have questions about why I opted using flash and other info, you might want to take a look to my post [What? Rails can't hear you? Use Flash!](http://www.tangosource.com/blog/What-rails-cant-hear-you-use-flash/)
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'record_me'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install record_me
18
+
19
+ Run generators:
20
+
21
+ $ rails generate record_me:install
22
+ $ rails generate record_me:initialize
23
+
24
+ ## Usage
25
+
26
+ ## Configuration file
27
+
28
+ Specify default settings:
29
+
30
+ * __top__: sets top absolute position of flash object window. Default is 40%.
31
+ * __left__: sets left absolute position of flash object window. Default is 40%.
32
+ * __time__: sets recording limit of seconds; maximum available are 180 seconds (3 minutes). Default is 30 seconds.
33
+ * __name__: sets name of the record. Default is record.wav.
34
+ * __destination__: the folder where all your records will be placed. Default is public/records.
35
+
36
+ __top__, __left__, __time__, and __name__ can be overridden in your views as you will see next.
37
+
38
+ ### In your view
39
+
40
+ Add next CSS class selectors to your HTML elements:
41
+
42
+ * __.record\_me\_timer__: attaches a counter in seconds to the element
43
+ * __.record\_me\_start__: when element with this selector is clicked, it triggers recording action
44
+ * __.record\_me\_stop__: when element with this selector is clicked, recording stops
45
+ * __.record\_me\_reproduce__: when element with this selector is clicked, recorded audio is reproduced
46
+ * __.record\_me\_save__: when element with this selector is clicked, recorded audio is sent to server
47
+
48
+ Then add next function to your view (since it will embed js code in your view you may want to add it at the bottom of your view/layout):
49
+
50
+ __record\_me\_js({save\_path: some\_path})__
51
+
52
+ where __save\_path__ is the path of the action where the recorded audio will be sent once element with .record\_me\_save class is clicked.
53
+
54
+ Also, you can pass *time, name, top, and left* values to override config/record_me.yml settings.
55
+
56
+ Example of how the code would look:
57
+
58
+ `<%= link_to 'Save', '#', :class => 'record_me_save'%>`
59
+ `<div class='record_me_timer'></div>`
60
+ `<div class='record_me_start'>Start</div>`
61
+ `<div class='record_me_stop'>Stop</div>`
62
+ `<div class='record_me_reproduce'>Reproduce</div>`
63
+ `<%= record_me_js({save_path: audios_save_path, time: 3, name:'my_record.wav'}) %>`
64
+
65
+ ### In your controller
66
+
67
+ Go to the action defined for __save\_path__ and add just add __record\_me\_save__. 'true' will be returned if file was successfully created.
68
+
69
+ ### Flash warning message
70
+
71
+ Additionally you can display a message asking to install Flash if it is not installed, just call .flash\_warning\_message method and pass it the class of the html element you want to display the message:
72
+
73
+ `<div class='flash_warning'></div>`
74
+ `<%= flash_warning_message('flash_warning') %>`
75
+
76
+ That's it!
77
+
78
+ ## Wish list
79
+
80
+ * Add tests
81
+ * Ensure Rails 4.x compatibility
82
+
83
+ ## Contributing
84
+
85
+ 1. Fork it
86
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
87
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
88
+ 4. Push to the branch (`git push origin my-new-feature`)
89
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,23 @@
1
+ module RecordMe
2
+
3
+ # the Authorization configuration file path
4
+ @file = Dir.pwd + '/config/record_me.yml'
5
+
6
+ # Configure
7
+ def self.configure
8
+ if @file
9
+ # interpret it using YAML using the current environment to extract the configuration
10
+ @config = YAML.load( File.read(@file) )[ Rails.env ]
11
+ end
12
+
13
+ # creates directory where all records will be saved
14
+ directory = Dir.pwd + "/#{@config['destination']}"
15
+ Dir.mkdir(directory) unless File.directory?(directory)
16
+ end
17
+
18
+ def self.configuration
19
+ @config
20
+ end
21
+ end
22
+
23
+ RecordMe.configure
@@ -0,0 +1,27 @@
1
+ # set custom configuration for record_me
2
+ # top => sets absolute top position
3
+ # left => sets absolute top position
4
+ # time => sets the time to record expressed in seconds; max 3 minutes (180 sec.)
5
+ # destination => the directory where records will be saved
6
+
7
+ development:
8
+ top: 40%
9
+ left: 40%
10
+ time: 30
11
+ name: record.wav
12
+ destination: public/records
13
+
14
+ #staging:
15
+ # top: 40%
16
+ # left: 40%
17
+ # time: 30
18
+ # name: record.wav
19
+ # destination: public/records
20
+
21
+ #production:
22
+ # top: 40%
23
+ # left: 40%
24
+ # time: 30
25
+ # name: record.wav
26
+ # destination: public/records
27
+
@@ -0,0 +1,245 @@
1
+ /*
2
+ * jRecorder Plugin for jQuery JavaScript Library (Alpha)
3
+ * http://www.sajithmr.me/jrecorder
4
+ *
5
+ * Copyright (c) 2011 - 2013 Sajithmr.ME
6
+ * Dual licensed under the MIT and GPL licenses.
7
+ * - http://www.opensource.org/licenses/mit-license.php
8
+ * - http://www.gnu.org/copyleft/gpl.html
9
+ *
10
+ * Author: Sajith Amma
11
+ * Version: 1.1
12
+ * Date: 14 December 2011
13
+ */
14
+
15
+ /* Code is not verified using http://www.jshint.com/ */
16
+
17
+
18
+ (function ($){
19
+
20
+
21
+ var methods = {
22
+ play : function( options ) {
23
+
24
+ alert(options);
25
+
26
+ },
27
+ pause : function( ) { }
28
+
29
+ };
30
+
31
+
32
+ var jRecorderSettings = {} ;
33
+
34
+ $.jRecorder = function( options, element ) {
35
+ // allow instantiation without initializing for simple inheritance
36
+
37
+
38
+ if(typeof(options) == "string")
39
+ {
40
+ if ( methods[options] )
41
+ {
42
+ return methods[ options ].apply( this, Array.prototype.slice.call( arguments, 1 ));
43
+
44
+ }
45
+ return false;
46
+ }
47
+
48
+ //if the element to be appended is not defind, append to body
49
+ if(element == undefined)
50
+ {
51
+ element = $("body");
52
+ }
53
+
54
+ //default settings
55
+ var settings = {
56
+
57
+ 'rec_width': '300',
58
+ 'rec_height': '200',
59
+ 'rec_top': '0px',
60
+ 'rec_left': '0px',
61
+ 'recorderlayout_id' : 'flashrecarea',
62
+ 'recorder_id' : 'audiorecorder',
63
+ 'recorder_name': 'audiorecorder',
64
+ 'wmode' : 'transparent',
65
+ 'bgcolor': '#ff0000',
66
+ 'swf_path': 'jRecorder.swf',
67
+ 'host': 'acceptfile.php?filename=hello.wav',
68
+ 'callback_started_recording' : function(){},
69
+ 'callback_finished_recording' : function(){},
70
+ 'callback_stopped_recording': function(){},
71
+ 'callback_error_recording' : function(){},
72
+ 'callback_activityTime': function(time){},
73
+ 'callback_activityLevel' : function(level){}
74
+
75
+
76
+
77
+
78
+
79
+ };
80
+
81
+
82
+ //if option array is passed, merget the values
83
+ if ( options ) {
84
+ $.extend( settings, options );
85
+ }
86
+
87
+ jRecorderSettings = settings;
88
+
89
+
90
+ var myNav = navigator.userAgent.toLowerCase();
91
+ var ie = (myNav.indexOf('msie') != -1) ? true : false;
92
+ if(ie && parseInt(myNav.split('msie')[1]) <= 8) {
93
+ var objStr = '<object name="'+ settings['recorder_name'] +'" id="' + settings['recorder_id'] + '" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="'+ settings['rec_width'] +'" height="'+ settings['rec_height']+'"></object>';
94
+
95
+ var paramStr = [
96
+ '<param name="movie" value="'+ settings['swf_path'] + '?host=' + settings['host'] + '" />',
97
+
98
+ '<param name="allowScriptAccess" value="always" />',
99
+ '<param name="bgcolor" value="' + settings['bgcolor'] + '" />',
100
+ '<param name="wmode" value="' + settings['wmode'] + '" />'
101
+ ];
102
+
103
+ htmlObj = document.createElement(objStr);
104
+ for(var i=0; i < paramStr.length; i++) {
105
+ htmlObj.appendChild(document.createElement(paramStr[i]));
106
+ }
107
+
108
+
109
+ //var divStr = ' <div id="'+ settings['recorderlayout_id'] +'" style="position:absolute;top:0px;left:0px;z-index:-1" ></div>';
110
+ //var divObj = document.createElement(divStr);
111
+
112
+
113
+ } else {
114
+ var createParam = function(el, n, v) {
115
+ var p = document.createElement("param");
116
+ p.setAttribute("name", n);
117
+ p.setAttribute("value", v);
118
+ el.appendChild(p);
119
+ };
120
+
121
+ htmlObj = document.createElement("object");
122
+ htmlObj.setAttribute("id", settings['recorder_id'] );
123
+ htmlObj.setAttribute("name", settings['recorder_name'] );
124
+ htmlObj.setAttribute("data", settings['swf_path'] + '?host=' + settings['host'] );
125
+ htmlObj.setAttribute("type", "application/x-shockwave-flash");
126
+ htmlObj.setAttribute("width", settings['rec_width']); // Non-zero
127
+ htmlObj.setAttribute("height", settings['rec_height']); // Non-zero
128
+
129
+ createParam(htmlObj, "allowscriptaccess", "always");
130
+ createParam(htmlObj, "bgcolor", settings['bgcolor']);
131
+ createParam(htmlObj, "wmode", settings['wmode'] );
132
+
133
+
134
+
135
+
136
+ }
137
+
138
+
139
+ var divObj = document.createElement("div");
140
+
141
+ divObj.setAttribute("id", settings['recorderlayout_id']);
142
+ divObj.setAttribute("style", "position:absolute;top:"+ settings['rec_top'] +";left:"+ settings['rec_left'] +";z-index:-1");
143
+
144
+ divObj.appendChild(htmlObj);
145
+
146
+
147
+ element.append(divObj);
148
+
149
+
150
+
151
+
152
+
153
+
154
+
155
+
156
+ };
157
+
158
+ //function call to start a recording
159
+ $.jRecorder.record = function(max_time){
160
+
161
+
162
+ //change z-index to make it top
163
+ $( '#' + jRecorderSettings['recorderlayout_id'] ).css('z-index', 1000);
164
+ getFlashMovie(jRecorderSettings['recorder_name']).jStartRecording(max_time);
165
+
166
+
167
+
168
+ }
169
+
170
+ //function call to stop recording
171
+ $.jRecorder.stop = function(){
172
+
173
+ getFlashMovie(jRecorderSettings['recorder_name']).jStopRecording();
174
+
175
+ }
176
+
177
+ //function call to send wav data to server url from the init configuration
178
+ $.jRecorder.sendData = function(){
179
+
180
+ getFlashMovie(jRecorderSettings['recorder_name']).jSendFileToServer();
181
+
182
+ }
183
+
184
+ $.jRecorder.callback_started_recording = function(){
185
+
186
+
187
+ jRecorderSettings['callback_started_recording']();
188
+
189
+ }
190
+
191
+
192
+ $.jRecorder.callback_finished_recording = function(){
193
+
194
+ jRecorderSettings['callback_finished_recording']();
195
+
196
+ }
197
+
198
+ $.jRecorder.callback_error_recording = function(){
199
+
200
+ jRecorderSettings['callback_error_recording']();
201
+
202
+ }
203
+
204
+ $.jRecorder.callback_stopped_recording = function(){
205
+
206
+ jRecorderSettings['callback_stopped_recording']();
207
+ }
208
+
209
+
210
+ $.jRecorder.callback_finished_sending = function(){
211
+
212
+ jRecorderSettings['callback_finished_sending']();
213
+
214
+ }
215
+
216
+ $.jRecorder.callback_activityLevel = function(level){
217
+
218
+ jRecorderSettings['callback_activityLevel'](level);
219
+
220
+ }
221
+
222
+ $.jRecorder.callback_activityTime = function(time){
223
+
224
+ //put back flash while recording
225
+ $( '#' + jRecorderSettings['recorderlayout_id'] ).css('z-index', -1);
226
+
227
+ jRecorderSettings['callback_activityTime'](time);
228
+
229
+ }
230
+
231
+
232
+
233
+
234
+ //function to return flash object from name
235
+ function getFlashMovie(movieName) {
236
+ var isIE = navigator.appName.indexOf("Microsoft") != -1;
237
+ return (isIE) ? window[movieName] : document[movieName];
238
+ }
239
+
240
+
241
+
242
+ })(jQuery);
243
+
244
+
245
+
Binary file
@@ -0,0 +1,16 @@
1
+ require 'rails/generators'
2
+
3
+ module RecordMe
4
+ class InitializeGenerator < ::Rails::Generators::Base
5
+ source_root File.expand_path('..', __FILE__)
6
+
7
+ desc "This generator adds all RecordMe configuration files to your app"
8
+
9
+ # copy config files
10
+ def copy_initializer_file
11
+
12
+ copy_file "../../config/initializer/record_me.rb", "config/initializers/record_me.rb"
13
+ copy_file "../../config/record_me.yml", "config/record_me.yml"
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,15 @@
1
+ require 'rails/generators'
2
+
3
+ module RecordMe
4
+ class InstallGenerator < ::Rails::Generators::Base
5
+ source_root File.expand_path('../assets', __FILE__)
6
+
7
+ desc "This generator adds all RecordMe required files to your assets"
8
+
9
+ # all public methods in here will be run in order
10
+ def copy_assets
11
+ copy_file "../../assets/javascripts/jRecorder.js", "app/assets/javascripts/jRecorder.js"
12
+ copy_file "../../assets/swfs/jRecorder.swf", "app/assets/swfs/jRecorder.swf"
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,4 @@
1
+ Rails.application.configure do
2
+ # Uncomment this to turn on verbose mode
3
+ # config.my_gem.verbose = true
4
+ end
data/lib/record_me.rb ADDED
@@ -0,0 +1,13 @@
1
+ require "record_me/controller.rb"
2
+ require "record_me/helpers.rb"
3
+ require "generators/install_generator.rb"
4
+ require "generators/initialize_generator.rb"
5
+
6
+ ActiveSupport.on_load(:action_controller) do
7
+ include RecordMe::Controller
8
+ end
9
+
10
+ ActiveSupport.on_load(:action_view) do
11
+ include RecordMe::Helpers
12
+ end
13
+
@@ -0,0 +1,20 @@
1
+ module RecordMe
2
+ module Controller
3
+ def record_me_save(filename = params[:filename])
4
+ audio = request.raw_post
5
+ file_with_path = RecordMe.configuration["destination"] + "/" + filename
6
+
7
+ return save_file(file_with_path, audio)
8
+ end
9
+
10
+ private
11
+
12
+ def save_file(file_with_path, audio)
13
+ File.open(file_with_path, 'w+b'){|file| file.puts audio}
14
+
15
+ File.exist?(file_with_path) ? true : false
16
+ end
17
+
18
+ end
19
+ end
20
+
@@ -0,0 +1,77 @@
1
+ module RecordMe
2
+ module Helpers
3
+
4
+ def flash_warning_message(html_element)
5
+ javascript_tag do
6
+ ("
7
+ $(function() {\n\
8
+ var flash_supported = (typeof navigator.plugins != \"undefined\" && typeof navigator.plugins[\"Shockwave Flash\"] == \"object\");\n\
9
+ if(!flash_supported){\n\
10
+ var append_message = \".#{html_element || '.flash_warning_message'}\";\n\
11
+ $(append_message).append(\"Please install <a href='https://get.adobe.com/flashplayer/' target='_blank'>Adobe Flash Player</a> to use RecordMe.\");\n\
12
+ }\n\
13
+ })\n\
14
+ ").html_safe
15
+ end
16
+ end
17
+
18
+ def record_me_js(options = {})
19
+ javascript_tag do
20
+ ("\n\
21
+ $(function(){\n\
22
+ $('body').prepend('<div id=record_me_location></div>');\n\
23
+ var recorderLocation = $('#record_me_location')[0];\n\
24
+ var recorderStart = $('.record_me_start')[0];\n\
25
+ var recorderStop = $('.record_me_stop')[0];\n\
26
+ var recorderSendData = $('.record_me_save')[0];\n\
27
+ var recorderReproduce = $('.record_me_reproduce')[0];\n\
28
+ $.jRecorder(\n\
29
+ {\n\
30
+ rec_top: \"#{options[:top] || RecordMe.configuration['top']}\",\n\
31
+ rec_left: \"#{options[:left] || RecordMe.configuration['left']}\",\n\
32
+ host: \"#{options[:save_path] || ''}?filename=#{options[:name] || RecordMe.configuration['name']}\",\n\
33
+ callback_started_recording: function(){callback_started(); },\n\
34
+ callback_stopped_recording: function(){callback_stopped(); },\n\
35
+ callback_activityLevel: function(level){callback_activityLevel(level); },\n\
36
+ callback_activityTime: function(time){callback_activityTime(time);},\n\
37
+ callback_finished_sending: function(time){ callback_finished_sending() },\n\
38
+ swf_path : \"/assets/jRecorder.swf\",\n\
39
+ }, $(recorderLocation));\n\
40
+
41
+ $(recorderStart).click(function(){\n\
42
+ $.jRecorder.record(#{options[:time] || 30});\n\
43
+ });\n\
44
+
45
+ $(recorderStop).click(function(){\n\
46
+ $.jRecorder.stop();\n\
47
+ });\n\
48
+
49
+ $(recorderReproduce).click(function(){\n\
50
+ //jRecorder doesn't have an option to reproduce the clip, by stopping it we can accomplish that\n\
51
+ $.jRecorder.stop();\n\
52
+ });\n\
53
+
54
+ $(recorderSendData).click(function(){\n\
55
+ $.jRecorder.sendData();
56
+ });\n\
57
+
58
+ function callback_activityTime(time)\n\
59
+ {\n\
60
+ var time = parseInt(time);\n\
61
+ var minutes = Math.floor(time/60);\n\
62
+ var seconds = time % 60;\n\
63
+ timer(time, minutes, seconds);\n\
64
+ };\n\
65
+
66
+ function timer(time, minutes, seconds){\n\
67
+ seconds = ((time % 60) < 10) ? ('0' + seconds.toString()) : seconds.toString();\n\
68
+ $('.record_me_timer').html(minutes.toString() + ':' + seconds.toString());\n\
69
+ };\n\
70
+ })\n\
71
+
72
+ ").html_safe
73
+ end
74
+ end
75
+
76
+ end
77
+ end
@@ -0,0 +1,3 @@
1
+ module RecordMe
2
+ VERSION = "0.0.1"
3
+ end
data/record_me.gemspec ADDED
@@ -0,0 +1,23 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'record_me/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "record_me"
8
+ spec.version = RecordMe::VERSION
9
+ spec.authors = ["Marco Gallardo"]
10
+ spec.email = ["marco.gallardo@tangosource.com"]
11
+ spec.description = %q{Record sounds}
12
+ spec.summary = %q{Record sounds}
13
+ spec.homepage = ""
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ end
metadata ADDED
@@ -0,0 +1,103 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: record_me
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 1
9
+ version: 0.0.1
10
+ platform: ruby
11
+ authors:
12
+ - Marco Gallardo
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2015-01-22 00:00:00 -06:00
18
+ default_executable:
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: bundler
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - ~>
26
+ - !ruby/object:Gem::Version
27
+ segments:
28
+ - 1
29
+ - 3
30
+ version: "1.3"
31
+ type: :development
32
+ version_requirements: *id001
33
+ - !ruby/object:Gem::Dependency
34
+ name: rake
35
+ prerelease: false
36
+ requirement: &id002 !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ segments:
41
+ - 0
42
+ version: "0"
43
+ type: :development
44
+ version_requirements: *id002
45
+ description: Record sounds
46
+ email:
47
+ - marco.gallardo@tangosource.com
48
+ executables: []
49
+
50
+ extensions: []
51
+
52
+ extra_rdoc_files: []
53
+
54
+ files:
55
+ - .gitignore
56
+ - Gemfile
57
+ - LICENSE.txt
58
+ - README.md
59
+ - Rakefile
60
+ - config/initializer/record_me.rb
61
+ - config/record_me.yml
62
+ - lib/assets/javascripts/jRecorder.js
63
+ - lib/assets/swfs/jRecorder.swf
64
+ - lib/generators/initialize_generator.rb
65
+ - lib/generators/install_generator.rb
66
+ - lib/generators/templates/initializer.rb
67
+ - lib/record_me.rb
68
+ - lib/record_me/controller.rb
69
+ - lib/record_me/helpers.rb
70
+ - lib/record_me/version.rb
71
+ - record_me.gemspec
72
+ has_rdoc: true
73
+ homepage: ""
74
+ licenses:
75
+ - MIT
76
+ post_install_message:
77
+ rdoc_options: []
78
+
79
+ require_paths:
80
+ - lib
81
+ required_ruby_version: !ruby/object:Gem::Requirement
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ segments:
86
+ - 0
87
+ version: "0"
88
+ required_rubygems_version: !ruby/object:Gem::Requirement
89
+ requirements:
90
+ - - ">="
91
+ - !ruby/object:Gem::Version
92
+ segments:
93
+ - 0
94
+ version: "0"
95
+ requirements: []
96
+
97
+ rubyforge_project:
98
+ rubygems_version: 1.3.6
99
+ signing_key:
100
+ specification_version: 3
101
+ summary: Record sounds
102
+ test_files: []
103
+