|
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}" |
|
) |
|
|