Speed up app loading by fetching inventory images concurrently
This commit is contained in:
1 parent
aad27baec0
commit
f32c8f25d8
2 files changed
+39
-24
No files matched your search
@@ -1302,6 +1302,18 @@ class InventoryOverview:
|
|||||||
# refresh only if we're switching to the tab
|
# refresh only if we're switching to the tab
|
||||||
self.refresh()
|
self.refresh()
|
||||||
|
|
||||||
|
def get_status(self, campaign: DropsCampaign) -> tuple[str, str]:
|
||||||
|
if campaign.active:
|
||||||
|
status_text: str = _("gui", "inventory", "status", "active")
|
||||||
|
status_color: str = "green"
|
||||||
|
elif campaign.upcoming:
|
||||||
|
status_text = _("gui", "inventory", "status", "upcoming")
|
||||||
|
status_color = "goldenrod"
|
||||||
|
else:
|
||||||
|
status_text = _("gui", "inventory", "status", "expired")
|
||||||
|
status_color = "red"
|
||||||
|
return (status_text, status_color)
|
||||||
|
|
||||||
def refresh(self):
|
def refresh(self):
|
||||||
for campaign in self._campaigns:
|
for campaign in self._campaigns:
|
||||||
# status
|
# status
|
||||||
@@ -1341,6 +1353,13 @@ class InventoryOverview:
|
|||||||
campaign_frame, text=status_text, takefocus=False, foreground=status_color
|
campaign_frame, text=status_text, takefocus=False, foreground=status_color
|
||||||
)
|
)
|
||||||
status_label.grid(column=1, row=1, sticky="w", padx=4)
|
status_label.grid(column=1, row=1, sticky="w", padx=4)
|
||||||
|
# NOTE: We have to save the campaign's frame and status before any awaits happen,
|
||||||
|
# otherwise the len(self._campaigns) call may overwrite an existing frame,
|
||||||
|
# if the campaigns are added concurrently.
|
||||||
|
self._campaigns[campaign] = {
|
||||||
|
"frame": campaign_frame,
|
||||||
|
"status": status_label,
|
||||||
|
}
|
||||||
# Starts / Ends
|
# Starts / Ends
|
||||||
MouseOverLabel(
|
MouseOverLabel(
|
||||||
campaign_frame,
|
campaign_frame,
|
||||||
@@ -1415,10 +1434,6 @@ class InventoryOverview:
|
|||||||
self._drops[drop.id] = label = MouseOverLabel(drop_frame)
|
self._drops[drop.id] = label = MouseOverLabel(drop_frame)
|
||||||
self.update_progress(drop, label)
|
self.update_progress(drop, label)
|
||||||
label.grid(column=0, row=1)
|
label.grid(column=0, row=1)
|
||||||
self._campaigns[campaign] = {
|
|
||||||
"frame": campaign_frame,
|
|
||||||
"status": status_label,
|
|
||||||
}
|
|
||||||
if self._manager.tabs.current_tab() == 1:
|
if self._manager.tabs.current_tab() == 1:
|
||||||
self._update_visibility(campaign)
|
self._update_visibility(campaign)
|
||||||
self._canvas_update()
|
self._canvas_update()
|
||||||
@@ -1429,18 +1444,6 @@ class InventoryOverview:
|
|||||||
self._drops.clear()
|
self._drops.clear()
|
||||||
self._campaigns.clear()
|
self._campaigns.clear()
|
||||||
|
|
||||||
def get_status(self, campaign: DropsCampaign) -> tuple[str, str]:
|
|
||||||
if campaign.active:
|
|
||||||
status_text: str = _("gui", "inventory", "status", "active")
|
|
||||||
status_color: str = "green"
|
|
||||||
elif campaign.upcoming:
|
|
||||||
status_text = _("gui", "inventory", "status", "upcoming")
|
|
||||||
status_color = "goldenrod"
|
|
||||||
else:
|
|
||||||
status_text = _("gui", "inventory", "status", "expired")
|
|
||||||
status_color = "red"
|
|
||||||
return (status_text, status_color)
|
|
||||||
|
|
||||||
def update_progress(self, drop: TimedDrop, label: MouseOverLabel) -> None:
|
def update_progress(self, drop: TimedDrop, label: MouseOverLabel) -> None:
|
||||||
# Returns: main text, alt text, text color
|
# Returns: main text, alt text, text color
|
||||||
alt_text: str = ''
|
alt_text: str = ''
|
||||||
|
|||||||
@@ -1462,25 +1462,37 @@ class Twitch:
|
|||||||
campaigns.sort(key=lambda c: c.active, reverse=True)
|
campaigns.sort(key=lambda c: c.active, reverse=True)
|
||||||
campaigns.sort(key=lambda c: c.upcoming and c.starts_at or c.ends_at)
|
campaigns.sort(key=lambda c: c.upcoming and c.starts_at or c.ends_at)
|
||||||
campaigns.sort(key=lambda c: c.linked, reverse=True)
|
campaigns.sort(key=lambda c: c.linked, reverse=True)
|
||||||
|
|
||||||
self._drops.clear()
|
self._drops.clear()
|
||||||
self.gui.inv.clear()
|
self.gui.inv.clear()
|
||||||
self.inventory.clear()
|
self.inventory.clear()
|
||||||
|
self._mnt_triggers.clear()
|
||||||
switch_triggers: set[datetime] = set()
|
switch_triggers: set[datetime] = set()
|
||||||
next_hour = datetime.now(timezone.utc) + timedelta(hours=1)
|
next_hour = datetime.now(timezone.utc) + timedelta(hours=1)
|
||||||
for i, campaign in enumerate(campaigns, start=1):
|
# add the campaigns to the internal inventory
|
||||||
status_update(
|
for campaign in campaigns:
|
||||||
_("gui", "status", "adding_campaigns").format(counter=f"({i}/{len(campaigns)})")
|
|
||||||
)
|
|
||||||
self._drops.update({drop.id: drop for drop in campaign.drops})
|
self._drops.update({drop.id: drop for drop in campaign.drops})
|
||||||
if campaign.can_earn_within(next_hour):
|
if campaign.can_earn_within(next_hour):
|
||||||
switch_triggers.update(campaign.time_triggers)
|
switch_triggers.update(campaign.time_triggers)
|
||||||
|
self.inventory.append(campaign)
|
||||||
|
# concurrently add the campaigns into the GUI
|
||||||
# NOTE: this fetches pictures from the CDN, so might be slow without a cache
|
# NOTE: this fetches pictures from the CDN, so might be slow without a cache
|
||||||
await self.gui.inv.add_campaign(campaign)
|
for i, coro in enumerate(
|
||||||
# this is needed here explicitly, because images aren't always fetched
|
asyncio.as_completed(
|
||||||
|
[
|
||||||
|
asyncio.create_task(self.gui.inv.add_campaign(campaign))
|
||||||
|
for campaign in campaigns
|
||||||
|
]
|
||||||
|
),
|
||||||
|
start=1,
|
||||||
|
):
|
||||||
|
status_update(
|
||||||
|
_("gui", "status", "adding_campaigns").format(counter=f"({i}/{len(campaigns)})")
|
||||||
|
)
|
||||||
|
await coro
|
||||||
|
# this is needed here explicitly, because cache reads from disk don't raise this
|
||||||
if self.gui.close_requested:
|
if self.gui.close_requested:
|
||||||
raise ExitRequest()
|
raise ExitRequest()
|
||||||
self.inventory.append(campaign)
|
|
||||||
self._mnt_triggers.clear()
|
|
||||||
self._mnt_triggers.extend(sorted(switch_triggers))
|
self._mnt_triggers.extend(sorted(switch_triggers))
|
||||||
# trim out all triggers that we're already past
|
# trim out all triggers that we're already past
|
||||||
now = datetime.now(timezone.utc)
|
now = datetime.now(timezone.utc)
|
||||||
|
|||||||
Reference in new issue
Block a user