repositories.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. from core import db
  2. from core.models import MusicFolder, Track, Tag, TrackTag, SessionTrack, Session, SessionFolder
  3. class Repository:
  4. MODEL_CLS = None
  5. def __init__(self, session=None):
  6. self.session = session if session else db.Session()
  7. def query(self):
  8. return self.session.query(self.MODEL_CLS)
  9. def commit(self):
  10. self.session.commit()
  11. def rollback(self):
  12. self.session.rollback()
  13. def get_by_id(self, id_):
  14. return self.query().filter(self.MODEL_CLS.id == id_).first()
  15. def get_all(self):
  16. return self.query().all()
  17. def get_by(self, field, val):
  18. return self.query().filter(field == val).all()
  19. def exists(self, field, val):
  20. return self.query().filter(field == val).exists()
  21. def create(self, model, commit=False):
  22. self.session.add(model)
  23. if commit:
  24. self.session.commit()
  25. def delete(self, model, commit=False):
  26. model.delete()
  27. if commit:
  28. self.commit()
  29. # def __del__(self):
  30. # self.session.remove()
  31. class MusicFolderRepository(Repository):
  32. MODEL_CLS = MusicFolder
  33. def __init__(self, *args, **kwargs):
  34. super().__init__(*args, **kwargs)
  35. class TagRepository(Repository):
  36. MODEL_CLS = Tag
  37. def __init__(self, *args, **kwargs):
  38. super().__init__(*args, **kwargs)
  39. def get_by_track_id(self, track_id):
  40. return self.session.query(Tag)\
  41. .join(TrackTag, Tag.id == TrackTag.tag_id)\
  42. .filter(TrackTag.track_id == track_id).\
  43. all()
  44. class TrackRepository(Repository):
  45. MODEL_CLS = Track
  46. def get_all(self):
  47. return self.query().order_by(Track.artist).order_by(Track.album).order_by(Track.track_num).all()
  48. def get_by_hash(self, hash_):
  49. return self.query().filter(hash == hash_).first()
  50. def get_by_tag_id(self, tag_id):
  51. return self.session.query(Track)\
  52. .join(TrackTag, Track.id == TrackTag.track_id)\
  53. .filter(TrackTag.tag_id == tag_id).\
  54. all()
  55. def get_by_tag_ids(self, tag_ids):
  56. return self.session.query(Track)\
  57. .join(TrackTag, Track.id == TrackTag.track_id)\
  58. .filter(TrackTag.tag_id.in_(tag_ids)).\
  59. all()
  60. def get_by_session_id(self, session_id):
  61. return self.session.query(Track)\
  62. .join(SessionTrack, Track.id == SessionTrack.track_id)\
  63. .filter(SessionTrack.session_id == session_id)\
  64. .order_by(SessionTrack.order)\
  65. .all()
  66. def get_artists(self):
  67. return self.session.query(Track).group_by(Track.artist).all()
  68. def get_albums_by_artist(self, artist):
  69. return self.session.query(Track).where(Track.artist == artist).group_by(Track.album).all()
  70. def get_by_artist_and_album(self, artist, album):
  71. return self.session.query(Track)\
  72. .where(Track.artist == artist)\
  73. .where(Track.album == album)\
  74. .group_by(Track.album)\
  75. .all()
  76. def add_to_playlist(self, track_id, session_id, order):
  77. track_session = SessionTrack()
  78. track_session.track_id = track_id
  79. track_session.session_id = session_id
  80. track_session.order = order
  81. self.create(track_session)
  82. self.commit()
  83. class SessionFolderRepository(Repository):
  84. MODEL_CLS = SessionFolder
  85. def __init__(self, *args, **kwargs):
  86. super().__init__(*args, **kwargs)
  87. class SessionRepository(Repository):
  88. MODEL_CLS = Session
  89. def __init__(self, *args, **kwargs):
  90. super().__init__(*args, **kwargs)
  91. def get_all(self):
  92. return self.query().order_by(Session.date.desc()).order_by(Session.created_on.desc()).all()
  93. def get_by_folder_id(self, folder_id):
  94. return self.get_by('folder_id', folder_id)
  95. def get_by_track_id(self, track_id):
  96. return self.session.query(Session)\
  97. .join(SessionTrack, Track.id == SessionTrack.track_id)\
  98. .filter(SessionTrack.track_id == track_id).\
  99. all()