nyaa_anime 0.6.0 → 0.7.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.
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