transmission-rpc-ruby 0.1.0 → 0.2.0
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 +4 -4
- data/.rspec +0 -1
- data/.travis.yml +3 -0
- data/Gemfile +2 -1
- data/Gemfile.lock +34 -3
- data/README.md +141 -47
- data/Rakefile +2 -0
- data/lib/transmission.rb +3 -1
- data/lib/transmission/arguments.rb +29 -6
- data/lib/transmission/arguments/session_set.rb +48 -48
- data/lib/transmission/arguments/torrent_add.rb +16 -12
- data/lib/transmission/arguments/torrent_set.rb +24 -24
- data/lib/transmission/fields.rb +42 -0
- data/lib/transmission/fields/session_get.rb +63 -0
- data/lib/transmission/fields/session_stats.rb +17 -0
- data/lib/transmission/fields/torrent_get.rb +78 -0
- data/lib/transmission/model/session.rb +19 -10
- data/lib/transmission/model/session_stats.rb +25 -0
- data/lib/transmission/model/torrent.rb +42 -27
- data/lib/transmission/rpc.rb +48 -44
- data/lib/transmission/rpc/connector.rb +3 -4
- data/lib/transmission/utils.rb +28 -0
- data/spec/helpers/stubs.rb +15 -1
- data/spec/spec_helper.rb +2 -0
- data/spec/transmission/arguments_spec.rb +54 -7
- data/spec/transmission/fields_spec.rb +63 -0
- data/spec/transmission/model/session_spec.rb +84 -0
- data/spec/transmission/model/torrent_spec.rb +82 -0
- data/spec/transmission/rpc/connector_spec.rb +4 -3
- data/spec/transmission/rpc_spec.rb +3 -8
- data/spec/transmission/utils_spec.rb +70 -0
- data/transmission-rpc-ruby.gemspec +2 -2
- metadata +13 -6
- data/lib/transmission/arguments/session_get.rb +0 -63
- data/lib/transmission/arguments/session_stats.rb +0 -17
- data/lib/transmission/arguments/torrent_get.rb +0 -78
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f40dbe21491bbcdd4f6aa056748678819a81347f
|
4
|
+
data.tar.gz: af1ac8e0854ab433daa58c1b56a8b6966cbfa9e2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d9e982241cd3efef6e490d678bf1404ae8d0e21d6bdd33fe3480d451599dee377ece0c889b2eb95194ce83d1be49e4290f747560346247f0b96a29a04b404a44
|
7
|
+
data.tar.gz: 7c458a66cf283b4b006d1bbd82d8cba6efe820b370917561866773ad3bbfb8048092419a8eac9a666395d7f49a9c18fc994b9c46c885cd3ed0687cc2502900de
|
data/.rspec
CHANGED
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,14 +1,32 @@
|
|
1
1
|
GEM
|
2
2
|
remote: https://rubygems.org/
|
3
3
|
specs:
|
4
|
-
addressable (2.3.
|
4
|
+
addressable (2.3.8)
|
5
|
+
coveralls (0.7.12)
|
6
|
+
multi_json (~> 1.10)
|
7
|
+
rest-client (>= 1.6.8, < 2)
|
8
|
+
simplecov (~> 0.9.1)
|
9
|
+
term-ansicolor (~> 1.3)
|
10
|
+
thor (~> 0.19.1)
|
5
11
|
crack (0.4.2)
|
6
12
|
safe_yaml (~> 1.0.0)
|
7
13
|
diff-lcs (1.2.5)
|
14
|
+
docile (1.1.5)
|
15
|
+
domain_name (0.5.23)
|
16
|
+
unf (>= 0.0.5, < 1.0.0)
|
8
17
|
faraday (0.9.1)
|
9
18
|
multipart-post (>= 1.2, < 3)
|
19
|
+
http-cookie (1.0.2)
|
20
|
+
domain_name (~> 0.5)
|
21
|
+
mime-types (2.4.3)
|
22
|
+
multi_json (1.11.0)
|
10
23
|
multipart-post (2.0.0)
|
24
|
+
netrc (0.10.3)
|
11
25
|
rake (10.4.2)
|
26
|
+
rest-client (1.8.0)
|
27
|
+
http-cookie (>= 1.0.2, < 2.0)
|
28
|
+
mime-types (>= 1.16, < 3.0)
|
29
|
+
netrc (~> 0.7)
|
12
30
|
rspec (3.2.0)
|
13
31
|
rspec-core (~> 3.2.0)
|
14
32
|
rspec-expectations (~> 3.2.0)
|
@@ -23,7 +41,19 @@ GEM
|
|
23
41
|
rspec-support (~> 3.2.0)
|
24
42
|
rspec-support (3.2.2)
|
25
43
|
safe_yaml (1.0.4)
|
26
|
-
|
44
|
+
simplecov (0.9.2)
|
45
|
+
docile (~> 1.1.0)
|
46
|
+
multi_json (~> 1.0)
|
47
|
+
simplecov-html (~> 0.9.0)
|
48
|
+
simplecov-html (0.9.0)
|
49
|
+
term-ansicolor (1.3.0)
|
50
|
+
tins (~> 1.0)
|
51
|
+
thor (0.19.1)
|
52
|
+
tins (1.3.5)
|
53
|
+
unf (0.1.4)
|
54
|
+
unf_ext
|
55
|
+
unf_ext (0.0.6)
|
56
|
+
webmock (1.21.0)
|
27
57
|
addressable (>= 2.3.6)
|
28
58
|
crack (>= 0.3.2)
|
29
59
|
|
@@ -31,7 +61,8 @@ PLATFORMS
|
|
31
61
|
ruby
|
32
62
|
|
33
63
|
DEPENDENCIES
|
64
|
+
coveralls
|
34
65
|
faraday (~> 0.9)
|
35
66
|
rake (~> 10.4)
|
36
67
|
rspec (~> 3.2)
|
37
|
-
webmock (~> 1.
|
68
|
+
webmock (~> 1.21)
|
data/README.md
CHANGED
@@ -1,78 +1,172 @@
|
|
1
1
|
# Transmission RPC Ruby
|
2
2
|
|
3
|
-
|
3
|
+
[](https://travis-ci.org/transmission-rails/transmission-rpc-ruby) [](https://codeclimate.com/github/transmission-rails/transmission-rpc-ruby) [](https://gemnasium.com/transmission-rails/transmission-rpc-ruby) [](https://coveralls.io/r/transmission-rails/transmission-rpc-ruby?branch=master)
|
4
4
|
|
5
|
-
|
5
|
+
Transmission RPC Ruby is a Ruby library to communicate with Transmission RPC (bittorrent client).
|
6
|
+
This library is based on this [spec](https://trac.transmissionbt.com/browser/trunk/extras/rpc-spec.txt) and currently supports RPC versions >= 14
|
6
7
|
|
7
|
-
|
8
|
+
## Installation
|
8
9
|
|
9
|
-
|
10
|
+
gem install transmission-rpc-ruby
|
10
11
|
|
11
|
-
|
12
|
+
Then require it
|
12
13
|
|
13
|
-
|
14
|
+
require 'transmission'
|
15
|
+
|
16
|
+
## Getting started
|
17
|
+
|
18
|
+
To get started with this gem you need to decide if you are using this library to connect to one or multiple transmission daemons.
|
19
|
+
__Both is possible__
|
20
|
+
|
21
|
+
### Single connection
|
22
|
+
|
23
|
+
Just set up a single configuration with will be used throughout any library calls
|
14
24
|
|
15
25
|
Transmission::Config.set host: 'some.host', port: 9091, ssl: false, credentials: {username: 'transmission', password: '********'}
|
16
26
|
|
17
|
-
|
27
|
+
torrents = Transmission::Model::Torrent.all
|
28
|
+
|
29
|
+
### Multiple connections
|
30
|
+
|
31
|
+
Introducing the `Transmission::RPC` class, which represent all the raw rpc connection requests.
|
32
|
+
|
33
|
+
rpc = Transmission::RPC.new host: 'some.host', port: 9091, ssl: false, credentials: {username: 'transmission', password: '********'}
|
34
|
+
|
35
|
+
torrents = Transmission::Model::Torrent.all connector: rpc
|
36
|
+
|
37
|
+
This Object can be passed to the `Transmission::Model` classes. Examples are shown below.
|
38
|
+
|
39
|
+
### Configuration options
|
40
|
+
|
41
|
+
Both `Transmission::Config` and `Transmission::RPC` take the same arguments, these are the default settings:
|
18
42
|
|
19
|
-
|
43
|
+
{
|
44
|
+
host: 'localhost',
|
45
|
+
port: 9091
|
46
|
+
path: '/transmission/rpc',
|
47
|
+
ssl: false,
|
48
|
+
credentials: {username: 'transmission', password: '********'},
|
49
|
+
session_id: ''
|
50
|
+
}
|
20
51
|
|
21
|
-
|
52
|
+
### Torrents
|
22
53
|
|
23
|
-
|
54
|
+
To work with torrents you need use the `Transmission::Model::Torrent` class
|
55
|
+
|
56
|
+
#### Get all torrents
|
24
57
|
|
25
58
|
torrents = Transmission::Model::Torrent.all
|
26
59
|
|
27
|
-
|
60
|
+
If only a few fields are required
|
61
|
+
|
62
|
+
torrents = Transmission::Model::Torrent.all fields: ['id']
|
63
|
+
|
64
|
+
#### Find a torrent
|
65
|
+
|
66
|
+
id = 1
|
67
|
+
torrent = Transmission::Model::Torrent.find id
|
68
|
+
|
69
|
+
If only a few fields are required
|
70
|
+
|
71
|
+
torrent = Transmission::Model::Torrent.find id, fields: ['id']
|
72
|
+
|
73
|
+
#### Add a torrent
|
74
|
+
|
75
|
+
filename = 'http://example.com/torrent.torrent'
|
76
|
+
torrent = Transmission::Model::Torrent.add filename: filename
|
77
|
+
|
78
|
+
__NOTE:__ you can also specify a magnet link instead
|
79
|
+
|
80
|
+
#### Torrent instance methods
|
81
|
+
|
82
|
+
id = 1
|
83
|
+
torrent = Transmission::Model::Torrent.find(id)
|
84
|
+
|
85
|
+
torrent.start!
|
86
|
+
torrent.start_now!
|
87
|
+
torrent.stop!
|
88
|
+
torrent.verify!
|
89
|
+
torrent.re_announce!
|
90
|
+
|
91
|
+
torrent.move_up!
|
92
|
+
torrent.move_down!
|
93
|
+
torrent.move_top!
|
94
|
+
torrent.move_bottom!
|
95
|
+
|
96
|
+
You can access the torrent accessors & mutators via instance methods too
|
97
|
+
|
98
|
+
# uploadLimited
|
99
|
+
torrent.upload_limited
|
100
|
+
torrent.upload_limited = true
|
101
|
+
|
102
|
+
torrent.save!
|
103
|
+
|
104
|
+
The `save!` method will update the torrent on your remote transmission daemon.
|
105
|
+
|
106
|
+
To find all the torrent [accessors](https://trac.transmissionbt.com/browser/trunk/extras/rpc-spec.txt#L127) & [mutators](https://trac.transmissionbt.com/browser/trunk/extras/rpc-spec.txt#L90) visit [spec](https://trac.transmissionbt.com/browser/trunk/extras/rpc-spec.txt)
|
107
|
+
|
108
|
+
### Session
|
109
|
+
|
110
|
+
To find out more about the current session use the `Transmission::Model::Session` class.
|
111
|
+
|
112
|
+
#### Get session
|
113
|
+
|
114
|
+
session = Transmission::Model::Session.get
|
115
|
+
|
116
|
+
If only a few fields are required
|
117
|
+
|
118
|
+
session = Transmission::Model::Session.get fields: ['version']
|
119
|
+
|
120
|
+
If used with a connector
|
121
|
+
|
122
|
+
options = {}
|
123
|
+
rpc = Transmission::RPC.new options
|
124
|
+
|
125
|
+
session = Transmission::Model::Session.get connector: rpc
|
126
|
+
|
127
|
+
#### Change session
|
128
|
+
|
129
|
+
Like the `Transmission::Model::Torrent` class, you change some session properties
|
130
|
+
|
131
|
+
session = Transmission::Model::Session.get
|
132
|
+
|
133
|
+
# alt-speed-enabled
|
134
|
+
session.alt_speed_enabled
|
135
|
+
session.alt_speed_enabled = true
|
136
|
+
|
137
|
+
session.save!
|
138
|
+
|
139
|
+
To find all the session [accessors](https://trac.transmissionbt.com/browser/trunk/extras/rpc-spec.txt#L444) & [mutators](https://trac.transmissionbt.com/browser/trunk/extras/rpc-spec.txt#L514) visit [spec](https://trac.transmissionbt.com/browser/trunk/extras/rpc-spec.txt)
|
28
140
|
|
29
|
-
|
30
|
-
# or
|
31
|
-
torrent = Transmission::Model::Torrent.add filename: 'magnet_link'
|
141
|
+
### Session Stats
|
32
142
|
|
33
|
-
|
143
|
+
You can also retrieve some session stats by using the `Transmission::Model::SessionStats` class
|
34
144
|
|
35
|
-
|
36
|
-
# Deletes torrents
|
37
|
-
torrent.delete!
|
38
|
-
# Deletes torrent and local data
|
39
|
-
torrent.delete! true
|
145
|
+
session_stats = Transmission::Model::SessionStats.get
|
40
146
|
|
41
|
-
|
147
|
+
# activeTorrentCount
|
148
|
+
session_stats.active_torrent_count
|
42
149
|
|
43
|
-
|
150
|
+
For session stats there are no mutators. To find out more about the [accessors](https://trac.transmissionbt.com/browser/trunk/extras/rpc-spec.txt#L531) visit the [spec](https://trac.transmissionbt.com/browser/trunk/extras/rpc-spec.txt)
|
44
151
|
|
45
|
-
|
152
|
+
### RPC Connector
|
46
153
|
|
47
|
-
|
154
|
+
If it is not desired to use any of the `Transmission::Model` classes you can use the RPC connector
|
48
155
|
|
49
|
-
|
156
|
+
#### Examples
|
50
157
|
|
51
|
-
|
52
|
-
torrents = Transmission::Model::Torrent.all connector: connector
|
158
|
+
rpc = Transmission::RPC.new host: 'some.host', port: 9091, ssl: false, credentials: {username: 'transmission', password: '********'}
|
53
159
|
|
54
|
-
|
160
|
+
session_body = rpc.get_session
|
55
161
|
|
56
|
-
|
57
|
-
session = connector.session
|
58
|
-
session.rpc_version #=> 14
|
59
|
-
session.version #=> "2.52"
|
162
|
+
ids = [1, 2, 3]
|
60
163
|
|
61
|
-
|
164
|
+
torrent_bodies = rpc.get_torrent ids
|
165
|
+
rpc.start_torrents ids
|
62
166
|
|
63
|
-
|
167
|
+
For more methods check out `lib/transmission/rpc.rb`
|
64
168
|
|
65
|
-
|
66
|
-
torrent.move_up
|
67
|
-
torrent.move_down
|
68
|
-
torrent.move_top
|
69
|
-
torrent.move_bottom
|
70
|
-
torrent.start
|
71
|
-
torrent.start_now
|
72
|
-
torrent.stop
|
73
|
-
torrent.verify
|
74
|
-
torrent.re_announce
|
75
|
-
torrent.finished?
|
76
|
-
torrent.to_json
|
169
|
+
## Contribute
|
77
170
|
|
78
|
-
|
171
|
+
Please help make this gem awesome! If you have any suggestions or feedback either create an issue or PR.
|
172
|
+
Just make sure you run the tests before.
|
data/Rakefile
CHANGED
data/lib/transmission.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), 'transmission', 'rpc')
|
2
2
|
require File.join(File.dirname(__FILE__), 'transmission', 'model')
|
3
3
|
require File.join(File.dirname(__FILE__), 'transmission', 'config')
|
4
|
+
require File.join(File.dirname(__FILE__), 'transmission', 'fields')
|
4
5
|
require File.join(File.dirname(__FILE__), 'transmission', 'arguments')
|
6
|
+
require File.join(File.dirname(__FILE__), 'transmission', 'utils')
|
5
7
|
|
6
8
|
module Transmission
|
7
|
-
VERSION = '0.
|
9
|
+
VERSION = '0.2.0'
|
8
10
|
end
|
@@ -1,9 +1,7 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), 'arguments', 'torrent_add')
|
2
|
-
require File.join(File.dirname(__FILE__), 'arguments', 'torrent_get')
|
3
2
|
require File.join(File.dirname(__FILE__), 'arguments', 'torrent_set')
|
4
|
-
require File.join(File.dirname(__FILE__), 'arguments', 'session_get')
|
5
3
|
require File.join(File.dirname(__FILE__), 'arguments', 'session_set')
|
6
|
-
require File.join(File.dirname(__FILE__), '
|
4
|
+
require File.join(File.dirname(__FILE__), 'utils')
|
7
5
|
|
8
6
|
module Transmission
|
9
7
|
class Arguments
|
@@ -11,10 +9,15 @@ module Transmission
|
|
11
9
|
|
12
10
|
attr_accessor :arguments
|
13
11
|
|
12
|
+
ATTRIBUTES = []
|
13
|
+
|
14
14
|
def initialize(arguments = nil)
|
15
|
-
@arguments = arguments.inject(
|
16
|
-
|
17
|
-
|
15
|
+
@arguments = arguments.inject({}) do |attributes, (key, value)|
|
16
|
+
key = key.to_s
|
17
|
+
found = self.class::ATTRIBUTES.select { |attr| attr[:field] == key }
|
18
|
+
raise Transmission::Arguments::InvalidArgument, key if found.empty?
|
19
|
+
attributes[key] = value
|
20
|
+
attributes
|
18
21
|
end if arguments
|
19
22
|
@arguments = self.class::ATTRIBUTES if arguments.nil?
|
20
23
|
end
|
@@ -23,5 +26,25 @@ module Transmission
|
|
23
26
|
@arguments
|
24
27
|
end
|
25
28
|
|
29
|
+
class << self
|
30
|
+
include Transmission::Utils
|
31
|
+
|
32
|
+
def is_valid?(key)
|
33
|
+
is_valid_key? key, self::ATTRIBUTES
|
34
|
+
end
|
35
|
+
|
36
|
+
def real_key(key)
|
37
|
+
option_key key, self::ATTRIBUTES
|
38
|
+
end
|
39
|
+
|
40
|
+
def filter(arguments)
|
41
|
+
arguments.inject({}) do |hash, (key, value)|
|
42
|
+
found = self::ATTRIBUTES.select { |attr| attr[:field] == key.to_s }
|
43
|
+
hash[key] = value unless found.empty?
|
44
|
+
hash
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
26
49
|
end
|
27
50
|
end
|
@@ -3,54 +3,54 @@ module Transmission
|
|
3
3
|
class SessionSet < Transmission::Arguments
|
4
4
|
|
5
5
|
ATTRIBUTES = [
|
6
|
-
'alt-speed-down',
|
7
|
-
'alt-speed-enabled',
|
8
|
-
'alt-speed-time-begin',
|
9
|
-
'alt-speed-time-enabled',
|
10
|
-
'alt-speed-time-end',
|
11
|
-
'alt-speed-time-day',
|
12
|
-
'alt-speed-up',
|
13
|
-
'blocklist-url',
|
14
|
-
'blocklist-update',
|
15
|
-
'blocklist-enabled',
|
16
|
-
'cache-size-mb',
|
17
|
-
'download-dir',
|
18
|
-
'download-queue-size',
|
19
|
-
'download-queue-enabled',
|
20
|
-
'dht-enabled',
|
21
|
-
'encryption',
|
22
|
-
'required',
|
23
|
-
'preferred',
|
24
|
-
'tolerated',
|
25
|
-
'idle-seeding-limit',
|
26
|
-
'idle-seeding-limit-enabled',
|
27
|
-
'incomplete-dir',
|
28
|
-
'incomplete-dir-enabled',
|
29
|
-
'lpd-enabled',
|
30
|
-
'peer-limit-global',
|
31
|
-
'peer-limit-per-torrent',
|
32
|
-
'pex-enabled',
|
33
|
-
'peer-port',
|
34
|
-
'peer-port-random-on-start',
|
35
|
-
'port-forwarding-enabled',
|
36
|
-
'queue-stalled-enabled',
|
37
|
-
'queue-stalled-minutes',
|
38
|
-
'rename-partial-files',
|
39
|
-
'script-torrent-done-filename',
|
40
|
-
'script-torrent-done-enabled',
|
41
|
-
'done',
|
42
|
-
'seedRatioLimit',
|
43
|
-
'seedRatioLimited',
|
44
|
-
'seed-queue-size',
|
45
|
-
'seed-queue-enabled',
|
46
|
-
'speed-limit-down',
|
47
|
-
'speed-limit-down-enabled',
|
48
|
-
'speed-limit-up',
|
49
|
-
'speed-limit-up-enabled',
|
50
|
-
'start-added-torrents',
|
51
|
-
'trash-original-torrent-files',
|
52
|
-
'units',
|
53
|
-
'utp-enabled'
|
6
|
+
{field: 'alt-speed-down'},
|
7
|
+
{field: 'alt-speed-enabled'},
|
8
|
+
{field: 'alt-speed-time-begin'},
|
9
|
+
{field: 'alt-speed-time-enabled'},
|
10
|
+
{field: 'alt-speed-time-end'},
|
11
|
+
{field: 'alt-speed-time-day'},
|
12
|
+
{field: 'alt-speed-up'},
|
13
|
+
{field: 'blocklist-url'},
|
14
|
+
{field: 'blocklist-update'},
|
15
|
+
{field: 'blocklist-enabled'},
|
16
|
+
{field: 'cache-size-mb'},
|
17
|
+
{field: 'download-dir'},
|
18
|
+
{field: 'download-queue-size'},
|
19
|
+
{field: 'download-queue-enabled'},
|
20
|
+
{field: 'dht-enabled'},
|
21
|
+
{field: 'encryption'},
|
22
|
+
{field: 'required'},
|
23
|
+
{field: 'preferred'},
|
24
|
+
{field: 'tolerated'},
|
25
|
+
{field: 'idle-seeding-limit'},
|
26
|
+
{field: 'idle-seeding-limit-enabled'},
|
27
|
+
{field: 'incomplete-dir'},
|
28
|
+
{field: 'incomplete-dir-enabled'},
|
29
|
+
{field: 'lpd-enabled'},
|
30
|
+
{field: 'peer-limit-global'},
|
31
|
+
{field: 'peer-limit-per-torrent'},
|
32
|
+
{field: 'pex-enabled'},
|
33
|
+
{field: 'peer-port'},
|
34
|
+
{field: 'peer-port-random-on-start'},
|
35
|
+
{field: 'port-forwarding-enabled'},
|
36
|
+
{field: 'queue-stalled-enabled'},
|
37
|
+
{field: 'queue-stalled-minutes'},
|
38
|
+
{field: 'rename-partial-files'},
|
39
|
+
{field: 'script-torrent-done-filename'},
|
40
|
+
{field: 'script-torrent-done-enabled'},
|
41
|
+
{field: 'done'},
|
42
|
+
{field: 'seedRatioLimit'},
|
43
|
+
{field: 'seedRatioLimited'},
|
44
|
+
{field: 'seed-queue-size'},
|
45
|
+
{field: 'seed-queue-enabled'},
|
46
|
+
{field: 'speed-limit-down'},
|
47
|
+
{field: 'speed-limit-down-enabled'},
|
48
|
+
{field: 'speed-limit-up'},
|
49
|
+
{field: 'speed-limit-up-enabled'},
|
50
|
+
{field: 'start-added-torrents'},
|
51
|
+
{field: 'trash-original-torrent-files'},
|
52
|
+
{field: 'units'},
|
53
|
+
{field: 'utp-enabled'}
|
54
54
|
]
|
55
55
|
|
56
56
|
end
|