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 +51 -0
- data/image_venue/authenticate.rb +125 -0
- data/image_venue/directory.rb +266 -0
- data/image_venue/file.rb +153 -0
- data/image_venue/net_http_get_extensions.rb +20 -0
- data/image_venue/net_http_post_extensions.rb +157 -0
- data/image_venue/upload.rb +137 -0
- data/image_venue/upload_file.rb +84 -0
- metadata +69 -0
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
|
data/image_venue/file.rb
ADDED
@@ -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
|
+
|