simple2ch 0.1.8 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.rubocop.yml +25 -0
- data/.travis.yml +8 -0
- data/README.md +24 -31
- data/UPDATES.md +46 -9
- data/lib/simple2ch.rb +67 -83
- data/lib/simple2ch/bbs.rb +54 -0
- data/lib/simple2ch/board.rb +26 -50
- data/lib/simple2ch/dat.rb +22 -20
- data/lib/simple2ch/regex.rb +16 -0
- data/lib/simple2ch/{res.rb → response.rb} +58 -57
- data/lib/simple2ch/simple2ch_error.rb +9 -0
- data/lib/simple2ch/thread.rb +113 -0
- data/lib/simple2ch/version.rb +1 -1
- data/simple2ch.gemspec +8 -0
- data/spec/bbs_spec.rb +30 -0
- data/spec/board_spec.rb +89 -54
- data/spec/dat_spec.rb +20 -19
- data/spec/response_spec.rb +131 -0
- data/spec/simple2ch_spec.rb +19 -50
- data/spec/spec_helper.rb +65 -37
- data/spec/thread_spec.rb +76 -0
- data/spec/vcr/Simple2ch_BBS/_boards/use_cache/behaves_like_boards/from_2ch_sc/1_1_1_1_1_2.yml +1117 -0
- data/spec/vcr/Simple2ch_BBS/_boards/use_cache/behaves_like_boards/from_open2ch_net/1_1_1_1_2_2.yml +1136 -0
- data/spec/vcr/Simple2ch_BBS/_boards/use_force_reload/behaves_like_boards/from_2ch_sc/1_1_2_1_1_2.yml +1117 -0
- data/spec/vcr/Simple2ch_BBS/_boards/use_force_reload/behaves_like_boards/from_2ch_sc/1_1_2_1_1_3.yml +1117 -0
- data/spec/vcr/Simple2ch_BBS/_boards/use_force_reload/behaves_like_boards/from_open2ch_net/1_1_2_1_2_2.yml +1136 -0
- data/spec/vcr/Simple2ch_BBS/_boards/use_force_reload/behaves_like_boards/from_open2ch_net/1_1_2_1_2_3.yml +1136 -0
- data/spec/vcr/Simple2ch_Board/_threads/1_4_1.yml +1238 -0
- data/spec/vcr/Simple2ch_Board/_threads/1_4_2.yml +1238 -0
- data/spec/vcr/Simple2ch_Board/_threads/1_4_3.yml +1238 -0
- data/spec/vcr/Simple2ch_Board/_threads/1_4_7.yml +1238 -0
- data/spec/vcr/Simple2ch_Board/_threads/1_4_8.yml +1238 -0
- data/spec/vcr/Simple2ch_Board/_threads/1_4_9.yml +1238 -0
- data/spec/vcr/Simple2ch_Dat/should_have_responses/1_2_1.yml +953 -0
- data/spec/vcr/Simple2ch_Dat/should_have_responses/1_2_3.yml +953 -0
- data/spec/vcr/Simple2ch_Dat/should_have_responses/1_2_4.yml +953 -0
- data/spec/vcr/Simple2ch_Dat/should_have_responses/size/1_2_2_1.yml +953 -0
- data/spec/vcr/Simple2ch_Response/_anchors/when_a_thre_have_both_id_and_non-id_responses/1_2_7_1.yml +5321 -0
- data/spec/vcr/Simple2ch_Response/_parse/when_real_data/when_2ch_sc/1_1_2_1_1.yml +1599 -0
- data/spec/vcr/Simple2ch_Response/_parse/when_real_data/when_open2ch_net/1_1_2_2_1.yml +1465 -0
- data/spec/vcr/Simple2ch_Thread/_new/2ch_sc/1_1_1_1.yml +1410 -0
- data/spec/vcr/Simple2ch_Thread/_new/2ch_sc/1_1_1_2.yml +1692 -0
- data/spec/vcr/Simple2ch_Thread/_new/open2ch_net/1_1_2_1.yml +1410 -0
- data/spec/vcr/Simple2ch_Thread/_new/open2ch_net/1_1_2_2.yml +1999 -0
- data/spec/vcr/Simple2ch_Thread/_responses/1_2_1.yml +1599 -0
- data/spec/vcr/Simple2ch_Thread/_responses/first/1_2_2_1.yml +1599 -0
- data/spec/vcr/Simple2ch_Thread/_responses/first/1_2_3_1.yml +1599 -0
- data/spec/vcr/Simple2ch_Thread/_title/1_3_1.yml +1599 -0
- data/spec/vcr/Simple2ch_Thread/_title/size/1_3_2_1.yml +1599 -0
- metadata +185 -11
- data/lib/simple2ch/simple2ch_exception.rb +0 -7
- data/lib/simple2ch/thre.rb +0 -140
- data/spec/res_spec.rb +0 -123
- data/spec/thre_spec.rb +0 -122
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 43d1380870c6d075419424891d4352ef6186d990
|
4
|
+
data.tar.gz: 4aee2a9072f121ffdb6cb8e2cbcf3fa4fb4abb37
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 90fe3acbd460eca6f3c405fffec2e4392a18c4adf65e8660289905c63cc61eebfc366cc8b9a18b2fd64e036b4628dbd5131b191893796dcb125b7638be01a018
|
7
|
+
data.tar.gz: 2f2dd214ed6f8579e257e07b98165ae4746e88c715a849c27d3c2712a8b19c375f959803cc92720b489483015ffea9241d80264f5238decd6f3b18581051ca75
|
data/.gitignore
CHANGED
data/.rubocop.yml
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
AllCops:
|
2
|
+
TargetRubyVersion: 2.3
|
3
|
+
Includes:
|
4
|
+
- Gemfile
|
5
|
+
- Rakefile
|
6
|
+
Excludes:
|
7
|
+
- bin/**
|
8
|
+
- vendor/**
|
9
|
+
- .bundle/**
|
10
|
+
|
11
|
+
SymbolArray:
|
12
|
+
Enabled: true
|
13
|
+
|
14
|
+
CollectionMethods:
|
15
|
+
PreferredMethods:
|
16
|
+
collect: 'map'
|
17
|
+
inject: 'reduce'
|
18
|
+
detect: 'find'
|
19
|
+
find_all: 'select'
|
20
|
+
|
21
|
+
SpaceInsideHashLiteralBraces:
|
22
|
+
EnforcedStyleIsWithSpaces: false
|
23
|
+
|
24
|
+
Style/AsciiComments:
|
25
|
+
Enabled: false
|
data/.travis.yml
ADDED
data/README.md
CHANGED
@@ -4,18 +4,19 @@
|
|
4
4
|
Ruby用の2chの簡易リーダーです。
|
5
5
|
|
6
6
|
![gem version](https://badge.fury.io/rb/simple2ch.svg)
|
7
|
-
[リファレンス](http://
|
7
|
+
[リファレンス](http://www.rubydoc.info/gems/simple2ch/)
|
8
8
|
|
9
9
|
## 更新内容
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
*
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
11
|
+
## [v1.1.0]
|
12
|
+
|
13
|
+
* 全面的にメソッド数を見直し、大幅なリファクタリング
|
14
|
+
* v0.X 系とは互換性一部なし
|
15
|
+
* クラス名変更: Res -> Response, Thre -> Thread
|
16
|
+
|
17
|
+
## [v0.1.9]
|
18
|
+
|
19
|
+
* 著者をプレインテキストで返すメソッドを追加
|
19
20
|
|
20
21
|
## Installation
|
21
22
|
|
@@ -38,48 +39,41 @@ Or install it yourself as:
|
|
38
39
|
require 'simple2ch'
|
39
40
|
```
|
40
41
|
|
41
|
-
### Simple2ch
|
42
|
+
### Simple2ch:BBS
|
42
43
|
|
43
44
|
```ruby
|
44
|
-
|
45
|
+
bbs = Simple2ch::BBS(:sc)
|
46
|
+
bbs.boards #=> [#<Simple2ch::Board>, ...]
|
45
47
|
```
|
46
48
|
|
47
49
|
### Simple2ch::Board
|
50
|
+
|
48
51
|
```ruby
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
+
news_boards = bbs.boards.find_all { |b| b.title.include?('ニュース') } #=> [#<Simple2ch::Board>...]
|
53
|
+
news_board = news_boards.first
|
54
|
+
news_board.title #=> "ニュース速報α"
|
55
|
+
news_board.threads #=> [#<Simple2ch::Thread>, ...]
|
52
56
|
```
|
53
57
|
|
54
58
|
### Simple2ch::Thre
|
55
59
|
|
56
60
|
```ruby
|
57
|
-
|
58
|
-
|
61
|
+
thread = news_board.threads.first
|
62
|
+
thread.resonses #=> [#<Simple2ch::Response>, ...]
|
59
63
|
```
|
60
64
|
|
61
65
|
#### URLを直接指定して取得
|
62
66
|
|
63
67
|
```ruby
|
64
|
-
|
65
|
-
|
66
|
-
reses = thre.reses
|
67
|
-
```
|
68
|
-
|
69
|
-
#### 板を指定して取得
|
70
|
-
|
71
|
-
```ruby
|
72
|
-
board = Simple2ch::Board.new('ニュー速VIP', 'http://viper.open2ch.net/news4vip/')
|
73
|
-
thres = board.thres #=>[#<Simple2ch::Thre>, ..., #<Simple2ch::Thre>]
|
74
|
-
thre = thres.find{|t| t.title == 'プログラム'}
|
75
|
-
reses = thre.reses
|
68
|
+
thread = Simple2ch::Thread.new('http://toro.open2ch.net/test/read.cgi/tech/1371956681/') #=> #<Simple2ch::Thre>
|
69
|
+
thread.title #=> "さぁRubyはじめるよ"
|
76
70
|
```
|
77
71
|
|
78
|
-
|
79
72
|
### Simple2ch::Res
|
80
73
|
|
81
74
|
```ruby
|
82
|
-
|
75
|
+
thread.responses #=> [#<Simple2ch::Response>, ...]
|
76
|
+
res = thread.responses[0] #=> #<Simple2ch::Response>
|
83
77
|
res.res_num #=> 1
|
84
78
|
res.contents #=> "Ruby覚えたいなぁ"
|
85
79
|
res.author #=> "s"
|
@@ -88,7 +82,6 @@ res.date #=> 2013-06-23 12:04:41 +0900
|
|
88
82
|
res.mail #=> ""
|
89
83
|
```
|
90
84
|
|
91
|
-
|
92
85
|
## Contributing
|
93
86
|
|
94
87
|
1. Fork it ( https://github.com/dogwood008/simple2ch/fork )
|
data/UPDATES.md
CHANGED
@@ -1,20 +1,53 @@
|
|
1
|
-
[
|
1
|
+
## [v1.1.0]
|
2
|
+
|
3
|
+
* 全面的にメソッド数を見直し、大幅なリファクタリング
|
4
|
+
* v0.X 系とは互換性一部なし
|
5
|
+
* クラス名変更: Res -> Response, Thre -> Thread
|
6
|
+
|
7
|
+
## [v0.1.9]
|
8
|
+
|
9
|
+
* 著者をプレインテキストで返すメソッドを追加
|
10
|
+
|
11
|
+
## [v0.1.8]
|
12
|
+
|
13
|
+
* 機能追加
|
14
|
+
* URLからスレを取得した時に,subject.txtに当該スレが無い場合,タイトルをdatの解析結果から取得するよう変更
|
15
|
+
|
16
|
+
## [v0.1.7]
|
17
|
+
|
18
|
+
* 機能追加
|
19
|
+
* Thre#url, Thre#dat_urlの追加
|
20
|
+
* バグ修正
|
21
|
+
* エンコーディング関連
|
22
|
+
|
23
|
+
## [v0.1.6]
|
24
|
+
|
25
|
+
* 機能追加
|
26
|
+
* 板一覧の取得に対応
|
27
|
+
* URLからスレの取得に対応
|
28
|
+
|
29
|
+
|
30
|
+
## [v0.1.5]
|
31
|
+
|
2
32
|
* デバッグ
|
3
33
|
* StandardErrorで例外を捕縛できない問題を修正
|
4
34
|
* 機能追加
|
5
35
|
* おーぷん2ちゃんねる対応
|
6
|
-
|
7
|
-
[v0.1.4]
|
36
|
+
|
37
|
+
## [v0.1.4]
|
38
|
+
|
8
39
|
* デバッグ
|
9
40
|
* Thre#resesを実行した際に、IDを持たないレスがあれば、DatParseExceptionが起きる問題を修正
|
10
41
|
* エイリアス追加
|
11
42
|
* Thre#resをThre#resesのエイリアスに設定
|
12
43
|
|
13
|
-
[v0.1.3]
|
44
|
+
## [v0.1.3]
|
45
|
+
|
14
46
|
* デバッグ
|
15
47
|
* Res#received_anchors呼び出し時にNoThreGivenExceptionが起きる場合がある問題を修正
|
16
48
|
|
17
|
-
[v0.1.2]
|
49
|
+
## [v0.1.2]
|
50
|
+
|
18
51
|
* リファクタリングとデバッグ
|
19
52
|
* メソッド修正
|
20
53
|
* Thre#reses(Array<Fixnum>)で指定したレス番号のレスを取得
|
@@ -25,14 +58,16 @@
|
|
25
58
|
* Res#received_anchors(Thre)
|
26
59
|
* 自レスへの被レスを返す
|
27
60
|
|
28
|
-
[v0.1.1]
|
61
|
+
## [v0.1.1]
|
62
|
+
|
29
63
|
* メソッド追加
|
30
64
|
* Res#anchorsの追加
|
31
65
|
* レス中のアンカーを抽出する
|
32
66
|
* 必要gemの追加
|
33
67
|
* Charwidthを追加
|
34
68
|
|
35
|
-
[v0.1.0]
|
69
|
+
## [v0.1.0]
|
70
|
+
|
36
71
|
* メソッド名の変更
|
37
72
|
* Thre.new から Thre.parse に変更
|
38
73
|
* Thre.newは引数の数を変更
|
@@ -42,7 +77,8 @@
|
|
42
77
|
* その他
|
43
78
|
* その他微細な修正
|
44
79
|
|
45
|
-
[v0.0.2]
|
80
|
+
## [v0.0.2]
|
81
|
+
|
46
82
|
* メソッド名の変更
|
47
83
|
* Board#threads から Board#thres に変更
|
48
84
|
* ドキュメントの再生成
|
@@ -51,5 +87,6 @@
|
|
51
87
|
* 使用法などを追加
|
52
88
|
* yardの結果を追加
|
53
89
|
|
54
|
-
[v0.0.1]
|
90
|
+
## [v0.0.1]
|
91
|
+
|
55
92
|
* 初版
|
data/lib/simple2ch.rb
CHANGED
@@ -1,108 +1,92 @@
|
|
1
|
-
require
|
1
|
+
require 'simple2ch/version'
|
2
|
+
require 'singleton'
|
2
3
|
|
3
4
|
module Simple2ch
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
5
|
+
require_relative './simple2ch/simple2ch_error'
|
6
|
+
require_relative './simple2ch/board'
|
7
|
+
require_relative './simple2ch/dat'
|
8
|
+
require_relative './simple2ch/response'
|
9
|
+
require_relative './simple2ch/thread'
|
10
|
+
require_relative './simple2ch/regex'
|
11
|
+
require_relative './simple2ch/bbs'
|
12
|
+
require 'socket'
|
11
13
|
require 'open-uri'
|
12
14
|
require 'time'
|
13
15
|
require 'charwidth'
|
14
|
-
require '
|
15
|
-
|
16
|
-
|
17
|
-
File.dirname __dir__
|
18
|
-
end
|
19
|
-
|
20
|
-
# Module variables
|
21
|
-
@@boards = {}
|
16
|
+
require 'retryable'
|
17
|
+
require 'bbs_2ch_url_validator'
|
18
|
+
require 'pry'
|
22
19
|
|
23
20
|
# HTTPでGETする
|
24
|
-
# @param [URI] url URL
|
21
|
+
# @param [URI or Bbs2chUrlValidator::UrlInfo or String] url URL
|
25
22
|
# @return [String] 取得本文
|
26
|
-
def self.fetch(url)
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
# bbsmenuのURLが渡されればセットして,板リストを返す
|
36
|
-
# @param [String] bbsmenu_url bbs_menuのURL
|
37
|
-
# @option [Boolean] force_refresh キャッシュを利用せず板リストを再取得する
|
38
|
-
# @return [Array<Simple2ch::Board>] 板リスト
|
39
|
-
def self.boards(bbsmenu_url=nil, force_refresh:nil)
|
40
|
-
if bbsmenu_url
|
41
|
-
bbsmenu_urls = {
|
42
|
-
net: 'http://menu.2ch.net/bbsmenu.html', sc: 'http://2ch.sc/bbsmenu.html', open: 'http://open2ch.net/bbsmenu.html'
|
43
|
-
}
|
44
|
-
# http://www.rubular.com/r/u1TJbQAULD
|
45
|
-
board_extract_regex = /<A HREF=http:\/\/(?<subdomain>\w+).(?<openflag>open|)2ch.(?<tld>sc|net)\/(?<board_name>\w+)\/>(?<board_name_ja>.+)<\/A>/
|
46
|
-
type_of_2ch = self.type_of_2ch(bbsmenu_url)
|
47
|
-
|
48
|
-
if force_refresh || (boards=@@boards.fetch(type_of_2ch, [])).size == 0
|
49
|
-
prepared_bbsmenu_url = bbsmenu_urls[type_of_2ch]
|
50
|
-
|
51
|
-
data = nil
|
52
|
-
boards_array = []
|
53
|
-
|
54
|
-
raise RuntimeError, "Failed to fetch #{url}" if (data = fetch(URI.parse(prepared_bbsmenu_url))).empty?
|
55
|
-
raise RuntimeError, "Failed to parse #{url}" if (boards_array=data.scan(board_extract_regex).uniq).empty?
|
56
|
-
|
57
|
-
boards_array.each do |b|
|
58
|
-
boards << Simple2ch::Board.new(b[4],"http://#{b[0]}.#{b[1]}2ch.#{b[2]}/#{b[3]}/")
|
59
|
-
end
|
60
|
-
@@boards[type_of_2ch] = boards
|
61
|
-
end
|
23
|
+
def self.fetch(url, encode = nil)
|
24
|
+
url_obj = URI.parse(url.to_s)
|
25
|
+
encode ||= encoded_in_sjis?(url) ? 'sjis' : 'utf-8'
|
26
|
+
errors_to_retry = [OpenURI::HTTPError, SocketError]
|
27
|
+
Retryable.retryable(tries: 5, on: errors_to_retry, sleep: 3) do
|
28
|
+
OpenURI.open_uri(url_obj, "r:#{encode}")
|
29
|
+
.read
|
30
|
+
.encode('utf-8', undef: :replace, invalid: :replace, replace: '〓')
|
62
31
|
end
|
63
|
-
@@boards[type_of_2ch]
|
64
32
|
end
|
65
33
|
|
66
34
|
# 2chのタイプを返す
|
67
35
|
# @param [String] url URL
|
68
36
|
# @return [Symbol] :open or :net or :sc
|
69
|
-
# @raise [
|
37
|
+
# @raise [NotA2chUrlError] 2chのURLでないURLが与えられた際に発生
|
70
38
|
def self.type_of_2ch(url)
|
71
|
-
parsed_url =
|
72
|
-
|
73
|
-
|
74
|
-
|
39
|
+
parsed_url = Bbs2chUrlValidator::URL.parse(url)
|
40
|
+
raise NotA2chUrlError, "Given URL: #{url}" unless parsed_url
|
41
|
+
case true
|
42
|
+
when parsed_url.is_open && parsed_url.tld == 'net'
|
75
43
|
:open
|
76
|
-
|
44
|
+
when !parsed_url.is_open && parsed_url.tld == 'net'
|
77
45
|
:net
|
78
|
-
|
46
|
+
when !parsed_url.is_open && parsed_url.tld == 'sc'
|
79
47
|
:sc
|
80
48
|
else
|
81
|
-
|
49
|
+
binding.pry
|
50
|
+
raise NotA2chUrlError, "Given URL: #{url}"
|
82
51
|
end
|
83
52
|
end
|
84
53
|
|
85
|
-
#
|
86
|
-
# @param [
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
# http://
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
54
|
+
# @param [Object] url
|
55
|
+
# @param [Hash] type
|
56
|
+
def self.generate_url(type, url, params = {})
|
57
|
+
# bbs: http://www.2ch.sc/, http://open2ch.net/
|
58
|
+
# board: http://viper.2ch.sc/news4vip/, http://viper.open2ch.net/news4vip/
|
59
|
+
# dat: http://viper.2ch.sc/news4vip/dat/9990000001.dat, http://viper.open2ch.net/news4vip/dat/1439127670.dat
|
60
|
+
# subject: http://viper.2ch.sc/news4vip/subject.txt, http://viper.open2ch.net/news4vip/subject.txt
|
61
|
+
# setting: http://viper.2ch.sc/news4vip/SETTING.TXT, http://viper.open2ch.net/news4vip/SETTING.TXT
|
62
|
+
# thread: http://viper.2ch.sc/test/read.cgi/news4vip/9990000001/, http://viper.open2ch.net/test/read.cgi/news4vip/1439127670
|
63
|
+
|
64
|
+
url_obj = Bbs2chUrlValidator::URL.parse(url.to_s)
|
65
|
+
domain = "#{url_obj.open? ? 'open' : ''}2ch.#{url_obj.tld}"
|
66
|
+
board_name = params[:board_name] ? params[:board_name] : url_obj.board_name
|
67
|
+
case type
|
68
|
+
when :bbs
|
69
|
+
"http://www.#{domain}.#{url_obj.tld}/"
|
70
|
+
when :board
|
71
|
+
"http://#{url_obj.server_name}.#{domain}/#{board_name}/"
|
72
|
+
when :dat
|
73
|
+
url_obj.dat
|
74
|
+
when :subject
|
75
|
+
url_obj.subject
|
76
|
+
when :setting
|
77
|
+
url_obj.setting
|
78
|
+
when :thread
|
79
|
+
thread_key = params[:thread_key] ? params[:thread_key] : url_obj.thread_key
|
80
|
+
"http://#{url_obj.server_name}.#{domain}/test/read.cgi/#{board_name}/#{thread_key}/"
|
105
81
|
end
|
106
82
|
end
|
107
|
-
end
|
108
83
|
|
84
|
+
private
|
85
|
+
|
86
|
+
def self.encoded_in_sjis?(url)
|
87
|
+
url.to_s.include?('subject.txt') ||
|
88
|
+
url.to_s.include?('SETTING.TXT') ||
|
89
|
+
url.to_s.include?('.dat') ||
|
90
|
+
url.to_s.include?('bbsmenu')
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module Simple2ch
|
2
|
+
require 'socket'
|
3
|
+
require 'open-uri'
|
4
|
+
require 'time'
|
5
|
+
require 'charwidth'
|
6
|
+
require 'retryable'
|
7
|
+
|
8
|
+
class BBS
|
9
|
+
attr_reader :type_of_2ch, :boards, :updated_at
|
10
|
+
|
11
|
+
def initialize(type_of_2ch)
|
12
|
+
case type_of_2ch
|
13
|
+
when :sc, :open
|
14
|
+
@type_of_2ch = type_of_2ch
|
15
|
+
else
|
16
|
+
raise %{Invalid "type_of_2ch" given: #{type_of_2ch} (:sc or :open is correct.)}
|
17
|
+
end
|
18
|
+
@updated_at = Time.now
|
19
|
+
end
|
20
|
+
|
21
|
+
def root
|
22
|
+
File.dirname __dir__
|
23
|
+
end
|
24
|
+
|
25
|
+
# @option [Boolean] force_reload キャッシュを利用せず板リストを再取得する
|
26
|
+
# @return [Array<Simple2ch::Board>] 板リスト
|
27
|
+
def boards(force_reload: nil, bbsmenu_url: nil)
|
28
|
+
if force_reload
|
29
|
+
@boards = fetch_boards(bbsmenu_url)
|
30
|
+
else
|
31
|
+
@boards ||= fetch_boards(bbsmenu_url)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def fetch_boards(bbsmenu_url = nil)
|
38
|
+
bbsmenu_urls = {
|
39
|
+
sc: 'http://2ch.sc/bbsmenu.html', open: 'http://open2ch.net/bbsmenu.html'
|
40
|
+
}
|
41
|
+
|
42
|
+
bbsmenu_url = bbsmenu_urls[type_of_2ch] if bbsmenu_url.nil?
|
43
|
+
data = Simple2ch.fetch(URI.parse(bbsmenu_url))
|
44
|
+
raise "Failed to fetch #{bbsmenu_url}" if data.empty?
|
45
|
+
scaned_data = data.scan(Regex::BOARD_EXTRACT_REGEX).uniq
|
46
|
+
raise "Failed to parse #{bbsmenu_url}" if scaned_data.empty?
|
47
|
+
|
48
|
+
boards = scaned_data.map do |b|
|
49
|
+
Simple2ch::Board.new("http://#{b[0]}.#{b[1]}2ch.#{b[2]}/#{b[3]}/", title: b[4])
|
50
|
+
end
|
51
|
+
boards.compact
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|