simple-rule34 0.1.5.4__py3-none-any.whl → 0.1.6__py3-none-any.whl
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.
- SimpleRule34/Rule34.py +91 -155
- SimpleRule34/aio/types.py +1 -1
- SimpleRule34/exceptions.py +8 -2
- SimpleRule34/types.py +52 -85
- SimpleRule34/utils.py +8 -21
- __init__.py +0 -0
- {simple_rule34-0.1.5.4.dist-info → simple_rule34-0.1.6.dist-info}/METADATA +3 -1
- simple_rule34-0.1.6.dist-info/RECORD +15 -0
- {simple_rule34-0.1.5.4.dist-info → simple_rule34-0.1.6.dist-info}/top_level.txt +1 -0
- simple_rule34-0.1.5.4.dist-info/RECORD +0 -14
- {simple_rule34-0.1.5.4.dist-info → simple_rule34-0.1.6.dist-info}/LICENSE +0 -0
- {simple_rule34-0.1.5.4.dist-info → simple_rule34-0.1.6.dist-info}/WHEEL +0 -0
SimpleRule34/Rule34.py
CHANGED
|
@@ -1,213 +1,149 @@
|
|
|
1
1
|
import random
|
|
2
2
|
import time
|
|
3
|
-
import typing
|
|
4
3
|
|
|
5
|
-
import
|
|
4
|
+
import aiohttp
|
|
6
5
|
import datetime
|
|
7
6
|
import logging
|
|
8
7
|
import xml.etree.ElementTree as ET
|
|
9
8
|
|
|
10
9
|
from .exceptions import *
|
|
11
|
-
from .types import
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
def parse_result(post_element):
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
id = int(post_element.get('id'))
|
|
18
|
-
height = int(post_element.get('height'))
|
|
19
|
-
width = int(post_element.get('width'))
|
|
20
|
-
url = post_element.get('file_url')
|
|
21
|
-
|
|
22
|
-
sample_height = int(post_element.get('sample_height'))
|
|
23
|
-
sample_width = int(post_element.get('sample_width'))
|
|
24
|
-
sample_url = post_element.get('sample_url')
|
|
25
|
-
|
|
26
|
-
sample_post = Rule34SamplePost(sample_height, sample_width, sample_url, id)
|
|
27
|
-
|
|
28
|
-
preview_height = int(post_element.get('preview_height'))
|
|
29
|
-
preview_width = int(post_element.get('preview_width'))
|
|
30
|
-
preview_url = post_element.get('preview_url')
|
|
31
|
-
|
|
32
|
-
preview_post = Rule34PreviewPost(preview_height, preview_width, preview_url, id)
|
|
33
|
-
|
|
34
|
-
score = int(post_element.get('score'))
|
|
35
|
-
rating = post_element.get('rating')
|
|
36
|
-
creator_id = int(post_element.get('creator_id'))
|
|
37
|
-
tags = post_element.get('tags')
|
|
38
|
-
has_children = post_element.get('has_children') == 'true'
|
|
39
|
-
created_date = datetime.datetime.strptime(post_element.get('created_at'), "%a %b %d %H:%M:%S %z %Y")
|
|
40
|
-
status = post_element.get('status')
|
|
41
|
-
source = post_element.get('source')
|
|
42
|
-
has_notes = post_element.get('has_notes') == 'true'
|
|
43
|
-
has_comments = post_element.get('has_comments') == 'true'
|
|
44
|
-
|
|
45
|
-
main_post = Rule34MainPost(score, rating, creator_id, tags, has_children, created_date, status,
|
|
46
|
-
source, has_notes, has_comments, height, width, url, id)
|
|
47
|
-
|
|
48
|
-
return main_post, sample_post, preview_post
|
|
10
|
+
from .types import *
|
|
49
11
|
|
|
50
12
|
|
|
51
13
|
class Rule34Api:
|
|
52
|
-
"""
|
|
53
|
-
Sync main api class
|
|
54
|
-
|
|
55
|
-
"""
|
|
56
|
-
|
|
57
14
|
def __init__(self):
|
|
58
|
-
self.
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
:param tags: Tags in format 'tag1 tag2 ...'. Base ''
|
|
65
|
-
:type tags: str
|
|
66
|
-
|
|
67
|
-
:return: Amount of posts with current tags
|
|
68
|
-
:rtype: int
|
|
69
|
-
"""
|
|
15
|
+
self.header = {'User-Agent': 'rule34-simple-api 0.1.5.6 (Request)'}
|
|
16
|
+
async def get_post_count(self, tags: str = '') -> int:
|
|
17
|
+
async with aiohttp.ClientSession(headers=self.header) as session:
|
|
18
|
+
async with session.get(f'https://api.rule34.xxx/index.php?'
|
|
19
|
+
f'page=dapi&s=post&q=index&tags={tags}') as response:
|
|
20
|
+
xml_data = await response.text()
|
|
70
21
|
|
|
71
|
-
|
|
72
|
-
r = self.s.get(f'https://api.rule34.xxx/index.php?'
|
|
73
|
-
f'page=dapi&s=post&q=index&tags={tags}')
|
|
74
|
-
|
|
75
|
-
xml_root = ET.fromstring(r.text)
|
|
22
|
+
xml_root = ET.fromstring(xml_data)
|
|
76
23
|
|
|
77
24
|
return int(xml_root.get('count'))
|
|
78
25
|
|
|
79
|
-
def get_post(self, id: int) ->
|
|
80
|
-
|
|
81
|
-
This function will search post with your id from rule34.xxx
|
|
82
|
-
|
|
83
|
-
:param id: id of post
|
|
84
|
-
:type id: int
|
|
85
|
-
|
|
86
|
-
:return: On success, returns Rule34PostData object
|
|
87
|
-
:rtype: :obj: 'typing.Optional[Rule34PostData]'
|
|
88
|
-
"""
|
|
89
|
-
|
|
90
|
-
r = self.s.get(f'https://api.rule34.xxx/index.php?'
|
|
91
|
-
f'page=dapi&s=post&q=index&id={id}')
|
|
92
|
-
|
|
93
|
-
try:
|
|
94
|
-
xml_root = ET.fromstring(r.text)
|
|
95
|
-
except:
|
|
96
|
-
return None
|
|
97
|
-
post_element = xml_root.find('post')
|
|
26
|
+
async def get_post(self, id: int) -> Post:
|
|
27
|
+
st = time.time()
|
|
98
28
|
|
|
99
|
-
|
|
29
|
+
async with aiohttp.ClientSession(headers=self.header) as session:
|
|
30
|
+
async with session.get(f'https://api.rule34.xxx/index.php?'
|
|
31
|
+
f'json=1&page=dapi&s=post&q=index&id={id}') as response:
|
|
32
|
+
if response.status != 200:
|
|
33
|
+
raise ApiException(f"Api returned status code {response.status} with message"
|
|
34
|
+
f" {await response.text()}")
|
|
100
35
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
else:
|
|
104
|
-
main_post, sample_post, preview_post = parsed
|
|
36
|
+
j = await response.json()
|
|
37
|
+
data = j[0]
|
|
105
38
|
|
|
106
|
-
|
|
39
|
+
data["main"] = {
|
|
40
|
+
"url": data['file_url']
|
|
41
|
+
}
|
|
42
|
+
data["preview"] = {
|
|
43
|
+
"url": data['preview_url']
|
|
44
|
+
}
|
|
45
|
+
data["tags"] = data["tags"].split(" ")
|
|
107
46
|
|
|
108
|
-
|
|
109
|
-
"""
|
|
110
|
-
This function will search 1 random post with your tags from rule34.xxx
|
|
47
|
+
logging.debug(f"Post[{id}] where found in {time.time() - st}s")
|
|
111
48
|
|
|
112
|
-
|
|
113
|
-
:type tags: str
|
|
49
|
+
return Post(**data)
|
|
114
50
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
"""
|
|
51
|
+
async def get_random_post(self, tags: str = '', forbidden_tags: list[str] = []) -> Post:
|
|
52
|
+
start_time = time.time()
|
|
118
53
|
|
|
119
|
-
post_count = self.get_post_count(tags)
|
|
54
|
+
post_count = await self.get_post_count(tags)
|
|
120
55
|
|
|
121
56
|
page_count = post_count // 1000
|
|
122
57
|
|
|
123
58
|
if page_count > 0:
|
|
124
|
-
post_list = self.get_post_list(page_id=random.randint(0, page_count if page_count <= 200 else 200),
|
|
125
|
-
|
|
59
|
+
post_list = await self.get_post_list(page_id=random.randint(0, page_count if page_count <= 200 else 200),
|
|
60
|
+
tags=tags, limit=1000)
|
|
126
61
|
|
|
127
62
|
else:
|
|
128
|
-
post_list = self.get_post_list(tags=tags, limit=1000)
|
|
129
|
-
|
|
130
|
-
return post_list[random.randint(0, len(post_list) - 1)] if len(post_list) > 0 else None
|
|
131
|
-
|
|
132
|
-
def get_random_posts(self, tags: str = '', count: int = 8) -> list[Rule34PostData]:
|
|
133
|
-
"""
|
|
134
|
-
This function will search your amount of random posts with your tags from rule34.xxx
|
|
63
|
+
post_list = await self.get_post_list(tags=tags, limit=1000)
|
|
135
64
|
|
|
136
|
-
|
|
137
|
-
:type tags: str
|
|
65
|
+
post_list_ = []
|
|
138
66
|
|
|
139
|
-
|
|
140
|
-
|
|
67
|
+
for post in post_list:
|
|
68
|
+
if any(tag in forbidden_tags for tag in post.main.tags):
|
|
69
|
+
pass
|
|
70
|
+
else:
|
|
71
|
+
post_list_.append(post)
|
|
141
72
|
|
|
142
|
-
|
|
143
|
-
:rtype: :obj: 'list[Rule34PostData]'
|
|
73
|
+
logging.debug(f"Random posts where found in {time.time() - start_time}s")
|
|
144
74
|
|
|
145
|
-
|
|
75
|
+
return post_list_[random.randint(0, len(post_list_) - 1)] if len(post_list_) > 0 else None
|
|
146
76
|
|
|
77
|
+
async def get_random_posts(self, tags: str = '', count: int = 8, forbidden_tags: list[str] = []) -> list[Post]:
|
|
147
78
|
st = time.time()
|
|
148
79
|
|
|
149
80
|
request_count = 1
|
|
81
|
+
true_count = count*20
|
|
150
82
|
|
|
151
83
|
post_list = []
|
|
152
84
|
|
|
153
|
-
if
|
|
154
|
-
request_count =
|
|
155
|
-
|
|
156
|
-
for pid in range(request_count + 1):
|
|
157
|
-
post_list += self.get_post_list(tags=tags)
|
|
85
|
+
if true_count > 1000:
|
|
86
|
+
request_count = true_count // 1000
|
|
158
87
|
|
|
159
|
-
|
|
160
|
-
|
|
88
|
+
post_count = await self.get_post_count(tags)
|
|
89
|
+
page_id = int(random.randint(0, int(post_count / true_count)) / 8) if post_count >= true_count else 0
|
|
161
90
|
|
|
162
|
-
|
|
91
|
+
for pid in range(request_count + 1):
|
|
92
|
+
post_list += await self.get_post_list(tags=tags, forbidden_tags=forbidden_tags,
|
|
93
|
+
page_id=page_id, limit=true_count if true_count <= 1000 else 1000)
|
|
163
94
|
|
|
164
|
-
|
|
95
|
+
getted = []
|
|
165
96
|
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
97
|
+
for x in range(count):
|
|
98
|
+
if len(post_list) > 0:
|
|
99
|
+
getted.append(post_list[random.randint(0, len(post_list) - 1)])
|
|
100
|
+
else:
|
|
101
|
+
pass
|
|
170
102
|
|
|
171
|
-
|
|
172
|
-
:type limit: int
|
|
103
|
+
logging.debug(f"{count} random posts where found in {time.time() - st}s")
|
|
173
104
|
|
|
174
|
-
|
|
175
|
-
:type page_id: int
|
|
105
|
+
return getted
|
|
176
106
|
|
|
177
|
-
|
|
178
|
-
|
|
107
|
+
async def get_post_list(self, limit: int = 1000, page_id: int = 0, tags: str = '', forbidden_tags: list[str] = [])\
|
|
108
|
+
-> list[Post]:
|
|
109
|
+
if limit > 1000:
|
|
110
|
+
raise ToBigRequestException(f"The max size of request is 1000 when you tried to request {limit}")
|
|
179
111
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
:type blocked_tags: str or None
|
|
112
|
+
async with aiohttp.ClientSession(headers=self.header) as session:
|
|
113
|
+
start_time = time.time()
|
|
183
114
|
|
|
184
|
-
|
|
185
|
-
|
|
115
|
+
async with session.get(f'https://api.rule34.xxx/index.php?'
|
|
116
|
+
f'json=1&page=dapi&s=post&q=index&limit={limit}&pid={page_id}&tags={tags}') as response:
|
|
117
|
+
if response.status != 200:
|
|
118
|
+
raise ApiException(f"Api returned status code {response.status} with message"
|
|
119
|
+
f" {await response.text()}")
|
|
186
120
|
|
|
187
|
-
|
|
188
|
-
raise ToBigRequestException(f"The max size of request is 1000 when you tried to request {limit}")
|
|
121
|
+
data = await response.json()
|
|
189
122
|
|
|
190
|
-
|
|
123
|
+
logging.debug(f"Request with {limit} limit posts were done in {time.time() - start_time}s")
|
|
191
124
|
|
|
192
|
-
|
|
193
|
-
|
|
125
|
+
post_list = []
|
|
126
|
+
for post_data in data:
|
|
127
|
+
post_data["main"] = {
|
|
128
|
+
"url": post_data['file_url']
|
|
129
|
+
}
|
|
130
|
+
post_data["preview"] = {
|
|
131
|
+
"url": post_data['preview_url']
|
|
132
|
+
}
|
|
133
|
+
post_data["tags"] = post_data["tags"].split(" ")
|
|
194
134
|
|
|
195
|
-
|
|
135
|
+
post_list.append(Post(**post_data))
|
|
196
136
|
|
|
197
|
-
|
|
198
|
-
posts = xml_root.findall('post')
|
|
199
|
-
post_list = []
|
|
137
|
+
start_time = time.time()
|
|
200
138
|
|
|
201
|
-
|
|
202
|
-
for post_element in posts:
|
|
203
|
-
parsed = parse_result(post_element)
|
|
139
|
+
post_list_ = []
|
|
204
140
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
141
|
+
for post in post_list:
|
|
142
|
+
if any(tag in forbidden_tags for tag in post.tags):
|
|
143
|
+
pass
|
|
144
|
+
else:
|
|
145
|
+
post_list_.append(post)
|
|
209
146
|
|
|
210
|
-
|
|
211
|
-
logging.debug(f"Creating {len(posts)} objects where done in {time.time() - start_time}s")
|
|
147
|
+
logging.debug(f"{len(post_list_)} posts where found in {time.time() - start_time}s")
|
|
212
148
|
|
|
213
|
-
|
|
149
|
+
return post_list_
|
SimpleRule34/aio/types.py
CHANGED
|
@@ -36,7 +36,7 @@ class Rule34Post:
|
|
|
36
36
|
|
|
37
37
|
file_name = os.path.basename(self.url)
|
|
38
38
|
save_path = os.path.join(path, file_name)
|
|
39
|
-
with aiofiles.open(save_path, 'wb') as file:
|
|
39
|
+
async with aiofiles.open(save_path, 'wb') as file:
|
|
40
40
|
await file.write(await response.read())
|
|
41
41
|
|
|
42
42
|
return save_path
|
SimpleRule34/exceptions.py
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
1
|
class ToBigRequestException(Exception):
|
|
4
2
|
def __init__(self, msg):
|
|
5
3
|
self.msg = msg
|
|
@@ -15,3 +13,11 @@ class RequestMoreThanAvailableException(Exception):
|
|
|
15
13
|
|
|
16
14
|
def __str__(self):
|
|
17
15
|
return self.msg
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ApiException(Exception):
|
|
19
|
+
def __init__(self, msg):
|
|
20
|
+
self.msg = msg
|
|
21
|
+
|
|
22
|
+
def __str__(self):
|
|
23
|
+
return self.msg
|
SimpleRule34/types.py
CHANGED
|
@@ -1,95 +1,62 @@
|
|
|
1
|
-
import datetime
|
|
2
|
-
import requests
|
|
3
1
|
import os
|
|
2
|
+
import typing
|
|
3
|
+
import aiofiles
|
|
4
|
+
import aiohttp
|
|
4
5
|
|
|
5
|
-
from
|
|
6
|
+
from aiofiles import os as aos
|
|
7
|
+
from pydantic import BaseModel
|
|
6
8
|
|
|
9
|
+
from .exceptions import ApiException
|
|
10
|
+
from .utils import get_file_type
|
|
7
11
|
|
|
8
|
-
class Rule34Post:
|
|
9
|
-
def __init__(self, height: int, width: int, url: str, id: int):
|
|
10
|
-
self.path = r'./rule34_download'
|
|
11
|
-
self.s = requests.Session()
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
self.id = id
|
|
13
|
+
class File(BaseModel):
|
|
14
|
+
url: str
|
|
15
|
+
type: str = None
|
|
17
16
|
|
|
18
|
-
|
|
17
|
+
def __init__(self, /, **data: typing.Any) -> None:
|
|
18
|
+
super().__init__(**data)
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
return f"<Rule34Post(id={self.id}, height={self.height}, width={self.width}, url={self.url})>"
|
|
20
|
+
self.type = get_file_type(self.url)
|
|
22
21
|
|
|
23
|
-
def
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
r = self.s.get(self.url)
|
|
28
|
-
if r.status_code == 200:
|
|
29
|
-
try:
|
|
30
|
-
os.mkdir(self.path)
|
|
31
|
-
except:
|
|
32
|
-
pass
|
|
33
|
-
|
|
34
|
-
file_name = os.path.basename(self.url)
|
|
35
|
-
save_path = os.path.join(path, file_name)
|
|
36
|
-
with open(save_path, 'wb') as file:
|
|
37
|
-
file.write(r.content)
|
|
38
|
-
|
|
39
|
-
return save_path
|
|
40
|
-
else:
|
|
22
|
+
async def download(self, path: str = r'./rule34_download') -> str:
|
|
23
|
+
try:
|
|
24
|
+
await aos.mkdir(path)
|
|
25
|
+
except:
|
|
41
26
|
pass
|
|
42
27
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
return f"<Rule34SamplePost(id={self.id}, height={self.height}, width={self.width}, url={self.url})>"
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
class Rule34PreviewPost(Rule34Post):
|
|
82
|
-
def __str__(self):
|
|
83
|
-
return f"<Rule34PreviewPost(id={self.id}, height={self.height}, width={self.width}, url={self.url})>"
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
class Rule34PostData:
|
|
87
|
-
def __init__(self, id: int, main: Rule34MainPost, sample: Rule34SamplePost, preview: Rule34PreviewPost):
|
|
88
|
-
self.id = id
|
|
89
|
-
self.main = main
|
|
90
|
-
self.sample = sample
|
|
91
|
-
self.preview = preview
|
|
92
|
-
|
|
93
|
-
def __str__(self):
|
|
94
|
-
return f"<Rule34PostData(id={self.id}, main={str(self.main)}, sample={str(self.sample)}," \
|
|
95
|
-
f" preview={str(self.preview)})>"
|
|
28
|
+
async with aiohttp.ClientSession() as session:
|
|
29
|
+
async with session.get(self.url) as response:
|
|
30
|
+
if response.status != 200:
|
|
31
|
+
raise ApiException(f"Api returned status code {response.status} with message"
|
|
32
|
+
f" {await response.text()}")
|
|
33
|
+
|
|
34
|
+
file_name = os.path.basename(self.url)
|
|
35
|
+
save_path = os.path.join(path, file_name)
|
|
36
|
+
|
|
37
|
+
async with aiofiles.open(save_path, 'wb') as file:
|
|
38
|
+
await file.write(await response.read())
|
|
39
|
+
|
|
40
|
+
return save_path
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
class Post(BaseModel):
|
|
44
|
+
directory: int
|
|
45
|
+
hash: str
|
|
46
|
+
width: int
|
|
47
|
+
height: int
|
|
48
|
+
id: int
|
|
49
|
+
change: int
|
|
50
|
+
owner: str
|
|
51
|
+
parent_id: int
|
|
52
|
+
rating: str
|
|
53
|
+
sample: bool
|
|
54
|
+
score: int
|
|
55
|
+
tags: list
|
|
56
|
+
source: str
|
|
57
|
+
status: str
|
|
58
|
+
has_notes: bool
|
|
59
|
+
comment_count: int
|
|
60
|
+
|
|
61
|
+
main: File
|
|
62
|
+
preview: File
|
SimpleRule34/utils.py
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
|
-
import requests
|
|
2
1
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
return None
|
|
2
|
+
async def get_file_size(url, session):
|
|
3
|
+
async with session.head(url=url, allow_redirects=True) as response:
|
|
4
|
+
if 'Content-Length' in response.headers:
|
|
5
|
+
size = int(response.headers['Content-Length'])
|
|
6
|
+
return size
|
|
7
|
+
else:
|
|
8
|
+
return None
|
|
11
9
|
|
|
12
10
|
|
|
13
11
|
def get_file_type(url):
|
|
@@ -16,20 +14,9 @@ def get_file_type(url):
|
|
|
16
14
|
return 'photo'
|
|
17
15
|
elif file_extension in ['mp4', 'avi', 'mov']:
|
|
18
16
|
return 'video'
|
|
19
|
-
elif file_extension == '
|
|
17
|
+
elif file_extension == 'gif':
|
|
20
18
|
return 'animation'
|
|
21
19
|
else:
|
|
22
20
|
return None
|
|
23
21
|
|
|
24
22
|
|
|
25
|
-
def remove_blocked_tags_posts(post_list, blocked_tags):
|
|
26
|
-
post_list_ = []
|
|
27
|
-
|
|
28
|
-
for post in post_list:
|
|
29
|
-
if blocked_tags in post.main.tags:
|
|
30
|
-
pass
|
|
31
|
-
else:
|
|
32
|
-
post_list_.append(post)
|
|
33
|
-
|
|
34
|
-
return post
|
|
35
|
-
|
__init__.py
ADDED
|
File without changes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: simple_rule34
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.6
|
|
4
4
|
Summary: Simple api wrapper of rule34.xxx for python with asynchronous support
|
|
5
5
|
Author-email: StarMan12 <author@example.com>
|
|
6
6
|
Project-URL: Homepage, https://github.com/SyperAlexKomp/simple-rule34-api
|
|
@@ -50,6 +50,8 @@ Requires-Dist: urllib3 ==2.0.3
|
|
|
50
50
|
Requires-Dist: yarg ==0.1.9
|
|
51
51
|
Requires-Dist: yarl ==1.9.2
|
|
52
52
|
Requires-Dist: zipp ==3.16.2
|
|
53
|
+
Requires-Dist: aiofiles ~=23.2.1
|
|
54
|
+
Requires-Dist: pydantic ~=2.7.1
|
|
53
55
|
|
|
54
56
|
# rule34-simple-api
|
|
55
57
|
Simple api wrapper of rule34.xxx for python with asynchronous support
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
SimpleRule34/Rule34.py,sha256=yVgZFMuCyC8VHbhxDWO37DnMvodkh9d8RYNRVtaHnIk,5433
|
|
3
|
+
SimpleRule34/__init__.py,sha256=C4IbcJ_rjqBhpENXImVGuEQxf81GUwNaycqNNAY_ROc,31
|
|
4
|
+
SimpleRule34/exceptions.py,sha256=dUpJBROzXWT67ZOLAHWWse0srvMRunIa9rSl1Cs10B8,491
|
|
5
|
+
SimpleRule34/setup.py,sha256=7hNDTD52EAs7W00-Nd5LzvH8H4-Dvc59W8a999LqvW4,735
|
|
6
|
+
SimpleRule34/types.py,sha256=n9y60b96g9wyD8FAZ_ElETBFNnM1F1GAs5VoxzCFI68,1518
|
|
7
|
+
SimpleRule34/utils.py,sha256=fWx-ntJ672NoktH5Ws9-FcO0gtCNVmd8VfxFxjWqsD0,616
|
|
8
|
+
SimpleRule34/aio/ARule34.py,sha256=nZwxmMNo_g_a16U9dJmxFGUIkDtgNB-W0uFH8LJ8tSI,6858
|
|
9
|
+
SimpleRule34/aio/types.py,sha256=919XQt5ydRoLeVxy5HRujc0IeKYlD3crYuH_qvPqdKY,3719
|
|
10
|
+
SimpleRule34/aio/utils.py,sha256=fWx-ntJ672NoktH5Ws9-FcO0gtCNVmd8VfxFxjWqsD0,616
|
|
11
|
+
simple_rule34-0.1.6.dist-info/LICENSE,sha256=6kbiFSfobTZ7beWiKnHpN902HgBx-Jzgcme0SvKqhKY,1091
|
|
12
|
+
simple_rule34-0.1.6.dist-info/METADATA,sha256=dDBVIIRhZOzlaayIKolcj74YeEzKpsdGWWPi5bhQ_44,2154
|
|
13
|
+
simple_rule34-0.1.6.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
|
14
|
+
simple_rule34-0.1.6.dist-info/top_level.txt,sha256=YI-Z1ijzIjlJw2WeM95PSmClCzIvm24KAlyZi80YVNs,22
|
|
15
|
+
simple_rule34-0.1.6.dist-info/RECORD,,
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
SimpleRule34/Rule34.py,sha256=3eMo_5a20g8eQVlSwm3EBJVZVlxdiB354EejMRWnqMs,7136
|
|
2
|
-
SimpleRule34/__init__.py,sha256=C4IbcJ_rjqBhpENXImVGuEQxf81GUwNaycqNNAY_ROc,31
|
|
3
|
-
SimpleRule34/exceptions.py,sha256=8MbvBbdb254UaYWfPg3xo_GbSDO6L9iI0d2AFaet9AM,354
|
|
4
|
-
SimpleRule34/setup.py,sha256=7hNDTD52EAs7W00-Nd5LzvH8H4-Dvc59W8a999LqvW4,735
|
|
5
|
-
SimpleRule34/types.py,sha256=PpIHfMlFfRvXAZ_0Seaj9HJH6f_9JpJHCELIoSbeyuo,3278
|
|
6
|
-
SimpleRule34/utils.py,sha256=lVbM6w2z9QwdOhVpff4q73_DfPLxDEXPVlxI2M6aK6I,854
|
|
7
|
-
SimpleRule34/aio/ARule34.py,sha256=nZwxmMNo_g_a16U9dJmxFGUIkDtgNB-W0uFH8LJ8tSI,6858
|
|
8
|
-
SimpleRule34/aio/types.py,sha256=XvhZAYG7AzrT2iKRVlXGwS_EIqrn406vG7P2OnPfcx8,3713
|
|
9
|
-
SimpleRule34/aio/utils.py,sha256=fWx-ntJ672NoktH5Ws9-FcO0gtCNVmd8VfxFxjWqsD0,616
|
|
10
|
-
simple_rule34-0.1.5.4.dist-info/LICENSE,sha256=6kbiFSfobTZ7beWiKnHpN902HgBx-Jzgcme0SvKqhKY,1091
|
|
11
|
-
simple_rule34-0.1.5.4.dist-info/METADATA,sha256=23_XOZltBacTOjrNr1vyGPLYGr7FwneROn_kRmEBaE4,2089
|
|
12
|
-
simple_rule34-0.1.5.4.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
|
13
|
-
simple_rule34-0.1.5.4.dist-info/top_level.txt,sha256=IrrcPxvAx-V0ikmhRaLYkjYt-hZ9SRGTcUdtAcbMzGE,13
|
|
14
|
-
simple_rule34-0.1.5.4.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|