nyaa 1.0.2 → 1.0.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +0 -6
- data/bin/nyaa +23 -36
- data/lib/nyaa.rb +1 -4
- data/lib/nyaa/cli.rb +0 -4
- data/lib/nyaa/constants.rb +0 -1
- data/lib/nyaa/downloader.rb +3 -3
- data/lib/nyaa/search.rb +3 -4
- data/lib/nyaa/version.rb +1 -1
- data/nyaa.gemspec +0 -2
- metadata +2 -38
- data/lib/nyaa/browser.rb +0 -171
- data/screenshots/screenshot_1.png +0 -0
- data/screenshots/screenshot_2.png +0 -0
- data/screenshots/screenshot_3.png +0 -0
data/README.md
CHANGED
@@ -37,12 +37,6 @@ For a list of categories and filters, see `nyaa -h`.
|
|
37
37
|
|
38
38
|
![](https://github.com/mistofvongola/nyaa/raw/master/screenshots/v1.0.0_help.png)
|
39
39
|
|
40
|
-
## The old interface
|
41
|
-
|
42
|
-
The old nyaa interface is deprecated, but is still included. You can use the old interface using the `--classic` option.
|
43
|
-
|
44
|
-
![](https://github.com/mistofvongola/nyaa/raw/master/screenshots/screenshot_1.png)
|
45
|
-
|
46
40
|
## Contributing
|
47
41
|
1. Fork it
|
48
42
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
data/bin/nyaa
CHANGED
@@ -19,15 +19,6 @@ def batch_mode
|
|
19
19
|
exit
|
20
20
|
end
|
21
21
|
|
22
|
-
def browser_mode
|
23
|
-
begin
|
24
|
-
nyaa = Nyaa::Browser.new(@opts, @search)
|
25
|
-
rescue Interrupt
|
26
|
-
puts "\nInterrupt received. Exiting."
|
27
|
-
exit
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
22
|
def curses_mode
|
32
23
|
begin
|
33
24
|
yield
|
@@ -42,35 +33,31 @@ if @opts[:batch]
|
|
42
33
|
batch_mode
|
43
34
|
end
|
44
35
|
|
45
|
-
|
46
|
-
|
47
|
-
else
|
48
|
-
nyaa = Nyaa::UI.new(@opts, @search)
|
49
|
-
cursor = 1
|
36
|
+
nyaa = Nyaa::UI.new(@opts, @search)
|
37
|
+
cursor = 1
|
50
38
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
39
|
+
curses_mode do
|
40
|
+
#TODO: Gracefully handle window resizing
|
41
|
+
#Signal.trap('SIGWINCH', nyaa.status("Window size changed!", :failure))
|
42
|
+
loop do
|
43
|
+
nyaa.header
|
44
|
+
nyaa.status
|
45
|
+
nyaa.footer
|
46
|
+
nyaa.menu(cursor)
|
47
|
+
refresh
|
60
48
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
end
|
49
|
+
case getch
|
50
|
+
when Key::UP then cursor = nyaa.move(cursor, -1)
|
51
|
+
when Key::DOWN then cursor = nyaa.move(cursor, 1)
|
52
|
+
when 'k' then cursor = nyaa.move(cursor, -1)
|
53
|
+
when 'j' then cursor = nyaa.move(cursor, 1)
|
54
|
+
when '?' then nyaa.status('help not implemented!', :failure)
|
55
|
+
when 'g' then nyaa.get(cursor)
|
56
|
+
when 'i' then nyaa.open(cursor)
|
57
|
+
when 'n' then nyaa.next_page
|
58
|
+
when 'p' then nyaa.prev_page
|
59
|
+
when 'q' then @search.purge && break
|
60
|
+
#when Key::RESIZE then nyaa.status("Window size changed!", :failure)
|
74
61
|
end
|
75
62
|
end
|
76
63
|
end
|
data/lib/nyaa.rb
CHANGED
@@ -9,8 +9,6 @@ require 'curses'
|
|
9
9
|
begin
|
10
10
|
require 'rubygems' # for ruby 1.8 compat
|
11
11
|
require 'nokogiri'
|
12
|
-
require 'rest_client'
|
13
|
-
require 'formatador'
|
14
12
|
rescue LoadError => e
|
15
13
|
puts "LoadError: #{e.message}"
|
16
14
|
end
|
@@ -23,6 +21,5 @@ require 'nyaa/torrent'
|
|
23
21
|
require 'nyaa/search'
|
24
22
|
|
25
23
|
# internal tools
|
26
|
-
require 'nyaa/
|
27
|
-
require 'nyaa/ui' # new ui
|
24
|
+
require 'nyaa/ui'
|
28
25
|
require 'nyaa/downloader'
|
data/lib/nyaa/cli.rb
CHANGED
@@ -28,10 +28,6 @@ module Nyaa
|
|
28
28
|
@config[:batch] = batch
|
29
29
|
end
|
30
30
|
|
31
|
-
opt.on('-t', '--classic', 'Use the old interface (deprecated)') do |classic|
|
32
|
-
@config[:classic] = classic
|
33
|
-
end
|
34
|
-
|
35
31
|
opt.on('-v', '--version', 'Print version info') do
|
36
32
|
puts "nyaa #{Nyaa::VERSION}"
|
37
33
|
puts "Copyright (c) 2013 David Palma"
|
data/lib/nyaa/constants.rb
CHANGED
data/lib/nyaa/downloader.rb
CHANGED
@@ -17,7 +17,7 @@ module Nyaa
|
|
17
17
|
def save
|
18
18
|
unless @fail
|
19
19
|
File.open("#{self.destination}/#{filename}", 'w') do |f|
|
20
|
-
f.write(self.response.
|
20
|
+
f.write(self.response.read)
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
@@ -30,7 +30,7 @@ module Nyaa
|
|
30
30
|
|
31
31
|
def request
|
32
32
|
begin
|
33
|
-
response =
|
33
|
+
response = open(self.target)
|
34
34
|
rescue StandardError => e
|
35
35
|
if retries > 0
|
36
36
|
retries -= 1
|
@@ -46,7 +46,7 @@ module Nyaa
|
|
46
46
|
# Filename from Content Disposition Header Field
|
47
47
|
# http://www.ietf.org/rfc/rfc2183.txt
|
48
48
|
def name_from_disposition
|
49
|
-
disp = self.response.
|
49
|
+
disp = self.response.meta['content-disposition']
|
50
50
|
disp_filename = disp.split(/;\s+/).select { |v| v =~ /filename\s*=/ }[0]
|
51
51
|
re = /([""'])(?:(?=(\\?))\2.)*?\1/
|
52
52
|
if re.match(disp_filename)
|
data/lib/nyaa/search.rb
CHANGED
@@ -34,13 +34,11 @@ module Nyaa
|
|
34
34
|
self.offset += 1
|
35
35
|
if self.results.length < self.count
|
36
36
|
extract(self.offset)
|
37
|
-
else
|
38
|
-
self.results = []
|
39
|
-
puts "No more results"
|
40
37
|
end
|
41
38
|
self
|
42
39
|
end
|
43
40
|
|
41
|
+
# TODO: Deprecated function
|
44
42
|
def cached(page)
|
45
43
|
cachefile = "#{self.cachedir}/cache_#{self.runid}_p#{page}"
|
46
44
|
p cachefile
|
@@ -63,6 +61,7 @@ module Nyaa
|
|
63
61
|
|
64
62
|
private
|
65
63
|
|
64
|
+
# TODO: Deprecated function
|
66
65
|
def dump(page, results)
|
67
66
|
cachefile = "cache_#{self.runid}_p#{page}"
|
68
67
|
File.open("#{self.cachedir}/#{cachefile}", 'wb') do |file|
|
@@ -99,7 +98,7 @@ module Nyaa
|
|
99
98
|
self.count = doc.css('span.notice').text.match(/\d+/).to_s.to_i
|
100
99
|
rows = doc.css('div#main div.content table.tlist tr.tlistrow')
|
101
100
|
rows.each { |row| self.results << Torrent.new(row) }
|
102
|
-
dump(page, self.results)
|
101
|
+
#dump(page, self.results)
|
103
102
|
#dump_json(page, self.results)
|
104
103
|
end
|
105
104
|
|
data/lib/nyaa/version.rb
CHANGED
data/nyaa.gemspec
CHANGED
@@ -15,7 +15,5 @@ Gem::Specification.new do |s|
|
|
15
15
|
s.executables = s.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
16
16
|
s.require_path = ['lib']
|
17
17
|
|
18
|
-
s.add_runtime_dependency 'formatador', '~> 0.2.3'
|
19
18
|
s.add_runtime_dependency 'nokogiri', '~> 1.5.5'
|
20
|
-
s.add_runtime_dependency 'rest-client', '~> 1.6.7'
|
21
19
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nyaa
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.3
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,24 +9,8 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-02-
|
12
|
+
date: 2013-02-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
|
-
- !ruby/object:Gem::Dependency
|
15
|
-
name: formatador
|
16
|
-
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
|
-
requirements:
|
19
|
-
- - ~>
|
20
|
-
- !ruby/object:Gem::Version
|
21
|
-
version: 0.2.3
|
22
|
-
type: :runtime
|
23
|
-
prerelease: false
|
24
|
-
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
|
-
requirements:
|
27
|
-
- - ~>
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: 0.2.3
|
30
14
|
- !ruby/object:Gem::Dependency
|
31
15
|
name: nokogiri
|
32
16
|
requirement: !ruby/object:Gem::Requirement
|
@@ -43,22 +27,6 @@ dependencies:
|
|
43
27
|
- - ~>
|
44
28
|
- !ruby/object:Gem::Version
|
45
29
|
version: 1.5.5
|
46
|
-
- !ruby/object:Gem::Dependency
|
47
|
-
name: rest-client
|
48
|
-
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
|
-
requirements:
|
51
|
-
- - ~>
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: 1.6.7
|
54
|
-
type: :runtime
|
55
|
-
prerelease: false
|
56
|
-
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
|
-
requirements:
|
59
|
-
- - ~>
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: 1.6.7
|
62
30
|
description: Browse and download from NyaaTorrents from the command-line. Supports
|
63
31
|
categories and filters.
|
64
32
|
email: david@davidpalma.me
|
@@ -74,7 +42,6 @@ files:
|
|
74
42
|
- Rakefile
|
75
43
|
- bin/nyaa
|
76
44
|
- lib/nyaa.rb
|
77
|
-
- lib/nyaa/browser.rb
|
78
45
|
- lib/nyaa/cli.rb
|
79
46
|
- lib/nyaa/constants.rb
|
80
47
|
- lib/nyaa/downloader.rb
|
@@ -83,9 +50,6 @@ files:
|
|
83
50
|
- lib/nyaa/ui.rb
|
84
51
|
- lib/nyaa/version.rb
|
85
52
|
- nyaa.gemspec
|
86
|
-
- screenshots/screenshot_1.png
|
87
|
-
- screenshots/screenshot_2.png
|
88
|
-
- screenshots/screenshot_3.png
|
89
53
|
- screenshots/v1.0.0_browse.png
|
90
54
|
- screenshots/v1.0.0_help.png
|
91
55
|
- screenshots/v1.0.0_search.png
|
data/lib/nyaa/browser.rb
DELETED
@@ -1,171 +0,0 @@
|
|
1
|
-
# -*- encoding : utf-8 -*-
|
2
|
-
module Nyaa
|
3
|
-
class Browser
|
4
|
-
def initialize(opts, search)
|
5
|
-
@opts = opts
|
6
|
-
@opts[:size] = 4 if opts[:size].nil?
|
7
|
-
@opts[:size] = PSIZE if opts[:size] > PSIZE
|
8
|
-
@opts[:size] = 1 if opts[:size] <= 1
|
9
|
-
@marker = 0
|
10
|
-
@format = Formatador.new
|
11
|
-
@page = 0 # Current browser page
|
12
|
-
@search = search
|
13
|
-
start
|
14
|
-
end
|
15
|
-
|
16
|
-
def start
|
17
|
-
#@search = Search.new(@opts[:query], @opts[:category], @opts[:filter])
|
18
|
-
page_results = @search.more.get_results
|
19
|
-
@page += 1
|
20
|
-
part = partition(page_results, 0, @opts[:size])
|
21
|
-
screen(page_results, part)
|
22
|
-
end
|
23
|
-
|
24
|
-
def partition(ary, start, size)
|
25
|
-
start = 0 if start < 0
|
26
|
-
@marker = start
|
27
|
-
size = PSIZE if size > PSIZE
|
28
|
-
part = ary[start, size]
|
29
|
-
part = [] if part.nil?
|
30
|
-
part
|
31
|
-
end
|
32
|
-
|
33
|
-
def torrent_info(page_results, torrent)
|
34
|
-
case torrent.status
|
35
|
-
when 'A+' then flag = 'blue'
|
36
|
-
when 'Trusted' then flag = 'green'
|
37
|
-
when 'Remake' then flag = 'red'
|
38
|
-
else flag = 'yellow'
|
39
|
-
end
|
40
|
-
|
41
|
-
@format.display_line("#{page_results.index(torrent)+1}. "\
|
42
|
-
"#{torrent.name[0..70]}[/]")
|
43
|
-
@format.indent {
|
44
|
-
@format.display_line(
|
45
|
-
"[bold]Size: [purple]#{torrent.filesize}[/] "\
|
46
|
-
"[bold]SE: [green]#{torrent.seeders}[/] "\
|
47
|
-
"[bold]LE: [red]#{torrent.leechers}[/] "\
|
48
|
-
"[bold]DLs: [yellow]#{torrent.downloads}[/] "\
|
49
|
-
"[bold]Msg: [blue]#{torrent.comments}[/]")
|
50
|
-
@format.display_line("[bold]DL:[/] [#{flag}]#{torrent.link}[/]")
|
51
|
-
}
|
52
|
-
end
|
53
|
-
|
54
|
-
def header_info
|
55
|
-
@format.display_line( "\t[yellow]NyaaTorrents >> "\
|
56
|
-
"Browse | Anime, manga, and music[/]\n" )
|
57
|
-
@format.display_line(
|
58
|
-
"[bold]#{CATS[@opts[:category].to_sym][:title]}\n[/]" )
|
59
|
-
end
|
60
|
-
|
61
|
-
def footer_info
|
62
|
-
start_count = @marker + 1
|
63
|
-
start_count = PSIZE if start_count > PSIZE
|
64
|
-
end_count = @marker + @opts[:size]
|
65
|
-
end_count = PSIZE if end_count > PSIZE
|
66
|
-
|
67
|
-
@format.display_line("\n\t[yellow]Displaying results "\
|
68
|
-
"#{start_count} through #{end_count} of #{PSIZE} "\
|
69
|
-
"(Page ##{@page})\n")
|
70
|
-
end
|
71
|
-
|
72
|
-
def screen(page_results, screen_items)
|
73
|
-
header_info
|
74
|
-
|
75
|
-
if screen_items.empty?
|
76
|
-
@format.display_line( "[normal]End of results.")
|
77
|
-
@format.display_line("For more search options, see --help.[/]\n")
|
78
|
-
exit
|
79
|
-
end
|
80
|
-
|
81
|
-
screen_items.each do |torrent|
|
82
|
-
torrent_info(page_results, torrent)
|
83
|
-
end
|
84
|
-
|
85
|
-
footer_info
|
86
|
-
prompt(page_results, screen_items)
|
87
|
-
end
|
88
|
-
|
89
|
-
def prompt(page_results, screen_items)
|
90
|
-
@format.display_line("[yellow]Help: q to quit, "\
|
91
|
-
"h for display help, "\
|
92
|
-
"n/p for pagination, "\
|
93
|
-
"or a number to download that choice.")
|
94
|
-
@format.display("[bold]>[/] ")
|
95
|
-
|
96
|
-
choice = STDIN.gets
|
97
|
-
if choice.nil?
|
98
|
-
choice = ' '
|
99
|
-
else
|
100
|
-
choice.strip
|
101
|
-
end
|
102
|
-
|
103
|
-
case
|
104
|
-
when choice[0] == 'q' then @search.purge && exit
|
105
|
-
when choice[0] == 'n' then paginate(page_results)
|
106
|
-
when choice[0] == 'p' then reverse_paginate(page_results, screen_items)
|
107
|
-
when choice[0].match(/\d/) then retrieve(choice, page_results, screen_items)
|
108
|
-
when choice[0] == 'h'
|
109
|
-
@format.display_line("[normal]The color of an entry's DL link "\
|
110
|
-
"represents its status:[/]")
|
111
|
-
@format.display_line("[blue]A+[/], [green]Trusted[/], "\
|
112
|
-
"[yellow]Normal[/], or [red]Remake[/]")
|
113
|
-
prompt(page_results, screen_items)
|
114
|
-
else
|
115
|
-
@format.display_line("[red]Unrecognized option.[/]")
|
116
|
-
prompt(page_results, screen_items)
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
def paginate(page_results)
|
121
|
-
if @marker + @opts[:size] == 100
|
122
|
-
@format.display_line("[yellow]Loading more results...[/]")
|
123
|
-
if @page == @search.offset
|
124
|
-
page_results = @search.more.get_results
|
125
|
-
else # @page < @search.offset
|
126
|
-
page_results = @search.cached(@page + 1)
|
127
|
-
end
|
128
|
-
@page += 1
|
129
|
-
part = partition(page_results, 0, @opts[:size])
|
130
|
-
else
|
131
|
-
part = partition(page_results, @marker + @opts[:size], @opts[:size])
|
132
|
-
end
|
133
|
-
screen(page_results, part)
|
134
|
-
end
|
135
|
-
|
136
|
-
def reverse_paginate(page_results, screen_items)
|
137
|
-
if @marker < 1
|
138
|
-
if @page == 1
|
139
|
-
@format.display_line("[red]Already at page one.[/]")
|
140
|
-
prompt(page_results, screen_items)
|
141
|
-
else # @page > 1
|
142
|
-
@format.display_line("[yellow]Loading results...[/]")
|
143
|
-
# TODO Bug: This fails with --size 100
|
144
|
-
# TODO Bug: reverse paginate sometimes only returns p1 cache
|
145
|
-
page_results = @search.cached(@page - 1)
|
146
|
-
@page -= 1
|
147
|
-
part = partition(page_results, PSIZE - @opts[:size], @opts[:size])
|
148
|
-
screen(page_results, part)
|
149
|
-
end
|
150
|
-
else
|
151
|
-
part = partition(page_results, @marker - @opts[:size], @opts[:size])
|
152
|
-
screen(page_results, part)
|
153
|
-
end
|
154
|
-
end
|
155
|
-
|
156
|
-
def retrieve(choice, page_results, screen_items)
|
157
|
-
/(\d+)(\s*\|(.*))*/.match(choice) do |str|
|
158
|
-
num = str[1].to_i - 1
|
159
|
-
download = Downloader.new(page_results[num].link, @opts[:outdir])
|
160
|
-
download.save
|
161
|
-
unless download.failed?
|
162
|
-
@format.display_line(
|
163
|
-
"[green]Downloaded '#{download.filename}' successfully.[/]")
|
164
|
-
else
|
165
|
-
@format.display_line("[red]Download failed (3 attempts).[/]")
|
166
|
-
end
|
167
|
-
prompt(page_results, screen_items)
|
168
|
-
end
|
169
|
-
end
|
170
|
-
end
|
171
|
-
end
|
Binary file
|
Binary file
|
Binary file
|