nyaa_anime 0.7.0 → 0.8.2
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 +4 -4
- data/bin/nyaa_anime +5 -27
- data/lib/nyaa_anime.rb +55 -60
- data/lib/nyaa_anime/list.rb +16 -8
- data/lib/nyaa_anime/main.rb +39 -0
- data/lib/nyaa_anime/remove.rb +28 -15
- data/lib/nyaa_anime/search.rb +82 -50
- data/lib/nyaa_anime/version.rb +1 -1
- data/nyaa_anime.gemspec +0 -1
- metadata +3 -16
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 1ba7aa90f66024323a49d1989fdf783419e8bfd3
|
|
4
|
+
data.tar.gz: d6e20d46a46a18ef7545e153b38c34ee27884db6
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 5771be98e39ffeb8ebf1f2de2a28f6090bff8428fbc7e992195e301193e6870d42cd105e0f230d299d1e6a577cfb9b91de342f142c3372a64d433798a86fff55
|
|
7
|
+
data.tar.gz: 97927ef0ff0c716e27d8ae14cf9b99f9814c66d92e0dd602d01961ed8617934d122850893f94e7f441243133878187f6ae15a8418d5b77c9ca117a45d231c72b
|
data/bin/nyaa_anime
CHANGED
|
@@ -1,30 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env ruby
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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}"
|
|
19
|
-
else
|
|
20
|
-
puts "Usage: nyaa <command> [<args>]\n" <<
|
|
21
|
-
" nyaa_anime <command> [<args>]\n\n" <<
|
|
22
|
-
" If you like this tool, please donate via PayPal\n" <<
|
|
23
|
-
" to wujoshuawu@gmail.com to keep the developer afloat.\n\n" <<
|
|
24
|
-
"Commands:\n" <<
|
|
25
|
-
" search Search for and download anime\n" <<
|
|
26
|
-
" get Equivalent to `nyaa search -naq`\n" <<
|
|
27
|
-
" list List downloaded torrent files\n" <<
|
|
28
|
-
" remove Delete download torrent files from a series\n" <<
|
|
29
|
-
" help Get help about a command (`nyaa help <command>`)\n"
|
|
3
|
+
begin
|
|
4
|
+
require 'nyaa_anime/main'
|
|
5
|
+
rescue Interrupt
|
|
6
|
+
warn " - Aborted."
|
|
7
|
+
exit 1
|
|
30
8
|
end
|
data/lib/nyaa_anime.rb
CHANGED
|
@@ -6,7 +6,6 @@ class NyaaAnime
|
|
|
6
6
|
require 'nokogiri'
|
|
7
7
|
require 'cgi'
|
|
8
8
|
require 'colorize'
|
|
9
|
-
require 'levenshtein'
|
|
10
9
|
require 'set'
|
|
11
10
|
require 'fileutils'
|
|
12
11
|
require 'parallel'
|
|
@@ -16,8 +15,7 @@ class NyaaAnime
|
|
|
16
15
|
NYAA_SEARCH_DEFAULT = "#{NYAA_SEARCH}&cats=1_37&filter=2&term="
|
|
17
16
|
NYAA_DL_DIR = "#{Dir.home}/Downloads/nyaa/"
|
|
18
17
|
NYAA_ENTRIES_PER_PAGE = 100
|
|
19
|
-
MAX_PAGES =
|
|
20
|
-
TITLE_TOLERANCE_RANGE = (1..4)
|
|
18
|
+
MAX_PAGES = 20
|
|
21
19
|
NEW_COLOR = :green
|
|
22
20
|
ALREADY_DOWNLOADED_COLOR = :cyan
|
|
23
21
|
CL_WIDTH = 70
|
|
@@ -27,20 +25,19 @@ class NyaaAnime
|
|
|
27
25
|
|
|
28
26
|
FileUtils.mkdir_p NYAA_DL_DIR
|
|
29
27
|
|
|
30
|
-
def search(title
|
|
31
|
-
puts "Searching for \"#{title}\"..." unless quiet
|
|
28
|
+
def search(title)
|
|
32
29
|
@downloads = {}
|
|
33
30
|
@titles = []
|
|
34
31
|
url = "#{NYAA_SEARCH_DEFAULT}#{CGI.escape(title)}&offset="
|
|
35
32
|
titles = []
|
|
36
33
|
dl_urls = []
|
|
37
34
|
offset = 1
|
|
38
|
-
|
|
35
|
+
loop do
|
|
39
36
|
begin
|
|
40
37
|
results = Nokogiri::HTML(open("#{url}#{offset}")).css('item')
|
|
41
|
-
rescue SocketError
|
|
42
|
-
|
|
43
|
-
exit
|
|
38
|
+
rescue SocketError, EOFError
|
|
39
|
+
$stderr.print "Error: Could not connect to NyaaTorrents.\n"
|
|
40
|
+
exit 1
|
|
44
41
|
end
|
|
45
42
|
titles.concat results.css('title').map { |t| t.content }
|
|
46
43
|
dl_urls.concat results.css('link').map { |l| l.next.content }
|
|
@@ -49,13 +46,12 @@ class NyaaAnime
|
|
|
49
46
|
end
|
|
50
47
|
titles.each_with_index { |t, i| @downloads[t] = dl_urls[i] }
|
|
51
48
|
@titles = titles.sort!
|
|
52
|
-
categorize_titles
|
|
53
|
-
colorized_titles
|
|
54
|
-
nil
|
|
49
|
+
categorize_titles!
|
|
50
|
+
colorized_titles
|
|
55
51
|
end
|
|
56
52
|
|
|
57
53
|
def find_new_titles(quiet=false)
|
|
58
|
-
search_terms = NyaaAnime.
|
|
54
|
+
search_terms = NyaaAnime.distros_of_downloaded_titles
|
|
59
55
|
new_titles = Set.new
|
|
60
56
|
new_downloads = {}
|
|
61
57
|
count_s_size = "[/] ".size + search_terms.count.to_s.size * 2
|
|
@@ -66,89 +62,86 @@ class NyaaAnime
|
|
|
66
62
|
lock = Mutex.new
|
|
67
63
|
Parallel.each(search_terms, in_threads: THREAD_COUNT) do |t|
|
|
68
64
|
n = NyaaAnime.new
|
|
69
|
-
n.search t
|
|
65
|
+
n.search t
|
|
70
66
|
lock.synchronize do
|
|
71
67
|
new_titles.merge n.new_titles
|
|
72
68
|
n.new_titles.each { |ti| new_downloads[ti] = n.downloads[ti] }
|
|
73
69
|
if !quiet
|
|
74
70
|
msg = "/#{search_terms.count}] #{t[0...max_entry_size-count_s_size]}..." <<
|
|
75
71
|
("." * [max_entry_size - (count_s_size + t.size), 0].max) <<
|
|
76
|
-
(n.new_titles.any? ? "#{n.new_titles.count} found!".colorize(
|
|
72
|
+
(n.new_titles.any? ? "#{n.new_titles.count} found!".colorize(NEW_COLOR) : "none found.")
|
|
77
73
|
puts "[#{index.to_s.rjust(search_terms.count.to_s.size, "0")}#{msg}"
|
|
78
74
|
index += 1
|
|
79
75
|
end
|
|
80
76
|
end
|
|
81
77
|
end
|
|
82
78
|
@new_titles = new_titles
|
|
83
|
-
@titles = new_titles.to_a.sort!
|
|
84
79
|
@downloads = new_downloads
|
|
85
80
|
@already_downloaded_titles = Set.new
|
|
86
81
|
@version_differing_titles = Set.new
|
|
87
82
|
@other_titles = Set.new
|
|
88
|
-
|
|
89
|
-
puts "#{downloads.count} new episode#{"s" if downloads.count > 1} found!".colorize(:green)
|
|
90
|
-
end
|
|
91
|
-
@titles.each_with_index { |t, i| puts "#{i+1}: #{t.colorize(NEW_COLOR)}" }
|
|
83
|
+
@titles = new_titles.to_a.sort!
|
|
92
84
|
end
|
|
93
85
|
|
|
94
86
|
def colorized_titles
|
|
95
87
|
@titles.map do |t|
|
|
96
88
|
if @already_downloaded_titles.include? t
|
|
97
|
-
t.colorize
|
|
89
|
+
t.colorize ALREADY_DOWNLOADED_COLOR
|
|
98
90
|
elsif @new_titles.include? t
|
|
99
|
-
t.colorize
|
|
91
|
+
t.colorize NEW_COLOR
|
|
100
92
|
else
|
|
101
93
|
t
|
|
102
94
|
end
|
|
103
95
|
end
|
|
104
96
|
end
|
|
105
97
|
|
|
106
|
-
def categorize_titles
|
|
98
|
+
def categorize_titles!
|
|
107
99
|
@already_downloaded_titles = Set.new
|
|
108
100
|
@new_titles = Set.new
|
|
109
101
|
@other_titles = Set.new
|
|
110
102
|
@version_differing_titles = Set.new
|
|
111
103
|
dls = NyaaAnime.downloaded_torrents
|
|
104
|
+
downloaded_distros = NyaaAnime.distros_of_downloaded_titles
|
|
112
105
|
stripped_dls = NyaaAnime.stripped_downloaded_titles
|
|
113
|
-
hashless_dls = dls.map { |t| NyaaAnime.hashless_title t }
|
|
114
106
|
@titles.each do |t|
|
|
115
|
-
stripped_t = NyaaAnime.stripped_title t
|
|
116
|
-
hashless_t = NyaaAnime.hashless_title t
|
|
117
107
|
if dls.include? "#{t}.torrent"
|
|
118
108
|
@already_downloaded_titles.add t
|
|
109
|
+
elsif stripped_dls.include? NyaaAnime.stripped_title(t)
|
|
110
|
+
@version_differing_titles.add t
|
|
111
|
+
elsif downloaded_distros.include? NyaaAnime.distro_of_title(t)
|
|
112
|
+
@new_titles.add t
|
|
119
113
|
else
|
|
120
|
-
|
|
121
|
-
@version_differing_titles.add t
|
|
122
|
-
else
|
|
123
|
-
new_title_pushed = false
|
|
124
|
-
stripped_dls.each_with_index do |dlt, i|
|
|
125
|
-
dist = Levenshtein.distance(dlt, stripped_t)
|
|
126
|
-
if TITLE_TOLERANCE_RANGE.include? dist and
|
|
127
|
-
dist == Levenshtein.distance(hashless_dls[i], hashless_t)
|
|
128
|
-
@new_titles.add t
|
|
129
|
-
new_title_pushed = true
|
|
130
|
-
break
|
|
131
|
-
end
|
|
132
|
-
end
|
|
133
|
-
if !new_title_pushed
|
|
134
|
-
@other_titles.add t
|
|
135
|
-
end
|
|
136
|
-
end
|
|
114
|
+
@other_titles.add t
|
|
137
115
|
end
|
|
138
116
|
end
|
|
139
117
|
nil
|
|
140
118
|
end
|
|
141
119
|
|
|
142
120
|
def self.stripped_title(torrent)
|
|
143
|
-
torrent.sub(/(\s*\[\w*\])*(\.\w+)
|
|
121
|
+
torrent.gsub("_", " ").sub(/(\s*\[\w*\])*(\.\w+)*\z/, "")
|
|
144
122
|
end
|
|
145
123
|
|
|
146
124
|
def self.hashless_title(torrent)
|
|
147
|
-
torrent.sub(/(\s*\[\w{8}\])?(\.\w+)
|
|
125
|
+
torrent.gsub("_", " ").sub(/(\s*\[\w{8,}\])?(\.\w+)*\z/, "")
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def self.episode_of_title(torrent)
|
|
129
|
+
ep = NyaaAnime.hashless_title(torrent)[/\s+-\s+(\d+(\.\d+)?(v\d+)?-?)+\s*/, 1]
|
|
130
|
+
if ep.nil?
|
|
131
|
+
ep = NyaaAnime.hashless_title(torrent)[/\s+(\d+(\.\d+)?(v\d+)?-?)+\s*/, 1]
|
|
132
|
+
end
|
|
133
|
+
unless ep.nil?
|
|
134
|
+
ep.split("-").map { |e| e[/0*(\d+)/, 1] }
|
|
135
|
+
end
|
|
148
136
|
end
|
|
149
137
|
|
|
150
|
-
def self.
|
|
151
|
-
NyaaAnime.hashless_title(torrent).sub(/\s+-\s
|
|
138
|
+
def self.distro_of_title(torrent)
|
|
139
|
+
distro = NyaaAnime.hashless_title(torrent).sub!(/\s+-\s+(\d+(\.\d+)?(v\d+)?-?)+\s*/, " ")
|
|
140
|
+
if distro
|
|
141
|
+
distro
|
|
142
|
+
else
|
|
143
|
+
NyaaAnime.hashless_title(torrent).sub(/\s+(\d+(\.\d+)?(v\d+)?-?)+\s*/, " ")
|
|
144
|
+
end
|
|
152
145
|
end
|
|
153
146
|
|
|
154
147
|
def self.downloaded_torrents
|
|
@@ -161,41 +154,43 @@ class NyaaAnime
|
|
|
161
154
|
dls
|
|
162
155
|
end
|
|
163
156
|
|
|
164
|
-
def self.
|
|
157
|
+
def self.distros_of_downloaded_titles
|
|
165
158
|
dls = Set.new
|
|
166
|
-
NyaaAnime.downloaded_torrents.each { |t| dls.add NyaaAnime.
|
|
159
|
+
NyaaAnime.downloaded_torrents.each { |t| dls.add NyaaAnime.distro_of_title(t) }
|
|
167
160
|
dls
|
|
168
161
|
end
|
|
169
162
|
|
|
170
|
-
def self.
|
|
163
|
+
def self.torrents_by_distro(torrents)
|
|
171
164
|
dls = {}
|
|
172
|
-
|
|
165
|
+
torrents.each { |t| (dls[NyaaAnime.distro_of_title(t)] ||= []) << t }
|
|
173
166
|
dls
|
|
174
167
|
end
|
|
175
168
|
|
|
176
|
-
def
|
|
177
|
-
|
|
178
|
-
download(title)
|
|
179
|
-
end
|
|
169
|
+
def self.downloaded_torrents_by_distro
|
|
170
|
+
NyaaAnime.torrents_by_distro NyaaAnime.downloaded_torrents
|
|
180
171
|
end
|
|
181
172
|
|
|
182
|
-
def
|
|
173
|
+
def download_single(title)
|
|
183
174
|
torrent = open @downloads[title]
|
|
184
175
|
filename = torrent.meta["content-disposition"][/filename="(.+\.torrent)"/, 1]
|
|
185
176
|
open("#{NYAA_DL_DIR}#{filename}", "w") { |f| f.write torrent.read }
|
|
186
177
|
"#{NYAA_DL_DIR}\"#{title}.torrent\""
|
|
187
178
|
end
|
|
188
179
|
|
|
189
|
-
def
|
|
190
|
-
|
|
180
|
+
def download(titles)
|
|
181
|
+
if titles.is_a? Array
|
|
182
|
+
Parallel.map(titles) { |t| download_single(t) }.sort!
|
|
183
|
+
else
|
|
184
|
+
download_single titles
|
|
185
|
+
end
|
|
191
186
|
end
|
|
192
187
|
|
|
193
188
|
def download_all
|
|
194
|
-
|
|
189
|
+
download @titles
|
|
195
190
|
end
|
|
196
191
|
|
|
197
192
|
def download_all_new
|
|
198
|
-
|
|
193
|
+
download @new_titles
|
|
199
194
|
end
|
|
200
195
|
|
|
201
196
|
end
|
data/lib/nyaa_anime/list.rb
CHANGED
|
@@ -1,23 +1,31 @@
|
|
|
1
1
|
require 'optparse'
|
|
2
2
|
|
|
3
3
|
options = {}
|
|
4
|
-
OptionParser.new do |opts|
|
|
5
|
-
opts.banner = "Usage: nyaa list [-a]\n
|
|
4
|
+
option_parser = OptionParser.new do |opts|
|
|
5
|
+
opts.banner = "Usage: nyaa list [-a]\n" <<
|
|
6
|
+
" nyaa ls [-a]\n\n" <<
|
|
6
7
|
" If you like this tool, please donate via PayPal\n" <<
|
|
7
8
|
" to wujoshuawu@gmail.com to keep the developer afloat.\n\n"
|
|
8
9
|
|
|
9
10
|
opts.on("-a", "--all", "List all individual files") do
|
|
10
11
|
options[:list_all] = true
|
|
11
12
|
end
|
|
12
|
-
end
|
|
13
|
+
end
|
|
14
|
+
begin
|
|
15
|
+
option_parser.parse!
|
|
16
|
+
rescue OptionParser::InvalidOption => e
|
|
17
|
+
warn e
|
|
18
|
+
puts option_parser
|
|
19
|
+
exit 1
|
|
20
|
+
end
|
|
13
21
|
|
|
14
22
|
require 'nyaa_anime'
|
|
15
23
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
puts "#{idx+1}: #{
|
|
24
|
+
dt_ds = NyaaAnime.downloaded_torrents_by_distro
|
|
25
|
+
ds = dt_ds.keys.sort!
|
|
26
|
+
ds.each_with_index do |distro, idx|
|
|
27
|
+
puts "#{idx+1}: #{distro}"
|
|
20
28
|
if options[:list_all]
|
|
21
|
-
|
|
29
|
+
dt_ds[distro].each { |torrent| puts " #{torrent}" }
|
|
22
30
|
end
|
|
23
31
|
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
scripts = ["search", "list", "remove"]
|
|
2
|
+
|
|
3
|
+
aliases = { "s"=>"search", "g"=>"get", "ls"=>"list", "rm"=>"remove", "h"=>"help" }
|
|
4
|
+
if command = aliases[ARGV[0]]
|
|
5
|
+
ARGV[0] = command
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
if ARGV[0] == "get"
|
|
9
|
+
ARGV[0], ARGV[1] = "search", "-naq"
|
|
10
|
+
elsif ARGV[0] == "help" && ARGV[1]
|
|
11
|
+
if command = aliases[ARGV[1]]
|
|
12
|
+
ARGV[1] = command
|
|
13
|
+
end
|
|
14
|
+
if scripts.include? ARGV[1]
|
|
15
|
+
ARGV[0], ARGV[1] = ARGV[1], "--help"
|
|
16
|
+
else
|
|
17
|
+
warn "Error: No such command \"#{ARGV[1]}\"."
|
|
18
|
+
exit 1
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
script = ARGV[0]
|
|
23
|
+
if scripts.include? script
|
|
24
|
+
require "nyaa_anime/#{script}"
|
|
25
|
+
else
|
|
26
|
+
warn "Error: No such command \"#{ARGV[0]}\"."
|
|
27
|
+
puts "Usage: nyaa <command> [<args>]\n" <<
|
|
28
|
+
" nyaa_anime <command> [<args>]\n\n" <<
|
|
29
|
+
" If you like this tool, please donate via PayPal\n" <<
|
|
30
|
+
" to wujoshuawu@gmail.com to keep the developer afloat.\n\n" <<
|
|
31
|
+
"Commands:\n" <<
|
|
32
|
+
" search s Search for and download anime\n" <<
|
|
33
|
+
" get g Equivalent to `nyaa search -naq`\n" <<
|
|
34
|
+
" list ls List downloaded torrent files\n" <<
|
|
35
|
+
" remove rm Delete downloaded torrent files from a\n" <<
|
|
36
|
+
" distribution of an anime series\n" <<
|
|
37
|
+
" help h Get help about a command\n" <<
|
|
38
|
+
" (`nyaa help <command>`)\n"
|
|
39
|
+
end
|
data/lib/nyaa_anime/remove.rb
CHANGED
|
@@ -3,8 +3,9 @@ require 'optparse'
|
|
|
3
3
|
ARGV[1] ||= "--help"
|
|
4
4
|
|
|
5
5
|
options = {}
|
|
6
|
-
OptionParser.new do |opts|
|
|
6
|
+
option_parser = OptionParser.new do |opts|
|
|
7
7
|
opts.banner = "Usage: nyaa remove <anime>\n" <<
|
|
8
|
+
" nyaa rm ...\n" <<
|
|
8
9
|
" nyaa remove -n <index>\n" <<
|
|
9
10
|
" nyaa remove -a\n\n" <<
|
|
10
11
|
" If you like this tool, please donate via PayPal\n" <<
|
|
@@ -14,18 +15,25 @@ OptionParser.new do |opts|
|
|
|
14
15
|
options[:remove_all] = true
|
|
15
16
|
end
|
|
16
17
|
|
|
17
|
-
opts.on("-n", "--number [N]", "Remove torrents of
|
|
18
|
-
|
|
18
|
+
opts.on("-n", "--number [N]", "Remove torrents of an anime distribution",
|
|
19
|
+
"as numbered by `nyaa list`") do |n|
|
|
19
20
|
options[:number] = n.to_i
|
|
20
21
|
end
|
|
21
|
-
end
|
|
22
|
+
end
|
|
23
|
+
begin
|
|
24
|
+
option_parser.parse!
|
|
25
|
+
rescue OptionParser::InvalidOption => e
|
|
26
|
+
warn e
|
|
27
|
+
puts option_parser
|
|
28
|
+
exit 1
|
|
29
|
+
end
|
|
22
30
|
|
|
23
31
|
require 'nyaa_anime'
|
|
24
32
|
|
|
25
|
-
|
|
26
|
-
|
|
33
|
+
TORRENTS_BY_DISTRO = NyaaAnime.downloaded_torrents_by_distro
|
|
34
|
+
ds = TORRENTS_BY_DISTRO.keys.sort!
|
|
27
35
|
|
|
28
|
-
if
|
|
36
|
+
if ds.size == 0
|
|
29
37
|
puts "No files in #{NyaaAnime::NYAA_DL_DIR}."
|
|
30
38
|
end
|
|
31
39
|
|
|
@@ -39,23 +47,28 @@ if options[:remove_all]
|
|
|
39
47
|
exit
|
|
40
48
|
end
|
|
41
49
|
|
|
42
|
-
def
|
|
43
|
-
ts =
|
|
44
|
-
if agree "Delete all #{ts.size} torrent files for #{
|
|
50
|
+
def delete_distro(distro)
|
|
51
|
+
ts = TORRENTS_BY_DISTRO[distro].map { |t| "#{NyaaAnime::NYAA_DL_DIR}#{t}" }
|
|
52
|
+
if agree "Delete all #{ts.size} torrent files for #{distro}? (y/n) "
|
|
45
53
|
File.delete(*ts)
|
|
46
54
|
end
|
|
47
55
|
end
|
|
48
56
|
|
|
49
57
|
if options[:number]
|
|
50
58
|
num = options[:number]
|
|
51
|
-
if (1..
|
|
52
|
-
|
|
59
|
+
if (1..ds.size).include? num
|
|
60
|
+
delete_distro ds[num-1]
|
|
53
61
|
else
|
|
54
|
-
|
|
62
|
+
warn "Error: Number (#{num}) out of range 1-#{ds.size}."
|
|
63
|
+
exit 1
|
|
55
64
|
end
|
|
56
65
|
exit
|
|
57
66
|
end
|
|
58
67
|
|
|
59
68
|
term = ARGV[1..-1].join " "
|
|
60
|
-
|
|
61
|
-
|
|
69
|
+
ds = TORRENTS_BY_DISTRO.keys.select { |distro| !!distro[/#{term}/i] }
|
|
70
|
+
if ds.count == 0
|
|
71
|
+
warn "Error: No torrent files matching \"#{term}\"."
|
|
72
|
+
exit 1
|
|
73
|
+
end
|
|
74
|
+
ds.each { |distro| delete_distro distro }
|
data/lib/nyaa_anime/search.rb
CHANGED
|
@@ -13,12 +13,17 @@ require 'optparse'
|
|
|
13
13
|
ARGV[1] ||= "--help"
|
|
14
14
|
|
|
15
15
|
options = {}
|
|
16
|
-
OptionParser.new do |opts|
|
|
16
|
+
option_parser = OptionParser.new do |opts|
|
|
17
17
|
opts.banner = "Usage: nyaa search [options] <anime>\n" <<
|
|
18
|
+
" nyaa s [options] <anime>\n" <<
|
|
18
19
|
" nyaa get (equivalent to `nyaa search -naq`)\n\n" <<
|
|
19
20
|
" If you like this tool, please donate via PayPal\n" <<
|
|
20
21
|
" to wujoshuawu@gmail.com to keep the developer afloat.\n\n"
|
|
21
22
|
|
|
23
|
+
opts.on("-i", "--individual", "List all results individually") do
|
|
24
|
+
options[:list_individually] = true
|
|
25
|
+
end
|
|
26
|
+
|
|
22
27
|
opts.on("-n", "--new", "Find all new episodes of",
|
|
23
28
|
"previously downloaded anime") do
|
|
24
29
|
options[:find_new] = true
|
|
@@ -49,7 +54,7 @@ OptionParser.new do |opts|
|
|
|
49
54
|
if FANSUBBERS[f]
|
|
50
55
|
options[:subber] = FANSUBBERS[f]
|
|
51
56
|
elsif f.nil?
|
|
52
|
-
|
|
57
|
+
warn "Error: Expected [FANSUBBER] with the -f option"
|
|
53
58
|
ARGV.push "--help"
|
|
54
59
|
else
|
|
55
60
|
options[:subber] = f
|
|
@@ -60,45 +65,76 @@ OptionParser.new do |opts|
|
|
|
60
65
|
"`--fansubber=#{SPEEDSUBBER}`") do
|
|
61
66
|
options[:subber] = SPEEDSUBBER
|
|
62
67
|
end
|
|
63
|
-
end
|
|
68
|
+
end
|
|
69
|
+
begin
|
|
70
|
+
option_parser.parse!
|
|
71
|
+
rescue OptionParser::InvalidOption => e
|
|
72
|
+
warn e
|
|
73
|
+
puts option_parser
|
|
74
|
+
exit 1
|
|
75
|
+
end
|
|
64
76
|
|
|
65
77
|
if !options[:download_all]
|
|
66
78
|
options[:quiet] = false
|
|
67
79
|
end
|
|
68
80
|
|
|
69
81
|
require 'nyaa_anime'
|
|
82
|
+
require 'colorize'
|
|
70
83
|
nyaa = NyaaAnime.new
|
|
71
84
|
|
|
72
85
|
if options[:find_new]
|
|
73
|
-
nyaa.find_new_titles !!options[:quiet]
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
86
|
+
titles = nyaa.find_new_titles !!options[:quiet]
|
|
87
|
+
if nyaa.downloads.count == 0
|
|
88
|
+
puts "No new episodes found."
|
|
89
|
+
exit
|
|
77
90
|
else
|
|
78
|
-
|
|
91
|
+
puts "#{nyaa.downloads.count} new episode#{"s" if nyaa.downloads.count > 1} found!".colorize(NyaaAnime::NEW_COLOR)
|
|
92
|
+
titles.each_with_index { |t, i| puts "#{i+1}: #{t.colorize(NyaaAnime::NEW_COLOR)}" }
|
|
79
93
|
end
|
|
80
|
-
|
|
81
|
-
|
|
94
|
+
else
|
|
95
|
+
search_term = ARGV[1..-1].join " "
|
|
96
|
+
search_term = "[#{options[:subber]}] #{search_term}" if options[:subber]
|
|
97
|
+
search_term += " #{options[:resolution]}" if options[:resolution]
|
|
98
|
+
if search_term == ""
|
|
99
|
+
warn "Error: No search term provided."
|
|
100
|
+
exit 1
|
|
82
101
|
end
|
|
83
|
-
|
|
84
|
-
|
|
102
|
+
puts "Searching for \"#{search_term}\"..." unless options[:quiet]
|
|
103
|
+
results = nyaa.search search_term
|
|
104
|
+
if options[:list_individually]
|
|
105
|
+
results.each_with_index { |t, i| puts "#{i+1}: #{NyaaAnime.hashless_title t}" } unless options[:quiet]
|
|
106
|
+
else
|
|
107
|
+
results = NyaaAnime.torrents_by_distro results
|
|
108
|
+
unless options[:quiet]
|
|
109
|
+
results.keys.sort!.each_with_index do |ds, i|
|
|
110
|
+
if results[ds].count == 1
|
|
111
|
+
puts "#{i+1}: #{NyaaAnime.hashless_title ds}"
|
|
112
|
+
next
|
|
113
|
+
end
|
|
114
|
+
first_ep = NyaaAnime.episode_of_title(results[ds].first)
|
|
115
|
+
last_ep = NyaaAnime.episode_of_title(results[ds].last)
|
|
116
|
+
if first_ep && last_ep
|
|
117
|
+
ep_tag = "(#{first_ep.first}~#{last_ep.last})"
|
|
118
|
+
else
|
|
119
|
+
ep_tag = "(#{results[ds].count} torrent#{"s" if results[ds].count > 1})"
|
|
120
|
+
end
|
|
121
|
+
puts "#{i+1}: #{ep_tag.bold} #{ds}"
|
|
122
|
+
end
|
|
123
|
+
end
|
|
85
124
|
end
|
|
86
|
-
if
|
|
87
|
-
puts "
|
|
125
|
+
if nyaa.downloads.count == 0
|
|
126
|
+
puts "No results for \"#{search_term}\"."
|
|
88
127
|
exit
|
|
128
|
+
else
|
|
129
|
+
puts "#{nyaa.downloads.count} result#{"s" if nyaa.downloads.count > 1}, #{nyaa.new_titles.count} new."
|
|
89
130
|
end
|
|
90
|
-
nyaa.search search_term, !!options[:quiet]
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
if nyaa.downloads.count == 0
|
|
94
|
-
puts "No downloads found."
|
|
95
|
-
exit
|
|
96
131
|
end
|
|
97
132
|
|
|
98
133
|
require 'os'
|
|
99
134
|
require 'highline/import'
|
|
100
135
|
|
|
101
136
|
def prompt_to_open(torrents)
|
|
137
|
+
torrents = [torrents] unless torrents.is_a? Array
|
|
102
138
|
if torrents.count == 1
|
|
103
139
|
puts "Downloaded #{File.basename torrents[0]}."
|
|
104
140
|
else
|
|
@@ -120,37 +156,33 @@ if options[:download_all]
|
|
|
120
156
|
exit
|
|
121
157
|
end
|
|
122
158
|
|
|
123
|
-
if
|
|
124
|
-
prompt = "Download (1-#{
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
159
|
+
if results.count > 1
|
|
160
|
+
prompt = "Download (1-#{results.count}, 'a(ll)'" <<
|
|
161
|
+
"#{", 'n(ew)'" if nyaa.new_titles.count > 0 && !options[:find_new]}" <<
|
|
162
|
+
", or [ENTER] to cancel): "
|
|
163
|
+
choice = ask(prompt) do |q|
|
|
164
|
+
q.validate = Proc.new do |input|
|
|
165
|
+
input == "" ||
|
|
166
|
+
("new"[/\A#{input}/i] && nyaa.new_titles.count > 0 && !options[:find_new]) ||
|
|
167
|
+
"all"[/\A#{input}/i] ||
|
|
168
|
+
(1..results.count).include?(input.to_i)
|
|
169
|
+
end
|
|
170
|
+
q.responses[:not_valid] = ""
|
|
130
171
|
end
|
|
131
|
-
exit
|
|
132
|
-
end
|
|
133
172
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
end
|
|
149
|
-
if (1..nyaa.downloads.count).include?(index.to_i)
|
|
150
|
-
prompt_to_open [nyaa.download_index(index.to_i-1)]
|
|
151
|
-
exit
|
|
152
|
-
end
|
|
153
|
-
rescue RegexpError
|
|
154
|
-
next
|
|
173
|
+
if choice == ""
|
|
174
|
+
elsif choice[/\An/i]
|
|
175
|
+
prompt_to_open nyaa.download_all_new
|
|
176
|
+
elsif choice[/\Aa/i]
|
|
177
|
+
prompt_to_open nyaa.download_all
|
|
178
|
+
else
|
|
179
|
+
torrent = results.is_a?(Array) ? results[choice.to_i-1] : results[results.keys.sort![choice.to_i-1]]
|
|
180
|
+
prompt_to_open nyaa.download(torrent)
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
else
|
|
184
|
+
if agree "Download? (y/n): "
|
|
185
|
+
torrent = results.is_a?(Array) ? results.first : results.values.first
|
|
186
|
+
prompt_to_open nyaa.download(torrent)
|
|
155
187
|
end
|
|
156
188
|
end
|
data/lib/nyaa_anime/version.rb
CHANGED
data/nyaa_anime.gemspec
CHANGED
|
@@ -27,7 +27,6 @@ Gem::Specification.new do |spec|
|
|
|
27
27
|
spec.add_runtime_dependency 'highline', '~> 1.6', '>= 1.6.21'
|
|
28
28
|
spec.add_runtime_dependency 'nokogiri', '~> 1.6', '>= 1.6.2.1'
|
|
29
29
|
spec.add_runtime_dependency 'colorize', '~> 0.7', '>= 0.7.3'
|
|
30
|
-
spec.add_runtime_dependency 'levenshtein-ffi', '~> 1.1'
|
|
31
30
|
spec.add_runtime_dependency 'os', '~> 0.9', '>=0.9.6'
|
|
32
31
|
|
|
33
32
|
spec.add_development_dependency "bundler", "~> 1.6"
|
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: nyaa_anime
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.8.2
|
|
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-
|
|
11
|
+
date: 2014-10-23 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: parallel
|
|
@@ -90,20 +90,6 @@ dependencies:
|
|
|
90
90
|
- - ">="
|
|
91
91
|
- !ruby/object:Gem::Version
|
|
92
92
|
version: 0.7.3
|
|
93
|
-
- !ruby/object:Gem::Dependency
|
|
94
|
-
name: levenshtein-ffi
|
|
95
|
-
requirement: !ruby/object:Gem::Requirement
|
|
96
|
-
requirements:
|
|
97
|
-
- - "~>"
|
|
98
|
-
- !ruby/object:Gem::Version
|
|
99
|
-
version: '1.1'
|
|
100
|
-
type: :runtime
|
|
101
|
-
prerelease: false
|
|
102
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
103
|
-
requirements:
|
|
104
|
-
- - "~>"
|
|
105
|
-
- !ruby/object:Gem::Version
|
|
106
|
-
version: '1.1'
|
|
107
93
|
- !ruby/object:Gem::Dependency
|
|
108
94
|
name: os
|
|
109
95
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -177,6 +163,7 @@ files:
|
|
|
177
163
|
- bin/nyaa_anime
|
|
178
164
|
- lib/nyaa_anime.rb
|
|
179
165
|
- lib/nyaa_anime/list.rb
|
|
166
|
+
- lib/nyaa_anime/main.rb
|
|
180
167
|
- lib/nyaa_anime/remove.rb
|
|
181
168
|
- lib/nyaa_anime/search.rb
|
|
182
169
|
- lib/nyaa_anime/version.rb
|