ongoing-anime / libs /subsplease.py
taslim19
uploading: by drag
de1ee14
# 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)