-__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