YoungJules

Clunky m3u maker

Jun 12th, 2012
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.74 KB | None | 0 0
  1. import logging
  2. import urllib
  3. import signal
  4. import os
  5. import time
  6. import re
  7. import BeautifulSoup
  8. import xml.dom.minidom
  9.  
  10. from operator import itemgetter
  11.  
  12. def collation( s1, s2 ):
  13.     ss1 = s1[ 0 ].lower( )
  14.     ss2 = s2[ 0 ].lower( )
  15.     return ( ss1 > ss2 ) - ( ss1 < ss2 )
  16.  
  17. class services:
  18.     def __init__( self, ip, type ):
  19.         self.list = { }
  20.         request = urllib.urlopen( 'http://%s/cgi-bin/getServices?ref=%s' % ( ip, type ) )
  21.         while True:
  22.             line = request.readline( )
  23.             if line == '': break
  24.             tokens = line.split( ';' )
  25.             self.list[ tokens[ 0 ] ] = tokens[ 1 : ]
  26.         self.sorted = sorted( self.list.iteritems( ), cmp = collation, key = itemgetter( 1 ) )
  27.  
  28. class data_parser:
  29.     def __init__( self, ip ):
  30.         request = urllib.urlopen( 'http://%s/data' % ip )
  31.         tree = BeautifulSoup.BeautifulSoup( request )
  32.         incidents = tree( 'script' )
  33.         for entry in incidents[ 1 ].decode( ).split( '\n' )[ 1:-1 ]:
  34.             line = str( entry ).strip( )
  35.             if line.startswith( 'var ' ):
  36.                 exec( line.replace( 'var ', 'self.', 1 )[ 0:-1] )
  37.  
  38. def obtain_service( element ):
  39.     return ( element.getElementsByTagName( "e2servicereference" )[ 0 ].firstChild.data, element.getElementsByTagName( "e2servicename" )[ 0 ].firstChild.data )
  40.  
  41. def obtain_title( element ):
  42.     return ( urllib.quote( element.getElementsByTagName( "e2servicereference" )[ 0 ].firstChild.data ), element.getElementsByTagName( "e2title" )[ 0 ].firstChild.data )
  43.  
  44. def obtain_services( element ):
  45.     return element.getElementsByTagName( "e2service" )
  46.  
  47. def obtain_movies( element ):
  48.     return element.getElementsByTagName( "e2movie" )
  49.  
  50. class services2:
  51.     def __init__( self, ip, type ):
  52.         self.list = { }
  53.         fd = urllib.urlopen( 'http://%s/web/getservices?sRef=%s' % ( ip, urllib.quote( type ) ) )
  54.         dom = xml.dom.minidom.parse( fd )
  55.         for element in obtain_services( dom ):
  56.             service = obtain_service( element )
  57.             try:
  58.                 if len( service[ 1 ] ) and service[ 1 ][ 0 ] not in '(.!- ':
  59.                     self.list[ str( service[ 0 ] ) ] = [ str( service[ 1 ] ) ]
  60.             except Exception:
  61.                 pass
  62.         self.sorted = sorted( self.list.iteritems( ), cmp = collation, key = itemgetter( 1 ) )
  63.  
  64. class enigma2:
  65.     def __init__( self, ip, bouquet ):
  66.         self.ip = ip
  67.         self.bouquet = bouquet
  68.  
  69.     def populate( self ):
  70.         bouquets = { }
  71.         services = { }
  72.         #fd = urllib.urlopen( "http://%s/web/getservices" % self.ip )
  73.         #print "http://%s/web/getservices" % self.ip
  74.         #dom = xml.dom.minidom.parse( fd )
  75.         #for element in obtain_services( dom ):
  76.         #   print "Element: %s" % element
  77.         #   bouquet = obtain_service( element )
  78.         #   bouquets[ unicode( bouquet[ 1 ] ).replace( ' ', '_' ).replace( ',', ':' ) ] = self.get_services( bouquet[ 0 ] )
  79.         #services[ 'TV' ] = self.get_services( '1:7:1:0:0:0:0:0:0:0:(type == 1) || (type == 17) || (type == 195) || (type == 25) ORDER BY name' )
  80.         services[ 'TV' ] = self.get_services( self.bouquet )
  81.         #services[ 'radio' ] = self.get_services( '1:7:2:0:0:0:0:0:0:0:(type == 2) ORDER BY name' )
  82.         return services, bouquets
  83.  
  84.     def get_services( self, key ):
  85.         return services2( self.ip, key )
  86.  
  87.     def stream_info( self ):
  88.         url = 'http://%s/web/subservices' % ( self.ip )
  89.         fd = urllib.urlopen( url )
  90.         service = obtain_service( xml.dom.minidom.parse( fd ) )
  91.         result = { }
  92.         result[ 'Service reference' ] = service[ 0 ]
  93.         result[ 'Name' ] = service[ 1 ]
  94.         return result
  95.  
  96.     def url( self, client ):
  97.         """Request current channel url"""
  98.         info = self.stream_info( )
  99.         if info[ 'Service reference' ].find( '1:0:0:0:0:0:0:0:0:0:' ) == -1:
  100.             client.write( "http://%s:8001/%s" % ( self.ip, info[ 'Service reference' ] ) )
  101.         else:
  102.             client.write( "http://%s/file?file=%s" % ( self.ip, urllib.quote( info[ 'Service reference' ][ 20 : ] ) ) )
  103.         return bt.SUCCESS
  104.  
  105.     def movies( self, client ):
  106.         """Request recorded movie list"""
  107.         url = 'http://%s/web/movielist' % self.ip
  108.         fd = urllib.urlopen( url )
  109.         for movie in obtain_movies( xml.dom.minidom.parse( fd ) ):
  110.             title = obtain_title( movie )
  111.             client.write( "%s, %s" % ( title[ 0 ], title[ 1 ] ) )
  112.         return bt.SUCCESS
  113.  
  114. sat_host = 'vuduo.local'
  115. sat_port = '8001'
  116. dir_name = 'm3u'
  117. av_host = 'Andromeda.local'
  118. av_port = '57740'
  119. my_bouquet = '1:7:1:0:0:0:0:0:0:0:FROM BOUQUET "userbouquet.dbe01.tv"'
  120. obj = enigma2 (sat_host, my_bouquet)
  121.  
  122. if obj is not None:
  123.     services, bouquets = obj.populate()
  124.     for service in services[ 'TV' ].sorted:
  125.         print "Service ref: %s   name: %s" % (service[0], service[1][0])
  126.         filename = unicode( service[1][0] ).replace( ' ', '_' ).replace( ',', ':' ).replace( '/', ':' )
  127.         if filename != "<n/a>":
  128.             f = open('%s/%s.m3u' % (dir_name, filename), 'w')
  129.             f.write('#EXTM3U\n')
  130.             f.write('#EXTINF:0,%s\n' % service[1][0])
  131.             f.write('http://%s:%s/stream?url=http://%s:%s/%s\n' % (av_host, av_port, sat_host, sat_port, service[0]))
  132.             f.close()
Add Comment
Please, Sign In to add comment