From 3a3df745c628e61204c0444f912f74a55d1d38d1 Mon Sep 17 00:00:00 2001 From: Roman Bazalevsky Date: Wed, 29 Jul 2015 20:08:44 +0300 Subject: [PATCH] Additional plugin handlers for playlists --- plugins/m3u_plugin.py | 139 ++++++++++++++++++++++++++++++++---------- 1 file changed, 107 insertions(+), 32 deletions(-) diff --git a/plugins/m3u_plugin.py b/plugins/m3u_plugin.py index 2263dfe..539616b 100644 --- a/plugins/m3u_plugin.py +++ b/plugins/m3u_plugin.py @@ -2,13 +2,34 @@ __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/index -http://ip:port/m3u{/list-name} +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 @@ -17,7 +38,7 @@ import os class M3u(VPProxyPlugin): - handlers = ('m3u', 'm3ut' ) + handlers = ('m3u', 'm3ut', 'm3uw', "list", "play", "index") logger = logging.getLogger('plugin_m3u') playlist = None @@ -27,45 +48,89 @@ class M3u(VPProxyPlugin): 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='webm' 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: + + if len(self.splitted_path)>3 and self.splitted_path[1]!="play": connection.dieWithError() return - - if len(self.splitted_path)<3: - m3u_file=config.m3u_directory+'/'+config.m3u_default - - else: + if self.splitted_path[1]=='index': - if self.splitted_path[2]=='index': - for dir in os.walk(config.m3u_directory): - if dir[0]==config.m3u_directory: - text='\n'.join(dir[2]) + 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') - connection.end_headers() + 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) + listing = text.encode('utf-8') + connection.wfile.write(listing) - return + return + + if len(self.splitted_path)<3 or (len(self.splitted_path)==3 and self.splitted_path[1]=="play"): - m3u_file=config.m3u_directory+'/'+self.splitted_path[2] + m3u_file=config.m3u_directory+'/'+config.m3u_default - connection.send_response(200) - connection.send_header('Content-Type', 'application/x-mpegurl') - connection.end_headers() + 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') + print channel + 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')==channel: + url=record.path.decode('utf-8') + print url + if url: + redirect='/'+prefix+'/'+url + print redirect + 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) @@ -77,15 +142,25 @@ class M3u(VPProxyPlugin): connection.dieWithError() return - playlistgen = PlaylistGenerator() + if self.splitted_path[1]=="list": + + exported = "" + + for record in playlist: + exported = exported + "" + record.title.decode('utf-8') + "\n" + + else: - for record in playlist: - channel=dict() - channel['name']=record.title.decode('utf-8') - channel['url']=record.path.decode('utf-8') - playlistgen.addItem(channel) + playlistgen = PlaylistGenerator() - exported = playlistgen.exportm3u(hostport,prefix) + for record in playlist: + 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) -- 2.34.1