nhentai-api 0.3 → 1.0

Sign up to get free protection for your applications and to get access to all the features.
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: