remotransmission 0.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/bin/remotransmission +104 -0
- data/lib/remotransmission/client.rb +110 -0
- data/lib/remotransmission/version.rb +8 -0
- data/lib/remotransmission.rb +11 -0
- metadata +75 -0
@@ -0,0 +1,104 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# RemoTransmission command line interface to control
|
3
|
+
# a remote transmission client.
|
4
|
+
#
|
5
|
+
# Examples:
|
6
|
+
# $ remotransmission -p PaSsWord --add 'magnet://...'
|
7
|
+
# success
|
8
|
+
# $ remotransmission -p PaSsWord --server 214.512.12.20 --port 9092 --list
|
9
|
+
# 100% - ubuntu-10.10-desktop-i386.iso
|
10
|
+
# 100% - ubuntu-10.10-server-i386.iso
|
11
|
+
|
12
|
+
|
13
|
+
require 'remotransmission'
|
14
|
+
|
15
|
+
Choice.options do
|
16
|
+
header ""
|
17
|
+
header 'Commands:'
|
18
|
+
option :add do
|
19
|
+
short '-a'
|
20
|
+
long '--add=URL'
|
21
|
+
desc 'Add a torrent by its URL'
|
22
|
+
end
|
23
|
+
|
24
|
+
option :list do
|
25
|
+
short '-l'
|
26
|
+
long '--list'
|
27
|
+
desc "List current torrents"
|
28
|
+
end
|
29
|
+
|
30
|
+
option :help do
|
31
|
+
#short '-h'
|
32
|
+
long '--help'
|
33
|
+
desc 'Show this message'
|
34
|
+
end
|
35
|
+
|
36
|
+
option :version do
|
37
|
+
long '--version'
|
38
|
+
desc 'Show version'
|
39
|
+
action do
|
40
|
+
puts "RemoTransmission #{RemoTransmission::Version::STRING}"
|
41
|
+
exit
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
separator ""
|
46
|
+
separator 'Common options:'
|
47
|
+
option :host do
|
48
|
+
short '-s'
|
49
|
+
long '--server=IP'
|
50
|
+
desc 'The hostname or ip of the host to bind to (default 192.168.0.254)'
|
51
|
+
default '192.168.0.254'
|
52
|
+
end
|
53
|
+
|
54
|
+
option :port do
|
55
|
+
long '--port=PORT'
|
56
|
+
desc 'The port to bind to (default 9091)'
|
57
|
+
cast Integer
|
58
|
+
default 9091
|
59
|
+
end
|
60
|
+
|
61
|
+
option :user do
|
62
|
+
short '-u'
|
63
|
+
long '--user=USER'
|
64
|
+
desc 'User to authenticate (default freebox)'
|
65
|
+
default 'freebox'
|
66
|
+
end
|
67
|
+
|
68
|
+
option :password do
|
69
|
+
short '-p'
|
70
|
+
long '--password=PASSWORD'
|
71
|
+
desc 'Password to authenticate'
|
72
|
+
end
|
73
|
+
|
74
|
+
option :debug do
|
75
|
+
short '-d'
|
76
|
+
long '--debug'
|
77
|
+
desc 'Enable debug mode'
|
78
|
+
end
|
79
|
+
|
80
|
+
separator ""
|
81
|
+
separator "Examples:"
|
82
|
+
separator " $ #{File.basename($0)} -p PaSsWord --add 'magnet://...'"
|
83
|
+
separator " success"
|
84
|
+
separator " $ #{File.basename($0)} -p PaSsWord --server 214.512.12.20 --port 9092 --list"
|
85
|
+
separator " 100% - ubuntu-10.10-desktop-i386.iso"
|
86
|
+
separator " 100% - ubuntu-10.10-server-i386.iso"
|
87
|
+
end
|
88
|
+
|
89
|
+
|
90
|
+
client = RemoTransmission::Client.new(
|
91
|
+
Choice[:host],
|
92
|
+
Choice[:port],
|
93
|
+
Choice[:user],
|
94
|
+
Choice[:password],
|
95
|
+
Choice[:debug]
|
96
|
+
)
|
97
|
+
|
98
|
+
if Choice[:add]
|
99
|
+
client.add(Choice[:add])
|
100
|
+
elsif Choice[:list]
|
101
|
+
client.list
|
102
|
+
else
|
103
|
+
Choice.help
|
104
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
# The main Remote Transmission driver
|
2
|
+
class RemoTransmission::Client
|
3
|
+
# Initialize a remote transmission
|
4
|
+
#
|
5
|
+
# Arguments:
|
6
|
+
# host: host to connect to (String)
|
7
|
+
# port: port to connect to (Integer)
|
8
|
+
# user: username to authenticate to (String)
|
9
|
+
# password: password to authenticate to (String)
|
10
|
+
# debug: flag to turn on debugging (Integer)
|
11
|
+
def initialize(host = "localhost", port = 9091, user = "", password = "", debug = false)
|
12
|
+
@host = host
|
13
|
+
@port = port
|
14
|
+
@user = user
|
15
|
+
@password = password
|
16
|
+
@debug = debug
|
17
|
+
end
|
18
|
+
|
19
|
+
# Add a torrent to the transmission client
|
20
|
+
# and prints output.
|
21
|
+
#
|
22
|
+
# Arguments:
|
23
|
+
# url: magnet URL or URL of torrent file
|
24
|
+
#
|
25
|
+
# Example:
|
26
|
+
# >> transmission.add("magnet://..."")
|
27
|
+
# success
|
28
|
+
def add(url)
|
29
|
+
add = rpc(
|
30
|
+
method: "torrent-add",
|
31
|
+
tag: 8,
|
32
|
+
arguments: {
|
33
|
+
filename: url,
|
34
|
+
}
|
35
|
+
)
|
36
|
+
result = add["result"]
|
37
|
+
puts result
|
38
|
+
end
|
39
|
+
|
40
|
+
# Prints all active torrents
|
41
|
+
#
|
42
|
+
# Example:
|
43
|
+
# >> transmission.list
|
44
|
+
# 100% - ubuntu-10.10-desktop-i386.iso
|
45
|
+
# 100% - ubuntu-10.10-server-i386.iso
|
46
|
+
def list
|
47
|
+
list = rpc(
|
48
|
+
method: "torrent-get",
|
49
|
+
tag: 4,
|
50
|
+
arguments: {
|
51
|
+
#fields: ["error","errorString","eta","id","isFinished","leftUntilDone","name","peersGettingFromUs","peersSendingToUs","rateDownload","rateUpload","sizeWhenDone","status","uploadRatio"],
|
52
|
+
fields: ["isFinished","leftUntilDone","sizeWhenDone", "name"],
|
53
|
+
}
|
54
|
+
)
|
55
|
+
|
56
|
+
args = list["arguments"]
|
57
|
+
torrents = args["torrents"]
|
58
|
+
torrents.each do |torrent|
|
59
|
+
left = torrent["leftUntilDone"].to_f
|
60
|
+
size = torrent["sizeWhenDone"].to_f
|
61
|
+
pourcent = size != 0 ? ((size-left)*100/size).floor : "?"
|
62
|
+
puts "#{pourcent}% - #{torrent["name"]}"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def command(*cmd)
|
69
|
+
debug *cmd
|
70
|
+
exit_status = nil
|
71
|
+
err = nil
|
72
|
+
out = nil
|
73
|
+
|
74
|
+
Open3.popen3(*cmd) do |stdin, stdout, stderr, wait_thread|
|
75
|
+
err = stderr.gets(nil)
|
76
|
+
out = stdout.gets(nil)
|
77
|
+
[stdin, stdout, stderr].each { |stream|
|
78
|
+
stream.send('close')
|
79
|
+
}
|
80
|
+
exit_status = wait_thread.value
|
81
|
+
end
|
82
|
+
|
83
|
+
if exit_status.to_i > 0
|
84
|
+
err = err.chomp if err
|
85
|
+
raise ShellError, err
|
86
|
+
elsif out
|
87
|
+
out.chomp
|
88
|
+
else
|
89
|
+
true
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def rpc(options = {})
|
94
|
+
default_options = { arguments: { fields: ["error","errorString","eta","id","isFinished","leftUntilDone","name","peersGettingFromUs","peersSendingToUs","rateDownload","rateUpload","sizeWhenDone","status","uploadRatio"] }, tag: 4 }
|
95
|
+
options = default_options.merge(options).to_json
|
96
|
+
|
97
|
+
curl = command("curl -fsS -u #{@user}:#{@password} -d '#{options}' http://#{@host}:#{@port}/transmission/rpc")
|
98
|
+
json = JSON.parse(curl)
|
99
|
+
debug(json)
|
100
|
+
json
|
101
|
+
rescue ShellError => e
|
102
|
+
puts e.message
|
103
|
+
exit 1
|
104
|
+
end
|
105
|
+
|
106
|
+
def debug(*obj)
|
107
|
+
puts *obj if @debug
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
metadata
ADDED
@@ -0,0 +1,75 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: remotransmission
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Sunny Ripert
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-08-24 00:00:00.000000000 +02:00
|
13
|
+
default_executable:
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: choice
|
17
|
+
requirement: &77320450 !ruby/object:Gem::Requirement
|
18
|
+
none: false
|
19
|
+
requirements:
|
20
|
+
- - ~>
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: '0.1'
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: *77320450
|
26
|
+
- !ruby/object:Gem::Dependency
|
27
|
+
name: json
|
28
|
+
requirement: &77320180 !ruby/object:Gem::Requirement
|
29
|
+
none: false
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '1.7'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: *77320180
|
37
|
+
description: A gem that can talk to remote Transmission demons
|
38
|
+
email: sunny@sunfox.org
|
39
|
+
executables:
|
40
|
+
- remotransmission
|
41
|
+
extensions: []
|
42
|
+
extra_rdoc_files: []
|
43
|
+
files:
|
44
|
+
- lib/remotransmission.rb
|
45
|
+
- lib/remotransmission/client.rb
|
46
|
+
- lib/remotransmission/version.rb
|
47
|
+
- bin/remotransmission
|
48
|
+
has_rdoc: true
|
49
|
+
homepage: http://github.com/sunny/remotransmission
|
50
|
+
licenses:
|
51
|
+
- MIT
|
52
|
+
post_install_message:
|
53
|
+
rdoc_options: []
|
54
|
+
require_paths:
|
55
|
+
- lib
|
56
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
63
|
+
none: false
|
64
|
+
requirements:
|
65
|
+
- - ! '>='
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: '0'
|
68
|
+
requirements:
|
69
|
+
- Curl command line
|
70
|
+
rubyforge_project:
|
71
|
+
rubygems_version: 1.6.2
|
72
|
+
signing_key:
|
73
|
+
specification_version: 3
|
74
|
+
summary: Remote Transmission
|
75
|
+
test_files: []
|