Changeset 462
- Timestamp:
- 09/22/06 22:42:22 (2 years ago)
- Files:
-
- trunk/Makefile.in (modified) (1 diff)
- trunk/src/audio_control.py (modified) (1 diff)
- trunk/src/mesk/audio/__init__.py (modified) (2 diffs)
- trunk/src/mesk/audio/mp3.py (modified) (1 diff)
- trunk/src/mesk/audio/oggvorbis.py (modified) (1 diff)
- trunk/src/mesk/audio/source.py (modified) (1 diff)
- trunk/src/mesk/playlist/__init__.py (modified) (2 diffs)
- trunk/src/mesk/playlist/xspf.py (modified) (2 diffs)
- trunk/src/playlist_control.py (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/Makefile.in
r425 r462 187 187 mkdir -p www/mesk/releases 188 188 mkdir www/mesk/releases/gentoo 189 # TODO189 # FIXME 190 190 #cp README.html ChangeLog COPYING NEWS TODO THANKS www/mesk 191 191 #cd www/mesk && ln -s README.html index.html 192 192 cp ${DIST_GZ} www/mesk/releases 193 193 cp etc/mesk-${EBUILD_VERSION}.ebuild www/mesk/releases/gentoo 194 tar czvf ${DIST_WWW} www194 cd www && tar czvf ${DIST_WWW} mesk 195 195 rm -rf www 196 197 push-www:198 scp ${DIST_WWW} nicfit:.199 ssh nicfit 'tar xzvf ${DIST_WWW}'200 196 201 197 sloccount: trunk/src/audio_control.py
r419 r462 571 571 src.meta_data.year = unicode(str(taglist['date'].year), 'utf-8') 572 572 if 'track-number' in keys: 573 src.meta_data.track_num = taglist['track-number']573 src.meta_data.track_num = int(taglist['track-number']) 574 574 if 'track-count' in keys: 575 src.meta_data.track_total = taglist['track-count']575 src.meta_data.track_total = int(taglist['track-count']) 576 576 if 'duration' in keys: 577 src.meta_data.time_secs = taglist['duration']/ gst.SECOND577 src.meta_data.time_secs = int(taglist['duration']) / gst.SECOND 578 578 self.emit('tag-update', src) 579 579 trunk/src/mesk/audio/__init__.py
r453 r462 76 76 '''Thrown when a audio format is not supported''' 77 77 78 def load(uri ):78 def load(uri, meta_data=None): 79 79 '''Given a URI, attempt to load an AudioSource. If this cannot be done, 80 80 a UnsupportedFormat exception, or other related error is thrown.''' … … 92 92 else: 93 93 factory = supported_mimetypes[mt] 94 src = factory(uri )94 src = factory(uri, meta_data) 95 95 return src trunk/src/mesk/audio/mp3.py
r453 r462 52 52 class Mp3AudioSource(AudioSource): 53 53 54 def __init__(self, uri ):55 AudioSource.__init__(self, uri )54 def __init__(self, uri, meta_data=None): 55 AudioSource.__init__(self, uri, meta_data) 56 56 57 if self.uri.scheme == 'file': 58 self.meta_data = Mp3MetaData(self.uri) 59 elif self.uri.scheme in ['http', 'https']: 60 self.meta_data = Mp3MetaData() 61 else: 62 raise UnsupportedScheme('\'%s\' URI scheme is not supported' % \ 63 uri.scheme) 57 if not self.meta_data: 58 if self.uri.scheme == 'file': 59 self.meta_data = Mp3MetaData(self.uri) 60 elif self.uri.scheme in ['http', 'https']: 61 self.meta_data = Mp3MetaData() 62 else: 63 raise UnsupportedScheme('\'%s\' URI scheme is not supported' % \ 64 uri.scheme) 64 65 65 66 # Use URI if we don't have a title trunk/src/mesk/audio/oggvorbis.py
r453 r462 35 35 from ogg.vorbis import VorbisFile, VorbisError 36 36 class OggAudioSource(AudioSource): 37 def __init__(self, uri): 38 AudioSource.__init__(self, uri) 39 if self.uri.scheme == 'file': 40 self.meta_data = OggMetaData(self.uri) 41 elif self.uri.scheme in ['http', 'https']: 42 self.meta_data = OggMetaData() 43 else: 44 raise UnsupportedScheme('\'%s\' URI scheme is not supported' % \ 45 uri.scheme) 37 def __init__(self, uri, meta_data=None): 38 AudioSource.__init__(self, uri, meta_data) 39 40 if not self.meta_data: 41 if self.uri.scheme == 'file': 42 self.meta_data = OggMetaData(self.uri) 43 elif self.uri.scheme in ['http', 'https']: 44 self.meta_data = OggMetaData() 45 else: 46 raise UnsupportedScheme('\'%s\' URI scheme is not supported' % \ 47 uri.scheme) 46 48 47 49 # Use URI if we don't have a title trunk/src/mesk/audio/source.py
r391 r462 44 44 45 45 class AudioSource: 46 def __init__(self, uri ):46 def __init__(self, uri, meta_data): 47 47 self.uri = mesk.uri.make_uri(uri) 48 self.meta_data = AudioMetaData()48 self.meta_data = meta_data 49 49 50 50 def get_native_tag(self): trunk/src/mesk/playlist/__init__.py
r455 r462 45 45 continue 46 46 47 def load(pl_uri ):47 def load(pl_uri, name=None): 48 48 '''Load a playlist, currently only m3u is supported''' 49 49 50 pl = Playlist( )50 pl = Playlist(name) 51 51 pl_path = mesk.uri.unescape(pl_uri.path) 52 52 pl_ext = os.path.splitext(pl_path)[1] … … 80 80 81 81 class Playlist: 82 def __init__(self, name =None):82 def __init__(self, name=None): 83 83 self.name = name 84 84 # AudioSource objects managed my this playlist and the index of the trunk/src/mesk/playlist/xspf.py
r455 r462 18 18 # $Id$ 19 19 ################################################################################ 20 import mesk.log, mesk.audio 20 21 21 22 NAME = 'Spiff' … … 26 27 mimetypes.add_type(MIME_TYPES[0], EXTENSIONS[0]) 27 28 29 XSPF_NS = 'http://xspf.org/ns/0/' 30 META_YEAR = 'http://mesk.nicfit.net/playlist/year' 31 META_CURRENT = 'http://mesk.nicfit.net/playlist/current' 32 META_SHUFFLE = 'http://mesk.nicfit.net/playlist/shuffle' 33 META_REPEAT = 'http://mesk.nicfit.net/playlist/repeat' 34 28 35 def load(pl_data, pl): 29 pass 36 import xml.dom, xml.dom.minidom 37 pl_dom = xml.dom.minidom.parse(pl_data) 38 pl_elem = pl_dom.getElementsByTagNameNS(XSPF_NS, 'playlist')[0] 39 40 # Playlist state 41 pl.set_curr_index(-1) 42 pl.set_shuffle(False) 43 pl.set_repeat(False) 44 for meta_elem in pl_elem.getElementsByTagName('meta'): 45 if meta_elem.getAttribute('rel') == META_CURRENT: 46 try: 47 pl.set_curr_index(int(_get_elem_text(meta_elem))) 48 except IndexError: 49 pass 50 elif meta_elem.getAttribute('rel') == META_SHUFFLE: 51 pl.set_shuffle(True) 52 elif meta_elem.getAttribute('rel') == META_REPEAT: 53 pl.set_repeat(True) 54 55 list_elem = pl_elem.getElementsByTagName('trackList')[0] 56 for track_elem in list_elem.getElementsByTagName('track'): 57 uri = track_elem.getElementsByTagName('location') 58 if not uri: 59 mesk.log.warn('<location/> URI required in XSPF playlist tracks') 60 continue 61 62 meta_data = mesk.audio.source.AudioMetaData() 63 for elem in track_elem.childNodes: 64 if elem.nodeType == elem.ELEMENT_NODE: 65 if elem.tagName == 'title': 66 meta_data.title = _get_elem_text(elem) 67 elif elem.tagName == 'creator': 68 meta_data.artist = _get_elem_text(elem) 69 elif elem.tagName == 'album': 70 meta_data.album = _get_elem_text(elem) 71 elif elem.tagName == 'duration': 72 meta_data.time_secs = int(_get_elem_text(elem)) / 1000 73 elif elem.tagName == 'trackNum': 74 meta_data.trac_num = int(_get_elem_text(elem)) 75 elif (elem.tagName == 'meta' and 76 elem.getAttribute('rel') == META_YEAR): 77 meta_data.year = _get_elem_text(elem) 78 79 # FIXME: 80 #meta_data = None 81 82 try: 83 src = mesk.audio.load(_get_elem_text(uri[0]), meta_data) 84 except Exception, ex: 85 mesk.log.warn(str(ex)) 86 else: 87 pl.append(src) 30 88 31 89 def save(pl_path, pl): 90 import xml.sax.saxutils as saxutils 91 def pad(n): 92 return ' ' * n 93 32 94 fp = file(pl_path, 'w') 33 95 # We are only serializing pl, so building a DOM would just waste time. 96 fp.write('<?xml version="1.0" encoding="UTF-8"?>\n') 34 97 fp.write('<playlist xmlns="http://xspf.org/ns/0/" ' 35 98 'xmlns:mesk="http://mesk.nicfit.net" version="1">\n') 36 99 indent = 2 37 fp.write((' ' * indent) + '<title>%s</title>\n' % 'FIXME') 38 fp.write((' ' * indent) + '<creator>%s</creator>\n' % 'Mesk') 39 fp.write((' ' * indent) + '<annotation>%s</annotation>\n' % 'Mesk Playlist') 40 fp.write((' ' * indent) + '<trackList>\n') 100 fp.write(pad(indent) + '<title>%s</title>\n' % saxutils.escape(pl.name)) 101 fp.write(pad(indent) + 102 '<info>Made with Mesk-http://mesk.nicfit.net/</info>\n') 103 fp.write(pad(indent) + '<meta rel="%s">%d</meta>\n' % 104 (META_CURRENT, pl.get_curr_index())) 105 if pl.is_shuffled(): 106 fp.write(pad(indent) + '<meta rel="%s">%d</meta>\n' % 107 (META_SHUFFLE, int(pl.is_shuffled()))) 108 if pl.is_repeating(): 109 fp.write(pad(indent) + '<meta rel="%s">%d</meta>\n' % 110 (META_REPEAT, int(pl.is_repeating()))) 111 112 fp.write(pad(indent) + '<trackList>\n') 41 113 indent += 2 42 114 for s in pl: 43 fp.write((' ' * indent) + '<track>\n') 44 indent +=2 45 fp.write((' ' * indent) + '<location>%s</location>\n' % str(s.uri)) 46 indent -=2 47 fp.write((' ' * indent) + '</track>\n') 115 fp.write(pad(indent) + '<track>\n') 116 indent += 2 117 118 fp.write(pad(indent) + '<location>%s</location>\n' % 119 saxutils.escape(str(s.uri))) 120 if s.meta_data.time_secs: 121 fp.write(pad(indent) + '<duration>%d</duration>\n' % 122 (s.meta_data.time_secs * 1000)) 123 if s.meta_data.title: 124 t = saxutils.escape(s.meta_data.title.encode('utf-8')) 125 fp.write(pad(indent) + '<title>%s</title>\n' % t) 126 if s.meta_data.artist: 127 a = saxutils.escape(s.meta_data.artist.encode('utf-8')) 128 fp.write(pad(indent) + '<creator>%s</creator>\n' % a) 129 if s.meta_data.album: 130 a = saxutils.escape(s.meta_data.album.encode('utf-8')) 131 fp.write(pad(indent) + '<album>%s</album>\n' % a) 132 if s.meta_data.track_num is not None: 133 fp.write(pad(indent) + 134 '<trackNum>%d</trackNum>\n' % s.meta_data.track_num) 135 if s.meta_data.year is not None: 136 fp.write(pad(indent) + '<meta rel="%s">%d</meta>\n' % 137 (META_YEAR, int(s.meta_data.year))) 138 139 indent -= 2 140 fp.write(pad(indent) + '</track>\n') 48 141 49 142 indent -= 2 50 fp.write( (' ' *indent) + '</trackList>\n')143 fp.write(pad(indent) + '</trackList>\n') 51 144 fp.write('</playlist>\n') 52 145 fp.close() 53 146 147 148 def _get_elem_text(elem): 149 nodelist = elem.childNodes 150 txt = u'' 151 for node in nodelist: 152 if node.nodeType == node.TEXT_NODE: 153 txt = txt + node.data 154 return txt trunk/src/playlist_control.py
r456 r462 181 181 182 182 # Load playlist 183 pl = mesk.playlist.load(self._pl_config.uri) 183 # FIXME 184 import time 185 t1 = time.time() 186 pl = mesk.playlist.load(self._pl_config.uri, name=self._pl_config.name) 187 t2 = time.time() 188 print "Playlist load time: %fs" % (t2 - t1) 184 189 pl.set_shuffle(self._pl_config.shuffle) 185 190 pl.set_repeat(self._pl_config.repeat) … … 217 222 def _save_cb(): 218 223 self._pl_config.update(self._playlist) 219 mesk.playlist. m3u.save(mesk.uri.unescape(self._pl_config.uri.path),220 self._playlist)224 mesk.playlist.xspf.save(mesk.uri.unescape(self._pl_config.uri.path), 225 self._playlist) 221 226 # FIXME 222 mesk.playlist.xspf.save('../pl.xspf', self._playlist)227 #mesk.playlist.xspf.save('../pl.xspf', self._playlist) 223 228 224 229 self._debug_show_playlist() … … 499 504 # Update state 500 505 self.name = new_name 506 self._playlist.name = new_name 501 507 self._pl_config.set_name(new_name) 502 508 self._update_tab_label()
