nzbget 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ Manifest
2
+ README.rdoc
3
+ Rakefile
4
+ lib/group.rb
5
+ lib/httparty/request.rb
6
+ lib/nzbget.rb
7
+ nzbget.gemspec
@@ -0,0 +1,50 @@
1
+ == Introduction
2
+
3
+ This Ruby gem provides a simple means of using NZBGet's RPC interface from within Ruby. It is very lightweight and has minimal dependencies.
4
+
5
+ NZBGet homepage: http://nzbget.sourceforge.net
6
+ NZBGet is a command-line based binary newsgrabber for nzb files, written in C++. It supports client/server mode, automatic par-check/-repair and web-interface (via additional package). NZBGet requires low system resources and runs great on routers and NAS-devices.
7
+
8
+ NZBGet RPC: http://nzbget.sourceforge.net/rpc.html
9
+ From the version 0.4.0 NZBGet has supported XML-RPC and JSON-RPC. It allows to control the server from other applications. Many programming languages have libraries, which make the usage of XML-RPC and JSON-RPC very simple. The implementations of both protocols in NZBGet are equal: all methods are identical. You may choose the protocol, which is better supported by your programming language.
10
+
11
+ == Installation
12
+
13
+ To install directly from GitHub:
14
+
15
+ $ gem sources -a http://gems.github.com # you only need to run this once
16
+ $ gem install marcbowes-nzbget
17
+
18
+ == Getting started
19
+
20
+ require 'rubygems'
21
+ require 'nzbget'
22
+
23
+ remote = Nzbget.new :uri => 'http://nzbget-server'
24
+ puts remote.status
25
+
26
+ == License
27
+
28
+ Copyright (c) 2009 Marc Bowes
29
+
30
+ Permission is hereby granted, free of charge, to any person
31
+ obtaining a copy of this software and associated documentation
32
+ files (the "Software"), to deal in the Software without
33
+ restriction, including without limitation the rights to use,
34
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
35
+ copies of the Software, and to permit persons to whom the
36
+ Software is furnished to do so, subject to the following
37
+ conditions:
38
+
39
+ The above copyright notice and this permission notice shall be
40
+ included in all copies or substantial portions of the Software.
41
+
42
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
43
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
44
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
45
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
46
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
47
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
48
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
49
+ OTHER DEALINGS IN THE SOFTWARE.
50
+
@@ -0,0 +1,14 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'echoe'
4
+
5
+ Echoe.new('nzbget', '0.6.0') do |p|
6
+ p.description = "Communicate with NZBGet via RPC."
7
+ p.url = "http://github.com/marcbowes/nzbget"
8
+ p.author = "Marc Bowes"
9
+ p.email = "marcbowes@gmail.com"
10
+ p.runtime_dependencies = ['httparty']
11
+ end
12
+
13
+ Dir["#{File.dirname(__FILE__)}/tasks/*.rake"].sort.each { |ext| load ext }
14
+
@@ -0,0 +1,98 @@
1
+ module NZBGet
2
+ class Group
3
+ attr_accessor :attributes
4
+
5
+ def initialize(nzbget, hash)
6
+ @nzbget = nzbget
7
+ @attributes = hash
8
+ end
9
+
10
+ def category=(category = '')
11
+ @nzbget.editqueue('GroupSetCategory', 0, category, @attributes['LastID'])
12
+ end
13
+
14
+ def delete
15
+ @nzbget.editqueue('GroupDelete', 0, '', @attributes['LastID'])
16
+ end
17
+
18
+ def downloaded(format = :bytes)
19
+ formatted_response [size - remaining, 0].max, format
20
+ end
21
+
22
+ def formatted_response(bytes, format)
23
+ case format
24
+ when :bytes, :b then bytes
25
+ when :kilobytes, :kb then bytes.to_f / 1024
26
+ when :megabytes, :mb then bytes.to_f / 1024 ** 2
27
+ when :gigabytes, :gb then bytes.to_f / 1024 ** 3
28
+ end
29
+ end
30
+
31
+ def inspect
32
+ "#<#{self.class} name=\"#{self.name}\">"
33
+ end
34
+
35
+ def name
36
+ @attributes['NZBNicename']
37
+ end
38
+
39
+ def move(offset_or_sym)
40
+ return move_to_offset(offset_or_sym) if offset_or_sym.is_a? Fixnum
41
+ return move_to_symbol(offset_or_sym) if offset_or_sym.is_a? Symbol
42
+ raise ArgumentError
43
+ end
44
+
45
+ def percentage
46
+ (downloaded + paused) * 100.0 / size
47
+ end
48
+
49
+ def pause(pars = nil)
50
+ command =
51
+ unless pars
52
+ 'GroupPause'
53
+ else
54
+ if pars == :all
55
+ 'GroupPauseAllPars'
56
+ elsif pars == :extra
57
+ 'GroupPauseExtraPars'
58
+ else
59
+ raise ArgumentError
60
+ end
61
+ end
62
+
63
+ @nzbget.editqueue(command, 0, '', @attributes['LastID'])
64
+ end
65
+
66
+ def paused(format = :bytes)
67
+ formatted_response @attributes['PausedSizeLo'].to_i, format
68
+ end
69
+
70
+ def remaining(format = :bytes)
71
+ formatted_response @attributes['RemainingSizeLo'].to_i, format
72
+ end
73
+
74
+ def resume
75
+ @nzbget.editqueue('GroupResume', 0, '', @attributes['LastID'])
76
+ end
77
+
78
+ def size(format = :bytes)
79
+ formatted_response @attributes['FileSizeLo'].to_i, format
80
+ end
81
+
82
+ protected
83
+
84
+ def move_to_offset(offset)
85
+ @nzbget.editqueue('GroupMoveOffset', offset, '', @attributes['LastID'])
86
+ end
87
+
88
+ def move_to_symbol(sym)
89
+ command = case sym
90
+ when :top then 'GroupMoveTop'
91
+ when :bottom then 'GroupMoveBottom'
92
+ else raise ArgumentError
93
+ end
94
+
95
+ @nzbget.editqueue(command, 0, '', @attributes['LastID'])
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,14 @@
1
+ module HTTParty
2
+ class Request
3
+ def uri
4
+ new_uri = path.relative? ? URI.parse("#{options[:base_uri]}#{path}") : path
5
+
6
+ # avoid double query string on redirects [#12]
7
+ unless @redirect
8
+ new_uri.query = query_string(new_uri)
9
+ end
10
+ new_uri.query = nil if new_uri.query.blank?
11
+ new_uri
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,87 @@
1
+ require 'rubygems'
2
+ require 'httparty'
3
+ require File.join(File.dirname(__FILE__), 'httparty/request')
4
+ require 'group'
5
+ require 'base64'
6
+
7
+ module NZBGet
8
+ class RemoteConnection
9
+ include HTTParty
10
+
11
+ DEFAULT_OPTIONS = {
12
+ :method => :json,
13
+ :password => 'tegbzn6789',
14
+ :port => 6789,
15
+ :uri => 'http://localhost',
16
+ :username => 'nzbget'
17
+ }
18
+
19
+ def initialize(options = {})
20
+ @options = DEFAULT_OPTIONS.merge(options)
21
+
22
+ uri = URI.parse(@options[:uri])
23
+ uri.port = @options[:port]
24
+
25
+ self.class.base_uri uri.to_s
26
+ self.class.basic_auth @options[:username], @options[:password]
27
+
28
+ case @options[:method]
29
+ when :json
30
+ require 'json'
31
+ when :xml
32
+ raise ArgumentError
33
+ else
34
+ raise ArgumentError
35
+ end
36
+ self.class.format @options[:method]
37
+ end
38
+
39
+ def enqueue(path, options = {})
40
+ extname = File.extname(path)
41
+ raise ArgumentError unless extname.downcase == '.nzb'
42
+
43
+ filename = options[:filename] || File.basename(path).sub(/#{extname}$/, '')
44
+ category = options[:category] || ''
45
+ add_to_top = options[:to_top] || false
46
+
47
+ content = open(path).read
48
+ send :append, filename, category, add_to_top, Base64.encode64(content).strip
49
+ end
50
+
51
+ def paused?
52
+ send(:status)['result']['ServerPaused']
53
+ end
54
+
55
+ def groups
56
+ send(:listgroups)['result'].collect { |g| NZBGet::Group.new(self, g) }
57
+ end
58
+
59
+ protected
60
+
61
+ def encode(hash)
62
+ hash.send("to_#{@options[:method].to_s}".to_sym)
63
+ end
64
+
65
+ def method_missing(name, *args)
66
+ invoke name, args
67
+ end
68
+
69
+ def invoke(method, params)
70
+ #
71
+ # According to http://json-rpc.org/wd/JSON-RPC-1-1-WD-20060807.html#RequestHeaders:
72
+ #
73
+ # Regardless of whether a remote procedure call is made using HTTP GET or POST, the HTTP request message MUST specify the following headers:
74
+ # * The User-Agent MUST be specified.
75
+ # * For HTTP POST only, the Content-Type MUST be specified and SHOULD read application/json.
76
+ # * The Content-Length MUST be specified and correct according to the guidelines and rules laid out in Section 4.4, “Message Length”, of the HTTP specification.
77
+ # * The Accept MUST be specified and SHOULD read application/json.
78
+ #
79
+ # However, NZBGet does not check these headers, so they are not included.
80
+ #
81
+
82
+ response = self.class.post("/#{@options[:method].to_s}rpc",
83
+ :body => encode({ :method => method.to_s, :params => params, :version => '1.1' }))
84
+ end
85
+
86
+ end
87
+ end
@@ -0,0 +1,33 @@
1
+ # -*- encoding: utf-8 -*-
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = %q{nzbget}
5
+ s.version = "0.6.0"
6
+
7
+ s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
+ s.authors = ["Marc Bowes"]
9
+ s.date = %q{2009-10-21}
10
+ s.description = %q{Communicate with NZBGet via RPC.}
11
+ s.email = %q{marcbowes@gmail.com}
12
+ s.extra_rdoc_files = ["README.rdoc", "lib/group.rb", "lib/httparty/request.rb", "lib/nzbget.rb"]
13
+ s.files = ["Manifest", "README.rdoc", "Rakefile", "lib/group.rb", "lib/httparty/request.rb", "lib/nzbget.rb", "nzbget.gemspec"]
14
+ s.homepage = %q{http://github.com/marcbowes/nzbget}
15
+ s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Nzbget", "--main", "README.rdoc"]
16
+ s.require_paths = ["lib"]
17
+ s.rubyforge_project = %q{nzbget}
18
+ s.rubygems_version = %q{1.3.5}
19
+ s.summary = %q{Communicate with NZBGet via RPC.}
20
+
21
+ if s.respond_to? :specification_version then
22
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
23
+ s.specification_version = 3
24
+
25
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
26
+ s.add_runtime_dependency(%q<httparty>, [">= 0"])
27
+ else
28
+ s.add_dependency(%q<httparty>, [">= 0"])
29
+ end
30
+ else
31
+ s.add_dependency(%q<httparty>, [">= 0"])
32
+ end
33
+ end
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: nzbget
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.6.0
5
+ platform: ruby
6
+ authors:
7
+ - Marc Bowes
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-10-21 00:00:00 +02:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: httparty
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: "0"
24
+ version:
25
+ description: Communicate with NZBGet via RPC.
26
+ email: marcbowes@gmail.com
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files:
32
+ - README.rdoc
33
+ - lib/group.rb
34
+ - lib/httparty/request.rb
35
+ - lib/nzbget.rb
36
+ files:
37
+ - Manifest
38
+ - README.rdoc
39
+ - Rakefile
40
+ - lib/group.rb
41
+ - lib/httparty/request.rb
42
+ - lib/nzbget.rb
43
+ - nzbget.gemspec
44
+ has_rdoc: true
45
+ homepage: http://github.com/marcbowes/nzbget
46
+ licenses: []
47
+
48
+ post_install_message:
49
+ rdoc_options:
50
+ - --line-numbers
51
+ - --inline-source
52
+ - --title
53
+ - Nzbget
54
+ - --main
55
+ - README.rdoc
56
+ require_paths:
57
+ - lib
58
+ required_ruby_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: "0"
63
+ version:
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: "1.2"
69
+ version:
70
+ requirements: []
71
+
72
+ rubyforge_project: nzbget
73
+ rubygems_version: 1.3.5
74
+ signing_key:
75
+ specification_version: 3
76
+ summary: Communicate with NZBGet via RPC.
77
+ test_files: []
78
+