Skip to content

Commit

Permalink
Crash fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
jampez77 committed Jul 30, 2024
1 parent c1f333f commit d616d12
Show file tree
Hide file tree
Showing 7 changed files with 90 additions and 81 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ This project is very much a work in progress and there are still many issues tha

Enjoying this? Help me out with a :beers: or :coffee:!

[![coffee](https://www.buymeacoffee.com/assets/img/custom_images/black_img.png)](https://www.buymeacoffee.com/jampez77)
[![coffee](https://www.buymeacoffee.com/assets/img/custom_images/black_img.png)](https://www.buymeacoffee.com/whenitworks)


## Installation through [HACS](https://hacs.xyz/)
Expand Down
11 changes: 8 additions & 3 deletions custom_components/ryanair/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@

from homeassistant.helpers.typing import ConfigType
from homeassistant.config_entries import ConfigEntry
from homeassistant.exceptions import ConfigEntryNotReady
from homeassistant.const import Platform
from homeassistant.core import HomeAssistant
from .const import DOMAIN
import homeassistant.helpers.config_validation as cv
import asyncio

PLATFORMS = [Platform.SENSOR, Platform.IMAGE]
CONFIG_SCHEMA = cv.empty_config_schema(DOMAIN)
Expand All @@ -24,9 +26,12 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool:
hass.data[DOMAIN][entry.entry_id] = hass_data

# Forward the setup to the sensor platform.
await hass.config_entries.async_forward_entry_setups(
entry, PLATFORMS
)
try:
await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS)
except (asyncio.TimeoutError) as ex:
raise ConfigEntryNotReady(
f"Timeout while loading config entry for"
) from ex
return True


Expand Down
12 changes: 8 additions & 4 deletions custom_components/ryanair/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from homeassistant.data_entry_flow import FlowResult
from homeassistant.const import CONF_EMAIL, CONF_PASSWORD
from homeassistant.helpers.json import save_json
from homeassistant.util.json import load_json_object
from homeassistant.util.json import load_json_object, JsonObjectType
from .const import (
DOMAIN,
CONF_DEVICE_FINGERPRINT,
Expand Down Expand Up @@ -43,6 +43,10 @@
)


async def async_load_json_object(hass: HomeAssistant, path: Path) -> JsonObjectType:
return await hass.async_add_executor_job(load_json_object, path)


async def validate_input(hass: HomeAssistant, data: dict[str, Any]) -> dict[str, Any]:
"""Validate the user input allows us to connect."""
session = async_get_clientsession(hass)
Expand Down Expand Up @@ -147,7 +151,7 @@ async def async_step_mfa(
else:
# if data is not null and contains MFA TOKEN then initiate MFA capture
if CUSTOMER_ID in info["data"]:
users = load_json_object(CREDENTIALS)
users = await async_load_json_object(self.hass, CREDENTIALS)

users[user_input[CONF_DEVICE_FINGERPRINT]
][CONF_DEVICE_FINGERPRINT] = user_input[CONF_DEVICE_FINGERPRINT]
Expand Down Expand Up @@ -189,7 +193,7 @@ async def async_step_user(

user_input[CONF_DEVICE_FINGERPRINT] = self._fingerprint

users = load_json_object(CREDENTIALS)
users = await async_load_json_object(self.hass, CREDENTIALS)
ryanairData = {
CONF_EMAIL: user_input[CONF_EMAIL],
CONF_PASSWORD: user_input[CONF_PASSWORD],
Expand Down Expand Up @@ -220,7 +224,7 @@ async def async_step_user(
},
)
if CUSTOMER_ID in info["data"]:
users = load_json_object(CREDENTIALS)
users = await async_load_json_object(self.hass, CREDENTIALS)

users[user_input[CONF_DEVICE_FINGERPRINT]
][CONF_DEVICE_FINGERPRINT] = user_input[CONF_DEVICE_FINGERPRINT]
Expand Down
52 changes: 28 additions & 24 deletions custom_components/ryanair/coordinator.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,8 @@
CLIENT
)
from .errors import RyanairError, InvalidAuth, APIRatelimitExceeded, UnknownError
from homeassistant.exceptions import ConfigEntryAuthFailed
from homeassistant.util.json import load_json_object
from homeassistant.exceptions import ConfigEntryAuthFailed, HomeAssistantError
from homeassistant.util.json import load_json_object, JsonObjectType
from homeassistant.helpers.json import save_json
from pathlib import Path
_LOGGER = logging.getLogger(__name__)
Expand All @@ -64,6 +64,10 @@
CREDENTIALS = Path(__file__).parent / PERSISTENCE


async def async_load_json_object(hass: HomeAssistant, path: Path) -> JsonObjectType:
return await hass.async_add_executor_job(load_json_object, path)


async def rememberMeToken(self, userData):

rememberMeTokenResp = await self.session.request(
Expand All @@ -81,7 +85,7 @@ async def rememberMeToken(self, userData):
)
rememberMeTokenResponse = await rememberMeTokenResp.json()

users = load_json_object(CREDENTIALS)
users = await async_load_json_object(self.hass, CREDENTIALS)

if rememberMeTokenResponse is not None and ((ACCESS_DENIED in rememberMeTokenResponse and rememberMeTokenResponse[CAUSE] == NOT_AUTHENTICATED) or (
TYPE in rememberMeTokenResponse and rememberMeTokenResponse[TYPE] == CLIENT_ERROR
Expand All @@ -98,7 +102,7 @@ async def rememberMeToken(self, userData):

save_json(CREDENTIALS, users)

return load_json_object(CREDENTIALS)
return await async_load_json_object(self.hass, CREDENTIALS)


async def refreshToken(self, userData):
Expand All @@ -118,7 +122,7 @@ async def refreshToken(self, userData):

save_json(CREDENTIALS, users)

return load_json_object(CREDENTIALS)
return await async_load_json_object(self.hass, CREDENTIALS)


async def getFlights(self, data):
Expand Down Expand Up @@ -227,7 +231,7 @@ def __init__(self, hass: HomeAssistant, session, deviceFingerprint, bookingInfo)
async def _async_update_data(self):
"""Fetch data from API endpoint."""
try:
data = load_json_object(CREDENTIALS)
data = await async_load_json_object(self.hass, CREDENTIALS)
userData = data[self.fingerprint]
if X_REMEMBER_ME_TOKEN not in userData:
userData = await rememberMeToken(self, userData)
Expand Down Expand Up @@ -281,8 +285,9 @@ def __init__(self, hass: HomeAssistant, session, data) -> None:
async def _async_update_data(self):
"""Fetch data from API endpoint."""
try:
boardingPassData = load_json_object(BOARDING_PASS_PERSISTENCE)
data = load_json_object(CREDENTIALS)
boardingPassData = await async_load_json_object(
self.hass, BOARDING_PASS_PERSISTENCE)
data = await async_load_json_object(self.hass, CREDENTIALS)

if self.fingerprint in boardingPassData:
bookingReferences = boardingPassData[self.fingerprint]
Expand All @@ -294,7 +299,7 @@ async def _async_update_data(self):
RECORD_LOCATOR: bookingRef[BOOKING_REFERENCE]
}

data = load_json_object(CREDENTIALS)
data = await async_load_json_object(self.hass, CREDENTIALS)
userData = data[self.fingerprint]
if X_REMEMBER_ME_TOKEN not in userData:
userData = await rememberMeToken(self, userData)
Expand All @@ -311,7 +316,7 @@ async def _async_update_data(self):

if body is not None:
for boardingPass in body:
try:
if "barcode" in boardingPass:
aztec_code = AztecCode(boardingPass['barcode'])

flightName = "(" + boardingPass["flight"]["label"] + ") " + \
Expand All @@ -331,8 +336,6 @@ async def _async_update_data(self):

aztec_code.save(
Path(__file__).parent / BOARDING_PASSES_URI / fileName, module_size=16)
except:
print("Unable to parse barcode")
else:
body = None

Expand Down Expand Up @@ -375,7 +378,7 @@ def __init__(self, hass: HomeAssistant, session, fingerprint) -> None:
async def _async_update_data(self):
"""Fetch data from API endpoint."""
try:
data = load_json_object(CREDENTIALS)
data = await async_load_json_object(self.hass, CREDENTIALS)
userData = data[self.fingerprint]
if X_REMEMBER_ME_TOKEN not in userData:
userData = await rememberMeToken(self, userData)
Expand Down Expand Up @@ -429,20 +432,21 @@ def __init__(self, hass: HomeAssistant, session, fingerprint) -> None:
async def _async_update_data(self):
"""Fetch data from API endpoint."""
try:
data = load_json_object(CREDENTIALS)
userData = data[self.fingerprint]
if X_REMEMBER_ME_TOKEN not in userData:
userData = await rememberMeToken(self, userData)
userData = userData[self.fingerprint]
data = await async_load_json_object(self.hass, CREDENTIALS)
if self.fingerprint in data:
userData = data[self.fingerprint]
if X_REMEMBER_ME_TOKEN not in userData:
userData = await rememberMeToken(self, userData)
userData = userData[self.fingerprint]

body = await getUserProfile(self, userData)
body = await getUserProfile(self, userData)

if (ACCESS_DENIED in body and body[CAUSE] == NOT_AUTHENTICATED) or (
TYPE in body and body[TYPE] == CLIENT_ERROR
):
userData = await refreshToken(self, userData)
if (ACCESS_DENIED in body and body[CAUSE] == NOT_AUTHENTICATED) or (
TYPE in body and body[TYPE] == CLIENT_ERROR
):
userData = await refreshToken(self, userData)

body = await getUserProfile(self, userData[self.fingerprint])
body = await getUserProfile(self, userData[self.fingerprint])

except InvalidAuth as err:
raise ConfigEntryAuthFailed from err
Expand Down
59 changes: 32 additions & 27 deletions custom_components/ryanair/image.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
from homeassistant.core import HomeAssistant
from homeassistant.config_entries import ConfigEntry
from homeassistant.helpers.aiohttp_client import async_get_clientsession
from homeassistant.util.json import load_json_object
from homeassistant.util.json import JsonObjectType
from homeassistant.util.json import load_json_object, JsonObjectType
from homeassistant.exceptions import HomeAssistantError
from pathlib import Path
from datetime import timedelta
import os
Expand Down Expand Up @@ -40,6 +40,10 @@
CREDENTIALS = Path(__file__).parent / PERSISTENCE


async def async_load_json_object(hass: HomeAssistant, path: Path) -> JsonObjectType:
return await hass.async_add_executor_job(load_json_object, path)


def deviceInfo(bookingRef) -> DeviceInfo:
return DeviceInfo(
identifiers={(DOMAIN, f"Ryanair_{bookingRef}")},
Expand All @@ -64,12 +68,12 @@ async def async_setup_platform(
session = async_get_clientsession(hass)

sensors = []
data = load_json_object(CREDENTIALS)
data = await async_load_json_object(hass, CREDENTIALS)

deviceFingerprint = config[CONF_DEVICE_FINGERPRINT]
customerId = config[CUSTOMER_ID]

bookingData = load_json_object(BOARDING_PASS_PERSISTENCE)
bookingData = await async_load_json_object(hass, BOARDING_PASS_PERSISTENCE)
if deviceFingerprint in bookingData:
for bookingData in bookingData[deviceFingerprint]:

Expand Down Expand Up @@ -97,37 +101,38 @@ async def async_setup_platform(

if boardPassCoordinator.data is not None:
for boardingPass in boardPassCoordinator.data:
flightName = "(" + boardingPass["flight"]["label"] + ") " + \
boardingPass["departure"]["name"] + \
" - " + boardingPass["arrival"]["name"]
if "flight" in boardingPass:
flightName = "(" + boardingPass["flight"]["label"] + ") " + \
boardingPass["departure"]["name"] + \
" - " + boardingPass["arrival"]["name"]

seat = boardingPass["seat"]["designator"]
seat = boardingPass["seat"]["designator"]

passenger = boardingPass["name"]["first"] + \
" " + boardingPass["name"]["last"]
passenger = boardingPass["name"]["first"] + \
" " + boardingPass["name"]["last"]

name = passenger + ": " + \
flightName + "(" + seat + ")"
name = passenger + ": " + \
flightName + "(" + seat + ")"

boardingPassDescription = ImageEntityDescription(
key=f"Ryanair_boarding_pass{name}",
name=name,
)
boardingPassDescription = ImageEntityDescription(
key=f"Ryanair_boarding_pass{name}",
name=name,
)

now_utc = dt_util.utcnow().timestamp()
now_utc = dt_util.utcnow().timestamp()

fileName = Path(__file__).parent / (BOARDING_PASSES_URI + "/" +
getFileName(name + boardingPass["departure"]["dateUTC"]))
fileName = Path(__file__).parent / (BOARDING_PASSES_URI + "/" +
getFileName(name + boardingPass["departure"]["dateUTC"]))

nextDay = (datetime.strptime(
boardingPass["departure"]["dateUTC"], "%Y-%m-%dT%H:%M:%SZ") + dt.timedelta(days=1)).timestamp()
nextDay = (datetime.strptime(
boardingPass["departure"]["dateUTC"], "%Y-%m-%dT%H:%M:%SZ") + dt.timedelta(days=1)).timestamp()

if now_utc > nextDay:
if fileName and os.path.isfile(fileName):
os.remove(fileName)
else:
sensors.append(RyanairBoardingPassImage(hass, boardPassCoordinator,
boardingPass, boardingPass["pnr"], name, boardingPassDescription))
if now_utc > nextDay:
if fileName and os.path.isfile(fileName):
os.remove(fileName)
else:
sensors.append(RyanairBoardingPassImage(hass, boardPassCoordinator,
boardingPass, boardingPass["pnr"], name, boardingPassDescription))

async_add_entities(sensors, update_before_add=True)

Expand Down
2 changes: 1 addition & 1 deletion custom_components/ryanair/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,6 @@
"issue_tracker": "https://github.com/jampez77/Ryanair/issues",
"requirements": ["aztec-code-generator==0.11"],
"ssdp": [],
"version": "2023.12.0",
"version": "2024.7.0",
"zeroconf": []
}
Loading

0 comments on commit d616d12

Please sign in to comment.