nyaa_anime 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 721bcf93f8c04147dcbedef8a0293e0af7f295ec
4
- data.tar.gz: f537048e7e23959fc25afe59f3fe1a9b201fb145
3
+ metadata.gz: e624f06033c4f20b98887562663b271fbd3342d5
4
+ data.tar.gz: 4912a5bb4e60dca9463ae3682a9d4ced3ab30b7d
5
5
  SHA512:
6
- metadata.gz: e61f73f40b2aa9618818ea9780ce3012b9144bd5ca59ad28da737b55d093369fdfd6c4a4abbef585b210fd6a90f4ce442988ad72e833b14bb733b935453489a5
7
- data.tar.gz: 261ea3c57b28c8098556f06d0c9d25db8790bdd7c7499f88e50e5877002d1f92ce3efdd9245cafe69b3c60d8252548ffcfd3f5a6bb99fe52d0f23310713a0ed0
6
+ metadata.gz: 45b2ca6bd017059bfece00d1bbc130e4e3273b2f403c26281bdc091a38243a5a08c52b2ef512c737cb332bac678ffddf8fb75bfc19a6928c4a91b440f385785e
7
+ data.tar.gz: c3fd3e63b529b7d5c7c936d7333caf08bfc86ee38720bcfbb38c471e12715c35dd8d6fd6ba7bc7a3e21227c1f5c0ca2c9f334546a014bb368151148b59ab3ad2
data/bin/nyaa_anime CHANGED
@@ -1,14 +1,21 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- if ARGV[0] == "search"
4
- require 'nyaa_anime/search'
5
- elsif ARGV[0] == "get"
6
- ARGV[1] = "-na"
7
- require 'nyaa_anime/search'
8
- elsif ARGV[0] == "list"
9
- require 'nyaa_anime/list'
10
- elsif ARGV[0] == "remove"
11
- require 'nyaa_anime/remove'
3
+ scripts = ["search", "list", "remove"]
4
+
5
+ if ARGV[0] == "get"
6
+ ARGV[0], ARGV[1] = "search", "-naq"
7
+ elsif ARGV[0] == "help" && ARGV[1]
8
+ if scripts.include? ARGV[1]
9
+ ARGV[0], ARGV[1] = ARGV[1], "--help"
10
+ else
11
+ puts "Error: No such command \"#{ARGV[1]}\"."
12
+ exit
13
+ end
14
+ end
15
+
16
+ script = ARGV[0]
17
+ if scripts.include? script
18
+ require "nyaa_anime/#{script}"
12
19
  else
13
20
  puts "Usage: nyaa <command> [<args>]\n" <<
14
21
  " nyaa_anime <command> [<args>]\n\n" <<
@@ -16,7 +23,8 @@ else
16
23
  " to wujoshuawu@gmail.com to keep the developer afloat.\n\n" <<
17
24
  "Commands:\n" <<
18
25
  " search Search for and download anime\n" <<
19
- " get Equivalent to `nyaa search -na`\n" <<
26
+ " get Equivalent to `nyaa search -naq`\n" <<
20
27
  " list List downloaded torrent files\n" <<
21
- " remove Delete download torrent files from a series\n"
28
+ " remove Delete download torrent files from a series\n" <<
29
+ " help Get help about a command (`nyaa help <command>`)\n"
22
30
  end
data/lib/nyaa_anime.rb CHANGED
@@ -9,6 +9,7 @@ class NyaaAnime
9
9
  require 'levenshtein'
10
10
  require 'set'
11
11
  require 'fileutils'
12
+ require 'parallel'
12
13
 
13
14
  NYAA_URI = "http://nyaa.se"
14
15
  NYAA_SEARCH = "#{NYAA_URI}/?page=rss"
@@ -19,12 +20,14 @@ class NyaaAnime
19
20
  TITLE_TOLERANCE_RANGE = (1..4)
20
21
  NEW_COLOR = :green
21
22
  ALREADY_DOWNLOADED_COLOR = :cyan
23
+ CL_WIDTH = 70
24
+ THREAD_COUNT = 20
22
25
 
23
26
  attr_reader :downloads, :new_titles
24
27
 
25
28
  FileUtils.mkdir_p NYAA_DL_DIR
26
29
 
27
- def search(title, quiet=true)
30
+ def search(title, quiet=false)
28
31
  puts "Searching for \"#{title}\"..." unless quiet
29
32
  @downloads = {}
30
33
  @titles = []
@@ -33,7 +36,12 @@ class NyaaAnime
33
36
  dl_urls = []
34
37
  offset = 1
35
38
  while true
36
- results = Nokogiri::HTML(open("#{url}#{offset}")).css('item')
39
+ begin
40
+ results = Nokogiri::HTML(open("#{url}#{offset}")).css('item')
41
+ rescue SocketError
42
+ puts "Error: Could not connect to NyaaTorrents."
43
+ exit
44
+ end
37
45
  titles.concat results.css('title').map { |t| t.content }
38
46
  dl_urls.concat results.css('link').map { |l| l.next.content }
39
47
  break if results.count < NYAA_ENTRIES_PER_PAGE || offset >= MAX_PAGES
@@ -46,21 +54,29 @@ class NyaaAnime
46
54
  nil
47
55
  end
48
56
 
49
- def find_new_titles
57
+ def find_new_titles(quiet=false)
50
58
  search_terms = NyaaAnime.series_of_downloaded_titles
51
59
  new_titles = Set.new
52
60
  new_downloads = {}
53
- max_title_size = search_terms.map { |t| t.size }.max
54
- search_terms.each_with_index do |t, idx|
55
- print "[#{(idx+1).to_s.rjust(search_terms.count.to_s.size, "0")}/#{search_terms.count}] #{t}..."
56
- search t
57
- new_titles.merge @new_titles
58
- @new_titles.each { |ti| new_downloads[ti] = @downloads[ti] }
59
- print "." * (max_title_size - t.size)
60
- if @new_titles.any?
61
- puts "#{@new_titles.count.to_s.colorize(:green)} found!"
62
- else
63
- puts "none found."
61
+ count_s_size = "[/] ".size + search_terms.count.to_s.size * 2
62
+ line_end_size = "...none found.".size
63
+ max_entry_size = [search_terms.map { |t| t.size }.max + count_s_size +
64
+ line_end_size, CL_WIDTH].min - line_end_size
65
+ index = 1
66
+ lock = Mutex.new
67
+ Parallel.each(search_terms, in_threads: THREAD_COUNT) do |t|
68
+ n = NyaaAnime.new
69
+ n.search t, true
70
+ lock.synchronize do
71
+ new_titles.merge n.new_titles
72
+ n.new_titles.each { |ti| new_downloads[ti] = n.downloads[ti] }
73
+ if !quiet
74
+ msg = "/#{search_terms.count}] #{t[0...max_entry_size-count_s_size]}..." <<
75
+ ("." * [max_entry_size - (count_s_size + t.size), 0].max) <<
76
+ (n.new_titles.any? ? "#{n.new_titles.count} found!".colorize(:green) : "none found.")
77
+ puts "[#{index.to_s.rjust(search_terms.count.to_s.size, "0")}#{msg}"
78
+ index += 1
79
+ end
64
80
  end
65
81
  end
66
82
  @new_titles = new_titles
@@ -69,8 +85,8 @@ class NyaaAnime
69
85
  @already_downloaded_titles = Set.new
70
86
  @version_differing_titles = Set.new
71
87
  @other_titles = Set.new
72
- if download_count > 0
73
- puts "#{download_count} new episode#{"s" if download_count > 1} found!".colorize(:green)
88
+ if downloads.count > 0
89
+ puts "#{downloads.count} new episode#{"s" if downloads.count > 1} found!".colorize(:green)
74
90
  end
75
91
  @titles.each_with_index { |t, i| puts "#{i+1}: #{t.colorize(NEW_COLOR)}" }
76
92
  end
@@ -167,24 +183,19 @@ class NyaaAnime
167
183
  torrent = open @downloads[title]
168
184
  filename = torrent.meta["content-disposition"][/filename="(.+\.torrent)"/, 1]
169
185
  open("#{NYAA_DL_DIR}#{filename}", "w") { |f| f.write torrent.read }
