nicorepo 0.0.4 → 0.0.5
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/CHANGELOG.md +17 -1
- data/README.md +18 -17
- data/lib/nicorepo/cli/cli.rb +61 -24
- data/lib/nicorepo/reports.rb +32 -11
- data/lib/nicorepo/version.rb +1 -1
- data/lib/nicorepo.rb +18 -7
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e69cda5670a0c001d0683c3879ec4a513d399e69
|
4
|
+
data.tar.gz: 632dd4545dd0798eb7067f95ff76cd2b989f2f2a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ab7793b6f85e1567274ab1605b849116518af0dff0f4ecf4316004930b3cfebb100c05dc1b221490194d8c76c83264be02ae696837b41d3c28dc19a3fa196c99
|
7
|
+
data.tar.gz: 5b7c1a4f70748ddd4dd9f7272cb78174f3bb098b0dce617f1d20b4193fa3637ade902864dd93398e94b1581aee0580259c9acd3e2442374d4e589e0a2cc4cb4f
|
data/CHANGELOG.md
CHANGED
@@ -1,7 +1,23 @@
|
|
1
|
+
## 0.0.5 (2014/05/11)
|
2
|
+
|
3
|
+
### Features
|
4
|
+
|
5
|
+
#### CLI
|
6
|
+
* Add options `--latest`, `--hours=N`, `days=N` for fetch command
|
7
|
+
* Reports is cached and it can recalled by `show` command
|
8
|
+
* `show` command recalls recent reports by default
|
9
|
+
* You can specify `--more` option and it shows all report caches
|
10
|
+
* Caches are cleared when you exit the cli
|
11
|
+
* Reports will be colorfully decorated
|
12
|
+
|
13
|
+
### API
|
14
|
+
* Enable to fetch since specific time
|
15
|
+
|
1
16
|
## 0.0.4 (2014-05-04)
|
2
17
|
|
3
|
-
|
18
|
+
### Features
|
4
19
|
|
20
|
+
#### CLI
|
5
21
|
* Add thor and reconstruct CLI
|
6
22
|
* Simplify CLI by removing exec modes without interactive mode
|
7
23
|
* Now you can launch interaction cli without any exec options
|
data/README.md
CHANGED
@@ -36,11 +36,24 @@ machine nicovideo.jp
|
|
36
36
|
password your-password
|
37
37
|
```
|
38
38
|
|
39
|
-
### Start nicorepo cli
|
39
|
+
### Start nicorepo cli
|
40
40
|
|
41
|
-
$ nicorepo
|
41
|
+
$ nicorepo
|
42
42
|
|
43
43
|
You can use following commands in interactive cli to fetch nicorepos.
|
44
|
+
|
45
|
+
command | alias | description
|
46
|
+
----------------------|-------|---------------------------------------------------------
|
47
|
+
all | a | fetch all reports
|
48
|
+
videos | v | fetch only video reports
|
49
|
+
lives | li | fetch only live reports
|
50
|
+
show | s | show current reports
|
51
|
+
open REPORT-NUMBER | o | open the report url specified by number in your browser
|
52
|
+
help [COMMAND] | h | Describe available commands or one specific command
|
53
|
+
login | lo | re-login if your session is expired
|
54
|
+
exit | e | exit interactive prompt
|
55
|
+
|
56
|
+
Some commands have specific options `-n, --request-num=N`, `-p, --limit-page=N`.
|
44
57
|
For example, if you want 20 video reports by searcing over 5 pages, the command will be,
|
45
58
|
|
46
59
|
> video -n20 -p5
|
@@ -59,22 +72,10 @@ You can omit it as you like then each commad uses default value.
|
|
59
72
|
> v -p5
|
60
73
|
# => `video -n20 -p5`
|
61
74
|
|
62
|
-
|
63
|
-
|
64
|
-
command | alias | description
|
65
|
-
----------------------|-------|---------------------------------------------------------
|
66
|
-
all | a | fetch all reports
|
67
|
-
videos | v | fetch only video reports
|
68
|
-
lives | li | fetch only live reports
|
69
|
-
show | s | show current reports
|
70
|
-
open REPORT-NUMBER | o | open the report url specified by number in your browser
|
71
|
-
help [COMMAND] | h | Describe available commands or one specific command
|
72
|
-
login | lo | re-login if your session is expired
|
73
|
-
exit | e | exit interactive prompt
|
74
|
-
|
75
|
-
Some commands have specific options `-n, --request-num=N`, `-p, --limit-page=N`.
|
76
|
-
Please check it out using `help [COMMAND]`.
|
75
|
+
And also, you can use `-l, --latest`, `-h, --hours`, `-d, --days` options to find reports by the specific period.
|
77
76
|
|
77
|
+
> all -l
|
78
|
+
> lives -h 1
|
78
79
|
|
79
80
|
### Configuration
|
80
81
|
|
data/lib/nicorepo/cli/cli.rb
CHANGED
@@ -21,16 +21,8 @@ class Nicorepo
|
|
21
21
|
class ReportExistenceError < StandardError; end
|
22
22
|
|
23
23
|
class << self
|
24
|
-
attr_accessor :reports
|
25
|
-
attr_reader :repo, :conf
|
26
|
-
|
27
24
|
def start(*)
|
28
|
-
|
29
|
-
@conf ||= Nicorepo::Cli::Configuration.new
|
30
|
-
@reports ||= []
|
31
|
-
|
32
|
-
login unless logined?
|
33
|
-
|
25
|
+
login unless repo.logined?
|
34
26
|
super
|
35
27
|
end
|
36
28
|
|
@@ -43,16 +35,22 @@ class Nicorepo
|
|
43
35
|
mail, pass = Netrc.read["nicovideo.jp"]
|
44
36
|
raise LoginAccountError, "machine nicovideo.jp is not defined in .netrc" if mail.nil? || pass.nil?
|
45
37
|
begin
|
46
|
-
|
38
|
+
repo.login(mail, pass)
|
47
39
|
rescue
|
48
40
|
raise LoginAccountError, "invalid mail or pass: mail = #{mail}"
|
49
41
|
end
|
50
|
-
@logined = true
|
51
42
|
end
|
52
43
|
|
53
|
-
|
54
|
-
|
55
|
-
|
44
|
+
def repo
|
45
|
+
@repo ||= Nicorepo.new
|
46
|
+
end
|
47
|
+
|
48
|
+
def conf
|
49
|
+
@conf ||= Nicorepo::Cli::Configuration.new
|
50
|
+
end
|
51
|
+
|
52
|
+
def cache
|
53
|
+
@cache ||= {}
|
56
54
|
end
|
57
55
|
end
|
58
56
|
|
@@ -63,38 +61,54 @@ class Nicorepo
|
|
63
61
|
|
64
62
|
desc "all", "fetch all reports"
|
65
63
|
option :"request-num", type: :numeric, aliases: :n
|
64
|
+
option :"latest", type: :boolean, aliases: :l
|
65
|
+
option :"days", type: :numeric, aliases: :d
|
66
|
+
option :"hours", type: :numeric, aliases: :h
|
66
67
|
def all
|
67
68
|
request_num = options[:"request-num"] || conf.request_num("all")
|
68
|
-
|
69
|
+
request_options = { since: parse_since_options(options) }
|
70
|
+
cache(repo.all(request_num, request_options))
|
69
71
|
show
|
70
72
|
end
|
71
73
|
|
72
74
|
desc "videos", "fetch only video reports"
|
73
75
|
option :"request-num", type: :numeric, aliases: :n
|
74
76
|
option :"limit-page", type: :numeric, aliases: :p
|
77
|
+
option :"latest", type: :boolean, aliases: :l
|
78
|
+
option :"days", type: :numeric, aliases: :d
|
79
|
+
option :"hours", type: :numeric, aliases: :h
|
75
80
|
def videos
|
76
81
|
request_num = options[:"request-num"] || conf.request_num("videos")
|
77
82
|
limit_page = options[:"limit-page"] || conf.limit_page("videos")
|
78
|
-
|
83
|
+
request_options = { since: parse_since_options(options) }
|
84
|
+
cache(repo.videos(request_num, limit_page, request_options))
|
79
85
|
show
|
80
86
|
end
|
81
87
|
|
82
88
|
desc "lives", "fetch only live reports"
|
83
89
|
option :"request-num", type: :numeric, aliases: :n
|
84
90
|
option :"limit-page", type: :numeric, aliases: :p
|
91
|
+
option :"latest", type: :boolean, aliases: :l
|
92
|
+
option :"days", type: :numeric, aliases: :d
|
93
|
+
option :"hours", type: :numeric, aliases: :h
|
85
94
|
def lives
|
86
95
|
request_num = options[:"request-num"] || conf.request_num("lives")
|
87
96
|
limit_page = options[:"limit-page"] || conf.limit_page("lives")
|
88
|
-
|
97
|
+
request_options = { since: parse_since_options(options) }
|
98
|
+
cache(repo.lives(request_num, limit_page, request_options))
|
89
99
|
show
|
90
100
|
end
|
91
101
|
|
92
102
|
desc "show", "show current reports"
|
103
|
+
option :more, type: :boolean, aliases: :m
|
93
104
|
def show
|
94
|
-
|
95
|
-
|
96
|
-
|
105
|
+
showed_reports = options[:more] ? cached_reports : cached_reports[0, recent_tail]
|
106
|
+
showed_reports.each.with_index(1) do |report, i|
|
107
|
+
say "--- MORE ---", :blue if i == recent_tail + 1
|
108
|
+
say "[#{i}] #{report.body} at #{report.date.to_s}"
|
109
|
+
say " #{report.title} (#{report.url})", :green
|
97
110
|
end
|
111
|
+
say "* last fetch time: #{cached_at}", :blue
|
98
112
|
end
|
99
113
|
|
100
114
|
desc "open REPORT-NUMBER", "open the report url specified by number in your browser"
|
@@ -117,16 +131,39 @@ class Nicorepo
|
|
117
131
|
self.class.conf
|
118
132
|
end
|
119
133
|
|
120
|
-
def
|
121
|
-
self.class.reports
|
134
|
+
def cached_reports
|
135
|
+
self.class.cache[:reports] ||= []
|
136
|
+
end
|
137
|
+
|
138
|
+
def recent_tail
|
139
|
+
self.class.cache[:recent_tail]
|
140
|
+
end
|
141
|
+
|
142
|
+
def cached_at
|
143
|
+
self.class.cache[:cached_at]
|
122
144
|
end
|
123
145
|
|
124
146
|
def cache(reports)
|
125
|
-
|
147
|
+
cached_reports.unshift(reports).flatten!
|
148
|
+
self.class.cache[:recent_tail] = reports.size
|
149
|
+
self.class.cache[:cached_at] = Time.now
|
150
|
+
end
|
151
|
+
|
152
|
+
def parse_since_options(options)
|
153
|
+
case
|
154
|
+
when options[:latest]
|
155
|
+
cached_at
|
156
|
+
when options[:days]
|
157
|
+
Time.now - options[:days] * 24 * 60 * 60
|
158
|
+
when options[:hours]
|
159
|
+
Time.now - options[:hours] * 60 * 60
|
160
|
+
else
|
161
|
+
nil
|
162
|
+
end
|
126
163
|
end
|
127
164
|
|
128
165
|
def open_numbered_link(request_num)
|
129
|
-
url =
|
166
|
+
url = cached_reports[request_num - 1].url
|
130
167
|
raise ReportExistenceError, "report existence error: please fetch reports" if url.nil?
|
131
168
|
|
132
169
|
Launchy.open(url, options) do |exception|
|
data/lib/nicorepo/reports.rb
CHANGED
@@ -15,25 +15,42 @@ class Nicorepo
|
|
15
15
|
@reports = []
|
16
16
|
end
|
17
17
|
|
18
|
-
def fetch(request_num, limit_page)
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
18
|
+
def fetch(request_num, limit_page, since: nil)
|
19
|
+
filter = {}
|
20
|
+
filter[:kind] = selected_kind
|
21
|
+
filter[:since] =
|
22
|
+
case since
|
23
|
+
when String
|
24
|
+
Time.parse since
|
25
|
+
when Time
|
26
|
+
since
|
27
|
+
else
|
28
|
+
nil
|
29
|
+
end
|
23
30
|
@reports = fetch_recursively(request_num, limit_page, filter)
|
24
31
|
end
|
25
32
|
|
26
33
|
private
|
27
34
|
|
28
|
-
def
|
35
|
+
def selected_kind
|
36
|
+
nil
|
37
|
+
end
|
38
|
+
|
39
|
+
def fetch_recursively(request_num, limit_page, filter = {}, url = TOP_URL)
|
29
40
|
return [] unless limit_page > 0
|
30
41
|
|
31
42
|
# fetch current page reports
|
32
43
|
page = @parser.parse_page(url)
|
33
44
|
reports = page[:reports_attrs].map { |attrs| Report.new(attrs) }
|
34
|
-
|
45
|
+
|
46
|
+
if filter[:since]
|
47
|
+
reach_oldest_page = (reports.last.date < filter[:since])
|
48
|
+
reports.reject! { |report| report.date < filter[:since] }
|
49
|
+
end
|
50
|
+
reports.select! { |report| report.kind =~ /#{filter[:kind]}/ } if filter[:kind]
|
35
51
|
|
36
52
|
return reports[0, request_num] if reports.size >= request_num
|
53
|
+
return reports if filter[:since] && reach_oldest_page
|
37
54
|
|
38
55
|
# recursively fetch next reports
|
39
56
|
next_reports = fetch_recursively(request_num - reports.size, limit_page - 1, filter, page[:next_url])
|
@@ -43,14 +60,18 @@ class Nicorepo
|
|
43
60
|
end
|
44
61
|
|
45
62
|
class VideoReports < Reports
|
46
|
-
|
47
|
-
|
63
|
+
private
|
64
|
+
|
65
|
+
def selected_kind
|
66
|
+
'video-upload'
|
48
67
|
end
|
49
68
|
end
|
50
69
|
|
51
70
|
class LiveReports < Reports
|
52
|
-
|
53
|
-
|
71
|
+
private
|
72
|
+
|
73
|
+
def selected_kind
|
74
|
+
'live'
|
54
75
|
end
|
55
76
|
end
|
56
77
|
end
|
data/lib/nicorepo/version.rb
CHANGED
data/lib/nicorepo.rb
CHANGED
@@ -15,24 +15,35 @@ class Nicorepo
|
|
15
15
|
@agent.ssl_version = 'SSLv3'
|
16
16
|
@agent.request_headers = { 'accept-language' => 'ja-JP', 'content-language' => 'ja-JP' }
|
17
17
|
@parser = Parser.new(@agent)
|
18
|
+
@logined = false
|
18
19
|
end
|
19
20
|
|
20
21
|
def login(mail, pass)
|
21
22
|
page = @agent.post(LOGIN_URL, mail: mail, password: pass)
|
22
|
-
|
23
|
+
if page.header["x-niconico-authflag"] == '0'
|
24
|
+
raise LoginError, "Failed to login"
|
25
|
+
else
|
26
|
+
@logined = true
|
27
|
+
end
|
23
28
|
end
|
24
29
|
|
25
|
-
def
|
30
|
+
def logined?
|
31
|
+
# TODO: page.header["x-niconico-auth-flag"] をチェックする?
|
32
|
+
# 現状一度ログインしたらfalseにならない
|
33
|
+
@logined
|
34
|
+
end
|
35
|
+
|
36
|
+
def all(request_num = PER_PAGE, since: nil)
|
26
37
|
limit_page = request_num / PER_PAGE + 1
|
27
|
-
Reports.new(@parser).fetch(request_num, limit_page)
|
38
|
+
Reports.new(@parser).fetch(request_num, limit_page, since: since)
|
28
39
|
end
|
29
40
|
|
30
|
-
def videos(request_num = 3, limit_page = 5)
|
31
|
-
VideoReports.new(@parser).fetch(request_num, limit_page)
|
41
|
+
def videos(request_num = 3, limit_page = 5, since: nil)
|
42
|
+
VideoReports.new(@parser).fetch(request_num, limit_page, since: since)
|
32
43
|
end
|
33
44
|
|
34
|
-
def lives(request_num = 3, limit_page = 5)
|
35
|
-
LiveReports.new(@parser).fetch(request_num, limit_page)
|
45
|
+
def lives(request_num = 3, limit_page = 5, since: nil)
|
46
|
+
LiveReports.new(@parser).fetch(request_num, limit_page, since: since)
|
36
47
|
end
|
37
48
|
end
|
38
49
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nicorepo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- upinetree
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-05-
|
11
|
+
date: 2014-05-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: mechanize
|