2 # Copyright (C) 2008 jerous <jerous@gmail.com>
3 # Copyright (C) 2009 Anton Khirnov <wyskas@gmail.com>
5 # Nephilim is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
10 # Nephilim is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with Nephilim. If not, see <http://www.gnu.org/licenses/>.
19 from PyQt4
import QtCore
22 from common
import sec2min
25 """The Song class offers an abstraction of a song."""
28 def __init__(self
, data
):
30 if 'track' in self
._data
:
32 self
._data
['track'] = int(self
._data
['track'])
34 # OGG tracks come in #track/#total format
36 self
._data
['track'] = int(self
._data
['track'].split('/')[0])
38 self
._data
['track'] = 0
40 # ensure all string-values are utf-8 encoded
41 for tag
in self
._data
.keys():
42 if isinstance(self
._data
[tag
], str):
43 self
._data
[tag
] = self
._data
[tag
].decode('utf-8')
44 if 'time' in self
._data
:
45 self
._data
['time'] = int(self
._data
['time'])
46 self
._data
['timems'] = '%i:%i'%(self
._data
['time'] / 60, self
._data
['time'] % 60)
47 self
._data
['length'] = sec2min(self
._data
['time'])
49 def __eq__(self
, other
):
50 if not isinstance(other
, Song
):
52 return self
._data
['file'] == other
._data
['file']
54 def __ne__(self
, other
):
55 if not isinstance(other
, Song
):
57 return self
._data
['file'] != other
._data
['file']
60 """Get the song's playlist ID. (-1 if not in playlist)."""
61 return self
.tag('id', '-1')
64 """Get the song's title (or filename if it has no title)."""
65 return self
.tag('title', self
._data
['file'])
68 """Get the song's artist."""
69 return self
.tag('artist')
72 """Get the song's track number."""
73 return self
.tag('track')
77 return self
.tag('album')
80 """Get the filepath."""
81 return self
._data
['file']
83 def tag(self
, tag
, default
=''):
84 """Get a tag. If it doesn't exist, return default."""
86 return self
._data
[tag
]
92 def expand_tags(self
, str):
93 """Expands tags in form $tag in str."""
95 ret
= ret
.replace('$title', self
.title()) #to ensure that it is set to at least filename
96 for tag
in self
._data
:
97 ret
= ret
.replace('$' + tag
, unicode(self
._data
[tag
]))
98 ret
= ret
.replace('$songdir', os
.path
.dirname(self
.filepath()))