summaryrefslogtreecommitdiff
path: root/models/artist.py
blob: eaae27e3fcf242fb0e030f8a1246b5cedd05b14b (plain)
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
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):
        artists = []

        db = DbManager()

        where_clause = utils.make_where_clause(search_params)

        result = []
        if where_clause:
            statement = " ".join(("SELECT * FROM artist", where_clause))
            result = db.execute(statement, search_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