Advertisement
mkv

babbys first python

mkv
Sep 3rd, 2012
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.76 KB | None | 0 0
  1. #!/usr/bin/python3
  2. from __future__ import generators
  3. import time
  4. import logging
  5. import html.parser
  6. import urllib.request
  7. from urllib.error import HTTPError
  8. from multiprocessing.dummy import Pool
  9. from MultiDict import OrderedMultiDict
  10. from functools import reduce
  11.  
  12. def get_listener_count(
  13.       server = 'http://stream0.r-a-d.io:1130',
  14.        mount = "/main.mp3",
  15.      timeout = None
  16.     ):
  17.     try:
  18.         request = urllib.request.Request(server, headers = {'User-Agent' : 'Mozilla'})
  19.         result = urllib.request.urlopen(request, timeout = timeout)
  20.     except:
  21.         logging.debug('HTTP access fault: ' + server_name);
  22.         #raise
  23.     else:
  24.         incoming = result.read().decode('utf8').split('\n')
  25.         parser = StatusParser()
  26.         for line in incoming:
  27.             parser.feed(line)
  28.         parser.close()
  29.         result = parser.result
  30.         if mount in result:
  31.             if 'Current Listeners' in result[mount]:
  32.                 listeners = int(result[mount]['Current Listeners'])
  33.                 return listeners
  34.         else:
  35.             logging.debug('Server does not have listener count: ' + server_name)
  36.             return -1
  37.     logging.debug('Failed to fetch  ' + server_name)
  38.     return -1
  39.  
  40.  
  41. class AsyncListeners(object):
  42.     relay_list = []
  43.     timeout = 10.0
  44.     def __init__(self, threads = 5):
  45.         super(AsyncListeners, self).__init__()
  46.         self.pool = Pool(threads)
  47.     def async_get_all_listener_count(self, timeout = 10.0):
  48.         result_list = []
  49.         counts, timer = 0, 0.0
  50.         for relay, mount in self.relay_list:
  51.             result_list.append(self.pool.apply_async(
  52.                 get_listener_count,
  53.                 kwds = {
  54.                     'server'  : relay,
  55.                     'timeout' : timeout,
  56.                     'mount'   : mount
  57.                 }))
  58.             #print(result_list)
  59.         while True:
  60.             if len(result_list) == 0:
  61.                 break
  62.             for result in result_list[:]:
  63.                 if result.ready():
  64.                     if result.successful():
  65.                         counts += result.get()
  66.                         result_list.remove(result)
  67.                         #print("LOL " + result)
  68.                     else:
  69.                         print("oh shit")
  70.                 #else:
  71.                     # nothing yet
  72.                     #print(result)
  73.             timer += 0.5
  74.             if timer > self.timeout:
  75.                 break
  76.             time.sleep(0.5)
  77.         return counts
  78.  
  79.  
  80. def get_status(icecast_server = 'http://stream0.r-a-d.io:1130/'):
  81.     try:
  82.         request = urllib.request.Request(icecast_server,
  83.             headers = { 'User-Agent' : 'Mozilla' })
  84.         result = urllib.request.urlopen(request)
  85.     except HTTPError as e:
  86.         if e.code == 403: #full server
  87.             logging.warning("Listener limit reached? " + icecast_server)
  88.             f = OrderedMultiDict()
  89.             f['Stream Title'] = 'r/a/dio'
  90.             f['Current Listeners'] = '500'
  91.             f['Current Song'] = 'py'
  92.             return { '/main.mp3' : f }
  93.         else:
  94.             logging.exception("HTTPError " + e.code + " in status fetch")
  95.     except:
  96.         logging.exception("Connection to status page failed")
  97.     else:
  98.         incoming = result.read().decode('iso_8859-1').split('\n')
  99.         parser = StatusParser()
  100.         for line in incoming:
  101.             parser.feed(line)
  102.         parser.close()
  103.         result = parser.result
  104. #       if '/main.mp3' in result:
  105. #           all_listeners = get_all_listener_count()
  106. #           total_count = reduce(lambda x,y:
  107. #               x+y if x > 0 and y > 0 else x,
  108. #               list(all_listeners.values()))
  109. #           result[config.icecast_mount]['Current Listeners'] = str(total_count)
  110.         return parser.result or {}
  111.     return {}
  112.  
  113.  
  114. class StatusParser(html.parser.HTMLParser):
  115.     def __init__(self):
  116.         html.parser.HTMLParser.__init__(self)
  117.         self._current_mount = None
  118.         self.result = {}
  119.         self._td = False
  120.         self._mount = False
  121.         self._enter = False
  122.     def handle_starttag(self, tag, attrs):
  123.         attrs = OrderedMultiDict(attrs)
  124.         if (tag == "td"):
  125.             self._td = Tag(attrs)
  126.             self._td['class'] = None
  127.         elif (tag == "h3") and (self._td):
  128.             self._mount = Tag(attrs)
  129.     def handle_endtag(self, tag):
  130.         if (tag == "td"):
  131.             self._td = None
  132.         elif (tag == "h3") and (self._td):
  133.             self._mount = None
  134.         elif (tag == "table") and (self._current_mount):
  135.             if (self._enter):
  136.                 self._enter = False
  137.             else:
  138.                 self._enter = True
  139.     def handle_data(self, data):
  140.         if (self._mount) and (self._td):
  141.             self._current_mount = data.split(" ")[2]
  142.             self.result[self._current_mount] = OrderedMultiDict()
  143.         elif (self._enter) and (self._td) and (self._current_mount):
  144.             if ("streamdata" in self._td.getall("class")):
  145.                 self.result[self._current_mount][self._type] = data
  146.             else:
  147.                 self._type = data[:-1]
  148.  
  149.  
  150. class Tag(object):
  151.     attr = OrderedMultiDict()
  152.     def __init__(self, attrs):
  153.         self.attr = attrs
  154.     def __getattr__(self, name):
  155.         return getattr(self.attr, name)
  156.     def __setitem__(self, name, value):
  157.         self.attr[name] = value
  158.  
  159.  
  160. print(" -!- running")
  161. print(get_listener_count())
  162.  
  163. n = AsyncListeners()
  164. n.relay_list = [
  165.     ('http://stream1.r-a-d.io:1130/','/radio.ogg'),
  166.     ('http://stream2.r-a-d.io:1130/','/relay.mp3'),
  167.     ('http://stream3.r-a-d.io:1130/','/relay.mp3')
  168. ]
  169. print(n.async_get_all_listener_count())
  170. print(" -!- finished")
  171.  
  172. st = get_status()
  173. print(st['/main.mp3']['Current Song'])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement