37 lines
1.3 KiB
Python
37 lines
1.3 KiB
Python
"""Сканирует VIDEO_DIR, добавляет новые .mp4/.webm в БД. Удаляет из БД пропавшие файлы."""
|
|
from __future__ import annotations
|
|
|
|
import os
|
|
import sys
|
|
|
|
from db import connect, init_db
|
|
|
|
ALLOWED_EXT = {".mp4", ".webm", ".mov", ".m4v"}
|
|
|
|
|
|
def scan_directory(video_dir: str) -> tuple[int, int]:
|
|
init_db()
|
|
if not os.path.isdir(video_dir):
|
|
print(f"Нет папки: {video_dir}", file=sys.stderr)
|
|
return 0, 0
|
|
on_disk = {
|
|
f for f in os.listdir(video_dir)
|
|
if os.path.isfile(os.path.join(video_dir, f))
|
|
and os.path.splitext(f)[1].lower() in ALLOWED_EXT
|
|
}
|
|
with connect() as con:
|
|
in_db = {r["filename"] for r in con.execute("SELECT filename FROM videos")}
|
|
new = sorted(on_disk - in_db)
|
|
gone = sorted(in_db - on_disk)
|
|
con.executemany("INSERT OR IGNORE INTO videos(filename) VALUES (?)", [(f,) for f in new])
|
|
if gone:
|
|
ph = ",".join("?" * len(gone))
|
|
con.execute(f"DELETE FROM videos WHERE filename IN ({ph})", gone)
|
|
print(f"Видео на диске: {len(on_disk)}, добавлено: {len(new)}, удалено: {len(gone)}")
|
|
return len(new), len(on_disk)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
video_dir = sys.argv[1] if len(sys.argv) > 1 else os.environ.get("VIDEO_DIR", "./videos")
|
|
scan_directory(video_dir)
|