mediafire 1.2.1 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,8 +1,11 @@
1
1
  # mediafire.gem
2
+
2
3
  Ruby wrapper for the unofficial Mediafire API
3
4
 
4
5
  ## Installation
5
- gem install mediafire
6
+
7
+ gem install mediafire
6
8
 
7
9
  ## Usage
10
+
8
11
  See examples folder
@@ -1,7 +1,8 @@
1
- require './common'
1
+ require 'mediafire'
2
2
 
3
- m = login
3
+ m = Mediafire.new
4
+ m.login("<account>", "<password>")
5
+
6
+ folder = m.create_folder("<folder_name>")
4
7
 
5
- uuid = create_uuid
6
- folder = m.create_folder(uuid, root_folder)
7
8
  puts "folder name : #{folder.name}"
@@ -1,15 +1,13 @@
1
- require './common.rb'
1
+ require 'mediafire'
2
2
 
3
- m = login
3
+ m = Mediafire.new
4
+ m.login("<account>", "<password>")
4
5
 
5
- uuid = create_uuid
6
- folder = m.create_folder(uuid, root_folder)
6
+ folder = m.create_folder("<folder_name>")
7
+ re = m.delete(folder)
7
8
 
8
- uuid1 = create_uuid
9
- File.open(uuid1, "w") do |f|
10
- f.write(uuid1)
11
- end
12
- file = m.upload(uuid1)
13
- File.delete(uuid1)
9
+ filepath = "testfile"
10
+ file = m.upload(filepath)
11
+ folder = m.create_folder("delete_test")
14
12
 
15
13
  re = m.delete([file, folder])
@@ -1,13 +1,12 @@
1
- require './common'
1
+ require 'mediafire'
2
2
 
3
3
  m = Mediafire.new
4
4
 
5
- uuid = create_uuid
6
- File.open(uuid, "w") do |f|
7
- f.write(uuid)
8
- end
9
- file1 = m.upload(uuid)
10
- File.delete(uuid)
11
- puts pritty_format_datafile(file1)
5
+ filepath = "testfile"
6
+ file = m.upload(filepath)
7
+ out = "filename:#{file.name} "
8
+ out << "size:#{file.size} "
9
+ out << "link:http://www.mediafire.com/download.php?#{file.key}"
10
+ puts out
12
11
 
13
- puts m.download(file1)
12
+ puts m.download(file)
@@ -1,12 +1,9 @@
1
- require './common'
1
+ require 'mediafire'
2
2
 
3
- m = login
3
+ m = Mediafire.new
4
+ m.login("<account>", "<password>")
4
5
 
5
- uuid = create_uuid + '.gif'
6
- File.open(uuid, 'w') do |f|
7
- f.write(File.open('./pic.gif').read)
8
- end
9
- pic = m.upload(uuid)
10
- File.delete(uuid)
6
+ filepath = "testfile.gif"
7
+ pic = m.upload(filepath)
11
8
 
12
9
  puts m.download_image(pic)
@@ -1,24 +1,14 @@
1
- require './common'
1
+ require 'mediafire'
2
2
 
3
- m = login
3
+ m = Mediafire.new
4
+ m.login("<account>", "<password>")
4
5
 
5
- uuid = create_uuid
6
- File.open(uuid, "w") do |f|
7
- f.write(uuid)
8
- end
9
- file1 = m.upload(uuid)
10
- File.delete(uuid)
11
- puts 'upload file1'
6
+ filepath1 = "testfile1"
7
+ file1 = m.upload(filepath1)
8
+ puts "upload complete #{file1.name}"
12
9
 
13
- uuid = create_uuid
14
- File.open(uuid, "w") do |f|
15
- f.write(uuid)
16
- end
17
- file2 = m.upload(uuid)
18
- File.delete(uuid)
19
- puts 'upload file2'
10
+ filepath2 = "testfile2"
11
+ file2 = m.upload(filepath2)
12
+ puts "upload complete #{file2.name}"
20
13
 
21
- files = [file1, file2]
22
-
23
-
24
- m.downloads(files)
14
+ m.downloads([file1, file2])
@@ -1,8 +1,11 @@
1
- require './common'
1
+ require 'mediafire'
2
2
 
3
- m = login
3
+ m = Mediafire.new
4
+ m.login("<account>", "<password>")
4
5
 
5
- uuid = create_uuid
6
- folder = m.create_folder(uuid, root_folder)
6
+ folder = m.create_folder("<folder_name>")
7
7
  m.dropbox_setup(folder, true)
8
8
 
9
+ folder = m.create_folder("<folder_name>")
10
+ m.dropbox_setup(folder, true)
11
+ m.dropbox_setup(folder, false)
@@ -1,9 +1,9 @@
1
- require './common'
1
+ require 'mediafire'
2
2
 
3
- m = login
3
+ m = Mediafire.new
4
+ m.login("<account>", "<password>")
4
5
 
