#!/usr/bin/python3 import logging import sqlalchemy import pytiger.logging.config from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Float, DateTime, Integer, String from sqlalchemy.orm.exc import NoResultFound from sqlalchemy.orm import sessionmaker # "Constants" DISPLAY_SQL = False MYSQL_CONNECT = "mysql+mysqldb://songdb:songdb@localhost/songdb" # Instantiate logging pytiger.logging.config.basic_config(stderr=False, level=logging.INFO) log = logging.getLogger(__name__) log.info("Starting") # Create session at the global level as per # https://docs.sqlalchemy.org/en/13/orm/session_basics.html # Set up database connection log.info("Connect to database") engine = sqlalchemy.create_engine(f"{MYSQL_CONNECT}?charset=utf8", encoding='utf-8', echo=DISPLAY_SQL) Base = declarative_base() Base.metadata.create_all(engine) # Create a Session Session = sessionmaker(bind=engine) session = Session() # Database classes class Tracks(Base): __tablename__ = 'tracks' id = Column(Integer, primary_key=True, autoincrement=True) title = Column(String(256), index=True) artist = Column(String(256), index=True) duration = Column(Integer, index=True) start_gap = Column(Integer, index=False) fade_at = Column(Integer, index=False) silence_at = Column(Integer, index=False) path = Column(String(2048), index=False, nullable=False) mtime = Column(Float, index=True) lastplayed = Column(DateTime, index=True, default=None) def __repr__(self): return ( f"" ) @classmethod def get_or_create(cls, path): try: track = session.query(cls).filter(cls.path == path).one() except NoResultFound: track = Tracks() track.path = path session.add(track) return track @staticmethod def search_titles(text): return ( session.query(Tracks) .filter(Tracks.title.ilike(f"%{text}%")) .order_by(Tracks.title) ).all() @staticmethod def track_from_id(id): return session.query(Tracks).filter( Tracks.id == id).one()