summaryrefslogtreecommitdiff
path: root/models/album.py
blob: 727156fc289e5feaa50b9f107028d5f3ce254972 (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
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):
        albums = []

        db = DbManager()

        where_clause = utils.make_where_clause(search_params)

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