5
- uuid = create_uuid
6
- folder = m.create_folder(uuid, root_folder)
6
+ folder = m.create_folder("<folder_name>")
7
7
  m.dropbox_setup(folder, true)
8
8
  options = {
9
9
  :header => 'edited',
@@ -1,6 +1,7 @@
1
- require './common'
1
+ require 'mediafire'
2
2
 
3
3
  m = Mediafire.new
4
- dropbox_id = ''
5
- m.dropbox_upload('test.txt', dropbox_id)
4
+ dropbox_id = '<dropbox_id>'
5
+ filepath = "testfile"
6
+ m.dropbox_upload(filepath, dropbox_id)
6
7
 
@@ -1,20 +1,11 @@
1
- require './common'
1
+ require 'mediafire'
2
2
 
3
- m = login
3
+ m = Mediafire.new
4
+ m.login("<account>", "<password>")
4
5
 
5
- uuid = create_uuid
6
- File.open(uuid, "w") do |f|
7
- f.write(uuid)
8
- end
6
+ filepath = "testfile"
7
+ file = m.upload(filepath)
9
8
 
10
- m = login
11
- file = m.upload(uuid)
12
- options = {
13
- :filename => 'edited',
14
- :description => 'edited',
15
- :tags => 'edited',
16
- :password => 'edited',
17
- }
18
- m.edit_fileoption(file, options)
19
-
20
- File.delete(uuid)
9
+ file = m.rename(file, 'edited')
10
+ file = m.description(file, 'edited')
11
+ file = m.password(file, 'edited')
@@ -1,4 +1,11 @@
1
- require './common'
1
+ require 'mediafire'
2
2
 
3
- m = login
4
- m.list.each {|n| puts pritty_format_datafile(n) unless n.is_folder?}
3
+ m = Mediafire.new
4
+ m.login("<account>", "<password>")
5
+
6
+ m.file_list.each do |n|
7
+ out = "filename:#{n.name} "
8
+ out << "size:#{n.size} "
9
+ out << "link:http://www.mediafire.com/download.php?#{n.key}"
10
+ puts out
11
+ end
@@ -1,13 +1,12 @@
1
- require './common'
1
+ require 'mediafire'
2
2
 
3
- m = login
3
+ m = Mediafire.new
4
+ m.login("<account>", "<password>")
4
5
 
5
- uuid = create_uuid + '.gif'
6
- File.open(uuid, 'w') do |f|
7
- f.write(File.open('pic.gif').read)
8
- end
9
- pic = m.upload(uuid)
10
- File.delete(uuid)
6
+ filepath = "testfile.gif"
7
+ pic = m.upload(filepath)
11
8
 
12
9
  m.image_rotation(pic, 90)
13
-
10
+ #m.image_rotation(pic, 180)
11
+ #m.image_rotation(pic, 270)
12
+ #m.image_rotation(pic, 0)
@@ -1,10 +1,12 @@
1
- require './common'
1
+ require 'mediafire'
2
2
 
3
- uuid = create_uuid
4
- uuid1 = create_uuid
5
- m = login
6
- folder = m.create_folder(uuid, root_folder)
7
- file = m.create_folder(uuid1, root_folder)
3
+ m = Mediafire.new
4
+ m.login("<account>", "<password>")
8
5
 
9
- re = m.move(file, folder)
6
+ filepath = "testfile"
7
+ file = m.upload(filepath)
10
8
 
9
+ folder1 = m.create_folder("<folder_name>")
10
+ folder2 = m.create_folder("<folder_name>")
11
+
12
+ re = m.move([file, folder1], folder2)
@@ -1,6 +1,9 @@
1
- require './common'
1
+ require 'mediafire'
2
2
 
3
- m = login
4
- quickkey = ''
3
+ m = Mediafire.new
4
+ m.login("<account>", "<password>")
5
+
6
+ download_url = 'http://www.mediafire.com/?xxxxxxxxxxxxxxx'
7
+ quickkey = download_url.match(/\?(.*)/)[1]
5
8
  m.save_file_to_my_account(quickkey)
6
9
 
@@ -1,7 +1,7 @@
1
- require './common'
1
+ require 'mediafire'
2
2
 
3
- uuid = create_uuid
3
+ m = Mediafire.new
4
+ m.login("<account>", "<password>")
4
5
 
5
- m = login
6
- folder = m.create_folder(uuid, root_folder)
6
+ folder = m.create_folder("<folder name>")
7
7
  m.toggle_acl(folder)
@@ -1,22 +1,12 @@
1
- require './common'
1
+ require 'mediafire'
2
2
 
3
- m = login
3
+ m = Mediafire.new
4
+ m.login("<account>", "<password>")
4
5
 
5
- uuid = create_uuid
6
- File.open(uuid, "w") do |f|
7
- f.write(uuid)
8
- end
9
- file_a = m.upload(uuid)
10
- File.delete(uuid)
6
+ filepath1 = "testfile1"
7
+ filepath2 = "testfile2"
8
+ file_a = m.upload(filepath1)
9
+ file_b = m.upload(filepath2)
11
10
 
12
- uuid = create_uuid
13
- File.open(uuid, "w") do |f|
14
- f.write(uuid)
15
- end
16
- file_b = m.upload(uuid)
17
- File.delete(uuid)
18
-
19
- puts pritty_format_datafile(file_a)
20
- puts pritty_format_datafile(file_b)
21
11
  m.update(file_a, file_b)
22
12
 
@@ -1,12 +1,10 @@
1
- require './common'
1
+ require 'mediafire'
2
2
 
3
- uuid = create_uuid
4
- File.open(uuid, "w") do |f|
5
- f.write(uuid)
6
- end
3
+ m = Mediafire.new
7
4
 
8
- m = login
9
- obj = m.upload(uuid)
10
- puts pritty_format_datafile(obj)
11
-
12
- File.delete(uuid)
5
+ filepath = "testfile"
6
+ file = m.upload(filepath)
7
+ out = "filename:#{file.name} "
8
+ out << "size:#{file.size} "
9
+ out << "link:http://www.mediafire.com/download.php?#{file.quickkey}"
10
+ puts out
@@ -9,8 +9,8 @@ queue = Queue.new
9
9
 
10
10
  file = ARGV[0]
11
11
  filename = File.basename(file)
12
- puts "Filename: " + filename
13
12
  filesize = File.stat(file).size
13
+ puts "Filename: " + filename
14
14
  puts "Filesize: " + filesize.to_s
15
15
 
16
16
  m = Mediafire.new
@@ -31,7 +31,7 @@ while upload_t.nil?
31
31
  sleep 0.1
32
32
  end
33
33
 
34
- pbar = ProgressBar.new('test(bytes)', filesize)
34
+ pbar = ProgressBar.new("#{filename}(bytes)", filesize)
35
35
  pbar.file_transfer_mode
36
36
  while upload_t.alive?
37
37
  uploadsize = m.upload_size filename
@@ -5,6 +5,7 @@ $:.unshift(File.dirname(__FILE__))
5
5
  require 'thread'
6
6
  require 'timeout'
7
7
  require 'nokogiri'
8
+ require 'json'
8
9
  require 'mediafire/connection'
9
10
  require 'mediafire/store_object'
10
11
  require 'mediafire/error'
@@ -2,10 +2,6 @@ module Mediafire
2
2
  module API
3
3
  include Mediafire::Connection
4
4
 
5
- def toppage
6
- get('')
7
- end
8
-
9
5
  def login(account, password)
10
6
  @cookie = {}
11
7
  toppage
@@ -14,8 +10,6 @@ module Mediafire
14
10
  :login_email => account,
15
11
  :login_pass => password,
16
12
  :login_remember => 'on',
17
- "submit_login.x" => 0,
18
- "submit_login.y" => 0,
19
13
  }
20
14
  post("dynamic/login.php", options)
21
15
  end
@@ -24,145 +18,129 @@ module Mediafire
24
18
  end
25
19
  end
26
20
 
27
- def list
21
+ def list(options={})
28
22
  raise NeedLogin unless is_loggedin?
29
23
 
30
- datas = []
31
- response = get(myfiles_path)
32
- key = response.body.match(/var eU ?= ?'(.*?)';/)[1]
33
- response.body.scan(/es\[\d+\]=Array\((.*?)\);/).each do |n|
34
- data = eval("[#{n[0]}]")
35
- datas.push StoreObject.new(data)
24
+ folder = options['folder']
25
+ filter = options['filter']
26
+ recursive = options['recursive'] || true
27
+
28
+ if folder.nil?
29
+ response = myfiles(recursive, filter)
30
+ else
31
+ response = info(folder.key, recursive)
36
32
  end
37
- root_folder = ['1', '2', '0', key, key, 'myfiles', '0'].fill('', 7..20)
38
- @root_folder = StoreObject.new(root_folder)
39
- return datas
33
+ StoreFolder.new(response)
40
34
  end
41
35
 
42
- def delete(files)
43
- raise NeedLogin unless is_loggedin?
44
-
45
- form_option = {
46
- :form_todolist1 => create_list(files),
47
- :form_todolist2 => '',
48
- :form_todotype => 1,
49
- :form_todoparent => '',
50
- :form_todoconfirm => '',
51
- }
52
- options = api_options[:doselected].merge(form_option)
53
- response = post('dynamic/doselected.php', options)
36
+ def folder_list
37
+ list('recursive' => true, 'filter' => 'folders').folders
38
+ end
54
39
 
55
- if response.body.match(/et ?= ?15;/)
56
- true
57
- else
58
- false
59
- end
40
+ def file_list
41
+ list('recursive' => true, 'filter' => 'files').files
60
42
  end
61
43
 
62
- def move(files, folder)
44
+ def delete(objs)
63
45
  raise NeedLogin unless is_loggedin?
64
46
 
65
- form_option = {
66
- :move_dest_navbar_filelist => folder.quickkey,
67
- :move_list => create_list(files),
68
- :Move => 'Move To Folder',
69
- }
70
- options = api_options[:move2folder].merge(form_option)
71
- response = post('dynamic/move2folder.php', options)
72
- if response.body.match(/et ?= ?15;/)
47
+ file_response = true
48
+ folder_response = true
49
+
50
+ obj = separate_store_object(objs)
51
+
52
+ file_response = delete_files(obj[:files]) unless obj[:files].empty?
53
+ folder_response = delete_folders(obj[:folders]) unless obj[:folders].empty?
54
+
55
+ if file_response and folder_response
73
56
  true
74
57
  else
75
58
  false
76
59
  end
77
60
  end
78
61
 
79
- # @param options {:filename, :description, :tags, :password}
80
- def edit_fileoption(file, options)
62
+ def move(src, dest)
81
63
  raise NeedLogin unless is_loggedin?
82
64
 
83
- new_options = {
84
- :todotype => file.objecttype,
85
- :todoquickkey => file.quickkey,
86
- :todofilename => file.name,
87
- :filename => options[:filename] || file.name,
88
- :desc => options[:description] || file.description,
89
- :tags => options[:tags] || file.tags,
90
- :password => options[:password] || file.password,
91
- }
65
+ file_response = true
66
+ folder_response = true
92
67
 
93
- if new_options[:desc].size > 200
94
- puts 'Error: description too long'
95
- return
96
- end
68
+ obj = separate_store_object(src)
97
69
 
98
- if new_options[:tags].size > 100
99
- puts 'Error: tags too long'
100
- return
101
- end
70
+ file_response = move_files(obj[:files], dest) unless obj[:files].empty?
71
+ folder_response = move_folders(obj[:folders], dest) unless obj[:folders].empty?
102
72
 
103
- response = post('dynamic/dofileoptions.php', new_options)
104
- if response.body.match(/et ?= ?15;/)
73
+ if file_response and folder_response
105
74
  true
106
75
  else
107
76
  false
108
77
  end
109
78
  end
110
79
 
111
- # @param note {:subject, :description}
112
- def edit_note(file, note)
113
- raise NeedLogin unless is_loggedin?
114
-
80
+ def rename(file, name)
115
81
  options = {
116
- :subject => note[:subject] || file.note_subject,
117
- :description => note[:description] || file.note_description,
82
+ 'filename' => name,
83
+ 'description' => file.description,
118
84
  }
119
- if options[:description].length > 10000
120
- puts "Error: description too long"
121
- return
85
+ if file_update(file, options)
86
+ pick_object(file.key, 'file')
87
+ else
88
+ nil
122
89
  end
123
- type = file.is_folder? ? 'folder' : 'file'
124
- post("dynamic/editfilenotes.php?quickkey=#{file.quickkey}&t=#{type}", options)
125
- return true
126
90
  end
127
91
 
128
- def create_folder(name, folder)
129
- raise NeedLogin unless is_loggedin?
130
-
92
+ def description(file, desc)
131
93
  options = {
132
- :new_folder_parent => folder.folderkey,
133
- :new_folder_name => name,
94
+ 'filename' => file.name,
95
+ 'description' => desc,
134
96
  }
135
- response = post("dynamic/createfolder.php", options)
136
- unless response.body.match(/et ?= ?15;/)
137
- return nil
97
+ if file_update(file, options)
98
+ pick_object(file.key, 'file')
99
+ else
100
+ nil
138
101
  end
102
+ end
139
103
 
140
- quickkey = response.body.match(/var ia='(.*?)';/)[1]
141
- date = Time.now.gmtime.strftime("%m/%d/%Y")
142
- fquickkey = response.body.match(/var mO='(.*?)';/)[1]
143
-
144
- data = ['1', '2', 0, quickkey, folder.folderkey, name, '0', '', '',
145
- '', date, '0', '', '', '', fquickkey, '0', '0', '', '', '']
146
- StoreObject.new(data)
104
+ def password(file, pass)
105
+ options = {
106
+ 'password' => pass,
107
+ }
108
+ if file_update(file, options)
109
+ pick_object(file.key, 'file')
110
+ else
111
+ nil
112
+ end
147
113
  end
148
114
 
149
- def toggle_acl(file, recursive=false)
115
+ def create_folder(newname, folder=nil)
150
116
  raise NeedLogin unless is_loggedin?
151
117
 
152
- if file.access_type == '0'
153
- access_type = '1'
118
+ options = base_query
119
+ options << "foldername=#{newname}"
120
+ options << "parent_key=#{folder.key}" unless folder.nil?
121
+
122
+ response = get("api/folder/create.php?#{options.join('&')}")
123
+ response = JSON.parse(response.body)['response']
124
+ if response['result'] == 'Success'
125
+ pick_object(response['folder_key'], 'folder', folder)
154
126
  else
155
- access_type = '0'
127
+ nil
156
128
  end
157
- query = "quickkey=#{file.quickkey}&acl=#{access_type}&type=#{file.objecttype}"
158
- if recursive && file.is_folder?
159
- query << "&recursive=1"
129
+ end
130
+
131
+ def toggle_acl(file, recursive=false)
132
+ options = {}
133
+ if file.is_public?
134
+ options['privacy'] = 'private'
135
+ else
136
+ options['privacy'] = 'public'
160
137
  end
161
- response = get("dynamic/doaclchange.php?#{query}")
162
- if response.body.match(/et ?= ?15;/)
163
- true
138
+ options['privacy_recursive'] = 'yes' if recursive
139
+
140
+ if file_update(file, options)
141
+ pick_object(file.key, 'file')
164
142
  else
165
- false
143
+ nil
166
144
  end
167
145
  end
168
146
 
@@ -179,19 +157,22 @@ module Mediafire
179
157
  if folder.nil?
180
158
  keys[:folderkey] = c.xpath('./folderkey').text
181
159
  else
182
- keys[:folderkey] = folder.folder_quickkey
160
+ keys[:folderkey] = folder.key
183
161
  end
184
162
  end
185
163
  keys[:mful_config] = doc.xpath('//mediafire/MFULConfig').text
186
164
 
187
- query = "type=basic"
188
- query << "&ukey=#{keys[:ukey]}&user=#{keys[:user]}"
189
- query << "&uploadkey=#{keys[:folderkey]}"
190
- query << "&filenum=0&uploader=0"
191
- query << "&MFULConfig=#{keys[:mful_config]}"
165
+ query = []
166
+ query << "type=basic"
167
+ query << "ukey=#{keys[:ukey]}"
168
+ query << "user=#{keys[:user]}"
169
+ query << "uploadkey=#{keys[:folderkey]}"
170
+ query << "filenum=0"
171
+ query << "uploader=0"
172
+ query << "MFULConfig=#{keys[:mful_config]}"
192
173
  response = File.open(filepath) do |f|
193
174
  options = {:Filedata => UploadIO.new(f, 'application/octet-stream', filename)}
194
- post("douploadtoapi?#{query}", options)
175
+ post("douploadtoapi?#{query.join('&')}", options)
195
176
  end
196
177
  doc = Nokogiri::XML(response.body)
197
178
  keys[:filekey] = doc.xpath('//response/doupload/key').text
@@ -202,31 +183,22 @@ module Mediafire
202
183
  end
203
184
 
204
185
  keys[:quickkey] = nil
205
- query = "key=#{keys[:filekey]}&MFULConfig=#{keys[:mful_config]}"
186
+
187
+ query = []
188
+ query << "key=#{keys[:filekey]}"
189
+ query << "MFULConfig=#{keys[:mful_config]}"
206
190
  while keys[:quickkey] == nil || keys[:quickkey] == ''
207
- response = get("basicapi/pollupload.php?#{query}")
191
+ response = get("basicapi/pollupload.php?#{query.join('&')}")
208
192
  doc = Nokogiri::XML(response.body)
209
193
  keys[:quickkey] = doc.xpath('//response/doupload/quickkey').text
210
194
  keys[:size] = doc.xpath('//response/doupload/size').text
211
195
  sleep 0.5
212
196
  end
213
197
 
214
- options = {
215
- :filename => filename,
216
- :quickkey => keys[:quickkey],
217
- }
218
- response = post("basicapi/getfiletype.php?MFULConfig=#{keys[:mful_config]}", options)
219
- doc = Nokogiri::XML(response.body)
220
- keys[:filetype] = doc.xpath('//response/file/filetype').text
221
- keys[:sharekey] = doc.xpath('//response/file/sharekey').text
222
- keys[:r_size], keys[:r_sizeunit] = filesize_to_readable_filesize(keys[:size].to_i)
223
-
224
- data = ['1', '1', keys[:filetype], keys[:quickkey], '', filename, keys[:size],
225
- keys[:r_size], keys[:r_sizeunit], '0', Time.now.gmtime.strftime("%m/%d/%Y"),
226
- '0', '', '', '', keys[:sharekey], '0', '0', '', '', '']
227
- StoreObject.new(data)
198
+ pick_object(keys[:quickkey], 'file', folder)
228
199
  end
229
200
 
201
+
230
202
  #def webupload(url, folder)
231
203
  #end
232
204
 
@@ -235,15 +207,20 @@ module Mediafire
235
207
  return downloads(file)
236
208
  end
237
209
 
238
- response = get("?#{file.quickkey}")
210
+ if file.is_a?(StoreFile)
211
+ response = get("?#{file.key}")
212
+ else
213
+ response = get("?#{file}")
214
+ end
239
215
  if response.code.to_i == 302
240
216
  return response['Location']
241
217
  end
242
218
 
243
219
  body = response.body
