download-all-covers.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #!/usr/bin/env python3
  2. """Download all book covers from Audiobookshelf"""
  3. import asyncio
  4. import sys
  5. sys.path.insert(0, '.')
  6. from app.database import async_session
  7. from app.models import User, Book
  8. from app.abs_client import get_abs_client
  9. from app.main import download_cover_image
  10. from sqlalchemy import select
  11. async def download_all_covers():
  12. """Download covers for all books"""
  13. async with async_session() as db:
  14. # Get admin user
  15. result = await db.execute(select(User).where(User.is_admin == True))
  16. user = result.scalar_one()
  17. abs_client = get_abs_client(user)
  18. # Get all books
  19. result = await db.execute(select(Book))
  20. books = result.scalars().all()
  21. print(f"Found {len(books)} books to process")
  22. print("-" * 60)
  23. success_count = 0
  24. fail_count = 0
  25. for i, book in enumerate(books, 1):
  26. print(f"[{i}/{len(books)}] {book.title[:50]}")
  27. try:
  28. local_cover_url = await download_cover_image(abs_client, book.id)
  29. if local_cover_url:
  30. book.cover_url = local_cover_url
  31. print(f" ✓ Downloaded: {local_cover_url}")
  32. success_count += 1
  33. else:
  34. print(f" ✗ Failed to download")
  35. fail_count += 1
  36. except Exception as e:
  37. print(f" ✗ Error: {e}")
  38. fail_count += 1
  39. await db.commit()
  40. print()
  41. print("=" * 60)
  42. print(f"Downloaded: {success_count}")
  43. print(f"Failed: {fail_count}")
  44. print(f"Total: {len(books)}")
  45. if __name__ == "__main__":
  46. print("Downloading all book covers...")
  47. print("=" * 60)
  48. asyncio.run(download_all_covers())