170
- puts "#{title}.torrent downloaded."
171
186
  "#{NYAA_DL_DIR}\"#{title}.torrent\""
172
187
  end
173
188
 
174
- def download_all
175
- @titles.map { |t| download(t) }
189
+ def download_batch(titles)
190
+ Parallel.map(titles) { |t| download(t) }.sort!
176
191
  end
177
192
 
178
- def download_all_new
179
- @new_titles.map { |t| download(t) }
180
- end
181
-
182
- def download_count
183
- @downloads.count
193
+ def download_all
194
+ download_batch @titles
184
195
  end
185
196
 
186
- def new_count
187
- @new_titles.count
197
+ def download_all_new
198
+ download_batch @new_titles
188
199
  end
189
200
 
190
201
  end
@@ -6,7 +6,7 @@ OptionParser.new do |opts|
6
6
  " If you like this tool, please donate via PayPal\n" <<
7
7
  " to wujoshuawu@gmail.com to keep the developer afloat.\n\n"
8
8
 
9
- opts.on("-a", "--all", "List all individual files as well") do
9
+ opts.on("-a", "--all", "List all individual files") do
10
10
  options[:list_all] = true
11
11
  end
12
12
  end.parse!
@@ -14,7 +14,8 @@ OptionParser.new do |opts|
14
14
  options[:remove_all] = true
15
15
  end
16
16
 
17
- opts.on("-n", "--number [N]", "Remove torrents of series as numbered by `nyaa list`") do |n|
17
+ opts.on("-n", "--number [N]", "Remove torrents of series as",
18
+ "numbered by `nyaa list`") do |n|
18
19
  options[:number] = n.to_i
19
20
  end
20
21
  end.parse!
@@ -15,7 +15,7 @@ ARGV[1] ||= "--help"
15
15
  options = {}
16
16
  OptionParser.new do |opts|
17
17
  opts.banner = "Usage: nyaa search [options] <anime>\n" <<
18
- " nyaa get (equivalent to `nyaa search -na`)\n\n" <<
18
+ " nyaa get (equivalent to `nyaa search -naq`)\n\n" <<
19
19
  " If you like this tool, please donate via PayPal\n" <<
20
20
  " to wujoshuawu@gmail.com to keep the developer afloat.\n\n"
21
21
 
@@ -24,9 +24,12 @@ OptionParser.new do |opts|
24
24
  options[:find_new] = true
25
25
  end
26
26
 
27
- opts.on("-a", "--all", "Download all results without asking") do
27
+ opts.on("-a", "--all", "Download all without asking") do
28
28
  options[:download_all] = true
29
29
  end
30
+ opts.on("-q", "--quiet", "Be quiet (only with -a)") do
31
+ options[:quiet] = true
32
+ end
30
33
 
31
34
  opts.on("-s", "--small-res", "Add '#{SMALL_RESOLUTION}' to the search term") do
32
35
  options[:resolution] = SMALL_RESOLUTION
@@ -39,8 +42,9 @@ OptionParser.new do |opts|
39
42
  end
40
43
 
41
44
  opts.on("-f", "--fansubber [FANSUBBER]",
42
- "Specify [FANSUBBER] to be added to the search",
43
- "term. [FANSUBBER] can be abbreviated by",
45
+ "Specify [FANSUBBER] to be added",
46
+ "to the search term. [FANSUBBER]",
47
+ "can be abbreviated by",
44
48
  *FANSUBBERS.map {|o, f| "#{o} - #{f}"}) do |f|
45
49
  if FANSUBBERS[f]
46
50
  options[:subber] = FANSUBBERS[f]
@@ -52,16 +56,21 @@ OptionParser.new do |opts|
52
56
  end
53
57
  end
54
58
 
55
- opts.on("-S", "--speedsubs", "Equivalent to `--fansubber=#{SPEEDSUBBER}`") do
59
+ opts.on("-S", "--speedsubs", "Equivalent to",
60
+ "`--fansubber=#{SPEEDSUBBER}`") do
56
61
  options[:subber] = SPEEDSUBBER
57
62
  end
58
63
  end.parse!
59
64
 
65
+ if !options[:download_all]
66
+ options[:quiet] = false
67
+ end
68
+
60
69
  require 'nyaa_anime'
