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
129
|
from common import utils
from db.db_manager import DbManager
class Artist:
def __init__(self, id=None, **kwargs):
if id is not None:
db = DbManager()
for row in db.execute("""SELECT * FROM artist WHERE id = ?""",
(id,)):
setattr(self, "id", id)
setattr(self, "name", row[1])
setattr(self, "sortname", row[2])
setattr(self, "musicbrainz_artistid", row[3])
else:
for (key, value) in kwargs.items():
setattr(self, key, value)
def delete(self):
db = DbManager()
for album in self.albums:
album.delete()
delete_sql = "DELETE FROM artist WHERE id = ?"
db.execute(delete_sql, (self.id,))
delete_track_rel_sql = "DELETE FROM artist_track WHERE artist_id = ?"
db.execute(delete_track_rel_sql, (self.id,))
delete_album_rel_sql = "DELETE FROM album_artist WHERE artist_id = ?"
db.execute(delete_album_rel_sql, (self.id,))
db.commit()
return True
@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 artist_track ON track.id =
artist_track.track_id WHERE artist_id = ?
ORDER BY name 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
@property
def albums(self):
from models.album import Album
if not hasattr(self, "_albums"):
setattr(self, "_albums", [])
db = DbManager()
for row in db.execute("""SELECT album.* FROM album
INNER JOIN album_artist ON album.id =
album_artist.album_id WHERE artist_id = ?
ORDER BY date ASC""", (self.id,)):
album = Album(id=row[0], name=row[1], date=row[2])
self._albums.append(album)
return self._albums
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 artist"), set_clause, "WHERE id = :id")
db.execute(sql, dirty_attributes)
db.commit()
def search(**search_params):
"""Find an artist with the given params
Args:
name: dict, with 'data' and 'operator' keys
sortname: dict, with 'data' and 'operator' keys
musicbrainz_artist_id: dict, with 'data' and 'operator' keys
"""
artists = []
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 = []
if where_clause:
statement = " ".join(("SELECT * FROM artist", where_clause))
result = db.execute(statement, value_params)
else:
result = db.execute("SELECT * FROM artist")
for row in result:
artists.append(
Artist(id=row[0], name=row[1], sortname=row[2],
musicbrainz_artistid=row[3])
)
return artists
|