Advertisement
Guest User

gui.py

a guest
Dec 29th, 2012
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.40 KB | None | 0 0
  1. import os, sys, random, urllib
  2. import xbmc, xbmcgui, xbmcaddon, xbmcvfs
  3. if sys.version_info < (2, 7):
  4. import simplejson
  5. else:
  6. import json as simplejson
  7.  
  8. __addon__ = sys.modules[ "__main__" ].__addon__
  9. __addonid__ = sys.modules[ "__main__" ].__addonid__
  10. __cwd__ = sys.modules[ "__main__" ].__cwd__
  11.  
  12. IMAGE_TYPES = ('.png', '.jpg', '.jpeg', '.bmp', '.gif', '.ico', '.tif', '.tiff', '.tga', '.pcx')
  13.  
  14. def log(txt):
  15. if isinstance (txt,str):
  16. txt = txt.decode("utf-8")
  17. message = u'%s: %s' % (__addonid__, txt)
  18. xbmc.log(msg=message.encode("utf-8"), level=xbmc.LOGDEBUG)
  19.  
  20. class Screensaver(xbmcgui.WindowXMLDialog):
  21. def __init__( self, *args, **kwargs ):
  22. pass
  23.  
  24. def onInit(self):
  25. self.conts()
  26. items = self.items()
  27. if items:
  28. self.show(items)
  29.  
  30. def conts(self):
  31. self.winid = xbmcgui.getCurrentWindowDialogId()
  32. self.stop = False
  33. self.Monitor = MyMonitor(action = self.exit)
  34. self.image1 = self.getControl(1)
  35. self.image2 = self.getControl(2)
  36. self.slideshow_type = __addon__.getSetting('type')
  37. self.slideshow_path = __addon__.getSetting('path')
  38. self.slideshow_effect = __addon__.getSetting('effect')
  39. self.slideshow_time = (int('%02d' % int(__addon__.getSetting('time'))) + 1) * 1000
  40. self.slideshow_dim = hex(int('%.0f' % (float(__addon__.getSetting('level')) * 2.55)))[2:] + 'ffffff' # convert float to hex value usable by the skin
  41.  
  42. def items(self):
  43. # image folder (fallback to video fanart in case ..)
  44. if self.slideshow_type == "2":
  45. if not self.slideshow_path:
  46. self.slideshow_type = "0"
  47. # video fanart
  48. if self.slideshow_type == "0":
  49. methods = [('VideoLibrary.GetMovies', 'movies'), ('VideoLibrary.GetTVShows', 'tvshows')]
  50. # music fanart
  51. elif self.slideshow_type == "1":
  52. methods = [('AudioLibrary.GetArtists', 'artists')]
  53. if self.slideshow_type == "2":
  54. items = self.walk(self.slideshow_path)
  55. else:
  56. items = []
  57. for method in methods:
  58. json_query = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "' + method[0] + '", "params": {"properties": ["fanart"]}, "id": 1}')
  59. json_query = unicode(json_query, 'utf-8', errors='ignore')
  60. json_response = simplejson.loads(json_query)
  61. if json_response.has_key('result') and json_response['result'] != None and json_response['result'].has_key(method[1]):
  62. for item in json_response['result'][method[1]]:
  63. if item['fanart']:
  64. items.append(item['fanart'])
  65. # randomize
  66. random.shuffle(items, random.random)
  67. return items
  68.  
  69. def show(self, items):
  70. # set window properties for the skin
  71. xbmcgui.Window(self.winid).setProperty('SlideView.Dim', self.slideshow_dim)
  72. cur_img = self.image1
  73. while (not xbmc.abortRequested) and (not self.stop):
  74. for img in items:
  75. cur_img.setImage(img)
  76. if cur_img == self.image1:
  77. if self.slideshow_effect == "0":
  78. xbmcgui.Window(self.winid).setProperty('SlideView.Slide1', '0')
  79. xbmcgui.Window(self.winid).setProperty('SlideView.Slide2', '1')
  80. FILENAME, EXT = os.path.splitext(os.path.basename(img))
  81. xbmcgui.Window(self.winid).setProperty('SlideView.Filename',FILENAME)
  82. else:
  83. xbmcgui.Window(self.winid).setProperty('SlideView.Fade1', '0')
  84. xbmcgui.Window(self.winid).setProperty('SlideView.Fade2', '1')
  85. FILENAME, EXT = os.path.splitext(os.path.basename(img))
  86. xbmcgui.Window(self.winid).setProperty('SlideView.Filename',FILENAME)
  87. if self.slideshow_effect == "2":
  88. self.anim(self.winid, 1, 2, self.image1, self.image2, self.slideshow_time)
  89. cur_img = self.image2
  90. else:
  91. if self.slideshow_effect == "0":
  92. xbmcgui.Window(self.winid).setProperty('SlideView.Slide2', '0')
  93. xbmcgui.Window(self.winid).setProperty('SlideView.Slide1', '1')
  94. FILENAME, EXT = os.path.splitext(os.path.basename(img))
  95. xbmcgui.Window(self.winid).setProperty('SlideView.Filename',FILENAME)
  96. else:
  97. xbmcgui.Window(self.winid).setProperty('SlideView.Fade2', '0')
  98. FILENAME, EXT = os.path.splitext(os.path.basename(img))
  99. xbmcgui.Window(self.winid).setProperty('SlideView.Filename',FILENAME)
  100. if self.slideshow_effect == "2":
  101. self.anim(self.winid, 2, 1, self.image2, self.image1, self.slideshow_time)
  102. cur_img = self.image1
  103. count = int(self.slideshow_time / 1000)
  104. if self.slideshow_effect == "2":
  105. count -= 1
  106. while (not xbmc.abortRequested) and (not self.stop) and count > 0:
  107. count -= 1
  108. xbmc.sleep(1000)
  109. if self.stop or xbmc.abortRequested:
  110. break
  111.  
  112. def walk(self, path):
  113. images = []
  114. folders = []
  115. if path.startswith('multipath://'):
  116. paths = path[12:-1].split('/')
  117. for item in paths:
  118. folders.append(urllib.unquote_plus(item))
  119. else:
  120. folders.append(path)
  121. for folder in folders:
  122. if xbmcvfs.exists(xbmc.translatePath(folder)):
  123. dirs,files = xbmcvfs.listdir(folder)
  124. for item in files:
  125. if os.path.splitext(item)[1].lower() in IMAGE_TYPES:
  126. images.append(os.path.join(folder,item))
  127. for item in dirs:
  128. images += self.walk(os.path.join(folder,item))
  129. return images
  130.  
  131. def anim(self, winid, next_prop, prev_prop, next_img, prev_img, showtime):
  132. number = random.randint(1,9)
  133. posx = 0
  134. posy = 0
  135. # calculate posx and posy offset depending on the selected time per image (add 0.5 sec fadeout time)
  136. if number == 2 or number == 6 or number == 8:
  137. posx = int(-128 + (12.8 * ((showtime + 0.5) / 1000)))
  138. elif number == 3 or number == 7 or number == 9:
  139. posx = int(128 - (12.8 * ((showtime + 0.5) / 1000)))
  140. if number == 4 or number == 6 or number == 7:
  141. posy = int(-72 + (7.2 * ((showtime + 0.5) / 1000)))
  142. elif number == 5 or number == 8 or number == 9:
  143. posy = int(72 - (7.2 * ((showtime + 0.5) / 1000)))
  144. next_img.setPosition(posx, posy)
  145. xbmcgui.Window(winid).setProperty('SlideView.Pan%i' % next_prop, str(number))
  146. xbmc.sleep(500)
  147. prev_img.setPosition(0, 0)
  148. xbmcgui.Window(winid).setProperty('SlideView.Pan%i' % prev_prop, '0')
  149. xbmc.sleep(500)
  150.  
  151. def exit(self):
  152. self.stop = True
  153. self.close()
  154.  
  155. class MyMonitor(xbmc.Monitor):
  156. def __init__( self, *args, **kwargs ):
  157. self.action = kwargs['action']
  158.  
  159. def onScreensaverDeactivated(self):
  160. self.action()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement