Корректная обработка ошибок при неправильном имени канала.
[vpproxy.git] / plugins / m3u_plugin.py
index 539616b84d0514c0419c739d6030157a9ee09a91..4d806fac9643d1271266febf11e6df255b031e03 100644 (file)
@@ -38,13 +38,14 @@ import os
 
 class M3u(VPProxyPlugin):
 
-    handlers = ('m3u', 'm3ut', 'm3uw', "list", "play", "index")
+    handlers = ('m3u', 'm3ut', 'm3uw', 'm3uo', 'list', 'play', 'index')
 
     logger = logging.getLogger('plugin_m3u')
     playlist = None
 
     def handle(self, connection):
 
+        logger = logging.getLogger('plugin_m3u')
         hostport = connection.headers['Host']
 
         self.splitted_path=connection.path.split('/')
@@ -52,13 +53,16 @@ class M3u(VPProxyPlugin):
         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]=='m3uo':
+          prefix='ogv'  
         elif self.splitted_path[1] in ("list","play","index"):
           None  
         else:
           connection.dieWithError(404)  
+          return
           
         if len(self.splitted_path)>3 and self.splitted_path[1]!="play":
             connection.dieWithError()
@@ -66,9 +70,12 @@ class M3u(VPProxyPlugin):
 
         if self.splitted_path[1]=='index':
 
+            text=""
             for dir in os.walk(config.m3u_directory):
                 if dir[0]==config.m3u_directory:
-                    text='\n'.join(dir[2])
+                    for dirname in dir[2]:
+                        if dirname.endswith('.m3u'):
+                            text=text+'\n'+dirname
 
             connection.send_response(200)
             connection.send_header('Content-Type', 'text/plain; charset=utf-8')
@@ -103,29 +110,35 @@ class M3u(VPProxyPlugin):
             connection.end_headers()
         elif self.splitted_path[1]=="play":
             channel=self.splitted_path[len(self.splitted_path)-1]
+            logger.debug('channel requestes= "%s"' % channel)
+            if not channel:
+              connection.dieWithError(404)
+              return
             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()
+                return
             else:
               connection.dieWithError()  
+              return
             url=None
             for record in playlist:
-                if record.title.decode('utf-8')==channel:
+              if record.title:
+                if record.title.decode('utf-8').replace('/','')==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:
+                logger.debug('Nothing found!')
                 connection.dieWithError(404)
+                return
             
         else:
             connection.send_response(200)
@@ -142,27 +155,47 @@ class M3u(VPProxyPlugin):
             connection.dieWithError()
             return
 
+        exported = ""
+
         if self.splitted_path[1]=="list":
  
-             exported = ""
-            
              for record in playlist:
-                 exported = exported + "" + record.title.decode('utf-8') + "\n"
+                 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)
+                if record.title:
+                    channel=dict()
+                    channel['name']=record.title.decode('utf-8')
+                    channel['url']=record.path.decode('utf-8')            
+                    try:
+                      channel['tvg']=record.attrs['tvg-name'].decode('utf-8')
+                    except:
+                      None
+                    try: 
+                      if record.attrs['group-title'] != 'None':   
+                        channel['group']=record.attrs['group-title'].decode('utf-8')
+                    except:
+                      None
+                    try:    
+                      channel['country']=record.attrs['country'].decode('utf-8')
+                    except:
+                      None
+                    try:    
+                      channel['logo']=record.attrs['tvg-logo'].decode('utf-8')
+                    except:
+                      None
+                    playlistgen.addItem(channel)
 
             exported = playlistgen.exportm3u(hostport,prefix)
-            
-        exported = exported.encode('utf-8')
-        connection.wfile.write(exported)
+
+        if exported:
+            exported = exported.encode('utf-8')
+            connection.wfile.write(exported)
 
     def getparam(self, key):
         if key in self.params: