transmission-rpc-ruby 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -3,18 +3,22 @@ module Transmission
3
3
  class TorrentAdd < Transmission::Arguments
4
4
 
5
5
  ATTRIBUTES = [
6
- 'cookies',
7
- 'download-dir',
8
- 'filename',
9
- 'metainfo',
10
- 'paused',
11
- 'peer-limit',
12
- 'bandwidthPriority',
13
- 'files-wanted',
14
- 'files-unwanted',
15
- 'priority-high',
16
- 'priority-low',
17
- 'priority-normal'
6
+ {field: 'cookies'},
7
+ {field: 'download-dir'},
8
+ {field: 'filename'},
9
+ {field: 'metainfo'},
10
+ {field: 'paused'},
11
+ {field: 'peer-limit'},
12
+ {field: 'bandwidthPriority'},
13
+ {field: 'files-wanted'},
14
+ {field: 'files-unwanted'},
15
+ {field: 'priority-high'},
16
+ {field: 'priority-low'},
17
+ {field: 'priority-normal'}
18
+ ]
19
+
20
+ REQUIRED = [
21
+ 'filename metainfo'
18
22
  ]
19
23
 
20
24
  end
@@ -3,30 +3,30 @@ module Transmission
3
3
  class TorrentSet < Transmission::Arguments
4
4
 
5
5
  ATTRIBUTES = [
6
- 'bandwidthPriority',
7
- 'downloadLimit',
8
- 'downloadLimited',
9
- 'downloadLimit',
10
- 'files-wanted',
11
- 'files-unwanted',
12
- 'honorsSessionLimits',
13
- 'ids',
14
- 'location',
15
- 'peer-limit',
16
- 'priority-high',
17
- 'priority-low',
18
- 'priority-normal',
19
- 'queuePosition',
20
- 'seedIdleLimit',
21
- 'seedIdleMode',
22
- 'seedRatioLimit',
23
- 'seedRatioMode',
24
- 'trackerAdd',
25
- 'trackerRemove',
26
- 'trackerReplace',
27
- 'uploadLimit',
28
- 'uploadLimited',
29
- 'uploadLimit'
6
+ {field: 'bandwidthPriority'},
7
+ {field: 'downloadLimit'},
8
+ {field: 'downloadLimited'},
9
+ {field: 'downloadLimit'},
10
+ {field: 'files-wanted'},
11
+ {field: 'files-unwanted'},
12
+ {field: 'honorsSessionLimits'},
13
+ {field: 'ids'},
14
+ {field: 'location'},
15
+ {field: 'peer-limit'},
16
+ {field: 'priority-high'},
17
+ {field: 'priority-low'},
18
+ {field: 'priority-normal'},
19
+ {field: 'queuePosition'},
20
+ {field: 'seedIdleLimit'},
21
+ {field: 'seedIdleMode'},
22
+ {field: 'seedRatioLimit'},
23
+ {field: 'seedRatioMode'},
24
+ {field: 'trackerAdd'},
25
+ {field: 'trackerRemove'},
26
+ {field: 'trackerReplace'},
27
+ {field: 'uploadLimit'},
28
+ {field: 'uploadLimited'},
29
+ {field: 'uploadLimit'}
30
30
  ]
31
31
 
32
32
  end
