nhentai-api 0.3 → 1.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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/nhentai-api.rb +32 -151
  3. metadata +5 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 926018495ec0cfbf18b0cd8925ed8134dbc1535b153894c17b063f52243b699d
4
- data.tar.gz: 64c9ed0d11c68d6e197228a0e4fc33d9f762c9fbeb4a3d47548a55769e45ebc8
3
+ metadata.gz: 4d63124d136363e121f01218322464cde8ea037e567b73246ffdc56fde309dd0
4
+ data.tar.gz: 34796062c118c4db00bac99648af7a7be3f23d2fc5e85751e82929486235fbae
5
5
  SHA512:
6
- metadata.gz: 5d3341acdeb0c156ff91e12d21d1f606c8a1ee2d53c5fea454892977389aba4a8730cfa968fb843856efeab522d7afaf75f1be3ad250cdf347220beb642b5c99
7
- data.tar.gz: 4462036c84fa2d4096074bb100ec1a4e4a2aaccfdeb5dded595ea1f09cedacbedadc77bb90d10923a88c6821c1f6fb971e862e537930af2341396281b1474765
6
+ metadata.gz: b690c41f13b19bf979c3d21ef001a4ed6d26975fe214b22c1eac0364130d9d1ba006cc4a5af6beec518c8e20cb90749bc830de2e965072699cae406c6bb5a77a
7
+ data.tar.gz: 687c9c8b048e0d16bc848111d3b6cde52339cad52b8bbcd8f235b5a6e597cdd439b6a06d15dd06f77547dc9adcba5cdb0daaaef708783d06bdbebfd21babbd29
data/lib/nhentai-api.rb CHANGED
@@ -1,155 +1,36 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'net/http'
4
- require 'ostruct'
5
- require 'time'
6
- require 'json'
7
-
8
- class Doujinshi
9
- attr_reader :id, :client, :media_id, :count_pages, :response
10
-
11
- def initialize(id)
12
- @id = id
13
- @client = Net::HTTP.get_response(URI("https://nhentai.net/g/#{@id}/"))
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
18
- end
19
-
20
- def exists?
21
- client.code == '200'
22
- end
23
-
24
- def title
25
- client.body.match(/"pretty">(.*?)</)[1]
26
- end
27
-
28
- def cover
29
- res = client.body.match(%r{https://t.*.nhentai.net/galleries/#{media_id}/cover\.(.{3})"})
30
-
31
- "https://t.nhentai.net/galleries/#{media_id}/cover.#{res[1]}"
32
- end
33
-
34
- def page(page = 1)
35
- res = client.body.match(%r{https://t.*.nhentai.net/galleries/#{media_id}/#{page}t\.(.{3})"})
36
-
37
- "https://i.nhentai.net/galleries/#{media_id}/#{page}.#{res[1]}"
38
- end
39
-
40
- def pages
41
- (1..count_pages).map { |page| page(page) }
42
- end
43
-
44
- def thumbnail(page = 1)
45
- res = client.body.match(%r{https://t.*.nhentai.net/galleries/#{media_id}/(#{page}t\..{3})"})
46
-
47
- "https://t.nhentai.net/galleries/#{media_id}/#{res[1]}"
48
- end
49
-
50
- def thumbnails
51
- (1..count_pages).map { |page| thumbnail(page) }
52
- end
53
-
54
- def count_favorites
55
- regex = %r{<span>Favorite <span class="nobold">.(\d+).<\/span><\/span>}
56
-
57
- client.body.match(regex)[1].to_i
58
- end
59
-
60
- def upload_date
61
- Time.iso8601(client.body.match(/<time .+ datetime="(.*?)"/)[1])
3
+ %w[net/http ostruct time json].each { |e| require e }
4
+ %w[doujinshi search key].each { |e| require_relative e }
5
+
6
+ SORT = {
7
+ today: 'popular-today',
8
+ week: 'popular-week',
9
+ all_time: 'popular'
10
+ }.freeze
11
+
12
+ IMAGE_EXTENSION = {
13
+ 'j' => 'jpg',
14
+ 'p' => 'png',
15
+ 'g' => 'gif'
16
+ }.freeze
17
+
18
+ SINGULAR_TAG = {
19
+ 'tags' => 'tag',
20
+ 'parodies' => 'parody',
21
+ 'characters' => 'character',
22
+ 'artists' => 'artist',
23
+ 'groups' => 'group',
24
+ 'languages' => 'language',
25
+ 'categories' => 'category'
26
+ }.freeze
27
+
28
+ def parse_tiles(res)
29
+ res.map do |line|
30
+ id = line.match(%r{/g/(\d+)/})[1]
31
+ name = line.match(/<div class="caption">(.+)/)[1].strip
32
+ url = "/g/#{id}"
33
+
34
+ OpenStruct.new(id: id, name: name, url: url)
62
35
  end
63
-
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}")
67
-
68
- res = client.body.match(%r{#{method.capitalize}:\s*<span class="tags">(.+)<\/span>})
69
- return [] if res.nil?
70
-
71
- instance_variable_set("@#{method}", parsing_informations(res[1]))
72
- end
73
-
74
- define_method "count_#{method}" do
75
- send(method).size
76
- end
77
-
78
- define_method "#{method}?" do
79
- !send(method).empty?
80
- end
81
- end
82
-
83
- private
84
-
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)
91
-
92
- OpenStruct.new(id: id, name: name, count: count, url: url)
93
- end
94
- end
95
-
96
- def parse_id(line)
97
- line.match(/tag-(\d+)/)[1]
98
- end
99
-
100
- def parse_name(line)
101
- line.match(/class="name">(.+?)</)[1].strip
102
- end
103
-
104
- def parse_count(line)
105
- count = line.match(/class="count">(\d+.)</)[1]
106
-
107
- count[-1] == 'K' ? count.to_i * 1000 : count.to_i
108
- end
109
-
110
- def parse_url(line)
111
- line.match(/href=\"(.+?)\"/)[1]
112
- end
113
- end
114
-
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?
122
-
123
- @client.body.match(%r{<a.*class="count">(.*)<\/span><\/a>})[1].to_i
124
- end
125
-
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?
132
-
133
- res = @client.body.split(%r{<div class="gallery".+?>(.*?)<\/div>}).select { |line| line.include?('<a href="/g/') }
134
- parse_tags(res)
135
- end
136
-
137
- private
138
-
139
- def self.exists?
140
- @client.code == '200'
141
- end
142
-
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}"
148
-
149
- OpenStruct.new(id: id, name: name, url: url)
150
- end
151
- end
152
- end
153
-
154
- Kernel.const_set(class_name.capitalize, c)
155
36
  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.3'
4
+ version: '1.0'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gael Roussel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-05-14 00:00:00.000000000 Z
11
+ date: 2022-05-20 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
@@ -22,6 +22,9 @@ licenses:
22
22
  - MIT
23
23
  metadata:
24
24
  source_code_uri: https://github.com/Mraiih/nhentai-api
25
+ changelog_uri: https://github.com/Mraiih/nhentai-api/blob/master/CHANGELOG.md
26
+ documentation_uri: https://github.com/Mraiih/nhentai-api/wiki/Documentation
27
+ funding_uri: https://ko-fi.com/mraiih
25
28
  post_install_message:
26
29
  rdoc_options: []
27
30
  require_paths: