models.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. from sqlalchemy import Column, String, Float, DateTime, Integer, Text, Boolean
  2. from sqlalchemy.ext.declarative import declarative_base
  3. from sqlalchemy.sql import func
  4. from datetime import datetime
  5. Base = declarative_base()
  6. class Book(Base):
  7. """Book information from Audiobookshelf."""
  8. __tablename__ = "books"
  9. id = Column(String, primary_key=True) # Audiobookshelf book ID
  10. title = Column(String, nullable=False)
  11. author = Column(String)
  12. narrator = Column(String)
  13. description = Column(Text)
  14. genres = Column(String) # JSON string of genres
  15. tags = Column(String) # JSON string of tags
  16. duration = Column(Float) # Duration in seconds
  17. cover_url = Column(String)
  18. created_at = Column(DateTime, default=func.now())
  19. updated_at = Column(DateTime, default=func.now(), onupdate=func.now())
  20. class ListeningSession(Base):
  21. """User listening sessions and progress."""
  22. __tablename__ = "listening_sessions"
  23. id = Column(Integer, primary_key=True, autoincrement=True)
  24. book_id = Column(String, nullable=False)
  25. # Progress tracking
  26. progress = Column(Float, default=0.0) # 0.0 to 1.0
  27. current_time = Column(Float, default=0.0) # Current position in seconds
  28. is_finished = Column(Boolean, default=False)
  29. # Timestamps
  30. started_at = Column(DateTime)
  31. finished_at = Column(DateTime, nullable=True)
  32. last_update = Column(DateTime, default=func.now(), onupdate=func.now())
  33. # Ratings and preferences
  34. rating = Column(Integer, nullable=True) # 1-5 stars, optional
  35. class Recommendation(Base):
  36. """AI-generated book recommendations."""
  37. __tablename__ = "recommendations"
  38. id = Column(Integer, primary_key=True, autoincrement=True)
  39. # Recommendation details
  40. title = Column(String, nullable=False)
  41. author = Column(String)
  42. description = Column(Text)
  43. reason = Column(Text) # Why this book was recommended
  44. # Metadata
  45. genres = Column(String) # JSON string
  46. created_at = Column(DateTime, default=func.now())
  47. dismissed = Column(Boolean, default=False)