Skip to content
Snippets Groups Projects
Verified Commit c20e4d7c authored by Eliot Berriot's avatar Eliot Berriot
Browse files

Added task to delete unused cached files

parent 6a047791
No related branches found
No related tags found
No related merge requests found
...@@ -4,3 +4,17 @@ from dynamic_preferences import types ...@@ -4,3 +4,17 @@ from dynamic_preferences import types
from dynamic_preferences.registries import global_preferences_registry from dynamic_preferences.registries import global_preferences_registry
federation = types.Section('federation') federation = types.Section('federation')
@global_preferences_registry.register
class MusicCacheDuration(types.IntPreference):
show_in_api = True
section = federation
name = 'music_cache_duration'
default = 60 * 24 * 2
verbose_name = 'Music cache duration'
help_text = (
'How much minutes do you want to keep a copy of federated tracks'
'locally? Federated files that were not listened in this interval '
'will be erased and refetched from the remote on the next listening.'
)
...@@ -185,6 +185,11 @@ class LibraryTrackFactory(factory.DjangoModelFactory): ...@@ -185,6 +185,11 @@ class LibraryTrackFactory(factory.DjangoModelFactory):
class Meta: class Meta:
model = models.LibraryTrack model = models.LibraryTrack
class Params:
with_audio_file = factory.Trait(
audio_file=factory.django.FileField()
)
@registry.register(name='federation.Note') @registry.register(name='federation.Note')
class NoteFactory(factory.Factory): class NoteFactory(factory.Factory):
......
import datetime
import json import json
import logging import logging
...@@ -5,8 +6,10 @@ from django.conf import settings ...@@ -5,8 +6,10 @@ from django.conf import settings
from django.utils import timezone from django.utils import timezone
from requests.exceptions import RequestException from requests.exceptions import RequestException
from dynamic_preferences.registries import global_preferences_registry
from funkwhale_api.common import session from funkwhale_api.common import session
from funkwhale_api.history.models import Listening
from funkwhale_api.taskapp import celery from funkwhale_api.taskapp import celery
from . import actors from . import actors
...@@ -85,3 +88,24 @@ def scan_library_page(library, page_url, until=None): ...@@ -85,3 +88,24 @@ def scan_library_page(library, page_url, until=None):
next_page = data.get('next') next_page = data.get('next')
if next_page and next_page != page_url: if next_page and next_page != page_url:
scan_library_page.delay(library_id=library.id, page_url=next_page) scan_library_page.delay(library_id=library.id, page_url=next_page)
@celery.app.task(name='federation.clean_music_cache')
def clean_music_cache():
preferences = global_preferences_registry.manager()
delay = preferences['federation__music_cache_duration']
if delay < 1:
return # cache clearing disabled
candidates = models.LibraryTrack.objects.filter(
audio_file__isnull=False
).values_list('local_track_file__track', flat=True)
listenings = Listening.objects.filter(
creation_date__gte=timezone.now() - datetime.timedelta(minutes=delay),
track__pk__in=candidates).values_list('track', flat=True)
too_old = set(candidates) - set(listenings)
to_remove = models.LibraryTrack.objects.filter(
local_track_file__track__pk__in=too_old).only('audio_file')
for lt in to_remove:
lt.audio_file.delete()
import datetime
from django.core.paginator import Paginator from django.core.paginator import Paginator
from django.utils import timezone from django.utils import timezone
...@@ -108,3 +110,31 @@ def test_scan_page_stops_once_until_is_reached( ...@@ -108,3 +110,31 @@ def test_scan_page_stops_once_until_is_reached(
assert len(lts) == 2 assert len(lts) == 2
for i, tf in enumerate(tfs[:1]): for i, tf in enumerate(tfs[:1]):
assert tf.creation_date == lts[i].published_date assert tf.creation_date == lts[i].published_date
def test_clean_federation_music_cache_if_no_listen(preferences, factories):
preferences['federation__music_cache_duration'] = 60
lt1 = factories['federation.LibraryTrack'](with_audio_file=True)
lt2 = factories['federation.LibraryTrack'](with_audio_file=True)
lt3 = factories['federation.LibraryTrack'](with_audio_file=True)
tf1 = factories['music.TrackFile'](library_track=lt1)
tf2 = factories['music.TrackFile'](library_track=lt2)
tf3 = factories['music.TrackFile'](library_track=lt3)
# we listen to the first one, and the second one (but weeks ago)
listening1 = factories['history.Listening'](
track=tf1.track,
creation_date=timezone.now())
listening2 = factories['history.Listening'](
track=tf2.track,
creation_date=timezone.now() - datetime.timedelta(minutes=61))
tasks.clean_music_cache()
lt1.refresh_from_db()
lt2.refresh_from_db()
lt3.refresh_from_db()
assert bool(lt1.audio_file) is True
assert bool(lt2.audio_file) is False
assert bool(lt3.audio_file) is False
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment