directwave 0.0.1 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +9 -0
- data/README.md +22 -29
- data/lib/directwave/uploader/accreditation.rb +43 -45
- data/lib/directwave/uploader/configuration.rb +3 -1
- data/lib/directwave/uploader/paths.rb +35 -38
- data/lib/directwave/uploader/versions.rb +15 -0
- data/lib/directwave/version.rb +1 -1
- metadata +19 -19
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -6,7 +6,7 @@ such as zencoder.com or pandastream.com.
|
|
6
6
|
|
7
7
|
It works well with Rack based web applications, such as Ruby on Rails.
|
8
8
|
|
9
|
-
Inspired by [CarrierWave](
|
9
|
+
Inspired by [CarrierWave](https://github.com/jnicklas/carrierwave) and used in [radiant.fm](http://radiant.fm).
|
10
10
|
|
11
11
|
## Information
|
12
12
|
|
@@ -15,7 +15,7 @@ Inspired by [CarrierWave](http://github.com/jnicklas/DirectWave) and used in [ra
|
|
15
15
|
|
16
16
|
## Getting Help
|
17
17
|
|
18
|
-
* Please report bugs on the [issue tracker]https://github.com/radiantfm/directwave/issues).
|
18
|
+
* Please report bugs on the [issue tracker](https://github.com/radiantfm/directwave/issues).
|
19
19
|
|
20
20
|
## Installation
|
21
21
|
|
@@ -26,16 +26,16 @@ Install the latest stable release:
|
|
26
26
|
In Rails, add it to your Gemfile:
|
27
27
|
|
28
28
|
``` ruby
|
29
|
-
gem
|
29
|
+
gem "directwave"
|
30
30
|
```
|
31
31
|
|
32
32
|
## Getting Started
|
33
33
|
|
34
|
-
Start off
|
34
|
+
Start off generating an uploader:
|
35
35
|
|
36
36
|
rails generate directwave Audio
|
37
37
|
|
38
|
-
this should give you
|
38
|
+
this should give you the following file:
|
39
39
|
|
40
40
|
app/uploaders/audio_uploader.rb
|
41
41
|
|
@@ -47,9 +47,9 @@ class AudioUploader < DirectWave::Uploader::Base
|
|
47
47
|
end
|
48
48
|
```
|
49
49
|
|
50
|
-
|
51
|
-
It is quite simple to mount uploaders on columns in your model,
|
52
|
-
|
50
|
+
Time after time you can use DirectWave together with an ORM.
|
51
|
+
It is quite simple to mount uploaders on columns in your model,
|
52
|
+
so in fact you can assign files and get going:
|
53
53
|
|
54
54
|
## ActiveRecord
|
55
55
|
|
@@ -67,8 +67,8 @@ class Track < ActiveRecord::Base
|
|
67
67
|
end
|
68
68
|
```
|
69
69
|
|
70
|
-
Now you can cache files by assigning them to the attribute,
|
71
|
-
|
70
|
+
Now you can cache files by assigning them to the attribute,
|
71
|
+
they will be stored automatically after the record save.
|
72
72
|
|
73
73
|
``` ruby
|
74
74
|
u = Track.new(:audio_from_key => params[:key])
|
@@ -79,7 +79,7 @@ u.audio.url # => '/url/to/file.png'
|
|
79
79
|
## Rails
|
80
80
|
|
81
81
|
You can use different flash uploaders for multiple direct upload,
|
82
|
-
such as [Uploadify](http://
|
82
|
+
such as [Uploadify](http://www.uploadify.com). For example in Rails with CoffeeScript and Nokogiri
|
83
83
|
generate uploader controller at first:
|
84
84
|
|
85
85
|
rails g controller Uploads new create
|
@@ -103,7 +103,7 @@ class UploadsController < ApplicationController
|
|
103
103
|
end
|
104
104
|
```
|
105
105
|
|
106
|
-
|
106
|
+
then in `assets/javascript/uploads.js.coffe` insert:
|
107
107
|
|
108
108
|
``` html
|
109
109
|
$(document).ready ->
|
@@ -149,8 +149,8 @@ in `views/uploads/new.html.erb`:
|
|
149
149
|
|
150
150
|
## Changing the directories
|
151
151
|
|
152
|
-
In order to change where uploaded files are stored,
|
153
|
-
method:
|
152
|
+
In order to change the location where uploaded files are stored,
|
153
|
+
just override the `store_dir` method:
|
154
154
|
|
155
155
|
``` ruby
|
156
156
|
class MyUploader < DirectWave::Uploader::Base
|
@@ -160,12 +160,11 @@ class MyUploader < DirectWave::Uploader::Base
|
|
160
160
|
end
|
161
161
|
```
|
162
162
|
|
163
|
-
If you want change where files will be uploaded, override the `upload_dir`
|
164
|
-
method:
|
163
|
+
If you want to change where files will be uploaded, override the `upload_dir` method:
|
165
164
|
|
166
165
|
``` ruby
|
167
166
|
class MyUploader < DirectWave::Uploader::Base
|
168
|
-
def
|
167
|
+
def upload_dir
|
169
168
|
'/my/upload/directory/tmp'
|
170
169
|
end
|
171
170
|
end
|
@@ -197,9 +196,7 @@ class Audio < DirectWave::Uploader::Base
|
|
197
196
|
label: "aac",
|
198
197
|
url: "s3://#{@uploader.s3_bucket}.s3.amazonaws.com/#{@uploader.versions[:aac].key}",
|
199
198
|
format: "aac",
|
200
|
-
notifications: [
|
201
|
-
{ url: "http://zencoderfetcher/", format: "json" }
|
202
|
-
]
|
199
|
+
notifications: [{ url: "http://zencoderfetcher/", format: "json" }]
|
203
200
|
} # aac
|
204
201
|
] # outputs
|
205
202
|
}
|
@@ -210,8 +207,8 @@ class Audio < DirectWave::Uploader::Base
|
|
210
207
|
end
|
211
208
|
```
|
212
209
|
|
213
|
-
When
|
214
|
-
The uploader could be used like this:
|
210
|
+
When the uploader is used, a version named aac will be created
|
211
|
+
which is processed with `process` method. The uploader could be used like this:
|
215
212
|
|
216
213
|
``` ruby
|
217
214
|
uploader.url # => '/url/to/original/file.png'
|
@@ -220,7 +217,7 @@ uploader.aac.url # => '/url/to/aac/file.png'
|
|
220
217
|
uploader.url(:aac) # => '/url/to/aac/file.png'
|
221
218
|
```
|
222
219
|
|
223
|
-
You can also override `global_process` method
|
220
|
+
You can also override `global_process` method which called after
|
224
221
|
all process within versions:
|
225
222
|
|
226
223
|
``` ruby
|
@@ -239,17 +236,13 @@ class Audio < DirectWave::Uploader::Base
|
|
239
236
|
label: "aac",
|
240
237
|
url: "s3://#{s3_bucket}.s3.amazonaws.com/#{versions[:aac].key}",
|
241
238
|
format: "aac",
|
242
|
-
notifications: [
|
243
|
-
{ url: "http://zencoderfetcher/", format: :json }
|
244
|
-
]
|
239
|
+
notifications: [{ url: "http://zencoderfetcher/", format: :json }]
|
245
240
|
}, # aac
|
246
241
|
{
|
247
242
|
label: "wav",
|
248
243
|
url: "s3://#{s3_bucket}.s3.amazonaws.com/#{versions[:wav].key}",
|
249
244
|
format: "wav",
|
250
|
-
notifications: [
|
251
|
-
{ url: "http://zencoderfetcher/", format: :json }
|
252
|
-
]
|
245
|
+
notifications: [{ url: "http://zencoderfetcher/", format: :json }]
|
253
246
|
} # wav
|
254
247
|
|
255
248
|
] # outputs
|
@@ -4,52 +4,50 @@ module DirectWave
|
|
4
4
|
module Accreditation
|
5
5
|
extend ActiveSupport::Concern
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
end
|
7
|
+
##
|
8
|
+
# === Returns
|
9
|
+
#
|
10
|
+
# [String] Amazon S3 acl
|
11
|
+
#
|
12
|
+
def s3_acl
|
13
|
+
@s3_acl ||= s3_access_policy.to_s.gsub("_", "-")
|
14
|
+
end
|
16
15
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
end # InstanceMethods
|
16
|
+
##
|
17
|
+
# === Returns
|
18
|
+
#
|
19
|
+
# [Boolean] Amazon S3 policy
|
20
|
+
#
|
21
|
+
def s3_policy
|
22
|
+
@s3_policy ||= Base64.encode64(
|
23
|
+
{
|
24
|
+
"expiration" => expiration_date,
|
25
|
+
"conditions" => [
|
26
|
+
{"bucket" => s3_bucket},
|
27
|
+
["starts-with", "$key", upload_dir],
|
28
|
+
{"acl" => s3_acl},
|
29
|
+
{"success_action_status" => "201"},
|
30
|
+
["content-length-range", 0, max_file_size],
|
31
|
+
["starts-with", "$Filename", ""],
|
32
|
+
['starts-with', '#{content_type}', '']
|
33
|
+
]
|
34
|
+
}.to_json
|
35
|
+
).gsub("\n","")
|
36
|
+
end
|
37
|
+
|
38
|
+
##
|
39
|
+
# === Returns
|
40
|
+
#
|
41
|
+
# [Boolean] Amazon S3 signature
|
42
|
+
#
|
43
|
+
def s3_signature
|
44
|
+
@s3_signature ||= Base64.encode64(
|
45
|
+
OpenSSL::HMAC.digest(
|
46
|
+
OpenSSL::Digest::Digest.new("sha1"),
|
47
|
+
s3_secret_access_key, s3_policy
|
48
|
+
)
|
49
|
+
).gsub("\n","")
|
50
|
+
end
|
53
51
|
|
54
52
|
private
|
55
53
|
|
@@ -17,6 +17,7 @@ module DirectWave
|
|
17
17
|
|
18
18
|
add_config :store_dir
|
19
19
|
add_config :upload_dir
|
20
|
+
add_config :cache_dir
|
20
21
|
|
21
22
|
reset_config
|
22
23
|
end
|
@@ -57,8 +58,9 @@ module DirectWave
|
|
57
58
|
config.max_file_size = 300.megabytes
|
58
59
|
config.expiration_date = 6.hours.from_now.utc.iso8601
|
59
60
|
|
60
|
-
config.store_dir
|
61
|
+
config.store_dir = "uploads"
|
61
62
|
config.upload_dir = "uploads/tmp"
|
63
|
+
config.cache_dir = 'uploads/cache'
|
62
64
|
end
|
63
65
|
end
|
64
66
|
end # ClassMethods
|
@@ -4,47 +4,44 @@ module DirectWave
|
|
4
4
|
module Paths
|
5
5
|
extend ActiveSupport::Concern
|
6
6
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
7
|
+
def url(version=:original)
|
8
|
+
versions[version.to_sym].url || default_url
|
9
|
+
end
|
10
|
+
|
11
|
+
def key(version=:original)
|
12
|
+
versions[version.to_sym].key
|
13
|
+
end
|
14
|
+
|
15
|
+
def default_url
|
16
|
+
puts "default_url"
|
17
|
+
end
|
18
|
+
|
19
|
+
def filename(part=nil)
|
20
|
+
return original_filename unless has_store_key?
|
19
21
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
filename_parts.unshift(unique_key) if unique_key
|
28
|
-
filename_parts.join("/")
|
29
|
-
end
|
30
|
-
|
31
|
-
def original_filename
|
32
|
-
model[mounted_as.to_s] if model.respond_to?(mounted_as)
|
33
|
-
end
|
22
|
+
key_path = store_key.split("/")
|
23
|
+
filename_parts = []
|
24
|
+
filename = filename_parts.unshift(key_path.pop)
|
25
|
+
unique_key = key_path.pop
|
26
|
+
filename_parts.unshift(unique_key) if unique_key
|
27
|
+
filename_parts.join("/")
|
28
|
+
end
|
34
29
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
30
|
+
def original_filename
|
31
|
+
model[mounted_as.to_s] if model.respond_to?(mounted_as)
|
32
|
+
end
|
33
|
+
|
34
|
+
def store_key=(string)
|
35
|
+
@store_key = string
|
36
|
+
end
|
42
37
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
38
|
+
def store_key
|
39
|
+
@store_key ||= "#{upload_dir}/#{guid}/${filename}"
|
40
|
+
end
|
41
|
+
|
42
|
+
def has_store_key?
|
43
|
+
@store_key.present? && !(@store_key =~ /#{Regexp.escape("${filename}")}\z/)
|
44
|
+
end
|
48
45
|
end # Paths
|
49
46
|
end # Uploader
|
50
47
|
|
@@ -35,12 +35,27 @@ module DirectWave
|
|
35
35
|
@filename = nil
|
36
36
|
@url = nil
|
37
37
|
@key = nil
|
38
|
+
@date = nil
|
38
39
|
end
|
39
40
|
|
40
41
|
def delete
|
41
42
|
file.delete if file.exists?
|
42
43
|
end
|
43
44
|
|
45
|
+
def retrieve
|
46
|
+
@data ||= file.read
|
47
|
+
begin
|
48
|
+
temp_file = Tempfile.new([extract(:basename), extract(:extname)], @uploader.cache_dir)
|
49
|
+
temp_file.binmode
|
50
|
+
temp_file.write(@data)
|
51
|
+
temp_file.flush
|
52
|
+
yield(temp_file)
|
53
|
+
ensure
|
54
|
+
# temp_file.close
|
55
|
+
#temp_file.unlink
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
44
59
|
private
|
45
60
|
|
46
61
|
def extract(part)
|
data/lib/directwave/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: directwave
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-04-18 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activesupport
|
16
|
-
requirement: &
|
16
|
+
requirement: &70104029175840 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '3.1'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70104029175840
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: uuid
|
27
|
-
requirement: &
|
27
|
+
requirement: &70104029172540 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>='
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: '0'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70104029172540
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: aws-sdk
|
38
|
-
requirement: &
|
38
|
+
requirement: &70104029170460 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ! '>='
|
@@ -43,10 +43,10 @@ dependencies:
|
|
43
43
|
version: '0'
|
44
44
|
type: :runtime
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70104029170460
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: rails
|
49
|
-
requirement: &
|
49
|
+
requirement: &70104029169380 !ruby/object:Gem::Requirement
|
50
50
|
none: false
|
51
51
|
requirements:
|
52
52
|
- - ~>
|
@@ -54,10 +54,10 @@ dependencies:
|
|
54
54
|
version: '3.1'
|
55
55
|
type: :development
|
56
56
|
prerelease: false
|
57
|
-
version_requirements: *
|
57
|
+
version_requirements: *70104029169380
|
58
58
|
- !ruby/object:Gem::Dependency
|
59
59
|
name: rake
|
60
|
-
requirement: &
|
60
|
+
requirement: &70104029168580 !ruby/object:Gem::Requirement
|
61
61
|
none: false
|
62
62
|
requirements:
|
63
63
|
- - ! '>='
|
@@ -65,10 +65,10 @@ dependencies:
|
|
65
65
|
version: '0'
|
66
66
|
type: :development
|
67
67
|
prerelease: false
|
68
|
-
version_requirements: *
|
68
|
+
version_requirements: *70104029168580
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: rspec
|
71
|
-
requirement: &
|
71
|
+
requirement: &70104029167540 !ruby/object:Gem::Requirement
|
72
72
|
none: false
|
73
73
|
requirements:
|
74
74
|
- - ! '>='
|
@@ -76,10 +76,10 @@ dependencies:
|
|
76
76
|
version: '0'
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
|
-
version_requirements: *
|
79
|
+
version_requirements: *70104029167540
|
80
80
|
- !ruby/object:Gem::Dependency
|
81
81
|
name: sqlite3
|
82
|
-
requirement: &
|
82
|
+
requirement: &70104029166660 !ruby/object:Gem::Requirement
|
83
83
|
none: false
|
84
84
|
requirements:
|
85
85
|
- - ! '>='
|
@@ -87,7 +87,7 @@ dependencies:
|
|
87
87
|
version: '0'
|
88
88
|
type: :development
|
89
89
|
prerelease: false
|
90
|
-
version_requirements: *
|
90
|
+
version_requirements: *70104029166660
|
91
91
|
description: A simple way to direct upload big files to Amazon S3 storage from Ruby
|
92
92
|
applications and process it with cloud encoding service.
|
93
93
|
email:
|
@@ -157,7 +157,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
157
157
|
version: '0'
|
158
158
|
segments:
|
159
159
|
- 0
|
160
|
-
hash:
|
160
|
+
hash: 258924082708884621
|
161
161
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
162
162
|
none: false
|
163
163
|
requirements:
|
@@ -166,10 +166,10 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
166
166
|
version: '0'
|
167
167
|
segments:
|
168
168
|
- 0
|
169
|
-
hash:
|
169
|
+
hash: 258924082708884621
|
170
170
|
requirements: []
|
171
171
|
rubyforge_project: directwave
|
172
|
-
rubygems_version: 1.8.
|
172
|
+
rubygems_version: 1.8.15
|
173
173
|
signing_key:
|
174
174
|
specification_version: 3
|
175
175
|
summary: Ruby direct uploader to Amazon S3
|