archive-backend/utils/update_tg_photos.py
2026-11-07 11:40:36 +00:00

67 lines
2.0 KiB
Python

import asyncio
from sqlalchemy import select
from ..core.config import BASE_DIR, PHOTOS_DIR
from ..core.db import Base, SessionLocal, engine
from ..models.photo_model import Category, Photo
DIRECTORY = PHOTOS_DIR
async def init_db():
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.create_all)
async def update_media():
if not DIRECTORY.is_dir():
print (f"{DIRECTORY} not exists")
return
async with SessionLocal() as session:
stmt = select(Photo.filename)
result = await session.execute(stmt)
existing_filenames = set(result.scalars().all())
cached_categories = {ct.title:ct for ct in (await session.execute(select(Category))).scalars()}
new_photos = []
for file_path in DIRECTORY.rglob("*"):
if file_path.is_file():
relative_path = file_path.relative_to(DIRECTORY)
if file_path.suffix.lower() != ".jpg":
continue
if file_path.name in existing_filenames:
continue
category_name = relative_path.parts[0] if len(relative_path.parts) > 1 else None
category = cached_categories.get(category_name)
if category is None:
category = Category(title=category_name)
session.add(category)
await session.flush()
cached_categories[category_name] = category
photo = Photo(
filename = file_path.name,
path = str(file_path.relative_to(BASE_DIR)),
category = category,
)
new_photos.append(photo)
existing_filenames.add(file_path.name)
if new_photos:
session.add_all(new_photos)
await session.commit()
async def main():
await init_db()
await update_media()
if __name__ == "__main__":
asyncio.run(main())