media_arts_db 0.1.1 → 1.0.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.
@@ -0,0 +1,343 @@
1
+ module MediaArtsDb
2
+ module Comic
3
+ class RetrieveTemplate
4
+
5
+ def execute
6
+ response_body = request
7
+ response_body ? parse(response_body) : false
8
+ end
9
+
10
+ private
11
+
12
+ def request
13
+ # オーバーライドしてください
14
+ false
15
+ end
16
+
17
+ def parse(response_body)
18
+ # オーバーライドしてください
19
+ false
20
+ end
21
+
22
+ def query_builder(params)
23
+ { query: params.merge({ utf8: '✓', commit: '送信' }) }
24
+ end
25
+ end
26
+
27
+ class Search < RetrieveTemplate
28
+
29
+ def initialize(option, per: 100, page: 1)
30
+ @uri = MediaArtsDb.comic_search_uri
31
+ @target = option.target
32
+ @query = query_builder(option.build.merge({per: per, page: page}))
33
+ end
34
+
35
+ private
36
+
37
+ def request
38
+ HttpBase.get(@uri, @query)
39
+ end
40
+
41
+ def parse(response_body)
42
+ case @target
43
+ when 1
44
+ Parse.parse_search_target_comic(response_body)
45
+ when 2
46
+ Parse.parse_search_target_magazine(response_body)
47
+ when 3
48
+ Parse.parse_search_target_material(response_body)
49
+ when 4
50
+ Parse.parse_search_target_original_picture(response_body)
51
+ when 5
52
+ Parse.parse_search_target_booklet(response_body)
53
+ end
54
+ end
55
+
56
+ def option=(new_option)
57
+ # YAGNI
58
+ end
59
+
60
+ def next_page
61
+ # YAGNI
62
+ end
63
+ end
64
+
65
+ class SearchOptionBuilder
66
+ attr_reader :target
67
+
68
+ def initialize
69
+ @options = {}
70
+ end
71
+ def target_comic
72
+ @target = 1
73
+ end
74
+ def target_magazine
75
+ @target = 2
76
+ end
77
+ def target_material
78
+ @target = 3
79
+ end
80
+ def target_original_picture
81
+ @target = 4
82
+ end
83
+ def target_booklet
84
+ @target = 5
85
+ end
86
+ def start_year=(start_year)
87
+ @start_year = start_year
88
+ end
89
+ def start_month=(start_month)
90
+ @start_month = start_month
91
+ end
92
+ def end_year=(end_year)
93
+ @end_year = end_year
94
+ end
95
+ def end_month=(end_month)
96
+ @end_month = end_month
97
+ end
98
+ def option_=(value)
99
+ if value ; @options[1] = value ; else ; @options.delete(1) ; end
100
+ end
101
+ def option_title=(value)
102
+ if value ; @options[2] = value ; else ; @options.delete(2) ; end
103
+ end
104
+ def option_volume_number=(value)
105
+ if value ; @options[3] = value ; else ; @options.delete(3) ; end
106
+ end
107
+ def option_person_name=(value)
108
+ if value ; @options[4] = value ; else ; @options.delete(4) ; end
109
+ end
110
+ def option_authority_id=(value)
111
+ if value ; @options[5] = value ; else ; @options.delete(5) ; end
112
+ end
113
+ def option_publisher=(value)
114
+ if value ; @options[6] = value ; else ; @options.delete(6) ; end
115
+ end
116
+ def option_label=(value)
117
+ if value ; @options[7] = value ; else ; @options.delete(7) ; end
118
+ end
119
+ def option_book_format=(value)
120
+ if value ; @options[8] = value ; else ; @options.delete(8) ; end
121
+ end
122
+ def option_tag=(value)
123
+ if value ; @options[9] = value ; else ; @options.delete(9) ; end
124
+ end
125
+ def option_category=(value)
126
+ if value ; @options[10] = value ; else ; @options.delete(10) ; end
127
+ end
128
+ def option_note=(value)
129
+ if value ; @options[11] = value ; else ; @options.delete(11) ; end
130
+ end
131
+ def option_display_volume_number_with_magazine=(value)
132
+ if value ; @options[12] = value ; else ; @options.delete(12) ; end
133
+ end
134
+ def option_display_volume_sub_number_with_magazine=(value)
135
+ if value ; @options[13] = value ; else ; @options.delete(13) ; end
136
+ end
137
+ def option_volume_number_with_magazine=(value)
138
+ if value ; @options[14] = value ; else ; @options.delete(14) ; end
139
+ end
140
+
141
+ def build
142
+ result = {}
143
+ raise 'Target has not been set.' unless @target
144
+ result['msf[target][]'] = @target.to_s
145
+ result[:start_year] = @start_year if @start_year
146
+ result[:start_month] = @start_month if @start_month
147
+ result[:end_year] = @end_year if @end_year
148
+ result[:end_month] = @end_month if @end_month
149
+
150
+ index = 1
151
+ @options.each_pair do |key, value|
152
+ break if index > 5
153
+ result["msf[select#{index}]"] = key
154
+ result["msf[text#{index}]"] = value
155
+ index += 1
156
+ end
157
+ result
158
+ end
159
+ end
160
+
161
+ class SearchWork < RetrieveTemplate
162
+
163
+ def initialize(keyword, per: 100, page: 1)
164
+ @uri = MediaArtsDb.comic_search_uri
165
+ @query = query_builder({keyword_title: keyword, per: per, page: page})
166
+ end
167
+
168
+ private
169
+
170
+ def request
171
+ HttpBase.get(@uri, @query)
172
+ end
173
+
174
+ def parse(response_body)
175
+ Parse.parse_search_title(response_body)
176
+ end
177
+
178
+ def keyword=(new_keyword)
179
+ # YAGNI
180
+ end
181
+
182
+ def next_page
183
+ # YAGNI
184
+ end
185
+ end
186
+
187
+ class SearchMagazine < RetrieveTemplate
188
+
189
+ def initialize(keyword, per: 100, page: 1)
190
+ @uri = MediaArtsDb.comic_search_uri
191
+ @query = query_builder({keyword_magazine: keyword, per: per, page: page})
192
+ end
193
+
194
+ private
195
+
196
+ def request
197
+ HttpBase.get(@uri, @query)
198
+ end
199
+
200
+ def parse(response_body)
201
+ Parse.parse_search_magazine(response_body)
202
+ end
203
+
204
+ def keyword=(new_keyword)
205
+ # YAGNI
206
+ end
207
+
208
+ def next_page
209
+ # YAGNI
210
+ end
211
+ end
212
+
213
+ class SearchAuthor < RetrieveTemplate
214
+
215
+ def initialize(keyword, per: 100, page: 1)
216
+ @uri = MediaArtsDb.comic_search_uri
217
+ @query = query_builder({keyword_author: keyword, per: per, page: page})
218
+ end
219
+
220
+ private
221
+
222
+ def request
223
+ HttpBase.get(@uri, @query)
224
+ end
225
+
226
+ def parse(response_body)
227
+ Parse.parse_search_author(response_body)
228
+ end
229
+
230
+ def keyword=(new_keyword)
231
+ # YAGNI
232
+ end
233
+
234
+ def next_page
235
+ # YAGNI
236
+ end
237
+ end
238
+
239
+ class FindTemplate < RetrieveTemplate
240
+ attr_accessor :id
241
+ def initialize(id)
242
+ @id = id
243
+ end
244
+
245
+ def execute
246
+ class_name = @name.split(/_/).map(&:capitalize).join
247
+ MediaArtsDb::Comic.const_get(class_name).new(@id, super(), true)
248
+ end
249
+
250
+ private
251
+
252
+ def request
253
+ HttpBase.get(uri)
254
+ end
255
+
256
+ def parse(response_body)
257
+ Parse.send("parse_#{@name}", response_body)
258
+ end
259
+
260
+ def uri
261
+ MediaArtsDb.send("comic_#{@name}_uri", @id)
262
+ end
263
+ end
264
+
265
+ class FindComicWork < FindTemplate
266
+ def initialize(id)
267
+ @name = 'comic_work'
268
+ super(id)
269
+ end
270
+ end
271
+
272
+ class FindComicTitle < FindTemplate
273
+ def initialize(id)
274
+ @name = 'comic_title'
275
+ @query = query_builder({per: 1000}) # ページングはせずに、一度に大きく取得する
276
+ super(id)
277
+ end
278
+
279
+ private
280
+
281
+ # ComicTitleだけ結果にページングがあるので@queryを渡す必要がある
282
+ def request
283
+ HttpBase.get(uri, @query)
284
+ end
285
+ end
286
+
287
+ class FindComic < FindTemplate
288
+ def initialize(id)
289
+ @name = 'comic'
290
+ super(id)
291
+ end
292
+ end
293
+
294
+ class FindMagazineWork < FindTemplate
295
+ def initialize(id)
296
+ @name = 'magazine_work'
297
+ super(id)
298
+ end
299
+ end
300
+
301
+ class FindMagazineTitle < FindTemplate
302
+ def initialize(id)
303
+ @name = 'magazine_title'
304
+ super(id)
305
+ end
306
+ end
307
+
308
+ class FindMagazine < FindTemplate
309
+ def initialize(id)
310
+ @name = 'magazine'
311
+ super(id)
312
+ end
313
+ end
314
+
315
+ class FindAuthor < FindTemplate
316
+ def initialize(id)
317
+ @name = 'author'
318
+ super(id)
319
+ end
320
+ end
321
+
322
+ class FindMaterial < FindTemplate
323
+ def initialize(id)
324
+ @name = 'material'
325
+ super(id)
326
+ end
327
+ end
328
+
329
+ class FindOriginalPicture < FindTemplate
330
+ def initialize(id)
331
+ @name = 'original_picture'
332
+ super(id)
333
+ end
334
+ end
335
+
336
+ class FindBooklet < FindTemplate
337
+ def initialize(id)
338
+ @name = 'booklet'
339
+ super(id)
340
+ end
341
+ end
342
+ end
343
+ end
@@ -4,14 +4,13 @@ require "addressable/template"
4
4
  module MediaArtsDb
5
5
  class HttpBase
6
6
  class << self
7
- def http_get(uri, query = nil)
8
- uri_obj = if query
7
+ def get(uri, query = nil)
8
+ uri_obj = if query.nil?
9
+ Addressable::URI.parse(uri)
10
+ else
9
11
  template = Addressable::Template.new("#{uri}{?query*}")
10
12
  template.expand(query)
11
- else
12
- Addressable::URI.parse(uri)
13
13
  end
14
- # p uri_obj
15
14
  request(uri_obj)
16
15
  end
17
16
 
@@ -28,7 +27,7 @@ module MediaArtsDb
28
27
 
29
28
  def response_error(response)
30
29
  # 未実装
31
- nil
30
+ false
32
31
  end
33
32
  end
34
33
  end
@@ -6,11 +6,11 @@ module MediaArtsDb
6
6
  "#{BASE_URI}/mg/results"
7
7
  end
8
8
 
9
- def self.comic_comic_works_uri(id)
9
+ def self.comic_comic_work_uri(id)
10
10
  "#{BASE_URI}/mg/comic_works/#{id}"
11
11
  end
12
12
 
13
- def self.comic_comic_titles_uri(id)
13
+ def self.comic_comic_title_uri(id)
14
14
  "#{BASE_URI}/mg/book_titles/#{id}"
15
15
  end
16
16
 
@@ -18,11 +18,11 @@ module MediaArtsDb
18
18
  "#{BASE_URI}/mg/books/#{id}"
19
19
  end
20
20
 
21
- def self.comic_magazine_works_uri(id)
21
+ def self.comic_magazine_work_uri(id)
22
22
  "#{BASE_URI}/mg/magazine_works/#{id}"
23
23
  end
24
24
 
25
- def self.comic_magazine_titles_uri(id)
25
+ def self.comic_magazine_title_uri(id)
26
26
  "#{BASE_URI}/mg/magazine_titles/#{id}"
27
27
  end
28
28
 
@@ -1,3 +1,3 @@
1
1
  module MediaArtsDb
2
- VERSION = "0.1.1"
2
+ VERSION = "1.0.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: media_arts_db
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - bisque
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-03-23 00:00:00.000000000 Z
11
+ date: 2015-04-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -100,8 +100,9 @@ files:
100
100
  - bin/setup
101
101
  - exe/media_arts_db
102
102
  - lib/media_arts_db.rb
103
- - lib/media_arts_db/comic.rb
104
- - lib/media_arts_db/comic/comic.rb
103
+ - lib/media_arts_db/comic/component.rb
104
+ - lib/media_arts_db/comic/parse.rb
105
+ - lib/media_arts_db/comic/retrieve.rb
105
106
  - lib/media_arts_db/http_base.rb
106
107
  - lib/media_arts_db/uri.rb
107
108
  - lib/media_arts_db/version.rb
