Advertisement
Guest User

Untitled

a guest
Oct 12th, 2011
177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.75 KB | None | 0 0
  1. import os, sys, re, time, socket, urllib
  2. from traceback import print_exc
  3. from datetime import date
  4. import xbmc, xbmcgui, xbmcaddon, xbmcvfs
  5.  
  6. __addon__ = xbmcaddon.Addon()
  7. __addonid__ = __addon__.getAddonInfo('id')
  8. __addonname__ = __addon__.getAddonInfo('name')
  9. __cwd__ = __addon__.getAddonInfo('path')
  10. __author__ = __addon__.getAddonInfo('author')
  11. __version__ = __addon__.getAddonInfo('version')
  12. __language__ = __addon__.getLocalizedString
  13. __useragent__ = "Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.1) Gecko/2008070208 Firefox/3.6"
  14.  
  15. DATA_PATH = os.path.join( xbmc.translatePath( "special://profile/addon_data/" ), __addonid__ )
  16. RESOURCES_PATH = xbmc.translatePath( os.path.join( __cwd__, 'resources' ) )
  17. sys.path.append( os.path.join( RESOURCES_PATH, "lib" ) )
  18.  
  19. if not xbmcvfs.exists(DATA_PATH):
  20. xbmcvfs.mkdir(DATA_PATH)
  21.  
  22. def log(msg):
  23. xbmc.log( str( msg ),level=xbmc.LOGDEBUG )
  24.  
  25. def footprints():
  26. log( "### %s starting ..." % __addonname__ )
  27. log( "### author: %s" % __author__ )
  28. log( "### version: %s" % __version__ )
  29.  
  30. def get_html_source(url , save=False):
  31. class AppURLopener(urllib.FancyURLopener):
  32. version = __useragent__
  33. urllib._urlopener = AppURLopener()
  34. succeed = 0
  35. while succeed < 5:
  36. try:
  37. urllib.urlcleanup()
  38. sock = urllib.urlopen(url)
  39. htmlsource = sock.read()
  40. if save: file( os.path.join( CACHE_PATH , save ) , "w" ).write( htmlsource )
  41. sock.close()
  42. succeed = 5
  43. return htmlsource
  44. except:
  45. succeed = succeed + 1
  46. print_exc()
  47. log( "### ERROR opening page %s ---%s---" % ( url , succeed) )
  48. return ""
  49.  
  50. class NextAired:
  51. def __init__(self):
  52. footprints()
  53. self.WINDOW = xbmcgui.Window( 10000 )
  54. self.date = date.today()
  55. self._parse_argv()
  56. if self.BACKEND:
  57. self.run_daemon()
  58. else:
  59. self.update_data()
  60. if self.SILENT == "True":
  61. self._set_alarm()
  62. else:
  63. self.show_gui()
  64.  
  65. def _parse_argv( self ):
  66. try:
  67. params = dict( arg.split( "=" ) for arg in sys.argv[ 1 ].split( "&" ) )
  68. except:
  69. params = {}
  70. log( "### params: %s" % params )
  71. self.SILENT = params.get( "silent", "" )
  72. self.BACKEND = params.get("backend", False )
  73.  
  74. def update_data(self):
  75. self.nextlist = []
  76. dbfile = os.path.join( DATA_PATH , "next_aired.db" )
  77. if xbmcvfs.exists(dbfile):
  78. if time.time() - os.path.getmtime(dbfile) > 86400:
  79. log( "### db old more than 24h, rescanning..." )
  80. self.scan_info()
  81. else :
  82. log( "### db less than 24, fetch local data..." )
  83. self.current_show_data = self.get_list("next_aired.db")
  84. if self.current_show_data == "[]":
  85. self.scan_info()
  86. else:
  87. log( "### db doesn't exist, scanning for data..." )
  88. self.scan_info()
  89. if self.current_show_data:
  90. log( "### data available" )
  91. for show in self.current_show_data:
  92. if show.get("Next Episode" , False):
  93. self.nextlist.append(show)
  94. log( "### next list: %s shows ### %s" % ( len(self.nextlist) , self.nextlist ) )
  95. self.nextlist = sorted( self.nextlist, key=lambda item: str( item.get( "RFC3339", "~" ) ).lower(), reverse=False )
  96. self.check_today_show()
  97. self.push_data()
  98. else:
  99. log( "### no current show data..." )
  100.  
  101. def scan_info(self):
  102. if self.SILENT == "":
  103. DIALOG_PROGRESS = xbmcgui.DialogProgress()
  104. DIALOG_PROGRESS.create( __language__(32101) , __language__(32102) )
  105. socket.setdefaulttimeout(10)
  106. self.count = 0
  107. self.current_show_data = []
  108. self.canceled = self.get_list("canceled.db")
  109. if not self.listing():
  110. self.close("error listing")
  111. self.total_show = len(self.TVlist)
  112. log( "### canceled list: %s " % self.canceled )
  113. for show in self.TVlist:
  114. current_show = {}
  115. self.count += 1
  116. if self.SILENT == "":
  117. percent = int( float( self.count * 100 ) / self.total_show )
  118. DIALOG_PROGRESS.update( percent , __language__(32102) , "%s" % show[0] )
  119. if DIALOG_PROGRESS.iscanceled():
  120. DIALOG_PROGRESS.close()
  121. xbmcgui.Dialog().ok(__language__(32103),__language__(32104))
  122. break
  123. log( "### %s" % show[0] )
  124. current_show["localname"] = show[0]
  125. current_show["path"] = show[1]
  126. current_show["thumbnail"] = show[2]
  127. current_show["fanart"] = show[3]
  128. if show[0] in self.canceled:
  129. log( "### %s canceled/Ended" % show[0] )
  130. else:
  131. self.get_show_info( current_show )
  132. log( current_show )
  133. if current_show.get("Status") == "!Canceled/Ended":
  134. self.canceled.append(current_show["localname"])
  135. else:
  136. self.current_show_data.append(current_show)
  137. self.save_file( self.canceled , "canceled.db")
  138. self.save_file( self.current_show_data , "next_aired.db")
  139. if self.SILENT == "":
  140. DIALOG_PROGRESS.close()
  141.  
  142. def listing(self):
  143. json_query = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "VideoLibrary.GetTVShows", "params": {"properties": ["file", "thumbnail", "fanart"], "sort": { "method": "label" } }, "id": 1}')
  144. json_response = re.compile( "{(.*?)}", re.DOTALL ).findall(json_query)
  145. log( json_response )
  146. self.TVlist = []
  147. for tvshowitem in json_response:
  148. log( tvshowitem )
  149. findtvshowname = re.search( '"label": ?"(.*?)",["\n]', tvshowitem )
  150. if findtvshowname:
  151. tvshowname = ( findtvshowname.group(1) )
  152. findpath = re.search( '"file": ?"(.*?)",["\n]', tvshowitem )
  153. if findpath:
  154. path = (findpath.group(1))
  155. else:
  156. path = ''
  157. findthumbnail = re.search( '"thumbnail": ?"(.*?)",["\n]', tvshowitem )
  158. if findthumbnail:
  159. thumbnail = (findthumbnail.group(1))
  160. else:
  161. thumbnail = ''
  162. findfanart = re.search( '"fanart": ?"(.*?)",["\n]', tvshowitem )
  163. if findfanart:
  164. fanart = (findfanart.group(1))
  165. else:
  166. fanart = ""
  167. self.TVlist.append( ( tvshowname , path, thumbnail, fanart ) )
  168. log( "### list: %s" % self.TVlist )
  169. return self.TVlist
  170.  
  171. def get_show_info( self , current_show ):
  172. log( "### get info %s" % current_show["localname"] )
  173. # get info for show with exact name
  174. log( "### searching for %s" % current_show["localname"] )
  175. log( "### search url: http://services.tvrage.com/tools/quickinfo.php?show=%s" % urllib.quote_plus( current_show["localname"] ) )
  176. result_info = get_html_source( "http://services.tvrage.com/tools/quickinfo.php?show=%s" % urllib.quote_plus( current_show["localname"]))
  177. log( "### parse informations" )
  178. result = re.findall("(?m)(.*)@(.*)", result_info)
  179. current_show["ep_img"] = current_show["thumbnail"]
  180. if result:
  181. # get short tvshow info and next aired episode
  182. for item in result:
  183. current_show[item[0].replace("<pre>" , "")] = item[1]
  184.  
  185. def check_today_show(self):
  186. self.todayshow = 0
  187. self.todaylist = []
  188. log( self.date )
  189. for show in self.nextlist:
  190. log( "################" )
  191. log( "### %s" % show.get("localname") )
  192. if show.get("RFC3339" , "" )[:10] == self.date:
  193. self.todayshow = self.todayshow + 1
  194. self.todaylist.append(show.get("localname"))
  195. log( "TODAY" )
  196. show["Today"] = "True"
  197. log( "### %s" % show.get("Next Episode", "") )
  198. log( "### %s" % show.get("RFC3339", "no rfc") )
  199. log( str(show.get("RFC3339", "")[:10]) )
  200. log( "### today show: %s - %s" % ( self.todayshow , str(self.todaylist).strip("[]") ) )
  201.  
  202. def get_list(self , listname ):
  203. path = os.path.join( DATA_PATH , listname )
  204. if xbmcvfs.exists(path):
  205. log( "### Load list: %s" % path )
  206. return self.load_file(path)
  207. else:
  208. log( "### Load list: %s not found!" % listname )
  209. return []
  210.  
  211. def load_file( self , file_path ):
  212. try:
  213. return eval( file( file_path, "r" ).read() )
  214. except:
  215. print_exc()
  216. log( "### ERROR could not load file %s" % temp )
  217. return "[]"
  218.  
  219. def save_file( self , txt , filename):
  220. path = os.path.join( DATA_PATH , filename )
  221. try:
  222. if txt:
  223. file( path , "w" ).write( repr( txt ) )
  224. except:
  225. print_exc()
  226. log( "### ERROR could not save file %s" % DATA_PATH )
  227.  
  228. def push_data(self):
  229. self.WINDOW.setProperty("NextAired.Total" , str(len(self.nextlist)) )
  230. self.WINDOW.setProperty("NextAired.TodayTotal" , str(self.todayshow) )
  231. self.WINDOW.setProperty("NextAired.TodayShow" , str(self.todaylist).strip("[]") )
  232. # DEPRECATED
  233. for count in range( len(self.nextlist) ):
  234. self.WINDOW.clearProperty("NextAired.%d.ShowTitle" % ( count + 1, ))
  235. for count, current_show in enumerate( self.nextlist ):
  236. self.WINDOW.setProperty("NextAired.%d.Today" % ( count + 1, ), current_show.get( "Today" , "False"))
  237. self.WINDOW.setProperty("NextAired.%d.ShowTitle" % ( count + 1, ), current_show.get( "localname", ""))
  238. try:
  239. next = current_show.get("Next Episode","").split("^")
  240. self.WINDOW.setProperty("NextAired.%d.NextDate" % ( count + 1, ), next[2] or "")
  241. self.WINDOW.setProperty("NextAired.%d.NextTitle" % ( count + 1, ), next[1] or "")
  242. self.WINDOW.setProperty("NextAired.%d.NextNumber" % ( count + 1, ), next[0] or "")
  243. except:
  244. print_exc()
  245. try:
  246. latest = current_show.get("Latest Episode","").split("^")
  247. self.WINDOW.setProperty("NextAired.%d.LatestDate" % ( count + 1, ), latest[2] or "")
  248. self.WINDOW.setProperty("NextAired.%d.LatestTitle" % ( count + 1, ), latest[1] or "")
  249. self.WINDOW.setProperty("NextAired.%d.LatestNumber" % ( count + 1, ), latest[0] or "")
  250. except:
  251. print_exc()
  252. self.WINDOW.setProperty("NextAired.%d.Airtime" % ( count + 1, ), current_show.get("Airtime", ""))
  253. self.WINDOW.setProperty("NextAired.%d.Showpath" % ( count + 1, ), current_show.get("path", ""))
  254. self.WINDOW.setProperty("NextAired.%d.Status" % ( count + 1, ), current_show.get("Status", ""))
  255. self.WINDOW.setProperty("NextAired.%d.ep_img" % ( count + 1, ), current_show.get("ep_img", ""))
  256. self.WINDOW.setProperty("NextAired.%d.Network" % ( count + 1, ), current_show.get("Network", ""))
  257. self.WINDOW.setProperty("NextAired.%d.Started" % ( count + 1, ), current_show.get("Started", ""))
  258. self.WINDOW.setProperty("NextAired.%d.Classification" % ( count + 1, ), current_show.get("Classification", ""))
  259. self.WINDOW.setProperty("NextAired.%d.Genres" % ( count + 1, ), current_show.get("Genres", ""))
  260. self.WINDOW.setProperty("NextAired.%d.Premiered" % ( count + 1, ), current_show.get("Premiered", ""))
  261. self.WINDOW.setProperty("NextAired.%d.Country" % ( count + 1, ), current_show.get("Country", ""))
  262. self.WINDOW.setProperty("NextAired.%d.Runtime" % ( count + 1, ), current_show.get("Runtime", ""))
  263. self.WINDOW.setProperty("NextAired.%d.Fanart" % ( count + 1, ), current_show.get("Fanart", ""))
  264. try:
  265. airday, shortime = current_show.get("Airtime", " at " ).split(" at ")
  266. self.WINDOW.setProperty("NextAired.%d.airday" % ( count + 1, ), airday)
  267. self.WINDOW.setProperty("NextAired.%d.shortime" % ( count + 1, ), shortime)
  268. except:
  269. log( "### %s" % current_show.get("Airtime", " at "))
  270.  
  271. def show_gui(self):
  272. import next_aired_dialog
  273. next_aired_dialog.MyDialog(self.nextlist, self.set_labels)
  274.  
  275. def _set_alarm( self ):
  276. log( "### Alarm enabled" )
  277. command = "XBMC.RunScript(%s,silent=True&alarm=1200)" % ( os.path.join( __cwd__, __file__ ) )
  278. xbmc.executebuiltin( "AlarmClock(NextAired,%s,1200,true)" % command )
  279.  
  280. def run_daemon(self):
  281. self._stop = False
  282. self.previousitem = ''
  283. self.current_show_data = self.get_list("next_aired.db")
  284. if self.current_show_data == "[]":
  285. self._stop = True
  286. while not self._stop:
  287. self.selecteditem = xbmc.getInfoLabel("ListItem.TVShowTitle")
  288. if self.selecteditem != self.previousitem:
  289. self.WINDOW.clearProperty("NextAired.Label")
  290. self.previousitem = self.selecteditem
  291. for item in self.current_show_data:
  292. if self.selecteditem == item.get("localname", "") and item.get("Next Episode", True) and item.get("Latest Episode", False):
  293. self.WINDOW.clearProperty("NextAired.NextDate")
  294. self.set_labels('windowproperty', item)
  295. if self.selecteditem == item.get("localname", "") and item.get("Next Episode", False):
  296. self.set_labels('windowproperty', item)
  297. break
  298. xbmc.sleep(100)
  299. if not xbmc.getCondVisibility("Window.IsVisible(10025)"):
  300. self.WINDOW.clearProperty("NextAired.Label")
  301. self._stop = True
  302.  
  303. def set_labels(self, label, item, return_items = False ):
  304. if label == "windowproperty":
  305. label = xbmcgui.Window( 10000 )
  306. prefix = 'NextAired.'
  307. label.setProperty(prefix + "Label", item.get("localname", ""))
  308. label.setProperty(prefix + "Thumb", item.get("ep_img", ""))
  309. else:
  310. label = xbmcgui.ListItem()
  311. prefix = ''
  312. label.setLabel(item.get("localname", ""))
  313. label.setThumbnailImage(item.get("ep_img", ""))
  314. label.setProperty(prefix + "AirTime", item.get("Airtime", ""))
  315. label.setProperty(prefix + "Path", item.get("path", ""))
  316. label.setProperty(prefix + "Status", item.get("Status", ""))
  317. label.setProperty(prefix + "Network", item.get("Network", ""))
  318. label.setProperty(prefix + "Started", item.get("Started", ""))
  319. label.setProperty(prefix + "Classification", item.get("Classification", ""))
  320. label.setProperty(prefix + "Genre", item.get("Genres", ""))
  321. label.setProperty(prefix + "Premiered", item.get("Premiered", ""))
  322. label.setProperty(prefix + "Country", item.get("Country", ""))
  323. label.setProperty(prefix + "Runtime", item.get("Runtime", ""))
  324. label.setProperty(prefix + "Fanart", item.get("fanart", ""))
  325. if item.get("RFC3339" , "" )[:10] == self.date:
  326. label.setProperty(prefix + "Today", "True")
  327. else:
  328. label.setProperty(prefix + "Today", "False")
  329. try:
  330. next = item.get("Next Episode","").split("^")
  331. label.setProperty(prefix + "NextDate", next[2] or "")
  332. label.setProperty(prefix + "NextTitle", next[1] or "")
  333. label.setProperty(prefix + "NextNumber", next[0] or "")
  334. except:
  335. print_exc()
  336. try:
  337. latest = item.get("Latest Episode","").split("^")
  338. label.setProperty(prefix + "LatestDate", latest[2] or "")
  339. label.setProperty(prefix + "LatestTitle", latest[1] or "")
  340. label.setProperty(prefix + "LatestNumber", latest[0] or "")
  341. except:
  342. print_exc()
  343. try:
  344. airday, shorttime = item.get("Airtime", " at ").split(" at ")
  345. label.setProperty(prefix + "AirDay", airday)
  346. label.setProperty(prefix + "ShortTime", shorttime)
  347. except:
  348. log( "### %s" % item.get("Airtime", " at "))
  349. if return_items:
  350. return label, airday
  351.  
  352. def close(self , msg ):
  353. log( "### %s" % msg )
  354. exit
  355.  
  356. if ( __name__ == "__main__" ):
  357. NextAired()
  358.  
  359.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement