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 CHANGED
@@ -6,12 +6,14 @@ Ruby Transmission Bindings
6
6
  Basic Usage
7
7
  -----------
8
8
 
9
- requre 'rtransmission'
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(client, :url => url)
14
- torrent = RTransmission::Torrent.list(client)[0]
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 }
@@ -14,14 +14,21 @@ module RTransmission
14
14
 
15
15
  attr_reader :session_id
16
16
 
17
- def initialize(args = {}, &block)
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
@@ -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(client, args = {})
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['bandwithPriority'] = args[:bandwith_priority] if args[:bandwith_priority] # FIXME: use field here
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(client, arguments['torrent-added']['id'])
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(client)
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(client, torrent['id'])
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(client, id)
155
- @client = client
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
@@ -5,7 +5,7 @@
5
5
  module RTransmission
6
6
  module VERSION
7
7
  MAJOR = 0
8
- MINOR = 1
8
+ MINOR = 2
9
9
 
10
10
  STRING = [MAJOR, MINOR].join('.')
11
11
  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.1"
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