@@ -0,0 +1,42 @@
1
+ require File.join(File.dirname(__FILE__), 'fields', 'torrent_get')
2
+ require File.join(File.dirname(__FILE__), 'fields', 'session_get')
3
+ require File.join(File.dirname(__FILE__), 'fields', 'session_stats')
4
+ require File.join(File.dirname(__FILE__), 'utils')
5
+
6
+ module Transmission
7
+ class Fields
8
+ class InvalidField < StandardError; end
9
+
10
+ attr_accessor :fields
11
+
12
+ ATTRIBUTES = []
13
+
14
+ def initialize(fields = nil)
15
+ @fields = fields.inject([]) do |fields, field|
16
+ found = self.class::ATTRIBUTES.select { |attr| attr[:field] == field}
17
+ raise Transmission::Fields::InvalidField, field if found.empty?
18
+ fields << field
19
+ end if fields
20
+ @fields = self.class::ATTRIBUTES.collect do |key|
21
+ key[:field]
22
+ end if fields.nil?
23
+ end
24
+
25
+ def to_fields
26
+ @fields
27
+ end
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
+ end
40
+
41
+ end
42
+ end
@@ -0,0 +1,63 @@
1
+ module Transmission
2
+ class Fields
3
+ class SessionGet < Transmission::Fields
4
+
5
+ ATTRIBUTES = [
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: 'blocklist-size'},
17
+ {field: 'cache-size-mb'},
18
+ {field: 'config-dir'},
19
+ {field: 'download-dir'},
20
+ {field: 'download-queue-size'},
21
+ {field: 'download-queue-enabled'},
22
+ {field: 'dht-enabled'},
23
+ {field: 'encryption'},
24
+ {field: 'required'},
25
+ {field: 'preferred'},
26
+ {field: 'tolerated'},
27
+ {field: 'idle-seeding-limit'},
28
+ {field: 'idle-seeding-limit-enabled'},
29
+ {field: 'incomplete-dir'},
30
+ {field: 'incomplete-dir-enabled'},
31
+ {field: 'lpd-enabled'},
32
+ {field: 'peer-limit-global'},
33
+ {field: 'peer-limit-per-torrent'},
34
+ {field: 'pex-enabled'},
35
+ {field: 'peer-port'},
36
+ {field: 'peer-port-random-on-start'},
37
+ {field: 'port-forwarding-enabled'},
38
+ {field: 'queue-stalled-enabled'},
39
+ {field: 'queue-stalled-minutes'},
40
+ {field: 'rename-partial-files'},
41
+ {field: 'rpc-version'},
42
+ {field: 'rpc-version-minimum'},
43
+ {field: 'script-torrent-done-filename'},
44
+ {field: 'script-torrent-done-enabled'},
45
+ {field: 'done'},
46
+ {field: 'seedRatioLimit'},
47
+ {field: 'seedRatioLimited'},
48
+ {field: 'seed-queue-size'},
49
+ {field: 'seed-queue-enabled'},
50
+ {field: 'speed-limit-down'},
51
+ {field: 'speed-limit-down-enabled'},
52
+ {field: 'speed-limit-up'},
53
+ {field: 'speed-limit-up-enabled'},
54
+ {field: 'start-added-torrents'},
55
+ {field: 'trash-original-torrent-files'},
56
+ {field: 'units'},
57
+ {field: 'utp-enabled'},
58
+ {field: 'version'}
59
+ ]
60
+
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,17 @@
1
+ module Transmission
2
+ class Fields
3
+ class SessionStats < Transmission::Fields
4
+
5
+ ATTRIBUTES = [
6
+ {field: 'activeTorrentCount'},
7
+ {field: 'downloadSpeed'},
8
+ {field: 'pausedTorrentCount'},
9
+ {field: 'torrentCount'},
10
+ {field: 'uploadSpeed'},
11
+ {field: 'cumulative-stats'},
12
+ {field: 'current-stats'}
13
+ ]
14
+
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,78 @@
1
+ module Transmission
2
+ class Fields
3
+ class TorrentGet < Transmission::Fields
4
+
5
+ ATTRIBUTES = [
6
+ {field: 'id'},
7
+ {field: 'activityDate'},
8
+ {field: 'addedDate'},
9
+ {field: 'bandwidthPriority'},
10
+ {field: 'comment'},
11
+ {field: 'corruptEver'},
12
+ {field: 'creator'},
13
+ {field: 'dateCreated'},
14
+ {field: 'desiredAvailable'},
15
+ {field: 'doneDate'},
16
+ {field: 'downloadDir'},
17
+ {field: 'downloadedEver'},
18
+ {field: 'downloadLimit'},
19
+ {field: 'downloadLimited'},
20
+ {field: 'error'},
21
+ {field: 'errorString'},
22
+ {field: 'eta'},
23
+ {field: 'etaIdle'},
24
+ {field: 'files'},
25
+ {field: 'fileStats'},
26
+ {field: 'hashString'},
27
+ {field: 'haveUnchecked'},
28
+ {field: 'haveValid'},
29
+ {field: 'honorsSessionLimits'},
30
+ {field: 'isFinished'},
31
+ {field: 'isPrivate'},
32
+ {field: 'isStalled'},
33
+ {field: 'leftUntilDone'},
34
+ {field: 'magnetLink'},
35
+ {field: 'manualAnnounceTime'},
36
+ {field: 'maxConnectedPeers'},
37
+ {field: 'metadataPercentComplete'},
38
+ {field: 'name'},
39
+ {field: 'peer-limit'},
40
+ {field: 'peers'},
41
+ {field: 'peersConnected'},
42
+ {field: 'peersFrom'},
43
+ {field: 'peersGettingFromUs'},
44
+ {field: 'peersSendingToUs'},
45
+ {field: 'percentDone'},
46
+ {field: 'pieces'},
47
+ {field: 'pieceCount'},
48
+ {field: 'pieceSize'},
49
+ {field: 'priorities'},
50
+ {field: 'queuePosition'},
51
+ {field: 'rateDownload'},
52
+ {field: 'rateUpload'},
53
+ {field: 'recheckProgress'},
54
+ {field: 'secondsDownloading'},
55
+ {field: 'secondsSeeding'},
56
+ {field: 'seedIdleLimit'},
57
+ {field: 'seedIdleMode'},
58
+ {field: 'seedRatioLimit'},
59
+ {field: 'seedRatioMode'},
60
+ {field: 'sizeWhenDone'},
61
+ {field: 'startDate'},
62
+ {field: 'status'},
63
+ {field: 'trackers'},
64
+ {field: 'trackerStats'},
65
+ {field: 'totalSize'},
66
+ {field: 'torrentFile'},
67
+ {field: 'uploadedEver'},
68
+ {field: 'uploadLimit'},
69
+ {field: 'uploadLimited'},
70
+ {field: 'uploadRatio'},
71
+ {field: 'wanted'},
72
+ {field: 'webseeds'},
73
+ {field: 'webseedsSendingToUs'}
74
+ ]
75
+
76
+ end
77
+ end
78
+ end
@@ -3,27 +3,36 @@ module Transmission
3
3
  class Session
