#!/usr/bin/env python
# -*- coding=UTF-8 -*-
# * This program is free software. It comes without any warranty, to
# * the extent permitted by applicable law. You can redistribute it
# * and/or modify it under the terms of the Do What The Fuck You Want
# * To Public License, Version 2, as published by Sam Hocevar. See
# * http://sam.zoy.org/wtfpl/COPYING for more details. */ 
 
import os, sys, cookielib, urllib2, time, random
versio="0.9"

username=""
password=""
videoplayer="vlc --sub-language Suomi --deinterlace-mode x"

searchwords=['Smallville', 'Simpsonit', 'Elokuva']
doUpdateCheck=True

downloaddirectory=""

paranoiaMode=False
dorecording=False
doSingleRecording=False
recordIDList=[]
configfile = os.path.expanduser("~")+"/"+".saunavisio.conf"

searchShowNew=searchShowRecorded=searchShowRequested=True

# Lukee asetukset käyttäjän kotihakemistosta tiedostosta '.saunavisio.conf', 
# jos tiedosto ei ole olemassa käytetään tietoja yllä!


def checkForUpdate(doUpgrade=False):
	global doUpdateCheck
	
	# Jos päivitysten tarkistus on kytketty pois päältä ja käskyä "päivitä" ei ole annettu: ei tehdä mitään
	if (doUpdateCheck==False and doUpgrade==False):
		return
	
	try:
		updateAvailable=False
		uurl="http://kapsi.fi/ighea/saunavisio/"
		data = urllib2.urlopen(uurl+"/latest").read()
		latest, filu = data.split(" ")
		latest=float(latest)
		current=float(versio)
		latestFileUrl=uurl+"/"+filu
	except:
		if (doUpgrade):
			print "*** Tietoja uusimmasta versioista ei voitu ladata! ***\n"
			print "*** Yritä myöhemmin uudelleen! ***\n"
		return

	if (latest>current):
		if (doUpgrade==True):
			try:
				print "\n*** Uusi versio "+str(latest)+" saatavilla! ***"
				print "\n*** Nykyinen versio: "+ str(current)+""
				print ""
				vastaus=raw_input( "*** Haluatko päivittää sovelluksen nyt? [K/E Kyllä/Ei]: ")
				if (vastaus != "K" and vastaus != "Kyllä" and vastaus != "k"):
					print "\n*** Päivittäminen keskeytettiin! ***\n"
				else:
					print "\n>>> Aloitetaan päivitys..."
					print "<<< Ladataan tiedosto '"+latestFileUrl+"'..."
					newdata=urllib2.urlopen(latestFileUrl).read()
					print ">>> Päivitetään tiedosto '"+sys.argv[0]+"'..."
					nfile = open(sys.argv[0],"w")
					nfile.write(newdata)
					nfile.flush()
					nfile.close()
					print "\n*** Päivitys suoritettu! ***"
					print ">>> Tietoa muutoksista ja sovelluksen käytöstä löydät osoitteesta:"
					print ">>> "+uurl+"LUEMINUT.txt\n"
					sys.exit()
			except IOError:
				print "*** Päivitys epäonnistui! ****"
				print "*** Tarkista, että sinulla on kirjoitusoikeudet tiedostoon:"
				print ">>> "+sys.argv[0]+""
			sys.exit()	
		else:
			updateAvailable=True
			print "\n*** Uusi versio "+str(latest)+" on saatavilla! ***\n"	
			print ">>> Tietoa muutoksista ja sovelluksen käytöstä löydät osoitteesta:"
			print ">>> "+uurl+"LUEMINUT.txt"
			print "\n>>> Voit ladata päivityksen käsin osoitteesta:"
			print ">>> "+latestFileUrl+""
			print ">>> tai automaattisesti suorittamalla komennon: "
			print ">>> '"+sys.argv[0]+" päivitä'"
	elif (doUpgrade==True):
		print "\n*** Päivitystä ei ole saatavilla! ***\n"
		sys.exit()
	return

