Spaces:
Runtime error
Runtime error
import os | |
from typing import Literal, Optional, Iterator, Tuple, Union, List | |
from hbutils.system import urlsplit | |
from .web import WebDataSource | |
from ..utils import get_requests_session, srequest | |
SelectTyping = Literal['thumb', 'small', 'medium', 'large', 'full'] | |
class DerpibooruLikeSource(WebDataSource): | |
def __init__(self, site_name: str, site_url: str, | |
tags: List[str], key: Optional[str] = None, select: SelectTyping = 'large', | |
download_silent: bool = True, group_name: Optional[str] = None): | |
WebDataSource.__init__(self, group_name or site_name, get_requests_session(), download_silent) | |
self.tags = tags | |
self.key = key | |
self.select = select | |
self.site_name = site_name | |
self.site_url = site_url | |
def _params(self, page): | |
params = { | |
'q': ' '.join(self.tags), | |
'per_page': '100', | |
'page': str(page), | |
} | |
if self.key: | |
params['key'] = self.key | |
return params | |
def _get_url(self, data): | |
if self.select in data['representations']: | |
return data['representations'][self.select] | |
else: | |
return data['representations']['full'] | |
def _iter_data(self) -> Iterator[Tuple[Union[str, int], str, dict]]: | |
page = 1 | |
while True: | |
resp = srequest(self.session, 'GET', f'{self.site_url}/api/v1/json/search/images', | |
params=self._params(page)) | |
resp.raise_for_status() | |
posts = resp.json()['images'] | |
for data in posts: | |
url = self._get_url(data) | |
_, ext_name = os.path.splitext(urlsplit(url).filename) | |
filename = f'{self.group_name}_{data["id"]}{ext_name}' | |
meta = { | |
self.site_name: data, | |
'group_id': f'{self.group_name}_{data["id"]}', | |
'filename': filename, | |
'tags': {key.replace(' ', '_'): 1.0 for key in data['tags']} | |
} | |
yield data['id'], url, meta | |
page += 1 | |
class DerpibooruSource(DerpibooruLikeSource): | |
def __init__(self, tags: List[str], key: Optional[str] = None, select: SelectTyping = 'large', | |
download_silent: bool = True, group_name: str = 'derpibooru'): | |
DerpibooruLikeSource.__init__(self, 'derpibooru', 'https://derpibooru.org', | |
tags, key, select, download_silent, group_name) | |
class FurbooruSource(DerpibooruLikeSource): | |
def __init__(self, tags: List[str], key: Optional[str] = None, select: SelectTyping = 'large', | |
download_silent: bool = True, group_name: str = 'furbooru'): | |
DerpibooruLikeSource.__init__(self, 'furbooru', 'https://furbooru.com', | |
tags, key, select, download_silent, group_name) | |