fogged 0.0.4 → 0.0.5
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 +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