/
nzb.rb
83 lines (65 loc) · 1.78 KB
/
nzb.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
require 'nzb/parser'
require 'nzb/connection'
require 'fileutils'
class NZB
class << self
attr_accessor :host, :port, :pool_size, :output_directory, :blocking
def setup(options)
({ :port => 119, :pool_size => 1, :blocking => true }.merge(options)).each { |key, value| send("#{key}=", value) }
end
def queued
@queue ||= []
end
def queue(path)
(queued << new(path)).last
end
def clear_queue!
@queue = []
end
# This is going to be called by the connection(s).
def request_file
queued.shift if queued.first and queued.first.done?
if nzb = queued.first
nzb.request_file
end
end
end
attr_reader :path, :files, :queue, :on_update_callback
def initialize(path)
@path = path
@files = Parser.new(self).files
@queue = @files.dup
unless ::File.exist?(output_directory)
FileUtils.mkdir_p(output_directory)
FileUtils.mkdir_p(work_directory)
end
end
def output_directory
@output_directory ||= ::File.join(NZB.output_directory, ::File.basename(@path, '.nzb'))
end
def work_directory
@work_directory ||= ::File.join(output_directory, '.work')
end
# This is called by NZB.request_file
def request_file
@queue.shift
end
def done?
@queue.empty?
end
def bytes
@bytes ||= @files.inject(0) { |sum, file| sum += file.bytes }
end
def downloaded_bytes
@files.inject(0) { |sum, file| p file.downloaded_bytes; sum += file.downloaded_bytes }
end
def downloaded_percentage
(downloaded_bytes * 100.0) / bytes
end
def on_update(&on_update_callback)
@on_update_callback = on_update_callback
end
def run_update_callback!
@on_update_callback.call(self) if @on_update_callback
end
end