def loadSettings():
	global username, password, videoplayer, searchwords, doUpdateCheck, downloaddirectory
	#print configfile
	un=pw=vp=dd=""
	sw=[]
	if (os.path.exists(configfile)):
		#print "Asetustiedosto löytyi"
		try:
			cfile = open(configfile,"r")
			cdata = cfile.read()
			clines = cdata.splitlines()
			for line in clines:
				## Kommentit sivuutetaan:
				if (line.startswith("#") == False):
					if (line.find("username") != -1):
						un=getValue(line,"username")
					if (line.find('doupdatecheck=') != -1):
						duc=getValue(line,"doupdatecheck")
						if (duc=="True"):
							doUpdateCheck=True
						elif (duc=="False"):
							doUpdateCheck=False
						else:
							print "*** Asetustiedoston arvo 'doupdatecheck' puuttuu tai on virheellisesti asetettu!"
					if (line.find("password") != -1):
						pw=getValue(line,"password")
					if (line.find("videoplayer") != -1):
						vp=getValue(line,"videoplayer")
					if (line.find("downloaddirectory") != -1):
						dd=getValue(line,"downloaddirectory")
					if (line.find("searchwords") != -1):
						swt=getValue(line,"searchwords","=[","]")
						# Oikein ruma merkistökorjaus
						swt = swt.replace('\\\\xf6','ö')
						swt = swt.replace('\\\\xe4','ä')
						# ja entistä vielä asteen rumempi merkistökorjaus
						swt = swt.replace('\\xc3\\xb6','ö')
						swt = swt.replace('\\xc3\\xa4','ä')
						swt = swt.replace('\\xc3\\xa5','å')
						swt = swt.replace('\\xc3\\x85','Å')
						swt = swt.replace('\\xc3\\x96','Ö')
						swt = swt.replace('\\xc3\\x84','Ä')
						#print swt
						swt=swt.split(",")
						#print swt
						for item in swt:
							sw.append(item.strip()[1:-1])
			cfile.close()


			# Tehdään pieni korjaus downloaddirectory:yn, lisätään loppuun hakemistopolkuerotin
			if ((len(dd)>0)):
				if (dd[len(dd)-1] != os.sep):
					dd+=os.sep
				if (dd != "" or os.path.exists(dd) == False):
					print "!!! Hakemistopolku '"+downloaddirectory+"' ei ole olemassa! !!!"
			
			# Asetetaan luetut arvot paikoilleen
			username,password,searchwords,videoplayer,downloaddirectory=un,pw,sw,vp,dd
		except IOError:
			print "\n*** Asetustiedoston '"+configfile+"' lukemisessa tapahtui virhe!"
			print "*** Tarkista, että tiedostoon on ainakin lukuoikeudet!\n"
	
	
	#print un,pw,sw,vp
	#print username,password,searchwords,videoplayer
	#sys.exit()

