imagevenue 0.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.
data/image_venue.rb ADDED
@@ -0,0 +1,51 @@
1
+ require 'cgi' unless defined?(CGI::Cookie)
2
+ require 'net/http' unless defined?(Net::HTTP)
3
+ require 'image_venue/net_http_get_extensions' unless defined?(NetHttpGetExtensions)
4
+ require 'image_venue/net_http_post_extensions' unless defined?(NetHttpPostExtensions)
5
+ require 'open-uri' unless defined?(OpenURI)
6
+ require 'uri' unless defined?(URI)
7
+ require 'rubygems' unless defined?(Gem)
8
+ require 'hpricot' unless defined?(Hpricot)
9
+
10
+ module ImageVenue
11
+ def self.base_url
12
+ @base_url ||= 'http://users.imagevenue.com'
13
+ end
14
+
15
+ def self.base_uri
16
+ @base_uri ||= URI.parse(self.base_url)
17
+ end
18
+
19
+ def self.version
20
+ @version ||= [0, 0, 1]
21
+ end
22
+
23
+ def self.debug
24
+ @debug
25
+ end
26
+
27
+ def self.debug=(debug)
28
+ @debug = debug
29
+ end
30
+
31
+ def self.authenticate(username=nil, password=nil, cookie=nil)
32
+ @authenticate ||= ImageVenue::Authenticate.new(username, password, cookie)
33
+ end
34
+
35
+ def self.directory
36
+ @directory ||= ImageVenue::Directory.new
37
+ end
38
+
39
+ def self.upload
40
+ @upload ||= ImageVenue::Upload.new
41
+ end
42
+ end
43
+
44
+ require 'image_venue/authenticate'
45
+ require 'image_venue/directory'
46
+ require 'image_venue/file'
47
+ require 'image_venue/upload'
48
+ require 'image_venue/upload_file'
49
+
50
+ if $0 == __FILE__
51
+ end
@@ -0,0 +1,125 @@
1
+ module ImageVenue
2
+ class Authenticate
3
+ class << self
4
+ def login_uri
5
+ @login_uri ||= URI.parse(ImageVenue.base_url + '/process_logon.php')
6
+ end
7
+
8
+ def login_username_key
9
+ @login_username_key ||= 'user'
10
+ end
11
+
12
+ def login_password_key
13
+ @login_password_key ||= 'password'
14
+ end
15
+
16
+ def login_action_key
17
+ @login_action_key ||= 'action'
18
+ end
19
+
20
+ def logout_uri
21
+ @logout_uri ||= URI.parse(ImageVenue.base_url + '/logout.php')
22
+ end
23
+
24
+ def cookie_user_key
25
+ @cookie_user_key ||= 'user'
26
+ end
27
+
28
+ def cookie_root_key
29
+ @cookie_root_key ||= 'root'
30
+ end
31
+
32
+ def cookie_timestamp_key
33
+ @cookie_timestamp_key ||= 'tsctr'
34
+ end
35
+ end
36
+
37
+ attr_accessor :action
38
+ attr_accessor :username
39
+ attr_accessor :password
40
+ attr_accessor :cookie
41
+ attr_accessor :debug
42
+
43
+ def initialize(username, password, cookie=nil)
44
+ self.action = '1'
45
+ self.username = username
46
+ self.password = password
47
+ self.cookie = cookie
48
+ return nil
49
+ end
50
+
51
+ def debug?
52
+ (ImageVenue.debug or self.debug) ? true : false
53
+ end
54
+
55
+ def puts_debug(*args)
56
+ if self.debug?
57
+ puts(*args)
58
+ return true
59
+ else
60
+ return false
61
+ end
62
+ end
63
+
64
+ def login
65
+ puts_debug "Trying to login ..."
66
+ response = Net::HTTP.post_form(self.class.login_uri, self.login_params)
67
+ unless response.header['Set-Cookie'].blank?
68
+ self.cookie = {}
69
+ self.cookie[self.class.cookie_user_key] = $1 if response.header['Set-Cookie'] =~ /#{Regexp.escape(self.class.cookie_user_key)}=(.+?)[,;]/
70
+ self.cookie[self.class.cookie_root_key] = $1 if response.header['Set-Cookie'] =~ /#{Regexp.escape(self.class.cookie_root_key)}=(\d+)/
71
+ response_timestamp = Net::HTTP.get_response(ImageVenue.base_uri)
72
+ unless response_timestamp.header['Set-Cookie'].blank?
73
+ self.cookie[self.class.cookie_timestamp_key] = $1 if response_timestamp.header['Set-Cookie'] =~ /#{Regexp.escape(self.class.cookie_timestamp_key)}=(.+?)[,;]/
74
+ puts_debug "Login successfull!"
75
+ return true
76
+ else
77
+ puts_debug "Login failed!"
78
+ return false
79
+ end
80
+ else
81
+ self.cookie = nil
82
+ return false
83
+ end
84
+ end
85
+
86
+ def login_params
87
+ {
88
+ self.class.login_action_key => self.action,
89
+ self.class.login_username_key => self.username,
90
+ self.class.login_password_key => self.password
91
+ }
92
+ end
93
+
94
+ def logged_in?
95
+ unless self.cookie.nil?
96
+ return true
97
+ else
98
+ return false
99
+ end
100
+ end
101
+
102
+ def logout
103
+ puts_debug "Trying to logout ..."
104
+ response = Net::HTTP.get_response(self.class.logout_uri)
105
+ if response.is_a?(Net::HTTPSuccess) or response.is_a?(Net::HTTPFound)
106
+ self.cookie = nil
107
+ puts_debug "Logout successfull! Resetting cookie."
108
+ return true
109
+ else
110
+ self.cookie = nil
111
+ puts_debug "Logout failed! But resetting cookie anyway."
112
+ return false
113
+ end
114
+ end
115
+
116
+ def cookie_as_string
117
+ unless self.cookie.nil?
118
+ cookie_str = self.cookie.map {|key, value| [key, value].join('=')}.join('; ')
119
+ return cookie_str
120
+ else
121
+ return nil
122
+ end
123
+ end
124
+ end
125
+ end
@@ -0,0 +1,266 @@
1
+ module ImageVenue
2
+ class Directory
3
+ class << self
4
+ def list_uri
5
+ @list_uri ||= URI.parse(ImageVenue.base_url + '/view_dir.php')
6
+ end
7
+
8
+ def files_uri
9
+ @files_uri ||= URI.parse(ImageVenue.base_url + '/process_get_dir_codes.php')
10
+ end
11
+
12
+ def files_format_key
13
+ @files_format_key ||= 'poster'
14
+ end
15
+
16
+ def files_format_forum
17
+ @files_format_forum ||= 'forum'
18
+ end
19
+
20
+ def files_format_website
21
+ @files_format_website ||= 'webpage'
22
+ end
23
+
24
+ def files_directory_key
25
+ @files_directory_key ||= 'dir'
26
+ end
27
+
28
+ def select_uri
29
+ @select_uri ||= URI.parse(ImageVenue.base_url + '/process_change_dir.php')
30
+ end
31
+
32
+ def select_directory_key
33
+ @select_directory_key ||= 'dir'
34
+ end
35
+
36
+ def create_uri
37
+ @create_uri ||= URI.parse(ImageVenue.base_url + '/create_dir.php')
38
+ end
39
+
40
+ def create_directory_key
41
+ @create_directory_key ||= 'new_dir'
42
+ end
43
+
44
+ def delete_uri
45
+ @delete_uri ||= URI.parse(ImageVenue.base_url + '/process_del_dir.php')
46
+ end
47
+
48
+ def delete_directory_key
49
+ @delete_directory_key ||= 'delete_dir[]'
50
+ end
51
+
52
+ def cookie_directory_key
53
+ @cookie_directory_key ||= 'cur_upload_dir'
54
+ end
55
+ end
56
+
57
+ attr_accessor :directories
58
+ attr_accessor :directories_files
59
+ attr_accessor :selected_directory
60
+ attr_accessor :debug
61
+
62
+ alias :selected :selected_directory
63
+
64
+ def initialize
65
+ self.directories = nil
66
+ self.directories_files = {}
67
+ self.selected_directory = nil
68
+ return nil
69
+ end
70
+
71
+ def debug?
72
+ (ImageVenue.debug or self.debug) ? true : false
73
+ end
74
+
75
+ def puts_debug(*args)
76
+ if self.debug?
77
+ puts(*args)
78
+ return true
79
+ else
80
+ return false
81
+ end
82
+ end
83
+
84
+ def list(reload=false)
85
+ if self.directories.nil? or reload
86
+ puts_debug "Trying to fetch directories ..."
87
+ request = Net::HTTP::Get.new(self.class.list_uri.path)
88
+ request.header['cookie'] = [ImageVenue.authenticate.cookie_as_string]
89
+ response = Net::HTTP.start(self.class.list_uri.host, self.class.list_uri.port) do |http|
90
+ http.request(request)
91
+ end
92
+ if response.is_a?(Net::HTTPSuccess)
93
+ hpricot = Hpricot(response.body)
94
+ self.directories = hpricot.search('form:first').first.search('input[@type="radio"]').collect {|input| input['value']}
95
+ puts_debug "Directories successfully fetched!"
96
+ return self.directories
97
+ else
98
+ puts_debug "Directories fetch failed!"
99
+ return false
100
+ end
101
+ else
102
+ puts_debug "Directories from cache!"
103
+ return self.directories
104
+ end
105
+ end
106
+
107
+ def files(directory, reload=false)
108
+ if self.directories_files[directory].nil? or reload
109
+ puts_debug "Trying to fetch files from directory: '#{directory}' ..."
110
+ request = Net::HTTP::Post.new(self.class.files_uri.path)
111
+ request.form_data = self.files_params(directory)
112
+ request.header['cookie'] = [ImageVenue.authenticate.cookie_as_string]
113
+ response = Net::HTTP.start(self.class.files_uri.host, self.class.files_uri.port) do |http|
114
+ http.request(request)
115
+ end
116
+ if response.is_a?(Net::HTTPSuccess)
117
+ self.directories_files[directory] = ImageVenue::File.parse_forum_codes(response.body, directory)
118
+ puts_debug "Files successfully fetched!"
119
+ return self.directories_files[directory]
120
+ else
121
+ puts_debug "Files fetch failed!"
122
+ return false
123
+ end
124
+ else
125
+ puts_debug "Files from cache for directory: '#{directory}'"
126
+ return self.directories_files[directory]
127
+ end
128
+ end
129
+
130
+ def files_params(directory)
131
+ {
132
+ self.class.files_format_key => self.class.files_format_forum,
133
+ self.class.files_directory_key => directory
134
+ }
135
+ end
136
+
137
+ def select(directory, reselect=false)
138
+ if directory != self.selected_directory or reselect
139
+ puts_debug "Trying to select directory: '#{directory}'"
140
+ request = Net::HTTP::Post.new(self.class.select_uri.path)
141
+ request.form_data = self.select_params(directory)
142
+ request.header['cookie'] = [ImageVenue.authenticate.cookie_as_string]
143
+ response = Net::HTTP.start(self.class.select_uri.host, self.class.select_uri.port) do |http|
144
+ http.request(request)
145
+ end
146
+ if response.is_a?(Net::HTTPFound) and not response.header['Set-Cookie'].blank?
147
+ self.selected_directory = directory
148
+ ImageVenue.authenticate.cookie[self.class.cookie_directory_key] = directory
149
+ puts_debug "Directory successfully selected!"
150
+ return true
151
+ else
152
+ puts_debug "Directory select failed!"
153
+ return false
154
+ end
155
+ else
156
+ puts_debug "Directory already selected."
157
+ return nil
158
+ end
159
+ end
160
+
161
+ def select_params(directory)
162
+ {
163
+ self.class.select_directory_key => directory
164
+ }
165
+ end
166
+
167
+ def create(directory, reload=false)
168
+ unless self.list(reload).include?(directory)
169
+ puts_debug "Trying to create directory: '#{directory}'"
170
+ request = Net::HTTP::Post.new(self.class.create_uri.path)
171
+ request.form_data = self.create_params(directory)
172
+ request.header['cookie'] = [ImageVenue.authenticate.cookie_as_string]
173
+ response = Net::HTTP.start(self.class.create_uri.host, self.class.create_uri.port) do |http|
174
+ http.request(request)
175
+ end
176
+ if response.is_a?(Net::HTTPSuccess) and not response.header['Set-Cookie'].blank?
177
+ self.selected_directory = directory
178
+ self.directories.insert(0, directory)
179
+ ImageVenue.authenticate.cookie[self.class.cookie_directory_key] = directory
180
+ puts_debug "Directory successfully created!"
181
+ return true
182
+ else
183
+ puts_debug "Directory create failed!"
184
+ return false
185
+ end
186
+ else
187
+ puts_debug "Directory already exists: '#{directory}'"
188
+ return nil
189
+ end
190
+ end
191
+
192
+ def create_params(directory)
193
+ {
194
+ self.class.create_directory_key => directory
195
+ }
196
+ end
197
+
198
+ def select_or_create(directory, reload=false, reselect=false)
199
+ if self.list(reload).include?(directory)
200
+ return self.select(directory, reselect)
201
+ else
202
+ return self.create(directory, false) # reload)
203
+ end
204
+ end
205
+
206
+ def delete(directory, reload=false)
207
+ if self.list(reload).include?(directory)
208
+ puts_debug "Trying to delete directory: '#{directory}'"
209
+ request = Net::HTTP::Post.new(self.class.delete_uri.path)
210
+ request.form_data = self.delete_params(directory)
211
+ request.header['cookie'] = [ImageVenue.authenticate.cookie_as_string]
212
+ response = Net::HTTP.start(self.class.delete_uri.host, self.class.delete_uri.port) do |http|
213
+ http.request(request)
214
+ end
215
+ if response.is_a?(Net::HTTPSuccess)
216
+ if directory == self.selected_directory
217
+ self.selected_directory = nil
218
+ ImageVenue.authenticate.cookie.delete(self.class.cookie_directory_key)
219
+ end
220
+ self.directories.delete(directory)
221
+ self.directories_files.delete(directory)
222
+ puts_debug "Directory successfully deleted!"
223
+ return true
224
+ else
225
+ puts_debug "Directory delete failed!"
226
+ return false
227
+ end
228
+ else
229
+ puts_debug "Directory does not exist: '#{directory}'"
230
+ return nil
231
+ end
232
+ end
233
+
234
+ def delete_params(directory)
235
+ {
236
+ self.class.delete_directory_key => directory
237
+ }
238
+ end
239
+
240
+ def delete_file(file, reload=false)
241
+ directory = file.directory
242
+ files = self.files(directory, reload)
243
+ puts_debug "Trying to delete file '#{file.basename}' from directory '#{file.directory}' ..."
244
+ if file.delete
245
+ files.delete(file)
246
+ puts_debug "File successfully deleted!"
247
+ return true
248
+ else
249
+ puts_debug "File delete failed!"
250
+ return false
251
+ end
252
+ end
253
+
254
+ def clear(directory=nil)
255
+ if directory.nil?
256
+ self.directories = []
257
+ self.directories_files = {}
258
+ puts_debug "Directories cache cleared!"
259
+ else
260
+ self.directories_files.delete(directory)
261
+ puts_debug "Directory's `#{directory}` cache cleared!"
262
+ end
263
+ return true
264
+ end
265
+ end
266
+ end
@@ -0,0 +1,153 @@
1
+ module ImageVenue
2
+ class File
3
+ class << self
4
+ def parse_upload(response_body)
5
+ hpricot = Hpricot(response_body)
6
+ textareas = hpricot.search('textarea')
7
+ image_url = textareas[0].inner_text.strip
8
+ file = self.new(image_url, ImageVenue.directory.selected)
9
+ return file
10
+ end
11
+
12
+ def parse_forum_codes(response_body, directory)
13
+ files = []
14
+ hpricot = Hpricot(response_body)
15
+ image_urls = hpricot.search('p:last').last.inner_text.scan(/\[URL=(.+?)\]/i).flatten
16
+ image_urls.each do |image_url|
17
+ file = self.new(image_url, directory)
18
+ files.push(file)
19
+ end
20
+ return files
21
+ end
22
+
23
+ def delete_uri
24
+ @delete_uri ||= URI.parse(ImageVenue.base_url + '/manage_files.php')
25
+ end
26
+
27
+ def delete_file_key
28
+ @delete_file_key ||= 'delete_files[]'
29
+ end
30
+
31
+ def delete_submit_key
32
+ @delete_submit_key ||= 'submit'
33
+ end
34
+
35
+ def delete_submit_value
36
+ @delete_submit_value ||= 'Delete'
37
+ end
38
+
39
+ def cookie_view_directory
40
+ @cookie_view_directory ||= 'view_dir'
41
+ end
42
+ end
43
+
44
+ attr_accessor :directory
45
+ attr_accessor :image_url
46
+ attr_accessor :debug
47
+
48
+ def initialize(image_url, directory=nil)
49
+ self.directory = directory
50
+ self.image_url = image_url
51
+ return nil
52
+ end
53
+
54
+ def debug?
55
+ (ImageVenue.debug or self.debug) ? true : false
56
+ end
57
+
58
+ def puts_debug(*args)
59
+ if self.debug?
60
+ puts(*args)
61
+ return true
62
+ else
63
+ return false
64
+ end
65
+ end
66
+
67
+ def image_io
68
+ if @image_io.nil?
69
+ puts_debug "Trying to fetch image data ..."
70
+ image_html = open(self.image_url)
71
+ image_uri = URI.parse(self.image_url)
72
+ image_uri.path = '/' + Hpricot(image_html).search('img[@id="thepic"]:first').first['src']
73
+ @image_io = open(image_uri)
74
+ puts_debug "Image data successfully fetched!"
75
+ else
76
+ puts_debug "Image data from cache!"
77
+ end
78
+ return @image_io
79
+ end
80
+
81
+ def thumbnail_io
82
+ if @thumbnail_io.nil?
83
+ puts_debug "Trying to fetch thumbnail data ..."
84
+ @thumbnail_io = open(self.thumbnail_url)
85
+ puts_debug "Thumbnail data successfully fetched!"
86
+ else
87
+ puts_debug "Thumbnail data from cache!"
88
+ end
89
+ return @thumbnail_io
90
+ end
91
+
92
+ def thumbnail_url
93
+ if @thumbnail_url.nil? and self.image_url =~ /_(\d+)lo/
94
+ @thumbnail_url = self.image_url.gsub('img.php?image=', "loc#{$1}/th_")
95
+ end
96
+ return @thumbnail_url
97
+ end
98
+
99
+ def thumbnail_for_board_upper
100
+ @thumbnail_for_board_upper ||= "[URL=#{self.image_url}][IMG]#{self.thumbnail_url}[/IMG][/URL]"
101
+ end
102
+
103
+ def thumbnail_for_board_lower
104
+ @thumbnail_for_board_lower ||= "[url=#{self.image_url}][img]#{self.thumbnail_url}[/img][/url]"
105
+ end
106
+
107
+ def thumbnail_for_website
108
+ @thumbnail_for_website ||= "<a href=\"#{self.image_url}\" target=_blank><img src=\"#{self.thumbnail_url}\" border=\"0\"></a>"
109
+ end
110
+
111
+ def basename
112
+ @basename ||= $1 if self.image_url =~ /image=(.+)$/
113
+ end
114
+
115
+ def clear
116
+ @image_io = nil
117
+ @thumbnail_io = nil
118
+ @thumbnail_url = nil
119
+ @thumbnail_for_board_upper = nil
120
+ @thumbnail_for_board_lower = nil
121
+ @thumbnail_for_website = nil
122
+ @basename = nil
123
+ puts_debug "File's `#{self.basename}` cache cleared!"
124
+ return true
125
+ end
126
+
127
+ def delete
128
+ puts_debug "Trying to delete file `#{self.basename}` from directory `#{self.directory}` ..."
129
+ request = Net::HTTP::Post.new(self.class.delete_uri.path)
130
+ request.form_data = self.delete_params
131
+ ImageVenue.authenticate.cookie[self.class.cookie_view_directory] = self.directory
132
+ request.header['cookie'] = [ImageVenue.authenticate.cookie_as_string]
133
+ response = Net::HTTP.start(self.class.delete_uri.host, self.class.delete_uri.port) do |http|
134
+ http.request(request)
135
+ end
136
+ ImageVenue.authenticate.cookie.delete(self.class.cookie_view_directory)
137
+ if response.is_a?(Net::HTTPSuccess)
138
+ puts_debug "File `#{self.basename}` successfully deleted!"
139
+ return true
140
+ else
141
+ puts_debug "File `#{self.basename}` delete failed!"
142
+ return false
143
+ end
144
+ end
145
+
146
+ def delete_params
147
+ {
148
+ self.class.delete_submit_key => self.class.delete_submit_value,
149
+ self.class.delete_file_key => self.basename
150
+ }
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,20 @@
1
+ module ImageVenue
2
+ module NetHttpGetExtensions
3
+ def self.included(base)
4
+ base.send(:extend, ClassMethods)
5
+ base.send(:include, InstanceMethods)
6
+ base.class_eval do
7
+ attr_accessor :header
8
+ end
9
+ return nil
10
+ end
11
+
12
+ module ClassMethods
13
+ end
14
+
15
+ module InstanceMethods
16
+ end
17
+ end
18
+ end
19
+
20
+ Net::HTTP::Get.send(:include, ImageVenue::NetHttpGetExtensions)
@@ -0,0 +1,157 @@
1
+ # Multipart POST file upload for Net::HTTP::Post.
2
+ #
3
+ # By Leonardo Boiko <leoboiko@gmail.com>, public domain.
4
+ # By Michael Nowak <thexsystem@web.de>, public domain.
5
+ #
6
+ # Usage: see documentation for Net::HTTP::Post#set_multipart_data.
7
+
8
+ require 'fileutils' unless defined?(FileUtils)
9
+
10
+ module ImageVenue
11
+ module NetHttpPostExtensions
12
+ def self.included(base)
13
+ base.send(:extend, ClassMethods)
14
+ base.send(:include, InstanceMethods)
15
+ base.class_eval do
16
+ attr_accessor :header
17
+ end
18
+ return nil
19
+ end
20
+
21
+ module ClassMethods
22
+ end
23
+
24
+ module InstanceMethods
25
+ # Similar to Net::HTTP::Post#set_form_data (in Ruby's stardard
26
+ # library), but set up file upload parameters using the
27
+ # appropriate HTTP/HTML Forms multipart format.
28
+ #
29
+ # *Arguments*
30
+ #
31
+ # files_params:: A hash of file upload parameters. The keys are
32
+ # parameter names, and the values are
33
+ # Net::HTTP::FileForPost instances. See that
34
+ # class documentation for more info about how
35
+ # POST file upload works.
36
+ #
37
+ # other_params:: A hash of {key => value} pairs for the regular
38
+ # POST parameters, just like in set_form_data.
39
+ # Don't mix set_form_data and set_multipart_data;
40
+ # they'll overwrite each other's work.
41
+ #
42
+ # boundary1, boundary2:: A couple of strings which doesn't occur
43
+ # in your files. Boundary2 is only
44
+ # needed if you're using the
45
+ # multipart/mixed technique. The
46
+ # defaults should be OK for most cases.
47
+ #
48
+ # *Examples*
49
+ #
50
+ # Simplest case (single-parameter single-file), complete:
51
+ #
52
+ # require 'net/http'
53
+ # require 'net_http_post_extensions'
54
+ #
55
+ # req = Net::HTTP::Post.new('/scripts/upload.rb')
56
+ # req.basic_auth('jack', 'inflamed sense of rejection')
57
+ #
58
+ # file = Net::HTTP::FileForPost.new('/body/yourlife.txt', 'text/plain')
59
+ # req.set_multipart_data({:poem => file},
60
+ #
61
+ # {:author => 'jack',
62
+ # :user_agent => 'soapfactory'})
63
+ #
64
+ # res = Net::HTTP.new(url.host, url.port).start do |http|
65
+ # http.request(req)
66
+ # end
67
+ #
68
+ # Convoluted example:
69
+ #
70
+ # pic1 = Net::HTTP::FileForPost.new('pic1.jpeg', 'image/jpeg')
71
+ # pic2 = Net::HTTP::FileForPost.new(pic2_io, 'image/jpeg')
72
+ # pic3 = Net::HTTP::FileForPost.new('pic3.png', 'image/png')
73
+ # pic1_t = Net::HTTP::FileForPost.new('pic1_thumb.jpeg', 'image/jpeg')
74
+ # pic2_t = Net::HTTP::FileForPost.new(pic2_t_io, 'image/jpeg')
75
+ # desc = Net::HTTP::FileForPost.new('desc.html', 'text/html',
76
+ # 'index.html') # remote fname
77
+ #
78
+ # req.set_multipart_data({:gallery_description => des,
79
+ # :pictures => [pic1, pic2, pic3],
80
+ # :thumbnails => [pic1_t, pic2_t]},
81
+ #
82
+ # {:gallery_name => 'mygallery',
83
+ # :encoding => 'utf-8'})
84
+ #
85
+ def set_multipart_data(files_params, other_params={}, boundary1='paranguaricutirimirruaru0xdeadbeef', boundary2='paranguaricutirimirruaru0x20132')
86
+ self.content_type = "multipart/form-data; boundary=\"#{boundary1}\""
87
+
88
+ body = StringIO.new('r+b')
89
+
90
+ # let's do the easy ones first
91
+ other_params.each do |key, value|
92
+ body.write "--#{boundary1}\r\n"
93
+ body.write "content-disposition: form-data; name=\"#{key}\"\r\n"
94
+ body.write "\r\n"
95
+ body.write "#{value}\r\n"
96
+ end
97
+
98
+ # now handle the files...
99
+ files_params.each do |name, file_or_files|
100
+ files = [file_or_files].flatten
101
+
102
+ if name.to_s =~ /\[\]$/
103
+ files.each do |file|
104
+ body.write "\r\n--#{boundary1}\r\n"
105
+ body.write "content-disposition: form-data; name=\"#{name}\""
106
+ # single-file multipart is different
107
+ if file.filename
108
+ # right in content-dispo line
109
+ body.write "; filename=\"#{file.filename}\"\r\n"
110
+ else
111
+ body.write "\r\n"
112
+ end
113
+
114
+ body.write "Content-Type: #{file.content_type}\r\n"
115
+ body.write "Content-Transfer-Encoding: binary\r\n"
116
+ body.write "\r\n"
117
+ FileUtils.copy_stream(file, body)
118
+ end
119
+ else
120
+ body.write "\r\n--#{boundary1}\r\n"
121
+ body.write "content-disposition: form-data; name=\"#{name}\""
122
+ # multiple-file parameter (multipart/mixed)
123
+ body.write "\r\n"
124
+ body.write "Content-Type: multipart/mixed;"
125
+ body.write " boundary=\"#{boundary2}\"\r\n"
126
+
127
+ files.each do |file|
128
+ body.write "\r\n--#{boundary2}\r\n"
129
+
130
+ body.write "Content-disposition: attachment"
131
+ if file.filename
132
+ body.write "; filename=\"#{file.filename}\"\r\n"
133
+ else
134
+ body.write "\r\n"
135
+ end
136
+
137
+ body.write "Content-Type: #{file.mimetype}\r\n"
138
+ body.write "Content-Transfer-Encoding: binary\r\n"
139
+ body.write "\r\n"
140
+ FileUtils.copy_stream(file, body)
141
+ end
142
+ body.write "\r\n--#{boundary2}--\r\n"
143
+ end
144
+ end
145
+ body.write "--#{boundary1}--\r\n"
146
+
147
+ body.flush
148
+ self.content_length = body.size
149
+ self.body_stream = body
150
+ self.body_stream.rewind
151
+ return true
152
+ end
153
+ end
154
+ end
155
+ end
156
+
157
+ Net::HTTP::Post.send(:include, ImageVenue::NetHttpPostExtensions)
@@ -0,0 +1,137 @@
1
+ module ImageVenue
2
+ class Upload
3
+ class << self
4
+ def upload_uri
5
+ @upload_uri ||= URI.parse(ImageVenue.base_url + '/upload.php')
6
+ end
7
+
8
+ def upload_action_key
9
+ @upload_action_key ||= 'action'
10
+ end
11
+
12
+ def upload_user_key
13
+ @upload_user_key ||= 'user_id'
14
+ end
15
+
16
+ def upload_file_key
17
+ @upload_file_key ||= 'userfile[]'
18
+ end
19
+
20
+ def upload_directory_key
21
+ @upload_directory_key ||= 'upload_dir'
22
+ end
23
+
24
+ def upload_content_key
25
+ @upload_content_key ||= 'imgcontent'
26
+ end
27
+
28
+ def upload_content_safe
29
+ @upload_content_safe ||= 'safe'
30
+ end
31
+ alias :upload_content_family :upload_content_safe
32
+
33
+ def upload_content_notsafe
34
+ @upload_content_notsafe ||= 'notsafe'
35
+ end
36
+ alias :upload_content_adult :upload_content_notsafe
37
+
38
+ def upload_resize_key
39
+ @upload_resize_key ||= 'img_resize'
40
+ end
41
+
42
+ def upload_maximum_files
43
+ @upload_maximum_files ||= 10
44
+ end
45
+
46
+ def upload_maximum_size
47
+ @upload_maximum_size ||= 3 * 1024 * 1024 # 3 MByte
48
+ end
49
+
50
+ def upload_image_types
51
+ @upload_image_types ||= ['jpeg', 'jpg']
52
+ end
53
+ end
54
+
55
+ attr_accessor :files
56
+ attr_accessor :debug
57
+
58
+ def initialize
59
+ self.files = []
60
+ return nil
61
+ end
62
+
63
+ def debug?
64
+ (ImageVenue.debug or self.debug) ? true : false
65
+ end
66
+
67
+ def puts_debug(*args)
68
+ if self.debug?
69
+ puts(*args)
70
+ return true
71
+ else
72
+ return false
73
+ end
74
+ end
75
+
76
+ def add(image_venue_file)
77
+ if image_venue_file.is_a?(ImageVenue::UploadFile)
78
+ self.files.push(image_venue_file)
79
+ return true
80
+ else
81
+ return false
82
+ end
83
+ end
84
+
85
+ def upload
86
+ files = []
87
+ self.files.each do |file|
88
+ puts_debug "Trying to upload file `#{file.filename}` to directory `#{file.directory}` ..."
89
+ request = Net::HTTP::Post.new(self.class.upload_uri.path)
90
+ request.set_multipart_data(self.upload_file_params(file), self.upload_form_params(file.directory))
91
+ request.header['cookie'] = [ImageVenue.authenticate.cookie_as_string]
92
+ response = Net::HTTP.start(self.class.upload_uri.host, self.class.upload_uri.port) do |http|
93
+ http.request(request)
94
+ end
95
+ if response.is_a?(Net::HTTPSuccess)
96
+ file = ImageVenue::File.parse_upload(response.body)
97
+ puts_debug "File successfully uploaded!"
98
+ else
99
+ file = false
100
+ puts_debug "File upload failed!"
101
+ end
102
+ files.push(file)
103
+ end
104
+ return files
105
+ end
106
+ alias :process :upload
107
+
108
+ def upload_file_params(file_or_files=nil)
109
+ {
110
+ self.class.upload_file_key => file_or_files
111
+ }
112
+ end
113
+
114
+ def upload_form_params(directory=nil, content_safe=false, resize=nil)
115
+ unless directory.nil?
116
+ ImageVenue.directory.select_or_create(directory)
117
+ end
118
+ params = {
119
+ self.class.upload_action_key => '1',
120
+ self.class.upload_directory_key => ImageVenue.directory.selected,
121
+ self.class.upload_user_key => ImageVenue.authenticate.cookie[ImageVenue::Authenticate.cookie_user_key],
122
+ self.class.upload_content_key => (content_safe) ? self.class.upload_content_safe : self.class.upload_content_notsafe,
123
+ self.class.upload_resize_key => resize || ''
124
+ }
125
+ return params
126
+ end
127
+
128
+ def status
129
+ return nil
130
+ end
131
+
132
+ def reset
133
+ self.files = []
134
+ return self
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,84 @@
1
+ module ImageVenue
2
+ class UploadFile
3
+ class << self
4
+ def content_types
5
+ @content_types ||= ['jpeg', 'jpg']
6
+ end
7
+
8
+ def from_local_path(path)
9
+ file = Kernel::File.open(path, 'rb')
10
+ content_type = `file --mime --brief #{file.path}`.strip
11
+ filename = Kernel::File.basename(file.path)
12
+ data = file.read
13
+ new = self.new(content_type, filename, data)
14
+ return new
15
+ end
16
+ alias :from_path :from_local_path
17
+
18
+ def from_files(files, directory)
19
+ news = []
20
+ files.each do |file|
21
+ new = self.new(file.content_type, file.original_filename, file, directory)
22
+ news.push(new)
23
+ end
24
+ return news
25
+ end
26
+
27
+ def upload_file_test
28
+ @upload_file_test ||= self.from_local_path(Kernel::File.join(Kernel::File.dirname(__FILE__), 'test.jpg'))
29
+ end
30
+ end
31
+
32
+ attr_accessor :content_type
33
+ attr_accessor :filename
34
+ attr_accessor :data
35
+ attr_accessor :directory
36
+ attr_accessor :debug
37
+
38
+ def initialize(content_type, filename, data, directory=nil)
39
+ self.content_type = content_type
40
+ self.filename = filename
41
+ self.data = data
42
+ self.directory = directory
43
+ return nil
44
+ end
45
+
46
+ def debug?
47
+ (ImageVenue.debug or self.debug) ? true : false
48
+ end
49
+
50
+ def puts_debug(*args)
51
+ if self.debug?
52
+ puts(*args)
53
+ return true
54
+ else
55
+ return false
56
+ end
57
+ end
58
+
59
+ def data_io
60
+ @data_io ||= StringIO.new(self.data) if self.data.is_a?(String)
61
+ @data_io ||= self.data
62
+ return @data_io
63
+ end
64
+
65
+ def read(bytes=nil)
66
+ self.data_io.read(bytes)
67
+ end
68
+
69
+ def rewind
70
+ self.data_io.rewind
71
+ end
72
+
73
+ def size
74
+ if self.data.is_a?(String)
75
+ @size ||= self.data.length
76
+ elsif self.data.respond_to?(:size)
77
+ @size ||= self.data.size
78
+ elsif self.data.respond_to?(:length)
79
+ @size ||= self.data.length
80
+ end
81
+ return @size
82
+ end
83
+ end
84
+ end
metadata ADDED
@@ -0,0 +1,69 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: imagevenue
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Michael Nowak
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-02-16 00:00:00 +01:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: hpricot
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0.6"
24
+ version:
25
+ description: Accessing your ImageVenue account via a Ruby-Library. With support for listing, creating, deleting directories and listing, uploading and deleting files. Generates BB-Code or HTML-Code four you, too.
26
+ email: michael.nowak@thexsystem.de
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files: []
32
+
33
+ files:
34
+ - image_venue.rb
35
+ - image_venue/authenticate.rb
36
+ - image_venue/directory.rb
37
+ - image_venue/file.rb
38
+ - image_venue/net_http_get_extensions.rb
39
+ - image_venue/net_http_post_extensions.rb
40
+ - image_venue/upload.rb
41
+ - image_venue/upload_file.rb
42
+ has_rdoc: false
43
+ homepage:
44
+ post_install_message:
45
+ rdoc_options: []
46
+
47
+ require_paths:
48
+ - .
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: "0"
54
+ version:
55
+ required_rubygems_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: "0"
60
+ version:
61
+ requirements: []
62
+
63
+ rubyforge_project: imagevenue
64
+ rubygems_version: 1.3.1
65
+ signing_key:
66
+ specification_version: 2
67
+ summary: Accessing your ImageVenue account via a Ruby-Library
68
+ test_files: []
69
+