# -*- coding: utf-8 -*- def parse_m3u(s): s = filter(None, map(lambda x: x.strip(), s.split('\n'))) if s[0]=='#EXTM3U': title = '' for i in xrange(1,len(s)): l = s[i] if l[0]=='#': title = ','.join(l.split(',')[1:]) else: yield title, l title = '' def parse_pls(s): s = filter(None, map(lambda x: x.strip(), s.split('\n'))) def get(key, default=''): matches = filter(lambda x: x.startswith(key), s) return '='.join(matches[0].split('=')[1:]).strip() if matches else default if s[0]=='[playlist]': for i in xrange(1, int(get('NumberOfEntries','1'))+1): yield get('Title%d'%i,''), get('File%d'%i,'') def parse_playlist(s): # — За бортом остались мелкомягкие ASX-плейлисты. # Если кому понадобится — сооружу поддержку: там простой XML вида # <REF href=""/><REF/></ENTRY><ENTRY/></ASX> # (надеюсь, я понятно сократил?) # — За бортом остались SMIL-плейлисты, скармливаемые владельцам Real Player. # Это тоже XML, и тоже довольно простой. # <smil><body><audio src=""/><audio/></body></smil> m3u = list(parse_m3u(s)) pls = list(parse_pls(s)) # Иногда различные идиоты под видом m3u и прочей экзотики пихают одинокий URL. # Посылаю им двойной луч семилетнего поноса. s = s.strip() single = [('', s)] if (len(s)<256 and s.find('://')!=-1 and s.find('\n')==-1) else [] return m3u if m3u else (pls if pls else single)