Initial commit - Navi.FM v3

This commit is contained in:
Collin Kasbergen
2026-07-22 13:23:22 +02:00
commit badafc91e3
55 changed files with 6384 additions and 0 deletions
+69
View File
@@ -0,0 +1,69 @@
import os
from sqlalchemy import create_engine, Column, String, Float, Boolean, Integer
from sqlalchemy.orm import declarative_base
from sqlalchemy.orm import sessionmaker
DATA_DIR = os.getenv("DATA_DIR", "/data")
SQLALCHEMY_DATABASE_URL = f"sqlite:///{os.path.join(DATA_DIR, 'navifm.db')}"
engine = create_engine(
SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False}
)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine, expire_on_commit=False)
Base = declarative_base()
class Track(Base):
__tablename__ = "tracks"
id = Column(String, primary_key=True, index=True) # Navidrome Track ID
title = Column(String, index=True)
artist = Column(String, index=True)
album = Column(String)
duration = Column(Integer)
path = Column(String) # Navidrome file path or relative path
# Analysis Status
analyzed = Column(Boolean, default=False)
# Analyzed Metadata
bpm = Column(Float, nullable=True)
key = Column(String, nullable=True)
lufs = Column(Float, nullable=True)
energy = Column(Float, nullable=True)
spectral_centroid = Column(Float, nullable=True)
onset_density = Column(Float, nullable=True)
# Play stats
last_played = Column(Integer, default=0) # timestamp
play_count = Column(Integer, default=0)
class Setting(Base):
__tablename__ = "settings"
key = Column(String, primary_key=True)
value = Column(String)
def get_setting(db, key: str, default: str = None):
setting = db.query(Setting).filter(Setting.key == key).first()
return setting.value if setting else default
def set_setting(db, key: str, value: str):
setting = db.query(Setting).filter(Setting.key == key).first()
if setting:
setting.value = value
else:
setting = Setting(key=key, value=value)
db.add(setting)
db.commit()
def init_db():
os.makedirs(DATA_DIR, exist_ok=True)
Base.metadata.create_all(bind=engine)
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()