Skip to content

Commit

Permalink
TV grabber ttvdb.py fails with newer versions of
Browse files Browse the repository at this point in the history
python package request-cache.

This was reported on the forum, it throws this
Error: (module 'requests_cache' has no attribute 'core')

It turned out, that the monkey patch provided by
`mythtv/bindings/python/MythTV/ttvdb/requests_cache_compatability.py`
is only valid for versions of request-cache < '0.5.0'. Newer versions
do not need this patch and versions beyond '0.8.0' crashes with above
error message.
Note: The module requests_cache.core was removed in version '0.8.0'
on Sept. 2021 and deprecated in version '0.6.0' in April, 2021.

Refs #408

(cherry picked from commit da3f006)
  • Loading branch information
rcrdnalor committed Jan 18, 2022
1 parent 9c53e17 commit 96d1a19
Showing 1 changed file with 38 additions and 35 deletions.
73 changes: 38 additions & 35 deletions mythtv/bindings/python/MythTV/ttvdb/requests_cache_compatability.py
Expand Up @@ -12,38 +12,41 @@
import requests_cache
from datetime import datetime, timedelta

# patch if required if older versions of
try:
requests_cache.backends.base.BaseCache.remove_old_entries
except Exception as e:
def remove_old_entries(self, created_before):
""" Deletes entries from cache with creation time older than ``created_before``
"""
keys_to_delete = set()
for key in self.responses:
try:
response, created_at = self.responses[key]
except KeyError:
continue
if created_at < created_before:
keys_to_delete.add(key)

for key in keys_to_delete:
self.delete(key)


def remove_expired_responses(self):
""" Removes expired responses from storage
"""
if not self._cache_expire_after:
return
# just in case expire_after is not converted in the
# original constructor, convert it to a timedelta
if not isinstance(self._cache_expire_after, timedelta):
self._cache_expire_after = timedelta(seconds=self._cache_expire_after)

self.cache.remove_old_entries(datetime.utcnow() - self._cache_expire_after)


requests_cache.backends.base.BaseCache.remove_old_entries = remove_old_entries
requests_cache.core.CachedSession.remove_expired_responses = remove_expired_responses
rc_version_info = tuple(int(x) for x in requests_cache.__version__.split('.'))
# patch if required if older versions than '0.5.0'
# request_cache.core is deprecated in '0.6.0' and removed on '0.8.0'.
if rc_version_info < (0, 5, 0):
try:
requests_cache.backends.base.BaseCache.remove_old_entries
except Exception as e:
def remove_old_entries(self, created_before):
""" Deletes entries from cache with creation time older than ``created_before``
"""
keys_to_delete = set()
for key in self.responses:
try:
response, created_at = self.responses[key]
except KeyError:
continue
if created_at < created_before:
keys_to_delete.add(key)

for key in keys_to_delete:
self.delete(key)


def remove_expired_responses(self):
""" Removes expired responses from storage
"""
if not self._cache_expire_after:
return
# just in case expire_after is not converted in the
# original constructor, convert it to a timedelta
if not isinstance(self._cache_expire_after, timedelta):
self._cache_expire_after = timedelta(seconds=self._cache_expire_after)

self.cache.remove_old_entries(datetime.utcnow() - self._cache_expire_after)


requests_cache.backends.base.BaseCache.remove_old_entries = remove_old_entries
requests_cache.core.CachedSession.remove_expired_responses = remove_expired_responses

0 comments on commit 96d1a19

Please sign in to comment.