Module booru.client.furbooru
Expand source code
import aiohttp
from typing import Union
from ..utils.constant import Api, better_object, get_hostname
from random import shuffle, randint
Booru = Api()
class Furbooru(object):
"""furbooru wrapper
Methods
-------
search : function
Search and gets images from furbooru.
search_image : function
Gets images, image urls only from furbooru.
"""
@staticmethod
def append_object(raw_object: dict):
"""Extends new object to the raw dict
Parameters
----------
raw_object : dict
The raw object returned by furbooru.
Returns
-------
str
The new value of the raw object
"""
for i in range(len(raw_object)):
if "id" in raw_object[i]:
raw_object[i][
"post_url"
] = f"{get_hostname(Booru.furbooru)}/images/{raw_object[i]['id']}"
return raw_object
def __init__(self, key: str = ""):
"""Initializes furbooru.
Parameters
----------
key : str
An optional authentication token. If omitted, no user will be authenticated.
"""
if key:
self.key = None
else:
self.key = key
self.specs = {"key": self.key}
async def search(
self,
query: str,
limit: int = 100,
page: int = 1,
random: bool = True,
gacha: bool = False,
):
"""Search and gets images from furbooru.
Parameters
----------
query : str
The query to search for.
limit : int
The limit of images to return.
page : int
The number of desired page
random : bool
Shuffle the whole dict, default is True.
gacha : bool
Get random single object, limit property will be ignored.
Returns
-------
dict
The json object returned by furbooru.
"""
if limit > 1000:
raise ValueError(Booru.error_handling_limit)
self.query = query
self.specs["q"] = self.query
self.specs["per_page"] = limit
self.specs["page"] = page
async with aiohttp.ClientSession() as session:
async with session.get(Booru.furbooru, params=self.specs) as resp:
self.data = await resp.json(content_type=None)
self.final = self.data
if not self.final["images"]:
raise ValueError(Booru.error_handling_null)
self.not_random = Furbooru.append_object(self.final["images"])
shuffle(self.not_random)
try:
if gacha:
return better_object(
self.not_random[randint(0, len(self.not_random))]
)
elif random:
return better_object(self.not_random)
else:
return better_object(
Furbooru.append_object(self.final["images"])
)
except Exception as e:
raise Exception(f"Failed to get data: {e}")
async def search_image(self, query: str, limit: int = 100, page: int = 1):
"""Gets images, meant just image urls from furbooru.
Parameters
----------
query : str
The query to search for.
limit : int
The limit of images to return.
page : int
The number of desired page
Returns
-------
dict
The json object returned by furbooru.
"""
if limit > 1000:
raise ValueError(Booru.error_handling_limit)
self.query = query
self.specs["q"] = self.query
self.specs["per_page"] = limit
self.specs["page"] = page
try:
async with aiohttp.ClientSession() as session:
async with session.get(Booru.furbooru, params=self.specs) as resp:
self.data = await resp.json(content_type=None)
self.final = self.data
self.not_random = [
i["representations"]["full"] for i in self.final["images"]
]
shuffle(self.not_random)
return better_object(self.not_random)
except Exception as e:
raise Exception(f"Failed to get data: {e}")
Classes
class Furbooru (key: str = '')
-
furbooru wrapper
Methods
search : function Search and gets images from furbooru.
search_image : function Gets images, image urls only from furbooru.
Initializes furbooru.
Parameters
key
:str
- An optional authentication token. If omitted, no user will be authenticated.
Expand source code
class Furbooru(object): """furbooru wrapper Methods ------- search : function Search and gets images from furbooru. search_image : function Gets images, image urls only from furbooru. """ @staticmethod def append_object(raw_object: dict): """Extends new object to the raw dict Parameters ---------- raw_object : dict The raw object returned by furbooru. Returns ------- str The new value of the raw object """ for i in range(len(raw_object)): if "id" in raw_object[i]: raw_object[i][ "post_url" ] = f"{get_hostname(Booru.furbooru)}/images/{raw_object[i]['id']}" return raw_object def __init__(self, key: str = ""): """Initializes furbooru. Parameters ---------- key : str An optional authentication token. If omitted, no user will be authenticated. """ if key: self.key = None else: self.key = key self.specs = {"key": self.key} async def search( self, query: str, limit: int = 100, page: int = 1, random: bool = True, gacha: bool = False, ): """Search and gets images from furbooru. Parameters ---------- query : str The query to search for. limit : int The limit of images to return. page : int The number of desired page random : bool Shuffle the whole dict, default is True. gacha : bool Get random single object, limit property will be ignored. Returns ------- dict The json object returned by furbooru. """ if limit > 1000: raise ValueError(Booru.error_handling_limit) self.query = query self.specs["q"] = self.query self.specs["per_page"] = limit self.specs["page"] = page async with aiohttp.ClientSession() as session: async with session.get(Booru.furbooru, params=self.specs) as resp: self.data = await resp.json(content_type=None) self.final = self.data if not self.final["images"]: raise ValueError(Booru.error_handling_null) self.not_random = Furbooru.append_object(self.final["images"]) shuffle(self.not_random) try: if gacha: return better_object( self.not_random[randint(0, len(self.not_random))] ) elif random: return better_object(self.not_random) else: return better_object( Furbooru.append_object(self.final["images"]) ) except Exception as e: raise Exception(f"Failed to get data: {e}") async def search_image(self, query: str, limit: int = 100, page: int = 1): """Gets images, meant just image urls from furbooru. Parameters ---------- query : str The query to search for. limit : int The limit of images to return. page : int The number of desired page Returns ------- dict The json object returned by furbooru. """ if limit > 1000: raise ValueError(Booru.error_handling_limit) self.query = query self.specs["q"] = self.query self.specs["per_page"] = limit self.specs["page"] = page try: async with aiohttp.ClientSession() as session: async with session.get(Booru.furbooru, params=self.specs) as resp: self.data = await resp.json(content_type=None) self.final = self.data self.not_random = [ i["representations"]["full"] for i in self.final["images"] ] shuffle(self.not_random) return better_object(self.not_random) except Exception as e: raise Exception(f"Failed to get data: {e}")
Static methods
def append_object(raw_object: dict)
-
Extends new object to the raw dict
Parameters
raw_object
:dict
- The raw object returned by furbooru.
Returns
str
- The new value of the raw object
Expand source code
@staticmethod def append_object(raw_object: dict): """Extends new object to the raw dict Parameters ---------- raw_object : dict The raw object returned by furbooru. Returns ------- str The new value of the raw object """ for i in range(len(raw_object)): if "id" in raw_object[i]: raw_object[i][ "post_url" ] = f"{get_hostname(Booru.furbooru)}/images/{raw_object[i]['id']}" return raw_object
Methods
async def search(self, query: str, limit: int = 100, page: int = 1, random: bool = True, gacha: bool = False)
-
Search and gets images from furbooru.
Parameters
query
:str
- The query to search for.
limit
:int
- The limit of images to return.
page
:int
- The number of desired page
random
:bool
- Shuffle the whole dict, default is True.
gacha
:bool
- Get random single object, limit property will be ignored.
Returns
dict
- The json object returned by furbooru.
Expand source code
async def search( self, query: str, limit: int = 100, page: int = 1, random: bool = True, gacha: bool = False, ): """Search and gets images from furbooru. Parameters ---------- query : str The query to search for. limit : int The limit of images to return. page : int The number of desired page random : bool Shuffle the whole dict, default is True. gacha : bool Get random single object, limit property will be ignored. Returns ------- dict The json object returned by furbooru. """ if limit > 1000: raise ValueError(Booru.error_handling_limit) self.query = query self.specs["q"] = self.query self.specs["per_page"] = limit self.specs["page"] = page async with aiohttp.ClientSession() as session: async with session.get(Booru.furbooru, params=self.specs) as resp: self.data = await resp.json(content_type=None) self.final = self.data if not self.final["images"]: raise ValueError(Booru.error_handling_null) self.not_random = Furbooru.append_object(self.final["images"]) shuffle(self.not_random) try: if gacha: return better_object( self.not_random[randint(0, len(self.not_random))] ) elif random: return better_object(self.not_random) else: return better_object( Furbooru.append_object(self.final["images"]) ) except Exception as e: raise Exception(f"Failed to get data: {e}")
async def search_image(self, query: str, limit: int = 100, page: int = 1)
-
Gets images, meant just image urls from furbooru.
Parameters
query
:str
- The query to search for.
limit
:int
- The limit of images to return.
page
:int
- The number of desired page
Returns
dict
- The json object returned by furbooru.
Expand source code
async def search_image(self, query: str, limit: int = 100, page: int = 1): """Gets images, meant just image urls from furbooru. Parameters ---------- query : str The query to search for. limit : int The limit of images to return. page : int The number of desired page Returns ------- dict The json object returned by furbooru. """ if limit > 1000: raise ValueError(Booru.error_handling_limit) self.query = query self.specs["q"] = self.query self.specs["per_page"] = limit self.specs["page"] = page try: async with aiohttp.ClientSession() as session: async with session.get(Booru.furbooru, params=self.specs) as resp: self.data = await resp.json(content_type=None) self.final = self.data self.not_random = [ i["representations"]["full"] for i in self.final["images"] ] shuffle(self.not_random) return better_object(self.not_random) except Exception as e: raise Exception(f"Failed to get data: {e}")