pirate-autonzb 0.4.5 → 0.5.0

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/Manifest CHANGED
@@ -4,8 +4,11 @@ bin/autonzb
4
4
  lib/imdb.rb
5
5
  lib/inspector.rb
6
6
  lib/movie.rb
7
- lib/nfo.rb
8
- lib/nzb.rb
7
+ lib/sites/newzleech/nfo.rb
8
+ lib/sites/newzleech/nzb.rb
9
+ lib/sites/nzbs/mechanize_hack.rb
10
+ lib/sites/nzbs/nfo.rb
11
+ lib/sites/nzbs/nzb.rb
9
12
  Manifest
10
13
  Rakefile
11
- README.markdown
14
+ README.markdown
data/Rakefile CHANGED
@@ -3,8 +3,8 @@ require 'rubygems'
3
3
  require 'rake'
4
4
  require 'echoe'
5
5
 
6
- Echoe.new('autonzb', '0.4.5') do |p|
7
- p.description = "Ruby tool to automatically download x264 HD nzb movies files from newzleech.com"
6
+ Echoe.new('autonzb', '0.5.0') do |p|
7
+ p.description = "Ruby tool to automatically download x264 HD nzb movies files from newzleech.com & nzbs.org"
8
8
  p.url = "http://github.com/pirate/autonzb"
9
9
  p.author = "Pirate"
10
10
  p.email = "pirate.2061@gmail.com"
data/autonzb.gemspec CHANGED
@@ -2,24 +2,24 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = %q{autonzb}
5
- s.version = "0.4.5"
5
+ s.version = "0.5.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Pirate"]
9
- s.date = %q{2009-03-15}
9
+ s.date = %q{2009-03-22}
10
10
  s.default_executable = %q{autonzb}
11
- s.description = %q{Ruby tool to automatically download x264 HD nzb movies files from newzleech.com}
11
+ s.description = %q{Ruby tool to automatically download x264 HD nzb movies files from newzleech.com & nzbs.org}
12
12
  s.email = %q{pirate.2061@gmail.com}
13
13
  s.executables = ["autonzb"]
14
- s.extra_rdoc_files = ["bin/autonzb", "lib/imdb.rb", "lib/inspector.rb", "lib/movie.rb", "lib/nfo.rb", "lib/nzb.rb", "README.markdown"]
15
- s.files = ["asset/failure.png", "autonzb.gemspec", "bin/autonzb", "lib/imdb.rb", "lib/inspector.rb", "lib/movie.rb", "lib/nfo.rb", "lib/nzb.rb", "Manifest", "Rakefile", "README.markdown"]
14
+ s.extra_rdoc_files = ["bin/autonzb", "lib/imdb.rb", "lib/inspector.rb", "lib/movie.rb", "lib/sites/newzleech/nfo.rb", "lib/sites/newzleech/nzb.rb", "lib/sites/nzbs/mechanize_hack.rb", "lib/sites/nzbs/nfo.rb", "lib/sites/nzbs/nzb.rb", "README.markdown"]
15
+ s.files = ["asset/failure.png", "autonzb.gemspec", "bin/autonzb", "lib/imdb.rb", "lib/inspector.rb", "lib/movie.rb", "lib/sites/newzleech/nfo.rb", "lib/sites/newzleech/nzb.rb", "lib/sites/nzbs/mechanize_hack.rb", "lib/sites/nzbs/nfo.rb", "lib/sites/nzbs/nzb.rb", "Manifest", "Rakefile", "README.markdown"]
16
16
  s.has_rdoc = true
17
17
  s.homepage = %q{http://github.com/pirate/autonzb}
18
18
  s.rdoc_options = ["--line-numbers", "--inline-source", "--title", "Autonzb", "--main", "README.markdown"]
19
19
  s.require_paths = ["lib"]
20
20
  s.rubyforge_project = %q{autonzb}
21
21
  s.rubygems_version = %q{1.3.1}
22
- s.summary = %q{Ruby tool to automatically download x264 HD nzb movies files from newzleech.com}
22
+ s.summary = %q{Ruby tool to automatically download x264 HD nzb movies files from newzleech.com & nzbs.org}
23
23
 
24
24
  if s.respond_to? :specification_version then
25
25
  current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
data/bin/autonzb CHANGED
@@ -2,7 +2,6 @@
2
2
 
3
3
  require 'optiflag'
4
4
  require File.join(File.dirname(__FILE__), '..', 'lib', 'inspector')
5
- require File.join(File.dirname(__FILE__), '..', 'lib', 'nzb')
6
5
 
7
6
  module AutoNZB extend OptiFlagSet
8
7
  flag "d" do
@@ -35,17 +34,26 @@ module AutoNZB extend OptiFlagSet
35
34
  optional_flag "backup" do
36
35
  description "Backup folder path (to save a copy of all downloaded nzb files and prevent an already downloaded nzb to be re-downloaded)"
37
36
  end
37
+ optional_flag "login" do
38
+ description "Username for www.nzbs.org"
39
+ end
40
+ optional_flag "pass" do
41
+ description "Password for www.nzbs.org"
42
+ end
38
43
 
39
44
  and_process!
40
45
  end
41
46
 
42
47
  begin
43
- inspector = Inspector.new(ARGV.flags.movies || '', :year => ARGV.flags.year,
44
- :imdb_score => ARGV.flags.imdb,
45
- :srt => ARGV.flags.srt,
46
- :backup => ARGV.flags.backup)
47
-
48
- newzleech = NZB.new(inspector, ARGV.flags.d, :age => ARGV.flags.age, :pages => ARGV.flags.pages)
48
+ inspector = Inspector.new(ARGV.flags.d, :year => ARGV.flags.year,
49
+ :imdb_score => ARGV.flags.imdb,
50
+ :srt => ARGV.flags.srt,
51
+ :age => ARGV.flags.age,
52
+ :pages => ARGV.flags.pages,
53
+ :backup_path => ARGV.flags.backup,
54
+ :movie_paths => ARGV.flags.movies,
55
+ :login => ARGV.flags.login,
56
+ :pass => ARGV.flags.pass)
49
57
  rescue => e
50
58
  p e.to_s
51
59
  Inspector.growl("AutoNZB Error!", 'look into the console log')
data/lib/imdb.rb CHANGED
@@ -8,6 +8,7 @@ class IMDB
8
8
  attr_accessor :link, :doc, :id
9
9
 
10
10
  def initialize(name, year = nil, link = nil)
11
+ $stdout.print 'i'
11
12
  @try = 3
12
13
  @name, @year, @link = name, year, link
13
14
  @coder = HTMLEntities.new
data/lib/inspector.rb CHANGED
@@ -1,11 +1,13 @@
1
1
  require File.join(File.dirname(__FILE__), 'movie')
2
+ require File.join(File.dirname(__FILE__), 'sites', 'newzleech', 'nzb')
3
+ require File.join(File.dirname(__FILE__), 'sites', 'nzbs', 'nzb')
2
4
 
3
5
  class Inspector
4
6
 
5
7
  attr_accessor :backup_path, :movies, :nzbs
6
8
 
7
- def initialize(paths, options = {})
8
- @paths = paths.split(',').map { |p| p.gsub(/\/$/,'') }
9
+ def initialize(download_path, options = {})
10
+ @paths = options[:movie_paths] ? options[:movie_paths].split(',').map { |p| p.gsub(/\/$/,'') } : []
9
11
  @options = options
10
12
  @options[:srt] = @options[:srt] ? (@options[:srt].split(',') - ["unknown"] + ['unknown']).uniq : nil
11
13
  @options[:imdb_score] = @options[:imdb_score] ? @options[:imdb_score].to_f : 7.0
@@ -14,14 +16,22 @@ class Inspector
14
16
  @movies = []
15
17
  initialize_movies
16
18
 
17
- if @options[:backup]
18
- @backup_path = @options[:backup].gsub(/\/$/,'')
19
+ if @options[:backup_path]
20
+ @backup_path = @options[:backup_path].gsub(/\/$/,'')
19
21
  @nzbs = []
20
22
  initialize_nzbs
21
23
  @movies = @nzbs + @movies
22
24
  end
23
25
 
24
- $stdout.print "Movie criteria: imdb score >= #{@options[:imdb_score]}, year >= #{@options[:year]} and srt [#{@options[:srt].join(',')}]\n"
26
+ $stdout.print "Movie criteria: imdb score >= #{@options[:imdb_score]}, year >= #{@options[:year]}#{" and srt [#{@options[:srt].join(',')}]" if @options[:srt]}\n"
27
+
28
+ if @options[:login] && @options[:pass]
29
+ Nzbs::NZB.new(self, download_path, @options)
30
+ else
31
+ Newzleech::NZB.new(self, download_path, @options)
32
+ end
33
+
34
+ keep_only_best_nzb if @backup_path
25
35
  end
26
36
 
27
37
  def need?(movie, not_validate = false, movies = @movies, log = true)
@@ -95,6 +105,8 @@ private
95
105
  @nzbs << Movie.new(nzb, :path => nzb_path) if File.extname(nzb_path) == '.nzb'
96
106
  end
97
107
  $stdout.print "Found #{@nzbs.size} backuped nzb(s) in #{@backup_path}\n"
108
+ rescue => e
109
+ $stdout.print "Problem with backup nzb: #{e}\n"
98
110
  end
99
111
 
100
112
  def clean_dir(dir)
@@ -108,11 +120,15 @@ private
108
120
  end
109
121
 
110
122
  def srt_score(movie)
111
- srts = @options[:srt].reverse
112
- movie.srt.inject(-1) do |score, srt|
113
- s = (i = srts.index(srt)) ? i : -1
114
- score = s if s > score
115
- score
123
+ if @options[:srt]
124
+ srts = @options[:srt].reverse
125
+ movie.srt.inject(-1) do |score, srt|
126
+ s = (i = srts.index(srt)) ? i : -1
127
+ score = s if s > score
128
+ score
129
+ end
130
+ else
131
+ 0
116
132
  end
117
133
  end
118
134
 
@@ -137,5 +153,20 @@ private
137
153
  def sound_score(movie)
138
154
  movie.format == 'DTS' ? 1 : 0
139
155
  end
156
+
157
+ def keep_only_best_nzb
158
+ size = 0
159
+ @nzbs.each do |nzb|
160
+ nzbs = @nzbs.select { |item| item.path != nzb.path }
161
+ unless need?(nzb, true, nzbs, false)
162
+ File.delete(nzb.path)
163
+ size += 1
164
+ end
165
+ end
166
+ if size > 0
167
+ $stdout.print "#########################################################################\n"
168
+ $stdout.print "Deleted #{size} useless backuped nzb(s) (keep only the best nzb by movie)\n"
169
+ end
170
+ end
140
171
 
141
172
  end
data/lib/movie.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  require File.join(File.dirname(__FILE__), 'imdb')
2
- require File.join(File.dirname(__FILE__), 'nfo')
3
2
 
4
3
  class Movie
5
4
  include Comparable
@@ -12,6 +11,11 @@ class Movie
12
11
  attributes.each { |k,v| self.send("#{k}=", v) }
13
12
  @srt, @tags = [], []
14
13
 
14
+ # for info set with nzbs title
15
+ if name && year && score
16
+ @info_get_from_title = true
17
+ end
18
+
15
19
  set_name
16
20
  set_year
17
21
  set_format
@@ -21,8 +25,9 @@ class Movie
21
25
  set_lang
22
26
  set_encoding
23
27
  set_tags
28
+
24
29
  set_imdb_id
25
- set_data_from_imdb unless path
30
+ set_data_from_imdb unless path || @info_get_from_title
26
31
  end
27
32
 
28
33
  def score
@@ -65,7 +70,7 @@ private
65
70
  end
66
71
 
67
72
  def set_name
68
- if @name.nil?
73
+ if name.nil?
69
74
  raw_name = @raw_name.gsub(/\(|\)|\[|\]|\{|\}|\//, ' ')
70
75
  if matched = raw_name.match(/(.*)(19[0-9]{2}|20[0-9]{2})[^p]/)
71
76
  @name = matched[1]
@@ -82,8 +87,10 @@ private
82
87
  end
83
88
 
84
89
  def set_year
85
- if matched = @raw_name.match(/19[0-9]{2}|20[0-9]{2}/)
86
- @year = matched[0].to_i
90
+ if year.nil?
91
+ if matched = @raw_name.match(/19[0-9]{2}|20[0-9]{2}/)
92
+ @year = matched[0].to_i
93
+ end
87
94
  end
88
95
  end
89
96
 
@@ -0,0 +1,35 @@
1
+ require 'open-uri'
2
+
3
+ module Newzleech
4
+ class Nfo
5
+
6
+ attr_accessor :srt, :imdb_link
7
+
8
+ def initialize(url)
9
+ @nfo = open(url.gsub(/\/$/,'')).read
10
+ @srt = []
11
+
12
+ parse_nfo
13
+ @srt.uniq!
14
+ end
15
+
16
+ private
17
+
18
+ # searching for subtitles languages info & imdb link
19
+ def parse_nfo
20
+ @nfo.split(/\n/).each do |line|
21
+ case line
22
+ when /subtitle|sub/i
23
+ @srt << 'fr' if line =~ /fr|fre|french/i
24
+ @srt << 'en' if line =~ /en|eng|english/i
25
+ # TODO add more language parsing here
26
+ @srt << 'none' if line =~ /none/i
27
+ when /imdb\.com\/title\//
28
+ @imdb_link = (matched = line.match(/imdb.com\/title\/(tt[0-9]+)/)) && "http://imdb.com/title/#{matched[1]}"
29
+ end
30
+ end
31
+ @srt << 'unknown' if @srt.empty?
32
+ end
33
+
34
+ end
35
+ end
@@ -0,0 +1,118 @@
1
+ require 'open-uri'
2
+ require 'hpricot'
3
+ require 'zip/zip'
4
+
5
+ require File.join(File.dirname(__FILE__), 'nfo')
6
+
7
+ module Newzleech
8
+ class NZB
9
+
10
+ URL = 'http://www.newzleech.com'
11
+
12
+ attr_accessor :movies, :agent
13
+
14
+ def initialize(inspector, download_path, options = {})
15
+ @inspector, @download_path = inspector, download_path.gsub(/\/$/,'')
16
+ @options = options
17
+ @options[:age] ||= 160
18
+ @options[:pages] ||= 2
19
+
20
+ @nzb_urls = []
21
+ @movies = []
22
+
23
+ (1..(@options[:pages].to_i)).each do |page|
24
+ @nzb_urls << "#{URL}?group=143&minage=&age=160&min=4000&max=max&q=&m=search&adv=1&offset=#{(page.to_i - 1) * 60}"
25
+ end
26
+
27
+ parse_newzleech
28
+ parse_movies
29
+ end
30
+
31
+ private
32
+
33
+ def parse_newzleech
34
+ $stdout.print "Parsing #{URL} for new x264 HD nzb movies, with age <= #{@options[:age]}, in last #{@options[:pages]} page(s)\n"
35
+ @nzb_urls.each do |url|
36
+ doc = Hpricot(open(url))
37
+ doc.search("table.contentt").each do |table|
38
+ raw_name = raw_name(table)
39
+ if nfo_link = nfo_link(table)
40
+ nfo = Nfo.new(nfo_link)
41
+ imdb_link = nfo.imdb_link
42
+ else
43
+ imdb_link = imdb_link(table)
44
+ end
45
+ if raw_name && (imdb_link || (raw_name = find_clean_nzb_name(raw_name))) && raw_name.include?('x264')
46
+ age = parse_age(table.search("td.age").first.inner_html) # get age of the nzb
47
+ if age <= @options[:age].to_f
48
+ raw_name = clean_raw_name(raw_name)
49
+ movie = Movie.new(raw_name, :nfo => nfo, :imdb_link => imdb_link, :nzb_link => nzb_link(table), :age => age)
50
+ @movies << movie
51
+
52
+ $stdout.print '.'
53
+ $stdout.flush
54
+ end
55
+ end
56
+ end
57
+ end
58
+ $stdout.print "\n"
59
+ end
60
+
61
+ def clean_raw_name(raw_name)
62
+ (find_clean_nzb_name(raw_name) || raw_name).strip
63
+ end
64
+
65
+ def find_clean_nzb_name(raw_name)
66
+ if matched = raw_name.match(/^\[[0-9]*\]-\[.*\]-\[(.*)\]-/)
67
+ matched[1]
68
+ end
69
+ end
70
+
71
+ def raw_name(table)
72
+ (a = table.search("td.subject a[@href^='?p=']").first) && a.inner_html
73
+ end
74
+
75
+ def nfo_link(table)
76
+ (nfo = table.search("td.subject a[@href^='nfo.php?id=']").first) && "#{URL}/#{nfo[:href]}"
77
+ end
78
+
79
+ def imdb_link(table)
80
+ (imdb = table.search("td.subject a[@href^='http://anonym.to/?http://www.imdb.com']").first) && imdb[:href].match(/\?(.*)/)[1]
81
+ end
82
+
83
+ def nzb_link(table)
84
+ (nzb = table.search("td.get a[@href^='?m=gen&dl=1']").first) && "#{URL}/#{nzb[:href]}"
85
+ end
86
+
87
+ def parse_movies
88
+ movies.each do |movie|
89
+ $stdout.print "#{movie.dirname}, imdb score: #{movie.score}, age: #{movie.age.to_i} day(s)\n"
90
+ if @inspector.need?(movie)
91
+ $stdout.print " => DOWNLOAD: #{movie.name} (#{movie.year})\n"
92
+ download_nzb(movie, @inspector.backup_path)
93
+ @inspector.movies << movie
94
+ end
95
+ end
96
+ $stdout.print "No nzb found, maybe change -age or -page setting\n" if @movies.empty?
97
+ end
98
+
99
+ def download_nzb(movie, backup_path = nil)
100
+ Tempfile.open("movie.nzb") do |tempfile|
101
+ tempfile.write(open(movie.nzb_link).read) # download the nzb
102
+ tempfile.close
103
+ File.copy(tempfile.path, "#{backup_path}/#{movie.dirname}.nzb") if backup_path
104
+ File.move(tempfile.path, "#{@download_path}/#{movie.dirname}.nzb")
105
+ end
106
+ end
107
+
108
+ def parse_age(string)
109
+ case string
110
+ when /h/i
111
+ string.to_f / 24
112
+ when /d/i
113
+ string.to_f
114
+ end
115
+ end
116
+
117
+ end
118
+ end
@@ -0,0 +1,41 @@
1
+ module WWW
2
+ class Mechanize
3
+ class Chain
4
+ class ResponseReader
5
+ include WWW::Handler
6
+
7
+ def initialize(response)
8
+ @response = response
9
+ end
10
+
11
+ def handle(ctx, params)
12
+ params[:response] = @response
13
+ body = StringIO.new
14
+ total = 0
15
+ @response.read_body { |part|
16
+ total += part.length
17
+ body.write(part)
18
+ Mechanize.log.debug("Read #{total} bytes") if Mechanize.log
19
+ }
20
+ body.rewind
21
+
22
+ res_klass = Net::HTTPResponse::CODE_TO_OBJ[@response.code.to_s]
23
+ raise ResponseCodeError.new(@response) unless res_klass
24
+
25
+ # Net::HTTP ignores EOFError if Content-length is given, so we emulate it here.
26
+ # unless res_klass <= Net::HTTPRedirection
27
+ # raise EOFError if (!params[:request].is_a?(Net::HTTP::Head)) && @response.content_length() && @response.content_length() != total
28
+ # end
29
+
30
+ @response.each_header { |k,v|
31
+ Mechanize.log.debug("response-header: #{ k } => #{ v }")
32
+ } if Mechanize.log
33
+
34
+ params[:response_body] = body
35
+ params[:res_klass] = res_klass
36
+ super
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,36 @@
1
+ require 'open-uri'
2
+
3
+ module Nzbs
4
+ class Nfo
5
+
6
+ attr_accessor :srt, :imdb_link
7
+
8
+ def initialize(agent, url)
9
+ @page = agent.get(url.gsub(/\/$/,''))
10
+ @srt = []
11
+
12
+ parse_nfo
13
+ @srt.uniq!
14
+ end
15
+
16
+ private
17
+
18
+ # searching for subtitles languages info & imdb link
19
+ def parse_nfo
20
+ pre = @page.search('pre.nfo')
21
+ pre.to_s.split(/\n/).each do |line|
22
+ case line
23
+ when /subtitle|sub/i
24
+ @srt << 'fr' if line =~ /fr|fre|french/i
25
+ @srt << 'en' if line =~ /en|eng|english/i
26
+ # TODO add more language parsing here
27
+ @srt << 'none' if line =~ /none/i
28
+ when /imdb\.com\/title\//
29
+ @imdb_link = (matched = line.match(/imdb.com\/title\/(tt[0-9]+)/)) && "http://imdb.com/title/#{matched[1]}"
30
+ end
31
+ end
32
+ @srt << 'unknown' if @srt.empty?
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,137 @@
1
+ require 'open-uri'
2
+ require 'hpricot'
3
+ require 'zip/zip'
4
+ require 'mechanize'
5
+
6
+ require File.join(File.dirname(__FILE__), 'nfo')
7
+ require File.join(File.dirname(__FILE__), 'mechanize_hack')
8
+
9
+
10
+ module Nzbs
11
+ class NZB
12
+
13
+ URL = 'http://www.nzbs.org'
14
+
15
+ attr_accessor :movies, :agent
16
+
17
+ def initialize(inspector, download_path, options = {})
18
+ @inspector, @download_path = inspector, download_path.gsub(/\/$/,'')
19
+ @options = options
20
+ @options[:age] ||= 160
21
+ @options[:pages] ||= 2
22
+
23
+ @nzb_urls = []
24
+ @movies = []
25
+
26
+ (1..(@options[:pages].to_i)).each do |page|
27
+ @nzb_urls << "#{URL}/index.php?action=browse&catid=4&page=#{(page)}"
28
+ end
29
+
30
+ login
31
+ parse_nzbs
32
+ parse_movies
33
+ end
34
+
35
+ private
36
+
37
+ def login
38
+ @agent = WWW::Mechanize.new
39
+ page = @agent.get "#{URL}/index.php?action=browse&catid=4"
40
+
41
+ form = page.forms[1]
42
+ form.username = @options[:login]
43
+ form.password = @options[:pass]
44
+
45
+ @agent.submit form
46
+ end
47
+
48
+ def parse_nzbs
49
+ $stdout.print "Parsing #{URL} for new x264 HD nzb movies, with age <= #{@options[:age]}, in last #{@options[:pages]} page(s)\n"
50
+ @nzb_urls.each do |url|
51
+ page = @agent.get url
52
+ page.search("#nzbtable tr").each do |tr|
53
+ if raw_name = raw_name(tr)
54
+ if (age = age(tr)) <= @options[:age].to_f
55
+ if nfo_link = nfo_link(tr)
56
+ @nfo = Nfo.new(@agent, nfo_link(tr))
57
+ end
58
+
59
+ name, year, score = get_info_from_imdb_title(tr)
60
+ movie = Movie.new(raw_name, :name => name,
61
+ :year => year,
62
+ :score => score,
63
+ :imdb_link => imdb_link(tr),
64
+ :nzb_link => nzb_link(tr, page),
65
+ :age => age,
66
+ :nfo => @nfo)
67
+ @movies << movie
68
+
69
+ $stdout.print '.'
70
+ $stdout.flush
71
+ end
72
+ end
73
+ end
74
+ end
75
+ $stdout.print "\n"
76
+ end
77
+
78
+ def raw_name(tr)
79
+ (a = tr.search("a.nzb").first) && a.inner_html
80
+ end
81
+
82
+ def age(tr)
83
+ age_text = (td = tr.search("td[@align='right']").first) && td.inner_html
84
+ if age_text.include?("days ago")
85
+ age_text.to_f
86
+ else
87
+ $stdout.print "AGE NOT FOUND\n"
88
+ end
89
+ end
90
+
91
+ def nfo_link(tr)
92
+ (a = tr.search("small a[@href$='#nfo']").first) && a[:href]
93
+ end
94
+
95
+ def get_info_from_imdb_title(tr)
96
+ title = (a = tr.search("small a.viewimdb").first) && a[:title]
97
+ if title
98
+ if matched = title.match(/^(.*)\s\(([0-9]{4}).*\s\((.*)\/10\)/)
99
+ name = matched[1]
100
+ year = matched[2]
101
+ score = matched[3]
102
+ return name, year.to_i, score.to_f
103
+ end
104
+ end
105
+ end
106
+
107
+ def imdb_link(tr)
108
+ (a = tr.search("small a.viewimdb").first) && a[:href].match(/^http:\/\/anonym.to\/\?(.*)/)[1]
109
+ end
110
+
111
+ def nzb_link(tr, page)
112
+ (a = tr.search("a.dlnzb").first) && "#{URL}/#{a[:href]}"
113
+ end
114
+
115
+ def parse_movies
116
+ movies.each do |movie|
117
+ $stdout.print "#{movie.dirname}, imdb score: #{movie.score}, age: #{movie.age} day(s)\n"
118
+ if @inspector.need?(movie)
119
+ $stdout.print " => DOWNLOAD: #{movie.name} (#{movie.year})\n"
120
+ download_nzb(movie, @inspector.backup_path)
121
+ @inspector.movies << movie
122
+ end
123
+ end
124
+ $stdout.print "No nzb found, maybe change -age or -page setting\n" if @movies.empty?
125
+ end
126
+
127
+ def download_nzb(movie, backup_path = nil)
128
+ Tempfile.open("movie.nzb") do |tempfile|
129
+ tempfile.write(@agent.get_file(movie.nzb_link)) # download the nzb
130
+ tempfile.close
131
+ File.copy(tempfile.path, "#{backup_path}/#{movie.dirname}.nzb") if backup_path
132
+ File.move(tempfile.path, "#{@download_path}/#{movie.dirname}.nzb")
133
+ end
134
+ end
135
+
136
+ end
137
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pirate-autonzb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.5
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pirate
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-03-15 00:00:00 -07:00
12
+ date: 2009-03-22 00:00:00 -07:00
13
13
  default_executable: autonzb
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -52,7 +52,7 @@ dependencies:
52
52
  - !ruby/object:Gem::Version
53
53
  version: "0"
54
54
  version:
55
- description: Ruby tool to automatically download x264 HD nzb movies files from newzleech.com
55
+ description: Ruby tool to automatically download x264 HD nzb movies files from newzleech.com & nzbs.org
56
56
  email: pirate.2061@gmail.com
57
57
  executables:
58
58
  - autonzb
@@ -63,8 +63,11 @@ extra_rdoc_files:
63
63
  - lib/imdb.rb
64
64
  - lib/inspector.rb
65
65
  - lib/movie.rb
66
- - lib/nfo.rb
67
- - lib/nzb.rb
66
+ - lib/sites/newzleech/nfo.rb
67
+ - lib/sites/newzleech/nzb.rb
68
+ - lib/sites/nzbs/mechanize_hack.rb
69
+ - lib/sites/nzbs/nfo.rb
70
+ - lib/sites/nzbs/nzb.rb
68
71
  - README.markdown
69
72
  files:
70
73
  - asset/failure.png
@@ -73,8 +76,11 @@ files:
73
76
  - lib/imdb.rb
74
77
  - lib/inspector.rb
75
78
  - lib/movie.rb
76
- - lib/nfo.rb
77
- - lib/nzb.rb
79
+ - lib/sites/newzleech/nfo.rb
80
+ - lib/sites/newzleech/nzb.rb
81
+ - lib/sites/nzbs/mechanize_hack.rb
82
+ - lib/sites/nzbs/nfo.rb
83
+ - lib/sites/nzbs/nzb.rb
78
84
  - Manifest
79
85
  - Rakefile
80
86
  - README.markdown
@@ -108,6 +114,6 @@ rubyforge_project: autonzb
108
114
  rubygems_version: 1.2.0
109
115
  signing_key:
110
116
  specification_version: 2
111
- summary: Ruby tool to automatically download x264 HD nzb movies files from newzleech.com
117
+ summary: Ruby tool to automatically download x264 HD nzb movies files from newzleech.com & nzbs.org
112
118
  test_files: []
113
119
 
data/lib/nfo.rb DELETED
@@ -1,33 +0,0 @@
1
- require 'open-uri'
2
-
3
- class NFO
4
-
5
- attr_accessor :srt, :imdb_link
6
-
7
- def initialize(url)
8
- @nfo = open(url.gsub(/\/$/,'')).read
9
- @srt = []
10
-
11
- parse_nfo
12
- @srt.uniq!
13
- end
14
-
15
- private
16
-
17
- # searching for subtitles languages info & imdb link
18
- def parse_nfo
19
- @nfo.split(/\n/).each do |line|
20
- case line
21
- when /subtitle|sub/i
22
- @srt << 'fr' if line =~ /fr|fre|french/i
23
- @srt << 'en' if line =~ /en|eng|english/i
24
- # TODO add more language parsing here
25
- @srt << 'none' if line =~ /none/i
26
- when /imdb\.com\/title\//
27
- @imdb_link = (matched = line.match(/imdb.com\/title\/(tt[0-9]+)/)) && "http://imdb.com/title/#{matched[1]}"
28
- end
29
- end
30
- @srt << 'unknown' if @srt.empty?
31
- end
32
-
33
- end
data/lib/nzb.rb DELETED
@@ -1,132 +0,0 @@
1
- require 'open-uri'
2
- require 'hpricot'
3
- require 'zip/zip'
4
-
5
- require File.join(File.dirname(__FILE__), 'movie')
6
-
7
- class NZB
8
-
9
- URL = 'http://www.newzleech.com'
10
-
11
- attr_accessor :movies, :agent
12
-
13
- def initialize(inspector, download_path, options = {})
14
- @inspector, @download_path = inspector, download_path.gsub(/\/$/,'')
15
- @options = options
16
- @options[:age] ||= 160
17
- @options[:pages] ||= 2
18
-
19
- @nzb_urls = []
20
- @movies = []
21
-
22
- (1..(@options[:pages].to_i)).each do |page|
23
- @nzb_urls << "#{URL}?group=143&minage=&age=160&min=4000&max=max&q=&m=search&adv=1&offset=#{(page.to_i - 1) * 60}"
24
- end
25
-
26
- parse_newzleech
27
- parse_movies
28
- keep_only_best_nzb if @inspector.backup_path
29
- end
30
-
31
- private
32
-
33
- def parse_newzleech
34
- $stdout.print "Parsing #{URL} for new x264 HD nzb movies, with age <= #{@options[:age]}, in last #{@options[:pages]} page(s)\n"
35
- @nzb_urls.each do |url|
36
- doc = Hpricot(open(url))
37
- doc.search("table.contentt").each do |table|
38
- raw_name = raw_name(table)
39
- if nfo_link = nfo_link(table)
40
- nfo = NFO.new(nfo_link)
41
- imdb_link = nfo.imdb_link
42
- else
43
- imdb_link = imdb_link(table)
44
- end
45
- if raw_name && (imdb_link || (raw_name = find_clean_nzb_name(raw_name))) && raw_name.include?('x264')
46
- age = parse_age(table.search("td.age").first.inner_html) # get age of the nzb
47
- if age <= @options[:age].to_f
48
- raw_name = clean_raw_name(raw_name)
49
- movie = Movie.new(raw_name, :nfo => nfo, :imdb_link => imdb_link, :nzb_link => nzb_link(table), :age => age)
50
- @movies << movie
51
-
52
- $stdout.print '.'
53
- $stdout.flush
54
- end
55
- end
56
- end
57
- end
58
- $stdout.print "\n"
59
- end
60
-
61
- def clean_raw_name(raw_name)
62
- (find_clean_nzb_name(raw_name) || raw_name).strip
63
- end
64
-
65
- def find_clean_nzb_name(raw_name)
66
- if matched = raw_name.match(/^\[[0-9]*\]-\[.*\]-\[(.*)\]-/)
67
- matched[1]
68
- end
69
- end
70
-
71
- def raw_name(table)
72
- (a = table.search("td.subject a[@href^='?p=']").first) && a.inner_html
73
- end
74
-
75
- def nfo_link(table)
76
- (nfo = table.search("td.subject a[@href^='nfo.php?id=']").first) && "#{URL}/#{nfo[:href]}"
77
- end
78
-
79
- def imdb_link(table)
80
- (imdb = table.search("td.subject a[@href^='http://anonym.to/?http://www.imdb.com']").first) && imdb[:href].match(/\?(.*)/)[1]
81
- end
82
-
83
- def nzb_link(table)
84
- (nzb = table.search("td.get a[@href^='?m=gen&dl=1']").first) && "#{URL}/#{nzb[:href]}"
85
- end
86
-
87
- def parse_movies
88
- movies.each do |movie|
89
- $stdout.print "#{movie.dirname}, imdb score: #{movie.score}, age: #{movie.age.to_i} day(s)\n"
90
- if @inspector.need?(movie)
91
- $stdout.print " => DOWNLOAD: #{movie.name} (#{movie.year})\n"
92
- download_nzb(movie, @inspector.backup_path)
93
- @inspector.movies << movie
94
- end
95
- end
96
- $stdout.print "No nzb found, maybe change -age or -page setting\n" if @movies.empty?
97
- end
98
-
99
- def download_nzb(movie, backup_path = nil)
100
- Tempfile.open("movie.nzb") do |tempfile|
101
- tempfile.write(open(movie.nzb_link).read) # download the nzb
102
- tempfile.close
103
- File.copy(tempfile.path, "#{backup_path}/#{movie.dirname}.nzb") if backup_path
104
- File.move(tempfile.path, "#{@download_path}/#{movie.dirname}.nzb")
105
- end
106
- end
107
-
108
- def parse_age(string)
109
- case string
110
- when /h/i
111
- string.to_f / 24
112
- when /d/i
113
- string.to_f
114
- end
115
- end
116
-
117
- def keep_only_best_nzb
118
- size = 0
119
- @inspector.nzbs.each do |nzb|
120
- nzbs = @inspector.nzbs.select { |item| item.path != nzb.path }
121
- unless @inspector.need?(nzb, true, nzbs, false)
122
- File.delete(nzb.path)
123
- size += 1
124
- end
125
- end
126
- if size > 0
127
- $stdout.print "#########################################################################\n"
128
- $stdout.print "Deleted #{size} useless backuped nzb(s) (keep only the best nzb by movie)\n"
129
- end
130
- end
131
-
132
- end