putio-cli 0.0.2
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.
- checksums.yaml +15 -0
- data/.gitignore +4 -0
- data/Gemfile +7 -0
- data/README.markdown +131 -0
- data/Rakefile +21 -0
- data/lib/putio.rb +4 -0
- data/lib/putio/client.rb +540 -0
- data/lib/putio/putio.rb +6 -0
- data/putio.gemspec +21 -0
- data/test/fixtures/user_friends.json +1 -0
- data/test/fixtures/user_info.json +1 -0
- data/test/test_helper.rb +19 -0
- data/test/units/client_test.rb +11 -0
- data/test/units/putio_test.rb +11 -0
- data/test/units/user_test.rb +39 -0
- metadata +116 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
ZjIwNDM1MDcxMDQyNDJmMmRjZWUwZGZmOWQ5ZmUxMTlmYjU2NTY1YQ==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
MzU1ODY4OGNjNTBhNmI4NTUzNGU1NmU1NmM2MWZmYjQ0MWQ3ZmNhZQ==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MzYzZGUxZWI1YTkwMGIxNWZiNjExZjQ0ZTEyYWRhYTJhNmI5MWExMmU4ODVk
|
10
|
+
YmFiYWI1MDM1NTc1YmE0NmU0MDI3MjIwYmUwYTNmYjFiMzEyNTAyYjVjYjlh
|
11
|
+
NjZlZTIwZWMxZGY2Nzc1NTZmMjNhZTM3YmQyMDZmOTQ0Njg2NTI=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
ZWQzNjAzYTkxZmJhNWNkOTZiOTJhNWQ5N2ZlNDJhNmYxNmZkNTA0OTFhZDk2
|
14
|
+
OWJhYzkwNGQ0ZDlhYjc1YmQ5ZmE5NzA1YmNiZmQ0NTg1MmEwMTk2MjAyNmJm
|
15
|
+
MzVjNjYzODE2OGY2ODJhNjFiZmUxYzBlMWRmOGQ0ZjQyNDZlNWM=
|
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.markdown
ADDED
@@ -0,0 +1,131 @@
|
|
1
|
+
# Put.io V2
|
2
|
+
|
3
|
+
This is a Ruby client for the [Put.io REST API](https://api.put.io/v2/docs/#jsonp) with full support for files, transfers, friends and settings. It utilises the new Put.io V2 with OAuth integration so you can build fully featured applications.
|
4
|
+
|
5
|
+
### Installation
|
6
|
+
**This is a fork of [rodreegez/putio](http://github.com/rodreegez/putio) and I'm awaiting the update of the 'putio' gem. Until then it can be installed with 'putio-cli'**
|
7
|
+
|
8
|
+
```ruby
|
9
|
+
gem install putio
|
10
|
+
```
|
11
|
+
|
12
|
+
### Usage
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
require 'putio'
|
16
|
+
```
|
17
|
+
|
18
|
+
```ruby
|
19
|
+
p = Putio.new(000, 'abcdefghijklmn012345', 'http://localhost/callback') # Create an application at https://put.io/v2/oauth2/register
|
20
|
+
```
|
21
|
+
|
22
|
+
```ruby
|
23
|
+
p.me # Show my information
|
24
|
+
```
|
25
|
+
|
26
|
+
## Options
|
27
|
+
|
28
|
+
```ruby
|
29
|
+
Putio::Client.putio_methods # Get all methods like .methods
|
30
|
+
|
31
|
+
# Generate a OAuth HTTP URL
|
32
|
+
p.oauth_url
|
33
|
+
|
34
|
+
# Once returned with code, complete authorisation
|
35
|
+
p.oauth_complete(params[:code])
|
36
|
+
|
37
|
+
# Or, if you already have a access token - set it and ignore the previous two steps.
|
38
|
+
p.access_token = ""
|
39
|
+
|
40
|
+
## Files
|
41
|
+
|
42
|
+
# Show files in a particular folder.
|
43
|
+
p.files(folder_id = 0)
|
44
|
+
|
45
|
+
# Or just show them all, including those from subfolders.
|
46
|
+
p.all
|
47
|
+
|
48
|
+
# Search for a file
|
49
|
+
p.search(query, page = 0)
|
50
|
+
|
51
|
+
# Upload a local file
|
52
|
+
p.upload(local_file, folder_id = 0)
|
53
|
+
|
54
|
+
# Create a folder
|
55
|
+
p.create_folder(name, folder_id = 0)
|
56
|
+
|
57
|
+
# File properties
|
58
|
+
p.file(file_id)
|
59
|
+
|
60
|
+
# Remove a file
|
61
|
+
p.delete(file_id)
|
62
|
+
|
63
|
+
# Rename a file
|
64
|
+
p.rename(file_id)
|
65
|
+
|
66
|
+
# Move a file
|
67
|
+
p.move(file_id, folder_id = 0)
|
68
|
+
|
69
|
+
# Convert a video file on Put.io to MP4
|
70
|
+
p.convert_to_mp4(file_id)
|
71
|
+
|
72
|
+
# Status of MP4 video
|
73
|
+
p.mp4(file_id)
|
74
|
+
|
75
|
+
# Universal download link of a file
|
76
|
+
p.download(file_id)
|
77
|
+
|
78
|
+
# Universal download link of a ZIP of multiple files
|
79
|
+
p.zip(file_ids) # Example: p.zip([300, 59412, 9313])
|
80
|
+
|
81
|
+
## Transfers
|
82
|
+
|
83
|
+
# Show all current transfers
|
84
|
+
p.transfers
|
85
|
+
|
86
|
+
# Show count of transfer queue
|
87
|
+
p.transfers_count
|
88
|
+
|
89
|
+
# Create a transfer
|
90
|
+
# Note: Callback URL pings a HTTP URL when a file/torrent has been downloaded to Put.io
|
91
|
+
p.create_transfer(http_url, folder_id = 0, extract_if_possible = true, callback_url = nil)
|
92
|
+
|
93
|
+
# Show status on transfer
|
94
|
+
p.transfer(transfer_id)
|
95
|
+
|
96
|
+
# Cancel Transfer
|
97
|
+
p.cancel_transfers(ids) # Example: p.cancel_transfers([412421, 4812984, 19334])
|
98
|
+
|
99
|
+
# Clean transfers queue (i.e. remove completed transfers)
|
100
|
+
p.clean_transfers
|
101
|
+
|
102
|
+
# Show authenticated user
|
103
|
+
p.me
|
104
|
+
|
105
|
+
# Show preferences of authenticated user
|
106
|
+
p.settings
|
107
|
+
|
108
|
+
# My Put.io friends
|
109
|
+
p.friends
|
110
|
+
|
111
|
+
# My Put.io incoming friend requests
|
112
|
+
p.friend_requests
|
113
|
+
|
114
|
+
# Deny friend request
|
115
|
+
p.deny_friend_request(username)
|
116
|
+
|
117
|
+
# Send friend request
|
118
|
+
p.make_friends_with(username)
|
119
|
+
```
|
120
|
+
|
121
|
+
## Todo
|
122
|
+
- Make Putio::Client object syntax 'chain' better (i.e. `Putio::File.new(391239123).delete`)
|
123
|
+
- Update test units to reflect V2 API.
|
124
|
+
|
125
|
+
## Changelog
|
126
|
+
|
127
|
+
23/6/2013
|
128
|
+
- Added support for V2 API
|
129
|
+
- Added OAuth Support
|
130
|
+
- Removed development folder.
|
131
|
+
- Removed :rubygems and replaced with 'http://rubygems.org'
|
data/Rakefile
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'rake/testtask'
|
2
|
+
Rake::TestTask.new(:test) do |test|
|
3
|
+
test.libs << 'lib' << 'test'
|
4
|
+
test.pattern = 'test/**/*_test.rb'
|
5
|
+
test.verbose = true
|
6
|
+
end
|
7
|
+
task :default => :test
|
8
|
+
|
9
|
+
task :install do
|
10
|
+
%x|gem install putio|
|
11
|
+
end
|
12
|
+
|
13
|
+
task :uninstall do
|
14
|
+
%x|gem uninstall putio|
|
15
|
+
end
|
16
|
+
|
17
|
+
task :build do
|
18
|
+
%x|gem build putio.gemspec|
|
19
|
+
end
|
20
|
+
|
21
|
+
task :reinstall => [:uninstall, :build, :install]
|
data/lib/putio.rb
ADDED
data/lib/putio/client.rb
ADDED
@@ -0,0 +1,540 @@
|
|
1
|
+
##
|
2
|
+
## Let's include our dependencies.
|
3
|
+
##
|
4
|
+
require 'curb'
|
5
|
+
require 'rubygems'
|
6
|
+
require 'crack/json'
|
7
|
+
require 'hashie'
|
8
|
+
require 'json'
|
9
|
+
require 'uri'
|
10
|
+
require 'cgi'
|
11
|
+
|
12
|
+
|
13
|
+
##
|
14
|
+
## Let's extend :String to identify an Integer.
|
15
|
+
##
|
16
|
+
class String
|
17
|
+
def is_i?
|
18
|
+
!!(self =~ /^[-+]?[0-9]+$/)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
##
|
24
|
+
## This serves custom errors that people can begin-rescue.
|
25
|
+
##
|
26
|
+
module PutioError
|
27
|
+
class ClientIDInvalid < Exception; end
|
28
|
+
class FileNotExist < Exception; end
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
##
|
33
|
+
## This contains the entire Putio Ruby interface.
|
34
|
+
##
|
35
|
+
module Putio
|
36
|
+
|
37
|
+
# This is used to make reading code easier later. Ignore this.
|
38
|
+
class HTTP
|
39
|
+
attr_reader :GET, :POST
|
40
|
+
GET, POST = false, true
|
41
|
+
end
|
42
|
+
|
43
|
+
# Our Ruby client.
|
44
|
+
class Client
|
45
|
+
# Instance-based variables we'll need to allocate memory for.
|
46
|
+
attr_writer :client_id, :application_secret, :redirect_uri, :access_token
|
47
|
+
# The base Put.io API URL.
|
48
|
+
PUTIO_BASE_URL = "https://api.put.io/v2"
|
49
|
+
|
50
|
+
|
51
|
+
##
|
52
|
+
## Putio::Client.new
|
53
|
+
## Initialize the Putio::Client instance.
|
54
|
+
##
|
55
|
+
def initialize(client_id, application_secret, redirect_uri, access_token = nil)
|
56
|
+
# The client_id must be a Integer
|
57
|
+
raise PutioError::ClientIDInvalid unless client_id.to_s.is_i?
|
58
|
+
|
59
|
+
# Store arguments as instance variables
|
60
|
+
@client_id = client_id
|
61
|
+
@application_secret = application_secret
|
62
|
+
@redirect_uri = redirect_uri
|
63
|
+
@access_token = access_token || nil
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
##
|
68
|
+
## Putio::Client.putio_methods
|
69
|
+
## Similar to .methods - you can use this to see all possible Put.io-related methods.
|
70
|
+
##
|
71
|
+
def putio_methods
|
72
|
+
[:oauth_url, :oauth_complete, :files, :all, :search, :upload, :create_folder, :file, :delete, :rename, :move, :convert_to_mp4, :mp4, :download, :zip, :transfers, :transfers_count, :create_transfer, :cancel_transfer, :cancel_transfers, :clean_transfers, :me, :settings, :friends, :friend_requests, :deny_friend_requests, :make_friend_with]
|
73
|
+
end
|
74
|
+
|
75
|
+
|
76
|
+
##
|
77
|
+
## Putio::Client.oauth_url(response_type)
|
78
|
+
## Provides a OAuth URL on Put.io for the user to grant access.
|
79
|
+
##
|
80
|
+
def oauth_url(response_type = 'code')
|
81
|
+
# The Redirect URI must be the same as registered with Put.io
|
82
|
+
PUTIO_BASE_URL + "/oauth2/authenticate?client_id=%i&response_type=%s&redirect_uri=%s" % [@client_id, response_type, @redirect_uri]
|
83
|
+
end
|
84
|
+
|
85
|
+
|
86
|
+
##
|
87
|
+
## Putio::Client.oauth_complete(code)
|
88
|
+
## Provides an oauth_token used to authenticate API calls.
|
89
|
+
##
|
90
|
+
def oauth_complete(code)
|
91
|
+
# Let's compile the API URL we're calling.
|
92
|
+
url = PUTIO_BASE_URL + "/oauth2/access_token?client_id=%i&client_secret=%s&grant_type=authorization_code&redirect_uri=%s&code=%s" % [@client_id, @application_secret, @redirect_uri, code]
|
93
|
+
|
94
|
+
# And call it.
|
95
|
+
response = Curl::Easy.perform(url) do |req|
|
96
|
+
req.headers['Accept'] = 'application/json'
|
97
|
+
end
|
98
|
+
|
99
|
+
# Use Crack to parse the JSON
|
100
|
+
response = Crack::JSON.parse(response.body_str)
|
101
|
+
|
102
|
+
# And use Hashie to present it.
|
103
|
+
response = Hashie::Mash.new(response)
|
104
|
+
|
105
|
+
# Save it locally.
|
106
|
+
@access_token = response.access_token
|
107
|
+
|
108
|
+
# Return it
|
109
|
+
response
|
110
|
+
end
|
111
|
+
|
112
|
+
|
113
|
+
##
|
114
|
+
## Putio::Client.files(folder)
|
115
|
+
## Shows all the users files in a particular folder.
|
116
|
+
##
|
117
|
+
def files(folder = 0)
|
118
|
+
# Requires authorization
|
119
|
+
raise PutioError::AuthorizationRequired if authentication_required!
|
120
|
+
|
121
|
+
make_get_call('/files/list?parent_id=%i' % [folder]).files
|
122
|
+
end
|
123
|
+
|
124
|
+
|
125
|
+
##
|
126
|
+
## Putio::Client.all
|
127
|
+
## Shows all the files, including from subfolders.
|
128
|
+
##
|
129
|
+
def all
|
130
|
+
# Requires authorization
|
131
|
+
raise PutioError::AuthorizationRequired if authentication_required!
|
132
|
+
|
133
|
+
files(-1)
|
134
|
+
end
|
135
|
+
|
136
|
+
|
137
|
+
##
|
138
|
+
## Putio::Client.search(query, page)
|
139
|
+
## Makes a file search against you and your shared files.
|
140
|
+
##
|
141
|
+
def search(query, page = 0)
|
142
|
+
# Requires authorization
|
143
|
+
raise PutioError::AuthorizationRequired if authentication_required!
|
144
|
+
|
145
|
+
make_get_call('/files/list?parent_id=%i' % [folder]).files
|
146
|
+
end
|
147
|
+
|
148
|
+
|
149
|
+
##
|
150
|
+
## Putio::Client.upload(file, folder)
|
151
|
+
## Upload a local file to Put.io
|
152
|
+
##
|
153
|
+
def upload(file, folder = 0)
|
154
|
+
# Requires authorization
|
155
|
+
raise PutioError::AuthorizationRequired if authentication_required!
|
156
|
+
|
157
|
+
# Make the upload.
|
158
|
+
response = make_upload_call('/files/upload?parent_id=%i' % [folder], file)
|
159
|
+
|
160
|
+
# Return whatever.
|
161
|
+
response.transfer || response.file
|
162
|
+
end
|
163
|
+
|
164
|
+
|
165
|
+
##
|
166
|
+
## Putio::Client.create_folder(name, folder)
|
167
|
+
## Creates a new folder in your Put.io space.
|
168
|
+
##
|
169
|
+
def create_folder(name, folder = 0)
|
170
|
+
# Requires authorization
|
171
|
+
raise PutioError::AuthorizationRequired if authentication_required!
|
172
|
+
|
173
|
+
make_post_call('/files/create-folder?name=%s&parent_id=%i' % [name, folder])
|
174
|
+
end
|
175
|
+
|
176
|
+
|
177
|
+
##
|
178
|
+
## Putio::Client.file(id)
|
179
|
+
## Returns the properties of a particular file.
|
180
|
+
##
|
181
|
+
def file(id)
|
182
|
+
# Requires authorization
|
183
|
+
raise PutioError::AuthorizationRequired if authentication_required!
|
184
|
+
|
185
|
+
response = make_get_call('/files/%i' % [id])
|
186
|
+
response.download = download(id)
|
187
|
+
|
188
|
+
response
|
189
|
+
end
|
190
|
+
|
191
|
+
|
192
|
+
##
|
193
|
+
## Putio::Client.delete(id)
|
194
|
+
## Removes a particular file. Parameter can be Integer or Array
|
195
|
+
##
|
196
|
+
def delete(id)
|
197
|
+
# Requires authorization
|
198
|
+
raise PutioError::AuthorizationRequired if authentication_required!
|
199
|
+
|
200
|
+
if id.is_a? Array then
|
201
|
+
id = id.join(',')
|
202
|
+
end
|
203
|
+
|
204
|
+
make_post_call('/files/delete?file_ids=%s' % [id]).status == "OK"
|
205
|
+
end
|
206
|
+
|
207
|
+
##
|
208
|
+
## Putio::Client.rename(id, name)
|
209
|
+
## Renames a particular file.
|
210
|
+
##
|
211
|
+
def rename(id, name)
|
212
|
+
# Requires authorization
|
213
|
+
raise PutioError::AuthorizationRequired if authentication_required!
|
214
|
+
|
215
|
+
make_post_call('/files/rename?file_id=%i&name=%s' % [id, name]).status == "OK"
|
216
|
+
end
|
217
|
+
|
218
|
+
##
|
219
|
+
## Putio::Client.move(id, folder)
|
220
|
+
## Move a file to another directory.
|
221
|
+
##
|
222
|
+
def move(id, folder = 0)
|
223
|
+
# Requires authorization
|
224
|
+
raise PutioError::AuthorizationRequired if authentication_required!
|
225
|
+
|
226
|
+
# This provides support for an Array of ids.
|
227
|
+
if id.is_a? Array then
|
228
|
+
id = id.join(',')
|
229
|
+
end
|
230
|
+
|
231
|
+
make_post_call('/files/move?file_ids=%s&parent_id=%i' % [id, folder]).status == "OK"
|
232
|
+
end
|
233
|
+
|
234
|
+
|
235
|
+
##
|
236
|
+
## Putio::Client.convert_to_mp4(id)
|
237
|
+
## Put.io offer MP4 conversion - call this method to convert a video.
|
238
|
+
##
|
239
|
+
def convert_to_mp4(id)
|
240
|
+
# Requires authorization
|
241
|
+
raise PutioError::AuthorizationRequired if authentication_required!
|
242
|
+
|
243
|
+
make_post_call('/files/%i/mp4' % [id]).status == "OK"
|
244
|
+
end
|
245
|
+
|
246
|
+
|
247
|
+
##
|
248
|
+
## Putio::Client.mp4(id)
|
249
|
+
## Put.io offer MP4 conversion - call this method to see the status of the MP4 video.
|
250
|
+
##
|
251
|
+
def mp4(id)
|
252
|
+
# Requires authorization
|
253
|
+
raise PutioError::AuthorizationRequired if authentication_required!
|
254
|
+
|
255
|
+
make_get_call('/files/%i/mp4' % [id]).mp4
|
256
|
+
end
|
257
|
+
|
258
|
+
|
259
|
+
##
|
260
|
+
## Putio::Client.download(id)
|
261
|
+
## Provides a URL for anyone to download a file.
|
262
|
+
##
|
263
|
+
def download(id)
|
264
|
+
# Requires authorization
|
265
|
+
raise PutioError::AuthorizationRequired if authentication_required!
|
266
|
+
|
267
|
+
PUTIO_BASE_URL + ("/files/%i/download?oauth_token=%s" % [id, @access_token])
|
268
|
+
end
|
269
|
+
|
270
|
+
|
271
|
+
##
|
272
|
+
## Putio::Client.zip(id)
|
273
|
+
## Provides a URL of a ZIP of multiple files.
|
274
|
+
##
|
275
|
+
def zip(id)
|
276
|
+
# Requires authorization
|
277
|
+
raise PutioError::AuthorizationRequired if authentication_required!
|
278
|
+
|
279
|
+
# This provides support for an Array of ids.
|
280
|
+
if id.is_a? Array then
|
281
|
+
id = id.join(',')
|
282
|
+
end
|
283
|
+
|
284
|
+
# Return zip download link
|
285
|
+
PUTIO_BASE_URL + ("/files/zip?file_ids=%s&oauth_token=%s" % [id, @access_token])
|
286
|
+
end
|
287
|
+
|
288
|
+
|
289
|
+
##
|
290
|
+
## Putio::Client.transfers
|
291
|
+
## Shows all the current transfers.
|
292
|
+
##
|
293
|
+
def transfers
|
294
|
+
# Requires authorization
|
295
|
+
raise PutioError::AuthorizationRequired if authentication_required!
|
296
|
+
|
297
|
+
make_get_call('/transfers/list').transfers
|
298
|
+
end
|
299
|
+
|
300
|
+
|
301
|
+
##
|
302
|
+
## Putio::Client.transfers_count
|
303
|
+
## Shows how many downloads are currently in the queue.
|
304
|
+
##
|
305
|
+
def transfers_count
|
306
|
+
# Requires authorization
|
307
|
+
raise PutioError::AuthorizationRequired if authentication_required!
|
308
|
+
|
309
|
+
make_get_call('/transfers/count').count
|
310
|
+
end
|
311
|
+
|
312
|
+
|
313
|
+
##
|
314
|
+
## Putio::Client.create_transfer(url, folder, extract, callback_url)
|
315
|
+
## Download an external file/torrent. Optionally choose to extract and have a HTTP callback URL on download completion.
|
316
|
+
##
|
317
|
+
def create_transfer(url, folder = 0, extract = true, callback_url = nil)
|
318
|
+
# Requires authorization
|
319
|
+
raise PutioError::AuthorizationRequired if authentication_required!
|
320
|
+
|
321
|
+
make_post_call('/transfers/add?url=%s&save_parent_id=%i&extract=%s&callback_url=%s' % [url, folder, extract.to_s.capitalize, callback_url])
|
322
|
+
end
|
323
|
+
|
324
|
+
|
325
|
+
##
|
326
|
+
## Putio::Client.transfer(id)
|
327
|
+
## Shows the status of a particular transfer.
|
328
|
+
##
|
329
|
+
def transfer(id)
|
330
|
+
# Requires authorization
|
331
|
+
raise PutioError::AuthorizationRequired if authentication_required!
|
332
|
+
|
333
|
+
make_get_call('/transfers/%i' % [id])
|
334
|
+
end
|
335
|
+
|
336
|
+
|
337
|
+
##
|
338
|
+
## Putio::Client.cancel_transfer(id)
|
339
|
+
## Alias of Putio::Client.cancel_transfers
|
340
|
+
##
|
341
|
+
def cancel_transfer(id)
|
342
|
+
cancel_transfers(id)
|
343
|
+
end
|
344
|
+
|
345
|
+
|
346
|
+
##
|
347
|
+
## Putio::Client.cancel_transfers(id)
|
348
|
+
## Cancels any transfers that have not yet completed. Use delete to remove downloaded files.
|
349
|
+
##
|
350
|
+
def cancel_transfers(id)
|
351
|
+
# Requires authorization
|
352
|
+
raise PutioError::AuthorizationRequired if authentication_required!
|
353
|
+
|
354
|
+
# This provides support for an Array of ids.
|
355
|
+
if id.is_a? Array then
|
356
|
+
id = id.join(',')
|
357
|
+
end
|
358
|
+
|
359
|
+
make_get_call('/transfers/cancel?transfer_ids=%s' % [id]).status == "OK"
|
360
|
+
end
|
361
|
+
|
362
|
+
|
363
|
+
##
|
364
|
+
## Putio::Client.clean_transfers(id)
|
365
|
+
## Removes any completed transfers from the list.
|
366
|
+
##
|
367
|
+
def clean_transfers(id)
|
368
|
+
# Requires authorization
|
369
|
+
raise PutioError::AuthorizationRequired if authentication_required!
|
370
|
+
|
371
|
+
make_get_call('/transfers/clean').status == "OK"
|
372
|
+
end
|
373
|
+
|
374
|
+
|
375
|
+
##
|
376
|
+
## Putio::Client.me
|
377
|
+
## Shows information about the authenticated user.
|
378
|
+
##
|
379
|
+
def me
|
380
|
+
# Requires authorization
|
381
|
+
raise PutioError::AuthorizationRequired if authentication_required!
|
382
|
+
|
383
|
+
make_get_call('/account/info').info
|
384
|
+
end
|
385
|
+
|
386
|
+
|
387
|
+
##
|
388
|
+
## Putio::Client.settings
|
389
|
+
## Shows preferences of the authenticated user.
|
390
|
+
##
|
391
|
+
def settings
|
392
|
+
# Requires authorization
|
393
|
+
raise PutioError::AuthorizationRequired if authentication_required!
|
394
|
+
|
395
|
+
make_get_call('/account/settings').settings
|
396
|
+
end
|
397
|
+
|
398
|
+
|
399
|
+
##
|
400
|
+
## Putio::Client.friends
|
401
|
+
## Shows all the friends of the authenticated user.
|
402
|
+
##
|
403
|
+
def friends
|
404
|
+
# Requires authorization
|
405
|
+
raise PutioError::AuthorizationRequired if authentication_required!
|
406
|
+
|
407
|
+
make_get_call('/friends/list').friends
|
408
|
+
end
|
409
|
+
|
410
|
+
|
411
|
+
##
|
412
|
+
## Putio::Client.friend_requests
|
413
|
+
## Shows pending friend requests of the authenticated user.
|
414
|
+
##
|
415
|
+
def friend_requests
|
416
|
+
# Requires authorization
|
417
|
+
raise PutioError::AuthorizationRequired if authentication_required!
|
418
|
+
|
419
|
+
make_get_call('/friends/waiting-requests').friends
|
420
|
+
end
|
421
|
+
|
422
|
+
|
423
|
+
##
|
424
|
+
## Putio::Client.deny_friend_requests(username)
|
425
|
+
## Rejects a friend request.
|
426
|
+
##
|
427
|
+
def deny_friend_request(username)
|
428
|
+
# Requires authorization
|
429
|
+
raise PutioError::AuthorizationRequired if authentication_required!
|
430
|
+
|
431
|
+
make_post_call('/friends/%s/deny' % [username]).status == "OK"
|
432
|
+
end
|
433
|
+
|
434
|
+
|
435
|
+
##
|
436
|
+
## Putio::Client.make_friend_with(username)
|
437
|
+
## This sends a friend request to a particular user.
|
438
|
+
##
|
439
|
+
def make_friend_with(username)
|
440
|
+
# Requires authorization
|
441
|
+
raise PutioError::AuthorizationRequired if authentication_required!
|
442
|
+
|
443
|
+
make_post_call('/friends/%s/request' % [username]).status == "OK"
|
444
|
+
end
|
445
|
+
|
446
|
+
|
447
|
+
private
|
448
|
+
|
449
|
+
##
|
450
|
+
## Putio::Client.authentication_required!
|
451
|
+
## A private function used to tell if the user has granted access.
|
452
|
+
##
|
453
|
+
def authentication_required!
|
454
|
+
@access_token.nil?
|
455
|
+
end
|
456
|
+
|
457
|
+
##
|
458
|
+
## Putio::Client.make_call(endpoint)
|
459
|
+
## This is the underlying code that makes the HTTP request.
|
460
|
+
##
|
461
|
+
def make_call(endpoint, is_post = false)
|
462
|
+
# Before anything.. is it a POST request?
|
463
|
+
postdata = Hash.new
|
464
|
+
|
465
|
+
# It's a HTTP POST request.
|
466
|
+
if is_post && endpoint.include?('?') then
|
467
|
+
endpoint, postdata = endpoint.split('?')
|
468
|
+
postdata = CGI::parse(postdata)
|
469
|
+
end
|
470
|
+
|
471
|
+
# Let's compile the API URL we're calling.
|
472
|
+
url = PUTIO_BASE_URL + endpoint
|
473
|
+
url += url.include?("?") ? "&" : "?"
|
474
|
+
url += "oauth_token=%s" % [@access_token]
|
475
|
+
|
476
|
+
# And call it. POST or GET ;)
|
477
|
+
if is_post then
|
478
|
+
response = Curl.post(url, postdata) { |req| req.headers['Accept'] = 'application/json' }
|
479
|
+
else
|
480
|
+
response = Curl.get(url) { |req| req.headers['Accept'] = 'application/json' }
|
481
|
+
end
|
482
|
+
|
483
|
+
# Use Crack to parse the JSON
|
484
|
+
begin
|
485
|
+
response = Crack::JSON.parse(response.body_str)
|
486
|
+
rescue Psych::SyntaxError
|
487
|
+
response = JSON::parse(response.body_str)
|
488
|
+
end
|
489
|
+
|
490
|
+
# And use Hashie to present it.
|
491
|
+
response = Hashie::Mash.new(response)
|
492
|
+
end
|
493
|
+
|
494
|
+
##
|
495
|
+
## Putio::Client.make_get_call(endpoint)
|
496
|
+
## This is the underlying code that makes the HTTP GET request.
|
497
|
+
##
|
498
|
+
def make_get_call(endpoint)
|
499
|
+
make_call(endpoint, Putio::HTTP::GET)
|
500
|
+
end
|
501
|
+
|
502
|
+
##
|
503
|
+
## Putio::Client.make_post_call(endpoint)
|
504
|
+
## This is the underlying code that makes the HTTP POST request.
|
505
|
+
##
|
506
|
+
def make_post_call(endpoint)
|
507
|
+
make_call(endpoint, Putio::HTTP::POST)
|
508
|
+
end
|
509
|
+
|
510
|
+
##
|
511
|
+
## Putio::Client.make_upload_call(endpoint, file)
|
512
|
+
## This is the underlying code that makes the HTTP multipart POST request.
|
513
|
+
##
|
514
|
+
def make_upload_call(endpoint, file)
|
515
|
+
raise PutioError::FileNotExist unless File.exists?(file)
|
516
|
+
|
517
|
+
# Let's compile the API URL we're calling.
|
518
|
+
url = PUTIO_BASE_URL + endpoint
|
519
|
+
url += url.include?("?") ? "&" : "?"
|
520
|
+
url += "oauth_token=%s" % [@access_token]
|
521
|
+
|
522
|
+
# And call it.
|
523
|
+
response = Curl::Easy.new(url)
|
524
|
+
response.multipart_form_post = true
|
525
|
+
response.headers['Accept'] = 'application/json'
|
526
|
+
response.http_post(Curl::PostField.file('file', file))
|
527
|
+
|
528
|
+
# Use Crack to parse the JSON
|
529
|
+
begin
|
530
|
+
response = Crack::JSON.parse(response.body_str)
|
531
|
+
rescue Psych::SyntaxError
|
532
|
+
response = JSON::parse(response.body_str)
|
533
|
+
end
|
534
|
+
|
535
|
+
# And use Hashie to present it.
|
536
|
+
response = Hashie::Mash.new(response)
|
537
|
+
end
|
538
|
+
|
539
|
+
end
|
540
|
+
end
|
data/lib/putio/putio.rb
ADDED
data/putio.gemspec
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
Gem::Specification.new do |s|
|
2
|
+
s.name = "putio"
|
3
|
+
s.version = "0.0.2"
|
4
|
+
s.platform = Gem::Platform::RUBY
|
5
|
+
s.authors = ["Adam Rogers", "Bilawal Hameed"]
|
6
|
+
s.email = ["adam@rodreegez.com", "bilawal@games.com"]
|
7
|
+
s.homepage = "http://github.com/rodreegez/putio"
|
8
|
+
s.summary = %q{Ruby wrapper for Put.io API}
|
9
|
+
s.description = %q{A lightweight and simple Ruby interface to the Put.io cloud service API available at http://api.put.io}
|
10
|
+
|
11
|
+
s.rubyforge_project = "putio"
|
12
|
+
|
13
|
+
s.files = `git ls-files`.split("\n")
|
14
|
+
s.test_files = `git ls-files -- {test}/*`.split("\n")
|
15
|
+
s.require_paths = ["lib"]
|
16
|
+
|
17
|
+
s.add_dependency 'curb', '0.8.4'
|
18
|
+
s.add_dependency 'json', '1.8.0'
|
19
|
+
s.add_dependency 'crack', '0.4.0'
|
20
|
+
s.add_dependency 'hashie', '2.0.5'
|
21
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
{"response": {"total":1, "results":[{"dir_id":"7731413","id":"8664","name":"Dean Strelau"}]},"error":false,"user_name":"rodreegez","id":2183}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"response": {"total": 1, "results": [{"name": "rodreegez", "friends_count": 1, "bw_avail_last_month": "462774811875", "shared_space": 0, "shared_items": 0, "bw_quota_available": "496108387615", "disk_quota": "53687091200", "disk_quota_available": "13259450609", "bw_quota": "53687091200"}]}, "error": false, "user_name": "rodreegez", "id": 2183}
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'rubygems'
|
3
|
+
require 'bundler/setup'
|
4
|
+
Bundler.require
|
5
|
+
|
6
|
+
require 'lib/putio'
|
7
|
+
|
8
|
+
FakeWeb.allow_net_connect = false
|
9
|
+
|
10
|
+
def fixture_file(filename)
|
11
|
+
return '' if filename == ''
|
12
|
+
file_path = File.expand_path(File.dirname(__FILE__) + '/fixtures/' + filename)
|
13
|
+
File.read(file_path)
|
14
|
+
end
|
15
|
+
|
16
|
+
def stub(http, path, file)
|
17
|
+
response = { :body => fixture_file(file), :content_type => 'text/json' }
|
18
|
+
FakeWeb.register_uri(http, path, response)
|
19
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class UserTest < Test::Unit::TestCase
|
4
|
+
context 'A Putio client with valid credentials' do
|
5
|
+
setup { @putio = Putio.new('abc', '123') }
|
6
|
+
|
7
|
+
should %q|return user's info via GET| do
|
8
|
+
stub(:get, %r|http://api.put.io/v1/user\?method=info|,
|
9
|
+
'user_info.json')
|
10
|
+
user_info = @putio.get_user_info
|
11
|
+
|
12
|
+
assert_equal "rodreegez", user_info.first.name
|
13
|
+
end
|
14
|
+
|
15
|
+
should %q|return user's info via POST| do
|
16
|
+
stub(:post, %r|http:\/\/api.put.io\/v1\/user\?method=info|,
|
17
|
+
'user_info.json')
|
18
|
+
user_info = @putio.post_user_info
|
19
|
+
|
20
|
+
assert_equal "rodreegez", user_info.first.name
|
21
|
+
end
|
22
|
+
|
23
|
+
should %q|return user's friends via GET| do
|
24
|
+
stub(:get, %r|http:\/\/api.put.io\/v1\/user\?method=friends|,
|
25
|
+
'user_friends.json')
|
26
|
+
user_friends = @putio.get_user_friends
|
27
|
+
|
28
|
+
assert_equal "Dean Strelau", user_friends.first.name
|
29
|
+
end
|
30
|
+
|
31
|
+
should %q|return user's friends via POST| do
|
32
|
+
stub(:post, %r|http:\/\/api.put.io\/v1\/user\?method=friends|,
|
33
|
+
'user_friends.json')
|
34
|
+
user_friends = @putio.post_user_friends
|
35
|
+
|
36
|
+
assert_equal "Dean Strelau", user_friends.first.name
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
metadata
ADDED
@@ -0,0 +1,116 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: putio-cli
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Adam Rogers
|
8
|
+
- Bilawal Hameed
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-06-23 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: curb
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - '='
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: 0.8.4
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - '='
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: 0.8.4
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: json
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - '='
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: 1.8.0
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - '='
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: 1.8.0
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: crack
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - '='
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: 0.4.0
|
49
|
+
type: :runtime
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - '='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: 0.4.0
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: hashie
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - '='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: 2.0.5
|
63
|
+
type: :runtime
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - '='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: 2.0.5
|
70
|
+
description: A lightweight and simple Ruby interface to the Put.io cloud service API
|
71
|
+
available at http://api.put.io
|
72
|
+
email:
|
73
|
+
- adam@rodreegez.com
|
74
|
+
- bilawal@games.com
|
75
|
+
executables: []
|
76
|
+
extensions: []
|
77
|
+
extra_rdoc_files: []
|
78
|
+
files:
|
79
|
+
- .gitignore
|
80
|
+
- Gemfile
|
81
|
+
- README.markdown
|
82
|
+
- Rakefile
|
83
|
+
- lib/putio.rb
|
84
|
+
- lib/putio/client.rb
|
85
|
+
- lib/putio/putio.rb
|
86
|
+
- putio.gemspec
|
87
|
+
- test/fixtures/user_friends.json
|
88
|
+
- test/fixtures/user_info.json
|
89
|
+
- test/test_helper.rb
|
90
|
+
- test/units/client_test.rb
|
91
|
+
- test/units/putio_test.rb
|
92
|
+
- test/units/user_test.rb
|
93
|
+
homepage: http://github.com/rodreegez/putio
|
94
|
+
licenses: []
|
95
|
+
metadata: {}
|
96
|
+
post_install_message:
|
97
|
+
rdoc_options: []
|
98
|
+
require_paths:
|
99
|
+
- lib
|
100
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - ! '>='
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0'
|
105
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
requirements: []
|
111
|
+
rubyforge_project: putio
|
112
|
+
rubygems_version: 2.0.3
|
113
|
+
signing_key:
|
114
|
+
specification_version: 4
|
115
|
+
summary: Ruby wrapper for Put.io API
|
116
|
+
test_files: []
|