nhentai-api 0.2.2 → 0.3
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/lib/nhentai-api.rb +82 -479
- metadata +6 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 926018495ec0cfbf18b0cd8925ed8134dbc1535b153894c17b063f52243b699d
|
4
|
+
data.tar.gz: 64c9ed0d11c68d6e197228a0e4fc33d9f762c9fbeb4a3d47548a55769e45ebc8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5d3341acdeb0c156ff91e12d21d1f606c8a1ee2d53c5fea454892977389aba4a8730cfa968fb843856efeab522d7afaf75f1be3ad250cdf347220beb642b5c99
|
7
|
+
data.tar.gz: 4462036c84fa2d4096074bb100ec1a4e4a2aaccfdeb5dded595ea1f09cedacbedadc77bb90d10923a88c6821c1f6fb971e862e537930af2341396281b1474765
|
data/lib/nhentai-api.rb
CHANGED
@@ -1,552 +1,155 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'net/http'
|
4
|
+
require 'ostruct'
|
2
5
|
require 'time'
|
3
|
-
|
4
|
-
class Info
|
5
|
-
attr_reader :id, :name, :count, :url
|
6
|
-
|
7
|
-
def initialize(id, name, count, url)
|
8
|
-
@id = id
|
9
|
-
@name = name
|
10
|
-
@count = count
|
11
|
-
@url = url
|
12
|
-
end
|
13
|
-
end
|
6
|
+
require 'json'
|
14
7
|
|
15
8
|
class Doujinshi
|
16
|
-
attr_reader :id, :client, :media_id, :count_pages
|
9
|
+
attr_reader :id, :client, :media_id, :count_pages, :response
|
17
10
|
|
18
11
|
def initialize(id)
|
19
12
|
@id = id
|
20
13
|
@client = Net::HTTP.get_response(URI("https://nhentai.net/g/#{@id}/"))
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
14
|
+
return unless exists?
|
15
|
+
|
16
|
+
@media_id = client.body.match(%r{\/([0-9]+)\/cover})[1]
|
17
|
+
@count_pages = client.body.match(/Pages:\s*.*>([0-9]+)</)[1].to_i
|
25
18
|
end
|
26
19
|
|
27
|
-
#
|
28
|
-
# Check if a doujinshi with the given id exist
|
29
|
-
#
|
30
|
-
# @return [Bool] true if the doujinshi exist, otherwise false
|
31
|
-
# @since 0.1.0
|
32
|
-
# @example
|
33
|
-
# doujinshi.exists? #=> true
|
34
|
-
#
|
35
20
|
def exists?
|
36
|
-
|
21
|
+
client.code == '200'
|
37
22
|
end
|
38
23
|
|
39
|
-
#
|
40
|
-
# Give the title of a doujinshi
|
41
|
-
#
|
42
|
-
# @return [String] the title of a given doujinshi
|
43
|
-
# @since 0.1.0
|
44
|
-
# @example
|
45
|
-
# doujinshi.title #=> '[Illumination. (Ogadenmon)] Android no Ecchi na Yatsu | Horny Androids (NieR:Automata) [English] =TLL + mrwayne= [Digital]'
|
46
|
-
#
|
47
24
|
def title
|
48
|
-
|
25
|
+
client.body.match(/"pretty">(.*?)</)[1]
|
49
26
|
end
|
50
27
|
|
51
|
-
#
|
52
|
-
# Give the cover's URL of a doujinshi
|
53
|
-
#
|
54
|
-
# @return [String] the cover's URL of a given doujinshi
|
55
|
-
# @since 0.1.0
|
56
|
-
# @example
|
57
|
-
# doujinshi.cover #=> 'https://t.nhentai.net/galleries/1170172/cover.jpg'
|
58
|
-
#
|
59
28
|
def cover
|
60
|
-
res =
|
29
|
+
res = client.body.match(%r{https://t.*.nhentai.net/galleries/#{media_id}/cover\.(.{3})"})
|
61
30
|
|
62
|
-
"https://t.nhentai.net/galleries/#{
|
31
|
+
"https://t.nhentai.net/galleries/#{media_id}/cover.#{res[1]}"
|
63
32
|
end
|
64
33
|
|
65
|
-
#
|
66
|
-
# Give the URL of a given page of a doujinshi
|
67
|
-
#
|
68
|
-
# @param [Integer] page a particular page of a doujinshi
|
69
|
-
# @return [String] the URL of a given page of a doujinshi
|
70
|
-
# @since 0.1.0
|
71
|
-
# @example
|
72
|
-
# doujinshi.get_page #=> 'https://i.nhentai.net/galleries/1170172/1.jpg'
|
73
|
-
# doujinshi.get_page(10) #=> 'https://i.nhentai.net/galleries/1170172/10.jpg'
|
74
|
-
#
|
75
34
|
def page(page = 1)
|
76
|
-
res =
|
35
|
+
res = client.body.match(%r{https://t.*.nhentai.net/galleries/#{media_id}/#{page}t\.(.{3})"})
|
77
36
|
|
78
|
-
"https://i.nhentai.net/galleries/#{
|
37
|
+
"https://i.nhentai.net/galleries/#{media_id}/#{page}.#{res[1]}"
|
79
38
|
end
|
80
39
|
|
81
|
-
#
|
82
|
-
# Give the URL of a all pages of a doujinshi
|
83
|
-
#
|
84
|
-
# @return [Array] array pages' URL
|
85
|
-
# @since 0.1.0
|
86
|
-
# @example
|
87
|
-
# doujinshi.pages #=> ['https://i.nhentai.net/galleries/1170172/1.jpg', ..., 'https://i.nhentai.net/galleries/1170172/31.jpg']
|
88
|
-
#
|
89
40
|
def pages
|
90
|
-
(1
|
41
|
+
(1..count_pages).map { |page| page(page) }
|
91
42
|
end
|
92
43
|
|
93
|
-
#
|
94
|
-
# Give the thumbnail's URL of a given page of a doujinshi
|
95
|
-
#
|
96
|
-
# @param [Integer] page a particular page of a doujinshi
|
97
|
-
# @return [String] the thumbnail's URL of a given page of a doujinshi
|
98
|
-
# @since 0.1.0
|
99
|
-
# @example
|
100
|
-
# doujinshi.get_thumbnail #=> 'https://t.nhentai.net/galleries/1170172/1t.jpg'
|
101
|
-
# doujinshi.get_thumbnail(10) #=> 'https://t.nhentai.net/galleries/1170172/10t.jpg'
|
102
|
-
#
|
103
44
|
def thumbnail(page = 1)
|
104
|
-
res =
|
45
|
+
res = client.body.match(%r{https://t.*.nhentai.net/galleries/#{media_id}/(#{page}t\..{3})"})
|
105
46
|
|
106
|
-
"https://t.nhentai.net/galleries/#{
|
47
|
+
"https://t.nhentai.net/galleries/#{media_id}/#{res[1]}"
|
107
48
|
end
|
108
49
|
|
109
|
-
#
|
110
|
-
# Give the URL of a all thumbnails of a doujinshi
|
111
|
-
#
|
112
|
-
# @return [Array] an array thumbnails' URL
|
113
|
-
# @since 0.1.0
|
114
|
-
# @example
|
115
|
-
# doujinshi.thumbnails #=> ['https://t.nhentai.net/galleries/1170172/1t.jpg',..., 'https://t.nhentai.net/galleries/1170172/31t.jpg']
|
116
|
-
#
|
117
50
|
def thumbnails
|
118
|
-
(1
|
51
|
+
(1..count_pages).map { |page| thumbnail(page) }
|
119
52
|
end
|
120
53
|
|
121
|
-
#
|
122
|
-
# Give the number of favorites on a doujinshi
|
123
|
-
#
|
124
|
-
# @return [Integer] a counter of favorites on a given doujinshi
|
125
|
-
# @since 0.1.0
|
126
|
-
# @example
|
127
|
-
# doujinshi.num_favorites #=> 13326
|
128
|
-
#
|
129
54
|
def count_favorites
|
130
55
|
regex = %r{<span>Favorite <span class="nobold">.(\d+).<\/span><\/span>}
|
131
56
|
|
132
|
-
|
57
|
+
client.body.match(regex)[1].to_i
|
133
58
|
end
|
134
59
|
|
135
|
-
#
|
136
|
-
# Give the upload date of a doujinshi
|
137
|
-
#
|
138
|
-
# @return [Integer] the upload date of a given doujinshi
|
139
|
-
# @since 0.1.0
|
140
|
-
# @example
|
141
|
-
# doujinshi.upload_date #=> 2018-01-17 15:56:16 +0000
|
142
|
-
#
|
143
60
|
def upload_date
|
144
|
-
Time.iso8601(
|
145
|
-
end
|
146
|
-
|
147
|
-
#
|
148
|
-
# Give all tags of a doujinshi
|
149
|
-
#
|
150
|
-
# @return [Array] of Tag class of a given doujinshi
|
151
|
-
# @since 0.1.0
|
152
|
-
# @example
|
153
|
-
# doujinshi.tags
|
154
|
-
#
|
155
|
-
def tags
|
156
|
-
res = @client.body.match(%r{Tags:\s*<span class="tags">(.+)<\/span>})
|
157
|
-
return [] if res.nil?
|
158
|
-
|
159
|
-
parse_tags(res[1])
|
61
|
+
Time.iso8601(client.body.match(/<time .+ datetime="(.*?)"/)[1])
|
160
62
|
end
|
161
63
|
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
# @return [Integer] of tags
|
166
|
-
# @since 0.1.0
|
167
|
-
# @example
|
168
|
-
# doujinshi.count_tags #=> 9
|
169
|
-
#
|
170
|
-
def count_tags
|
171
|
-
res = @client.body.match(%r{Tags:\s*<span class="tags">(.+)<\/span>})
|
172
|
-
|
173
|
-
res.nil? ? 0 : parse_tags(res[1]).length
|
174
|
-
end
|
175
|
-
|
176
|
-
#
|
177
|
-
# Check if a particular doujinshi have some tags
|
178
|
-
#
|
179
|
-
# @return [Bool] true if the doujinshi have tags, otherwise false
|
180
|
-
# @since 0.1.0
|
181
|
-
# @example
|
182
|
-
# doujinshi.tags? #=> true
|
183
|
-
#
|
184
|
-
def tags?
|
185
|
-
!@client.body.match(%r{Tags:\s*<span class="tags">(.+)<\/span>}).nil?
|
186
|
-
end
|
187
|
-
|
188
|
-
#
|
189
|
-
# Give all parodies of a doujinshi
|
190
|
-
#
|
191
|
-
# @since 0.1.0
|
192
|
-
# @see Doujinshi#tags
|
193
|
-
#
|
194
|
-
def parodies
|
195
|
-
res = @client.body.match(%r{Parodies:\s+<span class="tags">(.+)<\/span>})
|
196
|
-
return [] if res.nil?
|
197
|
-
|
198
|
-
parse_tags(res[1])
|
199
|
-
end
|
200
|
-
|
201
|
-
#
|
202
|
-
# Give a counter of parodies
|
203
|
-
#
|
204
|
-
# @since 0.1.0
|
205
|
-
# @see Doujinshi#count_tags
|
206
|
-
#
|
207
|
-
def count_parodies
|
208
|
-
res = @client.body.match(%r{Parodies:\s+<span class="tags">(.+)<\/span>})
|
209
|
-
|
210
|
-
res.nil? ? 0 : parse_tags(res[1]).length
|
211
|
-
end
|
212
|
-
|
213
|
-
#
|
214
|
-
# Check if a particular doujinshi have some parodies
|
215
|
-
#
|
216
|
-
# @since 0.1.0
|
217
|
-
# @see Doujinshi#tags?
|
218
|
-
#
|
219
|
-
def parodies?
|
220
|
-
!@client.body.match(%r{Parodies:\s+<span class="tags">(.+)<\/span>}).nil?
|
221
|
-
end
|
222
|
-
|
223
|
-
#
|
224
|
-
# Give all characters of a doujinshi
|
225
|
-
#
|
226
|
-
# @since 0.1.0
|
227
|
-
# @see Doujinshi#tags
|
228
|
-
#
|
229
|
-
def characters
|
230
|
-
res = @client.body.match(%r{Characters:\s+<span class="tags">(.+)<\/span>})
|
231
|
-
return [] if res.nil?
|
232
|
-
|
233
|
-
parse_tags(res[1])
|
234
|
-
end
|
235
|
-
|
236
|
-
#
|
237
|
-
# Give a counter of characters
|
238
|
-
#
|
239
|
-
# @since 0.1.0
|
240
|
-
# @see Doujinshi#count_tags
|
241
|
-
#
|
242
|
-
def count_characters
|
243
|
-
res = @client.body.match(%r{Characters:\s+<span class="tags">(.+)<\/span>})
|
244
|
-
|
245
|
-
res.nil? ? 0 : parse_tags(res[1]).length
|
246
|
-
end
|
247
|
-
|
248
|
-
#
|
249
|
-
# Check if a particular doujinshi have some characters
|
250
|
-
#
|
251
|
-
# @since 0.1.0
|
252
|
-
# @see Doujinshi#tags?
|
253
|
-
#
|
254
|
-
def characters?
|
255
|
-
!@client.body.match(%r{Characters:\s+<span class="tags">(.+)<\/span>}).nil?
|
256
|
-
end
|
257
|
-
|
258
|
-
#
|
259
|
-
# Give all artists of a doujinshi
|
260
|
-
#
|
261
|
-
# @since 0.1.0
|
262
|
-
# @see Doujinshi#tags
|
263
|
-
#
|
264
|
-
def artists
|
265
|
-
res = @client.body.match(%r{Artists:\s+<span class="tags">(.+)<\/span>})
|
266
|
-
return [] if res.nil?
|
267
|
-
|
268
|
-
parse_tags(res[1])
|
269
|
-
end
|
270
|
-
|
271
|
-
#
|
272
|
-
# Give a counter of artists
|
273
|
-
#
|
274
|
-
# @since 0.1.0
|
275
|
-
# @see Doujinshi#count_tags
|
276
|
-
#
|
277
|
-
def count_artists
|
278
|
-
res = @client.body.match(%r{Artists:\s+<span class="tags">(.+)<\/span>})
|
279
|
-
|
280
|
-
res.nil? ? 0 : parse_tags(res[1]).length
|
281
|
-
end
|
282
|
-
|
283
|
-
#
|
284
|
-
# Check if a particular doujinshi have some artists
|
285
|
-
#
|
286
|
-
# @since 0.1.0
|
287
|
-
# @see Doujinshi#tags?
|
288
|
-
#
|
289
|
-
def artists?
|
290
|
-
!@client.body.match(%r{Artists:\s+<span class="tags">(.+)<\/span>}).nil?
|
291
|
-
end
|
64
|
+
%w[tags parodies characters artists groups languages categories].each do |method|
|
65
|
+
define_method method do
|
66
|
+
return instance_variable_get("@#{method}") if instance_variable_defined?("@#{method}")
|
292
67
|
|
293
|
-
|
294
|
-
|
295
|
-
#
|
296
|
-
# @since 0.1.0
|
297
|
-
# @see Doujinshi#tags
|
298
|
-
#
|
299
|
-
def groups
|
300
|
-
res = @client.body.match(%r{Groups:\s+<span class="tags">(.+)<\/span>})
|
301
|
-
return [] if res.nil?
|
302
|
-
|
303
|
-
parse_tags(res[1])
|
304
|
-
end
|
68
|
+
res = client.body.match(%r{#{method.capitalize}:\s*<span class="tags">(.+)<\/span>})
|
69
|
+
return [] if res.nil?
|
305
70
|
|
306
|
-
|
307
|
-
|
308
|
-
#
|
309
|
-
# @since 0.1.0
|
310
|
-
# @see Doujinshi#count_tags
|
311
|
-
#
|
312
|
-
def count_groups
|
313
|
-
res = @client.body.match(%r{Groups:\s+<span class="tags">(.+)<\/span>})
|
71
|
+
instance_variable_set("@#{method}", parsing_informations(res[1]))
|
72
|
+
end
|
314
73
|
|
315
|
-
|
316
|
-
|
74
|
+
define_method "count_#{method}" do
|
75
|
+
send(method).size
|
76
|
+
end
|
317
77
|
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
# @since 0.1.0
|
322
|
-
# @see Doujinshi#tags?
|
323
|
-
#
|
324
|
-
def groups?
|
325
|
-
!@client.body.match(%r{Groups:\s+<span class="tags">(.+)<\/span>}).nil?
|
78
|
+
define_method "#{method}?" do
|
79
|
+
!send(method).empty?
|
80
|
+
end
|
326
81
|
end
|
327
82
|
|
328
|
-
|
329
|
-
# Give all languages of a doujinshi
|
330
|
-
#
|
331
|
-
# @since 0.1.0
|
332
|
-
# @see Doujinshi#tags
|
333
|
-
#
|
334
|
-
def languages
|
335
|
-
res = @client.body.match(%r{Languages:\s+<span class="tags">(.+)<\/span>})
|
336
|
-
return [] if res.nil?
|
337
|
-
|
338
|
-
parse_tags(res[1])
|
339
|
-
end
|
83
|
+
private
|
340
84
|
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
def count_languages
|
348
|
-
res = @client.body.match(%r{Languages:\s+<span class="tags">(.+)<\/span>})
|
85
|
+
def parsing_informations(res)
|
86
|
+
res.split(%r{<a(.+?)<\/a>}).reject(&:empty?).map do |line|
|
87
|
+
id = parse_id(line)
|
88
|
+
name = parse_name(line)
|
89
|
+
count = parse_count(line)
|
90
|
+
url = parse_url(line)
|
349
91
|
|
350
|
-
|
92
|
+
OpenStruct.new(id: id, name: name, count: count, url: url)
|
93
|
+
end
|
351
94
|
end
|
352
95
|
|
353
|
-
|
354
|
-
|
355
|
-
#
|
356
|
-
# @since 0.1.0
|
357
|
-
# @see Doujinshi#tags?
|
358
|
-
#
|
359
|
-
def languages?
|
360
|
-
!@client.body.match(%r{Languages:\s+<span class="tags">(.+)<\/span>}).nil?
|
96
|
+
def parse_id(line)
|
97
|
+
line.match(/tag-(\d+)/)[1]
|
361
98
|
end
|
362
99
|
|
363
|
-
|
364
|
-
|
365
|
-
#
|
366
|
-
# @since 0.1.0
|
367
|
-
# @see Doujinshi#tags
|
368
|
-
#
|
369
|
-
def categories
|
370
|
-
res = @client.body.match(%r{Categories:\s+<span class="tags">(.+)<\/span>})
|
371
|
-
return [] if res.nil?
|
372
|
-
|
373
|
-
parse_tags(res[1])
|
100
|
+
def parse_name(line)
|
101
|
+
line.match(/class="name">(.+?)</)[1].strip
|
374
102
|
end
|
375
103
|
|
376
|
-
|
377
|
-
|
378
|
-
#
|
379
|
-
# @since 0.1.0
|
380
|
-
# @see Doujinshi#count_tags
|
381
|
-
#
|
382
|
-
def count_categories
|
383
|
-
res = @client.body.match(%r{Categories:\s+<span class="tags">(.+)<\/span>})
|
104
|
+
def parse_count(line)
|
105
|
+
count = line.match(/class="count">(\d+.)</)[1]
|
384
106
|
|
385
|
-
|
107
|
+
count[-1] == 'K' ? count.to_i * 1000 : count.to_i
|
386
108
|
end
|
387
109
|
|
388
|
-
|
389
|
-
|
390
|
-
#
|
391
|
-
# @since 0.1.0
|
392
|
-
# @see Doujinshi#tags?
|
393
|
-
#
|
394
|
-
def categories?
|
395
|
-
!@client.body.match(%r{Categories:\s+<span class="tags">(.+)<\/span>}).nil?
|
110
|
+
def parse_url(line)
|
111
|
+
line.match(/href=\"(.+?)\"/)[1]
|
396
112
|
end
|
113
|
+
end
|
397
114
|
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
res.split(%r{<a(.+?)<\/a>}).reject(&:empty?).map do |line|
|
406
|
-
id = line.match(/tag-(\d+)/)[1]
|
407
|
-
name = line.match(/">(.+?)</)[1].strip
|
408
|
-
count = line.match(/class="count">(\d+.)</)[1]
|
409
|
-
url = line.match(/href=\"(.+?)\"/)[1]
|
410
|
-
|
411
|
-
count = count[-1] == 'K' ? count.to_i * 1000 : count.to_i
|
115
|
+
%w[tag parody character artist group language category].each do |class_name|
|
116
|
+
c = Class.new do
|
117
|
+
def self.count(keyword)
|
118
|
+
class_name = name.split('::').last.downcase
|
119
|
+
keyword = keyword.tr(' ', '-')
|
120
|
+
@client = Net::HTTP.get_response(URI("https://nhentai.net/#{class_name}/#{keyword}/"))
|
121
|
+
return unless exists?
|
412
122
|
|
413
|
-
|
123
|
+
@client.body.match(%r{<a.*class="count">(.*)<\/span><\/a>})[1].to_i
|
414
124
|
end
|
415
|
-
end
|
416
|
-
end
|
417
125
|
|
418
|
-
|
419
|
-
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
424
|
-
# @param [Integer] page each page can return 25 doujinshi
|
425
|
-
# @return [Array] array of Info
|
426
|
-
# @since 0.2.0
|
427
|
-
#
|
428
|
-
def self.listing(keyword, sort = 1, page = 1)
|
429
|
-
keyword.tr!(' ', '-')
|
430
|
-
sort = sort == 1 ? '' : 'popular'
|
431
|
-
client = Net::HTTP.get_response(URI("https://nhentai.net/tag/#{keyword}/#{sort}?page=#{page}"))
|
432
|
-
res = client.body.split(%r{<div class="gallery".+?>(.+)</div>}).select { |line| line.include?('<a href="/g/') }
|
433
|
-
|
434
|
-
parse_tags(res)
|
435
|
-
end
|
126
|
+
def self.listing(keyword, sort = 1, page = 1)
|
127
|
+
class_name = name.split('::').last.downcase
|
128
|
+
keyword = keyword.tr(' ', '-')
|
129
|
+
sort = sort == 1 ? '' : 'popular'
|
130
|
+
@client = Net::HTTP.get_response(URI("https://nhentai.net/#{class_name}/#{keyword}/#{sort}?page=#{page}"))
|
131
|
+
return unless exists?
|
436
132
|
|
437
|
-
|
438
|
-
|
439
|
-
#
|
440
|
-
def self.parse_tags(res)
|
441
|
-
res.map do |line|
|
442
|
-
id = line.match(%r{/g/(\d+)/})[1]
|
443
|
-
name = line.match(%r{<div class="caption">(.+)</div>})[1].strip
|
444
|
-
count = 1
|
445
|
-
url = "/g/#{id}"
|
446
|
-
|
447
|
-
Info.new(id, name, count, url)
|
133
|
+
res = @client.body.split(%r{<div class="gallery".+?>(.*?)<\/div>}).select { |line| line.include?('<a href="/g/') }
|
134
|
+
parse_tags(res)
|
448
135
|
end
|
449
|
-
end
|
450
|
-
end
|
451
|
-
|
452
|
-
class Parody < Tag
|
453
|
-
#
|
454
|
-
# List all doujinshi of the page of a given parody
|
455
|
-
#
|
456
|
-
# @since 0.2.0
|
457
|
-
# @see Tag#listing
|
458
|
-
#
|
459
|
-
def self.listing(keyword, sort = 1, page = 1)
|
460
|
-
keyword.tr!(' ', '-')
|
461
|
-
sort = sort == 1 ? '' : 'popular'
|
462
|
-
client = Net::HTTP.get_response(URI("https://nhentai.net/parody/#{keyword}/#{sort}?page=#{page}"))
|
463
|
-
res = client.body.split(%r{<div class="gallery".+?>(.+)</div>}).select { |line| line.include?('<a href="/g/') }
|
464
|
-
|
465
|
-
parse_tags(res)
|
466
|
-
end
|
467
|
-
end
|
468
136
|
|
469
|
-
|
470
|
-
#
|
471
|
-
# List all doujinshi of the page of a given character
|
472
|
-
#
|
473
|
-
# @since 0.2.0
|
474
|
-
# @see Tag#listing
|
475
|
-
#
|
476
|
-
def self.listing(keyword, sort = 1, page = 1)
|
477
|
-
keyword.tr!(' ', '-')
|
478
|
-
sort = sort == 1 ? '' : 'popular'
|
479
|
-
client = Net::HTTP.get_response(URI("https://nhentai.net/character/#{keyword}/#{sort}?page=#{page}"))
|
480
|
-
res = client.body.split(%r{<div class="gallery".+?>(.+)</div>}).select { |line| line.include?('<a href="/g/') }
|
481
|
-
|
482
|
-
parse_tags(res)
|
483
|
-
end
|
484
|
-
end
|
137
|
+
private
|
485
138
|
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
#
|
490
|
-
# @since 0.2.0
|
491
|
-
# @see Tag#listing
|
492
|
-
#
|
493
|
-
def self.listing(keyword, sort = 1, page = 1)
|
494
|
-
keyword.tr!(' ', '-')
|
495
|
-
sort = sort == 1 ? '' : 'popular'
|
496
|
-
client = Net::HTTP.get_response(URI("https://nhentai.net/artist/#{keyword}/#{sort}?page=#{page}"))
|
497
|
-
res = client.body.split(%r{<div class="gallery".+?>(.+)</div>}).select { |line| line.include?('<a href="/g/') }
|
498
|
-
|
499
|
-
parse_tags(res)
|
500
|
-
end
|
501
|
-
end
|
139
|
+
def self.exists?
|
140
|
+
@client.code == '200'
|
141
|
+
end
|
502
142
|
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
# @see Tag#listing
|
509
|
-
#
|
510
|
-
def self.listing(keyword, sort = 1, page = 1)
|
511
|
-
keyword.tr!(' ', '-')
|
512
|
-
sort = sort == 1 ? '' : 'popular'
|
513
|
-
client = Net::HTTP.get_response(URI("https://nhentai.net/group/#{keyword}/#{sort}?page=#{page}"))
|
514
|
-
res = client.body.split(%r{<div class="gallery".+?>(.+)</div>}).select { |line| line.include?('<a href="/g/') }
|
515
|
-
|
516
|
-
parse_tags(res)
|
517
|
-
end
|
518
|
-
end
|
143
|
+
def self.parse_tags(res)
|
144
|
+
res.map do |line|
|
145
|
+
id = line.match(%r{/g/(\d+)/})[1]
|
146
|
+
name = line.match(/<div class="caption">(.+)/)[1].strip
|
147
|
+
url = "/g/#{id}"
|
519
148
|
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
#
|
524
|
-
# @since 0.2.0
|
525
|
-
# @see Tag#listing
|
526
|
-
#
|
527
|
-
def self.listing(keyword, sort = 1, page = 1)
|
528
|
-
keyword.tr!(' ', '-')
|
529
|
-
sort = sort == 1 ? '' : 'popular'
|
530
|
-
client = Net::HTTP.get_response(URI("https://nhentai.net/language/#{keyword}/#{sort}?page=#{page}"))
|
531
|
-
res = client.body.split(%r{<div class="gallery".+?>(.+)</div>}).select { |line| line.include?('<a href="/g/') }
|
532
|
-
|
533
|
-
parse_tags(res)
|
149
|
+
OpenStruct.new(id: id, name: name, url: url)
|
150
|
+
end
|
151
|
+
end
|
534
152
|
end
|
535
|
-
end
|
536
153
|
|
537
|
-
|
538
|
-
#
|
539
|
-
# List all doujinshi of the page of a given category
|
540
|
-
#
|
541
|
-
# @since 0.2.0
|
542
|
-
# @see Tag#listing
|
543
|
-
#
|
544
|
-
def self.listing(keyword, sort = 1, page = 1)
|
545
|
-
keyword.tr!(' ', '-')
|
546
|
-
sort = sort == 1 ? '' : 'popular'
|
547
|
-
client = Net::HTTP.get_response(URI("https://nhentai.net/category/#{keyword}/#{sort}?page=#{page}"))
|
548
|
-
res = client.body.split(%r{<div class="gallery".+?>(.+)</div>}).select { |line| line.include?('<a href="/g/') }
|
549
|
-
|
550
|
-
parse_tags(res)
|
551
|
-
end
|
154
|
+
Kernel.const_set(class_name.capitalize, c)
|
552
155
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nhentai-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: '0.3'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gael Roussel
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-05-14 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: nhentai-api is a basic and easy to use API for nhentai.net
|
14
14
|
email: gaelroussel@protonmail.com
|
@@ -21,9 +21,8 @@ homepage: https://rubygems.org/gems/nhentai-api
|
|
21
21
|
licenses:
|
22
22
|
- MIT
|
23
23
|
metadata:
|
24
|
-
documentation_uri: https://www.rubydoc.info/github/groussel42/nhentai-api
|
25
24
|
source_code_uri: https://github.com/Mraiih/nhentai-api
|
26
|
-
post_install_message:
|
25
|
+
post_install_message:
|
27
26
|
rdoc_options: []
|
28
27
|
require_paths:
|
29
28
|
- lib
|
@@ -38,9 +37,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
38
37
|
- !ruby/object:Gem::Version
|
39
38
|
version: '0'
|
40
39
|
requirements: []
|
41
|
-
|
42
|
-
|
43
|
-
signing_key:
|
40
|
+
rubygems_version: 3.3.3
|
41
|
+
signing_key:
|
44
42
|
specification_version: 4
|
45
43
|
summary: nhentai-api is a basic and easy to use API for nhentai.net
|
46
44
|
test_files: []
|