#!/usr/bin/python

import os
import string
from time import *
from sys import exit
from ogg import OggSyncState, vorbis
from shout import Shout
from types import NoneType
from urllib2 import urlopen
from xmlrpclib import ServerProxy
from math import *

class shoutogg :
   def __init__(self) :
	  self.ogg = OggSyncState()
	  self.page = 0
	  self.serial = 1
	  self.shout = Shout()
	  self.shout.host = '127.0.0.1'
	  self.shout.port = 8000
	  self.shout.user = 'source'
	  self.shout.password = 'hack4me'
	  self.shout.mount = '/global-hifi.ogg'
	  self.shout.format = 'vorbis'
	  self.shout.protocol = 'http'
	  self.shout.open()
   def __call__(self, data) :
		self.ogg.bytesin(data)
		while 1:
				newpage = self.ogg.pageseek()
				if newpage == None :
				   print 'No complete page(s) in buffer' 
				   break
				print '---------------------------pageno '+str(newpage.pageno)
				if self.page == 0 :
				   self.page = newpage
				   print '*** First Page - Continuing ***'
				   continue
				if self.page.serialno != newpage.serialno : self.page.eos = 1
				if newpage.pageno==0 : self.page.eos = 1
				self.page.serialno=self.serial
				if self.page.eos == 1 :
				   if self.serial<65536 : self.serial = self.serial + 1
				   else : self.serial = 0
				self.shout.sync()
				out=self.page.header+self.page.body
				self.shout.send(out)
				log.write(out)
				self.page=newpage
		return


def fillbuffer(f):
		read = f.read(4096)
		length=len(read)
		print 'read '+str(length)+' bytes at '+str(ftotal)
		return (read,length)




# Are these still needed?     ******************************
ftotal = 0
st = time()
log=file('log.ogg','w')
so=shoutogg()

server = ServerProxy("http://localhost:8070")
#server = ServerProxy("http://localhost/xmlrpcCGI.cgi")
next_url='http://localhost/ogg/asfd.ogg'
fallback_url='http://localhost/ogg/asfd.ogg'
f= urlopen(next_url)
timestamp=0
f_tmp=0

while 1 :
   while 1:
	  length = 0
	  while length == 0 :
		 if timestamp < floor(time()):
			timestamp = floor(time())
			try:
				next_t = server.upcoming_show()
			except:
				print "XMLRPC Server not respinding\n\n"
			else:
				(next_start, next_url) =  next_t
				if timestamp <= next_start <= ceil(time()):
				   try:
						f_tmp = urlopen(next_url)
				   except:
						print "could not open next ogg stream",f_tmp.geturl()
				   else:
						f.close()
						f=f_tmp
		 (read,length) = fillbuffer(f)
		 if length == 0:
		   f.close()
		   f= urlopen(fallback_url)
	  ftotal = ftotal + len(read)
	  so(read)
   print 'Track end, total %d bytes' % ftotal         
   f.close()
   ftotal = 0

log.close()
