Introduce dynamic cache calculation for YouTube collection

master
Felix Stupp 2 years ago
parent 49cff6f300
commit ed8fc4439e
Signed by: zocker
GPG Key ID: 93E1BD26F6B02FB7

@ -1,6 +1,8 @@
from __future__ import annotations from __future__ import annotations
from datetime import datetime, timedelta
import logging import logging
import math
from typing import Optional, TypeVar from typing import Optional, TypeVar
from ...models import CollectionUriMapping, MediaCollection, MediaElement from ...models import CollectionUriMapping, MediaCollection, MediaElement
@ -28,6 +30,16 @@ class CollectionExtractor(GeneralExtractor[MediaCollection, T]):
return elem return elem
return None 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: def __configure_collection(self, collection: MediaCollection) -> None:
collection.keep_updated = True collection.keep_updated = True

@ -1,6 +1,6 @@
from __future__ import annotations from __future__ import annotations
from datetime import datetime, timedelta from datetime import datetime
import logging import logging
import re import re
from typing import Dict from typing import Dict
@ -54,7 +54,10 @@ class YouTubeCollectionExtractor(CollectionExtractor[Dict]):
return True return True
def _cache_expired(self, object: MediaCollection) -> bool: 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]: def _extract_offline(self, uri: str) -> ExtractedData[Dict]:
playlist_id = self.__convert_if_required(self.__get_id(uri)) playlist_id = self.__convert_if_required(self.__get_id(uri))

Loading…
Cancel
Save