import aiohttp import tldextract import lightbulb import pysaucenao import config as c plugin = lightbulb.Plugin("scraper") sauce = pysaucenao.SauceNao(api_key=c.config["saucenao"], priority=(29, 40, 41)) # e621 > Fur Affinity > Twitter async def reverse(urls): return [await _saucenao(url) or await _kheina(url) for url in urls] async def _saucenao(url): try: results = await sauce.from_url(url) except pysaucenao.FileSizeLimitException: raise pysaucenao.FileSizeLimitException(url) except pysaucenao.ImageSizeException: raise pysaucenao.ImageSizeException(url) except pysaucenao.InvalidImageException: raise pysaucenao.InvalidImageException(url) return ( { "url": results[0].url, "artist": ", ".join(results[0].authors) or "Unknown", "thumbnail": results[0].thumbnail, "similarity": round(results[0].similarity), "source": tldextract.extract(results[0].index).domain, } if results else None ) async def _kheina(url): content = await _post("https://api.kheina.com/v1/search", {"url": url}) if content["results"][0]["similarity"] < 50: return None return { "url": content["results"][0]["sources"][0]["source"], "artist": content["results"][0]["sources"][0]["artist"] or "Unknown", "thumbnail": f'https://cdn.kheina.com/file/kheinacom/{content["results"][0]["sources"][0]["sha1"]}.jpg', "similarity": round(content["results"][0]["similarity"]), "source": tldextract.extract(content["results"][0]["sources"][0]["source"]).domain, } async def _post(url, data): async with aiohttp.ClientSession() as session: async with session.post( url, data=data, headers={"User-Agent": "Myned/Modufur (https://github.com/Myned/Modufur)"} ) as response: return await response.json() if response.status == 200 else None def load(bot): bot.add_plugin(plugin) def unload(bot): bot.remove_plugin(plugin)