61
70
  nyaa = NyaaAnime.new
62
71
 
63
72
  if options[:find_new]
64
- nyaa.find_new_titles
73
+ nyaa.find_new_titles !!options[:quiet]
65
74
  else
66
75
  if ARGV.size == 2
67
76
  search_term = ARGV[1]
@@ -74,10 +83,14 @@ else
74
83
  if res = options[:resolution]
75
84
  search_term += " #{res}"
76
85
  end
77
- nyaa.search search_term, false
86
+ if search_term == ""
87
+ puts "Error: No search term provided."
88
+ exit
89
+ end
90
+ nyaa.search search_term, !!options[:quiet]
78
91
  end
79
92
 
80
- if nyaa.download_count == 0
93
+ if nyaa.downloads.count == 0
81
94
  puts "No downloads found."
82
95
  exit
83
96
  end
@@ -86,6 +99,11 @@ require 'os'
86
99
  require 'highline/import'
87
100
 
88
101
  def prompt_to_open(torrents)
102
+ if torrents.count == 1
103
+ puts "Downloaded #{File.basename torrents[0]}."
104
+ else
105
+ puts "Downloaded #{torrents.count} torrent files."
106
+ end
89
107
  if agree "Open downloaded torrent#{"s" if torrents.count > 1}? (y/n): "
90
108
  if OS.mac?
91
109
  `open #{torrents.join " "}`
@@ -102,9 +120,9 @@ if options[:download_all]
102
120
  exit
103
121
  end
104
122
 
105
- if nyaa.download_count > 1
106
- prompt = "Download (1-#{nyaa.download_count}, 'a(ll)'"
107
- prompt << ", 'n(ew)'" if nyaa.new_count > 0 && !options[:find_new]
123
+ if nyaa.downloads.count > 1
124
+ prompt = "Download (1-#{nyaa.downloads.count}, 'a(ll)'"
125
+ prompt << ", 'n(ew)'" if nyaa.new_titles.count > 0 && !options[:find_new]
108
126
  prompt << ", or [ENTER] to cancel): "
109
127
  else
110
128
  if agree "Download? (y/n): "
@@ -120,7 +138,7 @@ while true
120
138
  if index == ""
121
139
  exit
122
140
  end
123
- if "new".match(/\A#{index}/) && nyaa.new_count > 0 && !options[:find_new]
141
+ if "new".match(/\A#{index}/) && nyaa.new_titles.count > 0 && !options[:find_new]
124
142
  prompt_to_open nyaa.download_all_new
125
143
  exit
126
144
  end
@@ -128,7 +146,7 @@ while true
128
146
  prompt_to_open nyaa.download_all
129
147
  exit
130
148
  end
131
- if (1..nyaa.download_count).include?(index.to_i)
149
+ if (1..nyaa.downloads.count).include?(index.to_i)
132
150
  prompt_to_open [nyaa.download_index(index.to_i-1)]
133
151
  exit
134
152
  end
@@ -1,3 +1,3 @@
1
1
  class NyaaAnime
2
- VERSION = "0.6.0"
2
+ VERSION = "0.7.0"
3
3
  end
data/nyaa_anime.gemspec CHANGED
@@ -23,6 +23,7 @@ Gem::Specification.new do |spec|
23
23
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
24
24
  spec.require_paths = ["lib"]
25
25
 
26
+ spec.add_runtime_dependency 'parallel', '~> 1.2', '>= 1.2.4'
26
27
  spec.add_runtime_dependency 'highline', '~> 1.6', '>= 1.6.21'
27
28
  spec.add_runtime_dependency 'nokogiri', '~> 1.6', '>= 1.6.2.1'
28
29
  spec.add_runtime_dependency 'colorize', '~> 0.7', '>= 0.7.3'
metadata CHANGED
@@ -1,15 +1,35 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nyaa_anime
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua Tsubaki Wu
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-20 00:00:00.000000000 Z
11
+ date: 2014-10-22 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: parallel
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.2'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 1.2.4
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '1.2'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 1.2.4
13
33
  - !ruby/object:Gem::Dependency
14
34
  name: highline
15
35
  requirement: !ruby/object:Gem::Requirement