transmission-client 0.0.0 → 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/README.markdown +25 -4
- data/README.rdoc +26 -5
- data/VERSION +1 -1
- data/lib/transmission-client.rb +12 -2
- data/lib/transmission-client/client.rb +38 -25
- data/lib/transmission-client/em-connection.rb +51 -0
- data/lib/transmission-client/torrent.rb +0 -1
- metadata +3 -2
data/README.markdown
CHANGED
@@ -6,7 +6,7 @@ The goal is to support all requests described in the Transmission [RPC Specifica
|
|
6
6
|
You need to have http://gemcutter.org in you gem sources. To add it you can execute either
|
7
7
|
|
8
8
|
sudo gem install gemcutter
|
9
|
-
sudo gem tumble
|
9
|
+
sudo gem tumble
|
10
10
|
|
11
11
|
or
|
12
12
|
|
@@ -15,14 +15,35 @@ or
|
|
15
15
|
To install transmission-client:
|
16
16
|
|
17
17
|
sudo gem install transmission-client
|
18
|
+
|
19
|
+
If you want to use EventMachine (optional) you need to install the eventmachine gem and igrigorik's em-http-request:
|
18
20
|
|
21
|
+
sudo gem install eventmachine
|
22
|
+
sudo gem install em-http-request
|
23
|
+
|
19
24
|
## Usage
|
20
25
|
Get a list of torrents and print its file names:
|
21
26
|
|
22
27
|
require 'transmission-client'
|
23
|
-
t = Transmission::Client.new('
|
28
|
+
t = Transmission::Client.new('127.0.0.1', 9091)
|
24
29
|
t.torrents.each do |torrent|
|
25
|
-
|
30
|
+
puts torrent.name
|
26
31
|
end
|
27
|
-
|
32
|
+
|
33
|
+
To use the EventMachine driven interface:
|
34
|
+
|
35
|
+
require 'eventmachine'
|
36
|
+
require 'transmission-client'
|
37
|
+
|
38
|
+
EventMachine.run do
|
39
|
+
t = Transmission::Client.new
|
40
|
+
EM.add_periodic_timer(1) do
|
41
|
+
t.torrents do |torrents|
|
42
|
+
torrents.each do |tor|
|
43
|
+
puts tor.percentDone
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
28
49
|
RDoc is still to be written, at the meantime have a look at the code to find out which methods are supported.
|
data/README.rdoc
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# transmission-client: A Transmission RPC Client
|
2
2
|
|
3
3
|
The goal is to support all requests described in the Transmission [RPC Specifications](http://trac.transmissionbt.com/browser/trunk/doc/rpc-spec.txt).
|
4
4
|
|
@@ -6,7 +6,7 @@ The goal is to support all requests described in the Transmission [RPC Specifica
|
|
6
6
|
You need to have http://gemcutter.org in you gem sources. To add it you can execute either
|
7
7
|
|
8
8
|
sudo gem install gemcutter
|
9
|
-
sudo gem tumble
|
9
|
+
sudo gem tumble
|
10
10
|
|
11
11
|
or
|
12
12
|
|
@@ -15,14 +15,35 @@ or
|
|
15
15
|
To install transmission-client:
|
16
16
|
|
17
17
|
sudo gem install transmission-client
|
18
|
+
|
19
|
+
If you want to use EventMachine (optional) you need to install the eventmachine gem and igrigorik's em-http-request:
|
18
20
|
|
21
|
+
sudo gem install eventmachine
|
22
|
+
sudo gem install em-http-request
|
23
|
+
|
19
24
|
## Usage
|
20
25
|
Get a list of torrents and print its file names:
|
21
26
|
|
22
27
|
require 'transmission-client'
|
23
|
-
t = Transmission::Client.new('
|
28
|
+
t = Transmission::Client.new('127.0.0.1', 9091)
|
24
29
|
t.torrents.each do |torrent|
|
25
|
-
|
30
|
+
puts torrent.name
|
26
31
|
end
|
27
|
-
|
32
|
+
|
33
|
+
To use the EventMachine driven interface:
|
34
|
+
|
35
|
+
require 'eventmachine'
|
36
|
+
require 'transmission-client'
|
37
|
+
|
38
|
+
EventMachine.run do
|
39
|
+
t = Transmission::Client.new
|
40
|
+
EM.add_periodic_timer(1) do
|
41
|
+
t.torrents do |torrents|
|
42
|
+
torrents.each do |tor|
|
43
|
+
puts tor.percentDone
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
28
49
|
RDoc is still to be written, at the meantime have a look at the code to find out which methods are supported.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.1
|
data/lib/transmission-client.rb
CHANGED
@@ -1,11 +1,21 @@
|
|
1
1
|
require 'net/http'
|
2
2
|
require 'singleton'
|
3
3
|
require 'json'
|
4
|
-
|
4
|
+
require 'rubygems'
|
5
5
|
$:.unshift(File.dirname(__FILE__)) unless $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
|
6
6
|
|
7
7
|
require 'transmission-client/client'
|
8
|
-
|
8
|
+
|
9
|
+
if defined? EM
|
10
|
+
begin
|
11
|
+
require 'em-http'
|
12
|
+
require 'transmission-client/em-connection'
|
13
|
+
rescue LoadError
|
14
|
+
require 'transmission-client/connection'
|
15
|
+
end
|
16
|
+
else
|
17
|
+
require 'transmission-client/connection'
|
18
|
+
end
|
9
19
|
require 'transmission-client/torrent'
|
10
20
|
require 'transmission-client/session'
|
11
21
|
|
@@ -4,55 +4,68 @@ module Transmission
|
|
4
4
|
Connection.instance.init(host, port)
|
5
5
|
end
|
6
6
|
|
7
|
-
def start_all
|
8
|
-
Connection.instance.send('torrent-start')
|
7
|
+
def start_all &cb
|
8
|
+
Connection.instance.send('torrent-start', &cb)
|
9
9
|
end
|
10
10
|
|
11
|
-
def start(id)
|
12
|
-
Connection.instance.send('torrent-start', {'ids' => id.class == Array ? id : [id]})
|
11
|
+
def start(id, &cb)
|
12
|
+
Connection.instance.send('torrent-start', {'ids' => id.class == Array ? id : [id]}, &cb)
|
13
13
|
end
|
14
14
|
|
15
|
-
def stop(id)
|
16
|
-
Connection.instance.send('torrent-stop', {'ids' => id.class == Array ? id : [id]})
|
15
|
+
def stop(id, &cb)
|
16
|
+
Connection.instance.send('torrent-stop', {'ids' => id.class == Array ? id : [id]}, &cb)
|
17
17
|
end
|
18
18
|
|
19
|
-
def stop_all
|
20
|
-
Connection.instance.send('torrent-stop')
|
19
|
+
def stop_all &cb
|
20
|
+
Connection.instance.send('torrent-stop', &cb)
|
21
21
|
end
|
22
22
|
|
23
|
-
def remove(id, delete_data = false)
|
24
|
-
Connection.instance.send('torrent-remove', {'ids' => id.class == Array ? id : [id], 'delete-local-data' => delete_data })
|
23
|
+
def remove(id, delete_data = false, &cb)
|
24
|
+
Connection.instance.send('torrent-remove', {'ids' => id.class == Array ? id : [id], 'delete-local-data' => delete_data }, &cb)
|
25
25
|
end
|
26
26
|
|
27
|
-
def remove_all(delete_data = false)
|
28
|
-
Connection.instance.send('torrent-remove', {'delete-local-data' => delete_data })
|
27
|
+
def remove_all(delete_data = false, &cb)
|
28
|
+
Connection.instance.send('torrent-remove', {'delete-local-data' => delete_data }, &cb)
|
29
29
|
end
|
30
30
|
|
31
|
-
def add_torrent(a)
|
31
|
+
def add_torrent(a, &cb)
|
32
32
|
if a['filename'].nil? && a['metainfo'].nil?
|
33
33
|
raise "You need to provide either a 'filename' or 'metainfo'."
|
34
34
|
end
|
35
|
-
Connection.instance.send('torrent-add', a)
|
35
|
+
Connection.instance.send('torrent-add', a, &cb)
|
36
36
|
end
|
37
37
|
|
38
|
-
def add_torrent_by_file(filename)
|
39
|
-
add_torrent({'filename' => filename})
|
38
|
+
def add_torrent_by_file(filename, &cb)
|
39
|
+
add_torrent({'filename' => filename}, &cb)
|
40
40
|
end
|
41
41
|
|
42
|
-
def add_torrent_by_data(data)
|
43
|
-
add_torrent({'metainfo' => data})
|
42
|
+
def add_torrent_by_data(data, &cb)
|
43
|
+
add_torrent({'metainfo' => data}, &cb)
|
44
44
|
end
|
45
45
|
|
46
|
-
def session
|
47
|
-
|
46
|
+
def session &cb
|
47
|
+
if cb
|
48
|
+
Connection.instance.request('session-get') { |resp| cb.call Session.new resp }
|
49
|
+
else
|
50
|
+
Session.new Connection.instance.request('session-get')
|
51
|
+
end
|
48
52
|
end
|
49
53
|
|
50
|
-
def torrents(fields = nil)
|
54
|
+
def torrents(fields = nil, &cb)
|
51
55
|
torrs = []
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
+
if cb
|
57
|
+
Connection.instance.request('torrent-get', {'fields' => fields ? fields : Transmission::Torrent::ATTRIBUTES}) { |resp|
|
58
|
+
resp['torrents'].each do |t|
|
59
|
+
torrs << Torrent.new(t)
|
60
|
+
end
|
61
|
+
cb.call torrs
|
62
|
+
}
|
63
|
+
else
|
64
|
+
Connection.instance.request('torrent-get', {'fields' => fields ? fields : Transmission::Torrent::ATTRIBUTES})['torrents'].each do |t|
|
65
|
+
torrs << Torrent.new(t)
|
66
|
+
end
|
67
|
+
torrs
|
68
|
+
end
|
56
69
|
end
|
57
70
|
end
|
58
71
|
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Transmission
|
2
|
+
class Connection
|
3
|
+
include Singleton
|
4
|
+
#include EM::Deferrable
|
5
|
+
|
6
|
+
def init(host, port)
|
7
|
+
@host = host
|
8
|
+
@port = port
|
9
|
+
uri = URI.parse("http://#{@host}:#{@port}/transmission/rpc")
|
10
|
+
#@conn = Net::HTTP.start(uri.host, uri.port)
|
11
|
+
@conn = EventMachine::HttpRequest.new(uri)
|
12
|
+
@header = {} #{"Accept-Encoding" => "deflate"} deflate is broken somewhere
|
13
|
+
end
|
14
|
+
|
15
|
+
def request(method, attributes={}, &cb)
|
16
|
+
req = @conn.post(:body => build_json(method,attributes), :head => @header )
|
17
|
+
req.callback {
|
18
|
+
if req.response_header.status == 409 #&& @header['x-transmission-session-id'].nil?
|
19
|
+
@header['x-transmission-session-id'] = req.response_header['X_TRANSMISSION_SESSION_ID']
|
20
|
+
request(method,attributes, &cb)
|
21
|
+
elsif req.response_header.status == 200
|
22
|
+
resp = JSON.parse(req.response)
|
23
|
+
if resp["result"] == 'success'
|
24
|
+
cb.call resp['arguments'] if cb
|
25
|
+
else
|
26
|
+
cb.call resp if cb
|
27
|
+
end
|
28
|
+
end
|
29
|
+
}
|
30
|
+
req.errback {
|
31
|
+
puts 'errback'
|
32
|
+
pp req
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
def send(method, attributes={}, &cb)
|
37
|
+
request(method, attributes) do |resp|
|
38
|
+
cb.call resp if cb
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def build_json(method,attributes = {})
|
43
|
+
if attributes.length == 0
|
44
|
+
{'method' => method}.to_json
|
45
|
+
else
|
46
|
+
{'method' => method, 'arguments' => attributes }.to_json
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: transmission-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dominik Sander
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-10-
|
12
|
+
date: 2009-10-27 00:00:00 +01:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -43,6 +43,7 @@ files:
|
|
43
43
|
- lib/transmission-client.rb
|
44
44
|
- lib/transmission-client/client.rb
|
45
45
|
- lib/transmission-client/connection.rb
|
46
|
+
- lib/transmission-client/em-connection.rb
|
46
47
|
- lib/transmission-client/session.rb
|
47
48
|
- lib/transmission-client/torrent.rb
|
48
49
|
- test/helper.rb
|