mirror of
https://code.eliotberriot.com/funkwhale/funkwhale.git
synced 2025-10-04 08:19:15 +02:00
Fix #1105: Can now launch server import from the UI
This commit is contained in:
parent
0a93aec8c9
commit
788c12748f
17 changed files with 476 additions and 6 deletions
|
@ -12,6 +12,7 @@ import watchdog.events
|
|||
import watchdog.observers
|
||||
|
||||
from django.conf import settings
|
||||
from django.core.cache import cache
|
||||
from django.core.files import File
|
||||
from django.core.management import call_command
|
||||
from django.core.management.base import BaseCommand, CommandError
|
||||
|
@ -68,8 +69,34 @@ def batch(iterable, n=1):
|
|||
yield current
|
||||
|
||||
|
||||
class CacheWriter:
|
||||
"""
|
||||
Output to cache instead of console
|
||||
"""
|
||||
|
||||
def __init__(self, key, stdout, buffer_size=10):
|
||||
self.key = key
|
||||
cache.set(self.key, [])
|
||||
self.stdout = stdout
|
||||
self.buffer_size = buffer_size
|
||||
self.buffer = []
|
||||
|
||||
def write(self, message):
|
||||
# we redispatch the message to the console, for debugging
|
||||
self.stdout.write(message)
|
||||
|
||||
self.buffer.append(message)
|
||||
if len(self.buffer) > self.buffer_size:
|
||||
self.flush()
|
||||
|
||||
def flush(self):
|
||||
current = cache.get(self.key)
|
||||
cache.set(self.key, current + self.buffer)
|
||||
self.buffer = []
|
||||
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = "Import audio files mathinc given glob pattern"
|
||||
help = "Import audio files matching given glob pattern"
|
||||
|
||||
def add_arguments(self, parser):
|
||||
parser.add_argument(
|
||||
|
@ -207,7 +234,22 @@ class Command(BaseCommand):
|
|||
help="Size of each batch, only used when crawling large collections",
|
||||
)
|
||||
|
||||
def handle(self, *args, **options):
|
||||
def handle(self, *args, **kwargs):
|
||||
cache.set("fs-import:status", "started")
|
||||
if kwargs.get("update_cache", False):
|
||||
self.stdout = CacheWriter("fs-import:logs", self.stdout)
|
||||
self.stderr = self.stdout
|
||||
try:
|
||||
return self._handle(*args, **kwargs)
|
||||
except CommandError as e:
|
||||
self.stdout.write(str(e))
|
||||
raise
|
||||
finally:
|
||||
if kwargs.get("update_cache", False):
|
||||
cache.set("fs-import:status", "finished")
|
||||
self.stdout.flush()
|
||||
|
||||
def _handle(self, *args, **options):
|
||||
# handle relative directories
|
||||
options["path"] = [os.path.abspath(path) for path in options["path"]]
|
||||
self.is_confirmed = False
|
||||
|
@ -312,6 +354,10 @@ class Command(BaseCommand):
|
|||
batch_duration = None
|
||||
self.stdout.write("Starting import of new files…")
|
||||
for i, entries in enumerate(batch(crawler, options["batch_size"])):
|
||||
if options.get("update_cache", False) is True:
|
||||
# check to see if the scan was cancelled
|
||||
if cache.get("fs-import:status") == "canceled":
|
||||
raise CommandError("Import cancelled")
|
||||
total += len(entries)
|
||||
batch_start = time.time()
|
||||
time_stats = ""
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue