#!/usr/bin/env python
#
# part of
# re.codec is not a real codec
#
# stream_recorder - records an ogg stream from and icecast server
#										saves the files into one hour chunks.
#
# (c) 2004 <j@reboot.fm>
#
import os
from os.path import join
import string
from time import *
from math import *
from sys import exit,stdout
from ogg import OggSyncState, vorbis
from types import NoneType
from urllib2 import urlopen


class backupogg :
	def __init__(self) :
		self.ogg = OggSyncState()
		self.page = 0
		self.serial = 1
		# now some urls
		self.url=None
		self.switched=0
		self.record_base=""
		self.stream=""
		self.record=None
		
	def __call__(self, data) :
		self.ogg.bytesin(data)
		while 1:
			newpage = self.ogg.pageseek()
			if newpage == None : 
				if int(strftime("%M"))  == 0:
					print "trying to switch %s" % self.switched
					if self.switched!=1:
						# switching the file
						self.record_file="%s.ogg" % strftime("%Y-%m-%d_%H.%M.%S")
						self.record.close()
						self.record=file(join(self.record_base,self.record_file),'w')
						
						# reconnecting to server (how to skip that?, must be a way)
						# some sort of write_ogg_headers() funktion that writes the
						# initial headers
						# they are updated with update_ogg_headers() once the headers change(comments,..)
						# 
						self.url.close()
						self.url=urlopen(self.stream)
						# resetting the ogg,page,serial variables. (is needed)
						self.ogg = OggSyncState()
						self.page = 0
						self.serial = 1
						
						print_log("switching to next file: %s" % self.record_file)
						self.switched=1
				else:
					self.switched=0
				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
			out=self.page.header+self.page.body
			self.record.write(out)
			self.page=newpage
		return

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

bo=backupogg()

#bo.stream="http://212.42.235.122:8000/studioA.ogg"
bo.stream="http://10.0.0.5:8000/studioA.ogg"

#bo.record_base="/data/recording/studioA/"
bo.record_base="/tmp/ogg"
bo.record_file="%s.ogg" % strftime("%Y-%m-%d_%H.%M.%S")
bo.record=file(join(bo.record_base,bo.record_file),'w')


while 1 :
	try:
		bo.url=urlopen(bo.stream)
	except:
		print_log("could not open %s" % bo.stream)
		sleep(5)
		continue
	print_log("restarted and connected to %s" % bo.stream)
	while 1:
		read = bo.url.read(4096)
		length=len(read)
		if length == 0 :
			bo.url.close()
			print_log("reconnect to icecast server")
			break
		bo(read)
	bo.url.close()
