summaryrefslogtreecommitdiff
path: root/db.py
diff options
context:
space:
mode:
Diffstat (limited to 'db.py')
-rw-r--r--db.py38
1 files changed, 32 insertions, 6 deletions
diff --git a/db.py b/db.py
index 4819159..1f68711 100644
--- a/db.py
+++ b/db.py
@@ -1,3 +1,4 @@
+import os
from config import config
from sqlalchemy import create_engine
engine = create_engine(config.get('db_path'))
@@ -18,20 +19,22 @@ class Directory(Base):
path = Column(String, nullable = False, index = True)
parent_id = Column(Integer, ForeignKey('directories.id'))
- parent = relationship('Directory')
+ parent = relationship('Directory', backref = backref('children'), remote_side = [id])
+ #children = relationship('Directory', lazy = 'joined', join_depth = 2)
- def __init__(self, path):
+ def __init__(self, path, parent_id = None):
self.path = path
+ self.parent_id = parent_id
def __repr__(self):
- return '<Directory("{0}")>'.format(self.path)
+ return '<Directory("{0}")>'.format(self.path.encode('utf-8'))
@staticmethod
- def get(session, path):
+ def get(session, path, parent_id = None):
try:
directory = session.query(Directory).filter(Directory.path == path).one()
except NoResultFound:
- directory = Directory(path)
+ directory = Directory(path, parent_id)
session.add(directory)
session.commit()
return directory
@@ -97,6 +100,8 @@ class Track(Base):
album_id = Column(Integer, ForeignKey('albums.id'))
directory = relationship(Directory, backref = backref('tracks', order_by = filename))
+ artist = relationship(Artist, backref = backref('artists'))
+ album = relationship(Album, backref = backref('tracks'))
def __init__(self, name, num, filename, file_index, directory_id, artist_id, album_id):
self.name = name
@@ -108,7 +113,7 @@ class Track(Base):
self.album_id = album_id
def __repr__(self):
- return u'<Track("{0}")>'.format(self.name)
+ return '<Track("{0}")>'.format(self.filename.encode('utf-8'))
@staticmethod
def get(session, name, num, filename, file_index, directory_id, artist_id, album_id):
@@ -119,6 +124,27 @@ class Track(Base):
session.add(track)
return track
+ @staticmethod
+ def find(session, path, track = None):
+ directory, filename = os.path.split(path)
+ return session.query(Track).filter(and_(Track.filename == filename, Directory.path == directory, Track.file_index == track)).one()
+
+ def get_path(self):
+ return os.path.join(self.directory.path, self.filename)
+
+ def get_relpath(self):
+ return os.path.relpath(self.get_path(), config.get('music_root'))
+
+ def get_metadata(self):
+ metadata = {}
+ if self.name:
+ metadata['title'] = self.name
+ if self.artist:
+ metadata['artist'] = self.artist.name
+ if self.album:
+ metadata['album'] = self.album.name
+ return metadata
+
Base.metadata.create_all(engine)
from sqlalchemy.orm import sessionmaker