| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- from sqlalchemy import func
- from core import db
- from core.models import MusicFolder, Track, Tag, TrackTag, SessionTrack, Session, SessionFolder
- class Repository:
- MODEL_CLS = None
- def __init__(self, session=None):
- self.session = session if session else db.Session()
- def query(self):
- return self.session.query(self.MODEL_CLS)
- def commit(self):
- self.session.commit()
- def rollback(self):
- self.session.rollback()
- def get_by_id(self, id_):
- return self.query().filter(self.MODEL_CLS.id == id_).first()
- def get_all(self):
- return self.query().all()
- def get_by(self, field, val):
- return self.query().filter(field == val).all()
- def exists(self, field, val):
- return self.query().filter(field == val).exists()
- def create(self, model, commit=False):
- self.session.add(model)
- if commit:
- self.session.commit()
- def delete(self, model, commit=False):
- self.session.delete(model)
- if commit:
- self.commit()
- # def __del__(self):
- # self.session.remove()
- class MusicFolderRepository(Repository):
- MODEL_CLS = MusicFolder
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- class TagRepository(Repository):
- MODEL_CLS = Tag
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- def get_by_track_id(self, track_id):
- return self.session.query(Tag)\
- .join(TrackTag, Tag.id == TrackTag.tag_id)\
- .filter(TrackTag.track_id == track_id).\
- all()
- class TrackRepository(Repository):
- MODEL_CLS = Track
- def get_all(self):
- return self.query().order_by(Track.artist).order_by(Track.album).order_by(Track.track_num).all()
- def get_by_hash(self, hash_):
- return self.query().filter(hash == hash_).first()
- def get_by_tag_id(self, tag_id):
- return self.session.query(Track)\
- .join(TrackTag, Track.id == TrackTag.track_id)\
- .filter(TrackTag.tag_id == tag_id).\
- all()
- def get_by_tag_ids(self, tag_ids):
- return self.session.query(Track)\
- .join(TrackTag, Track.id == TrackTag.track_id)\
- .filter(TrackTag.tag_id.in_(tag_ids)).\
- all()
- def get_artists(self):
- return self.session.query(Track).group_by(Track.artist).all()
- def get_albums_by_artist(self, artist):
- return self.session.query(Track).where(Track.artist == artist).group_by(Track.album).all()
- def get_by_artist_and_album(self, artist, album):
- return self.session.query(Track)\
- .where(Track.artist == artist)\
- .where(Track.album == album)\
- .group_by(Track.album)\
- .all()
- def add_to_session(self, track_id, session_id):
- track_session = SessionTrack()
- track_session.track_id = track_id
- track_session.session_id = session_id
- row = self.session.query(func.max(SessionTrack.order)).filter(SessionTrack.session_id == session_id)
- order = (row.scalar() or 0) + 1
- track_session.order = order
- self.create(track_session)
- self.commit()
- def get_by_session_id(self, session_id):
- return self.session.query(Track) \
- .join(SessionTrack, Track.id == SessionTrack.track_id) \
- .filter(SessionTrack.session_id == session_id)\
- .order_by(SessionTrack.order)\
- .all()
- class SessionTrackRepository(Repository):
- MODEL_CLS = SessionTrack
- def get_by_session_id(self, session_id):
- return self.session.query(SessionTrack)\
- .filter(SessionTrack.session_id == session_id)\
- .order_by(SessionTrack.order)\
- .all()
- class SessionFolderRepository(Repository):
- MODEL_CLS = SessionFolder
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- class SessionRepository(Repository):
- MODEL_CLS = Session
- def __init__(self, *args, **kwargs):
- super().__init__(*args, **kwargs)
- def get_all(self):
- return self.query().order_by(Session.date.desc()).order_by(Session.created_on.desc()).all()
- def get_by_folder_id(self, folder_id):
- return self.get_by('folder_id', folder_id)
- def get_by_track_id(self, track_id):
- return self.session.query(Session)\
- .join(SessionTrack, Track.id == SessionTrack.track_id)\
- .filter(SessionTrack.track_id == track_id).\
- all()
|