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 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

@ -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))

Loading…
Cancel
Save