remotransmission 0.0.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/bin/remotransmission CHANGED
@@ -1,17 +1,12 @@
1
1
  #!/usr/bin/env ruby
2
2
  # RemoTransmission command line interface to control
3
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
4
 
5
+ require 'choice'
13
6
  require 'remotransmission'
14
7
 
8
+ defaults = RemoTransmission::default_options("~/.config/remotransmission/settings.json")
9
+
15
10
  Choice.options do
16
11
  header ""
17
12
  header 'Commands:'
@@ -28,7 +23,6 @@ Choice.options do
28
23
  end
29
24
 
30
25
  option :help do
31
- #short '-h'
32
26
  long '--help'
33
27
  desc 'Show this message'
34
28
  end
@@ -45,55 +39,58 @@ Choice.options do
45
39
  separator ""
46
40
  separator 'Common options:'
47
41
  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'
42
+ long '--host=IP'
43
+ desc "The hostname or ip of the server to connect to (default #{defaults[:host].inspect})"
44
+ default defaults[:host]
52
45
  end
53
46
 
54
47
  option :port do
55
48
  long '--port=PORT'
56
- desc 'The port to bind to (default 9091)'
49
+ desc "The port to bind to (default #{defaults[:port].inspect})"
57
50
  cast Integer
58
- default 9091
51
+ default defaults[:port]
59
52
  end
60
53
 
61
54
  option :user do
62
55
  short '-u'
63
56
  long '--user=USER'
64
- desc 'User to authenticate (default freebox)'
57
+ desc "User to authenticate (default #{defaults[:user].inspect})"
65
58
  default 'freebox'
59
+ default defaults[:user]
66
60
  end
67
61
 
68
62
  option :password do
69
63
  short '-p'
70
64
  long '--password=PASSWORD'
71
- desc 'Password to authenticate'
65
+ desc "Password to authenticate"
66
+ default defaults[:password]
72
67
  end
73
68
 
74
69
  option :debug do
75
70
  short '-d'
76
71
  long '--debug'
77
- desc 'Enable debug mode'
72
+ desc "Enable debug mode (default #{defaults[:debug].inspect})"
73
+ default defaults[:debug]
78
74
  end
79
75
 
80
76
  separator ""
81
77
  separator "Examples:"
82
- separator " $ #{File.basename($0)} -p PaSsWord --add 'magnet://...'"
78
+ separator " $ #{File.basename($0)} --add 'magnet://...'"
83
79
  separator " success"
84
- separator " $ #{File.basename($0)} -p PaSsWord --server 214.512.12.20 --port 9092 --list"
80
+ separator " $ #{File.basename($0)} -p PaSsWord --host 192.168.0.254 --list"
85
81
  separator " 100% - ubuntu-10.10-desktop-i386.iso"
86
82
  separator " 100% - ubuntu-10.10-server-i386.iso"
87
83
  end
88
84
 
85
+ options = {
86
+ host: Choice[:host],
87
+ port: Choice[:port],
88
+ user: Choice[:user],
89
+ password: Choice[:password],
90
+ debug: Choice[:debug]
91
+ }
89
92
 
90
- client = RemoTransmission::Client.new(
91
- Choice[:host],
92
- Choice[:port],
93
- Choice[:user],
94
- Choice[:password],
95
- Choice[:debug]
96
- )
93
+ client = RemoTransmission::Client.new(options)
97
94
 
98
95
  if Choice[:add]
99
96
  client.add(Choice[:add])
@@ -1,21 +1,5 @@
1
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
-
2
+ class RemoTransmission::Client < RemoTransmission::Remote
19
3
  # Add a torrent to the transmission client
20
4
  # and prints output.
21
5
  #
@@ -26,15 +10,8 @@ class RemoTransmission::Client
26
10
  # >> transmission.add("magnet://..."")
27
11
  # success
28
12
  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
13
+ add = super
14
+ puts add["result"]
38
15
  end
39
16
 
40
17
  # Prints all active torrents
@@ -44,15 +21,7 @@ class RemoTransmission::Client
44
21
  # 100% - ubuntu-10.10-desktop-i386.iso
45
22
  # 100% - ubuntu-10.10-server-i386.iso
46
23
  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
-
24
+ list = super
56
25
  args = list["arguments"]
57
26
  torrents = args["torrents"]
58
27
  torrents.each do |torrent|
@@ -62,49 +31,5 @@ class RemoTransmission::Client
62
31
  puts "#{pourcent}% - #{torrent["name"]}"
63
32
  end
64
33
  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 RemoTransmission::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 RemoTransmission::ShellError => e
102
- puts e.message
103
- exit 1
104
- end
105
-
106
- def debug(*obj)
107
- puts *obj if @debug
108
- end
109
34
  end
110
35
 
