Guest User

Pi trial

a guest
Aug 25th, 2014
295
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 155.42 KB | None | 0 0
  1. '''
  2. @document : default.py
  3. @package : XBMB3C add-on
  4. @authors : xnappo, null_pointer, im85288
  5. @copyleft : 2013, xnappo
  6.  
  7. @license : Gnu General Public License - see LICENSE.TXT
  8. @description: XBMB3C XBMC add-on
  9.  
  10. This file is part of the XBMC XBMB3C Plugin.
  11.  
  12. XBMB3C Plugin is free software: you can redistribute it and/or modify
  13. it under the terms of the GNU General Public License as published by
  14. the Free Software Foundation, either version 2 of the License, or
  15. (at your option) any later version.
  16.  
  17. XBMB3C Plugin is distributed in the hope that it will be useful,
  18. but WITHOUT ANY WARRANTY; without even the implied warranty of
  19. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  20. GNU General Public License for more details.
  21.  
  22. You should have received a copy of the GNU General Public License
  23. along with XBMB3C Plugin. If not, see <http://www.gnu.org/licenses/>.
  24.  
  25. Thanks to Hippojay for the PleXBMC plugin this is derived from
  26.  
  27. '''
  28.  
  29. import struct
  30. import urllib
  31. import glob
  32. import re
  33. import hashlib
  34. import xbmcplugin
  35. import xbmcgui
  36. import xbmcaddon
  37. import httplib
  38. import socket
  39. import sys
  40. import os
  41. import time
  42. import inspect
  43. import base64
  44. import random
  45. import datetime
  46. import requests
  47. from urlparse import urlparse
  48. import cProfile
  49. import pstats
  50. import threading
  51. import hashlib
  52. import StringIO
  53. import gzip
  54. import xml.etree.ElementTree as etree
  55.  
  56. __settings__ = xbmcaddon.Addon(id='plugin.video.xbmb3c')
  57. __cwd__ = __settings__.getAddonInfo('path')
  58. __addon__ = xbmcaddon.Addon(id='plugin.video.xbmb3c')
  59. __addondir__ = xbmc.translatePath( __addon__.getAddonInfo('profile') )
  60. __language__ = __addon__.getLocalizedString
  61.  
  62. BASE_RESOURCE_PATH = xbmc.translatePath( os.path.join( __cwd__, 'resources', 'lib' ) )
  63. sys.path.append(BASE_RESOURCE_PATH)
  64. PLUGINPATH = xbmc.translatePath( os.path.join( __cwd__) )
  65.  
  66. from DownloadUtils import DownloadUtils
  67. from ItemInfo import ItemInfo
  68. from Utils import PlayUtils
  69. from ClientInformation import ClientInformation
  70. from PersonInfo import PersonInfo
  71. from SearchDialog import SearchDialog
  72.  
  73. XBMB3C_VERSION = ClientInformation().getVersion()
  74.  
  75. xbmc.log ("===== XBMB3C START =====")
  76.  
  77. xbmc.log ("XBMB3C -> running Python: " + str(sys.version_info))
  78. xbmc.log ("XBMB3C -> running XBMB3C: " + str(XBMB3C_VERSION))
  79. xbmc.log (xbmc.getInfoLabel( "System.BuildVersion" ))
  80.  
  81. #Get the setting from the appropriate file.
  82. CP_ADD_URL = 'XBMC.RunPlugin(plugin://plugin.video.couchpotato_manager/movies/add?title=%s)'
  83. _MODE_GETCONTENT=0
  84. _MODE_MOVIES=0
  85. _MODE_SEARCH=2
  86. _MODE_SETVIEWS=3
  87. _MODE_SHOW_SECTIONS=4
  88. _MODE_BASICPLAY=12
  89. _MODE_PLAYLISTPLAY=13
  90. _MODE_CAST_LIST=14
  91. _MODE_PERSON_DETAILS=15
  92. _MODE_WIDGET_CONTENT=16
  93. _MODE_ITEM_DETAILS=17
  94. _MODE_SHOW_SEARCH=18
  95. _MODE_SHOW_PARENT_CONTENT=21
  96.  
  97. #Check debug first...
  98. logLevel = 0
  99. try:
  100. logLevel = int(__settings__.getSetting('logLevel'))
  101. except:
  102. pass
  103.  
  104. import json as json
  105.  
  106. #define our global download utils
  107. downloadUtils = DownloadUtils()
  108.  
  109. def printDebug( msg, level = 1):
  110. if(logLevel >= level):
  111. if(logLevel == 2):
  112. xbmc.log("XBMB3C " + str(level) + " -> " + inspect.stack()[1][3] + " : " + str(msg))
  113. else:
  114. xbmc.log("XBMB3C " + str(level) + " -> " + str(msg))
  115.  
  116.  
  117. def getAuthHeader():
  118. txt_mac = downloadUtils.getMachineId()
  119. version = ClientInformation().getVersion()
  120. userid = xbmcgui.Window( 10000 ).getProperty("userid")
  121. deviceName = __settings__.getSetting('deviceName')
  122. deviceName = deviceName.replace("\"", "_")
  123. authString = "MediaBrowser UserId=\"" + userid + "\",Client=\"XBMC\",Device=\"" + deviceName + "\",DeviceId=\"" + txt_mac + "\",Version=\"" + version + "\""
  124. headers = {'Accept-encoding': 'gzip', 'Authorization' : authString}
  125. xbmc.log("XBMB3C Authentication Header : " + str(headers))
  126. return headers
  127.  
  128. def getPlatform( ):
  129.  
  130. if xbmc.getCondVisibility('system.platform.osx'):
  131. return "OSX"
  132. elif xbmc.getCondVisibility('system.platform.atv2'):
  133. return "ATV2"
  134. elif xbmc.getCondVisibility('system.platform.ios'):
  135. return "iOS"
  136. elif xbmc.getCondVisibility('system.platform.windows'):
  137. return "Windows"
  138. elif xbmc.getCondVisibility('system.platform.linux'):
  139. return "Linux/RPi"
  140. elif xbmc.getCondVisibility('system.platform.android'):
  141. return "Linux/Android"
  142.  
  143. return "Unknown"
  144.  
  145. XBMB3C_PLATFORM=getPlatform()
  146. xbmc.log ("XBMB3C -> Platform: " + str(XBMB3C_PLATFORM))
  147.  
  148. g_flatten = __settings__.getSetting('flatten')
  149. printDebug("XBMB3C -> Flatten is: " + g_flatten)
  150.  
  151. xbmc.log ("XBMB3C -> LogLevel: " + str(logLevel))
  152.  
  153. g_contextReplace=True
  154.  
  155. g_loc = "special://home/addons/plugin.video.XBMB3C"
  156.  
  157. #Create the standard header structure and load with a User Agent to ensure we get back a response.
  158. g_txheaders = {
  159. 'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US;rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 ( .NET CLR 3.5.30729)',
  160. }
  161.  
  162. #Set up holding variable for session ID
  163. global g_sessionID
  164. g_sessionID=None
  165.  
  166. genreList=[__language__(30069),__language__(30070),__language__(30071),__language__(30072),__language__(30073),__language__(30074),__language__(30075),__language__(30076),__language__(30077),__language__(30078),__language__(30079),__language__(30080),__language__(30081),__language__(30082),__language__(30083),__language__(30084),__language__(30085),__language__(30086),__language__(30087),__language__(30088),__language__(30089)]
  167. sortbyList=[__language__(30059),__language__(30060),__language__(30061),__language__(30062),__language__(30063),__language__(30064),__language__(30065),__language__(30066),__language__(30067)]
  168.  
  169. def getServerDetails():
  170.  
  171. printDebug("Getting Server Details from Network")
  172.  
  173. MESSAGE = "who is MediaBrowserServer?"
  174. #MULTI_GROUP = ("224.3.29.71", 7359)
  175. #MULTI_GROUP = ("127.0.0.1", 7359)
  176. MULTI_GROUP = ("<broadcast>", 7359)
  177.  
  178. sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  179. sock.settimeout(6.0)
  180.  
  181. #ttl = struct.pack('b', 20)
  182. #sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, ttl)
  183. sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 20)
  184.  
  185. sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1)
  186. sock.setsockopt(socket.SOL_IP, socket.IP_MULTICAST_LOOP, 1)
  187. sock.setsockopt(socket.IPPROTO_IP, socket.SO_REUSEADDR, 1)
  188.  
  189. xbmc.log("MutliGroup : " + str(MULTI_GROUP));
  190. xbmc.log("Sending UDP Data : " + MESSAGE);
  191. sock.sendto(MESSAGE, MULTI_GROUP)
  192.  
  193. try:
  194. data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
  195. xbmc.log("Received Response : " + data)
  196. if(data[0:18] == "MediaBrowserServer"):
  197. xbmc.log("Found Server : " + data[19:])
  198. return data[19:]
  199. except:
  200. xbmc.log("No UDP Response")
  201. pass
  202.  
  203. return None
  204.  
  205. def getCollections(detailsString):
  206. printDebug("== ENTER: getCollections ==")
  207.  
  208. userid = downloadUtils.getUserId()
  209.  
  210. if(userid == None or len(userid) == 0):
  211. return {}
  212.  
  213. try:
  214. jsonData = downloadUtils.downloadUrl(__settings__.getSetting('ipaddress') + ":" + __settings__.getSetting('port') + "/mediabrowser/Users/" + userid + "/Items/Root?format=json")
  215. except Exception, msg:
  216. error = "Get connect : " + str(msg)
  217. xbmc.log (error)
  218. return {}
  219.  
  220. printDebug("jsonData : " + jsonData, level=2)
  221. result = json.loads(jsonData)
  222.  
  223. parentid = result.get("Id")
  224. printDebug("parentid : " + parentid)
  225.  
  226. htmlpath = ("http://%s:%s/mediabrowser/Users/" % ( __settings__.getSetting('ipaddress'), __settings__.getSetting('port')))
  227. jsonData = downloadUtils.downloadUrl(htmlpath + userid + "/items?ParentId=" + parentid + "&Sortby=SortName&format=json")
  228. printDebug("jsonData : " + jsonData, level=2)
  229. collections=[]
  230.  
  231. if jsonData is False:
  232. return {}
  233.  
  234. result = json.loads(jsonData)
  235. result = result.get("Items")
  236.  
  237. for item in result:
  238. if(item.get("RecursiveItemCount") != "0"):
  239. Name =(item.get("Name")).encode('utf-8')
  240. if __settings__.getSetting(urllib.quote('sortbyfor'+Name)) == '':
  241. __settings__.setSetting(urllib.quote('sortbyfor'+Name),'SortName')
  242. __settings__.setSetting(urllib.quote('sortorderfor'+Name),'Ascending')
  243.  
  244. total = str(item.get("RecursiveItemCount"))
  245. section = item.get("CollectionType")
  246. if (section == None):
  247. section = "movies"
  248. collections.append( {'title' : Name,
  249. 'address' : __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port') ,
  250. 'thumb' : downloadUtils.getArtwork(item,"Primary") ,
  251. 'fanart_image' : downloadUtils.getArtwork(item, "Backdrop") ,
  252. 'poster' : downloadUtils.getArtwork(item,"Primary") ,
  253. 'sectype' : section,
  254. 'section' : section,
  255. 'guiid' : item.get("Id"),
  256. 'path' : ('/mediabrowser/Users/' + userid + '/items?ParentId=' + item.get("Id") + '&IsVirtualUnaired=false&IsMissing=False&Fields=' + detailsString + '&SortOrder='+__settings__.getSetting('sortorderfor'+urllib.quote(Name))+'&SortBy='+__settings__.getSetting('sortbyfor'+urllib.quote(Name))+'&Genres=&format=json')})
  257. printDebug("Title " + Name)
  258.  
  259. # Add standard nodes
  260. nodeUrl = 'http://' + __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port')
  261. collections.append({'title':'All Movies' , 'sectype' : 'std.movies', 'section' : 'movies' , 'address' : __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port') , 'path' : '/mediabrowser/Users/' + userid + '/Items?&SortBy=SortName&Fields=' + detailsString + '&Recursive=true&SortOrder=Ascending&IncludeItemTypes=Movie&format=json' ,'thumb':'', 'poster':'', 'fanart_image':'', 'guiid':''})
  262. collections.append({'title':'All TV' , 'sectype' : 'std.tvshows', 'section' : 'tvshows' , 'address' : __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port') , 'path' : '/mediabrowser/Users/' + userid + '/Items?&SortBy=SortName&Fields=' + detailsString + '&Recursive=true&SortOrder=Ascending&IncludeItemTypes=Series&format=json','thumb':'', 'poster':'', 'fanart_image':'' , 'guiid':''})
  263. collections.append({'title':'All Music' , 'sectype' : 'std.music', 'section' : 'music' , 'address' : __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port') , 'path' : '/mediabrowser/Users/' + userid + '/Items?&SortBy=SortName&Fields=' + detailsString + '&Recursive=true&SortOrder=Ascending&IncludeItemTypes=MusicArtist&format=json','thumb':'', 'poster':'', 'fanart_image':'', 'guiid':'' })
  264. collections.append({'title':'Channels' , 'sectype' : 'std.channels', 'section' : 'channels' , 'address' : __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port') , 'path' : '/mediabrowser/Channels?' + userid +'&format=json','thumb':'', 'poster':'', 'fanart_image':'', 'guiid':'' })
  265. collections.append({'title':'Recently Added Movies' , 'sectype' : 'std.movies', 'section' : 'movies' , 'address' : __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port') , 'path' : '/mediabrowser/Users/' + userid + '/Items?Limit=' + __settings__.getSetting("numRecentMovies") +'&Recursive=true&SortBy=DateCreated&Fields=' + detailsString + '&SortOrder=Descending&Filters=IsUnplayed,IsNotFolder&IncludeItemTypes=Movie&format=json','thumb':'', 'poster':'', 'fanart_image':'', 'guiid':''})
  266. collections.append({'title':'Recently Added Episodes', 'sectype' : 'std.tvshows', 'section' : 'tvshows' , 'address' : __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port') , 'path' : '/mediabrowser/Users/' + userid + '/Items?Limit=' + __settings__.getSetting("numRecentTV") +'&Recursive=true&SortBy=DateCreated&Fields=' + detailsString + '&SortOrder=Descending&Filters=IsUnplayed,IsNotFolder&IsVirtualUnaired=false&IsMissing=False&IncludeItemTypes=Episode&format=json','thumb':'', 'poster':'', 'fanart_image':'', 'guiid':''})
  267. collections.append({'title':'Recently Added Albums' , 'sectype' : 'std.music', 'section' : 'music' , 'address' : __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port') , 'path' : '/mediabrowser/Users/' + userid + '/Items?Limit=' + __settings__.getSetting("numRecentMusic") +'&Recursive=true&SortBy=DateCreated&Fields=' + detailsString + '&SortOrder=Descending&Filters=IsUnplayed&IncludeItemTypes=MusicAlbum&format=json','thumb':'', 'poster':'', 'fanart_image':'', 'guiid':''})
  268. collections.append({'title':'In Progress Movies' , 'sectype' : 'std.movies', 'section' : 'movies' , 'address' : __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port') , 'path' : '/mediabrowser/Users/' + userid + '/Items?Recursive=true&SortBy=DatePlayed&SortOrder=Descending&Fields=' + detailsString + '&Filters=IsResumable&IncludeItemTypes=Movie&format=json','thumb':'', 'poster':'', 'fanart_image':'', 'guiid':''})
  269. collections.append({'title':'In Progress Episodes' , 'sectype' : 'std.tvshows', 'section' : 'tvshows' , 'address' : __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port') , 'path' : '/mediabrowser/Users/' + userid + '/Items?Recursive=true&SortBy=DatePlayed&SortOrder=Descending&Fields=' + detailsString + '&Filters=IsResumable&IncludeItemTypes=Episode&format=json','thumb':'', 'poster':'', 'fanart_image':'', 'guiid':''})
  270. collections.append({'title':'Next Episodes' , 'sectype' : 'std.tvshows', 'section' : 'tvshows' , 'address' : __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port') , 'path' : '/mediabrowser/Shows/NextUp/?Userid=' + userid + '&Recursive=true&SortBy=DateCreated&Fields=' + detailsString + '&SortOrder=Descending&Filters=IsUnplayed,IsNotFolder&IsVirtualUnaired=false&IsMissing=False&IncludeItemTypes=Episode&format=json','thumb':'', 'poster':'', 'fanart_image':'', 'guiid':''})
  271. collections.append({'title':'Favorite Movies' , 'sectype' : 'std.movies', 'section' : 'movies' , 'address' : __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port') , 'path' : '/mediabrowser/Users/' + userid + '/Items?Recursive=true&SortBy=sortName&Fields=' + detailsString + '&SortOrder=Ascending&Filters=IsFavorite,IsNotFolder&IncludeItemTypes=Movie&format=json','thumb':'', 'poster':'', 'fanart_image':'', 'guiid':''})
  272. collections.append({'title':'Favorite Shows' , 'sectype' : 'std.tvshows', 'section' : 'tvshows' , 'address' : __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port') , 'path' : '/mediabrowser/Users/' + userid + '/Items?Recursive=true&SortBy=sortName&Fields=' + detailsString + '&SortOrder=Ascending&Filters=IsFavorite&IncludeItemTypes=Series&format=json','thumb':'', 'poster':'', 'fanart_image':'', 'guiid':''})
  273. collections.append({'title':'Favorite Episodes' , 'sectype' : 'std.tvshows', 'section' : 'tvshows' , 'address' : __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port') , 'path' : '/mediabrowser/Users/' + userid + '/Items?Recursive=true&SortBy=DateCreated&Fields=' + detailsString + '&SortOrder=Descending&Filters=IsNotFolder,IsFavorite&IncludeItemTypes=Episode&format=json','thumb':'', 'poster':'', 'fanart_image':'', 'guiid':''})
  274. collections.append({'title':'Frequent Played Albums' , 'sectype' : 'std.music', 'section' : 'music' , 'address' : __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port') , 'path' : '/mediabrowser/Users/' + userid + '/Items?Limit=' + __settings__.getSetting("numRecentMusic") + '&Recursive=true&SortBy=PlayCount&Fields=' + detailsString + '&SortOrder=Descending&Filters=IsPlayed&IncludeItemTypes=MusicAlbum&format=json','thumb':'', 'poster':'', 'fanart_image':'', 'guiid':''})
  275. collections.append({'title':'Upcoming TV' , 'sectype' : 'std.tvshows', 'section' : 'tvshows' , 'address' : __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port') , 'path' : '/mediabrowser/Users/' + userid + '/Items?Recursive=true&SortBy=PremiereDate&Fields=' + detailsString + '&SortOrder=Ascending&Filters=IsUnplayed&IsVirtualUnaired=true&IsNotFolder&IncludeItemTypes=Episode&format=json','thumb':'', 'poster':'', 'fanart_image':'', 'guiid':''})
  276. collections.append({'title':'BoxSets' , 'sectype' : 'std.movies', 'section' : 'movies' , 'address' : __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port') , 'path' : '/mediabrowser/Users/' + userid + '/Items?Recursive=true&SortBy=SortName&Fields=' + detailsString + '&SortOrder=Ascending&IncludeItemTypes=BoxSet&format=json','thumb':'', 'poster':'', 'fanart_image':'', 'guiid':''})
  277. collections.append({'title':'Trailers' , 'sectype' : 'std.movies', 'section' : 'movies' , 'address' : __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port') , 'path' : '/mediabrowser/Users/' + userid + '/Items?Recursive=true&SortBy=SortName&Fields=' + detailsString + '&SortOrder=Ascending&IncludeItemTypes=Trailer&format=json','thumb':'', 'poster':'', 'fanart_image':'', 'guiid':''})
  278. collections.append({'title':'Music Videos' , 'sectype' : 'std.music', 'section' : 'musicvideos' , 'address' : __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port') , 'path' : '/mediabrowser/Users/' + userid + '/Items?Recursive=true&SortBy=SortName&Fields=' + detailsString + '&SortOrder=Ascending&IncludeItemTypes=MusicVideo&format=json','thumb':'', 'poster':'', 'fanart_image':'', 'guiid':''})
  279. collections.append({'title':'Photos' , 'sectype' : 'std.photo', 'section' : 'photos' , 'address' : __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port') , 'path' : '/mediabrowser/Users/' + userid + '/Items?Recursive=true&SortBy=SortName&Fields=' + detailsString + '&SortOrder=Ascending&IncludeItemTypes=Photo&format=json','thumb':'', 'poster':'', 'fanart_image':'', 'guiid':''})
  280. collections.append({'title':'Unwatched Movies' , 'sectype' : 'std.movies', 'section' : 'movies' , 'address' : __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port') , 'path' : '/mediabrowser/Users/' + userid + '/Items?SortBy=SortName&Fields=' + detailsString + '&Recursive=true&SortOrder=Ascending&Filters=IsUnplayed&IncludeItemTypes=Movie&format=json' ,'thumb':'', 'poster':'', 'fanart_image':'', 'guiid':''})
  281. collections.append({'title':'Movie Genres' , 'sectype' : 'std.movies', 'section' : 'movies' , 'address' : __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port') , 'path' : '/mediabrowser/Genres?Userid=' + userid + '&SortBy=SortName&Fields=' + detailsString + '&SortOrder=Ascending&Recursive=true&IncludeItemTypes=Movie&format=json' ,'thumb':'', 'poster':'', 'fanart_image':'', 'guiid':''})
  282. collections.append({'title':'Movie Studios' , 'sectype' : 'std.movies', 'section' : 'movies' , 'address' : __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port') , 'path' : '/mediabrowser/Studios?Userid=' + userid + '&SortBy=SortName&Fields=' + detailsString + '&SortOrder=Ascending&Recursive=true&IncludeItemTypes=Movie&format=json' ,'thumb':'', 'poster':'', 'fanart_image':'', 'guiid':''})
  283. collections.append({'title':'Movie Actors' , 'sectype' : 'std.movies', 'section' : 'movies' , 'address' : __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port') , 'path' : '/mediabrowser/Persons?Userid=' + userid + '&SortBy=SortName&Fields=' + detailsString + '&SortOrder=Ascending&Recursive=true&IncludeItemTypes=Movie&format=json' ,'thumb':'', 'poster':'', 'fanart_image':'', 'guiid':''})
  284. collections.append({'title':'Unwatched Episodes' , 'sectype' : 'std.tvshows', 'section' : 'tvshows' , 'address' : __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port') , 'path' : '/mediabrowser/Users/' + userid + '/Items?Limit=50&Recursive=true&SortBy=DatePlayed&SortOrder=Descending&Fields=' + detailsString + '&Filters=IsUnplayed&IncludeItemTypes=Episode&format=json','thumb':'', 'poster':'', 'fanart_image':'', 'guiid':''})
  285. collections.append({'title':'TV Genres' , 'sectype' : 'std.tvshows', 'section' : 'tvshows' , 'address' : __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port') , 'path' : '/mediabrowser/Genres?Userid=' + userid + '&SortBy=SortName&Fields=' + detailsString + '&SortOrder=Ascending&Recursive=true&IncludeItemTypes=Series&format=json' ,'thumb':'', 'poster':'', 'fanart_image':'', 'guiid':''})
  286. collections.append({'title':'TV Networks' , 'sectype' : 'std.tvshows', 'section' : 'tvshows' , 'address' : __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port') , 'path' : '/mediabrowser/Studios?Userid=' + userid + '&SortBy=SortName&Fields=' + detailsString + '&SortOrder=Ascending&Recursive=true&IncludeItemTypes=Series&format=json' ,'thumb':'', 'poster':'', 'fanart_image':'', 'guiid':''})
  287. collections.append({'title':'TV Actors' , 'sectype' : 'std.tvshows', 'section' : 'tvshows' , 'address' : __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port') , 'path' : '/mediabrowser/Persons?Userid=' + userid + '&SortBy=SortName&Fields=' + detailsString + '&SortOrder=Ascending&Recursive=true&IncludeItemTypes=Series&format=json' ,'thumb':'', 'poster':'', 'fanart_image':'', 'guiid':''})
  288. collections.append({'title':'Playlists' , 'sectype' : 'std.playlists', 'section' : 'playlists' , 'address' : __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port') , 'path' : '/mediabrowser/Users/' + userid + '/Items?&SortBy=SortName&Fields=' + detailsString + '&Recursive=true&SortOrder=Ascending&IncludeItemTypes=Playlist&mediatype=video&format=json' ,'thumb':'', 'poster':'', 'fanart_image':'', 'guiid':''})
  289.  
  290. if xbmcVersionNum >= 13:
  291. collections.append({'title':'Search' , 'sectype' : 'std.search', 'section' : 'search' , 'address' : __settings__.getSetting('ipaddress')+":"+__settings__.getSetting('port') , 'path' : '/mediabrowser/Search/Hints?' + userid,'thumb':'', 'poster':'', 'fanart_image':'', 'guiid':''})
  292. collections.append({'title':'Set Views' , 'sectype' : 'std.setviews', 'section' : 'setviews' , 'address' : 'SETVIEWS', 'path': 'SETVIEWS', 'thumb':'', 'poster':'', 'fanart_image':'', 'guiid':''})
  293.  
  294. return collections
  295.  
  296. def markWatched (url):
  297. resp = requests.delete(url, data='', headers=getAuthHeader()) # mark unwatched first to reset any play position
  298. resp = requests.post(url, data='', headers=getAuthHeader())
  299. WINDOW = xbmcgui.Window( 10000 )
  300. WINDOW.setProperty("force_data_reload", "true")
  301. xbmc.executebuiltin("Container.Refresh")
  302.  
  303. def markUnwatched (url):
  304. resp = requests.delete(url, data='', headers=getAuthHeader())
  305. WINDOW = xbmcgui.Window( 10000 )
  306. WINDOW.setProperty("force_data_reload", "true")
  307. xbmc.executebuiltin("Container.Refresh")
  308.  
  309. def markFavorite (url):
  310. resp = requests.post(url, data='', headers=getAuthHeader())
  311. WINDOW = xbmcgui.Window( 10000 )
  312. WINDOW.setProperty("force_data_reload", "true")
  313. xbmc.executebuiltin("Container.Refresh")
  314.  
  315. def unmarkFavorite (url):
  316. resp = requests.delete(url, data='', headers=getAuthHeader())
  317. WINDOW = xbmcgui.Window( 10000 )
  318. WINDOW.setProperty("force_data_reload", "true")
  319. xbmc.executebuiltin("Container.Refresh")
  320.  
  321. def sortby ():
  322. sortOptions=["", "SortName","ProductionYear,SortName","PremiereDate,SortName","DateCreated,SortName","CriticRating,SortName","CommunityRating,SortName","PlayCount,SortName","Budget,SortName"]
  323. sortOptionsText=sortbyList
  324. return_value=xbmcgui.Dialog().select(__language__(30068),sortOptionsText)
  325. WINDOW = xbmcgui.Window( 10000 )
  326. __settings__.setSetting('sortbyfor'+urllib.quote(WINDOW.getProperty("heading")),sortOptions[return_value]+',SortName')
  327. newurl=re.sub("SortBy.*?&","SortBy="+ sortOptions[return_value] + "&",WINDOW.getProperty("currenturl"))
  328. WINDOW.setProperty("currenturl",newurl)
  329. u=urllib.quote(newurl)+'&mode=0'
  330. xbmc.executebuiltin("Container.Update(plugin://plugin.video.xbmb3c/?url="+u+",\"replace\")")#, WINDOW.getProperty('currenturl')
  331.  
  332. def genrefilter ():
  333. genreFilters=["","Action","Adventure","Animation","Crime","Comedy","Documentary","Drama","Fantasy","Foreign","History","Horror","Music","Musical","Mystery","Romance","Science%20Fiction","Short","Suspense","Thriller","Western"]
  334. genreFiltersText=genreList#["None","Action","Adventure","Animation","Crime","Comedy","Documentary","Drama","Fantasy","Foreign","History","Horror","Music","Musical","Mystery","Romance","Science Fiction","Short","Suspense","Thriller","Western"]
  335. return_value=xbmcgui.Dialog().select(__language__(30090),genreFiltersText)
  336. newurl=re.sub("Genres.*?&","Genres="+ genreFilters[return_value] + "&",WINDOW.getProperty("currenturl"))
  337. WINDOW.setProperty("currenturl",newurl)
  338. u=urllib.quote(newurl)+'&mode=0'
  339. xbmc.executebuiltin("Container.Update(plugin://plugin.video.xbmb3c/?url="+u+",\"replace\")")#, WINDOW.getProperty('currenturl')
  340.  
  341. def playall (startId):
  342. temp_list = xbmc.PlayList(xbmc.PLAYLIST_VIDEO)
  343. temp_list.clear()
  344. jsonData = downloadUtils.downloadUrl(WINDOW.getProperty("currenturl"))
  345. result = json.loads(jsonData)
  346. result = result.get("Items")
  347. found=0
  348. for item in result:
  349. if str(item.get('Id'))==startId:
  350. found=1
  351. if found==1:
  352. if(item.get('RecursiveItemCount')!=0):
  353. u=item.get('Path')
  354. if __settings__.getSetting('smbusername')=='':
  355. u=u.replace("\\\\","smb://")
  356. else:
  357. u=u.replace("\\\\","smb://"+__settings__.getSetting('smbusername')+':'+__settings__.getSetting('smbpassword')+'@')
  358. u=u.replace("\\","/")
  359. temp_list.add(u)
  360. xbmc.Player().play(temp_list)
  361. #Set a loop to wait for positive confirmation of playback
  362. count = 0
  363. while not xbmc.Player().isPlaying():
  364. printDebug( "Not playing yet...sleep for 2")
  365. count = count + 2
  366. if count >= 20:
  367. return
  368. else:
  369. time.sleep(2)
  370.  
  371. def sortorder ():
  372. WINDOW = xbmcgui.Window( 10000 )
  373. if(__settings__.getSetting('sortorderfor'+urllib.quote(WINDOW.getProperty("heading")))=="Ascending"):
  374. __settings__.setSetting('sortorderfor'+urllib.quote(WINDOW.getProperty("heading")),'Descending')
  375. newurl=re.sub("SortOrder.*?&","SortOrder=Descending&",WINDOW.getProperty("currenturl"))
  376. else:
  377. __settings__.setSetting('sortorderfor'+urllib.quote(WINDOW.getProperty("heading")),'Ascending')
  378. newurl=re.sub("SortOrder.*?&","SortOrder=Ascending&",WINDOW.getProperty("currenturl"))
  379. WINDOW.setProperty("currenturl",newurl)
  380. u=urllib.quote(newurl)+'&mode=0'
  381. xbmc.executebuiltin("Container.Update(plugin://plugin.video.xbmb3c/?url="+u+",\"replace\")")#, WINDOW.getProperty('currenturl')
  382.  
  383.  
  384. def delete (url):
  385. return_value = xbmcgui.Dialog().yesno(__language__(30091),__language__(30092))
  386. if return_value:
  387. printDebug('Deleting via URL: ' + url)
  388. progress = xbmcgui.DialogProgress()
  389. progress.create(__language__(30052), __language__(30053))
  390. resp = requests.delete(url, data='', headers=getAuthHeader())
  391. deleteSleep=0
  392. while deleteSleep<10:
  393. xbmc.sleep(1000)
  394. deleteSleep=deleteSleep+1
  395. progress.update(deleteSleep*10,__language__(30053))
  396. progress.close()
  397. xbmc.executebuiltin("Container.Refresh")
  398.  
  399. def addGUIItem( url, details, extraData, folder=True ):
  400.  
  401. printDebug("Adding GuiItem for [%s]" % details.get('title','Unknown'), level=2)
  402. printDebug("Passed details: " + str(details), level=2)
  403. printDebug("Passed extraData: " + str(extraData), level=2)
  404. #printDebug("urladdgui:" + str(url))
  405. if details.get('title','') == '':
  406. return
  407.  
  408. if extraData.get('mode',None) is None:
  409. mode="&mode=0"
  410. else:
  411. mode="&mode=%s" % extraData['mode']
  412.  
  413. # play or show info
  414. selectAction = __settings__.getSetting('selectAction')
  415.  
  416. #Create the URL to pass to the item
  417. if 'mediabrowser/Videos' in url:
  418. if(selectAction == "1"):
  419. u = sys.argv[0] + "?id=" + extraData.get('id') + "&mode=" + str(_MODE_ITEM_DETAILS)
  420. else:
  421. u = sys.argv[0] + "?url=" + url + '&mode=' + str(_MODE_BASICPLAY)
  422. elif 'mediabrowser/Search' in url:
  423. u = sys.argv[0]+"?url=" + url + '&mode=' + str(_MODE_SEARCH)
  424. elif 'SETVIEWS' in url:
  425. u = sys.argv[0]+"?url=" + url + '&mode=' + str(_MODE_SETVIEWS)
  426. elif url.startswith('http') or url.startswith('file'):
  427. u = sys.argv[0]+"?url="+urllib.quote(url)+mode
  428. elif 'PLAYLIST' in url:
  429. u = sys.argv[0]+"?url=" + url + '&mode=' + str(_MODE_PLAYLISTPLAY)
  430. else:
  431. if(selectAction == "1"):
  432. u = sys.argv[0] + "?id=" + extraData.get('id') + "&mode=" + str(_MODE_ITEM_DETAILS)
  433. else:
  434. u = sys.argv[0]+"?url=" + url + '&mode=' + str(_MODE_BASICPLAY)
  435.  
  436. #Create the ListItem that will be displayed
  437. thumbPath=str(extraData.get('thumb',''))
  438.  
  439. addCounts = __settings__.getSetting('addCounts') == 'true'
  440.  
  441. WINDOW = xbmcgui.Window( 10000 )
  442. if WINDOW.getProperty("addshowname") == "true":
  443. if extraData.get('locationtype')== "Virtual":
  444. listItemName = extraData.get('premieredate').decode("utf-8") + u" - " + details.get('SeriesName','').decode("utf-8") + u" - " + u"S" + details.get('season').decode("utf-8") + u"E" + details.get('title','Unknown').decode("utf-8")
  445. if(addCounts and extraData.get("RecursiveItemCount") != None and extraData.get("RecursiveUnplayedItemCount") != None):
  446. listItemName = listItemName + " (" + str(extraData.get("RecursiveItemCount") - extraData.get("RecursiveUnplayedItemCount")) + "/" + str(extraData.get("RecursiveItemCount")) + ")"
  447. list = xbmcgui.ListItem(listItemName, iconImage=thumbPath, thumbnailImage=thumbPath)
  448. else:
  449. if details.get('season') == None:
  450. season = '0'
  451. else:
  452. season = details.get('season')
  453. listItemName = details.get('SeriesName','').decode("utf-8") + u" - " + u"S" + season + u"E" + details.get('title','Unknown').decode("utf-8")
  454. if(addCounts and extraData.get("RecursiveItemCount") != None and extraData.get("RecursiveUnplayedItemCount") != None):
  455. listItemName = listItemName + " (" + str(extraData.get("RecursiveItemCount") - extraData.get("RecursiveUnplayedItemCount")) + "/" + str(extraData.get("RecursiveItemCount")) + ")"
  456. list = xbmcgui.ListItem(listItemName, iconImage=thumbPath, thumbnailImage=thumbPath)
  457. else:
  458. listItemName = details.get('title','Unknown').decode("utf-8")
  459. if(addCounts and extraData.get("RecursiveItemCount") != None and extraData.get("RecursiveUnplayedItemCount") != None):
  460. listItemName = listItemName + " (" + str(extraData.get("RecursiveItemCount") - extraData.get("RecursiveUnplayedItemCount")) + "/" + str(extraData.get("RecursiveItemCount")) + ")"
  461. list = xbmcgui.ListItem(listItemName, iconImage=thumbPath, thumbnailImage=thumbPath)
  462. printDebug("Setting thumbnail as " + thumbPath, level=2)
  463.  
  464. # calculate percentage
  465. cappedPercentage = None
  466. if (extraData.get('resumetime') != None and int(extraData.get('resumetime')) > 0):
  467. duration = float(extraData.get('duration'))
  468. if(duration > 0):
  469. resume = float(extraData.get('resumetime')) / 60.0
  470. percentage = int((resume / duration) * 100.0)
  471. cappedPercentage = percentage - (percentage % 10)
  472. if(cappedPercentage == 0):
  473. cappedPercentage = 10
  474. if(cappedPercentage == 100):
  475. cappedPercentage = 90
  476. list.setProperty("complete_percentage", str(cappedPercentage))
  477.  
  478. # add resume percentage text to titles
  479. addResumePercent = __settings__.getSetting('addResumePercent') == 'true'
  480. if (addResumePercent and details.get('title') != None and cappedPercentage != None):
  481. details['title'] = details.get('title') + " (" + str(cappedPercentage) + "%)"
  482.  
  483. #Set the properties of the item, such as summary, name, season, etc
  484. #list.setInfo( type=extraData.get('type','Video'), infoLabels=details )
  485.  
  486. #For all end items
  487. if ( not folder):
  488. #list.setProperty('IsPlayable', 'true')
  489. if extraData.get('type','video').lower() == "video":
  490. list.setProperty('TotalTime', str(extraData.get('duration')))
  491. list.setProperty('ResumeTime', str(extraData.get('resumetime')))
  492.  
  493. artTypes=['poster', 'tvshow.poster', 'fanart_image', 'clearlogo', 'discart', 'banner', 'clearart', 'landscape', 'small_poster']
  494.  
  495. for artType in artTypes:
  496. imagePath=str(extraData.get(artType,''))
  497. list=setArt(list,artType, imagePath)
  498. printDebug( "Setting " + artType + " as " + imagePath, level=2)
  499.  
  500. menuItems = addContextMenu(details, extraData, folder)
  501. if(len(menuItems) > 0):
  502. list.addContextMenuItems( menuItems, g_contextReplace )
  503.  
  504. # new way
  505. videoInfoLabels = {}
  506.  
  507. if(extraData.get('type') == None or extraData.get('type') == "Video"):
  508. videoInfoLabels.update(details)
  509. else:
  510. list.setInfo( type = extraData.get('type','Video'), infoLabels = details )
  511.  
  512. videoInfoLabels["duration"] = extraData.get("duration")
  513. videoInfoLabels["playcount"] = extraData.get("playcount")
  514. if (extraData.get('favorite') == 'true'):
  515. videoInfoLabels["top250"] = "1"
  516.  
  517. videoInfoLabels["mpaa"] = extraData.get('mpaa')
  518. videoInfoLabels["rating"] = extraData.get('rating')
  519. videoInfoLabels["director"] = extraData.get('director')
  520. videoInfoLabels["writer"] = extraData.get('writer')
  521. videoInfoLabels["year"] = extraData.get('year')
  522. videoInfoLabels["studio"] = extraData.get('studio')
  523. videoInfoLabels["genre"] = extraData.get('genre')
  524.  
  525. videoInfoLabels["episode"] = details.get('episode')
  526. videoInfoLabels["season"] = details.get('season')
  527.  
  528. list.setInfo('video', videoInfoLabels)
  529.  
  530. list.addStreamInfo('video', {'duration': extraData.get('duration'), 'aspect': extraData.get('aspectratio'),'codec': extraData.get('videocodec'), 'width' : extraData.get('width'), 'height' : extraData.get('height')})
  531. list.addStreamInfo('audio', {'codec': extraData.get('audiocodec'),'channels': extraData.get('channels')})
  532.  
  533. list.setProperty('CriticRating', str(extraData.get('criticrating')))
  534. list.setProperty('ItemType', extraData.get('itemtype'))
  535. if extraData.get('totaltime') != None:
  536. list.setProperty('TotalTime', extraData.get('totaltime'))
  537. if extraData.get('TotalSeasons')!=None:
  538. list.setProperty('TotalSeasons',extraData.get('TotalSeasons'))
  539. if extraData.get('TotalEpisodes')!=None:
  540. list.setProperty('TotalEpisodes',extraData.get('TotalEpisodes'))
  541. if extraData.get('WatchedEpisodes')!=None:
  542. list.setProperty('WatchedEpisodes',extraData.get('WatchedEpisodes'))
  543. if extraData.get('UnWatchedEpisodes')!=None:
  544. list.setProperty('UnWatchedEpisodes',extraData.get('UnWatchedEpisodes'))
  545. if extraData.get('NumEpisodes')!=None:
  546. list.setProperty('NumEpisodes',extraData.get('NumEpisodes'))
  547.  
  548. #old way
  549. '''
  550. list.setInfo('video', {'duration' : extraData.get('duration')})
  551. list.setInfo('video', {'playcount' : extraData.get('playcount')})
  552. list.setProperty('CriticRating', str(extraData.get('criticrating')))
  553. if extraData.get('favorite')=='true':
  554. list.setInfo('video', {'top250' : '1'})
  555. if extraData.get('totaltime') != None:
  556. list.setProperty('TotalTime', extraData.get('totaltime'))
  557. #list.setProperty('ResumeTime', str(int(extraData.get('resumetime'))/60))
  558. list.setInfo('video', {'director' : extraData.get('director')})
  559. list.setInfo('video', {'writer' : extraData.get('writer')})
  560. list.setInfo('video', {'year' : extraData.get('year')})
  561. list.setInfo('video', {'studio' : extraData.get('studio')})
  562. list.setInfo('video', {'genre' : extraData.get('genre')})
  563. if extraData.get('cast')!=None:
  564. list.setInfo('video', {'cast' : tuple(extraData.get('cast'))}) #--- Broken in Frodo
  565. #list.setInfo('video', {'castandrole' : extraData.get('cast')}) --- Broken in Frodo
  566. #list.setInfo('video', {'plotoutline' : extraData.get('cast')}) # Hack to get cast data into skin
  567. list.setInfo('video', {'episode': details.get('episode')})
  568. list.setInfo('video', {'season': details.get('season')})
  569. if extraData.get('TotalSeasons')!=None:
  570. list.setProperty('TotalSeasons',extraData.get('TotalSeasons'))
  571. if extraData.get('TotalEpisodes')!=None:
  572. list.setProperty('TotalEpisodes',extraData.get('TotalEpisodes'))
  573. if extraData.get('WatchedEpisodes')!=None:
  574. list.setProperty('WatchedEpisodes',extraData.get('WatchedEpisodes'))
  575. if extraData.get('UnWatchedEpisodes')!=None:
  576. list.setProperty('UnWatchedEpisodes',extraData.get('UnWatchedEpisodes'))
  577. if extraData.get('NumEpisodes')!=None:
  578. list.setProperty('NumEpisodes',extraData.get('NumEpisodes'))
  579. list.setInfo('video', {'mpaa': extraData.get('mpaa')})
  580. list.setInfo('video', {'rating': extraData.get('rating')})
  581. watched = extraData.get('watchedurl')
  582. if watched != None:
  583. list.setProperty('watchedurl', extraData.get('watchedurl'))
  584. list.addStreamInfo('video', {'duration': extraData.get('duration'), 'aspect': extraData.get('aspectratio'),'codec': extraData.get('videocodec'), 'width' : extraData.get('width'), 'height' : extraData.get('height')})
  585. list.addStreamInfo('audio', {'codec': extraData.get('audiocodec'),'channels': extraData.get('channels')})
  586. '''
  587.  
  588. pluginCastLink = "plugin://plugin.video.xbmb3c?mode=" + str(_MODE_CAST_LIST) + "&id=" + str(extraData.get('id'))
  589. list.setProperty('CastPluginLink', pluginCastLink)
  590. list.setProperty('ItemGUID', extraData.get('guiid'))
  591. list.setProperty('Video3DFormat', details.get('Video3DFormat'))
  592.  
  593. return (u, list, folder)
  594.  
  595.  
  596. def addGUIItemPi( url, details, extraData, folder=True ):
  597.  
  598. printDebug("Adding GuiItem for [%s]" % details.get('title','Unknown'), level=2)
  599. printDebug("Passed details: " + str(details), level=2)
  600. printDebug("Passed extraData: " + str(extraData), level=2)
  601. #printDebug("urladdgui:" + str(url))
  602. if details.get('title','') == '':
  603. return
  604.  
  605. if extraData.get('mode',None) is None:
  606. mode="&mode=0"
  607. else:
  608. mode="&mode=%s" % extraData['mode']
  609.  
  610. # play or show info
  611. selectAction = __settings__.getSetting('selectAction')
  612.  
  613. #Create the URL to pass to the item
  614. if 'mediabrowser/Videos' in url:
  615. if(selectAction == "1"):
  616. u = sys.argv[0] + "?id=" + extraData.get('id') + "&mode=" + str(_MODE_ITEM_DETAILS)
  617. else:
  618. u = sys.argv[0] + "?url=" + url + '&mode=' + str(_MODE_BASICPLAY)
  619. elif 'mediabrowser/Search' in url:
  620. u = sys.argv[0]+"?url=" + url + '&mode=' + str(_MODE_SEARCH)
  621. elif 'SETVIEWS' in url:
  622. u = sys.argv[0]+"?url=" + url + '&mode=' + str(_MODE_SETVIEWS)
  623. elif url.startswith('http') or url.startswith('file'):
  624. u = sys.argv[0]+"?url="+urllib.quote(url)+mode
  625. elif 'PLAYLIST' in url:
  626. u = sys.argv[0]+"?url=" + url + '&mode=' + str(_MODE_PLAYLISTPLAY)
  627. else:
  628. if(selectAction == "1"):
  629. u = sys.argv[0] + "?id=" + extraData.get('id') + "&mode=" + str(_MODE_ITEM_DETAILS)
  630. else:
  631. u = sys.argv[0]+"?url=" + url + '&mode=' + str(_MODE_BASICPLAY)
  632.  
  633. #Create the ListItem that will be displayed
  634. thumbPath=str(extraData.get('thumb',''))
  635.  
  636. addCounts = __settings__.getSetting('addCounts') == 'true'
  637.  
  638. WINDOW = xbmcgui.Window( 10000 )
  639. if WINDOW.getProperty("addshowname") == "true":
  640. if extraData.get('locationtype')== "Virtual":
  641. listItemName = extraData.get('premieredate').decode("utf-8") + u" - " + details.get('SeriesName','').decode("utf-8") + u" - " + u"S" + details.get('season').decode("utf-8") + u"E" + details.get('title','Unknown').decode("utf-8")
  642. if(addCounts and extraData.get("RecursiveItemCount") != None and extraData.get("RecursiveUnplayedItemCount") != None):
  643. listItemName = listItemName + " (" + str(extraData.get("RecursiveItemCount") - extraData.get("RecursiveUnplayedItemCount")) + "/" + str(extraData.get("RecursiveItemCount")) + ")"
  644. list = xbmcgui.ListItem(listItemName, iconImage=thumbPath, thumbnailImage=thumbPath)
  645. else:
  646. if details.get('season') == None:
  647. season = '0'
  648. else:
  649. season = details.get('season')
  650. listItemName = details.get('SeriesName','').decode("utf-8") + u" - " + u"S" + season + u"E" + details.get('title','Unknown').decode("utf-8")
  651. if(addCounts and extraData.get("RecursiveItemCount") != None and extraData.get("RecursiveUnplayedItemCount") != None):
  652. listItemName = listItemName + " (" + str(extraData.get("RecursiveItemCount") - extraData.get("RecursiveUnplayedItemCount")) + "/" + str(extraData.get("RecursiveItemCount")) + ")"
  653. list = xbmcgui.ListItem(listItemName, iconImage=thumbPath, thumbnailImage=thumbPath)
  654. else:
  655. listItemName = details.get('title','Unknown').decode("utf-8")
  656. if(addCounts and extraData.get("RecursiveItemCount") != None and extraData.get("RecursiveUnplayedItemCount") != None):
  657. listItemName = listItemName + " (" + str(extraData.get("RecursiveItemCount") - extraData.get("RecursiveUnplayedItemCount")) + "/" + str(extraData.get("RecursiveItemCount")) + ")"
  658. list = xbmcgui.ListItem(listItemName, iconImage=thumbPath, thumbnailImage=thumbPath)
  659. printDebug("Setting thumbnail as " + thumbPath, level=2)
  660.  
  661. # calculate percentage
  662. cappedPercentage = None
  663. if (extraData.get('resumetime') != None and int(extraData.get('resumetime')) > 0):
  664. duration = float(extraData.get('duration'))
  665. if(duration > 0):
  666. resume = float(extraData.get('resumetime')) / 60.0
  667. percentage = int((resume / duration) * 100.0)
  668. cappedPercentage = percentage - (percentage % 10)
  669. if(cappedPercentage == 0):
  670. cappedPercentage = 10
  671. if(cappedPercentage == 100):
  672. cappedPercentage = 90
  673. list.setProperty("complete_percentage", str(cappedPercentage))
  674.  
  675. # add resume percentage text to titles
  676. addResumePercent = __settings__.getSetting('addResumePercent') == 'true'
  677. if (addResumePercent and details.get('title') != None and cappedPercentage != None):
  678. details['title'] = details.get('title') + " (" + str(cappedPercentage) + "%)"
  679.  
  680. #Set the properties of the item, such as summary, name, season, etc
  681. #list.setInfo( type=extraData.get('type','Video'), infoLabels=details )
  682.  
  683. #For all end items
  684. if ( not folder):
  685. #list.setProperty('IsPlayable', 'true')
  686. if extraData.get('type','video').lower() == "video":
  687. list.setProperty('TotalTime', str(extraData.get('duration')))
  688. list.setProperty('ResumeTime', str(extraData.get('resumetime')))
  689.  
  690. artTypes=['poster', 'tvshow.poster', 'fanart_image', 'clearlogo', 'discart', 'banner', 'clearart', 'landscape', 'small_poster']
  691.  
  692. for artType in artTypes:
  693. imagePath=str(extraData.get(artType,''))
  694. list=setArt(list,artType, imagePath)
  695. printDebug( "Setting " + artType + " as " + imagePath, level=2)
  696.  
  697. menuItems = addContextMenu(details, extraData, folder)
  698. if(len(menuItems) > 0):
  699. list.addContextMenuItems( menuItems, g_contextReplace )
  700.  
  701. # new way
  702. videoInfoLabels = {}
  703.  
  704. if(extraData.get('type') == None or extraData.get('type') == "Video"):
  705. videoInfoLabels.update(details)
  706. else:
  707. list.setInfo( type = extraData.get('type','Video'), infoLabels = details )
  708.  
  709. videoInfoLabels["episode"] = details.get('episode')
  710. videoInfoLabels["season"] = details.get('season')
  711.  
  712. list.setInfo('video', videoInfoLabels)
  713.  
  714. list.addStreamInfo('video', {'duration': extraData.get('duration'), 'aspect': extraData.get('aspectratio'),'codec': extraData.get('videocodec'), 'width' : extraData.get('width'), 'height' : extraData.get('height')})
  715. list.addStreamInfo('audio', {'codec': extraData.get('audiocodec'),'channels': extraData.get('channels')})
  716.  
  717. list.setProperty('CriticRating', str(extraData.get('criticrating')))
  718. list.setProperty('ItemType', extraData.get('itemtype'))
  719. if extraData.get('totaltime') != None:
  720. list.setProperty('TotalTime', extraData.get('totaltime'))
  721. if extraData.get('TotalSeasons')!=None:
  722. list.setProperty('TotalSeasons',extraData.get('TotalSeasons'))
  723. if extraData.get('TotalEpisodes')!=None:
  724. list.setProperty('TotalEpisodes',extraData.get('TotalEpisodes'))
  725. if extraData.get('WatchedEpisodes')!=None:
  726. list.setProperty('WatchedEpisodes',extraData.get('WatchedEpisodes'))
  727. if extraData.get('UnWatchedEpisodes')!=None:
  728. list.setProperty('UnWatchedEpisodes',extraData.get('UnWatchedEpisodes'))
  729. if extraData.get('NumEpisodes')!=None:
  730. list.setProperty('NumEpisodes',extraData.get('NumEpisodes'))
  731.  
  732. pluginCastLink = "plugin://plugin.video.xbmb3c?mode=" + str(_MODE_CAST_LIST) + "&id=" + str(extraData.get('id'))
  733. list.setProperty('CastPluginLink', pluginCastLink)
  734. list.setProperty('ItemGUID', extraData.get('guiid'))
  735. list.setProperty('Video3DFormat', details.get('Video3DFormat'))
  736. return (u, list, folder)
  737.  
  738.  
  739.  
  740.  
  741. def addContextMenu(details, extraData, folder):
  742. printDebug("Building Context Menus", level=2)
  743. commands = []
  744. watched = extraData.get('watchedurl')
  745. if watched != None:
  746. scriptToRun = PLUGINPATH + "/default.py"
  747.  
  748. pluginCastLink = "XBMC.Container.Update(plugin://plugin.video.xbmb3c?mode=" + str(_MODE_CAST_LIST) + "&id=" + str(extraData.get('id')) + ")"
  749. commands.append(( "Show People", pluginCastLink))
  750.  
  751. if extraData.get("playcount") == "0":
  752. argsToPass = 'markWatched,' + extraData.get('watchedurl')
  753. commands.append(( __language__(30093), "XBMC.RunScript(" + scriptToRun + ", " + argsToPass + ")"))
  754. else:
  755. argsToPass = 'markUnwatched,' + extraData.get('watchedurl')
  756. commands.append(( __language__(30094), "XBMC.RunScript(" + scriptToRun + ", " + argsToPass + ")"))
  757. if extraData.get('favorite') != 'true':
  758. argsToPass = 'markFavorite,' + extraData.get('favoriteurl')
  759. commands.append(( __language__(30095), "XBMC.RunScript(" + scriptToRun + ", " + argsToPass + ")"))
  760. else:
  761. argsToPass = 'unmarkFavorite,' + extraData.get('favoriteurl')
  762. commands.append(( __language__(30096), "XBMC.RunScript(" + scriptToRun + ", " + argsToPass + ")"))
  763.  
  764. argsToPass = 'sortby'
  765. commands.append(( __language__(30097), "XBMC.RunScript(" + scriptToRun + ", " + argsToPass + ")"))
  766.  
  767. if 'Ascending' in WINDOW.getProperty("currenturl"):
  768. argsToPass = 'sortorder'
  769. commands.append(( __language__(30098), "XBMC.RunScript(" + scriptToRun + ", " + argsToPass + ")"))
  770. else:
  771. argsToPass = 'sortorder'
  772. commands.append(( __language__(30099), "XBMC.RunScript(" + scriptToRun + ", " + argsToPass + ")"))
  773.  
  774. argsToPass = 'genrefilter'
  775. commands.append(( __language__(30040), "XBMC.RunScript(" + scriptToRun + ", " + argsToPass + ")"))
  776.  
  777. if not folder:
  778. argsToPass = 'playall,' + extraData.get('id')
  779. commands.append(( __language__(30041), "XBMC.RunScript(" + scriptToRun + ", " + argsToPass + ")"))
  780.  
  781. argsToPass = 'refresh'
  782. commands.append(( __language__(30042), "XBMC.RunScript(" + scriptToRun + ", " + argsToPass + ")"))
  783.  
  784. argsToPass = 'delete,' + extraData.get('deleteurl')
  785. commands.append(( __language__(30043), "XBMC.RunScript(" + scriptToRun + ", " + argsToPass + ")"))
  786.  
  787. if extraData.get('itemtype') == 'Trailer':
  788. commands.append(( __language__(30046),"XBMC.RunPlugin(%s)" % CP_ADD_URL % details.get('title')))
  789.  
  790. return(commands)
  791.  
  792. def getDetailsString():
  793. detailsString = "EpisodeCount,SeasonCount,Path,Genres,Studios,CumulativeRunTimeTicks"
  794. if(__settings__.getSetting('includeStreamInfo') == "true"):
  795. detailsString += ",MediaStreams"
  796. if(__settings__.getSetting('includePeople') == "true"):
  797. detailsString += ",People"
  798. if(__settings__.getSetting('includeOverview') == "true"):
  799. detailsString += ",Overview"
  800. return (detailsString)
  801.  
  802. def displaySections( filter=None ):
  803. printDebug("== ENTER: displaySections() ==")
  804. xbmcplugin.setContent(pluginhandle, 'files')
  805.  
  806. dirItems = []
  807. userid = downloadUtils.getUserId()
  808. extraData = { 'fanart_image' : '' ,
  809. 'type' : "Video" ,
  810. 'thumb' : '' }
  811.  
  812. # Add collections
  813. detailsString=getDetailsString()
  814. collections = getCollections(detailsString)
  815. for collection in collections:
  816. details = {'title' : collection.get('title', 'Unknown') }
  817. path = collection['path']
  818. extraData['mode'] = _MODE_MOVIES
  819. extraData['thumb'] = collection['thumb']
  820. extraData['poster'] = collection['poster']
  821. extraData['fanart_image'] = collection['fanart_image']
  822. extraData['guiid'] = collection['guiid']
  823. s_url = 'http://%s%s' % ( collection['address'], path)
  824. printDebug("addGUIItem:" + str(s_url) + str(details) + str(extraData))
  825. dirItems.append(addGUIItem(s_url, details, extraData))
  826.  
  827. #All XML entries have been parsed and we are ready to allow the user to browse around. So end the screen listing.
  828. xbmcplugin.addDirectoryItems(pluginhandle, dirItems)
  829. xbmcplugin.endOfDirectory(pluginhandle,cacheToDisc=False)
  830.  
  831. def skin( filter=None, shared=False ):
  832. printDebug("== ENTER: skin() ==")
  833.  
  834. checkServer()
  835.  
  836. #Get the global host variable set in settings
  837. WINDOW = xbmcgui.Window( 10000 )
  838. sectionCount=0
  839. usrMoviesCount=0
  840. usrMusicCount=0
  841. usrTVshowsCount=0
  842. stdMoviesCount=0
  843. stdTVshowsCount=0
  844. stdMusicCount=0
  845. stdPhotoCount=0
  846. stdChannelsCount=0
  847. stdPlaylistsCount=0
  848. stdSearchCount=0
  849. dirItems = []
  850.  
  851. das_host = __settings__.getSetting('ipaddress')
  852. das_port =__settings__.getSetting('port')
  853.  
  854. allSections = getCollections(getDetailsString())
  855.  
  856. for section in allSections:
  857.  
  858. details={'title' : section.get('title', 'Unknown') }
  859.  
  860. extraData={ 'fanart_image' : '' ,
  861. 'type' : "Video" ,
  862. 'thumb' : '' ,
  863. 'token' : section.get('token',None) }
  864. path=section['path']
  865.  
  866. mode=_MODE_MOVIES
  867. window="VideoLibrary"
  868.  
  869. extraData['mode']=mode
  870. modeurl="&mode=0"
  871. s_url='http://%s%s' % ( section['address'], path)
  872. murl= "?url="+urllib.quote(s_url)+modeurl
  873. searchurl = "?url="+urllib.quote(s_url)+"&mode=2"
  874.  
  875. #Build that listing..
  876. total = section.get('total')
  877. if (total == None):
  878. total = 0
  879. WINDOW.setProperty("xbmb3c.%d.title" % (sectionCount) , section.get('title', 'Unknown'))
  880. WINDOW.setProperty("xbmb3c.%d.path" % (sectionCount) , "ActivateWindow("+window+",plugin://plugin.video.xbmb3c/" + murl+",return)")
  881. WINDOW.setProperty("xbmb3c.%d.type" % (sectionCount) , section.get('section'))
  882. WINDOW.setProperty("xbmb3c.%d.total" % (sectionCount) , str(total))
  883. if section.get('sectype')=='movies':
  884. WINDOW.setProperty("xbmb3c.usr.movies.%d.title" % (usrMoviesCount) , section.get('title', 'Unknown'))
  885. WINDOW.setProperty("xbmb3c.usr.movies.%d.path" % (usrMoviesCount) , "ActivateWindow("+window+",plugin://plugin.video.xbmb3c/" + murl+",return)")
  886. WINDOW.setProperty("xbmb3c.usr.movies.%d.type" % (usrMoviesCount) , section.get('section'))
  887. WINDOW.setProperty("xbmb3c.usr.movies.%d.content" % (usrMoviesCount) , "plugin://plugin.video.xbmb3c/" + murl)
  888. printDebug("xbmb3c.usr.movies.%d.title" % (usrMoviesCount) + "title is:" + section.get('title', 'Unknown'))
  889. printDebug("xbmb3c.usr.movies.%d.type" % (usrMoviesCount) + "section is:" + section.get('section'))
  890. usrMoviesCount += 1
  891. elif section.get('sectype')=='tvshows':
  892. WINDOW.setProperty("xbmb3c.usr.tvshows.%d.title" % (usrTVshowsCount) , section.get('title', 'Unknown'))
  893. WINDOW.setProperty("xbmb3c.usr.tvshows.%d.path" % (usrTVshowsCount) , "ActivateWindow("+window+",plugin://plugin.video.xbmb3c/" + murl+",return)")
  894. WINDOW.setProperty("xbmb3c.usr.tvshows.%d.type" % (usrTVshowsCount) , section.get('section'))
  895. WINDOW.setProperty("xbmb3c.usr.tvshows.%d.content" % (usrTVshowsCount) , "plugin://plugin.video.xbmb3c/" + murl)
  896. printDebug("xbmb3c.usr.tvshows.%d.title" % (usrTVshowsCount) + "title is:" + section.get('title', 'Unknown'))
  897. printDebug("xbmb3c.usr.tvshows.%d.type" % (usrTVshowsCount) + "section is:" + section.get('section'))
  898. usrTVshowsCount +=1
  899. elif section.get('sectype')=='music':
  900. WINDOW.setProperty("xbmb3c.usr.music.%d.title" % (usrMusicCount) , section.get('title', 'Unknown'))
  901. WINDOW.setProperty("xbmb3c.usr.music.%d.path" % (usrMusicCount) , "ActivateWindow("+window+",plugin://plugin.video.xbmb3c/" + murl+",return)")
  902. WINDOW.setProperty("xbmb3c.usr.music.%d.type" % (usrMusicCount) , section.get('section'))
  903. WINDOW.setProperty("xbmb3c.usr.music.%d.content" % (usrMusicCount) , "plugin://plugin.video.xbmb3c/" + murl)
  904. printDebug("xbmb3c.usr.music.%d.title" % (usrMusicCount) + "title is:" + section.get('title', 'Unknown'))
  905. printDebug("xbmb3c.usr.music.%d.type" % (usrMusicCount) + "section is:" + section.get('section'))
  906. usrMusicCount +=1
  907. elif section.get('sectype')=='std.movies':
  908. WINDOW.setProperty("xbmb3c.std.movies.%d.title" % (stdMoviesCount) , section.get('title', 'Unknown'))
  909. WINDOW.setProperty("xbmb3c.std.movies.%d.path" % (stdMoviesCount) , "ActivateWindow("+window+",plugin://plugin.video.xbmb3c/" + murl+",return)")
  910. WINDOW.setProperty("xbmb3c.std.movies.%d.type" % (stdMoviesCount) , section.get('section'))
  911. WINDOW.setProperty("xbmb3c.std.movies.%d.content" % (stdMoviesCount) , "plugin://plugin.video.xbmb3c/" + murl)
  912. printDebug("xbmb3c.std.movies.%d.title" % (stdMoviesCount) + "title is:" + section.get('title', 'Unknown'))
  913. printDebug("xbmb3c.std.movies.%d.type" % (stdMoviesCount) + "section is:" + section.get('section'))
  914. stdMoviesCount +=1
  915. elif section.get('sectype')=='std.tvshows':
  916. WINDOW.setProperty("xbmb3c.std.tvshows.%d.title" % (stdTVshowsCount) , section.get('title', 'Unknown'))
  917. WINDOW.setProperty("xbmb3c.std.tvshows.%d.path" % (stdTVshowsCount) , "ActivateWindow("+window+",plugin://plugin.video.xbmb3c/" + murl+",return)")
  918. WINDOW.setProperty("xbmb3c.std.tvshows.%d.type" % (stdTVshowsCount) , section.get('section'))
  919. WINDOW.setProperty("xbmb3c.std.tvshows.%d.content" % (stdTVshowsCount) , "plugin://plugin.video.xbmb3c/" + murl)
  920. printDebug("xbmb3c.std.tvshows.%d.title" % (stdTVshowsCount) + "title is:" + section.get('title', 'Unknown'))
  921. printDebug("xbmb3c.std.tvshows.%d.type" % (stdTVshowsCount) + "section is:" + section.get('section'))
  922. stdTVshowsCount +=1
  923. elif section.get('sectype')=='std.music':
  924. WINDOW.setProperty("xbmb3c.std.music.%d.title" % (stdMusicCount) , section.get('title', 'Unknown'))
  925. WINDOW.setProperty("xbmb3c.std.music.%d.path" % (stdMusicCount) , "ActivateWindow("+window+",plugin://plugin.video.xbmb3c/" + murl+",return)")
  926. WINDOW.setProperty("xbmb3c.std.music.%d.type" % (stdMusicCount) , section.get('section'))
  927. WINDOW.setProperty("xbmb3c.std.music.%d.content" % (stdMusicCount) , "plugin://plugin.video.xbmb3c/" + murl)
  928. printDebug("xbmb3c.std.music.%d.title" % (stdMusicCount) + "title is:" + section.get('title', 'Unknown'))
  929. printDebug("xbmb3c.std.music.%d.type" % (stdMusicCount) + "section is:" + section.get('section'))
  930. stdMusicCount +=1
  931. elif section.get('sectype')=='std.photo':
  932. WINDOW.setProperty("xbmb3c.std.photo.%d.title" % (stdPhotoCount) , section.get('title', 'Unknown'))
  933. WINDOW.setProperty("xbmb3c.std.photo.%d.path" % (stdPhotoCount) , "ActivateWindow("+window+",plugin://plugin.video.xbmb3c/" + murl+",return)")
  934. WINDOW.setProperty("xbmb3c.std.photo.%d.type" % (stdPhotoCount) , section.get('section'))
  935. WINDOW.setProperty("xbmb3c.std.photo.%d.content" % (stdPhotoCount) , "plugin://plugin.video.xbmb3c/" + murl)
  936. printDebug("xbmb3c.std.photo.%d.title" % (stdPhotoCount) + "title is:" + section.get('title', 'Unknown'))
  937. printDebug("xbmb3c.std.photo.%d.type" % (stdPhotoCount) + "section is:" + section.get('section'))
  938. stdPhotoCount +=1
  939. elif section.get('sectype')=='std.channels':
  940. WINDOW.setProperty("xbmb3c.std.channels.%d.title" % (stdChannelsCount) , section.get('title', 'Unknown'))
  941. WINDOW.setProperty("xbmb3c.std.channels.%d.path" % (stdChannelsCount) , "ActivateWindow("+window+",plugin://plugin.video.xbmb3c/" + murl+",return)")
  942. WINDOW.setProperty("xbmb3c.std.channels.%d.type" % (stdChannelsCount) , section.get('section'))
  943. WINDOW.setProperty("xbmb3c.std.channels.%d.content" % (stdChannelsCount) , "plugin://plugin.video.xbmb3c/" + murl)
  944. printDebug("xbmb3c.std.channels.%d.title" % (stdChannelsCount) + "title is:" + section.get('title', 'Unknown'))
  945. printDebug("xbmb3c.std.channels.%d.type" % (stdChannelsCount) + "section is:" + section.get('section'))
  946. stdChannelsCount +=1
  947. elif section.get('sectype')=='std.playlists':
  948. WINDOW.setProperty("xbmb3c.std.playlists.%d.title" % (stdPlaylistsCount) , section.get('title', 'Unknown'))
  949. WINDOW.setProperty("xbmb3c.std.playlists.%d.path" % (stdPlaylistsCount) , "ActivateWindow("+window+",plugin://plugin.video.xbmb3c/" + murl+",return)")
  950. WINDOW.setProperty("xbmb3c.std.playlists.%d.type" % (stdPlaylistsCount) , section.get('section'))
  951. WINDOW.setProperty("xbmb3c.std.playlists.%d.content" % (stdPlaylistsCount) , "plugin://plugin.video.xbmb3c/" + murl)
  952. printDebug("xbmb3c.std.playlists.%d.title" % (stdPlaylistsCount) + "title is:" + section.get('title', 'Unknown'))
  953. printDebug("xbmb3c.std.playlists.%d.type" % (stdPlaylistsCount) + "section is:" + section.get('section'))
  954. stdPlaylistsCount +=1
  955. elif section.get('sectype')=='std.search':
  956. WINDOW.setProperty("xbmb3c.std.search.%d.title" % (stdSearchCount) , section.get('title', 'Unknown'))
  957. WINDOW.setProperty("xbmb3c.std.search.%d.path" % (stdSearchCount) , "ActivateWindow("+window+",plugin://plugin.video.xbmb3c/" + searchurl+",return)")
  958. WINDOW.setProperty("xbmb3c.std.search.%d.type" % (stdSearchCount) , section.get('section'))
  959. printDebug("xbmb3c.std.search.%d.title" % (stdSearchCount) + "title is:" + section.get('title', 'Unknown'))
  960. printDebug("xbmb3c.std.search.%d.type" % (stdSearchCount) + "section is:" + section.get('section'))
  961. stdSearchCount +=1 #printDebug("Building window properties index [" + str(sectionCount) + "] which is [" + section.get('title').encode('utf-8') + " section - " + section.get('section') + " total - " + str(total) + "]")
  962. printDebug("PATH in use is: ActivateWindow("+window+",plugin://plugin.video.xbmb3c/" + murl+",return)")
  963. sectionCount += 1
  964.  
  965. def remove_html_tags( data ):
  966. p = re.compile(r'<.*?>')
  967. return p.sub('', data)
  968.  
  969.  
  970. def PLAY( url, handle ):
  971. printDebug("== ENTER: PLAY ==")
  972. url=urllib.unquote(url)
  973.  
  974. #server,id=url.split(',;')
  975. urlParts = url.split(',;')
  976. xbmc.log("PLAY ACTION URL PARTS : " + str(urlParts))
  977. server = urlParts[0]
  978. id = urlParts[1]
  979. autoResume = 0
  980. if(len(urlParts) > 2):
  981. autoResume = int(urlParts[2])
  982. xbmc.log("PLAY ACTION URL AUTO RESUME : " + str(autoResume))
  983.  
  984. ip,port = server.split(':')
  985. userid = downloadUtils.getUserId()
  986. seekTime = 0
  987. resume = 0
  988.  
  989. jsonData = downloadUtils.downloadUrl("http://" + server + "/mediabrowser/Users/" + userid + "/Items/" + id + "?format=json", suppress=False, popup=1 )
  990. printDebug("Play jsonData: " + jsonData)
  991. result = json.loads(jsonData)
  992.  
  993. playurl = PlayUtils().getPlayUrl(server, id, result)
  994. printDebug("Play URL: " + playurl)
  995. thumbID = id if(result.get("Type") != "Episode") else result.get("SeriesId")
  996. imageTag = "" if(result.get("ImageTags") == None or result.get("ImageTags").get("Primary") == None) else result.get("ImageTags").get("Primary")
  997. thumbPath = "http://localhost:15001/?id=" + str(thumbID) + "&type=Primary&tag=" + imageTag
  998. listItem = xbmcgui.ListItem(path=playurl, iconImage=thumbPath, thumbnailImage=thumbPath)
  999. setListItemProps(server, id, listItem, result)
  1000.  
  1001. # Can not play virtual items
  1002. if (result.get("LocationType") == "Virtual") or (result.get("IsPlaceholder")=="true"):
  1003. xbmcgui.Dialog().ok(__language__(30128), __language__(30129))
  1004. return
  1005.  
  1006. watchedurl = 'http://' + server + '/mediabrowser/Users/'+ userid + '/PlayedItems/' + id
  1007. positionurl = 'http://' + server + '/mediabrowser/Users/'+ userid + '/PlayingItems/' + id
  1008. deleteurl = 'http://' + server + '/mediabrowser/Items/' + id
  1009.  
  1010. if(autoResume != 0):
  1011. if(autoResume == -1):
  1012. resume_result = 1
  1013. else:
  1014. resume_result = 0
  1015. seekTime = (autoResume / 1000) / 10000
  1016. else:
  1017. userData = result.get("UserData")
  1018. resume_result = 0
  1019. if userData.get("PlaybackPositionTicks") != 0 and __settings__.getSetting('transcode') == 'false':
  1020. reasonableTicks = int(userData.get("PlaybackPositionTicks")) / 1000
  1021. seekTime = reasonableTicks / 10000
  1022. displayTime = str(datetime.timedelta(seconds=seekTime))
  1023. display_list = [ "Resume from " + displayTime, "Start from beginning"]
  1024. resumeScreen = xbmcgui.Dialog()
  1025. resume_result = resumeScreen.select('Resume', display_list)
  1026. if resume_result == -1:
  1027. return
  1028.  
  1029. # set the current playing info
  1030. WINDOW = xbmcgui.Window( 10000 )
  1031. WINDOW.setProperty("watchedurl", watchedurl)
  1032. WINDOW.setProperty("positionurl", positionurl)
  1033. WINDOW.setProperty("deleteurl", "")
  1034. if result.get("Type")=="Episode" and __settings__.getSetting("offerDelete")=="true":
  1035. WINDOW.setProperty("deleteurl", deleteurl)
  1036.  
  1037. WINDOW.setProperty("runtimeticks", str(result.get("RunTimeTicks")))
  1038. WINDOW.setProperty("item_id", id)
  1039.  
  1040. xbmc.Player().play(playurl, listItem)
  1041. printDebug( "Sent the following url to the xbmc player: "+str(playurl))
  1042.  
  1043. #Set a loop to wait for positive confirmation of playback
  1044. count = 0
  1045. while not xbmc.Player().isPlaying():
  1046. printDebug( "Not playing yet...sleep for 1 sec")
  1047. count = count + 1
  1048. if count >= 10:
  1049. return
  1050. else:
  1051. time.sleep(1)
  1052.  
  1053. if resume_result == 0:
  1054. jumpBackSec = int(__settings__.getSetting("resumeJumpBack"))
  1055. seekToTime = seekTime - jumpBackSec
  1056. while xbmc.Player().getTime() < (seekToTime - 5):
  1057. xbmc.Player().pause
  1058. xbmc.sleep(100)
  1059. xbmc.Player().seekTime(seekToTime)
  1060. xbmc.sleep(100)
  1061. xbmc.Player().play()
  1062. return
  1063.  
  1064. def PLAYPlaylist( url, handle ):
  1065. printDebug("== ENTER: PLAY Playlist ==")
  1066. url=urllib.unquote(url)
  1067.  
  1068. #server,id=url.split(',;')
  1069. urlParts = url.split(',;')
  1070. xbmc.log("PLAY Playlist ACTION URL PARTS : " + str(urlParts))
  1071. server = urlParts[0]
  1072. id = urlParts[1]
  1073. ip,port = server.split(':')
  1074. userid = downloadUtils.getUserId()
  1075. seekTime = 0
  1076. resume = 0
  1077.  
  1078. jsonData = downloadUtils.downloadUrl("http://" + server + "/mediabrowser/Playlists/" + id + "/Items/?fields=path&format=json", suppress=False, popup=1 )
  1079. printDebug("Playlist jsonData: " + jsonData)
  1080. result = json.loads(jsonData)
  1081. playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO)
  1082. playlist.clear()
  1083.  
  1084. for item in result.get("Items"):
  1085. id = item.get("Id")
  1086. jsonData = downloadUtils.downloadUrl("http://" + server + "/mediabrowser/Users/" + userid + "/Items/" + id + "?format=json", suppress=False, popup=1 )
  1087. result = json.loads(jsonData)
  1088. autoResume = 0
  1089. playurl = PlayUtils().getPlayUrl(server, id, result)
  1090. printDebug("Play URL: " + playurl)
  1091. thumbID = id if(result.get("Type") != "Episode") else result.get("SeriesId")
  1092. imageTag = "" if(result.get("ImageTags") == None or result.get("ImageTags").get("Primary") == None) else result.get("ImageTags").get("Primary")
  1093. thumbPath = "http://localhost:15001/?id=" + str(thumbID) + "&type=Primary&tag=" + imageTag
  1094. listItem = xbmcgui.ListItem(path=playurl, iconImage=thumbPath, thumbnailImage=thumbPath)
  1095. setListItemProps(server, id, listItem, result)
  1096.  
  1097. # Can not play virtual items
  1098. if (result.get("LocationType") == "Virtual") or (result.get("IsPlaceholder")=="true"):
  1099. xbmcgui.Dialog().ok(__language__(30128), __language__(30129))
  1100. return
  1101.  
  1102. watchedurl = 'http://' + server + '/mediabrowser/Users/'+ userid + '/PlayedItems/' + id
  1103. positionurl = 'http://' + server + '/mediabrowser/Users/'+ userid + '/PlayingItems/' + id
  1104. deleteurl = 'http://' + server + '/mediabrowser/Items/' + id
  1105.  
  1106. if(autoResume != 0):
  1107. if(autoResume == -1):
  1108. resume_result = 1
  1109. else:
  1110. resume_result = 0
  1111. seekTime = (autoResume / 1000) / 10000
  1112. else:
  1113. userData = result.get("UserData")
  1114. resume_result = 0
  1115. if userData.get("PlaybackPositionTicks") != 0 and __settings__.getSetting('transcode') == 'false':
  1116. reasonableTicks = int(userData.get("PlaybackPositionTicks")) / 1000
  1117. seekTime = reasonableTicks / 10000
  1118. displayTime = str(datetime.timedelta(seconds=seekTime))
  1119. display_list = [ "Resume from " + displayTime, "Start from beginning"]
  1120. resumeScreen = xbmcgui.Dialog()
  1121. resume_result = resumeScreen.select('Resume', display_list)
  1122. if resume_result == -1:
  1123. return
  1124.  
  1125. # set the current playing info
  1126. WINDOW = xbmcgui.Window( 10000 )
  1127. WINDOW.setProperty("watchedurl", watchedurl)
  1128. WINDOW.setProperty("positionurl", positionurl)
  1129. WINDOW.setProperty("deleteurl", "")
  1130. if result.get("Type")=="Episode" and __settings__.getSetting("offerDelete")=="true":
  1131. WINDOW.setProperty("deleteurl", deleteurl)
  1132.  
  1133. WINDOW.setProperty("runtimeticks", str(result.get("RunTimeTicks")))
  1134. WINDOW.setProperty("item_id", id)
  1135.  
  1136. playlist.add(playurl, listItem)
  1137.  
  1138. xbmc.Player().play(playlist)
  1139. printDebug( "Sent the following playlist url to the xbmc player: "+str(playurl))
  1140.  
  1141. #Set a loop to wait for positive confirmation of playback
  1142. count = 0
  1143. while not xbmc.Player().isPlaying():
  1144. printDebug( "Not playing playlist yet...sleep for 1 sec")
  1145. count = count + 1
  1146. if count >= 10:
  1147. return
  1148. else:
  1149. time.sleep(1)
  1150.  
  1151. if resume_result == 0:
  1152. jumpBackSec = int(__settings__.getSetting("resumeJumpBack"))
  1153. seekToTime = seekTime - jumpBackSec
  1154. while xbmc.Player().getTime() < (seekToTime - 5):
  1155. xbmc.Player().pause
  1156. xbmc.sleep(100)
  1157. xbmc.Player().seekTime(seekToTime)
  1158. xbmc.sleep(100)
  1159. xbmc.Player().play()
  1160. return
  1161.  
  1162. def setListItemProps(server, id, listItem,result):
  1163. # set up item and item info
  1164. userid = downloadUtils.getUserId()
  1165. thumbID = id
  1166. eppNum = -1
  1167. seasonNum = -1
  1168. tvshowTitle = ""
  1169. if(result.get("Type") == "Episode"):
  1170. thumbID = result.get("SeriesId")
  1171. seasonNum = result.get("ParentIndexNumber")
  1172. eppNum = result.get("IndexNumber")
  1173. tvshowTitle = result.get("SeriesName")
  1174. seriesJsonData = downloadUtils.downloadUrl("http://" + server + "/mediabrowser/Users/" + userid + "/Items/" + thumbID + "?format=json", suppress=False, popup=1 )
  1175. seriesResult = json.loads(seriesJsonData)
  1176. resultForType=seriesResult
  1177. else:
  1178. resultForType=result
  1179.  
  1180. # get image tags
  1181.  
  1182. if result.get("ImageTags") != None:
  1183. posterTag = "" if result.get("ImageTags").get("Primary") == None else result.get("ImageTags").get("Primary")
  1184. clearArtTag = "" if result.get("ImageTags").get("Logo") == None else result.get("ImageTags").get("Logo")
  1185. discArtTag = "" if result.get("ImageTags").get("Disc") == None else result.get("ImageTags").get("Disc")
  1186. fanArtTag = "" if result.get("ImageTags").get("Backdrop") == None else result.get("ImageTags").get("Backdrop")
  1187.  
  1188. setArt(listItem,'poster', "http://localhost:15001/?id=" + str(thumbID) + "&type=Primary&tag=" + posterTag)
  1189. setArt(listItem,'tvshow.poster', "http://localhost:15001/?id=" + str(thumbID) + "&type=Primary&tag=" + posterTag)
  1190. setArt(listItem,'clearart', "http://localhost:15001/?id=" + str(thumbID) + "&type=Logo&tag=" + clearArtTag)
  1191. setArt(listItem,'tvshow.clearart', "http://localhost:15001/?id=" + str(thumbID) + "&type=Logo&tag=" + clearArtTag)
  1192. setArt(listItem,'discart', "http://localhost:15001/?id=" + str(thumbID) + "&type=Disc&tag=" + discArtTag)
  1193. setArt(listItem,'fanart_image', "http://localhost:15001/?id=" + str(thumbID) + "&type=Backdrop&tag=" + fanArtTag)
  1194.  
  1195. listItem.setProperty('IsPlayable', 'true')
  1196. listItem.setProperty('IsFolder', 'false')
  1197.  
  1198. studio = ""
  1199. studios = resultForType.get("Studios")
  1200. if(studios != None):
  1201. for studio_string in studios:
  1202. if studio=="": #Just take the first one
  1203. temp=studio_string.get("Name")
  1204. studio=temp.encode('utf-8')
  1205. listItem.setInfo('video', {'studio' : studio})
  1206.  
  1207. # plsy info
  1208. playinformation = ''
  1209. if PlayUtils().isDirectPlay(result) == True:
  1210. playinformation = 'Direct Play'
  1211. else:
  1212. playinformation = 'Transcoding'
  1213. details = {
  1214. 'title' : result.get("Name", "Missing Name").encode('utf-8') + ' - ' + playinformation,
  1215. 'plot' : result.get("Overview")
  1216. }
  1217.  
  1218. if(eppNum > -1):
  1219. details["episode"] = str(eppNum)
  1220.  
  1221. if(seasonNum > -1):
  1222. details["season"] = str(seasonNum)
  1223.  
  1224. if tvshowTitle != None:
  1225. details["TVShowTitle"] = tvshowTitle
  1226.  
  1227. listItem.setInfo( "Video", infoLabels=details )
  1228.  
  1229. # Process People
  1230. director=''
  1231. writer=''
  1232. people = result.get("People")
  1233. if(people != None):
  1234. for person in people:
  1235. if(person.get("Type") == "Director"):
  1236. director = director + person.get("Name") + ' '
  1237. if(person.get("Type") == "Writing"):
  1238. writer = person.get("Name")
  1239. if(person.get("Type") == "Writer"):
  1240. writer = person.get("Name")
  1241.  
  1242. # Process Genres
  1243. genre = ""
  1244. genres = result.get("Genres")
  1245. if(genres != None):
  1246. for genre_string in genres:
  1247. if genre == "": #Just take the first genre
  1248. genre = genre_string
  1249. else:
  1250. genre = genre + " / " + genre_string
  1251.  
  1252. listItem.setInfo('video', {'director' : director})
  1253. listItem.setInfo('video', {'writer' : writer})
  1254. listItem.setInfo('video', {'mpaa': resultForType.get("OfficialRating")})
  1255. listItem.setInfo('video', {'genre': genre})
  1256.  
  1257. return
  1258.  
  1259. def get_params( paramstring ):
  1260. printDebug("Parameter string: " + paramstring, level=2)
  1261. param={}
  1262. if len(paramstring)>=2:
  1263. params=paramstring
  1264.  
  1265. if params[0] == "?":
  1266. cleanedparams=params[1:]
  1267. else:
  1268. cleanedparams=params
  1269.  
  1270. if (params[len(params)-1]=='/'):
  1271. params=params[0:len(params)-2]
  1272.  
  1273. pairsofparams=cleanedparams.split('&')
  1274. for i in range(len(pairsofparams)):
  1275. splitparams={}
  1276. splitparams=pairsofparams[i].split('=')
  1277. if (len(splitparams))==2:
  1278. param[splitparams[0]]=splitparams[1]
  1279. elif (len(splitparams))==3:
  1280. param[splitparams[0]]=splitparams[1]+"="+splitparams[2]
  1281. printDebug("XBMB3C -> Detected parameters: " + str(param), level=2)
  1282. return param
  1283.  
  1284. def getCacheValidator (server,url):
  1285. parsedserver,parsedport = server.split(':')
  1286. userid = downloadUtils.getUserId()
  1287. idAndOptions = url.split("ParentId=")
  1288. id = idAndOptions[1].split("&")
  1289. jsonData = downloadUtils.downloadUrl("http://"+server+"/mediabrowser/Users/" + userid + "/Items/" +id[0]+"?format=json", suppress=False, popup=1 )
  1290. result = json.loads(jsonData)
  1291. userData = result.get("UserData")
  1292. printDebug ("RecursiveItemCount: " + str(result.get("RecursiveItemCount")))
  1293. printDebug ("UnplayedItemCount: " + str(userData.get("UnplayedItemCount")))
  1294. printDebug ("PlayedPercentage: " + str(userData.get("PlayedPercentage")))
  1295.  
  1296. playedPercentage = 0.0
  1297. if(userData.get("PlayedPercentage") != None):
  1298. playedPercentage = userData.get("PlayedPercentage")
  1299.  
  1300. playedTime = "{0:09.6f}".format(playedPercentage)
  1301. playedTime = playedTime.replace(".","-")
  1302. validatorString=""
  1303. if result.get("RecursiveItemCount") != None:
  1304. if int(result.get("RecursiveItemCount"))<=25:
  1305. validatorString='nocache'
  1306. else:
  1307. validatorString = str(result.get("RecursiveItemCount")) + "_" + str(userData.get("UnplayedItemCount")) + "_" + playedTime
  1308. printDebug ("getCacheValidator : " + validatorString)
  1309. return validatorString
  1310.  
  1311. def getAllMoviesCacheValidator (server,url):
  1312. parsedserver,parsedport = server.split(':')
  1313. userid = downloadUtils.getUserId()
  1314. jsonData = downloadUtils.downloadUrl("http://"+server+"/mediabrowser/Users/" + userid + "/Views?format=json", suppress=False, popup=1 )
  1315. alldata = json.loads(jsonData)
  1316. validatorString = ""
  1317. playedTime = ""
  1318. playedPercentage = 0.0
  1319.  
  1320. result=alldata.get("Items")
  1321. for item in result:
  1322. if item.get("Name")=="Movies":
  1323. userData = item.get("UserData")
  1324. printDebug ("RecursiveItemCount: " + str(item.get("RecursiveItemCount")))
  1325. printDebug ("RecursiveUnplayedCount: " + str(userData.get("UnplayedItemCount")))
  1326. printDebug ("RecursiveUnplayedCount: " + str(userData.get("PlayedPercentage")))
  1327.  
  1328. if(userData.get("PlayedPercentage") != None):
  1329. playedPercentage = userData.get("PlayedPercentage")
  1330.  
  1331. playedTime = "{0:09.6f}".format(playedPercentage)
  1332. playedTime = playedTime.replace(".","-")
  1333.  
  1334. if item.get("RecursiveItemCount") != None:
  1335. if int(item.get("RecursiveItemCount"))<=25:
  1336. validatorString='nocache'
  1337. else:
  1338. validatorString = "allmovies_" + str(item.get("RecursiveItemCount")) + "_" + str(userData.get("UnplayedItemCount")) + "_" + playedTime
  1339. printDebug ("getAllMoviesCacheValidator : " + validatorString)
  1340. return validatorString
  1341.  
  1342. def getCacheValidatorFromData(result):
  1343. result = result.get("Items")
  1344. if(result == None):
  1345. result = []
  1346.  
  1347. itemCount = 0
  1348. unwatchedItemCount = 0
  1349. totalPlayedPercentage = 0
  1350. for item in result:
  1351. userData = item.get("UserData")
  1352. if(userData != None):
  1353. if(item.get("IsFolder") == False):
  1354. itemCount = itemCount + 1
  1355. if userData.get("Played") == False:
  1356. unwatchedItemCount = unwatchedItemCount + 1
  1357. itemPossition = userData.get("PlaybackPositionTicks")
  1358. itemRuntime = item.get("RunTimeTicks")
  1359. if(itemRuntime != None and itemPossition != None):
  1360. itemPercent = float(itemPossition) / float(itemRuntime)
  1361. totalPlayedPercentage = totalPlayedPercentage + itemPercent
  1362. else:
  1363. totalPlayedPercentage = totalPlayedPercentage + 100
  1364. else:
  1365. itemCount = itemCount + item.get("RecursiveItemCount")
  1366. unwatchedItemCount = unwatchedItemCount + userData.get("UnplayedItemCount")
  1367. PlayedPercentage=userData.get("PlayedPercentage")
  1368. if PlayedPercentage==None:
  1369. PlayedPercentage=0
  1370. totalPlayedPercentage = totalPlayedPercentage + (item.get("RecursiveItemCount") * PlayedPercentage)
  1371.  
  1372. if(itemCount == 0):
  1373. totalPlayedPercentage = 0.0
  1374. else:
  1375. totalPlayedPercentage = totalPlayedPercentage / float(itemCount)
  1376.  
  1377. playedTime = "{0:09.6f}".format(totalPlayedPercentage)
  1378. playedTime = playedTime.replace(".","-")
  1379. validatorString = "_" + str(itemCount) + "_" + str(unwatchedItemCount) + "_" + playedTime
  1380. printDebug ("getCacheValidatorFromData : " + validatorString)
  1381. return validatorString
  1382.  
  1383. def getContent( url ):
  1384. '''
  1385. This function takes the URL, gets the XML and determines what the content is
  1386. This XML is then redirected to the best processing function.
  1387. If a search term is detected, then show keyboard and run search query
  1388. @input: URL of XML page
  1389. @return: nothing, redirects to another function
  1390. '''
  1391. global viewType
  1392. printDebug("== ENTER: getContent ==")
  1393. server=getServerFromURL(url)
  1394. lastbit=url.split('/')[-1]
  1395. printDebug("URL suffix: " + str(lastbit))
  1396. printDebug("server: " + str(server))
  1397. printDebug("URL: " + str(url))
  1398. validator='nocache' #Don't cache special queries (recently added etc)
  1399. if "Parent" in url:
  1400. validator = "_" + getCacheValidator(server,url)
  1401. elif "&SortOrder=Ascending&IncludeItemTypes=Movie" in url:
  1402. validator = "_" + getAllMoviesCacheValidator(server,url)
  1403.  
  1404. # ADD VALIDATOR TO FILENAME TO DETERMINE IF CACHE IS FRESH
  1405.  
  1406. m = hashlib.md5()
  1407. m.update(url)
  1408. urlHash = m.hexdigest()
  1409.  
  1410. jsonData = ""
  1411. cacheDataPath = __addondir__ + urlHash + validator
  1412.  
  1413. if "NextUp" in url and __settings__.getSetting('sortNextUp') == "true":
  1414. xbmcplugin.addSortMethod(pluginhandle, xbmcplugin.SORT_METHOD_TITLE)
  1415. else:
  1416. xbmcplugin.addSortMethod(pluginhandle, xbmcplugin.SORT_METHOD_NONE)
  1417. result = None
  1418.  
  1419. WINDOW = xbmcgui.Window( 10000 )
  1420. force_data_reload = WINDOW.getProperty("force_data_reload")
  1421. WINDOW.setProperty("force_data_reload", "false")
  1422.  
  1423. progress = None
  1424. if(__settings__.getSetting('showLoadProgress') == "true"):
  1425. progress = xbmcgui.DialogProgress()
  1426. progress.create(__language__(30121))
  1427. progress.update(0, __language__(30122))
  1428.  
  1429. # if a cached file exists use it
  1430. # if one does not exist then load data from the url
  1431. if(os.path.exists(cacheDataPath)) and validator != 'nocache' and force_data_reload != "true":
  1432. cachedfie = open(cacheDataPath, 'r')
  1433. jsonData = cachedfie.read()
  1434. cachedfie.close()
  1435. printDebug("Data Read From Cache : " + cacheDataPath)
  1436. if(progress != None):
  1437. progress.update(0, __language__(30123))
  1438. try:
  1439. result = loadJasonData(jsonData)
  1440. except:
  1441. printDebug("Json load failed from cache data")
  1442. result = []
  1443. dataLen = len(result)
  1444. printDebug("Json Load Result : " + str(dataLen))
  1445. if(dataLen == 0):
  1446. result = None
  1447.  
  1448. # if there was no cache data for the cache data was not valid then try to load it again
  1449. if(result == None):
  1450. r = glob.glob(__addondir__ + urlHash + "*")
  1451. for i in r:
  1452. os.remove(i)
  1453. printDebug("No Cache Data, download data now")
  1454. if(progress != None):
  1455. progress.update(0, __language__(30124))
  1456. jsonData = downloadUtils.downloadUrl(url, suppress=False, popup=1 )
  1457. if(progress != None):
  1458. progress.update(0, __language__(30123))
  1459. try:
  1460. result = loadJasonData(jsonData)
  1461. except:
  1462. xbmc.log("Json load failed from downloaded data")
  1463. result = []
  1464. dataLen = len(result)
  1465. printDebug("Json Load Result : " + str(dataLen))
  1466. if(dataLen > 0 and validator != 'nocache'):
  1467. cacheValidationString = getCacheValidatorFromData(result)
  1468. printDebug("getCacheValidator : " + validator)
  1469. printDebug("getCacheValidatorFromData : " + cacheValidationString)
  1470. if(validator == cacheValidationString):
  1471. printDebug("Validator String Match, Saving Cache Data")
  1472. cacheDataPath = __addondir__ + urlHash + cacheValidationString
  1473. printDebug("Saving data to cache : " + cacheDataPath)
  1474. cachedfie = open(cacheDataPath, 'w')
  1475. cachedfie.write(jsonData)
  1476. cachedfie.close()
  1477. elif("allmovies" in validator):
  1478. printDebug("All Movies Cache")
  1479. cacheDataPath = __addondir__ + urlHash + validator
  1480. printDebug("Saving data to cache : " + cacheDataPath)
  1481. cachedfie = open(cacheDataPath, 'w')
  1482. cachedfie.write(jsonData)
  1483. cachedfie.close()
  1484. if jsonData == "":
  1485. if(progress != None):
  1486. progress.close()
  1487. return
  1488.  
  1489. printDebug("JSON DATA: " + str(result), level=2)
  1490. if "Search" in url:
  1491. dirItems = processSearch(url, result, progress)
  1492. elif "Channel" in url:
  1493. dirItems = processChannels(url, result, progress)
  1494. elif "&IncludeItemTypes=Playlist" in url:
  1495. dirItems = processPlaylists(url, result, progress)
  1496. elif "/mediabrowser/Genres?" in url and "&IncludeItemTypes=Movie" in url:
  1497. dirItems = processGenres(url, result, progress, "Movie")
  1498. elif "/mediabrowser/Genres?" in url and "&IncludeItemTypes=Series" in url:
  1499. dirItems = processGenres(url, result, progress, "Series")
  1500. elif "/mediabrowser/Studios?" in url and "&IncludeItemTypes=Movie" in url:
  1501. dirItems = processStudios(url, result, progress, "Movie")
  1502. elif "/mediabrowser/Studios?" in url and "&IncludeItemTypes=Series" in url:
  1503. dirItems = processStudios(url, result, progress, "Series")
  1504. elif "/mediabrowser/Persons?" in url and "&IncludeItemTypes=Movie" in url:
  1505. dirItems = processPeople(url, result, progress, "Movie")
  1506. elif "/mediabrowser/Persons?" in url and "&IncludeItemTypes=Series" in url:
  1507. dirItems = processPeople(url, result, progress, "Series")
  1508. else:
  1509. dirItems = processDirectory(url, result, progress)
  1510. xbmcplugin.addDirectoryItems(pluginhandle, dirItems)
  1511.  
  1512. if("viewType" in globals()):
  1513. if __settings__.getSetting(xbmc.getSkinDir()+ '_VIEW' + viewType) != "":
  1514. xbmc.executebuiltin("Container.SetViewMode(%s)" % int(__settings__.getSetting(xbmc.getSkinDir()+ '_VIEW' + viewType)))
  1515.  
  1516. xbmcplugin.endOfDirectory(pluginhandle, cacheToDisc=False)
  1517.  
  1518. if(progress != None):
  1519. progress.update(100, __language__(30125))
  1520. progress.close()
  1521.  
  1522. return
  1523.  
  1524. def loadJasonData(jsonData):
  1525. return json.loads(jsonData)
  1526.  
  1527. def processDirectoryOld(url, results, progress):
  1528. global viewType
  1529. cast=['None']
  1530. printDebug("== ENTER: processDirectory ==")
  1531. parsed = urlparse(url)
  1532. parsedserver,parsedport=parsed.netloc.split(':')
  1533. userid = downloadUtils.getUserId()
  1534. printDebug("Processing secondary menus")
  1535. xbmcplugin.setContent(pluginhandle, 'movies')
  1536.  
  1537. server = getServerFromURL(url)
  1538. setWindowHeading(url)
  1539.  
  1540. detailsString = "Path,Genres,Studios,CumulativeRunTimeTicks"
  1541. if(__settings__.getSetting('includeStreamInfo') == "true"):
  1542. detailsString += ",MediaStreams"
  1543. if(__settings__.getSetting('includePeople') == "true"):
  1544. detailsString += ",People"
  1545. if(__settings__.getSetting('includeOverview') == "true"):
  1546. detailsString += ",Overview"
  1547.  
  1548. dirItems = []
  1549. result = results.get("Items")
  1550. if(result == None):
  1551. result = []
  1552. if len(result) == 1 and __settings__.getSetting('autoEnterSingle') == "true":
  1553. if result[0].get("Type") == "Season":
  1554. jsonData = downloadUtils.downloadUrl("http://" + server + "/mediabrowser/Users/" + userid + "/items?ParentId=" + result[0].get("Id") + '&IsVirtualUnAired=false&IsMissing=false&Fields=' + detailsString + '&SortBy=SortName&format=json', suppress=False, popup=1 )
  1555. results = json.loads(jsonData)
  1556. result=results.get("Items")
  1557. item_count = len(result)
  1558. current_item = 1;
  1559.  
  1560. for item in result:
  1561.  
  1562. if(progress != None):
  1563. percentDone = (float(current_item) / float(item_count)) * 100
  1564. progress.update(int(percentDone), __language__(30126) + str(current_item))
  1565. current_item = current_item + 1
  1566.  
  1567. if(item.get("Name") != None):
  1568. tempTitle = item.get("Name").encode('utf-8')
  1569. else:
  1570. tempTitle = "Missing Title"
  1571.  
  1572. id = str(item.get("Id")).encode('utf-8')
  1573. guiid = id
  1574. isFolder = item.get("IsFolder")
  1575.  
  1576. item_type = str(item.get("Type")).encode('utf-8')
  1577.  
  1578. tempEpisode = ""
  1579. if (item.get("IndexNumber") != None):
  1580. episodeNum = item.get("IndexNumber")
  1581. if episodeNum < 10:
  1582. tempEpisode = "0" + str(episodeNum)
  1583. else:
  1584. tempEpisode = str(episodeNum)
  1585.  
  1586. tempSeason = ""
  1587. if (str(item.get("ParentIndexNumber")) != None):
  1588. tempSeason = str(item.get("ParentIndexNumber"))
  1589. if item.get("ParentIndexNumber") < 10:
  1590. tempSeason = "0" + tempSeason
  1591.  
  1592. viewType=""
  1593. if item.get("Type") == "Movie":
  1594. xbmcplugin.setContent(pluginhandle, 'movies')
  1595. viewType="_MOVIES"
  1596. elif item.get("Type") == "BoxSet":
  1597. xbmcplugin.setContent(pluginhandle, 'movies')
  1598. viewType="_BOXSETS"
  1599. elif item.get("Type") == "Trailer":
  1600. xbmcplugin.setContent(pluginhandle, 'movies')
  1601. viewType="_TRAILERS"
  1602. elif item.get("Type") == "Series":
  1603. xbmcplugin.setContent(pluginhandle, 'tvshows')
  1604. viewType="_SERIES"
  1605. elif item.get("Type") == "Season":
  1606. xbmcplugin.setContent(pluginhandle, 'seasons')
  1607. viewType="_SEASONS"
  1608. elif item.get("Type") == "Episode":
  1609. prefix=''
  1610. if __settings__.getSetting('addSeasonNumber') == 'true':
  1611. prefix = "S" + str(tempSeason)
  1612. if __settings__.getSetting('addEpisodeNumber') == 'true':
  1613. prefix = prefix + "E"
  1614. #prefix = str(tempEpisode)
  1615. if __settings__.getSetting('addEpisodeNumber') == 'true':
  1616. prefix = prefix + str(tempEpisode)
  1617. if prefix != '':
  1618. tempTitle = prefix + ' - ' + tempTitle
  1619. xbmcplugin.setContent(pluginhandle, 'episodes')
  1620. viewType="_EPISODES"
  1621. guiid = item.get("Id")
  1622. elif item.get("Type") == "MusicArtist":
  1623. xbmcplugin.setContent(pluginhandle, 'songs')
  1624. viewType='_MUSICARTISTS'
  1625. elif item.get("Type") == "MusicAlbum":
  1626. xbmcplugin.setContent(pluginhandle, 'songs')
  1627. viewType='_MUSICTALBUMS'
  1628. elif item.get("Type") == "Audio":
  1629. xbmcplugin.setContent(pluginhandle, 'songs')
  1630. viewType='_MUSICTRACKS'
  1631.  
  1632. if(item.get("PremiereDate") != None):
  1633. premieredatelist = (item.get("PremiereDate")).split("T")
  1634. premieredate = premieredatelist[0]
  1635. else:
  1636. premieredate = ""
  1637.  
  1638. # add the premiered date for Upcoming TV
  1639. if item.get("LocationType") == "Virtual":
  1640. airtime = item.get("AirTime")
  1641. tempTitle = tempTitle + ' - ' + str(premieredate) + ' - ' + str(airtime)
  1642.  
  1643. #Add show name to special TV collections RAL, NextUp etc
  1644. WINDOW = xbmcgui.Window( 10000 )
  1645. if WINDOW.getProperty("addshowname") == "true":
  1646. tempTitle=item.get("SeriesName").encode('utf-8') + " - " + tempTitle
  1647. else:
  1648. tempTitle=tempTitle
  1649.  
  1650. # Process MediaStreams
  1651. channels = ''
  1652. videocodec = ''
  1653. audiocodec = ''
  1654. height = ''
  1655. width = ''
  1656. aspectratio = '1:1'
  1657. aspectfloat = 1.85
  1658. mediaStreams = item.get("MediaStreams")
  1659. if(mediaStreams != None):
  1660. for mediaStream in mediaStreams:
  1661. if(mediaStream.get("Type") == "Video"):
  1662. videocodec = mediaStream.get("Codec")
  1663. height = str(mediaStream.get("Height"))
  1664. width = str(mediaStream.get("Width"))
  1665. aspectratio = mediaStream.get("AspectRatio")
  1666. if aspectratio != None and len(aspectratio) >= 3:
  1667. try:
  1668. aspectwidth,aspectheight = aspectratio.split(':')
  1669. aspectfloat = float(aspectwidth) / float(aspectheight)
  1670. except:
  1671. aspectfloat = 1.85
  1672. if(mediaStream.get("Type") == "Audio"):
  1673. audiocodec = mediaStream.get("Codec")
  1674. channels = mediaStream.get("Channels")
  1675.  
  1676. # Process People
  1677. director=''
  1678. writer=''
  1679. cast=[]
  1680. people = item.get("People")
  1681. if(people != None):
  1682. for person in people:
  1683. if(person.get("Type") == "Director"):
  1684. director = director + person.get("Name") + ' '
  1685. if(person.get("Type") == "Writing"):
  1686. writer = person.get("Name")
  1687. if(person.get("Type") == "Writer"):
  1688. writer = person.get("Name")
  1689. if(person.get("Type") == "Actor"):
  1690. Name = person.get("Name")
  1691. Role = person.get("Role")
  1692. if Role == None:
  1693. Role = ''
  1694. cast.append(Name)
  1695.  
  1696. # Process Studios
  1697. studio = ""
  1698. studios = item.get("Studios")
  1699. if(studios != None):
  1700. for studio_string in studios:
  1701. if studio=="": #Just take the first one
  1702. temp=studio_string.get("Name")
  1703. studio=temp.encode('utf-8')
  1704. # Process Genres
  1705. genre = ""
  1706. genres = item.get("Genres")
  1707. if(genres != None):
  1708. for genre_string in genres:
  1709. if genre == "": #Just take the first genre
  1710. genre = genre_string
  1711. else:
  1712. genre = genre + " / " + genre_string
  1713.  
  1714. # Process UserData
  1715. userData = item.get("UserData")
  1716. PlaybackPositionTicks = '100'
  1717. overlay = "0"
  1718. favorite = "false"
  1719. seekTime = 0
  1720. if(userData != None):
  1721. if userData.get("Played") != True:
  1722. overlay = "7"
  1723. watched = "true"
  1724. else:
  1725. overlay = "6"
  1726. watched = "false"
  1727. if userData.get("IsFavorite") == True:
  1728. overlay = "5"
  1729. favorite = "true"
  1730. else:
  1731. favorite = "false"
  1732. if userData.get("PlaybackPositionTicks") != None:
  1733. PlaybackPositionTicks = str(userData.get("PlaybackPositionTicks"))
  1734. reasonableTicks = int(userData.get("PlaybackPositionTicks")) / 1000
  1735. seekTime = reasonableTicks / 10000
  1736.  
  1737. playCount = 0
  1738. if(userData != None and userData.get("Played") == True):
  1739. playCount = 1
  1740. # Populate the details list
  1741. details={'title' : tempTitle,
  1742. 'plot' : item.get("Overview"),
  1743. 'episode' : tempEpisode,
  1744. #'watched' : watched,
  1745. 'Overlay' : overlay,
  1746. 'playcount' : str(playCount),
  1747. #'aired' : episode.get('originallyAvailableAt','') ,
  1748. 'TVShowTitle' : item.get("SeriesName"),
  1749. 'season' : tempSeason,
  1750. 'Video3DFormat' : item.get("Video3DFormat"),
  1751. }
  1752.  
  1753. try:
  1754. tempDuration = str(int(item.get("RunTimeTicks", "0"))/(10000000*60))
  1755. RunTimeTicks = str(item.get("RunTimeTicks", "0"))
  1756. except TypeError:
  1757. try:
  1758. tempDuration = str(int(item.get("CumulativeRunTimeTicks"))/(10000000*60))
  1759. RunTimeTicks = str(item.get("CumulativeRunTimeTicks"))
  1760. except TypeError:
  1761. tempDuration = "0"
  1762. RunTimeTicks = "0"
  1763. TotalSeasons = 0 if item.get("ChildCount")==None else item.get("ChildCount")
  1764. TotalEpisodes = 0 if item.get("RecursiveItemCount")==None else item.get("RecursiveItemCount")
  1765. WatchedEpisodes = 0 if userData.get("UnplayedItemCount")==None else TotalEpisodes-userData.get("UnplayedItemCount")
  1766. UnWatchedEpisodes = 0 if userData.get("UnplayedItemCount")==None else userData.get("UnplayedItemCount")
  1767. NumEpisodes = TotalEpisodes
  1768. # Populate the extraData list
  1769. extraData={'thumb' : downloadUtils.getArtwork(item, "Primary") ,
  1770. 'fanart_image' : downloadUtils.getArtwork(item, "Backdrop") ,
  1771. 'poster' : downloadUtils.getArtwork(item, "poster") ,
  1772. 'tvshow.poster': downloadUtils.getArtwork(item, "tvshow.poster") ,
  1773. 'banner' : downloadUtils.getArtwork(item, "Banner") ,
  1774. 'clearlogo' : downloadUtils.getArtwork(item, "Logo") ,
  1775. 'discart' : downloadUtils.getArtwork(item, "Disc") ,
  1776. 'clearart' : downloadUtils.getArtwork(item, "Art") ,
  1777. 'landscape' : downloadUtils.getArtwork(item, "Thumb") ,
  1778. 'small_poster' : downloadUtils.getArtwork(item, "Primary2") ,
  1779. 'id' : id ,
  1780. 'guiid' : guiid ,
  1781. 'mpaa' : item.get("OfficialRating"),
  1782. 'rating' : item.get("CommunityRating"),
  1783. 'criticrating' : item.get("CriticRating"),
  1784. 'year' : item.get("ProductionYear"),
  1785. 'locationtype' : item.get("LocationType"),
  1786. 'premieredate' : premieredate,
  1787. 'studio' : studio,
  1788. 'genre' : genre,
  1789. 'playcount' : str(playCount),
  1790. 'director' : director,
  1791. 'writer' : writer,
  1792. 'channels' : channels,
  1793. 'videocodec' : videocodec,
  1794. 'aspectratio' : str(aspectfloat),
  1795. 'audiocodec' : audiocodec,
  1796. 'height' : height,
  1797. 'width' : width,
  1798. 'cast' : cast,
  1799. 'favorite' : favorite,
  1800. 'watchedurl' : 'http://' + server + '/mediabrowser/Users/'+ userid + '/PlayedItems/' + id,
  1801. 'favoriteurl' : 'http://' + server + '/mediabrowser/Users/'+ userid + '/FavoriteItems/' + id,
  1802. 'deleteurl' : 'http://' + server + '/mediabrowser/Items/' + id,
  1803. 'parenturl' : url,
  1804. 'resumetime' : str(seekTime),
  1805. 'totaltime' : tempDuration,
  1806. 'duration' : tempDuration,
  1807. 'RecursiveItemCount' : item.get("RecursiveItemCount"),
  1808. 'RecursiveUnplayedItemCount' : userData.get("UnplayedItemCount"),
  1809. 'TotalSeasons' : str(TotalSeasons),
  1810. 'TotalEpisodes': str(TotalEpisodes),
  1811. 'WatchedEpisodes': str(WatchedEpisodes),
  1812. 'UnWatchedEpisodes': str(UnWatchedEpisodes),
  1813. 'NumEpisodes' : str(NumEpisodes),
  1814. 'itemtype' : item_type}
  1815.  
  1816.  
  1817.  
  1818. if extraData['thumb'] == '':
  1819. extraData['thumb'] = extraData['fanart_image']
  1820.  
  1821. extraData['mode'] = _MODE_GETCONTENT
  1822.  
  1823. if isFolder == True:
  1824. SortByTemp = __settings__.getSetting('sortby')
  1825. if SortByTemp == '' and not (item_type == 'Series' or item_type == 'Season' or item_type == 'BoxSet' or item_type == 'MusicAlbum' or item_type == 'MusicArtist'):
  1826. SortByTemp = 'SortName'
  1827. if item_type=='Series' and __settings__.getSetting('flattenSeasons')=='true':
  1828. u = 'http://' + server + '/mediabrowser/Users/'+ userid + '/items?ParentId=' +id +'&IncludeItemTypes=Episode&Recursive=true&IsVirtualUnAired=false&IsMissing=false&Fields=' + detailsString + '&SortBy=SortName'+'&format=json'
  1829. else:
  1830. u = 'http://' + server + '/mediabrowser/Users/'+ userid + '/items?ParentId=' +id +'&IsVirtualUnAired=false&IsMissing=false&Fields=' + detailsString + '&SortBy='+SortByTemp+'&format=json'
  1831. if (item.get("RecursiveItemCount") != 0):
  1832. dirItems.append(addGUIItem(u, details, extraData))
  1833. else:
  1834. u = server+',;'+id
  1835. dirItems.append(addGUIItem(u, details, extraData, folder=False))
  1836.  
  1837. return dirItems
  1838.  
  1839. def processDirectory(url, results, progress):
  1840. global viewType
  1841. printDebug("== ENTER: processDirectoryPi ==")
  1842. parsed = urlparse(url)
  1843. parsedserver,parsedport=parsed.netloc.split(':')
  1844. userid = downloadUtils.getUserId()
  1845. printDebug("Processing secondary menus")
  1846. xbmcplugin.setContent(pluginhandle, 'movies')
  1847.  
  1848. server = getServerFromURL(url)
  1849. setWindowHeading(url)
  1850.  
  1851. detailsString = ""
  1852.  
  1853. dirItems = []
  1854. result = results.get("Items")
  1855. if(result == None):
  1856. result = []
  1857. if len(result) == 1 and __settings__.getSetting('autoEnterSingle') == "true":
  1858. if result[0].get("Type") == "Season":
  1859. jsonData = downloadUtils.downloadUrl("http://" + server + "/mediabrowser/Users/" + userid + "/items?ParentId=" + result[0].get("Id") + '&IsVirtualUnAired=false&IsMissing=false&Fields=' + detailsString + '&SortBy=SortName&format=json', suppress=False, popup=1 )
  1860. results = json.loads(jsonData)
  1861. result=results.get("Items")
  1862. item_count = len(result)
  1863. current_item = 1;
  1864.  
  1865. for item in result:
  1866.  
  1867. if(item.get("Name") != None):
  1868. tempTitle = item.get("Name").encode('utf-8')
  1869. else:
  1870. tempTitle = "Missing Title"
  1871.  
  1872. id = str(item.get("Id")).encode('utf-8')
  1873. guiid = id
  1874. isFolder = item.get("IsFolder")
  1875.  
  1876. item_type = str(item.get("Type")).encode('utf-8')
  1877.  
  1878. tempEpisode = ""
  1879. if (item.get("IndexNumber") != None) and item_type=="Episode":
  1880. episodeNum = item.get("IndexNumber")
  1881. if episodeNum < 10:
  1882. tempEpisode = "0" + str(episodeNum)
  1883. else:
  1884. tempEpisode = str(episodeNum)
  1885.  
  1886. tempSeason = ""
  1887. if (str(item.get("ParentIndexNumber")) != None) and item_type=="Episode":
  1888. tempSeason = str(item.get("ParentIndexNumber"))
  1889. if item.get("ParentIndexNumber") < 10:
  1890. tempSeason = "0" + tempSeason
  1891.  
  1892. viewType=""
  1893. if item_type == "Movie":
  1894. xbmcplugin.setContent(pluginhandle, 'movies')
  1895. viewType="_MOVIES"
  1896. elif item_type == "BoxSet":
  1897. xbmcplugin.setContent(pluginhandle, 'movies')
  1898. viewType="_BOXSETS"
  1899. elif item_type == "Trailer":
  1900. xbmcplugin.setContent(pluginhandle, 'movies')
  1901. viewType="_TRAILERS"
  1902. elif item_type == "Series":
  1903. xbmcplugin.setContent(pluginhandle, 'tvshows')
  1904. viewType="_SERIES"
  1905. elif item_type == "Season":
  1906. xbmcplugin.setContent(pluginhandle, 'seasons')
  1907. viewType="_SEASONS"
  1908. elif item_type == "Episode":
  1909. prefix=''
  1910. if __settings__.getSetting('addSeasonNumber') == 'true':
  1911. prefix = "S" + str(tempSeason)
  1912. if __settings__.getSetting('addEpisodeNumber') == 'true':
  1913. prefix = prefix + "E"
  1914. #prefix = str(tempEpisode)
  1915. if __settings__.getSetting('addEpisodeNumber') == 'true':
  1916. prefix = prefix + str(tempEpisode)
  1917. if prefix != '':
  1918. tempTitle = prefix + ' - ' + tempTitle
  1919. xbmcplugin.setContent(pluginhandle, 'episodes')
  1920. viewType="_EPISODES"
  1921. guiid = item.get("Id")
  1922. elif item.get("Type") == "MusicArtist":
  1923. xbmcplugin.setContent(pluginhandle, 'songs')
  1924. viewType='_MUSICARTISTS'
  1925. elif item.get("Type") == "MusicAlbum":
  1926. xbmcplugin.setContent(pluginhandle, 'songs')
  1927. viewType='_MUSICTALBUMS'
  1928. elif item.get("Type") == "Audio":
  1929. xbmcplugin.setContent(pluginhandle, 'songs')
  1930. viewType='_MUSICTRACKS'
  1931.  
  1932. if(item.get("PremiereDate") != None):
  1933. premieredatelist = (item.get("PremiereDate")).split("T")
  1934. premieredate = premieredatelist[0]
  1935. else:
  1936. premieredate = ""
  1937.  
  1938. # add the premiered date for Upcoming TV
  1939. if item.get("LocationType") == "Virtual":
  1940. airtime = item.get("AirTime")
  1941. tempTitle = tempTitle + ' - ' + str(premieredate) + ' - ' + str(airtime)
  1942.  
  1943. #Add show name to special TV collections RAL, NextUp etc
  1944. WINDOW = xbmcgui.Window( 10000 )
  1945. if WINDOW.getProperty("addshowname") == "true":
  1946. tempTitle=item.get("SeriesName").encode('utf-8') + " - " + tempTitle
  1947. else:
  1948. tempTitle=tempTitle
  1949.  
  1950. # Process MediaStreams
  1951. channels = ''
  1952. videocodec = ''
  1953. audiocodec = ''
  1954. height = ''
  1955. width = ''
  1956. aspectratio = ''
  1957. aspectfloat = 1.85
  1958.  
  1959. # Populate the details list
  1960. details={'title' : tempTitle,
  1961. 'plot' : item.get("Overview"),
  1962. 'episode' : tempEpisode,
  1963. 'TVShowTitle' : item.get("SeriesName"),
  1964. 'season' : tempSeason,
  1965. }
  1966.  
  1967. # Populate the extraData list
  1968. extraData={'thumb' : downloadUtils.getArtwork(item, "Primary") ,
  1969. 'id' : id ,
  1970. 'guiid' : guiid ,
  1971. 'locationtype' : item.get("LocationType"),
  1972. 'watchedurl' : 'http://' + server + '/mediabrowser/Users/'+ userid + '/PlayedItems/' + id,
  1973. 'favoriteurl' : 'http://' + server + '/mediabrowser/Users/'+ userid + '/FavoriteItems/' + id,
  1974. 'deleteurl' : 'http://' + server + '/mediabrowser/Items/' + id,
  1975. 'parenturl' : url,
  1976. 'itemtype' : item_type}
  1977.  
  1978.  
  1979.  
  1980. extraData['mode'] = _MODE_GETCONTENT
  1981.  
  1982. if isFolder == True:
  1983. SortByTemp = __settings__.getSetting('sortby')
  1984. if SortByTemp == '' and not (item_type == 'Series' or item_type == 'Season' or item_type == 'BoxSet' or item_type == 'MusicAlbum' or item_type == 'MusicArtist'):
  1985. SortByTemp = 'SortName'
  1986. if item_type=='Series' and __settings__.getSetting('flattenSeasons')=='true':
  1987. u = 'http://' + server + '/mediabrowser/Users/'+ userid + '/items?ParentId=' +id +'&IncludeItemTypes=Episode&Recursive=true&IsVirtualUnAired=false&IsMissing=false&Fields=' + detailsString + '&SortBy=SortName'+'&format=json'
  1988. else:
  1989. u = 'http://' + server + '/mediabrowser/Users/'+ userid + '/items?ParentId=' +id +'&IsVirtualUnAired=false&IsMissing=false&Fields=' + detailsString + '&SortBy='+SortByTemp+'&format=json'
  1990. if (item.get("RecursiveItemCount") != 0):
  1991. dirItems.append(addGUIItemPi(u, details, extraData))
  1992. else:
  1993. u = server+',;'+id
  1994. dirItems.append(addGUIItemPi(u, details, extraData, folder=False))
  1995.  
  1996. return dirItems
  1997.  
  1998.  
  1999. def processSearch(url, results, progress):
  2000. cast=['None']
  2001. printDebug("== ENTER: processSearch ==")
  2002. parsed = urlparse(url)
  2003. parsedserver,parsedport=parsed.netloc.split(':')
  2004. userid = downloadUtils.getUserId()
  2005. xbmcplugin.setContent(pluginhandle, 'movies')
  2006. detailsString = "Path,Genres,Studios,CumulativeRunTimeTicks"
  2007. if(__settings__.getSetting('includeStreamInfo') == "true"):
  2008. detailsString += ",MediaStreams"
  2009. if(__settings__.getSetting('includePeople') == "true"):
  2010. detailsString += ",People"
  2011. if(__settings__.getSetting('includeOverview') == "true"):
  2012. detailsString += ",Overview"
  2013. server = getServerFromURL(url)
  2014. setWindowHeading(url)
  2015.  
  2016. dirItems = []
  2017. result = results.get("SearchHints")
  2018. if(result == None):
  2019. result = []
  2020.  
  2021. item_count = len(result)
  2022. current_item = 1;
  2023.  
  2024. for item in result:
  2025. id=str(item.get("ItemId")).encode('utf-8')
  2026. type=item.get("Type").encode('utf-8')
  2027.  
  2028. if(progress != None):
  2029. percentDone = (float(current_item) / float(item_count)) * 100
  2030. progress.update(int(percentDone), __language__(30126) + str(current_item))
  2031. current_item = current_item + 1
  2032.  
  2033. if(item.get("Name") != None):
  2034. tempTitle = item.get("Name")
  2035. tempTitle=tempTitle.encode('utf-8')
  2036. else:
  2037. tempTitle = "Missing Title"
  2038.  
  2039. if type=="Series" or type=="MusicArtist" or type=="MusicAlbum" or type=="Folder":
  2040. isFolder = True
  2041. else:
  2042. isFolder = False
  2043. item_type = str(type).encode('utf-8')
  2044.  
  2045. tempEpisode = ""
  2046. if (item.get("IndexNumber") != None):
  2047. episodeNum = item.get("IndexNumber")
  2048. if episodeNum < 10:
  2049. tempEpisode = "0" + str(episodeNum)
  2050. else:
  2051. tempEpisode = str(episodeNum)
  2052.  
  2053. tempSeason = ""
  2054. if (str(item.get("ParentIndexNumber")) != None):
  2055. tempSeason = str(item.get("ParentIndexNumber"))
  2056.  
  2057. if type == "Episode" and __settings__.getSetting('addEpisodeNumber') == 'true':
  2058. tempTitle = str(tempEpisode) + ' - ' + tempTitle
  2059.  
  2060. #Add show name to special TV collections RAL, NextUp etc
  2061. WINDOW = xbmcgui.Window( 10000 )
  2062. if type==None:
  2063. type=''
  2064. if item.get("Series")!=None:
  2065. series=item.get("Series").encode('utf-8')
  2066. tempTitle=type + ": " + series + " - " + tempTitle
  2067. else:
  2068. tempTitle=type + ": " +tempTitle
  2069. # Populate the details list
  2070. details={'title' : tempTitle,
  2071. 'episode' : tempEpisode,
  2072. 'TVShowTitle' : item.get("Series"),
  2073. 'season' : tempSeason
  2074. }
  2075.  
  2076. try:
  2077. tempDuration = str(int(item.get("RunTimeTicks", "0"))/(10000000*60))
  2078. RunTimeTicks = str(item.get("RunTimeTicks", "0"))
  2079. except TypeError:
  2080. try:
  2081. tempDuration = str(int(item.get("CumulativeRunTimeTicks"))/(10000000*60))
  2082. RunTimeTicks = str(item.get("CumulativeRunTimeTicks"))
  2083. except TypeError:
  2084. tempDuration = "0"
  2085. RunTimeTicks = "0"
  2086.  
  2087. # Populate the extraData list
  2088. extraData={'thumb' : "http://localhost:15001/?id=" + str(id) + "&type=Primary" ,
  2089. 'fanart_image' : downloadUtils.getArtwork(item, "Backdrop") ,
  2090. 'poster' : downloadUtils.getArtwork(item, "poster") ,
  2091. 'tvshow.poster': downloadUtils.getArtwork(item, "tvshow.poster") ,
  2092. 'banner' : downloadUtils.getArtwork(item, "Banner") ,
  2093. 'clearlogo' : downloadUtils.getArtwork(item, "Logo") ,
  2094. 'discart' : downloadUtils.getArtwork(item, "Disc") ,
  2095. 'clearart' : downloadUtils.getArtwork(item, "Art") ,
  2096. 'landscape' : downloadUtils.getArtwork(item, "landscape") ,
  2097. 'id' : id ,
  2098. 'year' : item.get("ProductionYear"),
  2099. 'watchedurl' : 'http://' + server + '/mediabrowser/Users/'+ userid + '/PlayedItems/' + id,
  2100. 'favoriteurl' : 'http://' + server + '/mediabrowser/Users/'+ userid + '/FavoriteItems/' + id,
  2101. 'deleteurl' : 'http://' + server + '/mediabrowser/Items/' + id,
  2102. 'parenturl' : url,
  2103. 'totaltime' : tempDuration,
  2104. 'duration' : tempDuration,
  2105. 'itemtype' : item_type}
  2106.  
  2107. if extraData['thumb'] == '':
  2108. extraData['thumb'] = extraData['fanart_image']
  2109.  
  2110. extraData['mode'] = _MODE_GETCONTENT
  2111. if isFolder == True:
  2112. u = 'http://' + server + '/mediabrowser/Users/'+ userid + '/items?ParentId=' +id +'&IsVirtualUnAired=false&IsMissing=false&Fields=' + detailsString + '&format=json'
  2113. dirItems.append(addGUIItem(u, details, extraData))
  2114. elif tempDuration != '0':
  2115. u = server+',;'+id
  2116. dirItems.append(addGUIItem(u, details, extraData, folder=False))
  2117. return dirItems
  2118.  
  2119. def processChannels(url, results, progress):
  2120. global viewType
  2121. printDebug("== ENTER: processChannels ==")
  2122. parsed = urlparse(url)
  2123. parsedserver,parsedport=parsed.netloc.split(':')
  2124. userid = downloadUtils.getUserId()
  2125. xbmcplugin.setContent(pluginhandle, 'movies')
  2126. detailsString = "Path,Genres,Studios,CumulativeRunTimeTicks"
  2127. if(__settings__.getSetting('includeStreamInfo') == "true"):
  2128. detailsString += ",MediaStreams"
  2129. if(__settings__.getSetting('includePeople') == "true"):
  2130. detailsString += ",People"
  2131. if(__settings__.getSetting('includeOverview') == "true"):
  2132. detailsString += ",Overview"
  2133. server = getServerFromURL(url)
  2134. dirItems = []
  2135. result = results.get("Items")
  2136. if(result == None):
  2137. result = []
  2138.  
  2139. item_count = len(result)
  2140. current_item = 1;
  2141.  
  2142. for item in result:
  2143. id=str(item.get("Id")).encode('utf-8')
  2144. type=item.get("Type").encode('utf-8')
  2145.  
  2146. if(progress != None):
  2147. percentDone = (float(current_item) / float(item_count)) * 100
  2148. progress.update(int(percentDone), __language__(30126) + str(current_item))
  2149. current_item = current_item + 1
  2150.  
  2151. if(item.get("Name") != None):
  2152. tempTitle = item.get("Name")
  2153. tempTitle=tempTitle.encode('utf-8')
  2154. else:
  2155. tempTitle = "Missing Title"
  2156.  
  2157. if type=="ChannelFolderItem":
  2158. isFolder = True
  2159. else:
  2160. isFolder = False
  2161. item_type = str(type).encode('utf-8')
  2162.  
  2163. if(item.get("ChannelId") != None):
  2164. channelId = str(item.get("ChannelId")).encode('utf-8')
  2165. # Populate the details list
  2166. details={'title' : tempTitle}
  2167.  
  2168. viewType=""
  2169. if item.get("Type") == "ChannelVideoItem":
  2170. xbmcplugin.setContent(pluginhandle, 'movies')
  2171. viewType="_MOVIES"
  2172. elif item.get("Type") == "ChannelAudioItem":
  2173. xbmcplugin.setContent(pluginhandle, 'songs')
  2174. viewType='_MUSICTRACKS'
  2175.  
  2176. try:
  2177. tempDuration = str(int(item.get("RunTimeTicks", "0"))/(10000000*60))
  2178. RunTimeTicks = str(item.get("RunTimeTicks", "0"))
  2179. except TypeError:
  2180. try:
  2181. tempDuration = str(int(item.get("CumulativeRunTimeTicks"))/(10000000*60))
  2182. RunTimeTicks = str(item.get("CumulativeRunTimeTicks"))
  2183. except TypeError:
  2184. tempDuration = "0"
  2185. RunTimeTicks = "0"
  2186.  
  2187. # Populate the extraData list
  2188. extraData={'thumb' : "http://localhost:15001/?id=" + str(id) + "&type=Primary" ,
  2189. 'fanart_image' : downloadUtils.getArtwork(item, "Backdrop") ,
  2190. 'poster' : downloadUtils.getArtwork(item, "poster") ,
  2191. 'tvshow.poster': downloadUtils.getArtwork(item, "tvshow.poster") ,
  2192. 'banner' : downloadUtils.getArtwork(item, "Banner") ,
  2193. 'clearlogo' : downloadUtils.getArtwork(item, "Logo") ,
  2194. 'discart' : downloadUtils.getArtwork(item, "Disc") ,
  2195. 'clearart' : downloadUtils.getArtwork(item, "Art") ,
  2196. 'landscape' : downloadUtils.getArtwork(item, "Thumb") ,
  2197. 'id' : id ,
  2198. 'year' : item.get("ProductionYear"),
  2199. 'watchedurl' : 'http://' + server + '/mediabrowser/Users/'+ userid + '/PlayedItems/' + id,
  2200. 'favoriteurl' : 'http://' + server + '/mediabrowser/Users/'+ userid + '/FavoriteItems/' + id,
  2201. 'deleteurl' : 'http://' + server + '/mediabrowser/Items/' + id,
  2202. 'parenturl' : url,
  2203. 'totaltime' : tempDuration,
  2204. 'duration' : tempDuration,
  2205. 'itemtype' : item_type}
  2206.  
  2207. if extraData['thumb'] == '':
  2208. extraData['thumb'] = extraData['fanart_image']
  2209.  
  2210. extraData['mode'] = _MODE_GETCONTENT
  2211. if type=="Channel":
  2212. u = 'http://' + server + '/mediabrowser/Channels/'+ id + '/Items?userid=' +userid + '&format=json'
  2213. dirItems.append(addGUIItem(u, details, extraData))
  2214.  
  2215. elif isFolder == True:
  2216. u = 'http://' + server + '/mediabrowser/Channels/'+ channelId + '/Items?userid=' +userid + '&folderid=' + id + '&format=json'
  2217. dirItems.append(addGUIItem(u, details, extraData))
  2218. else:
  2219. u = server+',;'+id
  2220. dirItems.append(addGUIItem(u, details, extraData, folder=False))
  2221. return dirItems
  2222.  
  2223. def processPlaylists(url, results, progress):
  2224. global viewType
  2225. printDebug("== ENTER: processPlaylists ==")
  2226. parsed = urlparse(url)
  2227. parsedserver,parsedport=parsed.netloc.split(':')
  2228. userid = downloadUtils.getUserId()
  2229. xbmcplugin.setContent(pluginhandle, 'movies')
  2230. detailsString = ""
  2231. server = getServerFromURL(url)
  2232. dirItems = []
  2233. result = results.get("Items")
  2234. if(result == None):
  2235. result = []
  2236.  
  2237. item_count = len(result)
  2238. current_item = 1;
  2239.  
  2240. for item in result:
  2241. id=str(item.get("Id")).encode('utf-8')
  2242. type=item.get("Type").encode('utf-8')
  2243.  
  2244. if(progress != None):
  2245. percentDone = (float(current_item) / float(item_count)) * 100
  2246. progress.update(int(percentDone), __language__(30126) + str(current_item))
  2247. current_item = current_item + 1
  2248.  
  2249. if(item.get("Name") != None):
  2250. tempTitle = item.get("Name")
  2251. tempTitle=tempTitle.encode('utf-8')
  2252. else:
  2253. tempTitle = "Missing Title"
  2254.  
  2255.  
  2256. isFolder = False
  2257. item_type = str(type).encode('utf-8')
  2258.  
  2259.  
  2260. # Populate the details list
  2261. details={'title' : tempTitle}
  2262.  
  2263. xbmcplugin.setContent(pluginhandle, 'movies')
  2264. viewType="_MOVIES"
  2265.  
  2266. try:
  2267. tempDuration = str(int(item.get("RunTimeTicks", "0"))/(10000000*60))
  2268. RunTimeTicks = str(item.get("RunTimeTicks", "0"))
  2269. except TypeError:
  2270. try:
  2271. tempDuration = str(int(item.get("CumulativeRunTimeTicks"))/(10000000*60))
  2272. RunTimeTicks = str(item.get("CumulativeRunTimeTicks"))
  2273. except TypeError:
  2274. tempDuration = "0"
  2275. RunTimeTicks = "0"
  2276.  
  2277. # Populate the extraData list
  2278. extraData={'thumb' : "http://localhost:15001/?id=" + str(id) + "&type=Primary" ,
  2279. 'fanart_image' : downloadUtils.getArtwork(item, "Backdrop") ,
  2280. 'poster' : downloadUtils.getArtwork(item, "poster") ,
  2281. 'tvshow.poster': downloadUtils.getArtwork(item, "tvshow.poster") ,
  2282. 'banner' : downloadUtils.getArtwork(item, "Banner") ,
  2283. 'clearlogo' : downloadUtils.getArtwork(item, "Logo") ,
  2284. 'discart' : downloadUtils.getArtwork(item, "Disc") ,
  2285. 'clearart' : downloadUtils.getArtwork(item, "Art") ,
  2286. 'landscape' : downloadUtils.getArtwork(item, "Thumb") ,
  2287. 'id' : id ,
  2288. 'year' : item.get("ProductionYear"),
  2289. 'watchedurl' : 'http://' + server + '/mediabrowser/Users/'+ userid + '/PlayedItems/' + id,
  2290. 'favoriteurl' : 'http://' + server + '/mediabrowser/Users/'+ userid + '/FavoriteItems/' + id,
  2291. 'deleteurl' : 'http://' + server + '/mediabrowser/Items/' + id,
  2292. 'parenturl' : url,
  2293. 'totaltime' : tempDuration,
  2294. 'duration' : tempDuration,
  2295. 'itemtype' : item_type}
  2296.  
  2297. if extraData['thumb'] == '':
  2298. extraData['thumb'] = extraData['fanart_image']
  2299.  
  2300. extraData['mode'] = _MODE_GETCONTENT
  2301.  
  2302. u = server+',;'+id+',;'+'PLAYLIST'
  2303. dirItems.append(addGUIItem(u, details, extraData, folder=False))
  2304. return dirItems
  2305.  
  2306. def processGenres(url, results, progress, content):
  2307. global viewType
  2308. printDebug("== ENTER: processGenres ==")
  2309. parsed = urlparse(url)
  2310. parsedserver,parsedport=parsed.netloc.split(':')
  2311. userid = downloadUtils.getUserId()
  2312. xbmcplugin.setContent(pluginhandle, 'movies')
  2313. detailsString = "Path,Genres,Studios,CumulativeRunTimeTicks"
  2314. if(__settings__.getSetting('includeStreamInfo') == "true"):
  2315. detailsString += ",MediaStreams"
  2316. if(__settings__.getSetting('includePeople') == "true"):
  2317. detailsString += ",People"
  2318. if(__settings__.getSetting('includeOverview') == "true"):
  2319. detailsString += ",Overview"
  2320. server = getServerFromURL(url)
  2321. dirItems = []
  2322. result = results.get("Items")
  2323. if(result == None):
  2324. result = []
  2325.  
  2326. item_count = len(result)
  2327. current_item = 1;
  2328.  
  2329. for item in result:
  2330. id=str(item.get("Id")).encode('utf-8')
  2331. type=item.get("Type").encode('utf-8')
  2332. item_type = str(type).encode('utf-8')
  2333. if(progress != None):
  2334. percentDone = (float(current_item) / float(item_count)) * 100
  2335. progress.update(int(percentDone), __language__(30126) + str(current_item))
  2336. current_item = current_item + 1
  2337.  
  2338. if(item.get("Name") != None):
  2339. tempTitle = item.get("Name")
  2340. tempTitle=tempTitle.encode('utf-8')
  2341. else:
  2342. tempTitle = "Missing Title"
  2343.  
  2344.  
  2345. isFolder = True
  2346.  
  2347.  
  2348. # Populate the details list
  2349. details={'title' : tempTitle}
  2350.  
  2351. viewType="_MOVIES"
  2352.  
  2353. try:
  2354. tempDuration = str(int(item.get("RunTimeTicks", "0"))/(10000000*60))
  2355. RunTimeTicks = str(item.get("RunTimeTicks", "0"))
  2356. except TypeError:
  2357. try:
  2358. tempDuration = str(int(item.get("CumulativeRunTimeTicks"))/(10000000*60))
  2359. RunTimeTicks = str(item.get("CumulativeRunTimeTicks"))
  2360. except TypeError:
  2361. tempDuration = "0"
  2362. RunTimeTicks = "0"
  2363.  
  2364. # Populate the extraData list
  2365. extraData={'thumb' : "http://localhost:15001/?id=" + str(id) + "&type=Primary" ,
  2366. 'fanart_image' : downloadUtils.getArtwork(item, "Backdrop") ,
  2367. 'poster' : downloadUtils.getArtwork(item, "poster") ,
  2368. 'tvshow.poster': downloadUtils.getArtwork(item, "tvshow.poster") ,
  2369. 'banner' : downloadUtils.getArtwork(item, "Banner") ,
  2370. 'clearlogo' : downloadUtils.getArtwork(item, "Logo") ,
  2371. 'discart' : downloadUtils.getArtwork(item, "Disc") ,
  2372. 'clearart' : downloadUtils.getArtwork(item, "Art") ,
  2373. 'landscape' : downloadUtils.getArtwork(item, "Thumb") ,
  2374. 'id' : id ,
  2375. 'year' : item.get("ProductionYear"),
  2376. 'watchedurl' : 'http://' + server + '/mediabrowser/Users/'+ userid + '/PlayedItems/' + id,
  2377. 'favoriteurl' : 'http://' + server + '/mediabrowser/Users/'+ userid + '/FavoriteItems/' + id,
  2378. 'deleteurl' : 'http://' + server + '/mediabrowser/Items/' + id,
  2379. 'parenturl' : url,
  2380. 'totaltime' : tempDuration,
  2381. 'duration' : tempDuration,
  2382. 'itemtype' : item_type}
  2383.  
  2384. if extraData['thumb'] == '':
  2385. extraData['thumb'] = extraData['fanart_image']
  2386.  
  2387. extraData['mode'] = _MODE_GETCONTENT
  2388.  
  2389. u = 'http://' + server + '/mediabrowser/Users/' + userid + '/Items?&SortBy=SortName&Fields=' + detailsString + '&Recursive=true&SortOrder=Ascending&IncludeItemTypes=' + content + '&Genres=' + item.get("Name") + '&format=json'
  2390. dirItems.append(addGUIItem(u, details, extraData))
  2391.  
  2392. return dirItems
  2393.  
  2394. def processStudios(url, results, progress, content):
  2395. global viewType
  2396. printDebug("== ENTER: processStudios ==")
  2397. parsed = urlparse(url)
  2398. parsedserver,parsedport=parsed.netloc.split(':')
  2399. userid = downloadUtils.getUserId()
  2400. xbmcplugin.setContent(pluginhandle, 'movies')
  2401. detailsString = "Path,Genres,Studios,CumulativeRunTimeTicks"
  2402. if(__settings__.getSetting('includeStreamInfo') == "true"):
  2403. detailsString += ",MediaStreams"
  2404. if(__settings__.getSetting('includePeople') == "true"):
  2405. detailsString += ",People"
  2406. if(__settings__.getSetting('includeOverview') == "true"):
  2407. detailsString += ",Overview"
  2408. server = getServerFromURL(url)
  2409. dirItems = []
  2410. result = results.get("Items")
  2411. if(result == None):
  2412. result = []
  2413.  
  2414. item_count = len(result)
  2415. current_item = 1;
  2416.  
  2417. for item in result:
  2418. id=str(item.get("Id")).encode('utf-8')
  2419. type=item.get("Type").encode('utf-8')
  2420. item_type = str(type).encode('utf-8')
  2421. if(progress != None):
  2422. percentDone = (float(current_item) / float(item_count)) * 100
  2423. progress.update(int(percentDone), __language__(30126) + str(current_item))
  2424. current_item = current_item + 1
  2425.  
  2426. if(item.get("Name") != None):
  2427. tempTitle = item.get("Name")
  2428. tempTitle=tempTitle.encode('utf-8')
  2429. else:
  2430. tempTitle = "Missing Title"
  2431.  
  2432.  
  2433. isFolder = True
  2434.  
  2435.  
  2436. # Populate the details list
  2437. details={'title' : tempTitle}
  2438.  
  2439. viewType="_MOVIES"
  2440.  
  2441. try:
  2442. tempDuration = str(int(item.get("RunTimeTicks", "0"))/(10000000*60))
  2443. RunTimeTicks = str(item.get("RunTimeTicks", "0"))
  2444. except TypeError:
  2445. try:
  2446. tempDuration = str(int(item.get("CumulativeRunTimeTicks"))/(10000000*60))
  2447. RunTimeTicks = str(item.get("CumulativeRunTimeTicks"))
  2448. except TypeError:
  2449. tempDuration = "0"
  2450. RunTimeTicks = "0"
  2451.  
  2452. # Populate the extraData list
  2453. extraData={'thumb' : "http://localhost:15001/?id=" + str(id) + "&type=Primary" ,
  2454. 'fanart_image' : downloadUtils.getArtwork(item, "Backdrop") ,
  2455. 'poster' : downloadUtils.getArtwork(item, "poster") ,
  2456. 'tvshow.poster': downloadUtils.getArtwork(item, "tvshow.poster") ,
  2457. 'banner' : downloadUtils.getArtwork(item, "Banner") ,
  2458. 'clearlogo' : downloadUtils.getArtwork(item, "Logo") ,
  2459. 'discart' : downloadUtils.getArtwork(item, "Disc") ,
  2460. 'clearart' : downloadUtils.getArtwork(item, "Art") ,
  2461. 'landscape' : downloadUtils.getArtwork(item, "Thumb") ,
  2462. 'id' : id ,
  2463. 'year' : item.get("ProductionYear"),
  2464. 'watchedurl' : 'http://' + server + '/mediabrowser/Users/'+ userid + '/PlayedItems/' + id,
  2465. 'favoriteurl' : 'http://' + server + '/mediabrowser/Users/'+ userid + '/FavoriteItems/' + id,
  2466. 'deleteurl' : 'http://' + server + '/mediabrowser/Items/' + id,
  2467. 'parenturl' : url,
  2468. 'totaltime' : tempDuration,
  2469. 'duration' : tempDuration,
  2470. 'itemtype' : item_type}
  2471.  
  2472. if extraData['thumb'] == '':
  2473. extraData['thumb'] = extraData['fanart_image']
  2474.  
  2475. extraData['mode'] = _MODE_GETCONTENT
  2476. xbmc.log("XBMB3C - process studios nocode: " + tempTitle)
  2477. tempTitle = tempTitle.replace(' ', '+')
  2478. xbmc.log("XBMB3C - process studios nocode spaces replaced: " + tempTitle)
  2479. tempTitle2 = unicode(tempTitle,'utf-8')
  2480. u = 'http://' + server + '/mediabrowser/Users/' + userid + '/Items?&SortBy=SortName&Fields=' + detailsString + '&Recursive=true&SortOrder=Ascending&IncludeItemTypes=' + content + '&Studios=' + tempTitle2.encode('ascii','ignore') + '&format=json'
  2481. xbmc.log("XBMB3C - process studios: " + u)
  2482. dirItems.append(addGUIItem(u, details, extraData))
  2483.  
  2484. return dirItems
  2485.  
  2486. def processPeople(url, results, progress, content):
  2487. global viewType
  2488. printDebug("== ENTER: processPeople ==")
  2489. parsed = urlparse(url)
  2490. parsedserver,parsedport=parsed.netloc.split(':')
  2491. userid = downloadUtils.getUserId()
  2492. xbmcplugin.setContent(pluginhandle, 'movies')
  2493. detailsString = "Path,Genres,Studios,CumulativeRunTimeTicks"
  2494. if(__settings__.getSetting('includeStreamInfo') == "true"):
  2495. detailsString += ",MediaStreams"
  2496. if(__settings__.getSetting('includePeople') == "true"):
  2497. detailsString += ",People"
  2498. if(__settings__.getSetting('includeOverview') == "true"):
  2499. detailsString += ",Overview"
  2500. server = getServerFromURL(url)
  2501. dirItems = []
  2502. result = results.get("Items")
  2503. if(result == None):
  2504. result = []
  2505.  
  2506. item_count = len(result)
  2507. current_item = 1;
  2508.  
  2509. for item in result:
  2510. id=str(item.get("Id")).encode('utf-8')
  2511. type=item.get("Type").encode('utf-8')
  2512. item_type = str(type).encode('utf-8')
  2513. if(progress != None):
  2514. percentDone = (float(current_item) / float(item_count)) * 100
  2515. progress.update(int(percentDone), __language__(30126) + str(current_item))
  2516. current_item = current_item + 1
  2517.  
  2518. if(item.get("Name") != None):
  2519. tempTitle = item.get("Name")
  2520. tempTitle=tempTitle.encode('utf-8')
  2521. else:
  2522. tempTitle = "Missing Title"
  2523.  
  2524.  
  2525. isFolder = True
  2526.  
  2527.  
  2528. # Populate the details list
  2529. details={'title' : tempTitle}
  2530.  
  2531. viewType="_MOVIES"
  2532.  
  2533. try:
  2534. tempDuration = str(int(item.get("RunTimeTicks", "0"))/(10000000*60))
  2535. RunTimeTicks = str(item.get("RunTimeTicks", "0"))
  2536. except TypeError:
  2537. try:
  2538. tempDuration = str(int(item.get("CumulativeRunTimeTicks"))/(10000000*60))
  2539. RunTimeTicks = str(item.get("CumulativeRunTimeTicks"))
  2540. except TypeError:
  2541. tempDuration = "0"
  2542. RunTimeTicks = "0"
  2543.  
  2544. # Populate the extraData list
  2545. extraData={'thumb' : "http://localhost:15001/?id=" + str(id) + "&type=Primary" ,
  2546. 'fanart_image' : downloadUtils.getArtwork(item, "Backdrop") ,
  2547. 'poster' : downloadUtils.getArtwork(item, "poster") ,
  2548. 'tvshow.poster': downloadUtils.getArtwork(item, "tvshow.poster") ,
  2549. 'banner' : downloadUtils.getArtwork(item, "Banner") ,
  2550. 'clearlogo' : downloadUtils.getArtwork(item, "Logo") ,
  2551. 'discart' : downloadUtils.getArtwork(item, "Disc") ,
  2552. 'clearart' : downloadUtils.getArtwork(item, "Art") ,
  2553. 'landscape' : downloadUtils.getArtwork(item, "landscape") ,
  2554. 'id' : id ,
  2555. 'year' : item.get("ProductionYear"),
  2556. 'watchedurl' : 'http://' + server + '/mediabrowser/Users/'+ userid + '/PlayedItems/' + id,
  2557. 'favoriteurl' : 'http://' + server + '/mediabrowser/Users/'+ userid + '/FavoriteItems/' + id,
  2558. 'deleteurl' : 'http://' + server + '/mediabrowser/Items/' + id,
  2559. 'parenturl' : url,
  2560. 'totaltime' : tempDuration,
  2561. 'duration' : tempDuration,
  2562. 'itemtype' : item_type}
  2563.  
  2564. if extraData['thumb'] == '':
  2565. extraData['thumb'] = extraData['fanart_image']
  2566.  
  2567. extraData['mode'] = _MODE_GETCONTENT
  2568. xbmc.log("XBMB3C - process people nocode: " + tempTitle)
  2569. tempTitle = tempTitle.replace(' ', '+')
  2570. xbmc.log("XBMB3C - process people nocode spaces replaced: " + tempTitle)
  2571. tempTitle2 = unicode(tempTitle,'utf-8')
  2572. u = 'http://' + server + '/mediabrowser/Users/' + userid + '/Items?&SortBy=SortName&Fields=' + detailsString + '&Recursive=true&SortOrder=Ascending&IncludeItemTypes=' + content + '&Person=' + tempTitle2.encode('ascii','ignore') + '&format=json'
  2573. xbmc.log("XBMB3C - process people: " + u)
  2574. dirItems.append(addGUIItem(u, details, extraData))
  2575.  
  2576. return dirItems
  2577.  
  2578. def getServerFromURL( url ):
  2579. '''
  2580. Simply split the URL up and get the server portion, sans port
  2581. @ input: url, woth or without protocol
  2582. @ return: the URL server
  2583. '''
  2584. if url[0:4] == "http":
  2585. return url.split('/')[2]
  2586. else:
  2587. return url.split('/')[0]
  2588.  
  2589. def getLinkURL( url, pathData, server ):
  2590. '''
  2591. Investigate the passed URL and determine what is required to
  2592. turn it into a usable URL
  2593. @ input: url, XML data and PM server address
  2594. @ return: Usable http URL
  2595. '''
  2596. printDebug("== ENTER: getLinkURL ==")
  2597. path=pathData.get('key','')
  2598. printDebug("Path is " + path)
  2599.  
  2600. if path == '':
  2601. printDebug("Empty Path")
  2602. return
  2603.  
  2604. #If key starts with http, then return it
  2605. if path[0:4] == "http":
  2606. printDebug("Detected http link")
  2607. return path
  2608.  
  2609. #If key starts with a / then prefix with server address
  2610. elif path[0] == '/':
  2611. printDebug("Detected base path link")
  2612. return 'http://%s%s' % ( server, path )
  2613.  
  2614. elif path[0:5] == "rtmp:":
  2615. printDebug("Detected link")
  2616. return path
  2617.  
  2618. #Any thing else is assumed to be a relative path and is built on existing url
  2619. else:
  2620. printDebug("Detected relative link")
  2621. return "%s/%s" % ( url, path )
  2622.  
  2623. return url
  2624.  
  2625. def setArt (list,name,path):
  2626. if name=='thumb' or name=='fanart_image' or name=='small_poster':
  2627. list.setProperty(name, path)
  2628. elif xbmcVersionNum >= 13:
  2629. list.setArt({name:path})
  2630. return list
  2631.  
  2632. def getXbmcVersion():
  2633. version = 0.0
  2634. jsonData = xbmc.executeJSONRPC('{ "jsonrpc": "2.0", "method": "Application.GetProperties", "params": {"properties": ["version", "name"]}, "id": 1 }')
  2635.  
  2636. result = json.loads(jsonData)
  2637.  
  2638. try:
  2639. result = result.get("result")
  2640. versionData = result.get("version")
  2641. version = float(str(versionData.get("major")) + "." + str(versionData.get("minor")))
  2642. printDebug("Version : " + str(version) + " - " + str(versionData), level=0)
  2643. except:
  2644. version = 0.0
  2645. printDebug("Version Error : RAW Version Data : " + str(result), level=0)
  2646.  
  2647. return version
  2648.  
  2649. def setWindowHeading(url) :
  2650. WINDOW = xbmcgui.Window( 10000 )
  2651. WINDOW.setProperty("addshowname", "false")
  2652. WINDOW.setProperty("currenturl", url)
  2653. WINDOW.setProperty("currentpluginhandle", str(pluginhandle))
  2654. if 'ParentId' in url:
  2655. dirUrl = url.replace('items?ParentId=','Items/')
  2656. splitUrl = dirUrl.split('&')
  2657. dirUrl = splitUrl[0] + '?format=json'
  2658. jsonData = downloadUtils.downloadUrl(dirUrl)
  2659. result = json.loads(jsonData)
  2660. for name in result:
  2661. title = name
  2662. WINDOW.setProperty("heading", title)
  2663. elif 'IncludeItemTypes=Episode' in url:
  2664. WINDOW.setProperty("addshowname", "true")
  2665.  
  2666. def getCastList(pluginName, handle, params):
  2667.  
  2668. printDebug ("XBMB3C Returning Cast List")
  2669.  
  2670. port = __settings__.getSetting('port')
  2671. host = __settings__.getSetting('ipaddress')
  2672. server = host + ":" + port
  2673. userid = downloadUtils.getUserId()
  2674. seekTime = 0
  2675. resume = 0
  2676.  
  2677. # get the cast list for an item
  2678. jsonData = downloadUtils.downloadUrl("http://" + server + "/mediabrowser/Users/" + userid + "/Items/" + params.get("id") + "?format=json", suppress=False, popup=1 )
  2679. printDebug("CastList(Items) jsonData: " + jsonData, 2)
  2680. result = json.loads(jsonData)
  2681.  
  2682. people = result.get("People")
  2683.  
  2684. if(people == None):
  2685. return
  2686.  
  2687. listItems = []
  2688.  
  2689. for person in people:
  2690.  
  2691. displayName = person.get("Name")
  2692. if(person.get("Role") != None):
  2693. displayName = displayName + " (" + person.get("Role") + ")"
  2694.  
  2695. tag = person.get("PrimaryImageTag")
  2696.  
  2697. baseName = person.get("Name")
  2698. #urllib.quote(baseName)
  2699. baseName = baseName.replace(" ", "+")
  2700. baseName = baseName.replace("&", "_")
  2701. baseName = baseName.replace("?", "_")
  2702. baseName = baseName.replace("=", "_")
  2703.  
  2704. if(tag != None):
  2705. thumbPath = "http://localhost:15001/?name=" + baseName + "&type=Primary&maxheight=500&tag=" + tag
  2706. item = xbmcgui.ListItem(label=displayName, iconImage=thumbPath, thumbnailImage=thumbPath)
  2707. else:
  2708. item = xbmcgui.ListItem(label=displayName)
  2709.  
  2710. actionUrl = "plugin://plugin.video.xbmb3c?mode=" + str(_MODE_PERSON_DETAILS) +"&name=" + baseName
  2711.  
  2712. item.setProperty('IsPlayable', 'false')
  2713. item.setProperty('IsFolder', 'false')
  2714.  
  2715. commands = []
  2716. detailsString = getDetailsString()
  2717. url = "http://" + host + ":" + port + "/mediabrowser/Users/" + userid + "/Items/?Recursive=True&Person=PERSON_NAME&Fields=" + detailsString + "&format=json"
  2718. url = urllib.quote(url)
  2719. url = url.replace("PERSON_NAME", baseName)
  2720. pluginCastLink = "XBMC.Container.Update(plugin://plugin.video.xbmb3c?mode=" + str(_MODE_GETCONTENT) + "&url=" + url + ")"
  2721. commands.append(( "Show Other Library Items", pluginCastLink))
  2722. item.addContextMenuItems( commands, g_contextReplace )
  2723.  
  2724. itemTupple = (actionUrl, item, False)
  2725. listItems.append(itemTupple)
  2726.  
  2727.  
  2728. #listItems.sort()
  2729. xbmcplugin.addDirectoryItems(handle, listItems)
  2730. xbmcplugin.endOfDirectory(handle, cacheToDisc=False)
  2731.  
  2732. def showItemInfo(pluginName, handle, params):
  2733. printDebug("showItemInfo Called" + str(params))
  2734. xbmcplugin.endOfDirectory(handle, cacheToDisc=False)
  2735.  
  2736. infoPage = ItemInfo("ItemInfo.xml", __cwd__, "default", "720p")
  2737.  
  2738. infoPage.setId(params.get("id"))
  2739. infoPage.doModal()
  2740.  
  2741. del infoPage
  2742.  
  2743. def showSearch(pluginName, handle, params):
  2744. printDebug("showSearch Called" + str(params))
  2745. xbmcplugin.endOfDirectory(handle, cacheToDisc=False)
  2746.  
  2747. searchDialog = SearchDialog("SearchDialog.xml", __cwd__, "default", "720p")
  2748.  
  2749. searchDialog.doModal()
  2750.  
  2751. del searchDialog
  2752.  
  2753. def showPersonInfo(pluginName, handle, params):
  2754. printDebug("showPersonInfo Called" + str(params))
  2755. xbmcplugin.endOfDirectory(handle, cacheToDisc=False)
  2756.  
  2757. infoPage = PersonInfo("PersonInfo.xml", __cwd__, "default", "720p")
  2758.  
  2759. infoPage.setPersonName(params.get("name"))
  2760. infoPage.doModal()
  2761.  
  2762. if(infoPage.showMovies == True):
  2763. xbmc.log("RUNNING_PLUGIN: " + infoPage.pluginCastLink)
  2764. xbmc.executebuiltin(infoPage.pluginCastLink)
  2765.  
  2766. del infoPage
  2767.  
  2768. def getWigetContent(pluginName, handle, params):
  2769. printDebug("getWigetContent Called" + str(params))
  2770.  
  2771. port = __settings__.getSetting('port')
  2772. host = __settings__.getSetting('ipaddress')
  2773. server = host + ":" + port
  2774.  
  2775. collectionType = params.get("CollectionType")
  2776. type = params.get("type")
  2777. parentId = params.get("ParentId")
  2778.  
  2779. if(type == None):
  2780. printDebug("getWigetContent No Type")
  2781. return
  2782.  
  2783. userid = downloadUtils.getUserId()
  2784.  
  2785. if(type == "recent"):
  2786. itemsUrl = "http://" + server + "/mediabrowser/Users/" + userid + "/items?ParentId=" + parentId + "&Limit=10&SortBy=DateCreated&Fields=Path&SortOrder=Descending&Filters=IsNotFolder&IncludeItemTypes=Movie,Episode,Trailer&CollapseBoxSetItems=false&IsVirtualUnaired=false&Recursive=true&IsMissing=False&format=json"
  2787. elif(type == "active"):
  2788. itemsUrl = "http://" + server + "/mediabrowser/Users/" + userid + "/items?ParentId=" + parentId + "&Limit=10&SortBy=DatePlayed&Fields=Path&SortOrder=Descending&Filters=IsResumable,IsNotFolder&IncludeItemTypes=Movie,Episode,Trailer&CollapseBoxSetItems=false&IsVirtualUnaired=false&Recursive=true&IsMissing=False&format=json"
  2789.  
  2790. printDebug("WIDGET_DATE_URL: " + itemsUrl, 2)
  2791.  
  2792. # get the recent items
  2793. jsonData = downloadUtils.downloadUrl(itemsUrl, suppress=False, popup=1 )
  2794. printDebug("Recent(Items) jsonData: " + jsonData, 2)
  2795. result = json.loads(jsonData)
  2796.  
  2797. result = result.get("Items")
  2798. if(result == None):
  2799. result = []
  2800.  
  2801. itemCount = 1
  2802. listItems = []
  2803. for item in result:
  2804. item_id = item.get("Id")
  2805.  
  2806. image_id = item_id
  2807. if item.get("Type") == "Episode":
  2808. image_id = item.get("SeriesId")
  2809.  
  2810. imageTag = ""
  2811. if(item.get("ImageTags") != None and item.get("ImageTags").get("Primary") != None):
  2812. imageTag = item.get("ImageTags").get("Primary")
  2813.  
  2814. image = "http://localhost:15001/?id=" + str(image_id) + "&type=" + "Primary" + "&tag=" + imageTag
  2815.  
  2816. name = item.get("Name")
  2817. printDebug("WIDGET_DATE_NAME: " + name, 2)
  2818.  
  2819. if(item.get("SeriesName") != None):
  2820. seriesName = item.get("SeriesName").encode('utf-8')
  2821.  
  2822. eppNumber = "X"
  2823. tempEpisodeNumber = "00"
  2824. if(item.get("IndexNumber") != None):
  2825. eppNumber = item.get("IndexNumber")
  2826. if eppNumber < 10:
  2827. tempEpisodeNumber = "0" + str(eppNumber)
  2828. else:
  2829. tempEpisodeNumber = str(eppNumber)
  2830.  
  2831. seasonNumber = item.get("ParentIndexNumber")
  2832. if seasonNumber < 10:
  2833. tempSeasonNumber = "0" + str(seasonNumber)
  2834. else:
  2835. tempSeasonNumber = str(seasonNumber)
  2836.  
  2837. name = tempSeasonNumber + "x" + tempEpisodeNumber + "-" + name
  2838.  
  2839. list_item = xbmcgui.ListItem(label=name, iconImage=image, thumbnailImage=image)
  2840.  
  2841. # add count
  2842. list_item.setProperty("item_index", str(itemCount))
  2843. itemCount = itemCount + 1
  2844.  
  2845. # add progress percent
  2846.  
  2847. userData = item.get("UserData")
  2848. PlaybackPositionTicks = '100'
  2849. overlay = "0"
  2850. favorite = "false"
  2851. seekTime = 0
  2852. if(userData != None):
  2853. playBackTicks = float(userData.get("PlaybackPositionTicks"))
  2854. if(playBackTicks != None and playBackTicks > 0):
  2855. runTimeTicks = float(item.get("RunTimeTicks", "0"))
  2856. if(runTimeTicks > 0):
  2857. percentage = int((playBackTicks / runTimeTicks) * 100.0)
  2858. cappedPercentage = percentage - (percentage % 10)
  2859. if(cappedPercentage == 0):
  2860. cappedPercentage = 10
  2861. if(cappedPercentage == 100):
  2862. cappedPercentage = 90
  2863. list_item.setProperty("complete_percentage", str(cappedPercentage))
  2864.  
  2865. selectAction = __settings__.getSetting('selectAction')
  2866. if(selectAction == "1"):
  2867. playUrl = "plugin://plugin.video.xbmb3c/?id=" + item_id + '&mode=' + str(_MODE_ITEM_DETAILS)
  2868. else:
  2869. url = server + ',;' + item_id
  2870. playUrl = "plugin://plugin.video.xbmb3c/?url=" + url + '&mode=' + str(_MODE_BASICPLAY)
  2871.  
  2872. itemTupple = (playUrl, list_item, False)
  2873. listItems.append(itemTupple)
  2874.  
  2875. xbmcplugin.addDirectoryItems(handle, listItems)
  2876. xbmcplugin.endOfDirectory(handle, cacheToDisc=False)
  2877.  
  2878. def showParentContent(pluginName, handle, params):
  2879. printDebug("showParentContent Called" + str(params), 2)
  2880.  
  2881. port = __settings__.getSetting('port')
  2882. host = __settings__.getSetting('ipaddress')
  2883. server = host + ":" + port
  2884.  
  2885. parentId = params.get("ParentId")
  2886. name = params.get("Name")
  2887. detailsString = getDetailsString()
  2888. userid = downloadUtils.getUserId()
  2889.  
  2890. contentUrl = (
  2891. "http://" + server +
  2892. "/mediabrowser/Users/" + userid + "/items?ParentId=" + parentId +
  2893. "&IsVirtualUnaired=false" +
  2894. "&IsMissing=False" +
  2895. "&Fields=" + detailsString +
  2896. "&SortOrder=" + __settings__.getSetting('sortorderfor' + urllib.quote(name)) +
  2897. "&SortBy=" + __settings__.getSetting('sortbyfor' + urllib.quote(name)) +
  2898. "&Genres=&format=json")
  2899.  
  2900. printDebug("showParentContent Content Url : " + str(contentUrl), 2)
  2901.  
  2902. getContent(contentUrl)
  2903.  
  2904. def showViewList(url, pluginhandle):
  2905. viewCats=['Movies', 'BoxSets', 'Trailers', 'Series', 'Seasons', 'Episodes', 'Music Artists', 'Music Albums', 'Music Videos', 'Music Tracks']
  2906. viewTypes=['_MOVIES', '_BOXSETS', '_TRAILERS', '_SERIES', '_SEASONS', '_EPISODES', '_MUSICARTISTS', '_MUSICALBUMS', '_MUSICVIDEOS', '_MUSICTRACKS']
  2907. if "SETVIEWS" in url:
  2908. for viewCat in viewCats:
  2909. xbmcplugin.addDirectoryItem(pluginhandle, 'plugin://plugin.video.xbmb3c/?url=_SHOWVIEWS' + viewTypes[viewCats.index(viewCat)] + '&mode=' + str(_MODE_SETVIEWS), xbmcgui.ListItem(viewCat, ''), isFolder=True)
  2910. elif "_SETVIEW_" in url:
  2911. category=url.split('_')[2]
  2912. viewNum=url.split('_')[3]
  2913. __settings__.setSetting(xbmc.getSkinDir()+ '_VIEW_' +category,viewNum)
  2914. xbmc.executebuiltin("Container.Refresh")
  2915. else:
  2916.  
  2917. skin_view_file = os.path.join(xbmc.translatePath('special://skin'), "views.xml")
  2918. try:
  2919. tree = etree.parse(skin_view_file)
  2920. except:
  2921. xbmcgui.Dialog().ok(__language__(30135), __language__(30150))
  2922. sys.exit()
  2923. root = tree.getroot()
  2924. xbmcplugin.addDirectoryItem(pluginhandle, 'plugin://plugin.video.xbmb3c?url=_SETVIEW_'+ url.split('_')[2] + '_' + '' + '&mode=' + str(_MODE_SETVIEWS), xbmcgui.ListItem('Clear Settings', 'test'))
  2925. for view in root.iter('view'):
  2926. if __settings__.getSetting(xbmc.getSkinDir()+ '_VIEW_'+ url.split('_')[2]) == view.attrib['value']:
  2927. name=view.attrib['id'] + " (Active)"
  2928. else:
  2929. name=view.attrib['id']
  2930. xbmcplugin.addDirectoryItem(pluginhandle, 'plugin://plugin.video.xbmb3c?url=_SETVIEW_'+ url.split('_')[2] + '_' + view.attrib['value'] + '&mode=' + str(_MODE_SETVIEWS), xbmcgui.ListItem(name, 'test'))
  2931. xbmcplugin.endOfDirectory(pluginhandle, cacheToDisc=False)
  2932.  
  2933. def checkService():
  2934.  
  2935. timeStamp = xbmcgui.Window(10000).getProperty("XBMB3C_Service_Timestamp")
  2936. loops = 0
  2937. while(timeStamp == ""):
  2938. timeStamp = xbmcgui.Window(10000).getProperty("XBMB3C_Service_Timestamp")
  2939. loops = loops + 1
  2940. if(loops == 40):
  2941. printDebug("XBMB3C Service Not Running, no time stamp, exiting", 0)
  2942. xbmcgui.Dialog().ok(__language__(30135), __language__(30136), __language__(30137))
  2943. sys.exit()
  2944. xbmc.sleep(200)
  2945.  
  2946. printDebug ("XBMB3C Service Timestamp: " + timeStamp)
  2947. printDebug ("XBMB3C Current Timestamp: " + str(int(time.time())))
  2948.  
  2949. if((int(timeStamp) + 240) < int(time.time())):
  2950. printDebug("XBMB3C Service Not Running, time stamp to old, exiting", 0)
  2951. xbmcgui.Dialog().ok(__language__(30135), __language__(30136), __language__(30137))
  2952. sys.exit()
  2953.  
  2954. def checkServer():
  2955. printDebug ("XBMB3C checkServer Called")
  2956.  
  2957. port = __settings__.getSetting('port')
  2958. host = __settings__.getSetting('ipaddress')
  2959.  
  2960. if(len(host) != 0 and host != "<none>"):
  2961. printDebug ("XBMB3C server already set")
  2962. return
  2963.  
  2964. serverInfo = getServerDetails()
  2965.  
  2966. if(serverInfo == None):
  2967. printDebug ("XBMB3C getServerDetails failed")
  2968. return
  2969.  
  2970. index = serverInfo.find(":")
  2971.  
  2972. if(index <= 0):
  2973. printDebug ("XBMB3C getServerDetails data not correct : " + serverInfo)
  2974. return
  2975.  
  2976. server_address = serverInfo[:index]
  2977. server_port = serverInfo[index+1:]
  2978. printDebug ("XBMB3C detected server info " + server_address + " : " + server_port)
  2979.  
  2980. xbmcgui.Dialog().ok("Server Detection Succeeded", "Found server", "Address : " + server_address, "Port : " + server_port)
  2981.  
  2982. # get a list of users
  2983. printDebug ("Getting user list")
  2984. jsonData = None
  2985. try:
  2986. jsonData = downloadUtils.downloadUrl(server_address + ":" + server_port + "/mediabrowser/Users?format=json")
  2987. except Exception, msg:
  2988. error = "Get User unable to connect to " + server_address + ":" + server_port + " : " + str(msg)
  2989. xbmc.log (error)
  2990. return ""
  2991.  
  2992. if(jsonData == False):
  2993. return
  2994.  
  2995. printDebug("jsonData : " + str(jsonData), level=2)
  2996. result = json.loads(jsonData)
  2997.  
  2998. names = []
  2999. userList = []
  3000. for user in result:
  3001. config = user.get("Configuration")
  3002. if(config != None):
  3003. if(config.get("IsHidden") == False):
  3004. name = user.get("Name")
  3005. userList.append(name)
  3006. if(user.get("HasPassword") == True):
  3007. name = name + " (Secure)"
  3008. names.append(name)
  3009.  
  3010. printDebug ("User List : " + str(names))
  3011. printDebug ("User List : " + str(userList))
  3012. return_value = xbmcgui.Dialog().select("Select User", names)
  3013.  
  3014. if(return_value > -1):
  3015. selected_user = userList[return_value]
  3016. printDebug("Setting Selected User : " + selected_user)
  3017. if __settings__.getSetting("port") != server_port:
  3018. __settings__.setSetting("port", server_port)
  3019. if __settings__.getSetting("ipaddress") != server_address:
  3020. __settings__.setSetting("ipaddress", server_address)
  3021. if __settings__.getSetting("username") != selected_user:
  3022. __settings__.setSetting("username", selected_user)
  3023.  
  3024. ###########################################################################
  3025. ##Start of Main
  3026. ###########################################################################
  3027. if(logLevel == 2):
  3028. xbmcgui.Dialog().ok(__language__(30132), __language__(30133), __language__(30134))
  3029.  
  3030. printDebug( "XBMB3C -> Script argument date " + str(sys.argv))
  3031. xbmcVersionNum = getXbmcVersion()
  3032. try:
  3033. params=get_params(sys.argv[2])
  3034. except:
  3035. params={}
  3036. printDebug( "XBMB3C -> Script params is " + str(params))
  3037. #Check to see if XBMC is playing - we don't want to do anything if so
  3038. #if xbmc.Player().isPlaying():
  3039. # printDebug ('Already Playing! Exiting...')
  3040. # sys.exit()
  3041. #Now try and assign some data to them
  3042. param_url=params.get('url',None)
  3043.  
  3044. if param_url and ( param_url.startswith('http') or param_url.startswith('file') ):
  3045. param_url = urllib.unquote(param_url)
  3046.  
  3047. param_name = urllib.unquote_plus(params.get('name',""))
  3048. mode = int(params.get('mode',-1))
  3049. param_transcodeOverride = int(params.get('transcode',0))
  3050. param_identifier = params.get('identifier',None)
  3051. param_indirect = params.get('indirect',None)
  3052. force = params.get('force')
  3053. WINDOW = xbmcgui.Window( 10000 )
  3054. WINDOW.setProperty("addshowname","false")
  3055.  
  3056. if str(sys.argv[1]) == "skin":
  3057. skin()
  3058. elif sys.argv[1] == "check_server":
  3059. checkServer()
  3060. elif sys.argv[1] == "update":
  3061. url=sys.argv[2]
  3062. libraryRefresh(url)
  3063. elif sys.argv[1] == "markWatched":
  3064. url=sys.argv[2]
  3065. markWatched(url)
  3066. elif sys.argv[1] == "markUnwatched":
  3067. url=sys.argv[2]
  3068. markUnwatched(url)
  3069. elif sys.argv[1] == "markFavorite":
  3070. url=sys.argv[2]
  3071. markFavorite(url)
  3072. elif sys.argv[1] == "unmarkFavorite":
  3073. url=sys.argv[2]
  3074. unmarkFavorite(url)
  3075. elif sys.argv[1] == "setting":
  3076. __settings__.openSettings()
  3077. WINDOW = xbmcgui.getCurrentWindowId()
  3078. if WINDOW == 10000:
  3079. printDebug("Currently in home - refreshing to allow new settings to be taken")
  3080. xbmc.executebuiltin("XBMC.ActivateWindow(Home)")
  3081. elif sys.argv[1] == "delete":
  3082. url=sys.argv[2]
  3083. delete(url)
  3084. elif sys.argv[1] == "refresh":
  3085. WINDOW = xbmcgui.Window( 10000 )
  3086. WINDOW.setProperty("force_data_reload", "true")
  3087. xbmc.executebuiltin("Container.Refresh")
  3088. elif sys.argv[1] == "sortby":
  3089. sortby()
  3090. elif sys.argv[1] == "sortorder":
  3091. sortorder()
  3092. elif sys.argv[1] == "genrefilter":
  3093. genrefilter()
  3094. elif sys.argv[1] == "playall":
  3095. startId=sys.argv[2]
  3096. playall(startId)
  3097. elif mode == _MODE_CAST_LIST:
  3098. getCastList(sys.argv[0], int(sys.argv[1]), params)
  3099. elif mode == _MODE_PERSON_DETAILS:
  3100. showPersonInfo(sys.argv[0], int(sys.argv[1]), params)
  3101. elif mode == _MODE_WIDGET_CONTENT:
  3102. getWigetContent(sys.argv[0], int(sys.argv[1]), params)
  3103. elif mode == _MODE_ITEM_DETAILS:
  3104. showItemInfo(sys.argv[0], int(sys.argv[1]), params)
  3105. elif mode == _MODE_SHOW_SEARCH:
  3106. showSearch(sys.argv[0], int(sys.argv[1]), params)
  3107. elif mode == _MODE_SHOW_PARENT_CONTENT:
  3108. checkService()
  3109. checkServer()
  3110. pluginhandle = int(sys.argv[1])
  3111. showParentContent(sys.argv[0], int(sys.argv[1]), params)
  3112. else:
  3113.  
  3114. checkService()
  3115. checkServer()
  3116.  
  3117. pluginhandle = int(sys.argv[1])
  3118.  
  3119. WINDOW = xbmcgui.Window( 10000 )
  3120. WINDOW.clearProperty("heading")
  3121. #mode=_MODE_BASICPLAY
  3122.  
  3123. printDebug("XBMB3C -> Mode: "+str(mode))
  3124. printDebug("XBMB3C -> URL: "+str(param_url))
  3125. printDebug("XBMB3C -> Name: "+str(param_name))
  3126. printDebug("XBMB3C -> identifier: " + str(param_identifier))
  3127.  
  3128. #Run a function based on the mode variable that was passed in the URL
  3129. if ( mode == None or mode == _MODE_SHOW_SECTIONS or param_url == None or len(param_url) < 1 ):
  3130. displaySections()
  3131.  
  3132. elif mode == _MODE_GETCONTENT:
  3133. if __settings__.getSetting('profile') == "true":
  3134.  
  3135. xbmcgui.Dialog().ok("Warning", "Profiling enabled.", "Please remember to turn off when finished testing.")
  3136.  
  3137. pr = cProfile.Profile()
  3138. pr.enable()
  3139. getContent(param_url)
  3140. pr.disable()
  3141. ps = pstats.Stats(pr)
  3142.  
  3143. fileTimeStamp = time.strftime("%Y-%m-%d %H-%M-%S")
  3144. tabFileName = __addondir__ + "profile_(" + fileTimeStamp + ").tab"
  3145. f = open(tabFileName, 'wb')
  3146. f.write("NumbCalls\tTotalTime\tCumulativeTime\tFunctionName\tFileName\r\n")
  3147. for (key, value) in ps.stats.items():
  3148. (filename, count, func_name) = key
  3149. (ccalls, ncalls, total_time, cumulative_time, callers) = value
  3150. f.write(str(ncalls) + "\t" + "{:10.4f}".format(total_time) + "\t" + "{:10.4f}".format(cumulative_time) + "\t" + func_name + "\t" + filename + "\r\n")
  3151. f.close()
  3152.  
  3153. else:
  3154. getContent(param_url)
  3155.  
  3156. elif mode == _MODE_BASICPLAY:
  3157. PLAY(param_url, pluginhandle)
  3158. elif mode == _MODE_PLAYLISTPLAY:
  3159. PLAYPlaylist(param_url, pluginhandle)
  3160. elif mode == _MODE_SEARCH:
  3161. searchString=urllib.quote(xbmcgui.Dialog().input(__language__(30138)))
  3162. printDebug("Search String : " + searchString)
  3163. if searchString == "":
  3164. sys.exit()
  3165. param_url=param_url.replace("Search/Hints?","Search/Hints?SearchTerm="+searchString + "&UserId=")
  3166. param_url=param_url + "&Fields=" + getDetailsString() + "&format=json"
  3167. getContent(param_url)
  3168. elif mode == _MODE_SETVIEWS:
  3169. showViewList(param_url, pluginhandle)
  3170.  
  3171. WINDOW = xbmcgui.Window( 10000 )
  3172. WINDOW.clearProperty("MB3.Background.Item.FanArt")
  3173. xbmc.log ("===== XBMB3C STOP =====")
  3174.  
  3175. #clear done and exit.
  3176. sys.modules.clear()
Add Comment
Please, Sign In to add comment