From a978e99e8a5f7e1237643deafcd2cdab04f34e57 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Mon, 13 May 2024 19:46:33 +0200 Subject: [PATCH] Add more logs to the scanner (and fix ignore pattern for the monitor) (#492) --- scanner/matcher/subscriber.py | 2 ++ scanner/scanner/monitor.py | 27 +++++++++++++++++---------- scanner/scanner/refresher.py | 2 ++ scanner/scanner/scanner.py | 19 ++++++++++++------- 4 files changed, 33 insertions(+), 17 deletions(-) diff --git a/scanner/matcher/subscriber.py b/scanner/matcher/subscriber.py index 167654c8..77fe78d2 100644 --- a/scanner/matcher/subscriber.py +++ b/scanner/matcher/subscriber.py @@ -46,8 +46,10 @@ class Subscriber(RabbitBase): case _: logger.error(f"Invalid action: {msg.action}") if ack: + logger.info("finished processing %s", msg) await message.ack() else: + logger.warn("failed to process %s", msg) await message.reject() except Exception as e: logger.exception("Unhandled error", exc_info=e) diff --git a/scanner/scanner/monitor.py b/scanner/scanner/monitor.py index ff48a891..973ecb61 100644 --- a/scanner/scanner/monitor.py +++ b/scanner/scanner/monitor.py @@ -2,23 +2,30 @@ from logging import getLogger from os.path import isdir from watchfiles import awatch, Change from .publisher import Publisher -from .scanner import scan +from .scanner import scan, get_ignore_pattern from providers.kyoo_client import KyooClient logger = getLogger(__name__) async def monitor(path: str, publisher: Publisher, client: KyooClient): + ignore_pattern = get_ignore_pattern() async for changes in awatch(path, ignore_permission_denied=True): for event, file in changes: - if event == Change.added: - if isdir(file): + if ignore_pattern.match(file): + logger.info( + "Ignoring event %s for file %s (due to IGNORE_PATTERN)", event, file + ) + continue + logger.info("Change %s occured for file %s", event, file) + match event: + case Change.added if isdir(file): await scan(file, publisher, client) - else: + case Change.added: await publisher.add(file) - elif event == Change.deleted: - await publisher.delete(file) - elif event == Change.modified: - pass - else: - logger.info(f"Change {event} occured for file {file}") + case Change.deleted: + await publisher.delete(file) + case Change.modified: + pass + case _: + logger.warn("Unknown file event %s (for file %s)", event, file) diff --git a/scanner/scanner/refresher.py b/scanner/scanner/refresher.py index 44c086ae..48eeb61a 100644 --- a/scanner/scanner/refresher.py +++ b/scanner/scanner/refresher.py @@ -13,4 +13,6 @@ async def refresh(publisher: Publisher, client: KyooClient): # Check for updates every 4 hours await asyncio.sleep(60 * 60 * 4) todo = await client.get("refreshables") + logger.info("Refreshing %d items", len(todo)) await asyncio.gather(*(publisher.refresh(**x) for x in todo)) + logger.info("Refresh finish. Will check for new items to refresh in 4 hours") diff --git a/scanner/scanner/scanner.py b/scanner/scanner/scanner.py index 811dce2b..fd3faf4b 100644 --- a/scanner/scanner/scanner.py +++ b/scanner/scanner/scanner.py @@ -10,18 +10,21 @@ from providers.kyoo_client import KyooClient logger = getLogger(__name__) +def get_ignore_pattern(): + try: + return re.compile(os.environ.get("LIBRARY_IGNORE_PATTERN", "")) + except Exception as e: + logger.error(f"Invalid ignore pattern. Ignoring. Error: {e}") + return re.compile("") + + async def scan( path_: Optional[str], publisher: Publisher, client: KyooClient, remove_deleted=False ): path = path_ or os.environ.get("SCANNER_LIBRARY_ROOT", "/video") logger.info("Starting the scan. It can take some times...") - ignore_pattern = None - try: - ignore_pattern = re.compile(os.environ.get("LIBRARY_IGNORE_PATTERN", "")) - except Exception as e: - ignore_pattern = re.compile("") - logger.error(f"Invalid ignore pattern. Ignoring. Error: {e}") + ignore_pattern = get_ignore_pattern() registered = await client.get_registered_paths() videos = [ @@ -33,6 +36,7 @@ async def scan( if remove_deleted: deleted = [x for x in registered if x not in videos] + logger.info("Found %d stale files to remove.", len(deleted)) if len(deleted) != len(registered): await asyncio.gather(*map(publisher.delete, deleted)) elif len(deleted) > 0: @@ -43,5 +47,6 @@ async def scan( if x not in videos: await client.delete_issue(x) + logger.info("Found %d new files (counting non-video files)", len(to_register)) await asyncio.gather(*map(publisher.add, to_register)) - logger.info(f"Scan finished for {path}.") + logger.info("Scan finished for %s.", path)