def saveSettings():
	global configfile
	fpath = sys.argv[0]
	
	if (os.path.exists(configfile)):
		## Asetustiedosto on olemassa, joten tallennetaan muutokset siihen
		try:
			cfile = open(configfile,"r")
			clines = cfile.readlines()
			cfile.close()
			cfile = open(configfile,"w")
			for line in clines:
				if (line.startswith('videoplayer="') and line.endswith('"\n')):
					cfile.write('videoplayer="'+str(videoplayer)+'"\n')
				elif (line.startswith("searchwords=[") and line.endswith("]\n")):
					cfile.write('searchwords='+str(searchwords)+"\n")
				elif (line.startswith('username="') and line.endswith('"\n')):
					cfile.write('username="'+str(username)+'"\n')
				elif (line.startswith('password="') and line.endswith('"\n')):
					cfile.write('password="'+str(password)+'"\n')
				elif (line.startswith('downloaddirectory="') and line.endswith('"\n')):
					cfile.write('downloaddirectory="'+str(downloaddirectory)+'"\n')
				elif (line.startswith('doupdatecheck="') and line.endswith('"\n')):
					cfile.write('doupdatecheck="'+str(doUpdateCheck)+'"\n')
				else:
					cfile.write(line)
			cfile.flush()
			cfile.close()
		
		except IOError:
			print "Tiedostoa '"+configfile+"' kirjoittaessa tai luettaessa tapahtui virhe!\n"
	
	else:	
		## Asetustiedosto puuttuu, joten tallennetaan asetukset tähän tiedostoon:
		# Luetaan tiedosto
		try:
			f = open(fpath,"r")
			fdata = f.readlines()
			f.close()
		except:
			f.close()
			print "\n*** Asetuksia ei voitu lukea!\n"
			return False

		# Kirjoitetaan tiedosto muutoksineen levylle
		try:
			f=open(fpath,"w")	
			for line in fdata:
				if (line.startswith('videoplayer="') and line.endswith('"\n')):
					f.write('videoplayer="'+str(videoplayer)+'"\n')
				elif (line.startswith("searchwords=[") and line.endswith("]\n")):
					f.write('searchwords='+str(searchwords)+"\n")
				else:
					f.write(line)
			f.flush()
			f.close()
		except:
			f.close()
			print "\n*** Asetuksien tallentaminen epäonnistui!\n"
			return False
		
	return True
	
	

def delSearchWord(line):
	try:
		searchwords.remove(line)
		saveSettings()
	except:
		print "*** Poistettavaa termiä '"+line+"' ei löytynyt!\n"
				
			
def checkUsernameAndPassword():
	if (username=="" or password==""):
		print "\n*** SaunaVisio aputyökalun käyttöönotto: \n"
		print "*** Ennen kuin jatkat tutustu tiedostoon:"
		print "*** http://kapsi.fi/ighea/saunavisio/LUEMINUT.txt\n"
	
		print ">>> Käyttäjätunnus (username) ja/tai salasana (password) on asettamatta! <<<"
		
		print "*** Luultavasti asetustiedostoa '"+configfile+"' ei ole olemassa.\n"
		
		vastaus=raw_input( "*** Haluatko luoda asetustiedostopohjan nyt? [K/E Kyllä/Ei]: ")
		if (vastaus != "K" and vastaus != "Kyllä" and vastaus != "k"):
			print "\n*** Asetustiedostoa ei luotu!\n"
		else:
			try:
				cfile=open(configfile,"w")
				cfile.write("# SaunaVisio aputyökalun (v"+versio+") asetustiedosto\n###\n\n")
				cfile.write('username="saunavisionkäyttäjätunnus"\n')
				cfile.write('password="saunavisionsalasana"\n')
				cfile.write("searchwords=['Simpsonit', 'Elokuva', 'South Park']\n")
				cfile.write('videoplayer="vlc --sub-language Suomi --deinterlace-mode x"\n')
				cfile.write('doupdatecheck="True"\n')
				cfile.write("\n###\n")
				cfile.close()
				print "\n*** Asetustiedostopohja luotu onnistuneesti! ("+configfile+") ***"
				print "*** Aloita sovelluksen käyttö muokkaamalla asetustiedosto mieleiseksesi! ***\n"
			except IOError:
				print "\n<<< Tiedostoon '"+configfile+"' ei voitu kirjoittaa! >>>\n"
		
		sys.exit()


def openURL(url, cookieJar=cookielib.CookieJar(), userAgent="Mozilla/5.0 (X11; U; Linux i686; fi-FI; rv:1.9) Gecko/2008052912 Firefox/3.0"):
	request = urllib2.Request(url)
	request.add_header('User-Agent', userAgent)  
	opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookieJar))

	cFile = opener.open(request)
	data = cFile.read()
	cFile.close()
	
	failmsg="Kirjautuminen epäonnistui. Tarkista tunnus ja/tai salasana."
	if (data.find(failmsg) != -1):
		print "\n\n>>*** "+failmsg+" ****<<\n\n"
		sys.exit()
		
	return data


def getValue(merkkijono, muuttuja,erotina='="',erotinb='"'):
	spos = merkkijono.find(muuttuja)
	if (spos == -1):
		return "NotFound"
	spos = spos+len(muuttuja)+len(erotina)
	
	epos = merkkijono.find(erotinb,spos)
	tulos=merkkijono[spos:epos]
	return tulos


def parseProgramData(line):
	if (line.find('href="') != -1):
		programid=getValue(line,"href")[len("program.sl?programid="):]
	else:
		programid=getValue(line,"name")[1:]
	programname=getValue(line,'">','',"</a>")
	#print programid+": "+programname
	return (programid,programname)

def setToBeRecord(programid, cookieJar):
	data = openURL("http://www.saunavisio.fi/tvrecorder/program.sl?record="+programid,cookieJar)


def printSearchList():
	items=""
	for item in searchwords:
		if (searchwords[len(searchwords)-1]==item):
			items = items + item
		else:	
			items = items + item+", "
	print "*** Ohjelmien hakusanalista: "+items+"\n"

	
def fetchDownloadUrl(id,verbose=True, cookiejar=cookielib.CookieJar() ):
	global downloaddirectory
	# CookieJar

	# Login
	openURL("http://www.saunavisio.fi/tvrecorder/index.sl?username="+username+"&password="+password, cookiejar)
	
	# Fetch data
	data = openURL("http://www.saunavisio.fi/tvrecorder/program.sl?programid="+id+"&view=true", cookiejar)

	programn = getValue(data,"<b>Ohjelma</b>:",'','<br/>').strip()
	
	if (programn == "NotFound"):
		print "\n*** Tallennetta ohjelmatunnuksella "+id+" ei löytynyt! ****\n\n"
		sys.exit()
	
	programdate = getValue(data,"<b>Aika</b>:",'','<br/>').strip()
	programtime = getValue(data,"<b>Kesto</b>:",'','<br/>').strip()
	durl=getValue(data,"doGo('","","');")
	pinfo=getValue(data,"<p>",'',"</p>")
	wgetcmd='wget "'+durl+'" -O "'+downloaddirectory+''+programn+' - '+programdate+' ('+programtime+').ts"'	
	if (verbose):
		print ">>> "+programn+" - "+programtime+" - "+programdate+"\n"

		print pinfo+"\n"

		print ">>> Latausosoite:\n"
		print durl+"\n"

		print ">>> Suora komenta wget-ohjelmalle tallenteen lataamiseksi:\n"
		print wgetcmd+"\n"

	return (durl, id.strip(), programn, programdate,programtime, wgetcmd, pinfo)
	
def playRecord(videoplayer,id):
	print "Aloitetaan toisto ohjelmatunnuksella "+id+" käyttäen videosoitinta "+videoplayer
	url, id, programn, programdate,programtime, wgetcmd, pinfo = fetchDownloadUrl(id, False)
	os.system(videoplayer+' "'+url+'" &')
	print "Valmis."

def beginDownload(downloadInfo):
	durl, id, programn, programdate,programtime, wgetcmd, pinfo = downloadInfo
	print "Aloitetaan tallenteen '"+programn+"' ("+programdate+") lataus:"
	os.system(wgetcmd+"" )
	print "Valmis."


def doIdle(mintime=1,maxtime=60,notice=False):
	rtime=random.randint(mintime,maxtime)
	if (notice):
		print "*** Odotellaan "+str(rtime)+" sekuntia... ***"
	time.sleep(rtime)
	return
	
	
