1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
from common import utils
from db.db_manager import DbManager
class Album():
def __init__(self, id=None, **kwargs):
if id is not None:
db = DbManager()
for row in db.execute("""SELECT * FROM album WHERE id = ?""",
(id,)):
setattr(self, "id", id)
setattr(self, "name", row[1])
setattr(self, "date", row[2])
else:
for (key, value) in kwargs.items():
setattr(self, key, value)
def delete(self):
db = DbManager()
for track in self.tracks:
track.delete()
delete_sql = "DELETE FROM album WHERE id = ?"
db.execute(delete_sql, (self.id,))
delete_track_rel_sql = "DELETE FROM album_track WHERE album_id = ?"
db.execute(delete_track_rel_sql, (self.id,))
delete_artist_rel_sql = "DELETE FROM album_artist WHERE album_id = ?"
db.execute(delete_artist_rel_sql, (self.id,))
db.commit()
return True
@property
def artists(self):
from models.artist import Artist
if not hasattr(self, "_artists"):
setattr(self, "_artists", [])
db = DbManager()
for row in db.execute("""SELECT artist.* FROM artist INNER JOIN
album_artist ON artist.id =
album_artist.artist_id WHERE album_id = ?
ORDER BY name ASC""", (self.id,)):
artist = Artist(id=row[0], name=row[1], sortname=row[2],
musicbrainz_artistid=row[3])
self._artists.append(artist)
return self._artists
@property
def tracks(self):
from models.track import Track
if not hasattr(self, "_tracks"):
setattr(self, "_tracks", [])
db = DbManager()
for row in db.execute("""SELECT track.* FROM track
INNER JOIN album_track ON track.id =
album_track.track_id WHERE album_id = ?
ORDER BY tracknumber ASC""", (self.id,)):
track = Track(id=row[0], tracknumber=row[1], name=row[2],
grouping=row[3], filename=row[4])
self._tracks.append(track)
return self._tracks
def save(self):
dirty_attributes = {}
# check if the internal dict has been modified
for (attr, value) in self.__dict__.items():
if self.__data[attr] != getattr(self, attr):
dirty_attributes[attr] = value
if len(dirty_attributes) > 0:
db = DbManager()
set_clause = utils.update_clause_from_dict(dirty_attributes)
dirty_attributes[id] = self.id
sql = " ".join(("UPDATE album"), set_clause, "WHERE id = :id")
db.execute(sql, dirty_attributes)
db.commit()
def search(**search_params):
"""Find an album with the given params
Args:
name: dict, with 'data' and 'operator' keys
date: dict, with 'data' and 'operator' keys
musicbrainz_albumid: dict, with 'data' and 'operator' keys
"""
albums = []
db = DbManager()
# unpack search params
where_params = {}
value_params = {}
for (attr, value) in search_params.items():
where_params[attr] = value["operator"]
value_params[attr] = value["data"]
where_clause = utils.make_where_clause(where_params)
result = None
if where_clause:
statement = " ".join(("SELECT * FROM album", where_clause))
result = db.execute(statement, value_params)
else:
result = db.execute("SELECT * FROM album")
for row in result:
albums.append(
Album(id=row[0], name=row[1], date=row[2])
)
return albums
|