From ed8fc4439e41bef72e8f7c57e3ed94da8309ed1b Mon Sep 17 00:00:00 2001 From: Felix Stupp Date: Sat, 5 Nov 2022 13:33:18 +0100 Subject: [PATCH] Introduce dynamic cache calculation for YouTube collection --- .../extractors/collection/base.py | 12 ++++++++++++ .../extractors/collection/youtube.py | 7 +++++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/server/entertainment_decider/extractors/collection/base.py b/server/entertainment_decider/extractors/collection/base.py index acbbb0e..ab4f889 100644 --- a/server/entertainment_decider/extractors/collection/base.py +++ b/server/entertainment_decider/extractors/collection/base.py @@ -1,6 +1,8 @@ from __future__ import annotations +from datetime import datetime, timedelta import logging +import math from typing import Optional, TypeVar from ...models import CollectionUriMapping, MediaCollection, MediaElement @@ -28,6 +30,16 @@ class CollectionExtractor(GeneralExtractor[MediaCollection, T]): return elem return None + @staticmethod + def _calculate_wait_hours( + last_release_date: datetime, + growth_rate: float = 3.25508, # estimated for approriate cache timeout times (every 12 hours for 10 days old playlist) + ) -> timedelta: + days_since = max((datetime.now() - last_release_date) // timedelta(days=1), 1) + wait_units = math.log(days_since, growth_rate) + wait_hours = (wait_units + 1) * 4 + return timedelta(hours=wait_hours) + def __configure_collection(self, collection: MediaCollection) -> None: collection.keep_updated = True diff --git a/server/entertainment_decider/extractors/collection/youtube.py b/server/entertainment_decider/extractors/collection/youtube.py index fb4b04f..417a394 100644 --- a/server/entertainment_decider/extractors/collection/youtube.py +++ b/server/entertainment_decider/extractors/collection/youtube.py @@ -1,6 +1,6 @@ from __future__ import annotations -from datetime import datetime, timedelta +from datetime import datetime import logging import re from typing import Dict @@ -54,7 +54,10 @@ class YouTubeCollectionExtractor(CollectionExtractor[Dict]): return True def _cache_expired(self, object: MediaCollection) -> bool: - return (datetime.now() - object.last_updated) > timedelta(hours=4) + last_release_date = orm.max(l.element.release_date for l in object.media_links) + return (datetime.now() - object.last_updated) > self._calculate_wait_hours( + last_release_date + ) def _extract_offline(self, uri: str) -> ExtractedData[Dict]: playlist_id = self.__convert_if_required(self.__get_id(uri))