from PyQt4 import QtCore import os from misc import sec2min class Song: """The Song class offers an abstraction of a song.""" _data = None def __init__(self, data): self._data = data if 'id' in self._data: self._data['id'] = int(self._data['id']) if 'track' in self._data: # make sure the track is a valid number! t=self._data['track'] for i in xrange(len(t)): if ord(t[i])ord('9'): try: self._data['track']=int(t[0:i]) except TypeError: self._data['track']=-1 break self._data['track']=int(self._data['track']) # ensure all string-values are utf-8 encoded for tag in self._data.keys(): if isinstance(self._data[tag], str): self._data[tag] = self._data[tag].decode('utf-8') if 'time' in self._data: self._data['time'] = int(self._data['time']) self._data['timems'] = '%i:%i'%(self._data['time'] / 60, self._data['time'] % 60) self._data['length'] = sec2min(self._data['time']) def getID(self): """Get the ID.""" return self.getTag('id', -1) def getTitle(self): """Get the title.""" return self.getTag('title', self._data['file']) def getArtist(self): """Get the artist.""" return self.getTag('artist', self._data['file']) def getTrack(self): """Get the track.""" return self.getTag('track') def getAlbum(self): """Get the album.""" return self.getTag('album') def getFilepath(self): """Get the filepath.""" return self._data['file'] def getTag(self, tag, default=''): """Get a tag. If it doesn't exist, return $default.""" if tag in self._data: return self._data[tag] if tag=='song': return self.__str__() return default def expand_tags(self, str): """Expands tags in form $tag in str.""" ret = str ret = ret.replace('$title', self.getTitle()) #to ensure that it is set to at least filename for tag in self._data: ret = ret.replace('$' + tag, unicode(self._data[tag])) ret = ret.replace('$songdir', os.path.dirname(self.getFilepath())) return ret