From fccc5b6ad98c10fdc6dd0e060196e97fb0756960 Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Mon, 29 Apr 2024 01:42:32 +0200 Subject: [PATCH] Scan directory on directory creation (used on directory rename) --- scanner/scanner/__init__.py | 4 ++-- scanner/scanner/monitor.py | 11 ++++++++--- scanner/scanner/scanner.py | 16 +++++++++------- 3 files changed, 19 insertions(+), 12 deletions(-) diff --git a/scanner/scanner/__init__.py b/scanner/scanner/__init__.py index e034b653..bce4273e 100644 --- a/scanner/scanner/__init__.py +++ b/scanner/scanner/__init__.py @@ -14,7 +14,7 @@ async def main(): async with Publisher() as publisher, KyooClient() as client: path = os.environ.get("SCANNER_LIBRARY_ROOT", "/video") await asyncio.gather( - monitor(path, publisher), - scan(path, publisher, client), + monitor(path, publisher, client), + scan(path, publisher, client, remove_deleted=True), refresh(publisher, client), ) diff --git a/scanner/scanner/monitor.py b/scanner/scanner/monitor.py index 439bc93f..ff48a891 100644 --- a/scanner/scanner/monitor.py +++ b/scanner/scanner/monitor.py @@ -1,16 +1,21 @@ from logging import getLogger +from os.path import isdir from watchfiles import awatch, Change - from .publisher import Publisher +from .scanner import scan +from providers.kyoo_client import KyooClient logger = getLogger(__name__) -async def monitor(path: str, publisher: Publisher): +async def monitor(path: str, publisher: Publisher, client: KyooClient): async for changes in awatch(path, ignore_permission_denied=True): for event, file in changes: if event == Change.added: - await publisher.add(file) + if isdir(file): + await scan(file, publisher, client) + else: + await publisher.add(file) elif event == Change.deleted: await publisher.delete(file) elif event == Change.modified: diff --git a/scanner/scanner/scanner.py b/scanner/scanner/scanner.py index b74ecc14..7ec10849 100644 --- a/scanner/scanner/scanner.py +++ b/scanner/scanner/scanner.py @@ -9,7 +9,7 @@ from providers.kyoo_client import KyooClient logger = getLogger(__name__) -async def scan(path: str, publisher: Publisher, client: KyooClient): +async def scan(path: str, publisher: Publisher, client: KyooClient, remove_deleted = False): logger.info("Starting the scan. It can take some times...") ignore_pattern = None try: @@ -25,12 +25,14 @@ async def scan(path: str, publisher: Publisher, client: KyooClient): to_register = [ p for p in videos if p not in registered and not ignore_pattern.match(p) ] - deleted = [x for x in registered if x not in videos] - if len(deleted) != len(registered): - await asyncio.gather(*map(publisher.delete, deleted)) - elif len(deleted) > 0: - logger.warning("All video files are unavailable. Check your disks.") + if remove_deleted: + deleted = [x for x in registered if x not in videos] + if len(deleted) != len(registered): + await asyncio.gather(*map(publisher.delete, deleted)) + elif len(deleted) > 0: + logger.warning("All video files are unavailable. Check your disks.") await asyncio.gather(*map(publisher.add, to_register)) - logger.info("Scan finished.") + logger.info(f"Scan finished for {path}.") +