76 lines
2.1 KiB
Python
76 lines
2.1 KiB
Python
#!/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)
|
|
length = Column(Integer, index=True)
|
|
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"<Track(id={self.id}, title={self.title}, "
|
|
f"artist={self.artist}, path={self.path}>"
|
|
)
|
|
|
|
@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}%")
|
|
).all()
|
|
|
|
@staticmethod
|
|
def track_from_id(id):
|
|
return session.query(Tracks).filter(
|
|
Tracks.id == id).one()
|