image8 0.1

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 (5) hide show
  1. data/Gemfile +5 -0
  2. data/README +27 -0
  3. data/image8.gemspec +21 -0
  4. data/lib/image8.rb +61 -0
  5. metadata +118 -0
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem "async_sinatra", "0.1.5"
4
+ gem "em-http-request", "0.2.7"
5
+ gem "rmagick", "2.13.1"
data/README ADDED
@@ -0,0 +1,27 @@
1
+ == image8
2
+
3
+ image8 resizes images on-the-fly and stores them in couchdb for later
4
+ retrival and easy replication. image8 should be used behind a varnish
5
+ or squid. <work in progress>.
6
+
7
+ == config.ru
8
+
9
+ require "image8"
10
+ Image8.couchdb = "http://127.0.0.1:5984/image8"
11
+ run Image8
12
+
13
+ == usage
14
+
15
+ the url
16
+
17
+ http://image8/200x250/http://ny.ti/some/image.jpg
18
+
19
+ produces an image no larger than 200x250 pixels in size. scales
20
+ proportionality.
21
+
22
+ == misc
23
+
24
+ image8 is released under the mit license. (c) 2010 harry vangberg
25
+ <harry@vangberg.name>, memolane <info@memolane.com>.
26
+
27
+ image8 is inspired by imagery <http://github.com/tobi/imagery>
@@ -0,0 +1,21 @@
1
+ Gem::Specification.new do |s|
2
+ s.name = "image8"
3
+ s.version = "0.1"
4
+ s.date = "2010-06-01"
5
+ s.summary = "dynamic image resizing."
6
+ s.email = "harry@vangberg.name"
7
+ s.homepage = "http://github.com/ichverstehe/image8"
8
+ s.description = "dynamic image resizing."
9
+ s.authors = ["Harry Vangberg"]
10
+ s.files = [
11
+ "README",
12
+ "Gemfile",
13
+ "image8.gemspec",
14
+ "lib/image8.rb",
15
+ ]
16
+ s.add_dependency "sinatra", ">= 1.0"
17
+ s.add_dependency "async_sinatra", ">= 0.1.5"
18
+ s.add_dependency "em-http-request", ">= 0.2.7"
19
+ s.add_dependency "rmagick", ">= 2.13.1"
20
+ end
21
+
@@ -0,0 +1,61 @@
1
+ require "uri"
2
+ require "sinatra/async"
3
+ require "em-http"
4
+ require "RMagick"
5
+
6
+ class Image8 < Sinatra::Base
7
+ set :couchdb, "http://127.0.0.1:5984/image8"
8
+ enable :raise_errors
9
+
10
+ register Sinatra::Async
11
+
12
+ aget %r|/([0-9x]+)/(.*)| do |format, uri|
13
+ # This is retarded.
14
+ if !request.query_string.empty?
15
+ uri += "?#{request.query_string}"
16
+ end
17
+
18
+ doc_id = encode_uri("#{format}/#{uri}")
19
+ doc_uri = settings.couchdb + "/#{doc_id}/image"
20
+ doc_http = EventMachine::HttpRequest.new(doc_uri)
21
+
22
+ request = doc_http.get(:timeout => 5)
23
+ request.callback {
24
+ expires 31_536_000 # 1 year
25
+ if request.response_header.status == 200
26
+ content_type request.response_header["CONTENT_TYPE"]
27
+ body request.response
28
+ else
29
+ resize_image(uri, format) {|img|
30
+ doc_http.put(
31
+ :head => {'Content-Type' => img.mime_type},
32
+ :body => img.to_blob
33
+ )
34
+ content_type img.mime_type
35
+ body img.to_blob
36
+ }
37
+ end
38
+ }
39
+ end
40
+
41
+ def encode_uri uri
42
+ uri = URI.encode(uri)
43
+ uri.gsub! "/", "%2F"
44
+ uri
45
+ end
46
+
47
+ def resize_image uri, format, &block
48
+ request = EventMachine::HttpRequest.new(uri).get
49
+ request.callback {
50
+ EM.defer {
51
+ img = Magick::Image.from_blob(request.response).first
52
+ img.change_geometry!(format) {|width, height|
53
+ img.resize! width, height
54
+ }
55
+ EM.next_tick {
56
+ block.call(img) if block
57
+ }
58
+ }
59
+ }
60
+ end
61
+ end
metadata ADDED
@@ -0,0 +1,118 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: image8
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 1
8
+ version: "0.1"
9
+ platform: ruby
10
+ authors:
11
+ - Harry Vangberg
12
+ autorequire:
13
+ bindir: bin
14
+ cert_chain: []
15
+
16
+ date: 2010-06-01 00:00:00 +02:00
17
+ default_executable:
18
+ dependencies:
19
+ - !ruby/object:Gem::Dependency
20
+ name: sinatra
21
+ prerelease: false
22
+ requirement: &id001 !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ segments:
27
+ - 1
28
+ - 0
29
+ version: "1.0"
30
+ type: :runtime
31
+ version_requirements: *id001
32
+ - !ruby/object:Gem::Dependency
33
+ name: async_sinatra
34
+ prerelease: false
35
+ requirement: &id002 !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ segments:
40
+ - 0
41
+ - 1
42
+ - 5
43
+ version: 0.1.5
44
+ type: :runtime
45
+ version_requirements: *id002
46
+ - !ruby/object:Gem::Dependency
47
+ name: em-http-request
48
+ prerelease: false
49
+ requirement: &id003 !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ segments:
54
+ - 0
55
+ - 2
56
+ - 7
57
+ version: 0.2.7
58
+ type: :runtime
59
+ version_requirements: *id003
60
+ - !ruby/object:Gem::Dependency
61
+ name: rmagick
62
+ prerelease: false
63
+ requirement: &id004 !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ segments:
68
+ - 2
69
+ - 13
70
+ - 1
71
+ version: 2.13.1
72
+ type: :runtime
73
+ version_requirements: *id004
74
+ description: dynamic image resizing.
75
+ email: harry@vangberg.name
76
+ executables: []
77
+
78
+ extensions: []
79
+
80
+ extra_rdoc_files: []
81
+
82
+ files:
83
+ - README
84
+ - Gemfile
85
+ - image8.gemspec
86
+ - lib/image8.rb
87
+ has_rdoc: true
88
+ homepage: http://github.com/ichverstehe/image8
89
+ licenses: []
90
+
91
+ post_install_message:
92
+ rdoc_options: []
93
+
94
+ require_paths:
95
+ - lib
96
+ required_ruby_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ segments:
101
+ - 0
102
+ version: "0"
103
+ required_rubygems_version: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ segments:
108
+ - 0
109
+ version: "0"
110
+ requirements: []
111
+
112
+ rubyforge_project:
113
+ rubygems_version: 1.3.6
114
+ signing_key:
115
+ specification_version: 3
116
+ summary: dynamic image resizing.
117
+ test_files: []
118
+