'''
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
class M3u(VPProxyPlugin):
- handlers = ('m3u', 'm3ut' )
+ handlers = ('m3u', 'm3ut', 'm3uw', 'list', 'play', 'index')
logger = logging.getLogger('plugin_m3u')
playlist = None
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'
+ 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:
+
+ 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
+ if self.splitted_path[1]=='index':
- else:
-
- 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')
+ 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)
connection.dieWithError()
return
- playlistgen = PlaylistGenerator()
+ 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:
- channel=dict()
- channel['name']=record.title.decode('utf-8')
- channel['url']=record.path.decode('utf-8')
- playlistgen.addItem(channel)
+ for record in playlist:
+ if record.title:
+ 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 = playlistgen.exportm3u(hostport,prefix)
exported = exported.encode('utf-8')
+
connection.wfile.write(exported)
def getparam(self, key):