rtransmission 0.1 → 0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +6 -4
- data/lib/rtransmission/client.rb +10 -3
- data/lib/rtransmission/fields/day.rb +29 -0
- data/lib/rtransmission/fields/encryption.rb +17 -0
- data/lib/rtransmission/fields/stats.rb +21 -0
- data/lib/rtransmission/fields/traffic_stats.rb +19 -0
- data/lib/rtransmission/fields.rb +4 -0
- data/lib/rtransmission/session.rb +127 -0
- data/lib/rtransmission/torrent.rb +18 -17
- data/lib/rtransmission/version.rb +1 -1
- data/lib/rtransmission.rb +2 -1
- metadata +6 -1
data/README.md
CHANGED
@@ -6,12 +6,14 @@ Ruby Transmission Bindings
|
|
6
6
|
Basic Usage
|
7
7
|
-----------
|
8
8
|
|
9
|
-
|
9
|
+
require 'rtransmission'
|
10
|
+
|
11
|
+
RTransmission::Client.session(:user => 'foo', :password => 'bar') do |session|
|
12
|
+
session.speed_limit_down_enabled = false
|
10
13
|
|
11
|
-
RTransmission::Client.new(:user => 'foo', :password => 'bar') do |client|
|
12
14
|
url = 'http://torrents.gentoo.org/torrents/livedvd-x86-amd64-32ul-11.1.torrent'
|
13
|
-
torrent = RTransmission::Torrent.add(
|
14
|
-
torrent = RTransmission::Torrent.list(
|
15
|
+
torrent = RTransmission::Torrent.add(session, :url => url)
|
16
|
+
torrent = RTransmission::Torrent.list(session)[0]
|
15
17
|
|
16
18
|
files = torrent.files
|
17
19
|
files.each { |f| puts f.name }
|
data/lib/rtransmission/client.rb
CHANGED
@@ -14,14 +14,21 @@ module RTransmission
|
|
14
14
|
|
15
15
|
attr_reader :session_id
|
16
16
|
|
17
|
-
def
|
17
|
+
def self.session(args = {}, &block)
|
18
|
+
client = RTransmission::Client.new(args)
|
19
|
+
session = RTransmission::Session.new(client)
|
20
|
+
|
21
|
+
block.call(session) if block
|
22
|
+
|
23
|
+
session
|
24
|
+
end
|
25
|
+
|
26
|
+
def initialize(args = {})
|
18
27
|
@host = args[:host] || 'localhost'
|
19
28
|
@port = args[:port] || 9091
|
20
29
|
@path = args[:path] || '/transmission/rpc'
|
21
30
|
@user = args[:user] || nil
|
22
31
|
@password = args[:password] || nil
|
23
|
-
|
24
|
-
block.call(self) if block
|
25
32
|
end
|
26
33
|
|
27
34
|
def call(request)
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# Copyright (c) 2011, Andrew Kirilenko <andrew.kirilenko@gmail.com>
|
2
|
+
# All rights reserved.
|
3
|
+
# Use of this source code is governed by a BSD-style license that can be found in the COPYING file.
|
4
|
+
|
5
|
+
module RTransmission
|
6
|
+
module Fields
|
7
|
+
class Day
|
8
|
+
MAP = {1 => :sunday, 2 => :monday, 4 => :tuesday, 8 => :wednesday, 16 => :thursday, 32 => :friday, 64 => :saturday}
|
9
|
+
|
10
|
+
def self.unmap(value)
|
11
|
+
result = []
|
12
|
+
MAP.each do |mask, day|
|
13
|
+
result << day if mask & value != 0
|
14
|
+
end
|
15
|
+
|
16
|
+
result
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.map(value)
|
20
|
+
result = 0
|
21
|
+
value.each do |day|
|
22
|
+
result += MAP.key(day)
|
23
|
+
end
|
24
|
+
|
25
|
+
result
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# Copyright (c) 2011, Andrew Kirilenko <andrew.kirilenko@gmail.com>
|
2
|
+
# All rights reserved.
|
3
|
+
# Use of this source code is governed by a BSD-style license that can be found in the COPYING file.
|
4
|
+
|
5
|
+
module RTransmission
|
6
|
+
module Fields
|
7
|
+
class Encryption
|
8
|
+
def self.unmap(value)
|
9
|
+
value.to_sym
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.map(value)
|
13
|
+
value.to_s
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# Copyright (c) 2011, Andrew Kirilenko <andrew.kirilenko@gmail.com>
|
2
|
+
# All rights reserved.
|
3
|
+
# Use of this source code is governed by a BSD-style license that can be found in the COPYING file.
|
4
|
+
|
5
|
+
module RTransmission
|
6
|
+
module Fields
|
7
|
+
class Stats < RTransmission::Field
|
8
|
+
define_attribute :active_torrent_count, 'activeTorrentCount'
|
9
|
+
define_attribute :download_speed, 'downloadSpeed'
|
10
|
+
define_attribute :paused_torrent_count, 'pausedTorrentCount'
|
11
|
+
define_attribute :torrent_count, 'torrentCount'
|
12
|
+
define_attribute :upload_speed, 'uploadSpeed'
|
13
|
+
define_attribute :cumulative_stats, 'cumulative-stats', :type => RTransmission::Fields::TrafficStats
|
14
|
+
define_attribute :current_stats, 'current-stats', :type => RTransmission::Fields::TrafficStats
|
15
|
+
|
16
|
+
def self.unmap(value)
|
17
|
+
RTransmission::Fields::Stats.new(value)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# Copyright (c) 2011, Andrew Kirilenko <andrew.kirilenko@gmail.com>
|
2
|
+
# All rights reserved.
|
3
|
+
# Use of this source code is governed by a BSD-style license that can be found in the COPYING file.
|
4
|
+
|
5
|
+
module RTransmission
|
6
|
+
module Fields
|
7
|
+
class TrafficStats < RTransmission::Field
|
8
|
+
define_attribute :uploaded_bytes, 'uploadedBytes'
|
9
|
+
define_attribute :downloaded_bytes, 'downloadedBytes'
|
10
|
+
define_attribute :files_added, 'filesAdded'
|
11
|
+
define_attribute :session_count, 'sessionCount'
|
12
|
+
define_attribute :seconds_active, 'secondsActive'
|
13
|
+
|
14
|
+
def self.unmap(value)
|
15
|
+
RTransmission::Fields::TrafficStats.new(value)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/rtransmission/fields.rb
CHANGED
@@ -17,3 +17,7 @@ require 'rtransmission/fields/seed_ratio_mode'
|
|
17
17
|
require 'rtransmission/fields/status'
|
18
18
|
require 'rtransmission/fields/tracker'
|
19
19
|
require 'rtransmission/fields/tracker_stat'
|
20
|
+
require 'rtransmission/fields/day'
|
21
|
+
require 'rtransmission/fields/encryption'
|
22
|
+
require 'rtransmission/fields/traffic_stats'
|
23
|
+
require 'rtransmission/fields/stats'
|
@@ -0,0 +1,127 @@
|
|
1
|
+
# Copyright (c) 2011, Andrew Kirilenko <andrew.kirilenko@gmail.com>
|
2
|
+
# All rights reserved.
|
3
|
+
# Use of this source code is governed by a BSD-style license that can be found in the COPYING file.
|
4
|
+
|
5
|
+
module RTransmission
|
6
|
+
class Session
|
7
|
+
attr_reader :client
|
8
|
+
|
9
|
+
def self.define_field(name, rpc_name, args = {})
|
10
|
+
self.send :define_method, name.to_s do
|
11
|
+
request = RTransmission::Request.new('session-get', {}, 'Session.' + name.to_s) do |arguments|
|
12
|
+
result = arguments[rpc_name]
|
13
|
+
if args[:type]
|
14
|
+
type = args[:type]
|
15
|
+
if type.class == Array
|
16
|
+
type = type[0]
|
17
|
+
result.map! { |r| type.unmap(r) }
|
18
|
+
else
|
19
|
+
result = type.unmap(result)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
result
|
24
|
+
end
|
25
|
+
|
26
|
+
@client.call(request)
|
27
|
+
end
|
28
|
+
|
29
|
+
if args[:writeable] == true
|
30
|
+
self.send :define_method, name.to_s.gsub('?', '') + '=' do |value|
|
31
|
+
rpc_value = value
|
32
|
+
if args[:type]
|
33
|
+
type = args[:type]
|
34
|
+
if type.class == Array
|
35
|
+
type = type[0]
|
36
|
+
rpc_value.map! { |r| type.map(r) }
|
37
|
+
else
|
38
|
+
rpc_value = type.map(rpc_value)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
request = RTransmission::Request.new('session-set', {rpc_name => rpc_value}, 'Session.' + name.to_s + '=') do
|
43
|
+
value
|
44
|
+
end
|
45
|
+
|
46
|
+
@client.call(request)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
define_field :alt_speed_down, 'alt-speed-down', :writeable => true
|
52
|
+
define_field :alt_speed_enabled?, 'alt-speed-enabled', :writeable => true
|
53
|
+
define_field :alt_speed_time_begin, 'alt-speed-time-begin', :writeable => true
|
54
|
+
define_field :alt_speed_time_enabled?, 'alt-speed-time-enabled', :writeable => true
|
55
|
+
define_field :alt_speed_time_end, 'alt-speed-time-end', :writeable => true
|
56
|
+
define_field :alt_speed_time_day, 'alt-speed-time-day', :type => RTransmission::Fields::Day, :writeable => true
|
57
|
+
define_field :alt_speed_up, 'alt-speed-up', :writeable => true
|
58
|
+
define_field :blocklist_url, 'blocklist-url', :writeable => true
|
59
|
+
define_field :blocklist_enabled?, 'blocklist-enabled', :writeable => true
|
60
|
+
define_field :blocklist_size, 'blocklist-size'
|
61
|
+
define_field :cache_size_mb, 'cache-size-mb', :writeable => true
|
62
|
+
define_field :config_dir, 'config-dir'
|
63
|
+
define_field :download_dir, 'download-dir', :writeable => true
|
64
|
+
define_field :download_dir_free_space, 'download-dir-free-space'
|
65
|
+
define_field :dht_enabled?, 'dht-enabled', :writeable => true
|
66
|
+
define_field :encryption, 'encryption', :type => RTransmission::Fields::Encryption, :writeable => true
|
67
|
+
define_field :idle_seeding_limit, 'idle-seeding-limit', :writeable => true
|
68
|
+
define_field :idle_seeding_limit_enabled?, 'idle-seeding-limit-enabled', :writeable => true
|
69
|
+
define_field :incomplete_dir, 'incomplete-dir', :writeable => true
|
70
|
+
define_field :incomplete_dir_enabled?, 'incomplete-dir-enabled', :writeable => true
|
71
|
+
define_field :lpd_enabled?, 'lpd-enabled', :writeable => true
|
72
|
+
define_field :peer_limit_global, 'peer-limit-global', :writeable => true
|
73
|
+
define_field :peer_limit_per_torrent, 'peer-limit-per-torrent', :writeable => true
|
74
|
+
define_field :pex_enabled?, 'pex-enabled', :writeable => true
|
75
|
+
define_field :peer_port, 'peer-port', :writeable => true
|
76
|
+
define_field :peer_port_random_on_start?, 'peer-port-random-on-start', :writeable => true
|
77
|
+
define_field :port_forwarding_enabled?, 'port-forwarding-enabled', :writeable => true
|
78
|
+
define_field :rename_partial_files?, 'rename-partial-files', :writeable => true
|
79
|
+
define_field :rpc_version, 'rpc-version'
|
80
|
+
define_field :rpc_version_minimum, 'rpc-version-minimum'
|
81
|
+
define_field :script_torrent_done_filename, 'script-torrent-done-filename', :writeable => true
|
82
|
+
define_field :script_torrent_done_enabled?, 'script-torrent-done-enabled', :writeable => true
|
83
|
+
define_field :seed_ratio_limit, 'seedRatioLimit', :type => RTransmission::Fields::Percent, :writeable => true
|
84
|
+
define_field :seed_ratio_limited?, 'seedRatioLimited', :writeable => true
|
85
|
+
define_field :speed_limit_down, 'speed-limit-down', :writeable => true
|
86
|
+
define_field :speed_limit_down_enabled?, 'speed-limit-down-enabled', :writeable => true
|
87
|
+
define_field :speed_limit_up, 'speed-limit-up', :writeable => true
|
88
|
+
define_field :speed_limit_up_enabled?, 'speed-limit-up-enabled', :writeable => true
|
89
|
+
define_field :start_added_torrents?, 'start-added-torrents', :writeable => true
|
90
|
+
define_field :trash_original_torrent_files?, 'trash-original-torrent-files', :writeable => true
|
91
|
+
define_field :units, 'units' # FIXME: add type and writeable
|
92
|
+
define_field :utp_enabled?, 'utp-enabled', :writeable => true
|
93
|
+
define_field :version, 'version'
|
94
|
+
|
95
|
+
def initialize(client)
|
96
|
+
@client = client
|
97
|
+
end
|
98
|
+
|
99
|
+
def stats
|
100
|
+
request = RTransmission::Request.new('session-stats', {}, 'Session.stats') do |arguments|
|
101
|
+
RTransmission::Fields::Stats.unmap(arguments)
|
102
|
+
end
|
103
|
+
|
104
|
+
@client.call(request)
|
105
|
+
end
|
106
|
+
|
107
|
+
def blocklist_update
|
108
|
+
request = RTransmission::Request.new('blocklist-update', {}, 'Session.blocklist_update') do |arguments|
|
109
|
+
arguments['blocklist-size']
|
110
|
+
end
|
111
|
+
|
112
|
+
@client.call(request)
|
113
|
+
end
|
114
|
+
|
115
|
+
def port_test
|
116
|
+
request = RTransmission::Request.new('port-test', {}, 'Session.port_test') do |arguments|
|
117
|
+
arguments['port-is-open']
|
118
|
+
end
|
119
|
+
|
120
|
+
@client.call(request)
|
121
|
+
end
|
122
|
+
|
123
|
+
def shutdown
|
124
|
+
@client.call(RTransmission::Request.new('session-close', {}, 'Session.shutdown'))
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
@@ -6,11 +6,12 @@ require 'base64'
|
|
6
6
|
|
7
7
|
# FIXME: files-wanted/unwanted & prioriry-high/low/normal for both add and new torrents
|
8
8
|
# FIXME: add/remove/replace trackers
|
9
|
+
# FIXME: location set support
|
9
10
|
module RTransmission
|
10
11
|
class Torrent
|
11
12
|
attr_reader :id
|
12
13
|
|
13
|
-
def self.add(
|
14
|
+
def self.add(session, args = {})
|
14
15
|
pargs = {}
|
15
16
|
|
16
17
|
raise RTransmission::Exception.new('Torrent#add: only one of remote_file, url, or torrent must be specified') if (args.keys & [:remote_file, :url, :torrent]).count != 1
|
@@ -22,26 +23,26 @@ module RTransmission
|
|
22
23
|
pargs['download-dir'] = args[:download_dir] if args[:download_dir]
|
23
24
|
pargs['paused'] = args[:paused] if args[:paused]
|
24
25
|
pargs['peer-limit'] = args[:peer_limit] if args[:peer_limit]
|
25
|
-
pargs['
|
26
|
+
pargs['bandwidthPriority'] = RTransmission::Fields::Priority.map(args[:bandwidth_priority]) if args[:bandwidth_priority]
|
26
27
|
|
27
28
|
request = RTransmission::Request.new('torrent-add', pargs, 'Torrent#add') do |arguments|
|
28
|
-
RTransmission::Torrent.new(
|
29
|
+
RTransmission::Torrent.new(session, arguments['torrent-added']['id'])
|
29
30
|
end
|
30
31
|
|
31
|
-
client.call(request)
|
32
|
+
session.client.call(request)
|
32
33
|
end
|
33
34
|
|
34
|
-
def self.list(
|
35
|
+
def self.list(session)
|
35
36
|
request = RTransmission::Request.new('torrent-get', {'fields' => ['id']}, 'Torrent#list') do |arguments|
|
36
37
|
torrents = []
|
37
38
|
arguments['torrents'].each do |torrent|
|
38
|
-
torrents << RTransmission::Torrent.new(
|
39
|
+
torrents << RTransmission::Torrent.new(session, torrent['id'])
|
39
40
|
end
|
40
41
|
|
41
42
|
torrents
|
42
43
|
end
|
43
44
|
|
44
|
-
client.call(request)
|
45
|
+
session.client.call(request)
|
45
46
|
end
|
46
47
|
|
47
48
|
def self.define_field(name, rpc_name, args = {})
|
@@ -61,7 +62,7 @@ module RTransmission
|
|
61
62
|
result
|
62
63
|
end
|
63
64
|
|
64
|
-
@client.call(request)
|
65
|
+
@session.client.call(request)
|
65
66
|
end
|
66
67
|
|
67
68
|
if args[:writeable] == true
|
@@ -81,7 +82,7 @@ module RTransmission
|
|
81
82
|
value
|
82
83
|
end
|
83
84
|
|
84
|
-
@client.call(request)
|
85
|
+
@session.client.call(request)
|
85
86
|
end
|
86
87
|
end
|
87
88
|
end
|
@@ -151,25 +152,25 @@ module RTransmission
|
|
151
152
|
define_field :webseeds, 'webseeds' # FIXME: add type
|
152
153
|
define_field :webseeds_sending_to_us, 'webseedsSendingToUs'
|
153
154
|
|
154
|
-
def initialize(
|
155
|
-
@
|
155
|
+
def initialize(session, id)
|
156
|
+
@session = session
|
156
157
|
@id = id
|
157
158
|
end
|
158
159
|
|
159
160
|
def start
|
160
|
-
@client.call(RTransmission::Request.new('torrent-start', {'ids' => @id}, 'Torrent.start'))
|
161
|
+
@session.client.call(RTransmission::Request.new('torrent-start', {'ids' => @id}, 'Torrent.start'))
|
161
162
|
end
|
162
163
|
|
163
164
|
def stop
|
164
|
-
@client.call(RTransmission::Request.new('torrent-stop', {'ids' => @id}, 'Torrent.stop'))
|
165
|
+
@session.client.call(RTransmission::Request.new('torrent-stop', {'ids' => @id}, 'Torrent.stop'))
|
165
166
|
end
|
166
167
|
|
167
168
|
def verify
|
168
|
-
@client.call(RTransmission::Request.new('torrent-verify', {'ids' => @id}, 'Torrent.verify'))
|
169
|
+
@session.client.call(RTransmission::Request.new('torrent-verify', {'ids' => @id}, 'Torrent.verify'))
|
169
170
|
end
|
170
171
|
|
171
172
|
def reannounce
|
172
|
-
@client.call(RTransmission::Request.new('torrent-reannounce', {'ids' => @id}, 'Torrent.reannounce'))
|
173
|
+
@session.client.call(RTransmission::Request.new('torrent-reannounce', {'ids' => @id}, 'Torrent.reannounce'))
|
173
174
|
end
|
174
175
|
|
175
176
|
def remove(args = {})
|
@@ -177,7 +178,7 @@ module RTransmission
|
|
177
178
|
|
178
179
|
pargs['delete-local-data'] = args[:delete_local_data] if args[:delete_local_data]
|
179
180
|
|
180
|
-
@client.call(RTransmission::Request.new('torrent-remove', {'ids' => @id}.merge(pargs), 'Torrent.remove'))
|
181
|
+
@session.client.call(RTransmission::Request.new('torrent-remove', {'ids' => @id}.merge(pargs), 'Torrent.remove'))
|
181
182
|
end
|
182
183
|
|
183
184
|
def move(args = {})
|
@@ -186,7 +187,7 @@ module RTransmission
|
|
186
187
|
pargs['location'] = args[:location] if args[:location]
|
187
188
|
pargs['move'] = args[:move] if args[:move]
|
188
189
|
|
189
|
-
@client.call(RTransmission::Request.new('torrent-set-location', {'ids' => @id}.merge(pargs), 'Torrent.move'))
|
190
|
+
@session.client.call(RTransmission::Request.new('torrent-set-location', {'ids' => @id}.merge(pargs), 'Torrent.move'))
|
190
191
|
end
|
191
192
|
end
|
192
193
|
end
|
data/lib/rtransmission.rb
CHANGED
@@ -4,9 +4,10 @@
|
|
4
4
|
|
5
5
|
require 'rtransmission/version'
|
6
6
|
require 'rtransmission/exception'
|
7
|
-
require 'rtransmission/client'
|
8
7
|
require 'rtransmission/request'
|
9
8
|
require 'rtransmission/response'
|
10
9
|
require 'rtransmission/field'
|
11
10
|
require 'rtransmission/fields'
|
11
|
+
require 'rtransmission/session'
|
12
12
|
require 'rtransmission/torrent'
|
13
|
+
require 'rtransmission/client'
|
metadata
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
name: rtransmission
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: "0.
|
5
|
+
version: "0.2"
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Andrew Kirilenko
|
@@ -28,6 +28,7 @@ files:
|
|
28
28
|
- rtransmission.gemspec
|
29
29
|
- lib/rtransmission/fields.rb
|
30
30
|
- lib/rtransmission/client.rb
|
31
|
+
- lib/rtransmission/session.rb
|
31
32
|
- lib/rtransmission/version.rb
|
32
33
|
- lib/rtransmission/torrent.rb
|
33
34
|
- lib/rtransmission/response.rb
|
@@ -36,8 +37,10 @@ files:
|
|
36
37
|
- lib/rtransmission/fields/eta.rb
|
37
38
|
- lib/rtransmission/fields/time.rb
|
38
39
|
- lib/rtransmission/fields/tracker_stat.rb
|
40
|
+
- lib/rtransmission/fields/encryption.rb
|
39
41
|
- lib/rtransmission/fields/error.rb
|
40
42
|
- lib/rtransmission/fields/tracker.rb
|
43
|
+
- lib/rtransmission/fields/stats.rb
|
41
44
|
- lib/rtransmission/fields/peers_from.rb
|
42
45
|
- lib/rtransmission/fields/file_stat.rb
|
43
46
|
- lib/rtransmission/fields/percent.rb
|
@@ -47,7 +50,9 @@ files:
|
|
47
50
|
- lib/rtransmission/fields/seed_ratio_mode.rb
|
48
51
|
- lib/rtransmission/fields/peer.rb
|
49
52
|
- lib/rtransmission/fields/priority.rb
|
53
|
+
- lib/rtransmission/fields/traffic_stats.rb
|
50
54
|
- lib/rtransmission/fields/seed_idle_mode.rb
|
55
|
+
- lib/rtransmission/fields/day.rb
|
51
56
|
- lib/rtransmission/field.rb
|
52
57
|
- lib/rtransmission.rb
|
53
58
|
has_rdoc: true
|