Free text search to look for better album art
[mussorgsky] / src / coverModel.py
1 # -*- coding: utf-8 -*-
2 import os
3 import sys
4 from PySide import QtCore
5 from PySide import QtGui
6 from PySide import QtDeclarative
7
8 from coverItem import CoverItem
9 from albumItem import AlbumItem
10
11 class CoversModel (QtCore.QAbstractListModel):
12     COLUMNS = ('cover', )
13
14     def __init__ (self, albumItem):
15         QtCore.QAbstractListModel.__init__ (self)
16         self.albumItem = albumItem
17         self.__searchString = self.albumItem.artist + " " + self.albumItem.title
18         self.startOffset = 2
19         self._alternatives = [
20              CoverItem (self.albumItem.album_art, initialImage=True),
21              CoverItem ("images/blank_record.png", deleteAction = True),
22              CoverItem (None),
23              CoverItem (None),
24              CoverItem (None),
25              CoverItem (None)
26             ]
27
28         self.setRoleNames (dict(enumerate(CoversModel.COLUMNS)))
29
30     def rowCount (self, parent=QtCore.QModelIndex()):
31         return len (self._alternatives)
32
33     def data (self, index, role):
34         if index.isValid () and role == CoversModel.COLUMNS.index ('cover'):
35             return self._alternatives[index.row ()]
36         return None
37
38     def updateData (self, row, url):
39         print "updating", row, "to", url
40         position = row + self.startOffset
41         assert position >= 0 and position < len (self._alternatives)
42         if url == None:
43             self._alternatives[position].url = "images/broken.png"
44             self._alternatives[position].broken = True
45         else:
46             self._alternatives[position].url = url
47
48     def getData (self, row):
49         assert row >= 0 and row < len (self._alternatives)
50         return self._alternatives[row]
51
52     def reset (self):
53         for i in range (self.startOffset, len (self._alternatives)):
54             self._alternatives[i].reset ()
55                            
56
57     def cleanCache (self):
58         """
59         The model contains the urls of the downloaded alternatives.
60         This method removes those files. The selected image should have already been copied 
61          to its final location.
62         """
63         for i in range (self.startOffset, len (self._alternatives)):
64             # This url can be None if the image didn't finish downloading
65             if self._alternatives[i].url and os.path.exists (self._alternatives[i].url):
66                 os.remove (self._alternatives[i].url)
67
68     def _searchString (self):
69         return self.albumItem.artist + " " + self.albumItem.title
70     def _setSearchString (self, searchStr):
71         self.searchString = searchStr
72         searchString_changed.emit ()
73     
74     searchString_changed = QtCore.Signal ()
75     searchString = QtCore.Property (unicode, _searchString, _setSearchString, notify=searchString_changed)