# # Copyright (C) 2008 jerous # Copyright (C) 2009 Anton Khirnov # # Nephilim is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # Nephilim is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with Nephilim. If not, see . # 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: try: self._data['track'] = int(self._data['track']) except ValueError: # OGG tracks come in #track/#total format try: self._data['track'] = int(self._data['track'].split('/')[0]) except ValueError: self._data['track'] = 0 # 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 __eq__(self, other): if not isinstance(other, Song): return NotImplemented return self._data['file'] == other._data['file'] def __ne__(self, other): if not isinstance(other, Song): return NotImplemented return self._data['file'] != other._data['file'] def id(self): """Get the song's playlist ID. (-1 if not in playlist).""" return self.tag('id', -1) def title(self): """Get the song's title (or filename if it has no title).""" return self.tag('title', self._data['file']) def artist(self): """Get the song's artist.""" return self.tag('artist') def track(self): """Get the song's track number.""" return self.tag('track') def album(self): """Get the album.""" return self.tag('album') def filepath(self): """Get the filepath.""" return self._data['file'] def tag(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.title()) #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.filepath())) return ret