| 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
 |