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.
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