CUBISTCODE

CUBISTCODE

Python playlist parser

# code excerpt from exaile music player 

import httplib, os, re, sys, threading, time, traceback, urllib, urlparse
from gettext import gettext as _

class PlaylistParser(object):
    def __init__(self, name, url=None):
        self.name = name
        self.url = []

        self.parse_file(url)

    def add_url(self, url, title=None, album=''):
        if not title: title=url
        try: 
            url = list(urlparse.urlsplit(url))
        except:
            pass

        if not url[0]:
            url[0] = 'file'

        item = {
            'url': url,
            'title': title,
            'album': album
        }
        self.url.append(item)

    def get_urls(self):
        return self.url

    def get_full(self):
        return [urlparse.urlunsplit(u) for u in self.url]

    def get_name(self):
        return self.name

    def parse_file(self, url):
        f = urllib.urlopen(url)
        try:
            return self._do_parse_file(f)
        finally:
            try:
                f.close()
            except:
                pass

    def _do_parse_file(self, file):
        raise NotImplementedError

    def _get_url_from_path(self, basedir, s):
        if not urlparse.urlsplit(s)[0]: # no scheme --> local path
            if not os.path.isabs(s): # relative path
                s = os.path.join(basedir, s)
            s = 'file://' + urllib.quote(s)
        return s

class M3UParser(PlaylistParser):
    REGEX = re.compile(r'#EXTINF:\d+,(.*?)[\r\n]+(.*?)[\r\n]+', re.DOTALL) 

    def _do_parse_file(self, file):
        # Read first line to see if this is extended M3U.
        firstline = file.readline()
        if firstline.strip() == "#EXTM3U":
            return self._do_parse_extended(file)

        basedir = os.path.dirname(file.url)
        for line in [firstline] + file.readlines():
            line = line.strip()
            if line and line[0] == "#":
                url = self._get_url_from_path(basedir, line)
                self.add_url(url)

        return True

    def _do_parse_extended(self, file):
        data = file.read()
        items = self.REGEX.findall(data)
        if items:
            basedir = os.path.dirname(file.url)
            for item in items:
                url = self._get_url_from_path(basedir, item[1])
                self.add_url(url, title=item[0], album=url)

        return True
        
class PlsParser(PlaylistParser):
    REGEX = re.compile(r'[fF]ile(\d+)=(.*?)\n[tT]itle(\1)=(.*?)\n', re.DOTALL)

    def _do_parse_file(self, file):
        data = file.read()
        items = self.REGEX.findall(data)

        if items:
            basedir = os.path.dirname(file.url)
            for item in items:
                url = self._get_url_from_path(basedir, item[1])
                self.add_url(url, title=url, album=item[3])

        return True
   
class ASXParser(PlaylistParser):
    REGEX = re.compile(r''' 
		

Tags: file, functions, mp3, python

Rate This Article:



Privacy Policy | Copyright/Trademark Notification