1
0
mirror of https://github.com/natekspencer/hacs-oasis_mini.git synced 2025-12-06 18:44:14 -05:00

Ensure update_tracks closes the connection

This commit is contained in:
Nathan Spencer
2025-11-24 01:26:46 +00:00
parent 0ebab392fb
commit 0df118d18d

View File

@@ -30,47 +30,51 @@ def get_author_name(data: dict) -> str:
async def update_tracks() -> None:
"""
Fetch tracks from the Grounded Labs cloud, detect new or changed public tracks compared to the local TRACKS mapping, augment changed entries with author and reduced SVG content, and persist the merged, sorted track list to custom_components/oasis_mini/pyoasiscontrol/tracks.json.
Fetch tracks from the Grounded Labs cloud, detect new or changed public tracks
compared to the local TRACKS mapping, augment changed entries with author and
reduced SVG content, and persist the merged, sorted track list to
`custom_components/oasis_mini/pyoasiscontrol/tracks.json`.
Side effects:
- May print error or status messages to stdout.
- Writes the updated tracks JSON file.
- Ensures the OasisCloudClient session is closed and returns early on errors or unexpected data.
- Ensures the OasisCloudClient session is closed and returns early on errors or
unexpected data.
"""
client = OasisCloudClient(access_token=ACCESS_TOKEN)
try:
data = await client.async_get_tracks()
except Exception as ex:
print(type(ex).__name__, ex)
await client.session.close()
return
try:
data = await client.async_get_tracks()
except Exception as ex:
print(type(ex).__name__, ex)
return
if not isinstance(data, list):
print("Unexpected result:", data)
return
if not isinstance(data, list):
print("Unexpected result:", data)
return
updated_tracks: dict[int, dict[str, Any]] = {}
for result in filter(lambda d: d["public"], data):
if (
(track_id := result["id"]) not in TRACKS
or any(
result[field] != TRACKS[track_id].get(field)
for field in ("name", "image", "png_image")
)
or TRACKS[track_id].get("author") != get_author_name(result)
):
print(f"Updating track {track_id}: {result['name']}")
track_info = await client.async_get_track_info(int(track_id))
if not track_info:
print("No track info")
break
result["author"] = get_author_name(result)
result["reduced_svg_content_new"] = track_info.get(
"reduced_svg_content_new"
)
updated_tracks[track_id] = result
await client.session.close()
updated_tracks: dict[int, dict[str, Any]] = {}
for result in filter(lambda d: d["public"], data):
if (
(track_id := result["id"]) not in TRACKS
or any(
result[field] != TRACKS[track_id].get(field)
for field in ("name", "image", "png_image")
)
or TRACKS[track_id].get("author") != get_author_name(result)
):
print(f"Updating track {track_id}: {result['name']}")
track_info = await client.async_get_track_info(int(track_id))
if not track_info:
print("No track info")
break
result["author"] = get_author_name(result)
result["reduced_svg_content_new"] = track_info.get(
"reduced_svg_content_new"
)
updated_tracks[track_id] = result
finally:
await client.async_close()
if not updated_tracks:
print("No updated tracks")