trans-api 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ OWZiMWExZjAyYjVmNDFiZDY1NTFiMzdlMDM1OGQyNGZkZjQyNTdmYQ==
5
+ data.tar.gz: !binary |-
6
+ YmIyZjRkNTM3MWQ3Y2U1MDNjZTQ5Y2I5NWQ0ZTBkZDAyMDk0NjE5Yg==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ MmRkYTc1ODczMDFlYzJiMGY1ODBlYTk1NjI1MzUwMmRlMGJmNmY5MDQwMzM1
10
+ ZDI3ZGEwYzg5MjgzMTVlZWQxYWUzNTQ0ZmZjNzg3N2MwOTE1MzE3NTQ0YTA4
11
+ MzU3NzQ2ZGE1YzQ0ZTkzNDM4NjYzZjk3YWZjY2FiZGIxNWVkZTg=
12
+ data.tar.gz: !binary |-
13
+ OTJhZTgyZTIwZjBkZGEzZjBkNjc0NzRmYzAzYmEyMWE2ZTQxY2JiMjVjN2Ex
14
+ OTk1NjRkMzY1YmFiZjJiNmJlMmJmODRiNGVjMmVhZDNmZTg5ODk2ZGEyOTg1
15
+ ZjE3N2ZlMzRmNDgxM2QwZGRiN2ZiZWNiNzllZGVjMmIwZGM1NDM=
data/.gitignore ADDED
@@ -0,0 +1,19 @@
1
+ *.rbc
2
+ *.sassc
3
+ *.swp
4
+ *.DS_Store
5
+ .sass-cache
6
+ capybara-*.html
7
+ .rspec
8
+ /.bundle
9
+ /vendor/bundle
10
+ /log/*
11
+ /tmp/*
12
+ /db/*.sqlite3
13
+ /public/system/*
14
+ /coverage/
15
+ /spec/tmp/*
16
+ **.orig
17
+ rerun.txt
18
+ pickle-email-*.html
19
+ /pkg/*
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in trans-api.gemspec
4
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,20 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ trans-api (0.0.1)
5
+ json
6
+ nokogiri
7
+
8
+ GEM
9
+ remote: https://rubygems.org/
10
+ specs:
11
+ json (1.7.5)
12
+ nokogiri (1.5.5)
13
+ test-unit (2.5.2)
14
+
15
+ PLATFORMS
16
+ ruby
17
+
18
+ DEPENDENCIES
19
+ test-unit
20
+ trans-api!
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Dennis Blommesteijn
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,334 @@
1
+ # Trans::Api
2
+
3
+ Trans::Api is an ruby implementation for Transmission RPC. Based on RPC spec 13328
4
+ https://trac.transmissionbt.com/browser/trunk/extras/rpc-spec.txt
5
+
6
+ It required for the Transmission RPC to run the 'remote access':
7
+
8
+ OSX:
9
+
10
+ Transmission > Preferences > Remote (tab) > Enable remote access
11
+
12
+
13
+ ### Platforms
14
+
15
+ This gem is (build and) tested with:
16
+
17
+ OSX Lion, Mountain Lion
18
+
19
+ Ruby 1.9.3
20
+
21
+ Rails: 3.2.8, 3.2.9
22
+
23
+ Transmission 2.73 (13589)
24
+
25
+
26
+ ### Roadmap
27
+
28
+ * Version (0.0.1) (current)
29
+
30
+ Initial project import.
31
+
32
+ * Version (0.0.2)
33
+
34
+ Session object include: 'blocklist', 'port-test'
35
+
36
+ Torrent object include 'torrent-start-now', 'queue-move-top/up/down/bottom'
37
+
38
+ Torrent object 'delete_all!' explicit torrent references
39
+
40
+ Torrent object 'waitfor' helper to check for lambda after/before calling it's chained cousin
41
+
42
+
43
+ ### Known Issues
44
+
45
+ The Transmission RPC call 'torrent-remove' (implemented as torrent.delete! and Torrent::delete_all!) will crash the daemon! This is NOT a known Transmission issue.
46
+
47
+
48
+ ## Installation
49
+
50
+ Add this line to your application's Gemfile:
51
+
52
+ gem 'trans-api', git: "git://github.com/dblommesteijn/trans-api.git"
53
+
54
+ And then execute:
55
+
56
+ $ bundle
57
+
58
+ Or install it yourself as:
59
+
60
+ $ gem install trans-api
61
+
62
+
63
+ ## Setup
64
+
65
+ Define a configuration for your connection (initialize script)
66
+
67
+ ```ruby
68
+ CONFIG = { host: "localhost", port: 9091, user: "admin", pass: "admin", path: "/transmission/rpc" }
69
+ ```
70
+
71
+ Setup default configuration (initialize script)
72
+
73
+ ```ruby
74
+ Trans::Api::Client.config = CONFIG
75
+ ```
76
+
77
+ Define default torrent fields (bulk requests)
78
+ NOTE: connection is slow when running many torrents with a large amount of fields (transmission rpc issue).
79
+ On requesting an additional info field from the torrent object, a new call is made to the RPC (and stored
80
+ withing the object).
81
+
82
+ ```ruby
83
+ Trans::Api::Torrent.default_fields = [ :id, :status, :name ]
84
+ ```
85
+
86
+ Example
87
+
88
+ ```ruby
89
+ Trans::Api::Torrent.default_fields = [ :id, :status, :name ]
90
+ # loads the torrent object of id 1 with fields: :id, :status, :name
91
+ id = 1
92
+ torrent = Trans::Api::Torrent.find id
93
+ # calls the rpc to receive files from the defined torrent
94
+ torrent.files
95
+ ```
96
+
97
+ ## Examples
98
+
99
+ Check the examples/ folder or Unit tests: test/unit/trans_ (session/torrent) _object.rb
100
+
101
+
102
+ ## Usage
103
+
104
+ Trans api can be used in two ways:
105
+
106
+
107
+ 1. Connect (raw class)
108
+
109
+ ```ruby
110
+ tc = Trans::Api::Connect.new CONFIG
111
+ torrents = tc.torrent_get([:id, :name, :status])
112
+ ```
113
+
114
+ 2. Mapped objects (torrent, file, session classes)
115
+
116
+ examples below.
117
+
118
+
119
+ ### Requesting Torrent Info
120
+
121
+ Get all registered torrents
122
+
123
+ ```ruby
124
+ Trans::Api::Torrent.all
125
+ ```
126
+
127
+ Get a specific torrent by transmission id
128
+ NOTE: transmission assigns random ids to torrents on daemon start
129
+
130
+ ```ruby
131
+ id = 1
132
+ Trans::Api::Torrent.find id
133
+ ```
134
+
135
+ ### Torrent static calls
136
+
137
+ Start all (start all transfers)
138
+
139
+ ```ruby
140
+ Trans::Api::Torrent.start_all
141
+ ```
142
+
143
+ Stop all (stop all transfers)
144
+
145
+ ```ruby
146
+ Trans::Api::Torrent.stop_all
147
+ ```
148
+
149
+ Delete all (tranmission daemon will crash on rapid call)
150
+
151
+ ```ruby
152
+ torrents = Trans::Api::Torrent.all
153
+ # assign explicit torrent objects for removal
154
+ Trans::Api::Torrent.delete_all torrents
155
+ ```
156
+
157
+ Add torrent file
158
+
159
+ ```ruby
160
+ options = {paused: true}
161
+ Trans::Api::Torrent.add_file filename, options
162
+ ```
163
+
164
+ Get all fields
165
+ ```ruby
166
+ Trans::Api::Torrent.ACCESSOR_FIELDS
167
+ ```
168
+
169
+ Get all Mutable fields
170
+ ```ruby
171
+ Trans::Api::Torrent.MUTATOR_FIELDS
172
+ ```
173
+
174
+
175
+ ### Torrent instance actions
176
+
177
+ Get a torrent object
178
+
179
+ ```ruby
180
+ id = 1
181
+ torrent = Trans::Api::Torrent.find id
182
+ ```
183
+
184
+ Save (store changed values)
185
+
186
+ ```ruby
187
+ torrent.save!
188
+ ```
189
+
190
+ Start (activate torrent for transfer)
191
+
192
+ ```ruby
193
+ torrent.start!
194
+ ```
195
+
196
+ Start Now (not sure what's the difference to start!, it's a different API call)
197
+
198
+ ```ruby
199
+ torrent.start_now!
200
+ ```
201
+
202
+ Reset (reload all torrent fields, including later requested ones)
203
+
204
+ ```ruby
205
+ torrent.reset!
206
+ ```
207
+
208
+ Stop (stop torrent transfer)
209
+
210
+ ```ruby
211
+ torrent.stop!
212
+ ```
213
+
214
+ File Objects (returns a list of Trans::Api::File objects)
215
+
216
+ ```ruby
217
+ torrent.files_objects
218
+ ```
219
+
220
+ Status names (get the status name of the torrent)
221
+
222
+ ```ruby
223
+ torrent.status_name
224
+ ```
225
+
226
+ Verify (recheck downloaded files)
227
+
228
+ ```ruby
229
+ torrent.verify!
230
+ ```
231
+
232
+ Reannounce Torrent
233
+
234
+ ```ruby
235
+ torrent.reannounce!
236
+ ```
237
+
238
+ Delete (tranmission daemon will crash on rapid call)
239
+
240
+ ```ruby
241
+ options = {delete_local_data: true}
242
+ torrent.delete! options
243
+ ```
244
+
245
+ Waitfor (automatic delayed responce after/before chained method is called)
246
+
247
+ Blocking busy waiting for lambda to return true
248
+
249
+ ```ruby
250
+ # waitfor status name not equals stopped after calling start!
251
+ optional = :after
252
+ torrent.waitfor( lambda{|t| t.status_name != :stopped}, optional ).start!
253
+ # waitfor status name equals stopped after calling stop!
254
+ torrent.waitfor( lambda{|t| t.status_name == :stopped}, optional ).stop!
255
+ # NOTE: waitfor can be used for blocking without a chained method (optional = :before only)
256
+ ```
257
+
258
+ NOTE: defined torrent accessor fields are defined as instance methods to the Torrent object
259
+
260
+
261
+ ### Session Info
262
+
263
+ Get session object (singleton)
264
+
265
+ ```ruby
266
+ session = Trans::Api::Session.instance
267
+ ```
268
+
269
+ Get available fields (returns symbols of get/set fields)
270
+
271
+ ```ruby
272
+ session.fields
273
+ ```
274
+
275
+ Get all fields and values
276
+
277
+ ```ruby
278
+ session.fields_and_values
279
+ ```
280
+
281
+ Reset (reload object, request information and not saving changes)
282
+
283
+ ```ruby
284
+ session.reset!
285
+ ```
286
+
287
+ NOTE: defined session fields are defined as instance methods to the Session object
288
+
289
+
290
+ ### File Info
291
+
292
+ Getting files from a torrent (file cannot be used standalone, it's an helper class)
293
+
294
+ ```ruby
295
+ id = 1
296
+ torrent = Trans::Api::Torrent.find id
297
+ files = torrent.files_objects
298
+ files.each do |file|
299
+ # manipulate file here!
300
+ end
301
+ ```
302
+
303
+ File name
304
+
305
+ ```ruby
306
+ file.name
307
+ ```
308
+
309
+ File mark unwant (mark for ignore, not download)
310
+
311
+ ```ruby
312
+ file.unwant
313
+ ```
314
+
315
+ File mark want (mark for download)
316
+
317
+ ```ruby
318
+ file.want
319
+ ```
320
+
321
+ File wanted? (marked for download)
322
+
323
+ ```ruby
324
+ file.wanted?
325
+ ```
326
+
327
+ File stats
328
+
329
+ ```ruby
330
+ file.stat
331
+ ```
332
+
333
+ NOTE: changed preferences (want, unwant) set options on the linked Torrent object, after saving torrent (torrent.save!) file mutations are stored.
334
+
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # setup
4
+ require 'rubygems'
5
+ require "bundler/setup"
6
+ require 'trans-api'
7
+
8
+
9
+ class BasicSetup
10
+
11
+ include Trans::Api
12
+
13
+ CONFIG = { host: "localhost", port: 9091, user: "admin", pass: "admin", path: "/transmission/rpc" }
14
+ FIELDS = [ :id, :status, :name ]
15
+
16
+ def initialize
17
+
18
+ # connection information (rpc location)
19
+ Client.config = CONFIG
20
+
21
+ # default loading torrent fields
22
+ Torrent.default_fields = FIELDS
23
+
24
+ #TODO: add a section for session here!!
25
+
26
+ end
27
+
28
+
29
+ def add_torrent
30
+
31
+ # selecting a file to add (debian demo file)
32
+ file = ::File.expand_path(::File.dirname(__FILE__) + "/torrents/debian-6.0.6-amd64-CD-10.iso.torrent")
33
+
34
+ # adding a torrent using static call on Torrent object (paused transfer)
35
+ @torrent = Torrent.add_file file, paused: true
36
+ # return variable is an instance of the torrent file
37
+ # an exception can be raised on invalid request
38
+
39
+ # NOTE: we will store it for later use (removing this torrent, not the whole list)
40
+
41
+ end
42
+
43
+ def remove_torrent
44
+
45
+ #TODO: remove torrent here!
46
+
47
+ end
48
+
49
+ def iterating_torrents
50
+
51
+ torrents = Torrent.all
52
+
53
+ torrents.each do |torrent|
54
+
55
+ puts "#{torrent.name} -> #{torrent.status_name}"
56
+
57
+ end
58
+
59
+ end
60
+
61
+ end
62
+
63
+
64
+
65
+ # initiate BasicSetup object, and run its methods
66
+ begin
67
+
68
+ bs = BasicSetup.new
69
+ bs.add_torrent
70
+ bs.iterating_torrents
71
+
72
+ rescue Exception => e
73
+ puts e
74
+ end
75
+
76
+
77
+
78
+
@@ -0,0 +1,30 @@
1
+ module Trans
2
+ module Api
3
+
4
+ class Client
5
+ DEFAULT = {scheme: "http", host: "localhost", port: 9091, path: "/transmission/rpc", user: "admin", pass: "admin"}
6
+
7
+ # construct
8
+
9
+ def initialize(options={})
10
+ args = @@config
11
+ args.merge!(options)
12
+ @conn = Connect.new args
13
+ end
14
+
15
+ def connect
16
+ @conn
17
+ end
18
+
19
+ class << self
20
+ def config=(config = {})
21
+ @@config = config
22
+ end
23
+ end
24
+
25
+
26
+ end
27
+
28
+
29
+ end
30
+ end