fogged 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/app/jobs/fogged/resources/aws_thumbnail_job.rb +32 -0
  3. data/app/jobs/fogged/resources/zencoder_poll_job.rb +11 -13
  4. data/app/models/fogged/resource.rb +39 -35
  5. data/app/models/fogged/resources/aws_encoder.rb +20 -8
  6. data/app/models/fogged/resources/encoder.rb +1 -1
  7. data/lib/fogged.rb +53 -38
  8. data/lib/fogged/engine.rb +0 -6
  9. data/lib/fogged/{acts_as_having_many_resources.rb → has_many_resources.rb} +3 -3
  10. data/lib/fogged/{acts_as_having_one_resource.rb → has_one_resource.rb} +3 -3
  11. data/lib/fogged/utils.rb +26 -0
  12. data/lib/fogged/version.rb +1 -1
  13. data/lib/fogged/with_directory.rb +9 -0
  14. data/lib/fogged/zencoder_additional_outputs.rb +7 -0
  15. data/test/controllers/concerns/resource_test_helper.rb +6 -0
  16. data/test/controllers/fogged/resources_controller/confirm_test.rb +7 -7
  17. data/test/controllers/fogged/resources_controller/create_test.rb +4 -6
  18. data/test/controllers/fogged/resources_controller/destroy_test.rb +4 -3
  19. data/test/controllers/fogged/resources_controller/show_test.rb +6 -6
  20. data/test/controllers/fogged/resources_controller/update_test.rb +3 -5
  21. data/test/dummy/app/models/image.rb +1 -1
  22. data/test/dummy/app/models/movie.rb +1 -1
  23. data/test/dummy/config/environments/production.rb +1 -1
  24. data/test/dummy/config/environments/test.rb +2 -1
  25. data/test/dummy/db/schema.rb +5 -5
  26. data/test/dummy/db/test.sqlite3 +0 -0
  27. data/test/dummy/log/development.log +234 -0
  28. data/test/dummy/log/test.log +61126 -0
  29. data/test/dummy/test/controllers/resources_controller/index_test.rb +5 -7
  30. data/test/dummy/test/models/image_test.rb +11 -0
  31. data/test/fixtures/fogged/resources.yml +18 -6
  32. data/test/fogged_test.rb +20 -0
  33. data/test/jobs/fogged/resources/aws_thumbnail_job_test.rb +52 -0
  34. data/test/jobs/fogged/resources/zencoder_poll_job_test.rb +8 -4
  35. data/test/models/fogged/resource_test.rb +5 -5
  36. data/test/models/fogged/resources/aws_encoder_test.rb +110 -15
  37. data/test/models/fogged/resources/encoder_test.rb +1 -1
  38. data/test/test_helper.rb +9 -6
  39. metadata +27 -11
  40. data/test/dummy/db/development.sqlite3 +0 -0
  41. data/test/integration/navigation_test.rb +0 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 265b396d59da61488ba11b7d9ab9ab944f0258a4
4
- data.tar.gz: 736569ff7e8fd7627c3a93c04065a9e315447e4b
3
+ metadata.gz: 1652c7da7ec55c934f3fc5d697afb12fdb213f05
4
+ data.tar.gz: 2fb8e6d18c73e53dbd8ee738e7a6f02290b821f5
5
5
  SHA512:
6
- metadata.gz: cef14588abf7d1cac4215e19e412e1da03855b06c04014d3a3fdb70949c6fe912abc3738cb6d2bac92f0f3e15f6c2f4d1c35b2f3ca71cee6a84c8cc0ee53c450
7
- data.tar.gz: 64daa48361e73b98826a7916bf40c2d7c6a265db4e041e979634f4ba0313c50eec93d1aee2661368b8bc8e96c20b1f7f66a5b6939b479ac81f7083dc7494d04f
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 < Struct.new(:resource_id)
4
- def perform
5
- @resource = Fogged::Resource.find(resource_id)
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 @resource.encoding_progress == 100
8
+ return if resource.encoding_progress == 100
9
9
 
10
10
  frequency = Fogged.zencoder_polling_frequency
11
- Delayed::Job.enqueue(self, :run_at => frequency.seconds.from_now)
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(@resource.encoding_job_id)
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(@resource.encoding_job_id)
21
+ job = Zencoder::Job.details(resource.encoding_job_id)
22
22
  f = job.body["job"]["output_media_files"][0]
23
- @resource.update!(
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
- @resource.update!(
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
- storage = Fogged.resources
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 video?
57
- 5.times.map do |n|
58
- url.gsub(fogged_name, fogged_name_for(:thumbnails, n))
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
- return false unless video? && encoding_progress.present?
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! if video?
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
- private
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 encode_video
11
- fail(ArgumentError, "Zencoder gem needed") unless defined?(Zencoder)
12
- fail(ArgumentError, "Delayed Job gem needed") unless defined?(Delayed::Job)
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 => 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
- Delayed::Job.enqueue(ZencoderPollJob.new(resource.id))
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.send(:fogged_file).directory.key
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
@@ -6,7 +6,7 @@ module Fogged
6
6
  end
7
7
 
8
8
  def self.provider_for(resource)
9
- return :AWS if resource.send(:fogged_file).class.to_s.include?("AWS")
9
+ return :AWS if resource.fogged_file.class.to_s.include?("AWS")
10
10
  end
11
11
  end
12
12
  end
@@ -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/acts_as_having_one_resource"
7
- require "fogged/acts_as_having_many_resources"
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 :resources
14
- @@resources = nil
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
- @@parent_controller = "ApplicationController"
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 :zencoder_enabled
35
- @@zencoder_enabled = false
36
- mattr_accessor :zencoder_polling_frequency
37
- @@zencoder_polling_frequency = 10
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 @@resources if @@resources
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.resources = aws_resources
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
- self.test_enabled = true
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
- @@aws_key = "XXX"
69
- @@aws_secret = "XXX"
70
- @@aws_bucket = "test"
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
@@ -2,11 +2,5 @@ module Fogged
2
2
  class Engine < ::Rails::Engine
3
3
  isolate_namespace Fogged
4
4
  config.fogged = Fogged
5
-
6
- initializer "fogged.detect_zencoder" do
7
- if defined?(Zencoder) && defined?(Delayed::Job)
8
- Fogged.zencoder_enabled = true
9
- end
10
- end
11
5
  end
12
6
  end