@@ -1,870 +0,0 @@
1
- module MediaArtsDb
2
-
3
- module ComicSearchOption
4
- TARGET_COMIC = 1
5
- TARGET_MAGAZINE_VOLUME = 2
6
- TARGET_MATERIAL = 3
7
- TARGET_ORIGINAL_PICTURE = 4
8
- TARGET_BOOKLET = 5
9
-
10
- START_YEAR = 'start_year' # 日付範囲指定(From年)
11
- START_MONTH = 'start_month' # 日付範囲指定(From月)
12
- END_YEAR = 'end_year' # 日付範囲指定(To年)
13
- END_MONTH = 'end_month' # 日付範囲指定(To月)
14
-
15
- ID = 1 # ID(ISBNなど)
16
- TITLE = 2 # 名称
17
- VOLUME = 3 # 巻・順序
18
- PERSON_NAME = 4 # 人名
19
- AUHTORITY_ID = 5 # 典拠ID
20
- PUBLISHER = 6 # 出版者
21
- LABEL = 7 # レーベル
22
- BOOK_FORMAT = 8 # 本の形状など
23
- TAG = 9 # タグ
24
- CATEGORY = 10 # 分類
25
- NOTE = 11 # 備考
26
- MAGAZINE_DISPLAY_VOLUME = 12 # [雑誌巻号]表示号数
27
- MAGAZINE_DISPLAY_SUB_VOLUME = 13 # [雑誌巻号]補助号数
28
- MAGAZINE_VOLUME = 14 # [雑誌巻号]巻・号・通巻
29
-
30
- def self.enable_targets
31
- [TARGET_COMIC, TARGET_MAGAZINE_VOLUME, TARGET_MATERIAL, TARGET_ORIGINAL_PICTURE, TARGET_BOOKLET]
32
- end
33
-
34
- def self.enable_optins_for_time_range
35
- [START_YEAR, START_MONTH, END_YEAR, END_MONTH]
36
- end
37
-
38
- def self.enable_options
39
- [ID, TITLE, VOLUME, PERSON_NAME, AUHTORITY_ID, PUBLISHER, LABEL, BOOK_FORMAT, TAG, CATEGORY, NOTE]
40
- end
41
-
42
- def self.enable_options_for_magazine
43
- enable_options + [MAGAZINE_DISPLAY_VOLUME, MAGAZINE_DISPLAY_SUB_VOLUME, MAGAZINE_VOLUME]
44
- end
45
- end
46
-
47
- class Comic < HttpBase
48
-
49
- include MediaArtsDb
50
- include MediaArtsDb::ComicSearchOption
51
-
52
- class << self
53
-
54
- def search_by_keyword(title: nil, magazine: nil, author: nil, per: 100, page: 1)
55
- uri = MediaArtsDb.comic_search_uri
56
- params = { per: per, page: page }
57
- if title
58
- params[:keyword_title] = title
59
- res_body = search_request(uri, params)
60
- parse_title_search_result(res_body)
61
- elsif magazine
62
- params[:keyword_magazine] = magazine
63
- res_body = search_request(uri, params)
64
- parse_magazine_search_result(res_body)
65
- elsif author
66
- params[:keyword_author] = author
67
- res_body = search_request(uri, params)
68
- parse_author_search_result(res_body)
69
- else
70
- return []
71
- end
72
- end
73
-
74
- def search_by_source(target: ComicSearchOption::TARGET_COMIC, options: {}, per: 100, page: 1)
75
- return [] unless ComicSearchOption.enable_targets.include?(target)
76
- uri = MediaArtsDb.comic_search_uri
77
- params = { per: per, page: page }
78
- params['msf[target][]'] = target
79
- option_index = 1
80
- options.each do |key, value|
81
- case key
82
- when *ComicSearchOption.enable_optins_for_time_range
83
- params["msf[#{key}"] = value
84
- when *ComicSearchOption.enable_options
85
- next if option_index > 5
86
- params["msf[select#{option_index}]"] = key
87
- params["msf[text#{option_index}]"] = value
88
- option_index += 1
89
- when *ComicSearchOption.enable_options_for_magazine
90
- next unless target == ComicSearchOption::TARGET_MAGAZINE_VOLUME
91
- next if option_index > 5
92
- params["msf[select#{option_index}]"] = key
93
- params["msf[text#{option_index}]"] = value
94
- option_index += 1
95
- end
96
- end
97
-
98
- res_body = search_request(uri, params)
99
- case target
100
- when ComicSearchOption::TARGET_COMIC
101
- parse_comic_search_result(res_body)
102
- when ComicSearchOption::TARGET_MAGAZINE_VOLUME
103
- parse_magazine_volume_search_result(res_body)
104
- when ComicSearchOption::TARGET_MATERIAL
105
- parse_material_search_result(res_body)
106
- when ComicSearchOption::TARGET_ORIGINAL_PICTURE
107
- parse_original_picture_search_result(res_body)
108
- when ComicSearchOption::TARGET_BOOKLET
109
- parse_booklet_search_result(res_body)
110
- end
111
- end
112
-
113
-
114
- def find_comic_works(id)
115
- uri = MediaArtsDb.comic_comic_works_uri(id)
116
- res_body = http_get(uri)
117
- parse_comic_works_result(res_body)
118
- end
119
-
120
- def find_comic_titles(id, per: 100, page: 1)
121
- uri = MediaArtsDb.comic_comic_titles_uri(id)
122
- params = { per: per, page: page }
123
- res_body = search_request(uri, params)
124
- parse_comic_titles_result(res_body)
125
- end
126
-
127
- def find_comic(id)
128
- uri = MediaArtsDb.comic_comic_uri(id)
129
- res_body = http_get(uri)
130
- parse_comic_result(res_body)
131
- end
132
-
133
- def find_magazine_works(id)
134
- uri = MediaArtsDb.comic_magazine_works_uri(id)
135
- res_body = http_get(uri)
136
- parse_magazine_works_result(res_body)
137
- end
138
-
139
- def find_magazine_titles(id)
140
- uri = MediaArtsDb.comic_magazine_titles_uri(id)
141
- res_body = http_get(uri)
142
- parse_magazine_titles_result(res_body)
143
- end
144
-
145
- def find_magazine(id)
146
- uri = MediaArtsDb.comic_magazine_uri(id)
147
- res_body = http_get(uri)
148
- parse_magazine_result(res_body)
149
- end
150
-
151
- def find_author(id)
152
- uri = MediaArtsDb.comic_author_uri(id)
153
- res_body = http_get(uri)
154
- parse_author_result(res_body)
155
- end
156
-
157
- def find_material(id)
158
- uri = MediaArtsDb.comic_material_uri(id)
159
- res_body = http_get(uri)
160
- parse_material_result(res_body)
161
- end
162
-
163
- def find_original_picture(id)
164
- uri = MediaArtsDb.comic_original_picture_uri(id)
165
- res_body = http_get(uri)
166
- parse_original_picture_result(res_body)
167
- end
168
-
169
- def find_booklet(id)
170
- uri = MediaArtsDb.comic_booklet_uri(id)
171
- res_body = http_get(uri)
172
- parse_booklet_result(res_body)
173
- end
174
-
175
- private
176
-
177
- def parse_title_search_result(res_body)
178
- result = []
179
- doc = Nokogiri::HTML.parse(res_body)
180
- doc.css('div.resultTabA table > tbody > tr').each do |tr|
181
- row = {}
182
- link_url = tr.css('td:nth-child(1) > a').attribute('href').value
183
- # リンクがcomic_worksとmagazine_worksの場合がある
184
- if link_url =~ /comic_works/
185
- row[:type] = 'comic_works'
186
- row[:comic_works_id] = clip_id(tr.css('td:nth-child(1) > a'))
187
- elsif link_url =~ /magazine_works/
188
- row[:type] = 'magazine_works'
189
- row[:magazine_works_id] = clip_id(tr.css('td:nth-child(1) > a'))
190
- end
191
- row[:title] = clip_text(tr.css('td:nth-child(1)')) # 作品名
192
- row[:author] = tr.css('td:nth-child(2)').text # 著者名
193
- row[:tags] = tr.css('td:nth-child(3)').text # タグ
194
- row[:total_comic_volume] = tr.css('td:nth-child(4)').text # 単行本全巻
195
- row[:total_magazine_volume] = tr.css('td:nth-child(5)').text # 雑誌掲載作品
196
- row[:materials] = tr.css('td:nth-child(6)').text # 資料
197
- row[:original_picture] = tr.css('td:nth-child(7)').text # 原画
198
- row[:other] = tr.css('td:nth-child(8)').text # その他
199
-
200
- result << row
201
- end
202
- result
203
- end
204
-
205
- def parse_magazine_search_result(res_body)
206
- result = []
207
- doc = Nokogiri::HTML.parse(res_body)
208
- doc.css('div.resultTabB table > tbody > tr').each do |tr|
209
- row = {}
210
- row[:type] = 'magazine_titles'
211
- row[:title] = clip_text(tr.css('td:nth-child(1)'))
212
- row[:magazine_titles_id] = clip_id(tr.css('td:nth-child(1) > a'))
213
- row[:publisher] = tr.css('td:nth-child(2)').text
214
- row[:published_interval] = tr.css('td:nth-child(3)').text
215
- row[:published_start_date] = tr.css('td:nth-child(4)').text
216
- row[:published_end_date] = tr.css('td:nth-child(5)').text
217
- row[:tags] = tr.css('td:nth-child(6)').text
218
-
219
- result << row
220
- end
221
- result
222
- end
223
-
224
- def parse_author_search_result(res_body)
225
- result = []
226
- doc = Nokogiri::HTML.parse(res_body)
227
- doc.css('div.resultTabC table > tbody > tr').each do |tr|
228
- row = {}
229
- row[:type] = 'none' # 何も値がないレコードがあるので、既定のtypeをnoneにしておく
230
- # リンクがauthoritiesとmagazine_worksの場合がある
231
- if tr.css('td:nth-child(1) > a').empty?
232
- row[:author_name] = tr.css('td:nth-child(1)').text
233
- else
234
- row[:type] = 'author'
235
- row[:author_id] = clip_id(tr.css('td:nth-child(1) > a'))
236
- row[:author_name] = clip_text(tr.css('td:nth-child(1)'))
237
- end
238
- row[:author_name_kana] = tr.css('td:nth-child(2)').text
239
- row[:related_author_id] = clip_id(tr.css('td:nth-child(3) > a'))
240
- row[:related_author_name] = clip_text(tr.css('td:nth-child(3)')).gsub(/\n/, '').strip
241
- row[:comic_title_quantity] = tr.css('td:nth-child(4)').text
242
- if tr.css('td:nth-child(5) > a').empty?
243
- row[:magazine_works_name] = tr.css('td:nth-child(5)').text.gsub(/\n/, '').strip
244
- else
245
- row[:type] = 'magazine_works'
246
- row[:magazine_works_id] = clip_id(tr.css('td:nth-child(5) > a'))
247
- row[:magazine_works_name] = clip_text(tr.css('td:nth-child(5)')).gsub(/\n/, '').strip
248
- end
249
-
250
- result << row
251
- end
252
- result
253
- end
254
-
255
- def parse_comic_search_result(res_body)
256
- result = []
257
- doc = Nokogiri::HTML.parse(res_body)
258
- doc.css('div.resultTabD_subA > div > table > tbody > tr').each do |tr|
259
- row = {}
260
- row[:type] = 'comic'
261
- tmp_id = tr.css('td:nth-child(1)').text.split('<br>')
262
- if tmp_id.count == 1
263
- row[:isbn] = '-' # ISBNは無くてもキーを作る
264
- else
265
- row[:isbn] = tmp_id[0] # ISBN
266
- end
267
- row[:comic_title] = clip_text(tr.css('td:nth-child(2)')) # 単行本名
268
- row[:comic_id] = clip_id(tr.css('td:nth-child(2) > a'))
269
- row[:label] = tr.css('td:nth-child(3)').text # 単行本レーベル
270
- row[:volume] = tr.css('td:nth-child(4)').text # 巻
271
- row[:author] = tr.css('td:nth-child(5)').text # 著者名
272
- row[:publisher] = tr.css('td:nth-child(6)').text # 出版者
273
- row[:published_date] = tr.css('td:nth-child(7)').text # 発行年月
274
-
275
- result << row
276
- end
277
- result
278
- end
279
-
280
- def parse_magazine_volume_search_result(res_body)
281
- result = []
282
- doc = Nokogiri::HTML.parse(res_body)
283
- doc.css('div.resultTabD_subB > div > table > tbody > tr').each do |tr|
284
- row = {}
285
- row[:type] = 'magazine'
286
- row[:magazine_title] = clip_text(tr.css('td:nth-child(2)')) # 雑誌名
287
- row[:magazine_id] = clip_id(tr.css('td:nth-child(2) > a'))
288
- row[:volume] = tr.css('td:nth-child(3)').text # 巻・合・通巻
289
- row[:display_volume] = tr.css('td:nth-child(4)').text # 表示号数
290
- row[:display_sub_volume] = tr.css('td:nth-child(5)').text # 補助号数
291
- row[:publisher] = tr.css('td:nth-child(6)').text # 出版者
292
- row[:published_date] = tr.css('td:nth-child(7)').text # 表示年月
293
-
294
- result << row
295
- end
296
- result
297
- end
298
-
299
- def parse_material_search_result(res_body)
300
- result = []
301
- doc = Nokogiri::HTML.parse(res_body)
302
- doc.css('div.resultTabD_subC > div > table > tbody > tr').each do |tr|
303
- row = {}
304
- row[:type] = 'material'
305
- row[:material_title] = clip_text(tr.css('td:nth-child(2)')) # 資料名
306
- row[:material_id] = clip_id(tr.css('td:nth-child(2) > a'))
307
- row[:category] = tr.css('td:nth-child(3)').text # 分類・カテゴリー
308
- row[:number] = tr.css('td:nth-child(4)').text # 順序
309
- row[:author] = tr.css('td:nth-child(5)').text # 著者名
310
- row[:related_material_title] = tr.css('td:nth-child(6)').text # 関連物
311
- row[:published_date] = tr.css('td:nth-child(7)').text # 時期
312
-
313
- result << row
314
- end
315
- result
316
- end
317
-
318
- def parse_original_picture_search_result(res_body)
319
- result = []
320
- doc = Nokogiri::HTML.parse(res_body)
321
- doc.css('div.resultTabD_subD > div > table > tbody > tr').each do |tr|
322
- row = {}
323
- row[:type] = 'original_picture'
324
- row[:original_picture_title] = clip_text(tr.css('td:nth-child(2)')) # 原画作品名
325
- row[:original_picture_id] = clip_id(tr.css('td:nth-child(2) > a'))
326
- row[:recorded] = tr.css('td:nth-child(3)').text # 収録
327
- row[:number] = tr.css('td:nth-child(4)').text # 順序
328
- row[:quantity] = tr.css('td:nth-child(5)').text # 枚数
329
- row[:author] = tr.css('td:nth-child(6)').text # 著者名
330
- row[:published_date] = tr.css('td:nth-child(7)').text # 初出
331
- row[:writing_time] = tr.css('td:nth-child(8)').text # 執筆期間
332
-
333
- result << row
334
- end
335
- result
336
- end
337
-
338
- def parse_booklet_search_result(res_body)
339
- result = []
340
- doc = Nokogiri::HTML.parse(res_body)
341
- doc.css('div.resultTabD_subE > div > table > tbody > tr').each do |tr|
342
- row = {}
343
- row[:type] = 'booklet'
344
- row[:booklet_title] = clip_text(tr.css('td:nth-child(2)')) # 冊子名
345
- row[:booklet_id] = clip_id(tr.css('td:nth-child(2) > a'))
346
- row[:series] = tr.css('td:nth-child(3)').text # シリーズ
347
- row[:volume] = tr.css('td:nth-child(4)').text # 巻
348
- row[:author] = tr.css('td:nth-child(6)').text # 著者名
349
- row[:publisher] = tr.css('td:nth-child(7)').text # 出版者・サークル名
350
- row[:published_date] = tr.css('td:nth-child(8)').text # 発行年月
351
-
352
- result << row
353
- end
354
- result
355
- end
356
-
357
- def parse_comic_works_result(res_body)
358
- result = {}
359
- doc = Nokogiri::HTML.parse(res_body)
360
- doc.css('body > article > div.main > section > table > tbody > tr').each do |tr|
361
- case tr.css('th:nth-child(1)').text
362
- # HTML構造の誤りにより「マンガID」が取得できない
363
- # when 'マンガID' ; result[:comic_id] = tr.css('td').text
364
- when 'マンガ作品名' ; result[:title] = tr.css('td').text
365
- when 'マンガ作品名ヨミ' ; result[:title_kana] = tr.css('td').text
366
- when '別題・副題・原題' ; result[:sub_title] = tr.css('td').text
367
- when 'ローマ字表記' ; result[:title_alphabet] = tr.css('td').text
368
- when '著者(責任表示)' ; result[:author] = tr.css('td').text
369
- # 著者が複数の場合、著者典拠IDも複数になるが、それについてはまだ未実装
370
- when '著者典拠ID' ; result[:author_id] = clip_id(tr.css('td > a'))
371
- when '公表時期' ; result[:published_date] = tr.css('td').text
372
- when '出典(初出)' ; result[:source] = tr.css('td').text
373
- when 'マンガ作品紹介文・解説' ; result[:introduction] = tr.css('td').text
374
- when '分類' ; result[:category] = tr.css('td').text
375
- when 'タグ' ; result[:tags] = tr.css('td').text
376
- when 'レイティング' ; result[:rating] = tr.css('td').text
377
- end
378
- end
379
-
380
- result[:comic_titles] = [] # 単行本全巻
381
- doc.css('body > article > div.sub > section:nth-child(1) table').each do |table|
382
- table.css('tr').each do |tr|
383
- next if tr.css('td').empty?
384
- comic_title = {}
385
- comic_title[:title] = clip_text(tr.css('td:nth-child(1)'))
386
- comic_title[:comic_titles_id] = clip_id(tr.css('td:nth-child(1) > a'))
387
- comic_title[:author] = tr.css('td:nth-child(2)').text
388
- comic_title[:total_comic_volume] = tr.css('td:nth-child(3)').text
389
- result[:comic_titles] << comic_title
390
- end
391
- end
392
-
393
- result[:magazine_works] = [] # 雑誌掲載作品
394
- doc.css('body > article > div.sub > section:nth-child(2) table').each do |table|
395
- table.css('tr').each do |tr|
396
- next if tr.css('td').empty?
397
- magazine_works = {}
398
- magazine_works[:title] = clip_text(tr.css('td:nth-child(1)'))
399
- magazine_works[:magazine_works_id] = clip_id(tr.css('td:nth-child(1) > a'))
400
- magazine_works[:author] = tr.css('td:nth-child(2)').text
401
- magazine_works[:magazine_title] = tr.css('td:nth-child(3)').text
402
- magazine_works[:published_date] = tr.css('td:nth-child(4)').text
403
- result[:magazine_works] << magazine_works
404
- end
405
- end
406
-
407
- # 資料、マンガ原画、その他の冊子、関連マンガ作品はサンプルが見つからないので未実装
408
-
409
- result
410
- end
411
-
412
- def parse_comic_titles_result(res_body)
413
- result = {}
414
- doc = Nokogiri::HTML.parse(res_body)
415
- doc.css('body > article > div.main > section > table > tbody > tr').each do |tr|
416
- case tr.css('th:nth-child(1)').text
417
- when '作品ID' ; result[:comic_works_id] = clip_id(tr.css('td > a'))
418
- when '単行本全巻名' ; result[:title] = tr.css('td').text
419
- when '単行本全巻名 ヨミ' ; result[:title_kana] = tr.css('td').text
420
- when '単行本全巻名 追記' ; result[:title_append] = tr.css('td').text
421
- when '単行本全巻名 追記 ヨミ' ; result[:title_append_kana] = tr.css('td').text
422
- when '単行本全巻名 別版表示' ; result[:title_other] = tr.css('td').text
423
- when '単行本全巻数' ; result[:total_comic_volume] = tr.css('td').text
424
- when '責任表示' ; result[:responsible] = tr.css('td').text
425
- when '著者典拠ID' ; result[:author_id] = clip_id(tr.css('td > a'))
426
- when '作者・著者' ; result[:author] = tr.css('td').text
427
- when '作者・著者 ヨミ' ; result[:author_kana] = tr.css('td').text
428
- when '原作・原案' ; result[:origina] = tr.css('td').text
429
- when '原作・原案 ヨミ' ; result[:origina_kana] = tr.css('td').text
430
- when '協力者' ; result[:collaborator] = tr.css('td').text
431
- when '協力者 ヨミ' ; result[:collaborator_kana] = tr.css('td').text
432
- when '標目' ; result[:headings] = tr.css('td').text
433
- when '単行本レーベル' ; result[:label] = tr.css('td').text
434
- when '単行本レーベル ヨミ' ; result[:label_kana] = tr.css('td').text
435
- when 'シリーズ' ; result[:series] = tr.css('td').text
436
- when 'シリーズ ヨミ' ; result[:series_kana] = tr.css('td').text
437
- when '出版者名' ; result[:publisher] = tr.css('td').text
438
- when '出版地' ; result[:published_area] = tr.css('td').text
439
- when '縦の長さ×横の長さ' ; result[:size] = tr.css('td').text
440
- when 'ISBNなどのセットコード' ; result[:isbn] = tr.css('td').text
441
- when '言語区分' ; result[:langage] = tr.css('td').text
442
- when '分類' ; result[:category] = tr.css('td').text
443
- when 'レイティング' ; result[:rating] = tr.css('td').text
444
- when '単行本全巻紹介文' ; result[:introduction] = tr.css('td').text
445
- when '単行本全巻タグ' ; result[:tags] = tr.css('td').text
446
- when '単行本全巻備考' ; result[:note] = tr.css('td').text
447
- end
448
- end
449
-
450
- result[:comics] = [] # 単行本
451
- doc.css('body > article > div.sub > section:nth-child(1) table tbody tr').each do |tr|
452
- next if tr.css('td').empty?
453
- comic_title = {}
454
- comic_title[:title] = clip_text(tr.css('td:nth-child(1)'))
455
- comic_title[:comic_id] = clip_id(tr.css('td:nth-child(1) > a'))
456
- comic_title[:comic_title_append] = tr.css('td:nth-child(2)').text
457
- comic_title[:volume] = tr.css('td:nth-child(3)').text
458
- result[:comics] << comic_title
459
- end
460
-
461
- result
462
- end
463
-
464
- def parse_comic_result(res_body)
465
- result = {
466
- next_id: '',
467
- prev_id: '',
468
- basic_information: nil,
469
- author_information: nil,
470
- publisher_information: nil,
471
- other_information: nil
472
- }
473
- doc = Nokogiri::HTML.parse(res_body)
474
- return result if doc.css('body > article > div.main > section:nth-child(1) > table').empty?
475
-
476
- # 前巻/次巻
477
- result[:prev_id] = clip_id(doc.css('body > article > header > ul > li.bookSkip > ul > li.prv > a'))
478
- result[:next_id] = clip_id(doc.css('body > article > header > ul > li.bookSkip > ul > li.nxt > a'))
479
-
480
- # 基本情報
481
- tbody = doc.css('body > article > div.main > section:nth-child(1) > table > tbody')
482
- basic_information = {}
483
- basic_information[:comic_titles_is] = clip_id(tbody.css('tr:nth-child(1) > td:nth-child(4) > a'))
484
- basic_information[:comic_title] = tbody.css('tr:nth-child(2) > td').text
485
- basic_information[:comic_title_kana] = tbody.css('tr:nth-child(3) > td').text
486
- basic_information[:comic_title_append] = tbody.css('tr:nth-child(4) > td').text
487
- basic_information[:comic_title_append_kana] = tbody.css('tr:nth-child(5) > td').text
488
- basic_information[:volume] = tbody.css('tr:nth-child(6) > td:nth-child(2)').text
489
- basic_information[:volume_sort_number] = tbody.css('tr:nth-child(6) > td:nth-child(4)').text
490
- basic_information[:volume_other_number] = tbody.css('tr:nth-child(7) > td').text
491
- basic_information[:introduction] = tbody.css('tr:nth-child(8) > td').text
492
- result[:basic_information] = basic_information
493
- # 著者表示
494
- tbody = doc.css('body > article > div.main > section:nth-child(2) > table > tbody')
495
- author_information = {}
496
- author_information[:responsible] = tbody.css('tr:nth-child(1) > td').text
497
- author_information[:author_id] = clip_id(tbody.css('tr:nth-child(2) > td > a:nth-child(1)'))
498
- author_information[:headings] = tbody.css('tr:nth-child(3) > td').text
499
- author_information[:auhtor] = tbody.css('tr:nth-child(4) > td:nth-child(2)').text
500
- author_information[:auhtor_kana] = tbody.css('tr:nth-child(4) > td:nth-child(4)').text
501
- author_information[:original_title] = tbody.css('tr:nth-child(5) > td:nth-child(2)').text
502
- author_information[:original_title_kana] = tbody.css('tr:nth-child(5) > td:nth-child(4)').text
503
- author_information[:collaborator] = tbody.css('tr:nth-child(6) > td:nth-child(2)').text
504
- author_information[:collaborator_kana] = tbody.css('tr:nth-child(6) > td:nth-child(4)').text
505
- result[:author_information] = author_information
506
- # 出版者・レーベル
507
- tbody = doc.css('body > article > div.main > section:nth-child(3) > table > tbody')
508
- publisher_information = {}
509
- publisher_information[:publisher] = tbody.css('tr:nth-child(1) > td').text
510
- publisher_information[:label] = tbody.css('tr:nth-child(3) > td').text
511
- publisher_information[:label_kana] = tbody.css('tr:nth-child(4) > td').text
512
- publisher_information[:label_number] = tbody.css('tr:nth-child(5) > td:nth-child(2)').text
513
- publisher_information[:series] = tbody.css('tr:nth-child(6) > td:nth-child(2)').text
514
- publisher_information[:series_kana] = tbody.css('tr:nth-child(6) > td:nth-child(4)').text
515
- result[:publisher_information] = publisher_information
516
- # その他
517
- tbody = doc.css('body > article > div.main > section:nth-child(4) > table > tbody')
518
- other_information = {}
519
- other_information[:published_date] = tbody.css('tr:nth-child(1) > td:nth-child(2)').text
520
- other_information[:first_price] = tbody.css('tr:nth-child(1) > td:nth-child(4)').text
521
- other_information[:isbn] = tbody.css('tr:nth-child(2) > td').text
522
- other_information[:japan_book_number] = tbody.css('tr:nth-child(3) > td').text
523
- other_information[:total_page] = tbody.css('tr:nth-child(4) > td:nth-child(2)').text
524
- other_information[:size] = tbody.css('tr:nth-child(4) > td:nth-child(4)').text
525
- other_information[:langage] = tbody.css('tr:nth-child(5) > td:nth-child(2)').text
526
- other_information[:published_area] = tbody.css('tr:nth-child(5) > td:nth-child(4)').text
527
- other_information[:rating] = tbody.css('tr:nth-child(6) > td').text
528
- other_information[:category] = tbody.css('tr:nth-child(7) > td').text
529
- other_information[:tags] = tbody.css('tr:nth-child(8) > td').text
530
- other_information[:note] = tbody.css('tr:nth-child(9) > td').text
531
- result[:other_information] = other_information
532
-
533
- result
534
- end
535
-
536
- def parse_magazine_works_result(res_body)
537
- result = {}
538
- doc = Nokogiri::HTML.parse(res_body)
539
- doc.css('body > article > div.main > section > table > tbody > tr').each do |tr|
540
- case tr.css('th:nth-child(1)').text
541
- when '雑誌作品名' ; result[:title] = tr.css('td').text
542
- when '雑誌作品名 ヨミ' ; result[:title_kana] = tr.css('td').text
543
- when '作者・著者' ; result[:author] = tr.css('td').text
544
- when '作者・著者 ヨミ' ; result[:author_kana] = tr.css('td').text
545
- when '原作・原案' ; result[:original] = tr.css('td').text
546
- when '原作・原案 ヨミ' ; result[:original_kana] = tr.css('td').text
547
- when '協力者' ; result[:collaborator] = tr.css('td').text
548
- when '協力者 ヨミ' ; result[:collaborator_kana] = tr.css('td').text
549
- when 'タグ' ; result[:tags] = tr.css('td').text
550
- when '備考' ; result[:note] = tr.css('td').text
551
- end
552
- end
553
-
554
- result[:magazines] = [] # 雑誌巻号
555
- doc.css('body > article > div.sub > section > div.moreBlock table.infoTbl2 tbody tr').each do |tr|
556
- next if tr.css('td').empty?
557
- magazine = {}
558
- magazine[:title] = clip_text(tr.css('td:nth-child(1)'))
559
- magazine[:magazine_id] = clip_id(tr.css('td:nth-child(1) > a'))
560
- magazine[:published_date] = tr.css('td:nth-child(2)').text
561
- magazine[:display_volume] = tr.css('td:nth-child(3)').text
562
- magazine[:display_sub_volume] = tr.css('td:nth-child(4)').text
563
- result[:magazines] << magazine
564
- end
565
-
566
- result
567
- end
568
-
569
- def parse_magazine_titles_result(res_body)
570
- result = {}
571
- doc = Nokogiri::HTML.parse(res_body)
572
- doc.css('body > article > div.main > section > table > tbody > tr').each do |tr|
573
- case tr.css('th:nth-child(1)').text
574
- when '雑誌名' ; result[:title] = tr.css('td').text
575
- when '雑誌名 ヨミ' ; result[:title_kana] = tr.css('td').text
576
- when '出版者名' ; result[:publisher] = tr.css('td').text
577
- when '出版地' ; result[:published_area] = tr.css('td').text
578
- when '発行頻度' ; result[:published_interval] = tr.css('td').text
579
- when '変遷' ; result[:history] = tr.css('td').text
580
- when '紹介文' ; result[:introduction] = tr.css('td').text
581
- when '創刊年月日' ; result[:published_start_date] = tr.css('td').text
582
- when '終刊年月日' ; result[:published_end_date] = tr.css('td').text
583
- when '終刊表示号数' ; result[:display_last_volume] = tr.css('td').text
584
- when '終刊巻'
585
- result[:last_volume] = tr.css('td:nth-child(2)').text
586
- result[:volume] = tr.css('td:nth-child(4)').text
587
- result[:volume2] = tr.css('td:nth-child(6)').text
588
- when 'ISSN' ; result[:issn] = tr.css('td').text
589
- when '全国書誌番号' ; result[:japan_book_number] = tr.css('td').text
590
- when '大阪タイトルコード' ; result[:osaka_title_code] = tr.css('td').text
591
- when '言語区分' ; result[:langage] = tr.css('td').text
592
- when 'タグ' ; result[:tags] = tr.css('td').text
593
- when '備考' ; result[:note] = tr.css('td').text
594
- end
595
- end
596
-
597
- result[:magazines] = [] # 雑誌巻号
598
- doc.css('body > article > div.sub > section > div.moreBlock table.infoTbl2 tbody tr').each do |tr|
599
- next if tr.css('td').empty?
600
- magazine = {}
601
- magazine[:title] = clip_text(tr.css('td:nth-child(1)'))
602
- magazine[:magazine_id] = clip_id(tr.css('td:nth-child(1) > a'))
603
- magazine[:published_date] = tr.css('td:nth-child(2)').text
604
- magazine[:display_volume] = tr.css('td:nth-child(3)').text
605
- magazine[:display_sub_volume] = tr.css('td:nth-child(4)').text
606
- result[:magazines] << magazine
607
- end
608
-
609
- result
610
- end
611
-
612
- def parse_magazine_result(res_body)
613
- result = {
614
- next_id: '',
615
- prev_id: '',
616
- basic_information: nil,
617
- other_information: nil,
618
- contents: []
619
- }
620
- doc = Nokogiri::HTML.parse(res_body)
621
- return result if doc.css('body > article > div.main > section:nth-child(1) > table').empty?
622
-
623
- # Next/Prev
624
- result[:prev_id] = clip_id(doc.css('body > article > header > ul > li.bookSkip > ul > li.prv > a'))
625
- result[:next_id] = clip_id(doc.css('body > article > header > ul > li.bookSkip > ul > li.nxt > a'))
626
-
627
- # 基本情報
628
- basic_information = {}
629
- doc.css('body > article > div.main > section:nth-child(1) > table > tbody > tr').each do |tr|
630
- case tr.css('th:nth-child(1)').text
631
- when 'サブタイトル' ; basic_information[:sub_title] = tr.css('td').text
632
- when 'サブタイトルヨミ' ; basic_information[:sub_title_kana] = tr.css('td').text
633
- when '表示年月日' ; basic_information[:display_date] = tr.css('td').text
634
- when '表示月日(合併)' ; basic_information[:display_date_merger] = tr.css('td').text
635
- when '発行年月日' ; basic_information[:published_date] = tr.css('td').text
636
- when '発行月日(合併)' ; basic_information[:published_date_merger] = tr.css('td').text
637
- when '発売年月日' ; basic_information[:release_date] = tr.css('td').text
638
- when '表示号数' ; basic_information[:display_volume] = tr.css('td').text
639
- when '表示合併号数' ; basic_information[:display_merger_volume] = tr.css('td').text.gsub(/\n/, '').strip
640
- when '補助号数' ; basic_information[:display_sub_volume] = tr.css('td').text
641
- when '巻'
642
- basic_information[:volume] = tr.css('td:nth-child(2)').text
643
- basic_information[:volume2] = tr.css('td:nth-child(4)').text # 適当な名前がわからない
644
- basic_information[:volume3] = tr.css('td:nth-child(6)').text # 適当な名前がわからない
645
- end
646
- end
647
- result[:basic_information] = basic_information
648
-
649
- # 出版者、ページ数、価格
650
- other_information = {}
651
- doc.css('body > article > div.main > section:nth-child(2) > table > tbody > tr').each do |tr|
652
- case tr.css('th:nth-child(1)').text
653
- when '出版者名' ; other_information[:publisher] = tr.css('td').text
654
- when '発行人' ; other_information[:publisher2] = tr.css('td').text
655
- when '編集人' ; other_information[:publisher3] = tr.css('td').text
656
- when 'ページ数' ; other_information[:total_page] = tr.css('td').text
657
- when '製本' ; other_information[:binding] = tr.css('td').text
658
- when '分類' ; other_information[:category] = tr.css('td').text
659
- when 'レイティング' ; other_information[:rating] = tr.css('td').text
660
- when '縦の長さx横の長さ' ; other_information[:size] = tr.css('td').text
661
- when '価格' ; other_information[:price] = tr.css('td').text
662
- when '雑誌コード' ; other_information[:magazine_code] = tr.css('td').text
663
- when 'タグ' ; other_information[:tags] = tr.css('td').text
664
- when '備考' ; other_information[:note] = tr.css('td').text
665
- end
666
- end
667
- result[:other_information] = other_information
668
-
669
- # 雑誌巻号
670
- doc.css('body > article > div.sub > section:nth-child(2) > table > tbody > tr').each do |tr|
671
- next if tr.css('td').empty?
672
- contents = {}
673
- contents[:category] = tr.css('td:nth-child(1)').text
674
- contents[:title] = clip_text(tr.css('td:nth-child(2)'))
675
- contents[:magazine_works_id] = clip_id(tr.css('td:nth-child(2) > a'))
676
- contents[:author] = tr.css('td:nth-child(3)').text
677
- contents[:sub_title] = tr.css('td:nth-child(4)').text
678
- contents[:start_page] = tr.css('td:nth-child(5)').text
679
- contents[:total_page] = tr.css('td:nth-child(6)').text
680
- contents[:note] = tr.css('td:nth-child(7)').text
681
- contents[:format] = tr.css('td:nth-child(8)').text
682
- result[:contents] << contents
683
- end
684
-
685
- result
686
- end
687
-
688
- def parse_author_result(res_body)
689
- result = {}
690
- doc = Nokogiri::HTML.parse(res_body)
691
- doc.css('body > article > div.main > section > table > tbody > tr').each do |tr|
692
- case tr.css('th:nth-child(1)').text
693
- # HTML構造の誤りにより「マンガID」が取得できない
694
- # when 'マンガID' ; result[:comic_id] = tr.css('td').text
695
- when '標目' ; result[:headings] = tr.css('td').text
696
- when '名称' ; result[:name] = tr.css('td').text
697
- when 'ヨミ' ; result[:name_kana] = tr.css('td').text
698
- when 'ローマ字' ; result[:name_alphabet] = tr.css('td').text
699
- when 'をも見よ参照' ; result[:reference] = tr.css('td').text
700
- # 著者が複数の場合、著者典拠IDも複数になるが、それについてはまだ未実装
701
- when '別名(表記ミス・ユレ、本名、新字旧字など)' ; result[:other_name] = clip_id(tr.css('td > a'))
702
- when '生年月日(結成年月日)' ; result[:birthday] = tr.css('td').text
703
- when '没年月日' ; result[:death_date] = tr.css('td').text
704
- end
705
- end
706
-
707
- result[:comic_works] = [] # 単行本化された作品 ※マンガ作品
708
- doc.css('body > article > div.sub > section:nth-child(1) table').each do |table|
709
- table.css('tr').each do |tr|
710
- next if tr.css('td').empty?
711
- comic_works = {}
712
- comic_works[:title] = clip_text(tr.css('td:nth-child(1)'))
713
- comic_works[:comic_works_id] = clip_id(tr.css('td:nth-child(1) > a'))
714
- comic_works[:author] = tr.css('td:nth-child(2)').text
715
- result[:comic_works] << comic_works
716
- end
717
- end
718
-
719
- result[:comic_titles] = [] # 単行本全巻
720
- doc.css('body > article > div.sub > section:nth-child(2) table').each do |table|
721
- table.css('tr').each do |tr|
722
- next if tr.css('td').empty?
723
- comic_titles = {}
724
- comic_titles[:title] = clip_text(tr.css('td:nth-child(1)'))
725
- comic_titles[:comic_titles_id] = clip_id(tr.css('td:nth-child(1) > a'))
726
- comic_titles[:author] = tr.css('td:nth-child(2)').text
727
- comic_titles[:total_comic_volume] = tr.css('td:nth-child(3)').text
728
- result[:comic_titles] << comic_titles
729
- end
730
- end
731
-
732
- # 資料、マンガ原画、その他の冊子、関連マンガ作品はサンプルが見つからないので未実装
733
-
734
- result
735
- end
736
-
737
- def parse_material_result(res_body)
738
- # 未実装
739
- {}
740
- end
741
-
742
- def parse_original_picture_result(res_body)
743
- # 未実装
744
- {}
745
- end
746
-
747
- def parse_booklet_result(res_body)
748
- result = {
749
- basic_information: nil,
750
- author_information: nil,
751
- publisher_information: nil,
752
- other_information: nil
753
- }
754
- doc = Nokogiri::HTML.parse(res_body)
755
-
756
- basic_information = {}
757
- doc.css('body > article > div.main > section:nth-child(1) > table > tbody > tr').each do |tr|
758
- case tr.css('th:nth-child(1)').text
759
- when 'その他の冊子ID' ; basic_information[:comic_works_id] = clip_id(tr.css('td:nth-child(4) > a'))
760
- when '分類' ; basic_information[:category] = tr.css('td').text
761
- when '冊子名'
762
- basic_information[:title] = tr.css('td').text.gsub(/\n/, '').strip
763
- # basic_information[:title_kana] = tr.next.css('td').text # このやり方では取れない
764
- when '冊子名追記'
765
- basic_information[:title_append] = tr.css('td').text
766
- # basic_information[:title_append_kana] = tr.next.css('td').text # このやり方では取れない
767
- when '巻'
768
- basic_information[:volume] = tr.css('td:nth-child(2)').text
769
- basic_information[:volume_sort_number] = tr.css('td:nth-child(4)').text
770
- when '冊子名別版表示' ; basic_information[:title_other] = tr.css('td').text
771
- when '紹介文' ; basic_information[:introduction] = tr.css('td').text
772
- end
773
- end
774
- result[:basic_information] = basic_information
775
-
776
- author_information = {}
777
- doc.css('body > article > div.main > section:nth-child(2) > table > tbody > tr').each do |tr|
778
- case tr.css('th:nth-child(1)').text
779
- when '責任表示' ; author_information[:authority] = tr.css('td').text
780
- when '著者典拠ID'
781
- author_information[:author_id] = clip_id(tr.css('td a').text)
782
- when '作者・著者'
783
- author_information[:author] = tr.css('td:nth-child(2)').text
784
- author_information[:author_kana] = tr.css('td:nth-child(4)').text
785
- when '原作・原案'
786
- author_information[:original] = tr.css('td:nth-child(2)').text
787
- author_information[:original_kana] = tr.css('td:nth-child(4)').text
788
- when '協力者'
789
- author_information[:collaborator] = tr.css('td:nth-child(2)').text
790
- author_information[:collaborator_kana] = tr.css('td:nth-child(4)').text
791
- when '標目' ; author_information[:headings] = tr.css('td').text
792
- end
793
- end
794
- result[:author_information] = author_information
795
-
796
- publisher_information = {}
797
- doc.css('body > article > div.main > section:nth-child(3) > table > tbody > tr').each do |tr|
798
- case tr.css('th:nth-child(1)').text
799
- when '出版者名(サークル名)' ; publisher_information[:publisher] = tr.css('td').text
800
- when 'シリーズ' ; publisher_information[:series] = tr.css('td').text
801
- when 'カナ' ; publisher_information[:series_kana] = tr.css('td').text
802
- when 'シリーズ番号' ; publisher_information[:series_number] = tr.css('td').text
803
- when '頒布イベント' ; publisher_information[:published_event] = tr.css('td').text
804
- end
805
- end
806
- result[:publisher_information] = publisher_information
807
-
808
- other_information = {}
809
- doc.css('body > article > div.main > section:nth-child(4) > table > tbody > tr').each do |tr|
810
- case tr.css('th:nth-child(1)').text
811
- when '初版発行年月日'
812
- other_information[:published_data] = tr.css('td:nth-child(2)').text
813
- other_information[:price] = tr.css('td:nth-child(4)').text
814
- when '発行日備考' ; other_information[:published_data_note] = tr.css('td').text
815
- when '全国書誌番号' ; other_information[:japan_book_number] = tr.css('td').text
816
- when '製本・造本形態' ; other_information[:format] = tr.css('td').text
817
- when 'ページ数'
818
- other_information[:total_page] = tr.css('td:nth-child(2)').text
819
- other_information[:size] = tr.css('td:nth-child(4)').text
820
- when '発行地'
821
- other_information[:published_area] = tr.css('td:nth-child(2)').text
822
- other_information[:publisher] = tr.css('td:nth-child(4)').text
823
- when '言語区分' ; other_information[:langage] = tr.css('td').text
824
- when 'レイティング' ; other_information[:rating] = tr.css('td').text
825
- when 'タグ' ; other_information[:tags] = tr.css('td').text
826
- when '備考' ; other_information[:note] = tr.css('td').text
827
- end
828
- end
829
- result[:other_information] = other_information
830
-
831
- result
832
- end
833
-
834
- def search_request(uri, params)
835
- query = {
836
- query: {
837
- utf8: '✓',
838
- commit: '送信'
839
- }
840
- }
841
- params.each_key { |k| query[:query][k] = params[k] }
842
- http_get(uri, query)
843
- end
844
-
845
- def clip_text(node)
846
- # return '' unless node.class == Nokogiri::XML::NodeSet
847
- begin
848
- node.css('a').empty? ? node.text : node.css('a').text
849
- rescue
850
- ''
851
- end
852
- end
853
-
854
- def clip_id(node)
855
- # return '' unless node.class == Nokogiri::XML::NodeSet && node.attribute('href')
856
- begin
857
- uri = node.attribute('href').value
858
- # urlにqueryパラメータがある場合、?以降をを取り除く
859
- if uri.include?('?')
860
- index = uri =~ /\?/
861
- uri = uri[0..index - 1]
862
- end
863
- uri.slice(/[0-9]+$/)
864
- rescue
865
- ''
866
- end
867
- end
868
- end
869
- end
870
- end