@@ -0,0 +1,73 @@
1
+ # Driver for all API calls
2
+ class RemoTransmission::Remote
3
+ # Initialize a remote transmission
4
+ #
5
+ # Arguments:
6
+ # options: hash
7
+ #
8
+ # Options:
9
+ # :host: host to connect to (String)
10
+ # :port: port to connect to (Integer)
11
+ # :user: username to authenticate to (String)
12
+ # :password: password to authenticate to (String)
13
+ # :debug: flag to turn on debugging (Integer)
14
+ def initialize(options = {})
15
+ defaults = RemoTransmission::DEFAULT_OPTIONS
16
+ options = defaults.merge(options)
17
+ @host = options[:host]
18
+ @port = options[:port]
19
+ @user = options[:user]
20
+ @password = options[:password]
21
+ @debug = options[:debug]
22
+ end
23
+
24
+ # Add a torrent to the transmission client
25
+ # and returns output.
26
+ #
27
+ # Arguments:
28
+ # url: magnet URL or URL of torrent file
29
+ #
30
+ # Example:
31
+ # >> transmission.add("magnet://..."")
32
+ # { "result" => "success" }
33
+ def add(url)
34
+ rpc(
35
+ method: "torrent-add",
36
+ tag: 8,
37
+ arguments: { filename: url }
38
+ )
39
+ end
40
+
41
+ # Prints all active torrents
42
+ #
43
+ # Example:
44
+ # >> transmission.list
45
+ # { "arguments" => { "torrents" => { "leftUntilDone" => ... } }
46
+ def list
47
+ 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
+ end
56
+
57
+ private
58
+
59
+ def rpc(options = {})
60
+ uri = URI("http://#{@host}:#{@port}/transmission/rpc")
61
+ response = Net::HTTP.start(uri.host, uri.port) do |http|
62
+ request = Net::HTTP::Post.new(uri.path)
63
+ request.body = options.to_json
64
+ request.basic_auth(@user, @password)
65
+ http.request(request)
66
+ end
67
+
68
+ json = JSON.parse(response.body)
69
+ $stderr.puts json if @debug
70
+ json
71
+ end
72
+ end
73
+
@@ -1,8 +1,8 @@
1
1
  module RemoTransmission
2
2
  module Version #:nodoc:
3
- MAJOR = 0
3
+ MAJOR = 1
4
4
  MINOR = 0
5
- TINY = 2
5
+ TINY = 0
6
6
  STRING = [MAJOR, MINOR, TINY] * '.'
7
7
  end
8
8
  end
@@ -1,11 +1,42 @@
1
- require 'choice'
2
1
  require 'json'
3
- require 'open3'
2
+ require 'net/http'
4
3
 
5
4
  module RemoTransmission
5
+ DEFAULT_OPTIONS = {
6
+ host: "localhost",
7
+ port: 9091,
8
+ user: "freebox",
9
+ password: "",
10
+ debug: false
11
+ }.freeze
12
+
13
+ # Returns the default options hash, optionnaly pulled from the given
14
+ # configuration file.
15
+ #
16
+ # Arguments:
17
+ # file: path to JSON configuration file
18
+ def self.default_options(file = nil)
19
+ defaults = DEFAULT_OPTIONS
20
+
21
+ if file and file = File.expand_path(file) and File.exists?(file)
22
+ config = JSON.parse(File.read(file))
23
+
24
+ # symbolize keys
25
+ config = config.inject({}) do |options, (key, value)|
26
+ options[key.to_sym] = value
27
+ options
28
+ end
29
+
30
+ defaults = defaults.merge(config)
31
+ end
32
+
33
+ defaults
34
+ end
35
+
6
36
  # :nodoc:
7
37
  class ShellError < StandardError; end
8
38
  end
9
39
 
10
- require 'remotransmission/client'
11
40
  require 'remotransmission/version'
41
+ require 'remotransmission/remote'
42
+ require 'remotransmission/client'
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: remotransmission
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 1.0.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,12 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-24 00:00:00.000000000 Z
12
+ date: 2012-08-24 00:00:00.000000000 +02:00
13
+ default_executable:
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
16
  name: choice
16
- requirement: !ruby/object:Gem::Requirement
17
+ requirement: &82533290 !ruby/object:Gem::Requirement
17
18
  none: false
18
19
  requirements:
19
20
  - - ~>
@@ -21,15 +22,10 @@ dependencies:
21
22
  version: '0.1'
22
23
  type: :runtime
23
24
  prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
- requirements:
27
- - - ~>
28
- - !ruby/object:Gem::Version
29
- version: '0.1'
25
+ version_requirements: *82533290
30
26
  - !ruby/object:Gem::Dependency
31
27
  name: json
32
- requirement: !ruby/object:Gem::Requirement
28
+ requirement: &82533040 !ruby/object:Gem::Requirement
33
29
  none: false
34
30
  requirements:
35
31
  - - ~>
@@ -37,12 +33,7 @@ dependencies:
37
33
  version: '1.7'
38
34
  type: :runtime
39
35
  prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ~>
44
- - !ruby/object:Gem::Version
45
- version: '1.7'
36
+ version_requirements: *82533040
46
37
  description: A gem that can talk to remote Transmission demons
47
38
  email: sunny@sunfox.org
48
39
  executables:
@@ -52,8 +43,10 @@ extra_rdoc_files: []
52
43
  files:
53
44
  - lib/remotransmission.rb
54
45
  - lib/remotransmission/client.rb
46
+ - lib/remotransmission/remote.rb
55
47
  - lib/remotransmission/version.rb
56
48
  - bin/remotransmission
49
+ has_rdoc: true
57
50
  homepage: http://github.com/sunny/remotransmission
58
51
  licenses:
59
52
  - MIT
@@ -73,10 +66,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
73
66
  - - ! '>='
74
67
  - !ruby/object:Gem::Version
75
68
  version: '0'
76
- requirements:
77
- - Curl command line
69
+ requirements: []
78
70
  rubyforge_project:
79
- rubygems_version: 1.8.23
71
+ rubygems_version: 1.6.2
80
72
  signing_key:
81
73
  specification_version: 3
82
74
  summary: Remote Transmission