#!/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 = '/j_stream.ogg'
		self.shout.format = 'vorbis'
		self.shout.protocol = 'http'
		self.shout.open()
	def __call__(self, data) :
		self.ogg.bytesin(data)
		while 1:
				skipped, newpage = self.ogg.pageseek()
				if newpage == None :
					break
				if self.page == 0 :
				   	self.page = newpage
				   	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()
				self.shout.send(page.writeout())
				self.page=newpage
		return

def fillbuffer(f):
	read = f.read(4096)
	length=len(read)
	return (read,length)

def print_log(string):
	print time(),"\t:",string

def upcoming_show():
	return server.upcoming_show();

xmlrpcurl="http://localhost:8070"
val_url='http://meta.b.lab.net:9000/vcal/current.ics'

next_url='http://localhost/ogg/bios.ogg'
fallback_url='http://localhost/ogg/os.ogg'

so=shoutogg()
server = ServerProxy(xmlrpcurl)
f=urlopen(next_url)
ftotal = 0
timestamp=0
f_tmp=0

print_log("starting up oggstreamer.")
while 1 :
	while 1:
		length = 0
		while length == 0 :
			if timestamp < floor(time()):
				timestamp = floor(time())
				try:
					next_t = upcoming_show()
				except:
					print_log("XMLRPC Server did not respond: %s" % xmlrpcurl)
				else:
					(next_start, next_url) =  next_t
					if timestamp <= next_start <= ceil(time()):
						try:
							f_tmp = urlopen(next_url)
						except:
								print_log("could not open ogg stream: %s" % next_url)
						else:
							f.close()
							f=f_tmp
							f_tmp=0
			(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()
