__author__ = 'rvb' ''' Local Playlist Plugin (based on ytv plugin by ValdikSS) plsylist index http://ip:port/index m3u playlists http://ip:port/m3u http://ip:port/m3u/ http://ip:port/m3u/list-name plain-tet channel names http://ip:port/list http://ip:port/list/ http://ip:port/list/list-name forward to player http://ip:port/play/channel-name http://ip:port/play/list-name/channel-name http://ip:port/play/{list-name}/(get|mp4|webm)/channel-name ''' import json import logging import urlparse import urllib from modules.PluginInterface import VPProxyPlugin from modules.PlaylistGenerator import PlaylistGenerator from modules.M3uParser import parseM3U import config.m3u as config import os class M3u(VPProxyPlugin): handlers = ('m3u', 'm3ut', 'm3uw', "list", "play", "index") logger = logging.getLogger('plugin_m3u') playlist = None def handle(self, connection): hostport = connection.headers['Host'] self.splitted_path=connection.path.split('/') if self.splitted_path[1]=='m3u': prefix='get' elif self.splitted_path[1]=='m3uw': prefix='ogg' elif self.splitted_path[1]=='m3ut': prefix='mp4' elif self.splitted_path[1] in ("list","play","index"): None else: connection.dieWithError(404) if len(self.splitted_path)>3 and self.splitted_path[1]!="play": connection.dieWithError() return if self.splitted_path[1]=='index': for dir in os.walk(config.m3u_directory): if dir[0]==config.m3u_directory: text='\n'.join(dir[2]) connection.send_response(200) connection.send_header('Content-Type', 'text/plain; charset=utf-8') connection.end_headers() listing = text.encode('utf-8') connection.wfile.write(listing) return if len(self.splitted_path)<3 or (len(self.splitted_path)==3 and self.splitted_path[1]=="play"): m3u_file=config.m3u_directory+'/'+config.m3u_default else: filename = self.splitted_path[2] if filename: m3u_file=config.m3u_directory+'/'+self.splitted_path[2] else: m3u_file=config.m3u_directory+'/'+config.m3u_default try: playlist=parseM3U(m3u_file) except: connection.dieWithError(404) return if self.splitted_path[1]=="list": connection.send_response(200) connection.send_header('Content-Type', 'text/plain; charset=utf-8') connection.end_headers() elif self.splitted_path[1]=="play": channel=self.splitted_path[len(self.splitted_path)-1] channel=urllib.unquote(channel).decode('utf-8') if len(self.splitted_path)<=4: prefix="get" elif len(self.splitted_path)==5: prefix=self.splitted_path[len(self.splitted_path)-2] if prefix not in ('get','mp4','webm'): connection.dieWithError() else: connection.dieWithError() url=None for record in playlist: if record.title.decode('utf-8').replace('/','')==channel: url=record.path.decode('utf-8') if url: redirect='/'+prefix+'/'+url connection.send_response(302) connection.send_header('Location', redirect) connection.end_headers() else: connection.dieWithError(404) else: connection.send_response(200) connection.send_header('Content-Type', 'application/x-mpegurl') connection.end_headers() try: playlist=parseM3U(m3u_file) except: connection.dieWithError(404) return if not playlist: connection.dieWithError() return if self.splitted_path[1]=="list": exported = "" for record in playlist: if record.title: exported = exported + "" + record.title.decode('utf-8').replace('/','') + "\n" else: playlistgen = PlaylistGenerator() for record in playlist: print record channel=dict() channel['name']=record.title.decode('utf-8') channel['url']=record.path.decode('utf-8') playlistgen.addItem(channel) exported = playlistgen.exportm3u(hostport,prefix) exported = exported.encode('utf-8') connection.wfile.write(exported) def getparam(self, key): if key in self.params: return self.params[key][0] else: return None