244
- funcbody = body.scan(/ function .*?for.*?eval/)
220
+ funcbody = body.scan(/function .*?for.*?eval/)
245
221
  functions = funcbody.map {|n| n.match(/function (.*?)\(/).to_a[1]}
246
222
  decrypt_str = funcbody.map {|n| find_encrypt_string_and_decrypt(n)}
223
+ [body, funcbody, functions, decrypt_str]
247
224
 
248
225
  t = decrypt_str.last
249
226
  funcname = t.match(/(.*?)\(/)[1]
@@ -296,23 +273,7 @@ module Mediafire
296
273
  return
297
274
  end
298
275
 
299
- response = get("imgbnc.php/#{file.imagekey}#{size.to_s}g.jpg")
300
- response['Location']
301
- end
302
-
303
- def update(src, dest)
304
- raise NeedLogin unless is_loggedin?
305
-
306
- option = {
307
- "file_a" => src.quickkey,
308
- "file_b" => dest.quickkey,
309
- }
310
- response = post('dynamic/updatefile.php', option)
311
- if response.body.match(/et ?= ?15;/)
312
- true
313
- else
314
- false
315
- end
276
+ "#{ENDPOINT}imgbnc.php/#{file.hash}#{size.to_s}g.jpg"
316
277
  end
317
278
 
318
279
  def image_rotation(file, rotation)
@@ -323,19 +284,41 @@ module Mediafire
323
284
  return
324
285
  end
325
286
 
326
- unless ratation == 0 || ratation == 90 || ratation == 180 || ratation == 270
287
+ unless rotation == 0 || rotation == 90 || rotation == 180 || rotation == 270
327
288
  puts "Error: rotation need 0 or 90 or 180 or 270"
328
289
  return
329
290
  end
330
291
 
331
- get("dynamic/imagerotation.php?imgkey=#{file.imagekey}&newrotation=#{ratation.to_s}&nocache=#{rand.to_s}")
292
+ query = []
293
+ query << "imgkey=#{file.hash}"
294
+ query << "newrotation=#{rotation.to_s}"
295
+ query << "nocache=#{rand.to_s}"
296
+
297
+ get("dynamic/imagerotation.php?#{query.join('&')}")
332
298
  return true
333
299
  end
334
300
 
301
+ def update(dest, src)
302
+ raise NeedLogin unless is_loggedin?
303
+
304
+ query = base_query
305
+ query << "r=#{r(4)}"
306
+ query << "from_quickkey=#{src.key}"
307
+ query << "to_quickkey=#{dest.key}"
308
+ query << "quickkey=#{src.key}"
309
+
310
+ response = get("api/file/update_file.php?#{query.join('&')}")
311
+ if JSON.parse(response.body)['response']['result'] == 'Success'
312
+ true
313
+ else
314
+ false
315
+ end
316
+ end
317
+
335
318
  def save_file_to_my_account(quickkey)
336
319
  raise NeedLogin unless is_loggedin?
337
320
 
338
- response = get("dynamic/savefile.php?qk=#{quickkey}&status=statusmessage")
321
+ response = get("dynamic/savefile.php?qk=#{quickkey}")
339
322
  if response.body.match(/et ?= ?15;/)
340
323
  true
341
324
  else
@@ -349,28 +332,34 @@ module Mediafire
349
332
  options = {
350
333
  :dbx_status_enable => status ? 1 : 0,
351
334
  :dbx_silent_return => 0,
352
- :dbx_status_id => folder.folder_quickkey,
335
+ :dbx_status_id => folder.key,
353
336
  }
354
337
  response = post('dropbox/dosetupdropbox.php', options)
355
338
  if response.body.match(/et ?= ?15[012];/)
356
- true
339
+ return true unless status
357
340
  else
358
- false
341
+ return false
342
+ end
343
+
344
+ if dropbox_setup_option(folder)
345
+ return true
346
+ else
347
+ return false
359
348
  end
360
349
  end
361
350
 
362
351
  # return Dropbox ID
363
- def dropbox_setup_option(folder, options)
352
+ def dropbox_setup_option(folder, options={})
364
353
  raise NeedLogin unless is_loggedin?
365
354
 
366
- response = post('dropbox/dosetupdropbox.php', {:dbx_folderid => folder.folder_quickkey})
355
+ response = post('dropbox/dosetupdropbox.php', {:dbx_folderid => folder.key})
367
356
  folder_options = eval("[#{response.body.match(/parent.Bl\((.*?)\);break;/)[1]}]")
368
357
 
369
358
  allow_add_description = options[:allow_add_description] ? 1 : 0
370
359
  multiple_upload = options[:multiple_upload] ? 1 : 0
371
360
  email_notification = options[:email_notification] ? 1 : 0
372
361
  form_options = {
373
- :dbx_folder => folder.folder_quickkey,
362
+ :dbx_folder => folder.key,
374
363
  :dbx_text1 => options[:header] || folder_options[2],
375
364
  :dbx_text2 => options[:message] || folder_options[3],
376
365
  :dbx_text3 => options[:completion_message] || folder_options[4],
@@ -405,13 +394,17 @@ module Mediafire
405
394
  keys[:trackkey] = c.xpath('./trackkey').text
406
395
  end
407
396
 
408
- query = "type=basic"
409
- query << "&track=#{keys[:trackkey]}&dropbox=1"
410
- query << "&ukey=#{keys[:ukey]}&user=#{keys[:user]}"
411
- query << "&uploadkey=#{dropbox_id}&upload=0"
397
+ query = []
398
+ query << "type=basic"
399
+ query << "track=#{keys[:trackkey]}"
400
+ query << "dropbox=1"
401
+ query << "ukey=#{keys[:ukey]}"
402
+ query << "user=#{keys[:user]}"
403
+ query << "uploadkey=#{dropbox_id}"
404
+ query << "upload=0"
412
405
  response = File.open(filepath) do |f|
413
406
  options = {:Filedata => UploadIO.new(f, 'application/octet-stream', filename)}
414
- post("douploadtoapi?#{query}", options)
407
+ post("douploadtoapi?#{query.join('&')}", options)
415
408
  end
416
409
  doc = Nokogiri::XML(response.body)
417
410
  keys[:filekey] = doc.xpath('//response/doupload/key').text
@@ -434,21 +427,255 @@ module Mediafire
434
427
  puts "#{ENDPOINT}?#{keys[:quickkey]}"
435
428
  end
436
429
 
430
+ def revision(folder_key="myfiles", recursive=false)
431
+ query = base_query
432
+ query << "r=#{r(4)}"
433
+ query << "recursive=#{recursive ? 'yes' : 'no'}"
434
+ query << "folder_key=#{folder_key}"
435
+
436
+ response = get("api/folder/get_revision.php?#{query.join('&')}").body
437
+ JSON.parse(response)['response']['revision']
438
+ end
439
+
437
440
  def is_loggedin?
438
441
  @loggedin
439
442
  end
440
443
 
441
444
  private
442
445
 
446
+ # Low level APIs
447
+
448
+ def toppage
449
+ get('')
450
+ end
451
+
452
+ # @param token session token
453
+ # @param recursive [true|false]
454
+ # @param filter ['folder']
455
+ def myfiles(recursive=false, filter=nil)
456
+ query = base_query
457
+ query << "r=#{r(4)}"
458
+ query << "recursive=#{recursive ? 'yes' : 'no'}" unless recursive.nil?
459
+ query << "content_filter=#{filter}" unless filter.nil?
460
+
461
+ response = get("api/user/myfiles.php?#{query.join('&')}").body
462
+ JSON.parse(response)['response']['myfiles']
463
+ end
464
+
465
+ def info(folder_keys, recursive=false)
466
+ if folder_keys.is_a?(String)
467
+ folder_keys = [folder_keys]
468
+ end
469
+
470
+ query = base_query
471
+ query << "r=#{r(4)}"
472
+ query << "folder_key=#{folder_keys.join(',')}"
473
+ query << "recursive=#{recursive ? 'yes' : 'no'}"
474
+
475
+ response = get("api/folder/get_info.php?#{query.join('&')}").body
476
+ response = JSON.parse(response)['response']
477
+
478
+ if response.key?('folder_info')
479
+ return response['folder_info']
480
+ elsif response.key?('folder_infos')
481
+ return response['folder_infos']
482
+ end
483
+ end
484
+
485
+ def file_update(file, options={})
486
+ if options.key?('password')
487
+ return password_update(file, options['password'])
488
+ end
489
+
490
+ query = base_query
491
+ query << "filename=#{options['filename']}" if options.key?('filename')
492
+ query << "description=#{options['description']}" if options.key?('description')
493
+ if options.key?('privacy')
494
+ query << "privacy=#{options['privacy']}"
495
+ query << "r=#{r(4)}"
496
+ end
497
+ if !file.is_folder? && options.key?('privacy_recursive')
498
+ query << "privacy_recursive=#{options['privacy_recursive']}"
499
+ end
500
+ query << "quick_key=#{file.key}"
501
+
502
+ if file.is_folder?
503
+ response = get("api/folder/update.php?#{query.join('&')}")
504
+ else
505
+ response = get("api/file/update.php?#{query.join('&')}")
506
+ end
507
+
508
+ return false if response.code.to_i == 400
509
+ if JSON.parse(response.body)['response']['result'] == 'Success'
510
+ return true
511
+ else
512
+ return false
513
+ end
514
+ end
515
+
516
+ def password_update(file, password)
517
+ query = base_query
518
+ query << "r=#{r(4)}"
519
+ query << "quick_key=#{file.key}"
520
+ query << "password=#{password}"
521
+
522
+ if file.is_folder?
523
+ response = get("api/folder/update_password.php?#{query.join('&')}")
524
+ else
525
+ response = get("api/file/update_password.php?#{query.join('&')}")
526
+ end
527
+
528
+ return false if response.code.to_i == 400
529
+ if JSON.parse(response.body)['response']['result'] == 'Success'
530
+ return true
531
+ else
532
+ return false
533
+ end
534
+ end
535
+
536
+ def delete_files(files)
537
+ options = base_query(true)
538
+ options[:quick_key] = quick_keys(files).join(',')
539
+
540
+ response = post('api/file/delete.php', options)
541
+ if JSON.parse(response.body)['response']['result'] == 'Success'
542
+ true
543
+ else
544
+ false
545
+ end
546
+ end
547
+
548
+ def delete_folders(folders)
549
+ options = base_query(true)
550
+ options[:folder_key] = quick_keys(folders).join(',')
551
+
552
+ response = post('api/folder/delete.php', options)
553
+ if JSON.parse(response.body)['response']['result'] == 'Success'
554
+ true
555
+ else
556
+ false
557
+ end
558
+ end
559
+
560
+ def move_files(files, dest)
561
+ options = base_query(true)
562
+ options[:quick_key] = quick_keys(files).join(',')
563
+ options[:folder_key] = dest.key
564
+
565
+ response = post('api/file/move.php', options)
566
+ if JSON.parse(response.body)['response']['result'] == 'Success'
567
+ true
568
+ else
569
+ false
570
+ end
571
+ end
572
+
573
+ def move_folders(folders, dest)
574
+ options = base_query(true)
575
+ options[:folder_key_src] = quick_keys(folders).join(',')
576
+ options[:folder_key_dst] = dest.key
577
+
578
+ response = post('api/folder/move.php', options)
579
+ if JSON.parse(response.body)['response']['result'] == 'Success'
580
+ true
581
+ else
582
+ false
583
+ end
584
+ end
585
+
586
+ # Utilities
587
+
588
+ def session_token
589
+ if defined?(@token)
590
+ return @token
591
+ end
592
+
593
+ response = get('myfiles.php')
594
+ @token = /[0-9a-f]{144}/.match(response.body)[0]
595
+ return @token
596
+ end
597
+
443
598
  def create_list(files)
444
599
  f = files
445
600
  f = [f] unless f.is_a?(Array)
446
- f.map {|n| "#{n.objecttype}:#{n.quickkey}"}.join(';')
601
+ f.map {|n| "#{n.is_folder? ? '2' : '1'}:#{n.key}"}.join(';')
447
602
  end
448
603
 
449
- def myfiles_path
450
- response = get('myfiles.php')
451
- '' + /js\/myfiles.php.[^"]*/.match(response.body)[0]
604
+ def separate_store_object(objs)
605
+ files = []
606
+ folders = []
607
+
608
+ objs = [objs] unless objs.is_a?(Array)
609
+ objs.each do |obj|
610
+ files << obj if obj.is_a?(StoreFile)
611
+ folders << obj if obj.is_a?(StoreFolder)
612
+ end
613
+
614
+ return {
615
+ :files => files,
616
+ :folders => folders,
617
+ }
618
+ end
619
+
620
+ def r(len)
621
+ r = ''
622
+ while (len > 0)
623
+ r << (((rand * 1000).to_i % 26) + 97).chr
624
+ len -= 1
625
+ end
626
+ return r
627
+ end
628
+
629
+ def base_query(hash=false)
630
+ if hash
631
+ return {
632
+ :session_token => session_token,
633
+ :response_format => 'json',
634
+ :version => 1,
635
+ }
636
+ else
637
+ return [
638
+ "session_token=#{session_token}",
639
+ "response_format=json",
640
+ "version=1",
641
+ ]
642
+ end
643
+ end
644
+
645
+ def quick_keys(files)
646
+ return [files.key] unless files.is_a?(Array)
647
+
648
+ quick_keys = []
649
+ files.each do |f|
650
+ quick_keys << f.key
651
+ end
652
+
653
+ quick_keys
654
+ end
655
+
656
+ def pick_object(key, type, folder=nil)
657
+ if folder.nil?
658
+ datas = myfiles
659
+ if type == 'file' and datas.key?('files')
660
+ datas['files'].each {|f| return StoreFile.new(f) if f['quickkey'] == key}
661
+ elsif type == 'folder' and datas.key?('folders')
662
+ datas['folders'].each {|f| return StoreFolder.new(f) if f['folderkey'] == key}
663
+ else
664
+ return nil
665
+ end
666
+
667
+ else
668
+ sf = StoreFolder.new(info(folder.key))
669
+ if type == 'file'
670
+ objs = sf.files
671
+ elsif type == 'folder'
672
+ objs = sf.folders
673
+ else
674
+ return nil
675
+ end
676
+
677
+ objs.each {|f| return f if f.key == key}
678
+ end
452
679
  end
453
680
 
454
681
  def filesize_to_readable_filesize(size)