mirror of
https://github.com/NohamR/OqeeRewind.git
synced 2026-04-08 02:50:01 +00:00
add Oqee free login
This commit is contained in:
@@ -65,7 +65,7 @@ def get_date_input():
|
|||||||
"type": "input",
|
"type": "input",
|
||||||
"message": "Enter a start date/time (YYYY-MM-DD HH:MM:SS):",
|
"message": "Enter a start date/time (YYYY-MM-DD HH:MM:SS):",
|
||||||
"name": "datetime",
|
"name": "datetime",
|
||||||
"default": "2025-01-01 12:00:00",
|
"default": datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
|
||||||
"validate": DatetimeValidator(),
|
"validate": DatetimeValidator(),
|
||||||
"invalid_message": "Invalid date/time format. Use YYYY-MM-DD HH:MM:SS",
|
"invalid_message": "Invalid date/time format. Use YYYY-MM-DD HH:MM:SS",
|
||||||
}
|
}
|
||||||
@@ -100,7 +100,7 @@ def get_date_input():
|
|||||||
"default": (
|
"default": (
|
||||||
start_date_result["datetime"]
|
start_date_result["datetime"]
|
||||||
if start_date_result
|
if start_date_result
|
||||||
else "2025-01-01 12:00:00"
|
else datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
),
|
),
|
||||||
"validate": DatetimeValidator(),
|
"validate": DatetimeValidator(),
|
||||||
"when": lambda answers: answers["input_type"] == "End date/time",
|
"when": lambda answers: answers["input_type"] == "End date/time",
|
||||||
|
|||||||
@@ -59,6 +59,10 @@ class OqeeClient: # pylint: disable=too-many-instance-attributes
|
|||||||
self.right_token = None
|
self.right_token = None
|
||||||
self.profil_id = None
|
self.profil_id = None
|
||||||
self.lic_url = "https://license.oqee.net/api/v1/live/license/widevine"
|
self.lic_url = "https://license.oqee.net/api/v1/live/license/widevine"
|
||||||
|
if "fbx" in username.lower():
|
||||||
|
self.abo = True
|
||||||
|
else:
|
||||||
|
self.abo = False
|
||||||
|
|
||||||
self.configure(username, password)
|
self.configure(username, password)
|
||||||
|
|
||||||
@@ -124,10 +128,10 @@ class OqeeClient: # pylint: disable=too-many-instance-attributes
|
|||||||
data = self.session.get(
|
data = self.session.get(
|
||||||
"https://api.oqee.net/api/v2/user/profiles", headers=headers
|
"https://api.oqee.net/api/v2/user/profiles", headers=headers
|
||||||
).json()
|
).json()
|
||||||
logger.info("Selecting first profile by default.")
|
# logger.info("Selecting first profile by default.")
|
||||||
return data["result"][0]["id"]
|
return data["result"][0]["id"]
|
||||||
|
|
||||||
def login_cred(self, username, password):
|
def login_cred_abo(self, username, password):
|
||||||
"""Authenticate with OQEE service using Free account credentials."""
|
"""Authenticate with OQEE service using Free account credentials."""
|
||||||
headers = self._build_headers(
|
headers = self._build_headers(
|
||||||
overrides={
|
overrides={
|
||||||
@@ -209,6 +213,57 @@ class OqeeClient: # pylint: disable=too-many-instance-attributes
|
|||||||
json={"type": "freeoa", "token": token},
|
json={"type": "freeoa", "token": token},
|
||||||
).json()
|
).json()
|
||||||
return data["result"]["token"]
|
return data["result"]["token"]
|
||||||
|
|
||||||
|
|
||||||
|
def login_cred_free(self, username, password):
|
||||||
|
"""Authenticate with OQEE service using Free account credentials."""
|
||||||
|
headers = {
|
||||||
|
'accept': '*/*',
|
||||||
|
'accept-language': 'en-GB,en-US;q=0.9,en;q=0.8',
|
||||||
|
'cache-control': 'no-cache',
|
||||||
|
'content-type': 'application/json',
|
||||||
|
'origin': 'https://tv.free.fr',
|
||||||
|
'pragma': 'no-cache',
|
||||||
|
'priority': 'u=1, i',
|
||||||
|
'referer': 'https://tv.free.fr/',
|
||||||
|
'sec-ch-ua': '"Chromium";v="146", "Not-A.Brand";v="24", "Google Chrome";v="146"',
|
||||||
|
'sec-ch-ua-mobile': '?0',
|
||||||
|
'sec-ch-ua-platform': '"macOS"',
|
||||||
|
'sec-fetch-dest': 'empty',
|
||||||
|
'sec-fetch-mode': 'cors',
|
||||||
|
'sec-fetch-site': 'cross-site',
|
||||||
|
'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36',
|
||||||
|
'x-oqee-customization': '0',
|
||||||
|
'x-oqee-platform': 'web',
|
||||||
|
}
|
||||||
|
|
||||||
|
data = {"provider":"oqee","platform":"web"}
|
||||||
|
|
||||||
|
response = self.session.post('https://api.oqee.net/api/v2/user/oauth/init', headers=headers, json=data).json()
|
||||||
|
redirect_url = response['result']['redirect_url']
|
||||||
|
token = parse_qs(urlparse(redirect_url).query)['token'][0]
|
||||||
|
|
||||||
|
data = {"email":username,"password":password,"token":token}
|
||||||
|
response = self.session.post('https://api.oqee.net/api/v1/user/oauthorize', headers=headers, json=data).json()
|
||||||
|
|
||||||
|
if not response["success"]:
|
||||||
|
raise ValueError(
|
||||||
|
f"Login failed: invalid credentials or error in authentication - {response.get('error', {}).get('msg', 'No error message')}"
|
||||||
|
)
|
||||||
|
parsed_url = parse_qs(urlparse(response["result"]["redirect_url"]).query)
|
||||||
|
if "code" not in parsed_url:
|
||||||
|
raise ValueError(
|
||||||
|
"Login failed: invalid credentials or error in authentication - no code in redirect URL"
|
||||||
|
)
|
||||||
|
code = parsed_url["code"][0]
|
||||||
|
|
||||||
|
data = self.session.post(
|
||||||
|
"https://api.oqee.net/api/v5/user/login",
|
||||||
|
headers=headers,
|
||||||
|
json={"type": "oqeeoa", "token": code},
|
||||||
|
).json()
|
||||||
|
return data["result"]["token"]
|
||||||
|
|
||||||
|
|
||||||
def login_ip(self):
|
def login_ip(self):
|
||||||
"""
|
"""
|
||||||
@@ -231,9 +286,13 @@ class OqeeClient: # pylint: disable=too-many-instance-attributes
|
|||||||
logger.info("No credentials provided, using IP login.")
|
logger.info("No credentials provided, using IP login.")
|
||||||
self.access_token = self.login_ip()
|
self.access_token = self.login_ip()
|
||||||
else:
|
else:
|
||||||
logger.info("Logging in with provided credentials")
|
|
||||||
try:
|
try:
|
||||||
self.access_token = self.login_cred(username, password)
|
if self.abo:
|
||||||
|
logger.info("Logging in with provided credentials (abo account detected).")
|
||||||
|
self.access_token = self.login_cred_abo(username, password)
|
||||||
|
else:
|
||||||
|
logger.info("Logging in with provided credentials (free account detected).")
|
||||||
|
self.access_token = self.login_cred_free(username, password)
|
||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
logger.warning(
|
logger.warning(
|
||||||
"Credential login failed: %s. Falling back to IP login.", e
|
"Credential login failed: %s. Falling back to IP login.", e
|
||||||
@@ -242,8 +301,10 @@ class OqeeClient: # pylint: disable=too-many-instance-attributes
|
|||||||
|
|
||||||
logger.info("Fetching rights token")
|
logger.info("Fetching rights token")
|
||||||
self.right_token = self.right()
|
self.right_token = self.right()
|
||||||
|
logger.debug("Rights token obtained: %s", self.right_token[:10] + "..." if self.right_token else "None")
|
||||||
logger.info("Fetching profile ID")
|
logger.info("Fetching profile ID")
|
||||||
self.profil_id = self.profil()
|
self.profil_id = self.profil()
|
||||||
|
logger.debug("Profile ID obtained: %s", self.profil_id)
|
||||||
|
|
||||||
self.headers = self._build_headers(
|
self.headers = self._build_headers(
|
||||||
overrides={
|
overrides={
|
||||||
|
|||||||
Reference in New Issue
Block a user