The branch, dharma has been updated
via 198edbbb63bcfb48c05811dadb6b5e0484199099 (commit)
from ece3404a712e21f7640f546d152492ec38c92656 (commit)
- Log -----------------------------------------------------------------
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/scripts;a=commit;h=198edbbb63bcfb48c05811dadb6b5e0484199099
commit 198edbbb63bcfb48c05811dadb6b5e0484199099
Author: amet <[email protected]>
Date: Fri Jan 28 15:50:13 2011 +0400
[script.tvrage.com] -v1.0.4
Extended airtime offset values in settings to +-23
Bug Fix (Hopefully =] ): Old shows staying at top of list
*** 1.0.3 ***
Fix: Error when failing to fetch data for show
diff --git a/script.tvrage.com/addon.xml b/script.tvrage.com/addon.xml
index 5be8a6e..46ec93a 100644
--- a/script.tvrage.com/addon.xml
+++ b/script.tvrage.com/addon.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="script.tvrage.com"
name="TVRage-Eps"
- version="1.0.2"
+ version="1.0.4"
provider-name="Rick Phillips (ruuk)">
<requires>
<import addon="xbmc.python" version="1.0"/>
diff --git a/script.tvrage.com/changelog.txt b/script.tvrage.com/changelog.txt
index 9cc5f55..60c2ce3 100644
--- a/script.tvrage.com/changelog.txt
+++ b/script.tvrage.com/changelog.txt
@@ -1,6 +1,15 @@
TVRage-Eps Changelog
-Current Version : 1.0.2
+Current Version : 1.0.4
+
+*** 1.0.4 ***
+
+Extended airtime offset values in settings to +-23
+Bug Fix (Hopefully =] ): Old shows staying at top of list
+
+*** 1.0.3 ***
+
+Fix: Error when failing to fetch data for show
*** 1.0.2 ***
diff --git a/script.tvrage.com/default.py b/script.tvrage.com/default.py
index 1af5c48..8097324 100644
--- a/script.tvrage.com/default.py
+++ b/script.tvrage.com/default.py
@@ -1,15 +1,15 @@
# -*- coding: utf-8 -*-
-import urllib
-import xbmc, xbmcgui, xbmcaddon
-import sys, os, time, re
-import elementtree.ElementTree as etree
+import xbmc, xbmcgui, xbmcaddon #@UnresolvedImport
+import sys, os, time, re, traceback
+import elementtree.ElementTree as etree #@UnresolvedImport
import jsonrpc
import difflib
+from tvrageapi import Episode, Show, TVRageAPI
__author__ = 'ruuk'
__url__ = 'http://code.google.com/p/tvragexbmc/'
-__date__ = '11-02-2010'
-__version__ = '1.0.2'
+__date__ = '1-26-2011'
+__version__ = '1.0.4'
__settings__ = xbmcaddon.Addon(id='script.tvrage.com')
__language__ = __settings__.getLocalizedString
@@ -44,200 +44,10 @@ ACTION_CONTEXT_MENU = 117
def LOG(msg):
xbmc.log(msg.encode('ascii','replace'))
-
-class Show:
- def __init__(self,showid='',xmltree=None,name=''):
- self.showid = showid
- self.name = name
- self._airtime = ''
- self.next = {}
- self.last = {}
- self.imagefile = os.path.join(THUMB_PATH,self.showid + '.jpg')
- self.nextUnix = 0
- self.status = ''
- self.canceled = ''
- self.lastEp = {'number':'?','title':'Unknown','date':''}
- self.nextEp = {'number':'?','title':'Unknown','date':''}
- if self.isDummy():
- self.tree = etree.fromstring('<show
id="0"><name>'+name+'</name></show>')
- if xmltree:
- self.tree = xmltree
- self.processTree(xmltree)
-
- def isDummy(self):
- return self.showid == '0'
-
- def getShowData(self):
- if self.isDummy(): return
- tree = API.getShowInfo(self.showid)
- self.processTree(tree)
- return self
-
- def processTree(self,show):
- sid = show.attrib.get('id',self.showid)
- #if no show id keep our data
- if not sid: return
- self.showid = sid
- self.tree = show
- self.imagefile = os.path.join(THUMB_PATH,self.showid + '.jpg')
- self.name = show.find('name').text
- if self.isDummy(): return
-
- try: self._airtime =
re.findall('\d+:\d\d\s\w\w',show.find('airtime').text)[0]
- except: pass
- if not self._airtime:
- try: self._airtime =
show.find('airtime').text.rsplit('at ',1)[-1]
- except: pass
-
- self.status = show.find('status').text
- if 'Ended' in self.status or 'Cancel' in self.status:
- ended = show.find('ended').text
- sc = '?'
- if ended:
- try: sc = time.strftime('%b %d
%Y',time.strptime(ended,'%Y-%m-%d'))
- except: pass
- if not sc:
- try: sc = time.strftime('%b
%Y',time.strptime(ended,'%Y-%m-00'))
- except: pass
- self.canceled = sc
-
- last = show.find('latestepisode')
- self.lastEp = self.epInfo(last)
-
- next = show.find('nextepisode')
- if next: self.nextEp = self.epInfo(next)
-
- if not os.path.exists(self.imagefile):
- try:
- iurl =
'http://images.tvrage.com/shows/'+str(int(self.showid[0:-3]) +
1)+'/'+self.showid + '.jpg'
- except:
- print "IMAGE ERROR - SHOWID: " + self.showid
- return
- saveURLToFile(iurl,self.imagefile)
-
- def airtime(self,offset=0):
- return time.strftime('%I:%M
%p',time.localtime(self.getNextUnix(offset=offset)))
-
- def epInfo(self,eptree):
- try: return
{'number':eptree.find('number').text,'title':eptree.find('title').text,'date':eptree.find('airdate').text}
- except: return
{'number':'?','title':'Unknown','date':'?'}
-
- def getSortValue(self):
- srt = self.getNextUnix(forceupdate=True)
- return str(srt) + '@' + self.name
-
- def getNextUnix(self,forceupdate=False,offset=0):
- if forceupdate or not self.nextUnix:
- try:
- struct = time.strptime(self.nextEp['date'] + '
' + self._airtime,'%Y-%m-%d %I:%M %p')
- srt = time.mktime(struct)
- except:
- srt = time.time()+60*60*24*365*10
- if self.canceled: srt += 3600
- elif self.isDummy(): srt += 3601
- self.nextUnix = srt
- return self.nextUnix + (offset * 3600)
-
- def xml(self):
- return etree.tostring(self.tree)
-
- """
- <link>http://www.tvrage.com/Futurama</link>
- <started>1999-03-28</started>
- <ended/>
- <country>USA</country>
- <classification>Animation</classification>
- <genres>
- <genre>Adult Cartoons</genre>
- <genre>Comedy</genre>
- <genre>Sci-Fi</genre>
- </genres>
- <runtime>30</runtime>
- <ended>1969-06-03</ended>
- """
-
-class Episode:
- _image_url_base = 'http://images.tvrage.com/screencaps/'
-
- def __init__(self,season,xmltree=None,showid=''):
- self.number = ''
- self.season = season
- self.prodnum = ''
- self.airdate = ''
- self.title = ''
- self.epnum = ''
- self.link = ''
- self.epid = ''
- self.showid = showid
- if xmltree:
- self.processTree(xmltree)
-
- def processTree(self,tree):
- self.title = tree.find('title').text
- self.number = tree.find('epnum').text
- self.epnum = tree.find('seasonnum').text
- self.airdate = tree.find('airdate').text
- self.prodnum = tree.find('prodnum').text
- self.link = tree.find('link').text
- self.epid = self.link.rsplit('/',1)[-1]
-
- def getEPxSEASON(self):
- return self.season + 'x' + self.epnum
-
- def getImageUrls(self):
- #This seems to work but...
- num = int(int(self.showid) / 200) + 1
- base = self._image_url_base + str(num) + '/' + self.showid +
'/' + self.epid
- return (base + '.jpg',base + '.png')
-
-class TVRageAPI:
- _search_url = 'http://services.tvrage.com/feeds/search.php?show='
- _info_url = 'http://services.tvrage.com/feeds/episodeinfo.php?sid='
- _eplist_url = 'http://services.tvrage.com/feeds/episode_list.php?sid='
-
- def getShowInfo(self,showid):
- url = self._info_url + str(showid)
- return self.getTree(url)
-
- def search(self,show):
- try:
- url = self._search_url +
urllib.quote_plus(show.encode('utf-8'))
- except:
- url = self._search_url + show.replace(' ','_')
- return self.getTree(url)
-
- def getEpList(self,showid):
- url = self._eplist_url + str(showid)
- return self.getTree(url)
-
- def getTree(self,url):
- xml = self.getURLData(url,readlines=False)
- xml = re.sub('&(?!amp;)','&',xml)
- try:
- return etree.fromstring(xml)
- except:
- LOG('TVRage-Eps: BAD XML data')
- return None
-
- def getEpSummary(self,url):
- html = self.getURLData(url,readlines=False)
- html = html.split('>Episode Summary</h')[-1]
- return re.findall('<br>(.*?)<br>',html,re.S)[0].strip()
-
- def getURLData(self,url,readlines=True):
- try:
- w = urllib.urlopen(url)
- except:
- return None
- try:
- if readlines: linedata = w.readlines()
- else: linedata = w.read()
- except:
- w.close()
- return None
- w.close()
- return linedata
+def ERROR(msg):
+ LOG(msg)
+ traceback.print_exc()
class SummaryDialog(xbmcgui.WindowXMLDialog):
def __init__( self, *args, **kwargs ):
@@ -253,7 +63,7 @@ class SummaryDialog(xbmcgui.WindowXMLDialog):
def onClick( self, controlId ):
pass
-
+
def onFocus( self, controlId ):
self.controlId = controlId
@@ -290,7 +100,7 @@ class EpListDialog(xbmcgui.WindowXMLDialog):
def onClick( self, controlId ):
pass
-
+
def onFocus( self, controlId ):
self.controlId = controlId
@@ -367,13 +177,13 @@ class TVRageEps(xbmcgui.WindowXML):
self.http_address = __settings__.getSetting('xbmc_http_address')
self.http_user = __settings__.getSetting('xbmc_http_user')
self.http_pass = __settings__.getSetting('xbmc_http_pass')
- air_offset = __settings__.getSetting('air_offset')
+ air_offset = __settings__.getSetting('airtime_offset')
self.skip_canceled = (__settings__.getSetting('skip_canceled')
== 'true')
self.reverse_sort = (__settings__.getSetting('reverse_sort') ==
'true')
self.jump_to_bottom =
(__settings__.getSetting('jump_to_bottom') == 'true')
self.ask_on_no_match =
(__settings__.getSetting('ask_on_no_match') == 'true')
self.hours = [1,2,3,4,5,6,12,24][int(hours)]
- self.air_offset =
[-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11,12][int(air_offset)]
+ self.air_offset =
[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,-23,-22,-21,-20,-19,-18,-17,-16,-15,-14,-13,-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1][int(air_offset)]
def isStale(self):
last = self.fileRead(self.lastUpdateFile)
@@ -385,7 +195,7 @@ class TVRageEps(xbmcgui.WindowXML):
def onClick( self, controlId ):
pass
-
+
def onFocus( self, controlId ):
self.controlId = controlId
@@ -395,19 +205,6 @@ class TVRageEps(xbmcgui.WindowXML):
self.saveData()
self.updateDisplay()
- def addShow(self,sid):
- pdialog = xbmcgui.DialogProgress()
- pdialog.create(__language__(30016))
- pdialog.update(0)
- for s in self.shows:
- if s.showid == sid:
- pdialog.close()
-
xbmcgui.Dialog().ok(__language__(30014),__language__(30015))
- return
- self.doAddShow(sid)
- self.saveData()
- pdialog.close()
-
def doAddShow(self,sid,skipCanceled=False,name=''):
if sid == '0':
self.shows.append(Show(showid=sid,name=name))
@@ -478,9 +275,10 @@ class TVRageEps(xbmcgui.WindowXML):
def userPickShow(self,result,append=''):
slist = ['< %s >' %
(__language__(30040)),__language__(30048).replace('@REPLACE@',append)]
sids = [None,'0']
- for s in result.findall('show'):
- slist.append(s.find('name').text)
- sids.append(s.find('showid').text)
+ if result:
+ for s in result.findall('show'):
+ slist.append(s.find('name').text)
+ sids.append(s.find('showid').text)
dialog = xbmcgui.Dialog()
if append: append = ': ' + append
idx = dialog.select(__language__(30008) + append,slist)
@@ -525,10 +323,12 @@ class TVRageEps(xbmcgui.WindowXML):
break
else:
result = API.search(title)
- matches = {}
- for f in result.findall('show'):
- matches[f.find('name').text] =
f.find('showid').text
- close =
difflib.get_close_matches(title,matches.keys(),1,0.8)
+ close = None
+ if result:
+ matches = {}
+ for f in result.findall('show'):
+
matches[f.find('name').text] = f.find('showid').text
+ close =
difflib.get_close_matches(title,matches.keys(),1,0.8)
if close:
LOG("SHOW: " + title + " -
MATCHES: " + close[0])
pdialog.update(int((ct/tot)*100),__language__(30028) + title)
@@ -563,7 +363,7 @@ class TVRageEps(xbmcgui.WindowXML):
__language__(30043).replace('@NUMBER1@',str(added)).replace('@NUMBER2@',str(int(ct))),
__language__(30044).replace('@NUMBER@',str(exist)),
__language__(30045).replace('@NUMBER@',str(int(skipped))))
-
+
def addShow(self,sid,okdialog=True,name=''):
pdialog = xbmcgui.DialogProgress()
pdialog.create(__language__(30016),name)
@@ -599,6 +399,7 @@ class TVRageEps(xbmcgui.WindowXML):
def eplist(self):
item = self.getControl(120).getSelectedItem()
+ if not item: return
sid = item.getProperty('id')
if sid == '0':
xbmcgui.Dialog().ok(__language__(30049),__language__(30050))
@@ -660,7 +461,7 @@ class TVRageEps(xbmcgui.WindowXML):
lmax = len(self.shows)
ct=0
for show in self.shows:
- if not show.canceled and show.showid != '0':
show.getShowData()
+ if show and not show.canceled and show.showid
!= '0': show.getShowData()
if progress.iscanceled(): break
ct+=1
percent = int((float(ct)/lmax)*100)
@@ -742,14 +543,9 @@ class TVRageEps(xbmcgui.WindowXML):
def fileWriteList(self,file,dataList):
self.fileWrite(file,'\n'.join(dataList))
-
-def saveURLToFile(url,file,hook=None,e_hook=None):
- try:
- urllib.urlretrieve(url,file,hook)
- except:
- if e_hook: ehook()
-
API = TVRageAPI()
+Show.API = API
+Show.THUMB_PATH = THUMB_PATH
w = TVRageEps("script-tvrage-main.xml" , os.getcwd(), "Default")
w.doModal()
diff --git a/script.tvrage.com/jsonrpc.py b/script.tvrage.com/jsonrpc.py
index ef3c78f..1a5bdcc 100644
--- a/script.tvrage.com/jsonrpc.py
+++ b/script.tvrage.com/jsonrpc.py
@@ -1,23 +1,23 @@
# -*- coding: utf-8 -*-
import urllib, simplejson
try:
- import xbmc
+ import xbmc #@UnresolvedImport
except:
#we're not in XBMC so we only get http
pass
class JsonRPCError(Exception):
- def __init__(self, code, message):
- Exception.__init__(self, message)
- self.code = code
- self.message = message
-
+ def __init__(self, code, message):
+ Exception.__init__(self, message)
+ self.code = code
+ self.message = message
+
class ConnectionError(Exception):
- def __init__(self, code, message):
- Exception.__init__(self, message)
- self.code = code
- self.message = message
-
+ def __init__(self, code, message):
+ Exception.__init__(self, message)
+ self.code = code
+ self.message = message
+
class UserPassError(Exception): pass
class baseNamespace:
@@ -55,7 +55,7 @@ class httpNamespace(baseNamespace):
fobj = urllib.urlopen(self.api.url,postdata)
except IOError,e:
if e.args[0] == 'http error':
- if e.args[1] == 401: raise
UserPassError()
+ if e.args[1] == 401: raise
UserPassError()
raise ConnectionError(e.errno,'Connection
error: ' + str(e.errno))
try:
diff --git a/script.tvrage.com/resources/settings.xml
b/script.tvrage.com/resources/settings.xml
index 72954ec..7b087e6 100644
--- a/script.tvrage.com/resources/settings.xml
+++ b/script.tvrage.com/resources/settings.xml
@@ -3,7 +3,7 @@
<!-- General -->
<category label="30002">
<setting id="hours_between_updates" type="enum" label="30001" values="1
Hour|2 Hours|3 Hours|4 Hours|5 Hours|6 Hours|12 Hours|24 Hours" default="0" />
- <setting id="air_offset" type="enum" label="30024"
values="-12|-11|-10|-9|-8|-7|-6|-5|-4|-3|-2|-1|0|+1|+2|+3|+4|+5|+6|+7|+8|+9|+10|+11|+12"
default="12" />
+ <setting id="airtime_offset" type="enum" label="30024"
values="0|+1|+2|+3|+4|+5|+6|+7|+8|+9|+10|+11|+12|+13|+14|+15|+16|+17|+18|+19|+20|+21|+22|+23|-23|-22|-21|-20|-19|-18|-17|-16|-15|-14|-13|-12|-11|-10|-9|-8|-7|-6|-5|-4|-3|-2|-1"
default="0" />
<setting id="reverse_sort" type="bool" label="30013" default="false" />
<setting id="jump_to_bottom" type="bool" label="30018" default="false" />
</category>
-----------------------------------------------------------------------
Summary of changes:
script.tvrage.com/addon.xml | 2 +-
script.tvrage.com/changelog.txt | 11 ++-
script.tvrage.com/default.py | 262 ++++--------------------------
script.tvrage.com/jsonrpc.py | 24 ++--
script.tvrage.com/resources/settings.xml | 2 +-
script.tvrage.com/tvrageapi.py | 237 +++++++++++++++++++++++++++
6 files changed, 290 insertions(+), 248 deletions(-)
create mode 100644 script.tvrage.com/tvrageapi.py
hooks/post-receive
--
Scripts
------------------------------------------------------------------------------
Special Offer-- Download ArcSight Logger for FREE (a $49 USD value)!
Finally, a world-class log management solution at an even better price-free!
Download using promo code Free_Logger_4_Dev2Dev. Offer expires
February 28th, so secure your free ArcSight Logger TODAY!
http://p.sf.net/sfu/arcsight-sfd2d
_______________________________________________
Xbmc-addons mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/xbmc-addons