Spaces:
Runtime error
Runtime error
| # This file is part of the AutoAnime distribution. | |
| # Copyright (c) 2025 Kaif_00z | |
| # | |
| # This program is free software: you can redistribute it and/or modify | |
| # it under the terms of the GNU General Public License as published by | |
| # the Free Software Foundation, version 3. | |
| # | |
| # This program is distributed in the hope that it will be useful, but | |
| # WITHOUT ANY WARRANTY; without even the implied warranty of | |
| # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| # General Public License for more details. | |
| # | |
| # License can be found in < | |
| # https://github.com/kaif-00z/AutoAnimeBot/blob/main/LICENSE > . | |
| # if you are using this following code then don't forgot to give proper | |
| # credit to t.me/kAiF_00z (github.com/kaif-00z) | |
| import asyncio | |
| import hashlib | |
| import shutil | |
| import sys | |
| from itertools import count | |
| from traceback import format_exc | |
| import anitopy | |
| from feedparser import parse | |
| from database import LOGS, DataBase | |
| class SubsPlease: | |
| def __init__(self, dB: DataBase): | |
| self.db = dB | |
| def digest(self, string: str): | |
| return hashlib.sha256(string.encode()).hexdigest() | |
| def _exit(self): | |
| LOGS.info("Stopping The Bot...") | |
| try: | |
| [shutil.rmtree(fold) for fold in ["downloads", "thumbs", "encode"]] | |
| except BaseException: | |
| LOGS.error(format_exc()) | |
| sys.exit(0) | |
| def rss_feed_data(self): | |
| try: | |
| return ( | |
| parse("https://subsplease.org/rss/?r=1080"), | |
| parse("https://subsplease.org/rss/?r=720"), | |
| parse("https://subsplease.org/rss/?r=sd"), | |
| ) | |
| except KeyboardInterrupt: | |
| self._exit() | |
| except BaseException: | |
| LOGS.error(format_exc()) | |
| return None, None, None | |
| async def feed_optimizer(self): | |
| d1080, d720, d480 = self.rss_feed_data() | |
| if not d1080 or not d720 or not d480: | |
| return None | |
| for i in range(2, -1, -1): | |
| try: | |
| f1080, f720, f480 = d1080.entries[i], d720.entries[i], d480.entries[i] | |
| a1080, a720, a480 = ( | |
| (anitopy.parse(f1080.title)).get("anime_title"), | |
| (anitopy.parse(f720.title)).get("anime_title"), | |
| (anitopy.parse(f480.title)).get("anime_title"), | |
| ) | |
| if a1080 == a720 == a480: | |
| if ( | |
| "[Batch]" in f1080.title | |
| or "[Batch]" in f720.title | |
| or "[Batch]" in f480.title | |
| ): | |
| continue | |
| uid = self.digest(f1080.title + f720.title + f480.title) | |
| if not await self.db.is_anime_uploaded(uid): | |
| return {"uid": uid, "1080p": f1080, "720p": f720, "480p": f480} | |
| except BaseException: | |
| LOGS.error(format_exc()) | |
| return None | |
| async def on_new_anime(self, function): | |
| for i in count(): | |
| data = await self.feed_optimizer() | |
| if data: | |
| await function(data) | |
| await self.db.add_anime(data.get("uid")) | |
| await asyncio.sleep(5) | |