from lib.api.debrid.base import DebridClient
from lib.jacktook.utils import kodilog
from lib.services.debrid.auth import run_debrider_auth
from lib.utils.kodi.utils import dialog_ok, set_setting, translation
class Debrider(DebridClient):
BASE_URL = "https://debrider.app/api/v1"
AUTH_URL = "https://debrider.app/api/app"
def __init__(self, token, user_ip=None):
self.user_ip = user_ip
super().__init__(token)
def auth(self):
kodilog("Debrider: Requesting device code for authentication.")
run_debrider_auth(self)
def remove_auth(self):
set_setting("debrider_token", "")
set_setting("debrider_authorized", "false")
dialog_ok(translation(90544), translation(90561))
def initialize_headers(self):
self.headers = {
"Authorization": f"Bearer {self.token}",
"User-Agent": "Jacktook/1.0",
"Accept": "application/json",
}
if self.user_ip:
self.headers["X-Forwarded-For"] = self.user_ip
def disable_access_token(self):
pass
def _handle_service_specific_errors(self, error_data: dict, status_code: int):
pass
def _make_request(
self,
method: str,
url: str,
data=None,
params=None,
json=None,
is_return_none: bool = False,
is_expected_to_fail: bool = False,
):
params = params or {}
return super()._make_request(
method,
url,
data,
params=params,
json=json,
is_return_none=is_return_none,
is_expected_to_fail=is_expected_to_fail,
)
def get_device_auth_status(self, code):
"""Check the status of device authentication using a code."""
return self._make_request(
"GET",
f"{self.AUTH_URL}/device/auth",
params={"code": code},
is_expected_to_fail=True,
)
def get_device_code(self):
return self._make_request(
"GET",
f"{self.AUTH_URL}/device/code",
)
def get_torrent_instant_availability(self, urls):
return self._make_request(
"POST",
f"{self.BASE_URL}/link/lookup",
json={"data": urls},
)
def create_download_link(self, magnet):
return self._make_request(
"POST",
f"{self.BASE_URL}/link/generate",
json={"data": magnet},
)
def add_torrent_file(self, magnet):
return self._make_request(
"POST",
f"{self.BASE_URL}/tasks",
json={"type": "magnet", "data": magnet},
)
def get_user_info(self):
return self._make_request("GET", f"{self.BASE_URL}/account")
def days_remaining(self):
try:
user = self.get_user_info()
if not user or "subscription" not in user:
return None
premium_until = user["subscription"].get("premium_until")
if not premium_until:
return None
import datetime
try:
expires = datetime.datetime.strptime(premium_until, "%Y-%m-%dT%H:%M:%S.%fZ")
except ValueError:
expires = datetime.datetime.strptime(premium_until, "%Y-%m-%dT%H:%M:%SZ")
days = (expires - datetime.datetime.utcnow()).days
return days
except Exception:
# kodilog(f"Error calculating Debrider days remaining: {e}")
return None