def cancelRecordingRequest(IDList, cookiejar):
	showProgramInfo=True
	if (len(IDList)>1):
		showProgramInfo=False	
		print "*** Peruttavien ohjelmien ohjelmatunnuksia enemmän kuin yksi, lisätietoja ei näytetä!"
	for ID in IDList:
		print "\n*** Perutaan tallennuspyyntö ohjelmatunnukselle: "+ID
		durl, ID, programn, programdate, programtime, wgetcmd, pinfo = fetchDownloadUrl(ID, False, cookiejar)
		
		if (showProgramInfo):
			print ">>> Ohjelma: "+programn
			print ">>> Kesto: "+programtime
			print ">>> Ajankohta: "+programdate
			print "\n>>> Kuvaus:\n"+pinfo+"\n"

		# Nyppäistään sivulta ohjelmasta lisädataa
		data = openURL("http://www.saunavisio.fi/tvrecorder/program.sl?programid="+ID, cookiejar)
		#print data
		if (data.find('<a href="program.sl?programid='+ID+'&remover=') != -1):
			# Suoritetaan varsinainen tallennuspyynnön peruminen:	
			#<a href="program.sl?programid=212694&remover=592564">
			rmID=getValue(data,"&remover","=",'">')
			openURL("http://www.saunavisio.fi/tvrecorder/program.sl?programid="+ID+'&remover='+rmID, cookiejar)	
			print "\n*** Tallennuspyyntö peruttu! ***\n"
		elif (data.find('<a href="program.sl?programid='+ID+'&removep=') != -1):
			print "\n*** Kohteen tallennus on jo suoritettu, pyyntöä ei voida perua! ***\n"
		else:
			print "\n*** Kohdetta ei ole merkitty tallennettavaksi! ***\n"

	print "*** Valmis! ***\n"
	sys.exit()
	
	
def printUsage():
	print "Käyttö:"
	print " hakusanat          - Tulostaa nykyiset hakusanat ruudulle"
	print " lisää [sana]       - Lisää hakusanan listaan"
	print " poista [sana]      - Poistaa hakusanan listalta, jos olemassa"
	print " listaa             - Näyttää nykyisiä hakusanoja vastaavat ohjelmat."
	print " tallenna [IDt]     - Asettaa ohjelmat tunnuksilla [IDt] tallennettavaksi"
	print " tallenna           - Asettaa tallennukset hakusanojen perusteella"
	print " crontallenna       - Sama kuin yllä, mutta odottaa sivupyyntöjen välillä 1-60s."
	print " peruuta [IDt]      - Peruu tallenteille [IDt] asetetun tallennuspyynnöt"
	print " hae [vipu] [haku1] - Etsi ohjelmia ja tallenteita. [vipu] voi olla joko --uusi,"
	print "                      --tallennettu tai --pyyntö eli --u, --t tai --p."
	print " päivitä            - Pyrkii päivittämään sovelluksen uusimpaan versioon"
	print " tiedot [ID]        - Palauttaa ohjelman tiedot ja osoitteen videon lataamiseksi"
	print " lataa [ID]         - Aloittaa tallenteen lataamisen sovelluksella wget"
	print " toista [ID]        - Aloita tallenteen katselu"
	print " videosoitin [prog] - Aseta käytettävä videosoitin," 
	print "                      nykyinen: '"+videoplayer+"'"
	
	print "\n  F = Valmis tallennus\t R = Merkattu tallennettavaksi\t N = uusi ohjelma"
	print ""
	# Tulostetaan hakusanalista
	printSearchList()
	# ja tarkistetaan onko uutta versiota saatavissa
	checkForUpdate()
	# Lopuksi lopetetaan sovelluksen suoritus.
	sys.exit()
	# Done

####################################################################

print "\n>>> SaunaVisio aputyökalu v"+versio+" <<<\n"
print "*** Purkannut Mika Hynnä <mika.hynna@wippies.com> ***\n"
print "*** Lisensoitu WTFPL:n alaisena, lisätietoja osoitteesta:"
print "*** http://sam.zoy.org/wtfpl/COPYING\n"

# Alustetaan satunnaislukugeneraattori
random.seed()

loadSettings()
checkUsernameAndPassword()

# Luodaan cookieJar
cookieJar = cookielib.CookieJar()
# opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))

if (len(sys.argv) > 1):
	#"tallenna" ilman lisäparametrejä
	if (sys.argv[1] == "tallenna" and len(sys.argv)==2):
		dorecording=True
	#"tallenna" usealla ID:llä
	elif (sys.argv[1] == "tallenna" and len(sys.argv)>2):
		doSingleRecording=True
		for i in range(2,len(sys.argv)):
			recordIDList.append(sys.argv[i])
	# "crontallenna"
	elif sys.argv[1] == "crontallenna":
		dorecording=True
		paranoiaMode=True
	elif sys.argv[1] == "listaa":
		True
	elif sys.argv[1] == "päivitä" or sys.argv[1] == "paivita":
		checkForUpdate(doUpgrade=True)
	elif sys.argv[1] == "hakusanat":
		printSearchList()
		sys.exit()
	elif (len(sys.argv) > 2):
		if (sys.argv[1] == "hae"):
			htmp=""
			searchwords=[]
			for i in range(2,len(sys.argv)):
				if (sys.argv[i].startswith("--")):
					searchShowNew=searchShowRecorded=searchShowRequested=False
			for i in range(2,len(sys.argv)):
				hs=sys.argv[i]
				if (hs=="--uusi" or hs=="--u"):
					searchShowNew=True
				elif (hs=="--tallennettu" or hs=="--t"):
					searchShowRecorded=True
				elif (hs=="--pyyntö" or hs=="--pyynto" or hs=="--p"):
					searchShowRequested=True
				else:
					searchwords.append(hs)
		elif (sys.argv[1] == "lisää" or sys.argv[1] == "lisaa"):
			# Lisää hakusana
			print "<<< Lisätään hakusana: "+sys.argv[2]+"\n"
			searchwords.append(sys.argv[2])
			saveSettings()
			printSearchList()
			sys.exit()
		elif (sys.argv[1] == "poista"):
			print ">>> Poistetaan hakusana: "+sys.argv[2]+"\n"
			delSearchWord(sys.argv[2])
			printSearchList()
			sys.exit()
		elif (sys.argv[1] == "tiedot"):
			fetchDownloadUrl(sys.argv[2])
			sys.exit()
		elif (sys.argv[1] == "lataa"):
			beginDownload(fetchDownloadUrl(sys.argv[2]) )
			sys.exit()
		elif (sys.argv[1] == "toista"):
			playRecord(videoplayer, sys.argv[2])
			sys.exit()
		elif (sys.argv[1] == "peruuta"):
			IDList=[]
			for i in range(2,len(sys.argv)):
				IDList.append(sys.argv[i])
			cancelRecordingRequest(IDList, cookieJar)
			sys.exit()
		elif (sys.argv[1] == "videosoitin"):
			# Asetetaan videosoitin
			videoplayer=sys.argv[2]
			saveSettings()
			print "Uusi videosoitin asetettu: "+videoplayer
			sys.exit()
		else:
			## Jos komentoriviparametrejä ei annettu, tulostetaan käyttöohje
			printUsage()
	else:
		printUsage()
else:
	printUsage()

	
## Kirjaudutaan sisään SaunaVision hallintasivustoon
## ...jos voidaan ;)
data = openURL("http://www.saunavisio.fi/tvrecorder/index.sl?username="+username+"&password="+password, cookieJar)
#print str(data)


# Asetetaan yksittäinen ohjelma tallennettavaksi, käskytetty "tallenna [ID]"
if (doSingleRecording==True):
	for pID in recordIDList:
		print "\n*** Asetetaan yksittäinen ohjelma tallennettavaksi:"
		print "<<< Haetaan tietoja ohjelmatunnukselle: "+pID
		durl, ID, programn, programdate, programtime, wgetcmd, pinfo = fetchDownloadUrl(pID,verbose=False)
	
		#data = openURL("http://www.saunavisio.fi/tvrecorder/program.sl?programid="+pID)
		print ">>> Ohjelma: "+programn
		print ">>> Kesto: "+programtime
		print ">>> Ajankohta: "+programdate
		print "\n>>> Kuvaus:\n"+pinfo+"\n"
		# Suoritetaan varsinainen asettaminen:
		setToBeRecord(ID, cookieJar)
		print "\n*** Tallennus asetettu! ***\n"
	print "**** Valmis! ***\n"
	sys.exit()

# Tulostetaan hakusanalistaus
printSearchList()

##
## Aletaan suorittamaan hakusanoilla hakuja ja merkataan uudet ohjelmat tallennettaviksi, jos näin on haluttu
if (dorecording == True):
	print ">>> Asetetaan ohjelmia tallennettaviksi..."
else:
	print ">>> Suoritetaan hakua..."

ohjelmalista=[]
for hakusana in searchwords:

	# Vainoharhaisuus-moodi, odotellaan satunnaisaika sivukutsujen välissä
	if (paranoiaMode==True):
		doIdle()

	# Suorita hakusanalle haku:
	hakudata = openURL("http://www.saunavisio.fi/tvrecorder/search.sl?q="+hakusana, cookieJar)

	# Parsitaan hakutuloksesta ohjelmatiedot ja tallennetaan ne taulukkoon ohjelmalista
	programParserStarted=False
	hakutaulu = hakudata.splitlines()
	aika=kanava=ID=nimi=tila=""
	for line in hakutaulu:
		#1 aika
		#2 kanava
		#3 ohjelma
		if (programParserStarted==True):
			cL = cL + 1
			if (cL==1):
				aika=getValue(line,"<t","d>","</td>")
			if (cL==2):
				kanava=getValue(line,"<t","d>","</td>")
			if (cL==3):
				ID=getValue(line,'<td>','<a href="program.sl?programid=','"')
				nimi=getValue(line, '">','','</a>')
				if (line.find('class="') != -1):
					tila=getValue(line,"class")
					if tila=="notrecorded":
						tila="N" #Tallentamaton
					elif tila=="recorded":
						tila="R" #Merkattu tallennukseen
				else:
					tila="F" #Tallennettu
			# Ohjelma on "Löytynyt tuleva tallenne": ei lisätä listaa, koska esiintyisi kahdesti
			if (cL==4):
				if ( line.find('<td><input type="checkbox" name="remover" value="') != -1):
					programParserStarted=False
									
						
		if ( line.startswith('<tr class="') ):
			if (getValue(line,"class") == "odd" or getValue(line,"class") == "even" ):
				programParserStarted=True
				cL=0
		if ( line == "</tr>" and programParserStarted==True ):
			programParserStarted=False
			ohjelmalista.append([ID,kanava,aika,nimi,tila])
	# Ohjelmatietojen parsiminen päättyy

# Mitään ei löytynyt, ilmoitetaan asiasta ja päätetään sovelluksen suoritus
if (len(ohjelmalista)==0):
	print "\n*** Haulla ei löytynyt osumia! ****\n"
	sys.exit()

# Listataan hakutulos
print "ID\tKanava\t Ajankohta\t\tNimi"
for ohjelma in ohjelmalista:
	ID,kanava,aika,nimi,tila=ohjelma
	# Ollaan asettamassa uusia tallennuksia:
	if (dorecording == True):
		if (tila=="N"):
			# Vainoharhaisuus-moodi, odotellaan satunnaisaika sivukutsujen välissä
			if (paranoiaMode==True):
				doIdle()
			# Tulostellaan tiedot:
			print ID +"  "+ kanava +"  "+ aika +" \t"+ nimi +"  - N=>R"
			# Asetetaan tallennettavaksi:
			setToBeRecord(ID, cookieJar)
	else:
		if (tila=="N" and searchShowNew==True or tila=="F" and searchShowRecorded==True or tila=="R" and searchShowRequested==True):
			print ID +"  "+ kanava +"  "+ aika +" \t"+ nimi +"  - "+ tila

if (dorecording == False):
	checkForUpdate()
print "\n"

