rtransmission 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/COPYING +26 -0
- data/README.md +24 -0
- data/lib/rtransmission/client.rb +45 -0
- data/lib/rtransmission/exception.rb +8 -0
- data/lib/rtransmission/field.rb +24 -0
- data/lib/rtransmission/fields/error.rb +15 -0
- data/lib/rtransmission/fields/eta.rb +16 -0
- data/lib/rtransmission/fields/file.rb +17 -0
- data/lib/rtransmission/fields/file_stat.rb +17 -0
- data/lib/rtransmission/fields/peer.rb +30 -0
- data/lib/rtransmission/fields/peers_from.rb +20 -0
- data/lib/rtransmission/fields/percent.rb +17 -0
- data/lib/rtransmission/fields/pieces.rb +13 -0
- data/lib/rtransmission/fields/priority.rb +19 -0
- data/lib/rtransmission/fields/seed_idle_mode.rb +19 -0
- data/lib/rtransmission/fields/seed_ratio_mode.rb +19 -0
- data/lib/rtransmission/fields/status.rb +20 -0
- data/lib/rtransmission/fields/time.rb +13 -0
- data/lib/rtransmission/fields/tracker.rb +18 -0
- data/lib/rtransmission/fields/tracker_stat.rb +41 -0
- data/lib/rtransmission/fields.rb +19 -0
- data/lib/rtransmission/request.rb +25 -0
- data/lib/rtransmission/response.rb +26 -0
- data/lib/rtransmission/torrent.rb +192 -0
- data/lib/rtransmission/version.rb +13 -0
- data/lib/rtransmission.rb +12 -0
- data/rtransmission.gemspec +15 -0
- metadata +82 -0
data/COPYING
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
Copyright (c) 2011, Andrew Kirilenko <andrew.kirilenko@gmail.com>
|
2
|
+
All rights reserved.
|
3
|
+
|
4
|
+
Redistribution and use in source and binary forms, with or without
|
5
|
+
modification, are permitted provided that the following conditions are met:
|
6
|
+
|
7
|
+
1. Redistributions of source code must retain the above copyright notice,
|
8
|
+
this list of conditions and the following disclaimer.
|
9
|
+
2. Redistributions in binary form must reproduce the above copyright
|
10
|
+
notice, this list of conditions and the following disclaimer in the
|
11
|
+
documentation and/or other materials provided with the distribution.
|
12
|
+
3. Neither the name of the author nor the names of its
|
13
|
+
contributors may be used to endorse or promote products derived from
|
14
|
+
this software without specific prior written permission.
|
15
|
+
|
16
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
17
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
18
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
19
|
+
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
20
|
+
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
21
|
+
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
22
|
+
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
23
|
+
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
24
|
+
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
25
|
+
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
26
|
+
POSSIBILITY OF SUCH DAMAGE.
|
data/README.md
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
RTransmission
|
2
|
+
-------------
|
3
|
+
|
4
|
+
Ruby Transmission Bindings
|
5
|
+
|
6
|
+
Basic Usage
|
7
|
+
-----------
|
8
|
+
|
9
|
+
requre 'rtransmission'
|
10
|
+
|
11
|
+
RTransmission::Client.new(:user => 'foo', :password => 'bar') do |client|
|
12
|
+
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
|
+
|
16
|
+
files = torrent.files
|
17
|
+
files.each { |f| puts f.name }
|
18
|
+
|
19
|
+
torrent.upload_limited = false
|
20
|
+
end
|
21
|
+
|
22
|
+
Copyright (c) 2011, Andrew Kirilenko <andrew.kirilenko@gmail.com>
|
23
|
+
All rights reserved.
|
24
|
+
Use of this source code is governed by a BSD-style license that can be found in the COPYING file.
|
@@ -0,0 +1,45 @@
|
|
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
|
+
require 'net/http'
|
6
|
+
|
7
|
+
module RTransmission
|
8
|
+
class Client
|
9
|
+
attr_accessor :host
|
10
|
+
attr_accessor :port
|
11
|
+
attr_accessor :path
|
12
|
+
attr_accessor :user
|
13
|
+
attr_accessor :password
|
14
|
+
|
15
|
+
attr_reader :session_id
|
16
|
+
|
17
|
+
def initialize(args = {}, &block)
|
18
|
+
@host = args[:host] || 'localhost'
|
19
|
+
@port = args[:port] || 9091
|
20
|
+
@path = args[:path] || '/transmission/rpc'
|
21
|
+
@user = args[:user] || nil
|
22
|
+
@password = args[:password] || nil
|
23
|
+
|
24
|
+
block.call(self) if block
|
25
|
+
end
|
26
|
+
|
27
|
+
def call(request)
|
28
|
+
req = Net::HTTP::Post.new(@path)
|
29
|
+
req.basic_auth(@user, @password) if @user || @password
|
30
|
+
req['X-Transmission-Session-Id'] = @session_id if @session_id
|
31
|
+
req.body = request.to_json
|
32
|
+
|
33
|
+
res = Net::HTTP.start(@host, @port) do |http|
|
34
|
+
http.request(req)
|
35
|
+
end
|
36
|
+
|
37
|
+
if res.code.to_i == 409
|
38
|
+
@session_id = res['X-Transmission-Session-Id']
|
39
|
+
return call(request)
|
40
|
+
end
|
41
|
+
|
42
|
+
return RTransmission::Response.new(res.body, request.response_prefix, request.response_block).parse
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,24 @@
|
|
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 Field
|
7
|
+
def self.unmap(value)
|
8
|
+
value
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.define_attribute(name, rpc_name, args = {})
|
12
|
+
self.send :define_method, name.to_s do
|
13
|
+
value = @hash[rpc_name]
|
14
|
+
value = args[:type].unmap(value) if args[:type]
|
15
|
+
|
16
|
+
value
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def initialize(hash)
|
21
|
+
@hash = hash
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,15 @@
|
|
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 Error
|
8
|
+
MAP = {0 => :ok, 1 => :tracker_warning, 2 => :tracker_error, 3 => :local_error}
|
9
|
+
|
10
|
+
def self.unmap(value)
|
11
|
+
MAP[value]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,16 @@
|
|
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 ETA
|
8
|
+
MAP = {-1 => :not_available, -2 => :unknown}
|
9
|
+
|
10
|
+
def self.unmap(value)
|
11
|
+
return value if value >= 0
|
12
|
+
MAP[value]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
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 File < RTransmission::Field
|
8
|
+
define_attribute :name, 'name'
|
9
|
+
define_attribute :length, 'length'
|
10
|
+
define_attribute :bytes_completed, 'bytesCompleted'
|
11
|
+
|
12
|
+
def self.unmap(value)
|
13
|
+
RTransmission::Fields::File.new(value)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
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 FileStat < RTransmission::Field
|
8
|
+
define_attribute :bytes_completed, 'bytesCompleted'
|
9
|
+
define_attribute :wanted?, 'wanted'
|
10
|
+
define_attribute :priority, 'priority', :type => RTransmission::Fields::Priority
|
11
|
+
|
12
|
+
def self.unmap(value)
|
13
|
+
RTransmission::Fields::FileStat.new(value)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,30 @@
|
|
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 Peer < RTransmission::Field
|
8
|
+
define_attribute :address, 'address'
|
9
|
+
define_attribute :client_choked?, 'clientIsChoked'
|
10
|
+
define_attribute :client_interested?, 'clientIsInterested'
|
11
|
+
define_attribute :client_name, 'clientName'
|
12
|
+
define_attribute :flag_str, 'flagStr'
|
13
|
+
define_attribute :downloading_from?, 'isDownloadingFrom'
|
14
|
+
define_attribute :encrypted?, 'isEncrypted'
|
15
|
+
define_attribute :incoming?, 'isIncoming'
|
16
|
+
define_attribute :utp?, 'isUTP'
|
17
|
+
define_attribute :uploading_to?, 'isUploadingTo'
|
18
|
+
define_attribute :peer_choked?, 'peerIsChoked'
|
19
|
+
define_attribute :peer_interested?, 'peerIsInterested'
|
20
|
+
define_attribute :port, 'port'
|
21
|
+
define_attribute :progress, 'progress', :type => RTransmission::Fields::Percent
|
22
|
+
define_attribute :rate_to_client, 'rateToClient'
|
23
|
+
define_attribute :rate_to_peer, 'rateToPeer'
|
24
|
+
|
25
|
+
def self.unmap(value)
|
26
|
+
RTransmission::Fields::Peer.new(value)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,20 @@
|
|
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 PeersFrom < RTransmission::Field
|
8
|
+
define_attribute :cache, 'fromCache'
|
9
|
+
define_attribute :dht, 'fromDht'
|
10
|
+
define_attribute :incoming, 'fromIncoming'
|
11
|
+
define_attribute :ltep, 'fromLtep'
|
12
|
+
define_attribute :pex, 'fromPex'
|
13
|
+
define_attribute :tracker, 'fromTracker'
|
14
|
+
|
15
|
+
def self.unmap(value)
|
16
|
+
RTransmission::Fields::PeersFrom.new(value)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
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 Percent
|
8
|
+
def self.unmap(value)
|
9
|
+
value
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.map(value)
|
13
|
+
value
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,13 @@
|
|
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 Pieces
|
8
|
+
def self.unmap(value)
|
9
|
+
value
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
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 Priority
|
8
|
+
MAP = {-1 => :low, 0 => :normal, 1 => :high}
|
9
|
+
|
10
|
+
def self.unmap(value)
|
11
|
+
MAP[value]
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.map(value)
|
15
|
+
MAP.key(value)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
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 SeedIdleMode
|
8
|
+
MAP = {0 => :global, 1 => :single, 2 => :unlimited}
|
9
|
+
|
10
|
+
def self.unmap(value)
|
11
|
+
MAP[value]
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.map(value)
|
15
|
+
MAP.key(value)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
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 SeedRatioMode
|
8
|
+
MAP = {0 => :global, 1 => :single, 2 => :unlimited}
|
9
|
+
|
10
|
+
def self.unmap(value)
|
11
|
+
MAP[value]
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.map(value)
|
15
|
+
MAP.key(value)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,20 @@
|
|
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 Status
|
8
|
+
MAP = {1 => :check_wait, 2 => :check, 4 => :download, 8 => :seed, 16 => :stopped}
|
9
|
+
|
10
|
+
def self.unmap(value)
|
11
|
+
result = []
|
12
|
+
MAP.each do |mask, status|
|
13
|
+
result << status if mask & value != 0
|
14
|
+
end
|
15
|
+
|
16
|
+
result
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,13 @@
|
|
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 Time
|
8
|
+
def self.unmap(value)
|
9
|
+
value == 0 ? nil : ::Time.at(value)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,18 @@
|
|
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 Tracker < RTransmission::Field
|
8
|
+
define_attribute :id, 'id'
|
9
|
+
define_attribute :announce, 'announce'
|
10
|
+
define_attribute :scrape, 'scrape'
|
11
|
+
define_attribute :tier, 'tier'
|
12
|
+
|
13
|
+
def self.unmap(value)
|
14
|
+
RTransmission::Fields::Tracker.new(value)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,41 @@
|
|
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
|
+
# FIXME: add types where needed
|
6
|
+
module RTransmission
|
7
|
+
module Fields
|
8
|
+
class TrackerStat < RTransmission::Field
|
9
|
+
define_attribute :id, 'id'
|
10
|
+
define_attribute :announce, 'announce'
|
11
|
+
define_attribute :announce_state, 'announceState'
|
12
|
+
define_attribute :download_count, 'downloadCount'
|
13
|
+
define_attribute :has_announced, 'hasAnnounced'
|
14
|
+
define_attribute :has_scraped, 'hasScraped'
|
15
|
+
define_attribute :host, 'host'
|
16
|
+
define_attribute :is_backup, 'isBackup'
|
17
|
+
define_attribute :last_announce_peer_count, 'lastAnnouncePeerCount'
|
18
|
+
define_attribute :last_announce_result, 'lastAnnounceResult'
|
19
|
+
define_attribute :last_announce_start_time, 'lastAnnounceStartTime'
|
20
|
+
define_attribute :last_announce_succeeded, 'lastAnnounceSucceeded'
|
21
|
+
define_attribute :last_announce_time, 'lastAnnounceTime'
|
22
|
+
define_attribute :last_announce_timed_out, 'lastAnnounceTimedOut'
|
23
|
+
define_attribute :last_scrape_result, 'lastScrapeResult'
|
24
|
+
define_attribute :last_scrape_start_time, 'lastScrapeStartTime'
|
25
|
+
define_attribute :last_scrape_succeeded, 'lastScrapeSucceeded'
|
26
|
+
define_attribute :last_scrape_time, 'lastScrapeTime'
|
27
|
+
define_attribute :last_scrape_timed_out, 'lastScrapeTimedOut'
|
28
|
+
define_attribute :leecher_count, 'leecherCount'
|
29
|
+
define_attribute :next_announce_time, 'nextAnnounceTime'
|
30
|
+
define_attribute :next_scrape_time, 'nextScrapeTime'
|
31
|
+
define_attribute :scrape, 'scrape'
|
32
|
+
define_attribute :scrape_state, 'scrapeState'
|
33
|
+
define_attribute :seeder_count, 'seederCount'
|
34
|
+
define_attribute :tier, 'tier'
|
35
|
+
|
36
|
+
def self.unmap(value)
|
37
|
+
RTransmission::Fields::TrackerStat.new(value)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
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
|
+
require 'rtransmission/fields/error'
|
6
|
+
require 'rtransmission/fields/eta'
|
7
|
+
require 'rtransmission/fields/percent'
|
8
|
+
require 'rtransmission/fields/priority'
|
9
|
+
require 'rtransmission/fields/time'
|
10
|
+
require 'rtransmission/fields/file'
|
11
|
+
require 'rtransmission/fields/file_stat'
|
12
|
+
require 'rtransmission/fields/peer'
|
13
|
+
require 'rtransmission/fields/peers_from'
|
14
|
+
require 'rtransmission/fields/pieces'
|
15
|
+
require 'rtransmission/fields/seed_idle_mode'
|
16
|
+
require 'rtransmission/fields/seed_ratio_mode'
|
17
|
+
require 'rtransmission/fields/status'
|
18
|
+
require 'rtransmission/fields/tracker'
|
19
|
+
require 'rtransmission/fields/tracker_stat'
|
@@ -0,0 +1,25 @@
|
|
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
|
+
require 'json'
|
6
|
+
|
7
|
+
module RTransmission
|
8
|
+
class Request
|
9
|
+
attr_accessor :method
|
10
|
+
attr_accessor :arguments
|
11
|
+
attr_accessor :response_prefix
|
12
|
+
attr_accessor :response_block
|
13
|
+
|
14
|
+
def initialize(method, arguments, response_prefix, &response_block)
|
15
|
+
@method = method
|
16
|
+
@arguments = arguments
|
17
|
+
@response_prefix = response_prefix
|
18
|
+
@response_block = response_block
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_json
|
22
|
+
{'method' => @method, 'arguments' => @arguments}.to_json
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,26 @@
|
|
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
|
+
require 'json'
|
6
|
+
|
7
|
+
module RTransmission
|
8
|
+
class Response
|
9
|
+
attr_accessor :body
|
10
|
+
attr_accessor :prefix
|
11
|
+
attr_accessor :block
|
12
|
+
|
13
|
+
def initialize(body, prefix, block)
|
14
|
+
@body = body
|
15
|
+
@prefix = prefix
|
16
|
+
@block = block
|
17
|
+
end
|
18
|
+
|
19
|
+
def parse
|
20
|
+
body = JSON.parse(@body)
|
21
|
+
raise RTransmission::Exception.new((@prefix ? @prefix + ': ' : '') + body['result']) if body['result'] != 'success'
|
22
|
+
return @block.call(body['arguments']) if @block
|
23
|
+
body['arguments']
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,192 @@
|
|
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
|
+
require 'base64'
|
6
|
+
|
7
|
+
# FIXME: files-wanted/unwanted & prioriry-high/low/normal for both add and new torrents
|
8
|
+
# FIXME: add/remove/replace trackers
|
9
|
+
module RTransmission
|
10
|
+
class Torrent
|
11
|
+
attr_reader :id
|
12
|
+
|
13
|
+
def self.add(client, args = {})
|
14
|
+
pargs = {}
|
15
|
+
|
16
|
+
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
|
17
|
+
pargs['filename'] = args[:remote_file] if args[:remote_file]
|
18
|
+
pargs['filename'] = args[:url] if args[:url]
|
19
|
+
pargs['metainfo'] = Base64::encode(args[:torrent]) if args[:torrent]
|
20
|
+
|
21
|
+
pargs['cookies'] = args[:cookies] if args[:cookies]
|
22
|
+
pargs['download-dir'] = args[:download_dir] if args[:download_dir]
|
23
|
+
pargs['paused'] = args[:paused] if args[:paused]
|
24
|
+
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
|
+
|
27
|
+
request = RTransmission::Request.new('torrent-add', pargs, 'Torrent#add') do |arguments|
|
28
|
+
RTransmission::Torrent.new(client, arguments['torrent-added']['id'])
|
29
|
+
end
|
30
|
+
|
31
|
+
client.call(request)
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.list(client)
|
35
|
+
request = RTransmission::Request.new('torrent-get', {'fields' => ['id']}, 'Torrent#list') do |arguments|
|
36
|
+
torrents = []
|
37
|
+
arguments['torrents'].each do |torrent|
|
38
|
+
torrents << RTransmission::Torrent.new(client, torrent['id'])
|
39
|
+
end
|
40
|
+
|
41
|
+
torrents
|
42
|
+
end
|
43
|
+
|
44
|
+
client.call(request)
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.define_field(name, rpc_name, args = {})
|
48
|
+
self.send :define_method, name.to_s do
|
49
|
+
request = RTransmission::Request.new('torrent-get', {'ids' => @id, 'fields' => [rpc_name]}, 'Torrent.' + name.to_s) do |arguments|
|
50
|
+
result = arguments['torrents'][0][rpc_name]
|
51
|
+
if args[:type]
|
52
|
+
type = args[:type]
|
53
|
+
if type.class == Array
|
54
|
+
type = type[0]
|
55
|
+
result.map! { |r| type.unmap(r) }
|
56
|
+
else
|
57
|
+
result = type.unmap(result)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
result
|
62
|
+
end
|
63
|
+
|
64
|
+
@client.call(request)
|
65
|
+
end
|
66
|
+
|
67
|
+
if args[:writeable] == true
|
68
|
+
self.send :define_method, name.to_s.gsub('?', '') + '=' do |value|
|
69
|
+
rpc_value = value
|
70
|
+
if args[:type]
|
71
|
+
type = args[:type]
|
72
|
+
if type.class == Array
|
73
|
+
type = type[0]
|
74
|
+
rpc_value.map! { |r| type.map(r) }
|
75
|
+
else
|
76
|
+
rpc_value = type.map(rpc_value)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
request = RTransmission::Request.new('torrent-set', {'ids' => @id, rpc_name => rpc_value}, 'Torrent.' + name.to_s + '=') do
|
81
|
+
value
|
82
|
+
end
|
83
|
+
|
84
|
+
@client.call(request)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
define_field :activity_date, 'activityDate', :type => RTransmission::Fields::Time
|
90
|
+
define_field :added_date, 'addedDate', :type => RTransmission::Fields::Time
|
91
|
+
define_field :bandwidth_priority, 'bandwidthPriority', :type => RTransmission::Fields::Priority, :writeable => true
|
92
|
+
define_field :comment, 'comment'
|
93
|
+
define_field :corrupt_ever, 'corruptEver'
|
94
|
+
define_field :creator, 'creator'
|
95
|
+
define_field :date_created, 'dateCreated', :type => RTransmission::Fields::Time
|
96
|
+
define_field :desired_available, 'desiredAvailable'
|
97
|
+
define_field :done_date, 'doneDate', :type => RTransmission::Fields::Time
|
98
|
+
define_field :download_dir, 'downloadDir'
|
99
|
+
define_field :downloaded_ever, 'downloadedEver'
|
100
|
+
define_field :download_limit, 'downloadLimit', :writeable => true
|
101
|
+
define_field :download_limited?, 'downloadLimited', :writeable => true
|
102
|
+
define_field :error, 'error', :type => RTransmission::Fields::Error
|
103
|
+
define_field :error_string, 'errorString'
|
104
|
+
define_field :eta, 'eta', :type => RTransmission::Fields::ETA
|
105
|
+
define_field :files, 'files', :type => [RTransmission::Fields::File]
|
106
|
+
define_field :file_stats, 'fileStats', :type => [RTransmission::Fields::FileStat]
|
107
|
+
define_field :hash_string, 'hashString'
|
108
|
+
define_field :have_unchecked, 'haveUnchecked'
|
109
|
+
define_field :have_valid, 'haveValid'
|
110
|
+
define_field :honors_session_limits?, 'honorsSessionLimits', :writeable => true
|
111
|
+
define_field :finished?, 'isFinished'
|
112
|
+
define_field :private?, 'isPrivate'
|
113
|
+
define_field :left_until_done, 'leftUntilDone'
|
114
|
+
define_field :magnet_link, 'magnetLink'
|
115
|
+
define_field :manual_announce_time, 'manualAnnounceTime' # FIXME: add type
|
116
|
+
define_field :max_connected_peers, 'maxConnectedPeers'
|
117
|
+
define_field :metadata_percent_complete, 'metadataPercentComplete'
|
118
|
+
define_field :name, 'name'
|
119
|
+
define_field :peer_limit, 'peer-limit', :writeable => true
|
120
|
+
define_field :peers, 'peers', :type => [RTransmission::Fields::Peer]
|
121
|
+
define_field :peers_connected, 'peersConnected'
|
122
|
+
define_field :peers_from, 'peersFrom', :type => RTransmission::Fields::PeersFrom
|
123
|
+
define_field :peers_getting_from_us, 'peersGettingFromUs'
|
124
|
+
define_field :peers_sending_to_us, 'peersSendingToUs'
|
125
|
+
define_field :percent_done, 'percentDone', :type => RTransmission::Fields::Percent
|
126
|
+
define_field :pieces, 'pieces', :type => RTransmission::Fields::Pieces
|
127
|
+
define_field :piece_count, 'pieceCount'
|
128
|
+
define_field :piece_size, 'pieceSize'
|
129
|
+
define_field :priorities, 'priorities', :type => [RTransmission::Fields::Priority]
|
130
|
+
define_field :rate_download, 'rateDownload'
|
131
|
+
define_field :rate_upload, 'rateUpload'
|
132
|
+
define_field :recheck_progress, 'recheckProgress', :type => RTransmission::Fields::Percent
|
133
|
+
define_field :seconds_downloading, 'secondsDownloading'
|
134
|
+
define_field :seconds_seeding, 'secondsSeeding'
|
135
|
+
define_field :seed_idle_limit, 'seedIdleLimit', :writeable => true
|
136
|
+
define_field :seed_idle_mode, 'seedIdleMode', :type => RTransmission::Fields::SeedIdleMode, :writeable => true
|
137
|
+
define_field :seed_ratio_limit, 'seedRatioLimit', :type => RTransmission::Fields::Percent, :writeable => true
|
138
|
+
define_field :seed_ratio_mode, 'seedRatioMode', :type => RTransmission::Fields::SeedRatioMode, :writeable => true
|
139
|
+
define_field :size_when_done, 'sizeWhenDone'
|
140
|
+
define_field :start_date, 'startDate', :type => RTransmission::Fields::Time
|
141
|
+
define_field :status, 'status', :type => RTransmission::Fields::Status
|
142
|
+
define_field :trackers, 'trackers', :type => [RTransmission::Fields::Tracker]
|
143
|
+
define_field :tracker_stats, 'trackerStats', :type => [RTransmission::Fields::TrackerStat]
|
144
|
+
define_field :total_size, 'totalSize'
|
145
|
+
define_field :torrent_file, 'torrentFile'
|
146
|
+
define_field :uploaded_ever, 'uploadedEver'
|
147
|
+
define_field :upload_limit, 'uploadLimit', :writeable => true
|
148
|
+
define_field :upload_limited?, 'uploadLimited', :writeable => true
|
149
|
+
define_field :upload_ratio, 'uploadRatio', :type => RTransmission::Fields::Percent
|
150
|
+
define_field :wanted, 'wanted'
|
151
|
+
define_field :webseeds, 'webseeds' # FIXME: add type
|
152
|
+
define_field :webseeds_sending_to_us, 'webseedsSendingToUs'
|
153
|
+
|
154
|
+
def initialize(client, id)
|
155
|
+
@client = client
|
156
|
+
@id = id
|
157
|
+
end
|
158
|
+
|
159
|
+
def start
|
160
|
+
@client.call(RTransmission::Request.new('torrent-start', {'ids' => @id}, 'Torrent.start'))
|
161
|
+
end
|
162
|
+
|
163
|
+
def stop
|
164
|
+
@client.call(RTransmission::Request.new('torrent-stop', {'ids' => @id}, 'Torrent.stop'))
|
165
|
+
end
|
166
|
+
|
167
|
+
def verify
|
168
|
+
@client.call(RTransmission::Request.new('torrent-verify', {'ids' => @id}, 'Torrent.verify'))
|
169
|
+
end
|
170
|
+
|
171
|
+
def reannounce
|
172
|
+
@client.call(RTransmission::Request.new('torrent-reannounce', {'ids' => @id}, 'Torrent.reannounce'))
|
173
|
+
end
|
174
|
+
|
175
|
+
def remove(args = {})
|
176
|
+
pargs = {}
|
177
|
+
|
178
|
+
pargs['delete-local-data'] = args[:delete_local_data] if args[:delete_local_data]
|
179
|
+
|
180
|
+
@client.call(RTransmission::Request.new('torrent-remove', {'ids' => @id}.merge(pargs), 'Torrent.remove'))
|
181
|
+
end
|
182
|
+
|
183
|
+
def move(args = {})
|
184
|
+
pargs = {}
|
185
|
+
|
186
|
+
pargs['location'] = args[:location] if args[:location]
|
187
|
+
pargs['move'] = args[:move] if args[:move]
|
188
|
+
|
189
|
+
@client.call(RTransmission::Request.new('torrent-set-location', {'ids' => @id}.merge(pargs), 'Torrent.move'))
|
190
|
+
end
|
191
|
+
end
|
192
|
+
end
|
@@ -0,0 +1,13 @@
|
|
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 VERSION
|
7
|
+
MAJOR = 0
|
8
|
+
MINOR = 1
|
9
|
+
|
10
|
+
STRING = [MAJOR, MINOR].join('.')
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
@@ -0,0 +1,12 @@
|
|
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
|
+
require 'rtransmission/version'
|
6
|
+
require 'rtransmission/exception'
|
7
|
+
require 'rtransmission/client'
|
8
|
+
require 'rtransmission/request'
|
9
|
+
require 'rtransmission/response'
|
10
|
+
require 'rtransmission/field'
|
11
|
+
require 'rtransmission/fields'
|
12
|
+
require 'rtransmission/torrent'
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require File.expand_path("../lib/rtransmission/version", __FILE__)
|
2
|
+
|
3
|
+
Gem::Specification.new do |s|
|
4
|
+
s.name = "rtransmission"
|
5
|
+
s.version = RTransmission::VERSION::STRING
|
6
|
+
s.author = "Andrew Kirilenko"
|
7
|
+
s.email = "andrew.kirilenko@gmail.com"
|
8
|
+
s.homepage = "http://github.com/iced/rtransmission"
|
9
|
+
s.platform = Gem::Platform::RUBY
|
10
|
+
s.summary = "Ruby Transmission Bindings"
|
11
|
+
s.description = "RTransmission allows you to interract with Transmission daemon"
|
12
|
+
s.files = ["COPYING", "README.md", "rtransmission.gemspec"] + Dir.glob('lib/**/*')
|
13
|
+
s.require_path = "lib"
|
14
|
+
s.has_rdoc = false
|
15
|
+
end
|
metadata
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rtransmission
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
prerelease:
|
5
|
+
version: "0.1"
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Andrew Kirilenko
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
|
13
|
+
date: 2011-06-03 00:00:00 +03:00
|
14
|
+
default_executable:
|
15
|
+
dependencies: []
|
16
|
+
|
17
|
+
description: RTransmission allows you to interract with Transmission daemon
|
18
|
+
email: andrew.kirilenko@gmail.com
|
19
|
+
executables: []
|
20
|
+
|
21
|
+
extensions: []
|
22
|
+
|
23
|
+
extra_rdoc_files: []
|
24
|
+
|
25
|
+
files:
|
26
|
+
- COPYING
|
27
|
+
- README.md
|
28
|
+
- rtransmission.gemspec
|
29
|
+
- lib/rtransmission/fields.rb
|
30
|
+
- lib/rtransmission/client.rb
|
31
|
+
- lib/rtransmission/version.rb
|
32
|
+
- lib/rtransmission/torrent.rb
|
33
|
+
- lib/rtransmission/response.rb
|
34
|
+
- lib/rtransmission/exception.rb
|
35
|
+
- lib/rtransmission/request.rb
|
36
|
+
- lib/rtransmission/fields/eta.rb
|
37
|
+
- lib/rtransmission/fields/time.rb
|
38
|
+
- lib/rtransmission/fields/tracker_stat.rb
|
39
|
+
- lib/rtransmission/fields/error.rb
|
40
|
+
- lib/rtransmission/fields/tracker.rb
|
41
|
+
- lib/rtransmission/fields/peers_from.rb
|
42
|
+
- lib/rtransmission/fields/file_stat.rb
|
43
|
+
- lib/rtransmission/fields/percent.rb
|
44
|
+
- lib/rtransmission/fields/pieces.rb
|
45
|
+
- lib/rtransmission/fields/file.rb
|
46
|
+
- lib/rtransmission/fields/status.rb
|
47
|
+
- lib/rtransmission/fields/seed_ratio_mode.rb
|
48
|
+
- lib/rtransmission/fields/peer.rb
|
49
|
+
- lib/rtransmission/fields/priority.rb
|
50
|
+
- lib/rtransmission/fields/seed_idle_mode.rb
|
51
|
+
- lib/rtransmission/field.rb
|
52
|
+
- lib/rtransmission.rb
|
53
|
+
has_rdoc: true
|
54
|
+
homepage: http://github.com/iced/rtransmission
|
55
|
+
licenses: []
|
56
|
+
|
57
|
+
post_install_message:
|
58
|
+
rdoc_options: []
|
59
|
+
|
60
|
+
require_paths:
|
61
|
+
- lib
|
62
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
63
|
+
none: false
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: "0"
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
70
|
+
requirements:
|
71
|
+
- - ">="
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: "0"
|
74
|
+
requirements: []
|
75
|
+
|
76
|
+
rubyforge_project:
|
77
|
+
rubygems_version: 1.6.2
|
78
|
+
signing_key:
|
79
|
+
specification_version: 3
|
80
|
+
summary: Ruby Transmission Bindings
|
81
|
+
test_files: []
|
82
|
+
|