mirror of
https://github.com/zoriya/Kyoo.git
synced 2025-05-31 04:04:21 -04:00
Update scan method
This commit is contained in:
parent
a18fa7ebad
commit
52380bcb29
@ -14,5 +14,5 @@ async def main():
|
|||||||
path = os.environ.get("SCANNER_LIBRARY_ROOT", "/video")
|
path = os.environ.get("SCANNER_LIBRARY_ROOT", "/video")
|
||||||
await asyncio.gather(
|
await asyncio.gather(
|
||||||
monitor(path, publisher),
|
monitor(path, publisher),
|
||||||
scan(path),
|
scan(path, publisher, client),
|
||||||
)
|
)
|
||||||
|
@ -1,35 +1,35 @@
|
|||||||
|
import os
|
||||||
|
import re
|
||||||
|
import asyncio
|
||||||
from logging import getLogger
|
from logging import getLogger
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
from monitor.publisher import Publisher
|
||||||
|
from providers.kyoo_client import KyooClient
|
||||||
|
|
||||||
logger = getLogger(__name__)
|
logger = getLogger(__name__)
|
||||||
|
|
||||||
async def scan(path: str):
|
|
||||||
|
async def scan(path: str, publisher: Publisher, client: KyooClient):
|
||||||
logger.info("Starting the scan. It can take some times...")
|
logger.info("Starting the scan. It can take some times...")
|
||||||
registered = await _get_registered_paths()
|
ignore_pattern = None
|
||||||
self.issues = await self.get_issues()
|
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}")
|
||||||
|
|
||||||
|
registered = await client.get_registered_paths()
|
||||||
videos = [str(p) for p in Path(path).rglob("*") if p.is_file()]
|
videos = [str(p) for p in Path(path).rglob("*") if p.is_file()]
|
||||||
deleted = [x for x in self.registered if x not in videos]
|
to_register = [
|
||||||
# if path in self.registered or self._ignore_pattern.match(path):
|
p for p in videos if p not in registered and not ignore_pattern.match(p)
|
||||||
# return
|
]
|
||||||
#
|
deleted = [x for x in registered if x not in videos]
|
||||||
|
|
||||||
# try:
|
if len(deleted) != len(registered):
|
||||||
# self._ignore_pattern = re.compile(
|
await asyncio.gather(*map(publisher.delete, deleted))
|
||||||
# os.environ.get("LIBRARY_IGNORE_PATTERN", "")
|
|
||||||
# )
|
|
||||||
# except Exception as e:
|
|
||||||
# self._ignore_pattern = re.compile("")
|
|
||||||
# logging.error(f"Invalid ignore pattern. Ignoring. Error: {e}")
|
|
||||||
|
|
||||||
if len(deleted) != len(self.registered):
|
|
||||||
for x in deleted:
|
|
||||||
await self.delete(x)
|
|
||||||
for x in self.issues:
|
|
||||||
if x not in videos:
|
|
||||||
await self.delete(x, "issue")
|
|
||||||
elif len(deleted) > 0:
|
elif len(deleted) > 0:
|
||||||
logging.warning("All video files are unavailable. Check your disks.")
|
logger.warning("All video files are unavailable. Check your disks.")
|
||||||
|
|
||||||
# We batch videos by 20 because too mutch at once kinda DDOS everything.
|
await asyncio.gather(*map(publisher.add, to_register))
|
||||||
for group in batch(iter(videos), 20):
|
logger.info("Scan finished.")
|
||||||
await asyncio.gather(*map(self.identify, group))
|
|
||||||
logging.info("Scan finished.")
|
|
||||||
|
@ -30,15 +30,26 @@ class KyooClient:
|
|||||||
async def __aexit__(self, exc_type, exc_value, exc_tb):
|
async def __aexit__(self, exc_type, exc_value, exc_tb):
|
||||||
await self.client.close()
|
await self.client.close()
|
||||||
|
|
||||||
async def get_issues(self) -> List[str]:
|
async def get_registered_paths(self) -> List[str]:
|
||||||
|
paths = None
|
||||||
async with self.client.get(
|
async with self.client.get(
|
||||||
f"{self._url}/issues",
|
f"{self._url}/episodes",
|
||||||
params={"limit": 0},
|
params={"limit": 0},
|
||||||
headers={"X-API-Key": self._api_key},
|
headers={"X-API-Key": self._api_key},
|
||||||
) as r:
|
) as r:
|
||||||
r.raise_for_status()
|
r.raise_for_status()
|
||||||
ret = await r.json()
|
ret = await r.json()
|
||||||
return [x["cause"] for x in ret if x["domain"] == "scanner"]
|
paths = list(x["path"] for x in ret["items"])
|
||||||
|
|
||||||
|
async with self.client.get(
|
||||||
|
f"{self._url}/movies",
|
||||||
|
params={"limit": 0},
|
||||||
|
headers={"X-API-Key": self._api_key},
|
||||||
|
) as r:
|
||||||
|
r.raise_for_status()
|
||||||
|
ret = await r.json()
|
||||||
|
paths += list(x["path"] for x in ret["items"])
|
||||||
|
return paths
|
||||||
|
|
||||||
async def create_issue(self, path: str, issue: str, extra: dict | None = None):
|
async def create_issue(self, path: str, issue: str, extra: dict | None = None):
|
||||||
await self.client.post(
|
await self.client.post(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user