adio la ottia!!!
Fecha de ingreso: 26/nov/2002
|
a ver drnemok es la ip en el channelguide, el contenido de ese archivo es este: (tiene que estar en la misma carpeta que el mytheatre.py, y solo tienes que poner tu ip donde esta en rojo, para que te cargue la lista de canales que es lo que te falla.
# Python XMLTV "listing.xml" TVGuide script by cruent 2004
# Version update 0.2: Added FTP support and sorted channels
# Version update 0.3: Added url support, init. dialog
import time, xbmcgui, xbmc
import sys, httplib, traceback
from urllib import urlretrieve
from re import search, DOTALL
from ftplib import FTP
from string import split, replace
from textwrap import fill
from os.path import getsize
from urlparse import urlparse
# WANT SORTED CHANNELS
sorted = "false"
# GET ACTIONCODES FROM KEYMAP.XML
ACTION_MOVE_LEFT = 1
ACTION_MOVE_RIGHT = 2
ACTION_MOVE_UP = 3
ACTION_MOVE_DOWN = 4
ACTION_SELECT_ITEM = 7
ACTION_PARENT_DIRECTORY = 9
ACTION_PREVIOUS_MENU = 10
# THE PATH TO IMAGES
background = "q:\\tvguide\\background.png"
timebar = "q:\\tvguide\\timebar.png"
blackbar = "q:\\tvguide\\blackbar.png"
titlebox = "q:\\tvguide\\titlebox.png"
descbox = "q:\\tvguide\\descbox.png"
# PATH TO LISTING XML FILE
listing = "q:\\tvguide\\listing.xml"
# URL to download the listing from
LIST_URL = "http://192.168.0.1:8080/xmltv/listing.xml"
# THE DATA LISTING
chanList = []
showList = {}
# THE CONTROL ID'S
theChans = []
theShows = []
theInfos = []
class CListing:
def DownloadList(self, url):
filename = listing
try:
html_size = self.getHTMLSize(url)
try:
file_size = getsize(listing)
print "local size is: ", file_size
except:
file_size = 0
print "getsize() failed: ", sys.exc_info()[0], sys.exc_info()[1]
traceback.print_exc(file=sys.stdout)
if not (html_size or file_size):
print "No listing available"
return ""
if not (html_size == file_size):
print "sizes differ: retrieving new listing..."
urllib.urlretrieve(url, filename)
else:
print "re-using listing"
file = open(filename, "r")
data = file.read()
file.close()
return data
except:
print "Download failed: ", sys.exc_info()[0], sys.exc_info()[1]
traceback.print_exc(file=sys.stdout)
def getHTMLSize(self, url):
try:
p = urlparse(url)
#print "=>", p[0], p[1], p[2], p[3]
h = httplib.HTTPConnection(p[1])
# switch back to http 1.0 to circumvent idna encoding which
# we don't have in the python libs on xbox
h._http_vsn = 10
h._http_vsn_str = 'HTTP/1.0'
h.request('HEAD', p[2])
res = h.getresponse()
size = int(res.getheader("Content-Length"))
h.close()
print "server size is: ", size
return size
except:
print "HTML size failed: ", sys.exc_info()[0], sys.exc_info()[1]
traceback.print_exc(file=sys.stdout)
return 0
def GetFile(self):
ip = " 192.168.2.3 " #MODIFY IP FOR YOUR NEEDS
port = "21" #MODIFY PORT FOR YOUR NEEDS
username = "xbox" #MODIFY USERNAME FOR YOUR NEEDS
password = "tvguide" #MODIFY PASSWORD FOR YOUR NEEDS
try:
fsize = getsize(listing)
except:
fsize = 0
upload = "yes"
try:
ftp = FTP()
ftp.connect(ip, port)
ftp.login(username,password)
files = []
ftp.dir(".",files.append)
for file in files:
temp = string.split(file, None, 8)
xml = string.lower(temp[8])
if(xml == 'listing.xml'):
if(int(fsize) == int(temp[4])):
upload = "no"
if(upload == "yes"):
print "upload"
ftp.retrbinary('RETR listing.XML', open(listing, 'wb').write)
ftp.quit()
except:
print "Failed to FTP listing.xml"
try:
file = open(listing,"r")
data = file.read()
file.close()
return data
except:
print "Failed to Open listing.xml"
return ""
def ProcessXML(self):
# select which of the two listing retrieval methods you prefer
#listing = self.GetFile()
listing = self.DownloadList(LIST_URL)
channels = split(listing, '
shows = split(listing, '
# STORE CHANNEL LIST
no_first = 1
for channel in channels:
if no_first != 1:
self.ParseXML(channel, 'id')
no_first = 0
# STORE SHOW LIST
no_first = 1
for show in shows:
if no_first != 1:
self.ParseXML(show, 'start')
no_first = 0
def ParseXML(self, line, tag):
if(tag == "id"):
self.id = 0
self.display = ""
channels = search('' + tag + '=".*', line, DOTALL)
try:
if channels.group(0):
id = search('' + tag + '="(.*?)"',channels.group(0))
try:
if id.group(1):
self.id = id.group(1)
except:
self.id = ""
display = search(' (.*?)',channels.group(0))
try:
if display.group(1):
self.display = display.group(1)
except:
self.display = "display error"
showList[self.id] = {}
chanList.append([self.id,self.display])
except:
return ""
if(tag == "start"):
self.starttime = 0
self.endtime = 0
self.id = ""
self.title = ""
self.desc_buffer = ""
self.duration = 0
starttime = search('start="(.*?)"', line)
try:
if starttime.group(1):
self.starttime = starttime.group(1)
except:
self.starttime = ""
channel = search('channel="(.*?)"', line)
try:
if channel.group(1):
self.id = channel.group(1)
except:
self.id = ""
endtime = search('stop="(.*?)"', line)
try:
if endtime.group(1):
self.endtime = endtime.group(1)
except:
self.endtime = ""
self.duration = self.CalculateDuration(self.starttime, self.endtime)
title = search(' (.*?)', line)
try:
if title.group(1):
self.title = title.group(1)
except:
self.title = "title error"
# sub = ""
# subtitle = search('(.*?)', line)
# try:
# if subtitle.group(1):
# sub = subtitle.group(1)
# self.desc_buffer = "%s%s\n" % (self.desc_buffer, sub)
# except:
# sub = ""
desc = ""
descrip = search('(.*?)', line)
try:
if descrip.group(1):
desc = descrip.group(1)
self.desc_buffer = "%s%s" % (self.desc_buffer, fill(desc,540/10))
except:
desc = ""
epnum = ""
episode = search('(.*?)', line)
try:
if episode.group(1):
epnum = episode.group(1)
self.desc_buffer = "%s (%s)" % (self.desc_buffer, epnum)
except:
epnum = ""
self.title = replace(self.title,'Æ','æ')
self.title = replace(self.title,'&','&')
self.desc_buffer = replace(self.desc_buffer,'Æ','æ')
self.desc_buffer = replace(self.desc_buffer,'&','&')
showList[self.id][self.starttime] = {'title' : self.title, 'description' : self.desc_buffer, 'duration' : self.duration}
def CalculateDuration(self, starttime, endtime):
if(starttime == "" or endtime == ""):
return 60
start = search('\d\d\d\d\d\d\d\d\d\d\d\d', starttime)
end = search('\d\d\d\d\d\d\d\d\d\d\d\d', endtime)
starting = time.strptime(start.group(0),"%Y%m%d%H%M")
ending = time.strptime(end.group(0),"%Y%m%d%H%M")
secs = 0
secs = time.mktime(ending) - time.mktime(starting)
return int(secs/60.0)
class CTVTime:
showtime = 0
def __init__(self, stime):
try:
start = search('\d\d\d\d\d\d\d\d\d\d\d\d', stime)
self.showtime = time.mktime(time.strptime(start.group(0),"%Y%m%d%H%M"))
except:
self.showtime = 0
def AddHalfHour(self, amount):
self.showtime += (1800 * amount) # ADDS 30MINS PER AMOUNT
def GetTimeBar(self):
time1 = self.showtime
time2 = self.showtime + (1800 * 1)
time3 = self.showtime + (1800 * 2)
asctime1 = time.asctime(time.localtime(time1))
asctime2 = time.asctime(time.localtime(time2))
asctime3 = time.asctime(time.localtime(time3))
timetitle1 = search('(\w+)\s(\w+)\s(\d+)\s(\d+:\d+)', asctime1)
timetitle2 = search('(\d+:\d+)', asctime2)
timetitle3 = search('(\d+:\d+)', asctime3)
timetitle = timetitle1.group(1)+" "+timetitle1.group(2)+" "+timetitle1.group(3)+" "+timetitle1.group(4)+" "+timetitle2.group(1)+" "+timetitle3.group(1)
return timetitle
def RoundDownHalfHour(self):
currenttime = time.localtime(self.showtime)
if(currenttime.tm_min < 30):
leftover = currenttime.tm_min * 60 + currenttime.tm_sec # SETS TM_MIN = 00
else:
leftover = currenttime.tm_min * 60 + currenttime.tm_sec - 1800 # SETS TM_MIN = 30
self.showtime = self.showtime - leftover
def SetToSystemTime(self):
self.showtime = time.mktime(time.localtime(time.time()))
def GetCurrentTime(self):
return int(self.showtime)
class CTVGuide(xbmcgui.Window):
def __init__(self):
self.processXML = CListing()
self.processXML.ProcessXML()
del self.processXML
self.currentTime = CTVTime(0)
self.currentTime.SetToSystemTime()
self.currentTime.RoundDownHalfHour()
screenx = self.getWidth()
screeny = self.getHeight()
# THE CHANNEL NUMBER
self.channum = 0
self.sortedchanList = []
for id, display in chanList:
self.sortedchanList.append(display)
if (sorted == "true"):
self.sortedchanList.sort()
# CONTROLS
self.theXOffset = 35
self.theYOffset= 55
self.font = 'font14'
self.fontcolor = '0xFFFFFFFF'
self.addControl(xbmcgui.ControlImage(0,0,screenx,screeny, background))
self.addControl(xbmcgui.ControlImage(self.theXOffset,25,125+(180*3),30,timebar))
self.strCaptionWday = xbmcgui.ControlLabel(self.theXOffset+3, 25+3, 200, 200, '', self.font, self.fontcolor )
self.strCaptionMon = xbmcgui.ControlLabel(self.theXOffset+3+40, 25+3, 200, 200, '', self.font, self.fontcolor )
self.strCaptionDay = xbmcgui.ControlLabel(self.theXOffset+3+40+40, 25+3, 200, 200, '', self.font, self.fontcolor )
self.strCaptionTime1 = xbmcgui.ControlLabel(self.theXOffset+3+125, 25+3, 200, 200, '', self.font, self.fontcolor )
self.strCaptionTime2 = xbmcgui.ControlLabel(self.theXOffset+3+125+180, 25+3, 200, 200, '', self.font, self.fontcolor )
self.strCaptionTime3 = xbmcgui.ControlLabel(self.theXOffset+3+125+180+180, 25+3, 200, 200, '', self.font, self.fontcolor )
self.addControl(self.strCaptionWday)
self.addControl(self.strCaptionMon)
self.addControl(self.strCaptionDay)
self.addControl(self.strCaptionTime1)
self.addControl(self.strCaptionTime2)
self.addControl(self.strCaptionTime3)
# OTHER CONTROLS / LABELS
self.UpdateTimeTitle()
self.CreateChannels()
self.CreateShows()
def UpdateTimeTitle(self):
current = self.currentTime.GetTimeBar()
title = search('(\w+)\s(\w+)\s(\d+)\s(\d+:\d+)\s(\d+:\d+)\s(\d+:\d+)', current)
self.strCaptionWday.setLabel(title.group(1))
self.strCaptionMon.setLabel(title.group(2))
self.strCaptionDay.setLabel(title.group(3))
self.strCaptionTime1.setLabel(title.group(4))
self.strCaptionTime2.setLabel(title.group(5))
self.strCaptionTime3.setLabel(title.group(6))
def CreateChannels(self):
self.ClearChannels()
y = self.theYOffset
print self.sortedchanList
for display in self.sortedchanList[0+self.channum:10+self.channum]:
theChans.append(xbmcgui.ControlImage(self.theXOffset, y, 125, 50, titlebox))
theChans.append(xbmcgui.ControlLabel(self.theXOffset+3, y+2, 125, 60, fill(display,125/10), self.font, self.fontcolor ))
y += 50
for theChan in theChans:
self.addControl(theChan)
def CreateShows(self):
self.ClearShows()
starttime = self.currentTime.GetCurrentTime()
endtime = starttime + (1800*3)
y = self.theYOffset
for display1 in self.sortedchanList[0+self.channum:10+self.channum]:
for channel, display2 in chanList:
if (display1 == display2):
xoffset = 160
showtimes = showList[channel].keys()
showtimes.sort()
for show in showtimes:
showstr = search('(\d\d\d\d\d\d\d\d\d\d\d\d)', show)
times = int(time.mktime(time.strptime(showstr.group(0),"%Y%m%d%H%M")))
if(times > endtime):
break
elif(times < starttime and times+(int(showList[channel][show]['duration'])*60) > starttime and times+(int(showList[channel][show]['duration'])*60) <= endtime):
total = ((((times+int(showList[channel][show]['duration'])*60-starttime)/60)*6)/10)
if (total < 1):
total = 1
title = fill(showList[channel][show]['title'],total)
title = title.split("\n")[0:2]
title = "\n".join(title)
theShows.append(xbmcgui.ControlImage((xoffset+((starttime-starttime)/60)*6), y, ((times+int(showList[channel][show]['duration'])*60-starttime)/60)*6, 50, titlebox))
theShows.append(xbmcgui.ControlImage((xoffset+((starttime-starttime)/60)*6)-2, y, 2, 50, blackbar))
theShows.append(xbmcgui.ControlImage((xoffset+((starttime-starttime)/60)*6)+(((times+int(showList[channel][show]['duration'])*60-starttime)/60)*6)-2, y, 2, 50, blackbar))
theShows.append(xbmcgui.ControlLabel((xoffset+((starttime-starttime)/60)*6)+3, y+2, 1, 60, title, self.font, self.fontcolor))
elif(times >= starttime and times+(int(showList[channel][show]['duration'])*60) <= endtime):
total = (((showList[channel][show]['duration'])*6)/10)
if (total < 1):
total = 1
title = fill(showList[channel][show]['title'],total)
title = title.split("\n")[0:2]
title = "\n".join(title)
theShows.append(xbmcgui.ControlImage((xoffset+((times-starttime)/60)*6), y, (showList[channel][show]['duration'])*6, 50, titlebox))
theShows.append(xbmcgui.ControlImage((xoffset+((times-starttime)/60)*6)-2, y, 2, 50, blackbar))
theShows.append(xbmcgui.ControlImage((xoffset+((times-starttime)/60)*6)+((showList[channel][show]['duration'])*6)-2, y, 2, 50, blackbar))
theShows.append(xbmcgui.ControlLabel((xoffset+((times-starttime)/60)*6)+3, y+2, 1, 60, title, self.font, self.fontcolor))
elif(times < endtime and times+(int(showList[channel][show]['duration'])*60) > endtime and times >= starttime):
total = ((((endtime-times)/60)*6)/10)
if (total < 1):
total = 1
title = fill(showList[channel][show]['title'],total)
title = title.split("\n")[0:2]
title = "\n".join(title)
theShows.append(xbmcgui.ControlImage((xoffset+((times-starttime)/60)*6), y, ((endtime-times)/60)*6, 50, titlebox))
theShows.append(xbmcgui.ControlImage((xoffset+((times-starttime)/60)*6)-2, y, 2, 50, blackbar))
theShows.append(xbmcgui.ControlImage((xoffset+((endtime-starttime)/60)*6)-2, y, 2, 50, blackbar))
theShows.append(xbmcgui.ControlLabel((xoffset+((times-starttime)/60)*6)+3, y+2, 1, 60, title, self.font, self.fontcolor))
break
elif(times < starttime and times+(int(showList[channel][show]['duration'])*60) > endtime):
total = ((((endtime-starttime)/60)*6)/10)
if (total < 1):
total = 1
title = fill(showList[channel][show]['title'],total)
title = title.split("\n")[0:2]
title = "\n".join(title)
theShows.append(xbmcgui.ControlImage((xoffset+((starttime-starttime)/60)*6), y, ((endtime-starttime)/60)*6, 50, titlebox))
theShows.append(xbmcgui.ControlImage((xoffset+((starttime-starttime)/60)*6)-2, y, 2, 50, blackbar))
theShows.append(xbmcgui.ControlImage((xoffset+((endtime-starttime)/60)*6)-2, y, 2, 50, blackbar))
theShows.append(xbmcgui.ControlLabel((xoffset+((starttime-starttime)/60)*6)+3, y+2, 1, 60, title, self.font, self.fontcolor))
break
else:
continue
y += 50
for theShow in theShows:
self.addControl(theShow)
def CreateInfo(self):
y = self.theYOffset
xoffset = 160
curtime = self.currentTime.GetCurrentTime()
for channel, display in chanList:
if (display == self.sortedchanList[self.channum]):
showtimes = showList[channel].keys()
showtimes.sort()
for show in showtimes:
showstr = search('(\d\d\d\d\d\d\d\d\d\d\d\d)', show)
times = int(time.mktime(time.strptime(showstr.group(0),"%Y%m%d%H%M")))
if(curtime >= times and curtime < times+(int(showList[channel][show]['duration'])*60)):
start = time.asctime(time.localtime(times))
times = times+(int(showList[channel][show]['duration'])*60)
end = time.asctime(time.localtime(times))
start = search('(\d+:\d+)', start)
end = search('(\d+:\d+)', end)
description = showList[channel][show]['description']
description = description.split("\n")[0:17]
description = "\n".join(description)
info = "%s\n%s - %s (%s min)\n%s" % (showList[channel][show]['title'], start.group(1), end.group(1), showList[channel][show]['duration'], description)
theInfos.append(xbmcgui.ControlImage(xoffset, y+50, 540, 450, descbox))
theInfos.append(xbmcgui.ControlImage(xoffset, y+50, 540, 450, descbox))
theInfos.append(xbmcgui.ControlImage(xoffset, y+50, 540, 450, descbox))
theInfos.append(xbmcgui.ControlImage(xoffset, y+50, 540, 450, descbox))
theInfos.append(xbmcgui.ControlLabel(xoffset+3, y+50+2, 540, 450, info, self.font, self.fontcolor ))
for theInfo in theInfos:
self.addControl(theInfo)
def ClearChannels(self):
for theChan in theChans:
self.removeControl(theChan)
while(len(theChans) != 0):
theChans.pop()
def ClearShows(self):
for theShow in theShows:
self.removeControl(theShow)
while(len(theShows) != 0):
theShows.pop()
def ClearInfos(self):
for theInfo in theInfos:
self.removeControl(theInfo)
while(len(theInfos) != 0):
theInfos.pop()
def onAction(self, action):
if action == ACTION_PREVIOUS_MENU:
self.close()
if action == ACTION_MOVE_LEFT:
xbmcgui.lock()
try:
self.ClearInfos()
except:
pass
try:
self.currentTime.AddHalfHour(-1)
self.UpdateTimeTitle()
self.CreateShows()
except:
pass
xbmcgui.unlock()
if action == ACTION_MOVE_RIGHT:
xbmcgui.lock()
try:
self.ClearInfos()
except:
pass
try:
self.currentTime.AddHalfHour(1)
self.UpdateTimeTitle()
self.CreateShows()
except:
pass
xbmcgui.unlock()
if action == ACTION_MOVE_UP:
xbmcgui.lock()
try:
self.ClearInfos()
except:
pass
try:
if self.channum > 0 and self.channum <= len(chanList)-1:
self.channum = self.channum - 1
self.CreateChannels()
self.CreateShows()
except:
pass
xbmcgui.unlock()
if action == ACTION_MOVE_DOWN:
xbmcgui.lock()
try:
self.ClearInfos()
except:
pass
try:
if self.channum >= 0 and self.channum < len(chanList)-1:
self.channum = self.channum + 1
self.CreateChannels()
self.CreateShows()
except:
pass
xbmcgui.unlock()
if action == ACTION_SELECT_ITEM:
xbmcgui.lock()
try:
self.CreateInfo()
except:
try:
self.ClearInfos()
except:
pass
xbmcgui.unlock()
if action == ACTION_PARENT_DIRECTORY:
xbmcgui.lock()
try:
self.ClearInfos()
except:
pass
try:
self.currentTime.SetToSystemTime()
self.currentTime.RoundDownHalfHour()
self.UpdateTimeTitle()
self.CreateShows()
except:
pass
xbmcgui.unlock()
# MAIN PROGRAM START HERE
dialog = xbmcgui.DialogProgress()
dialog.create("TVguide", "Initializing...", "Please wait.")
tvguide = CTVGuide()
dialog.close()
tvguide.doModal()
del tvguide
|