nhentai-api 1.0 → 1.0.1
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/doujinshi.rb +112 -0
- data/lib/nhentai-api/key.rb +36 -0
- data/lib/nhentai-api/search.rb +79 -0
- data/lib/nhentai-api.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 962d39c7b5641737d50b8aae5f6d66b94b330642abe758beb50ada6d1f10008e
|
4
|
+
data.tar.gz: e5ce54e4cb8e87e9aac4c8339df0073a20ec33a95ea467691eb75d3b4b77f59b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5a463e10bb67f877c7768f59e0da29be55e2df000b7b0cb6032725d9d040c0614e2a3298cd0e8718c008644d3b70659d8634fea53727c632a1df0d2998b2e7d5
|
7
|
+
data.tar.gz: 8157e7ed49c0e59bfbca4433d9f2f1534514f6e3ee5d9a4ff2485dc0c9f216d766de7c3e3b410593f0e76f614face9f7995a68d3e8690627c19d178884acb80a
|
@@ -0,0 +1,112 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Doujinshi
|
4
|
+
def initialize(id:)
|
5
|
+
case id
|
6
|
+
when Integer, String
|
7
|
+
@id = id
|
8
|
+
@client = Net::HTTP.get_response(URI("https://nhentai.net/api/gallery/#{id}"))
|
9
|
+
return unless exists?
|
10
|
+
|
11
|
+
@response = JSON.parse(client.body)
|
12
|
+
when Hash
|
13
|
+
@response = id
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.random
|
18
|
+
fetch('https://nhentai.net/random')
|
19
|
+
end
|
20
|
+
|
21
|
+
def exists?
|
22
|
+
client.code == '200'
|
23
|
+
end
|
24
|
+
|
25
|
+
def media_id
|
26
|
+
response['media_id']
|
27
|
+
end
|
28
|
+
|
29
|
+
def num_pages
|
30
|
+
response['num_pages']
|
31
|
+
end
|
32
|
+
|
33
|
+
def title(type: :pretty)
|
34
|
+
response['title'][type.to_s]
|
35
|
+
end
|
36
|
+
|
37
|
+
def cover
|
38
|
+
"https://t.nhentai.net/galleries/#{media_id}/cover.#{IMAGE_EXTENSION[response['images']['cover']['t']]}"
|
39
|
+
end
|
40
|
+
|
41
|
+
def page(page: 1)
|
42
|
+
"https://i.nhentai.net/galleries/#{media_id}/#{page}.#{IMAGE_EXTENSION[response['images']['pages'][page - 1]['t']]}"
|
43
|
+
end
|
44
|
+
|
45
|
+
def pages
|
46
|
+
(1..num_pages).map { |page| page(page: page) }
|
47
|
+
end
|
48
|
+
|
49
|
+
def thumbnail(page: 1)
|
50
|
+
"https://t.nhentai.net/galleries/#{media_id}/#{page}t.#{IMAGE_EXTENSION[response['images']['pages'][page - 1]['t']]}"
|
51
|
+
end
|
52
|
+
|
53
|
+
def thumbnails
|
54
|
+
(1..num_pages).map { |page| thumbnail(page: page) }
|
55
|
+
end
|
56
|
+
|
57
|
+
def count_favorites
|
58
|
+
response['num_favorites']
|
59
|
+
end
|
60
|
+
|
61
|
+
def upload_date
|
62
|
+
Time.at(response['upload_date']).utc
|
63
|
+
end
|
64
|
+
|
65
|
+
%w[tags parodies characters artists groups languages categories].each do |method|
|
66
|
+
define_method method do
|
67
|
+
return instance_variable_get("@#{method}") if instance_variable_defined?("@#{method}")
|
68
|
+
|
69
|
+
res = response['tags'].select { |tag| tag['type'] == SINGULAR_TAG[method] }
|
70
|
+
instance_variable_set("@#{method}", parsing_informations(res))
|
71
|
+
end
|
72
|
+
|
73
|
+
define_method "count_#{method}" do
|
74
|
+
send(method).size
|
75
|
+
end
|
76
|
+
|
77
|
+
define_method "#{method}?" do
|
78
|
+
!send(method).empty?
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
def related
|
83
|
+
client = Net::HTTP.get_response(URI("https://nhentai.net/api/gallery/#{id}/related"))
|
84
|
+
response = JSON.parse(client.body)
|
85
|
+
|
86
|
+
response['result'].map { |doujin| Doujinshi.new(id: doujin) }
|
87
|
+
end
|
88
|
+
|
89
|
+
private
|
90
|
+
|
91
|
+
attr_reader :client, :response, :id
|
92
|
+
|
93
|
+
def parsing_informations(res)
|
94
|
+
res.map do |line|
|
95
|
+
OpenStruct.new(
|
96
|
+
id: line['id'],
|
97
|
+
name: line['name'],
|
98
|
+
count: line['count'],
|
99
|
+
url: line['url']
|
100
|
+
)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
def self.fetch(uri_str)
|
105
|
+
client = Net::HTTP.get_response(URI(uri_str))
|
106
|
+
|
107
|
+
case client
|
108
|
+
when Net::HTTPFound then new(id: client['location'][3..-2])
|
109
|
+
when Net::HTTPRedirection then fetch("https://nhentai.net#{client['location']}")
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
%w[tag parody character artist group language category].each do |class_name|
|
4
|
+
c = Class.new do
|
5
|
+
attr_reader :client
|
6
|
+
|
7
|
+
def initialize(keyword:, sort: :none, page: 1)
|
8
|
+
@client = Net::HTTP.get_response(URI("https://nhentai.net/#{class_name}/#{keyword.tr(' ', '-')}/#{SORT[sort]}?page=#{page}"))
|
9
|
+
end
|
10
|
+
|
11
|
+
def count
|
12
|
+
res = client.body.match(%r{<a.*class="count">(.*)<\/span><\/a>})
|
13
|
+
return 0 if res.nil?
|
14
|
+
|
15
|
+
count = res[1]
|
16
|
+
count[-1] == 'K' ? count.to_i * 1000 : count.to_i
|
17
|
+
end
|
18
|
+
|
19
|
+
def listing
|
20
|
+
res = client.body.split(%r{<div class="gallery".+?>(.*?)<\/div>}).select { |line| line.include?('<a href="/g/') }
|
21
|
+
parse_tiles(res)
|
22
|
+
end
|
23
|
+
|
24
|
+
def exists?
|
25
|
+
@client.code == '200'
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def class_name
|
31
|
+
self.class.name.split('::').last.downcase
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
Kernel.const_set(class_name.capitalize, c)
|
36
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
class Search
|
4
|
+
def initialize(options:, sort: :none, page: 1)
|
5
|
+
@options = options
|
6
|
+
@client = Net::HTTP.get_response(URI("https://nhentai.net/api/galleries/search?query=#{string_options}&sort=#{SORT[sort]}&page=#{page}"))
|
7
|
+
return unless exists?
|
8
|
+
|
9
|
+
@response = JSON.parse(client.body)
|
10
|
+
end
|
11
|
+
|
12
|
+
def exists?
|
13
|
+
client.code == '200'
|
14
|
+
end
|
15
|
+
|
16
|
+
def count
|
17
|
+
response['result'].count
|
18
|
+
end
|
19
|
+
|
20
|
+
def num_pages
|
21
|
+
response['num_pages']
|
22
|
+
end
|
23
|
+
|
24
|
+
def per_page
|
25
|
+
response['per_page']
|
26
|
+
end
|
27
|
+
|
28
|
+
def listing
|
29
|
+
response['result'].map { |doujin| Doujinshi.new(id: doujin) }
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
attr_reader :options, :client, :response
|
35
|
+
|
36
|
+
def string_options
|
37
|
+
%i[keywords tags pages dates]
|
38
|
+
.map { |symbol| send("parse_#{symbol}", options[symbol]) if options[symbol] }
|
39
|
+
.join(' ')
|
40
|
+
end
|
41
|
+
|
42
|
+
def parse_pages(pages)
|
43
|
+
pages.map { |page| "pages:#{page.tr(' ', '')}" }
|
44
|
+
end
|
45
|
+
|
46
|
+
def parse_dates(dates)
|
47
|
+
dates.map { |date| "uploaded:#{date.tr(' ', '')}" }
|
48
|
+
end
|
49
|
+
|
50
|
+
def parse_tags(tags)
|
51
|
+
ary = []
|
52
|
+
|
53
|
+
%i[included excluded].each do |type|
|
54
|
+
next if tags[type].nil?
|
55
|
+
|
56
|
+
%i[tags parodies characters artists groups languages categories].each do |subtype|
|
57
|
+
next if tags[type][subtype].empty? || tags[type][subtype].nil?
|
58
|
+
|
59
|
+
ary <<
|
60
|
+
tags[type][subtype]
|
61
|
+
.map { |word| word.include?(' ') ? "\"#{word}\"" : word }
|
62
|
+
.map { |word| word.prepend("#{subtype}:") }
|
63
|
+
.map { |word| type == :excluded ? word.prepend('-') : word }
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
ary
|
68
|
+
end
|
69
|
+
|
70
|
+
def parse_keywords(keywords)
|
71
|
+
%i[included excluded].map do |type|
|
72
|
+
next if keywords[type].nil?
|
73
|
+
|
74
|
+
keywords[type]
|
75
|
+
.map { |word| type == :excluded ? word.prepend('-') : word }
|
76
|
+
.map { |word| word.include?(' ') ? "\"#{word}\"" : word }
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
data/lib/nhentai-api.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nhentai-api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Gael Roussel
|
@@ -17,6 +17,9 @@ extensions: []
|
|
17
17
|
extra_rdoc_files: []
|
18
18
|
files:
|
19
19
|
- lib/nhentai-api.rb
|
20
|
+
- lib/nhentai-api/doujinshi.rb
|
21
|
+
- lib/nhentai-api/key.rb
|
22
|
+
- lib/nhentai-api/search.rb
|
20
23
|
homepage: https://rubygems.org/gems/nhentai-api
|
21
24
|
licenses:
|
22
25
|
- MIT
|
@@ -40,7 +43,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
40
43
|
- !ruby/object:Gem::Version
|
41
44
|
version: '0'
|
42
45
|
requirements: []
|
43
|
-
rubygems_version: 3.
|
46
|
+
rubygems_version: 3.1.6
|
44
47
|
signing_key:
|
45
48
|
specification_version: 4
|
46
49
|
summary: nhentai-api is a basic and easy to use API for nhentai.net
|