Comet00 / comet /debrid /premiumize.py
Mythus's picture
Upload 26 files
01d9265 verified
import aiohttp
import asyncio
from RTN import parse
from comet.utils.general import is_video
from comet.utils.logger import logger
class Premiumize:
def __init__(self, session: aiohttp.ClientSession, debrid_api_key: str):
self.session = session
self.proxy = None
self.api_url = "https://premiumize.me/api"
self.debrid_api_key = debrid_api_key
async def check_premium(self):
try:
check_premium = await self.session.get(
f"{self.api_url}/account/info?apikey={self.debrid_api_key}"
)
check_premium = await check_premium.text()
if (
'"status":"success"' in check_premium
and '"premium_until":null' not in check_premium
):
return True
except Exception as e:
logger.warning(
f"Exception while checking premium status on Premiumize: {e}"
)
return False
async def get_instant(self, chunk: list):
try:
response = await self.session.get(
f"{self.api_url}/cache/check?apikey={self.debrid_api_key}&items[]={'&items[]='.join(chunk)}"
)
response = await response.json()
response["hashes"] = chunk
return response
except Exception as e:
logger.warning(
f"Exception while checking hash instant availability on Premiumize: {e}"
)
async def get_files(
self, torrent_hashes: list, type: str, season: str, episode: str, kitsu: bool
):
chunk_size = 100
chunks = [
torrent_hashes[i : i + chunk_size]
for i in range(0, len(torrent_hashes), chunk_size)
]
tasks = []
for chunk in chunks:
tasks.append(self.get_instant(chunk))
responses = await asyncio.gather(*tasks)
availability = []
for response in responses:
if not response:
continue
availability.append(response)
files = {}
if type == "series":
for result in availability:
if result["status"] != "success":
continue
responses = result["response"]
filenames = result["filename"]
filesizes = result["filesize"]
hashes = result["hashes"]
for index, response in enumerate(responses):
if not response:
continue
if not filesizes[index]:
continue
filename = filenames[index]
if "sample" in filename:
continue
filename_parsed = parse(filename)
if episode not in filename_parsed.episodes:
continue
if kitsu:
if filename_parsed.seasons:
continue
else:
if season not in filename_parsed.seasons:
continue
files[hashes[index]] = {
"index": f"{season}|{episode}",
"title": filename,
"size": int(filesizes[index]),
}
else:
for result in availability:
if result["status"] != "success":
continue
responses = result["response"]
filenames = result["filename"]
filesizes = result["filesize"]
hashes = result["hashes"]
for index, response in enumerate(responses):
if response is False:
continue
if not filesizes[index]:
continue
filename = filenames[index]
if "sample" in filename:
continue
files[hashes[index]] = {
"index": 0,
"title": filename,
"size": int(filesizes[index]),
}
return files
async def generate_download_link(self, hash: str, index: str):
try:
add_magnet = await self.session.post(
f"{self.api_url}/transfer/directdl?apikey={self.debrid_api_key}&src=magnet:?xt=urn:btih:{hash}",
)
add_magnet = await add_magnet.json()
season = None
if "|" in index:
index = index.split("|")
season = int(index[0])
episode = int(index[1])
content = add_magnet["content"]
for file in content:
filename = file["path"]
if "/" in filename:
filename = filename.split("/")[1]
if not is_video(filename):
content.remove(file)
continue
if season is not None:
filename_parsed = parse(filename)
if (
season in filename_parsed.seasons
and episode in filename_parsed.episodes
):
return file["link"]
max_size_item = max(content, key=lambda x: x["size"])
return max_size_item["link"]
except Exception as e:
logger.warning(
f"Exception while getting download link from Premiumize for {hash}|{index}: {e}"
)