fogged 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/jobs/fogged/resources/aws_thumbnail_job.rb +32 -0
- data/app/jobs/fogged/resources/zencoder_poll_job.rb +11 -13
- data/app/models/fogged/resource.rb +39 -35
- data/app/models/fogged/resources/aws_encoder.rb +20 -8
- data/app/models/fogged/resources/encoder.rb +1 -1
- data/lib/fogged.rb +53 -38
- data/lib/fogged/engine.rb +0 -6
- data/lib/fogged/{acts_as_having_many_resources.rb → has_many_resources.rb} +3 -3
- data/lib/fogged/{acts_as_having_one_resource.rb → has_one_resource.rb} +3 -3
- data/lib/fogged/utils.rb +26 -0
- data/lib/fogged/version.rb +1 -1
- data/lib/fogged/with_directory.rb +9 -0
- data/lib/fogged/zencoder_additional_outputs.rb +7 -0
- data/test/controllers/concerns/resource_test_helper.rb +6 -0
- data/test/controllers/fogged/resources_controller/confirm_test.rb +7 -7
- data/test/controllers/fogged/resources_controller/create_test.rb +4 -6
- data/test/controllers/fogged/resources_controller/destroy_test.rb +4 -3
- data/test/controllers/fogged/resources_controller/show_test.rb +6 -6
- data/test/controllers/fogged/resources_controller/update_test.rb +3 -5
- data/test/dummy/app/models/image.rb +1 -1
- data/test/dummy/app/models/movie.rb +1 -1
- data/test/dummy/config/environments/production.rb +1 -1
- data/test/dummy/config/environments/test.rb +2 -1
- data/test/dummy/db/schema.rb +5 -5
- data/test/dummy/db/test.sqlite3 +0 -0
- data/test/dummy/log/development.log +234 -0
- data/test/dummy/log/test.log +61126 -0
- data/test/dummy/test/controllers/resources_controller/index_test.rb +5 -7
- data/test/dummy/test/models/image_test.rb +11 -0
- data/test/fixtures/fogged/resources.yml +18 -6
- data/test/fogged_test.rb +20 -0
- data/test/jobs/fogged/resources/aws_thumbnail_job_test.rb +52 -0
- data/test/jobs/fogged/resources/zencoder_poll_job_test.rb +8 -4
- data/test/models/fogged/resource_test.rb +5 -5
- data/test/models/fogged/resources/aws_encoder_test.rb +110 -15
- data/test/models/fogged/resources/encoder_test.rb +1 -1
- data/test/test_helper.rb +9 -6
- metadata +27 -11
- data/test/dummy/db/development.sqlite3 +0 -0
- data/test/integration/navigation_test.rb +0 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1652c7da7ec55c934f3fc5d697afb12fdb213f05
|
4
|
+
data.tar.gz: 2fb8e6d18c73e53dbd8ee738e7a6f02290b821f5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9d30035530d89f7413089fb1ba9d6e037766ff43a9aa5291bf9d764e42233503baf59eb3b3ad5887dd492b81533c5d0ce73066fa65aa6d1b3d11be5a9867cab0
|
7
|
+
data.tar.gz: af368db4c8394d6e7b4617609d4d4c17038c25c884b1e0d7463be4334112c26733d74364f1d4e0b62c88a362e9a9015e58b7fe85727b90578ddb12350c4f9279
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Fogged
|
2
|
+
module Resources
|
3
|
+
class AWSThumbnailJob < ActiveJob::Base
|
4
|
+
def perform(resource)
|
5
|
+
return unless Fogged.minimagick_enabled
|
6
|
+
|
7
|
+
step = 100 / Fogged.thumbnail_sizes.size
|
8
|
+
Fogged.thumbnail_sizes.each_with_index do |size, index|
|
9
|
+
Tempfile.open(["thumbnail", ".png"]) do |t|
|
10
|
+
MiniMagick::Tool::Convert.new do |c|
|
11
|
+
c << resource.url
|
12
|
+
c.resize("#{size}^")
|
13
|
+
c.gravity("center")
|
14
|
+
c.extent("#{size}")
|
15
|
+
c << t.path
|
16
|
+
end
|
17
|
+
|
18
|
+
Fogged.resources.files.create(
|
19
|
+
:key => resource.send(:fogged_name_for, :thumbnails, index),
|
20
|
+
:body => File.read(t.path),
|
21
|
+
:public => true,
|
22
|
+
:content_type => Mime::PNG.to_s
|
23
|
+
)
|
24
|
+
end
|
25
|
+
|
26
|
+
resource.increment!(:encoding_progress, step)
|
27
|
+
end
|
28
|
+
resource.update!(:encoding_progress => 100)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -1,35 +1,33 @@
|
|
1
1
|
module Fogged
|
2
2
|
module Resources
|
3
|
-
class ZencoderPollJob <
|
4
|
-
def perform
|
5
|
-
|
6
|
-
update_encoding_progress
|
3
|
+
class ZencoderPollJob < ActiveJob::Base
|
4
|
+
def perform(resource)
|
5
|
+
return unless Fogged.zencoder_enabled
|
6
|
+
update_encoding_progress(resource)
|
7
7
|
|
8
|
-
return if
|
8
|
+
return if resource.encoding_progress == 100
|
9
9
|
|
10
10
|
frequency = Fogged.zencoder_polling_frequency
|
11
|
-
|
11
|
+
retry_job(:wait => frequency.seconds)
|
12
12
|
end
|
13
13
|
|
14
14
|
private
|
15
15
|
|
16
|
-
def update_encoding_progress
|
17
|
-
job = Zencoder::Job.progress(
|
16
|
+
def update_encoding_progress(resource)
|
17
|
+
job = Zencoder::Job.progress(resource.encoding_job_id)
|
18
18
|
|
19
19
|
case job.body["state"]
|
20
20
|
when "finished"
|
21
|
-
job = Zencoder::Job.details(
|
21
|
+
job = Zencoder::Job.details(resource.encoding_job_id)
|
22
22
|
f = job.body["job"]["output_media_files"][0]
|
23
|
-
|
23
|
+
resource.update!(
|
24
24
|
:encoding_progress => 100,
|
25
25
|
:width => f["width"],
|
26
26
|
:height => f["height"],
|
27
27
|
:duration => f["duration_in_ms"].to_f / 1000.0
|
28
28
|
)
|
29
29
|
when "processing", "waiting"
|
30
|
-
|
31
|
-
:encoding_progress => job.body["progress"].to_i
|
32
|
-
)
|
30
|
+
resource.update!(:encoding_progress => job.body["progress"].to_i)
|
33
31
|
else
|
34
32
|
fail(ArgumentError, "Unknown Zencoder job state #{job.body["state"]}")
|
35
33
|
end
|
@@ -29,33 +29,36 @@ module Fogged
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def url
|
32
|
-
|
33
|
-
storage.service.try(
|
34
|
-
:request_url,
|
35
|
-
:bucket_name => storage.key,
|
36
|
-
:object_name => fogged_name
|
37
|
-
)
|
32
|
+
Fogged.file_public_url(fogged_name)
|
38
33
|
end
|
39
34
|
|
40
35
|
def h264_url
|
41
|
-
return unless video?
|
36
|
+
return unless video? && Fogged.zencoder_enabled
|
42
37
|
url.gsub(fogged_name, fogged_name_for(:h264))
|
43
38
|
end
|
44
39
|
|
45
40
|
def mpeg_url
|
46
|
-
return unless video?
|
41
|
+
return unless video? && Fogged.zencoder_enabled
|
47
42
|
url.gsub(fogged_name, fogged_name_for(:mpeg))
|
48
43
|
end
|
49
44
|
|
50
45
|
def webm_url
|
51
|
-
return unless video?
|
46
|
+
return unless video? && Fogged.zencoder_enabled
|
52
47
|
url.gsub(fogged_name, fogged_name_for(:webm))
|
53
48
|
end
|
54
49
|
|
55
50
|
def thumbnail_urls
|
56
|
-
return unless
|
57
|
-
|
58
|
-
|
51
|
+
return unless Fogged.active_job_enabled
|
52
|
+
|
53
|
+
case
|
54
|
+
when video? && Fogged.zencoder_enabled
|
55
|
+
5.times.map do |n|
|
56
|
+
url.gsub(fogged_name, fogged_name_for(:thumbnails, n))
|
57
|
+
end
|
58
|
+
when image? && Fogged.minimagick_enabled
|
59
|
+
Fogged.thumbnail_sizes.size.times.map do |n|
|
60
|
+
url.gsub(fogged_name, fogged_name_for(:thumbnails, n))
|
61
|
+
end
|
59
62
|
end
|
60
63
|
end
|
61
64
|
|
@@ -68,13 +71,16 @@ module Fogged
|
|
68
71
|
end
|
69
72
|
|
70
73
|
def encoding?
|
71
|
-
|
74
|
+
unless encoding_progress.present? &&
|
75
|
+
(video? || (image? && Fogged.active_job_enabled))
|
76
|
+
return
|
77
|
+
end
|
72
78
|
encoding_progress < 100
|
73
79
|
end
|
74
80
|
|
75
81
|
def process!
|
76
82
|
find_size! if image?
|
77
|
-
encode!
|
83
|
+
encode!
|
78
84
|
end
|
79
85
|
|
80
86
|
def write(content)
|
@@ -82,28 +88,38 @@ module Fogged
|
|
82
88
|
fogged_file.save
|
83
89
|
end
|
84
90
|
|
85
|
-
|
91
|
+
def fogged_file
|
92
|
+
return @fogged_file if defined?(@fogged_file)
|
93
|
+
|
94
|
+
files = Fogged.resources.files
|
95
|
+
@fogged_file = files.get(fogged_name) || files.create(
|
96
|
+
:key => fogged_name,
|
97
|
+
:body => "",
|
98
|
+
:public => true,
|
99
|
+
:content_type => content_type
|
100
|
+
)
|
101
|
+
end
|
86
102
|
|
87
103
|
def find_size!
|
88
104
|
if Fogged.test_enabled
|
89
|
-
update!(
|
105
|
+
return update!(
|
90
106
|
:width => 800,
|
91
107
|
:height => 600
|
92
108
|
)
|
93
|
-
else
|
94
|
-
size = FastImage.size(url)
|
95
|
-
update!(
|
96
|
-
:width => size.first,
|
97
|
-
:height => size.second
|
98
|
-
) unless size.blank?
|
99
109
|
end
|
110
|
+
size = FastImage.size(url)
|
111
|
+
update!(
|
112
|
+
:width => size.first,
|
113
|
+
:height => size.second
|
114
|
+
) unless size.blank?
|
100
115
|
end
|
101
116
|
|
102
117
|
def encode!
|
103
|
-
return unless Fogged.zencoder_enabled
|
104
118
|
Resources::Encoder.for(self).encode!
|
105
119
|
end
|
106
120
|
|
121
|
+
private
|
122
|
+
|
107
123
|
def ensure_token
|
108
124
|
self.token = generate_token if token.blank?
|
109
125
|
end
|
@@ -115,18 +131,6 @@ module Fogged
|
|
115
131
|
end
|
116
132
|
end
|
117
133
|
|
118
|
-
def fogged_file
|
119
|
-
return @fogged_file if defined?(@fogged_file)
|
120
|
-
|
121
|
-
files = Fogged.resources.files
|
122
|
-
@fogged_file = files.get(fogged_name) || files.create(
|
123
|
-
:key => fogged_name,
|
124
|
-
:body => "",
|
125
|
-
:public => true,
|
126
|
-
:content_type => content_type
|
127
|
-
)
|
128
|
-
end
|
129
|
-
|
130
134
|
def fogged_name
|
131
135
|
"#{token}.#{extension}"
|
132
136
|
end
|
@@ -2,27 +2,39 @@ module Fogged
|
|
2
2
|
module Resources
|
3
3
|
class AWSEncoder < Struct.new(:resource)
|
4
4
|
def encode!
|
5
|
+
return unless Fogged.active_job_enabled
|
5
6
|
encode_video if resource.video?
|
7
|
+
encode_image if resource.image?
|
6
8
|
end
|
7
9
|
|
8
10
|
private
|
9
11
|
|
10
|
-
def
|
11
|
-
|
12
|
-
|
12
|
+
def encode_image
|
13
|
+
return unless Fogged.minimagick_enabled
|
14
|
+
AWSThumbnailJob.perform_later(resource)
|
15
|
+
resource.update!(:encoding_progress => 0)
|
16
|
+
end
|
13
17
|
|
18
|
+
def encode_video
|
19
|
+
return unless Fogged.zencoder_enabled
|
20
|
+
outputs = output
|
21
|
+
if Fogged.zencoder_additional_outputs_block
|
22
|
+
additional_outputs = Fogged.zencoder_additional_outputs_block.call(bucket, resource)
|
23
|
+
outputs << additional_outputs
|
24
|
+
outputs.flatten!
|
25
|
+
end
|
14
26
|
job = Zencoder::Job.create(
|
15
27
|
:input => resource.url,
|
16
28
|
:region => "europe",
|
17
29
|
:download_connections => 5,
|
18
|
-
:output =>
|
30
|
+
:output => outputs
|
19
31
|
)
|
20
32
|
resource.update!(
|
21
33
|
:encoding_job_id => job.body["id"].to_s,
|
22
34
|
:encoding_progress => 0
|
23
35
|
)
|
24
36
|
|
25
|
-
|
37
|
+
ZencoderPollJob.perform_later(resource)
|
26
38
|
end
|
27
39
|
|
28
40
|
def output
|
@@ -53,11 +65,11 @@ module Fogged
|
|
53
65
|
end
|
54
66
|
|
55
67
|
def bucket
|
56
|
-
resource.
|
68
|
+
resource.fogged_file.directory.key
|
57
69
|
end
|
58
70
|
|
59
|
-
def fogged_name_for(type)
|
60
|
-
resource.send(:fogged_name_for, type)
|
71
|
+
def fogged_name_for(type, number = 0)
|
72
|
+
resource.send(:fogged_name_for, type, number)
|
61
73
|
end
|
62
74
|
end
|
63
75
|
end
|
data/lib/fogged.rb
CHANGED
@@ -3,86 +3,101 @@ Gem.loaded_specs["fogged"].dependencies.select { |d| d.type == :runtime }.each d
|
|
3
3
|
end
|
4
4
|
|
5
5
|
require "fogged/engine"
|
6
|
-
require "fogged/
|
7
|
-
require "fogged/
|
6
|
+
require "fogged/has_one_resource"
|
7
|
+
require "fogged/has_many_resources"
|
8
|
+
require "fogged/with_directory"
|
9
|
+
require "fogged/utils"
|
10
|
+
require "fogged/zencoder_additional_outputs"
|
8
11
|
|
9
12
|
module Fogged
|
10
|
-
mattr_accessor :provider
|
11
|
-
@@provider = nil
|
13
|
+
mattr_accessor :provider, :_resources, :storage
|
12
14
|
|
13
|
-
mattr_accessor :
|
14
|
-
|
15
|
-
|
16
|
-
mattr_accessor :test_enabled
|
17
|
-
@@test_enabled = false
|
15
|
+
mattr_accessor :test_enabled do
|
16
|
+
false
|
17
|
+
end
|
18
18
|
|
19
19
|
# controller
|
20
|
-
mattr_accessor :parent_controller
|
21
|
-
|
20
|
+
mattr_accessor :parent_controller do
|
21
|
+
"ApplicationController"
|
22
|
+
end
|
22
23
|
|
23
24
|
# aws
|
24
|
-
mattr_accessor :aws_key
|
25
|
-
@@aws_key = nil
|
26
|
-
mattr_accessor :aws_secret
|
27
|
-
@@aws_secret = nil
|
28
|
-
mattr_accessor :aws_bucket
|
29
|
-
@@aws_bucket = nil
|
30
|
-
mattr_accessor :aws_region
|
31
|
-
@@aws_region = nil
|
25
|
+
mattr_accessor :aws_key, :aws_secret, :aws_bucket, :aws_region
|
32
26
|
|
33
27
|
# zencoder
|
34
|
-
mattr_accessor :
|
35
|
-
|
36
|
-
|
37
|
-
|
28
|
+
mattr_accessor :zencoder_polling_frequency do
|
29
|
+
10
|
30
|
+
end
|
31
|
+
|
32
|
+
# thumbnail sizes
|
33
|
+
mattr_accessor :thumbnail_sizes do
|
34
|
+
[]
|
35
|
+
end
|
36
|
+
|
37
|
+
# libs support
|
38
|
+
mattr_accessor :zencoder_enabled, :minimagick_enabled, :active_job_enabled do
|
39
|
+
false
|
40
|
+
end
|
38
41
|
|
39
42
|
def self.configure
|
40
|
-
yield self
|
43
|
+
yield self if block_given?
|
44
|
+
check_config
|
45
|
+
self.zencoder_enabled = defined?(Zencoder)
|
46
|
+
self.minimagick_enabled = defined?(MiniMagick)
|
47
|
+
self.active_job_enabled = (Rails.application.config.active_job.queue_adapter != :inline)
|
41
48
|
end
|
42
49
|
|
43
50
|
def self.resources
|
44
|
-
return
|
45
|
-
return @@resources = test_resources if Fogged.test_enabled
|
51
|
+
return Fogged._resources if Fogged._resources
|
46
52
|
|
47
53
|
case Fogged.provider
|
48
54
|
when :aws
|
49
|
-
Fogged.
|
55
|
+
Fogged._resources = aws_resources
|
50
56
|
else
|
51
57
|
fail(ArgumentError, "Provider #{Fogged.provider} is not available!")
|
52
58
|
end
|
53
59
|
end
|
54
60
|
|
55
61
|
def self.test_mode!
|
56
|
-
|
62
|
+
Fogged.test_enabled = true
|
63
|
+
Fogged._resources = test_resources
|
57
64
|
end
|
58
65
|
|
59
66
|
private
|
60
67
|
|
61
68
|
def self.test_resources
|
62
69
|
Fog.mock!
|
63
|
-
storage = Fog::Storage.new(
|
70
|
+
Fogged.storage = Fog::Storage.new(
|
64
71
|
:provider => "AWS",
|
65
72
|
:aws_access_key_id => "XXX",
|
66
73
|
:aws_secret_access_key => "XXX"
|
67
74
|
)
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
storage.directories.create(:key => "test")
|
75
|
+
Fogged.aws_key = "XXX"
|
76
|
+
Fogged.aws_secret = "XXX"
|
77
|
+
Fogged.aws_bucket = "test"
|
78
|
+
Fogged.storage.directories.create(:key => "test")
|
72
79
|
end
|
73
80
|
|
74
81
|
def self.aws_resources
|
75
|
-
fail(ArgumentError, "AWS key is mandatory") unless Fogged.aws_key
|
76
|
-
fail(ArgumentError, "AWS secret is mandatory") unless Fogged.aws_secret
|
77
|
-
fail(ArgumentError, "AWS bucket is mandatory") unless Fogged.aws_bucket
|
78
82
|
storage_options = {
|
79
83
|
:provider => "AWS",
|
80
84
|
:aws_access_key_id => Fogged.aws_key,
|
81
85
|
:aws_secret_access_key => Fogged.aws_secret
|
82
86
|
}
|
83
87
|
storage_options.merge!(:region => Fogged.aws_region) if Fogged.aws_region
|
84
|
-
storage = Fog::Storage.new(storage_options)
|
88
|
+
Fogged.storage = Fog::Storage.new(storage_options)
|
85
89
|
|
86
|
-
storage.directories.get(Fogged.aws_bucket)
|
90
|
+
Fogged.storage.directories.get(Fogged.aws_bucket)
|
91
|
+
end
|
92
|
+
|
93
|
+
def self.check_config
|
94
|
+
case Fogged.provider
|
95
|
+
when :aws
|
96
|
+
fail(ArgumentError, "AWS key is mandatory") unless Fogged.aws_key
|
97
|
+
fail(ArgumentError, "AWS secret is mandatory") unless Fogged.aws_secret
|
98
|
+
fail(ArgumentError, "AWS bucket is mandatory") unless Fogged.aws_bucket
|
99
|
+
else
|
100
|
+
fail(ArgumentError, "Provider #{Fogged.provider} is not available!")
|
101
|
+
end
|
87
102
|
end
|
88
103
|
end
|
data/lib/fogged/engine.rb
CHANGED