4
4
  class SessionError < StandardError; end
5
5
 
6
- attr_accessor :attributes
6
+ attr_accessor :attributes, :connector
7
7
 
8
- def initialize(session_object)
8
+ def initialize(session_object, connector)
9
9
  @attributes = session_object
10
+ @connector = connector
10
11
  end
11
12
 
12
- def version
13
- @attributes['version'].split(' ').first
13
+ def save!
14
+ filtered = Transmission::Arguments::SessionSet.filter @attributes
15
+ connector.set_session filtered
14
16
  end
15
17
 
16
- def rpc_version
17
- @attributes['rpc-version']
18
+ def method_missing(symbol, *args)
19
+ string = symbol.to_s
20
+ if string[-1] == '='
21
+ string = string[0..-2]
22
+ key = Transmission::Arguments::SessionSet.real_key string
23
+ return @attributes[key] = args.first if !!key
24
+ else
25
+ key = Transmission::Fields::SessionGet.real_key string
26
+ return @attributes[key] if !!key
27
+ end
28
+ super
18
29
  end
19
30
 
20
31
  class << self
21
32
  def get(options = {})
22
33
  rpc = options[:connector] || connector
23
- session_body = rpc.get_session options
24
- session_stats_body = rpc.get_session_stats options
25
- merged_body = session_body.merge(session_stats_body)
26
- Session.new merged_body
34
+ body = rpc.get_session options[:fields]
35
+ Session.new body, rpc
27
36
  end
28
37
 
29
38
  def connector
@@ -0,0 +1,25 @@
1
+ module Transmission
2
+ module Model
3
+ class SessionStats
4
+
5
+ attr_accessor :attributes, :connector
6
+
7
+ def initialize(session_object, connector)
8
+ @attributes = session_object
9
+ @connector = connector
10
+ end
11
+
12
+ class << self
13
+ def get(options = {})
14
+ rpc = options[:connector] || connector
15
+ body = rpc.get_session_stats options[:fields]
16
+ SessionStats.new body, rpc
17
+ end
18
+
19
+ def connector
20
+ Transmission::Config.get_connector
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -6,55 +6,57 @@ module Transmission
6
6
  class MissingAttributesError < StandardError; end
7
7
  class DuplicateTorrentError < StandardError; end
8
8
 
9
- attr_accessor :attributes, :deleted
9
+ attr_accessor :attributes, :deleted, :connector
10
10
 
11
- def initialize(torrent_object)
11
+ def initialize(torrent_object, connector)
12
12
  @attributes = torrent_object
13
+ @connector = connector
13
14
  end
14
15
 
15
16
  def delete!(remove_local_data = false)
16
- Torrent.connector.remove_torrent [self.attributes['id']], remove_local_data
17
+ connector.remove_torrent [self.id], remove_local_data
17
18
  @deleted = true
18
19
  end
19
20
 
20
- def set
21
-
21
+ def save!
22
+ filtered = Transmission::Arguments::TorrentSet.filter @attributes
23
+ connector.set_torrent [self.id], filtered
22
24
  end
23
25
 
24
- def move_up
25
-
26
+ def move_up!
27
+ connector.move_up_torrent [self.id]
26
28
  end
27
29
 
28
- def move_down
29
-
30
+ def move_down!
31
+ connector.move_down_torrent [self.id]
30
32
  end
31
33
 
32
- def move_top
33
-
34
+ def move_top!
35
+ connector.move_top_torrent [self.id]
34
36
  end
35
37
 
36
- def move_bottom
37
-
38
+ def move_bottom!
39
+ connector.move_bottom_torrent [self.id]
38
40
  end
39
41
 
40
- def start
41
-
42
+ def start!
43
+ connector.start_torrent [self.id]
42
44
  end
43
45
 
44
- def start_now
45
-
46
+ def start_now!
47
+ connector.start_torrent_now [self.id]
46
48
  end
47
49
 
48
- def stop
49
-
50
+ def stop!
51
+ connector.stop_torrent [self.id]
50
52
  end
51
53
 
52
- def verify
53
-
54
+ def verify!
55
+ connector.verify_torrent [self.id]
54
56
  end
55
57
 
56
- def re_announce
57
-
58
+ def re_announce!
59
+ connector.re_announce_torrent [self.id]
58
60
  end
59
61
 
60
62
  def finished?
@@ -65,20 +67,33 @@ module Transmission
65
67
 
66
68
  end
67
69
 
70
+ def method_missing(symbol, *args)
71
+ string = symbol.to_s
72
+ if string[-1] == '='
73
+ string = string[0..-2]
74
+ key = Transmission::Arguments::TorrentSet.real_key string
75
+ return @attributes[key] = args.first if !!key
76
+ else
77
+ key = Transmission::Fields::TorrentGet.real_key string
78
+ return @attributes[key] if !!key
79
+ end
80
+ super
81
+ end
82
+
68
83
  class << self
69
84
  def all(options = {})
70
85
  rpc = options[:connector] || connector
71
- body = rpc.get_torrent nil, options
86
+ body = rpc.get_torrent nil, options[:fields]
72
87
  body['torrents'].inject([]) do |torrents, torrent|
73
- torrents << Torrent.new(torrent)
88
+ torrents << Torrent.new(torrent, rpc)
74
89
  end
75
90
  end
76
91
 
77
92
  def find(id, options = {})
78
93
  rpc = options[:connector] || connector
79
- body = rpc.get_torrent [id], options
94
+ body = rpc.get_torrent [id], options[:fields]
80
95
  raise TorrentNotFoundError if body['torrents'].size == 0
81
- Torrent.new body['torrents'].first
96
+ Torrent.new body['torrents'].first, rpc
82
97
  end
83
98
 
84
99
  def add(options = {})