PageRenderTime 69ms CodeModel.GetById 30ms RepoModel.GetById 0ms app.codeStats 0ms

/plugin.video.GOmovies/default.py

https://github.com/pudis1977/lambda-xbmc-addons
Python | 2657 lines | 2592 code | 33 blank | 32 comment | 53 complexity | 36f8cf41c786c321a2ce85a1b2cfe586 MD5 | raw file
Possible License(s): GPL-3.0

Large files files are truncated, but you can click here to view the full file

  1. # -*- coding: utf-8 -*-
  2. '''
  3. GOmovies XBMC Addon
  4. Copyright (C) 2014 lambda
  5. This program is free software: you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation, either version 3 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. '''
  16. import urllib,urllib2,re,os,threading,datetime,time,base64,xbmc,xbmcplugin,xbmcgui,xbmcaddon,xbmcvfs
  17. from operator import itemgetter
  18. try: import json
  19. except: import simplejson as json
  20. try: import CommonFunctions
  21. except: import commonfunctionsdummy as CommonFunctions
  22. try: import StorageServer
  23. except: import storageserverdummy as StorageServer
  24. from metahandler import metahandlers
  25. from metahandler import metacontainers
  26. action = None
  27. common = CommonFunctions
  28. metaget = metahandlers.MetaData(preparezip=False)
  29. language = xbmcaddon.Addon().getLocalizedString
  30. setSetting = xbmcaddon.Addon().setSetting
  31. getSetting = xbmcaddon.Addon().getSetting
  32. addonName = xbmcaddon.Addon().getAddonInfo("name")
  33. addonVersion = xbmcaddon.Addon().getAddonInfo("version")
  34. addonId = xbmcaddon.Addon().getAddonInfo("id")
  35. addonPath = xbmcaddon.Addon().getAddonInfo("path")
  36. addonFullId = addonName + addonVersion
  37. addonDesc = language(30450).encode("utf-8")
  38. cache = StorageServer.StorageServer(addonFullId,1).cacheFunction
  39. cache2 = StorageServer.StorageServer(addonFullId,24).cacheFunction
  40. cache3 = StorageServer.StorageServer(addonFullId,720).cacheFunction
  41. addonIcon = os.path.join(addonPath,'icon.png')
  42. addonFanart = os.path.join(addonPath,'fanart.jpg')
  43. addonLogos = os.path.join(addonPath,'resources/logos')
  44. addonArt = os.path.join(addonPath,'resources/art')
  45. addonPoster = os.path.join(addonPath,'resources/art/Poster.png')
  46. addonDownloads = os.path.join(addonPath,'resources/art/Downloads.png')
  47. addonGenres = os.path.join(addonPath,'resources/art/Genres.png')
  48. addonYears = os.path.join(addonPath,'resources/art/Years.png')
  49. addonLists = os.path.join(addonPath,'resources/art/Lists.png')
  50. addonNext = os.path.join(addonPath,'resources/art/Next.png')
  51. dataPath = xbmc.translatePath('special://profile/addon_data/%s' % (addonId))
  52. viewData = os.path.join(dataPath,'views.cfg')
  53. offData = os.path.join(dataPath,'offset.cfg')
  54. favData = os.path.join(dataPath,'favourites.cfg')
  55. class main:
  56. def __init__(self):
  57. global action
  58. index().container_data()
  59. index().settings_reset()
  60. params = {}
  61. splitparams = sys.argv[2][sys.argv[2].find('?') + 1:].split('&')
  62. for param in splitparams:
  63. if (len(param) > 0):
  64. splitparam = param.split('=')
  65. key = splitparam[0]
  66. try: value = splitparam[1].encode("utf-8")
  67. except: value = splitparam[1]
  68. params[key] = value
  69. try: action = urllib.unquote_plus(params["action"])
  70. except: action = None
  71. try: name = urllib.unquote_plus(params["name"])
  72. except: name = None
  73. try: url = urllib.unquote_plus(params["url"])
  74. except: url = None
  75. try: image = urllib.unquote_plus(params["image"])
  76. except: image = None
  77. try: query = urllib.unquote_plus(params["query"])
  78. except: query = None
  79. try: title = urllib.unquote_plus(params["title"])
  80. except: title = None
  81. try: year = urllib.unquote_plus(params["year"])
  82. except: year = None
  83. try: imdb_id = urllib.unquote_plus(params["imdb"])
  84. except: imdb_id = None
  85. if action == None: root().get()
  86. elif action == 'root_search': root().search()
  87. elif action == 'item_play': contextMenu().item_play()
  88. elif action == 'item_random_play': contextMenu().item_random_play()
  89. elif action == 'item_queue': contextMenu().item_queue()
  90. elif action == 'favourite_add': contextMenu().favourite_add(favData, name, url, image, imdb_id, year)
  91. elif action == 'favourite_from_search': contextMenu().favourite_from_search(favData, name, url, image, imdb_id, year)
  92. elif action == 'favourite_delete': contextMenu().favourite_delete(favData, name, url)
  93. elif action == 'favourite_moveUp': contextMenu().favourite_moveUp(favData, name, url)
  94. elif action == 'favourite_moveDown': contextMenu().favourite_moveDown(favData, name, url)
  95. elif action == 'playlist_open': contextMenu().playlist_open()
  96. elif action == 'settings_open': contextMenu().settings_open()
  97. elif action == 'addon_home': contextMenu().addon_home()
  98. elif action == 'view_movies': contextMenu().view('movies')
  99. elif action == 'metadata_movies': contextMenu().metadata('movie', imdb_id, '', '')
  100. elif action == 'metadata_movies2': contextMenu().metadata('movie', imdb_id, '', '')
  101. elif action == 'playcount_movies': contextMenu().playcount('movie', imdb_id, '', '')
  102. elif action == 'library_batch': contextMenu().library_batch(url)
  103. elif action == 'library': contextMenu().library(name, title, imdb_id, year, url)
  104. elif action == 'download': contextMenu().download(name, title, imdb_id, year, url)
  105. elif action == 'sources': contextMenu().sources(name, title, imdb_id, year, url)
  106. elif action == 'autoplay': contextMenu().autoplay(name, title, imdb_id, year, url)
  107. elif action == 'trailer': contextMenu().trailer(name, url)
  108. elif action == 'movies': movies().get(url)
  109. elif action == 'movies_userlists': movies().get(url)
  110. elif action == 'movies_popular': imdb().popular()
  111. elif action == 'movies_boxoffice': imdb().boxoffice()
  112. elif action == 'movies_views': imdb().views()
  113. elif action == 'movies_oscars': imdb().oscars()
  114. elif action == 'movies_search': imdb().search(query)
  115. elif action == 'movies_favourites': favourites().movies()
  116. elif action == 'movies_trending': trakt().trending()
  117. elif action == 'channels_movies': channels().get()
  118. elif action == 'actors_search': imdb().actors_search(query)
  119. elif action == 'genres_movies': imdb().genres()
  120. elif action == 'years_movies': imdb().years()
  121. elif action == 'userlists_imdb': imdb_user().userlists()
  122. elif action == 'userlists_trakt': trakt().userlists()
  123. elif action == 'play': resolver().run(name, title, imdb_id, year, url)
  124. if action is None:
  125. pass
  126. elif action.startswith('movies'):
  127. xbmcplugin.setContent(int(sys.argv[1]), 'movies')
  128. index().container_view('movies', {'skin.confluence' : 500})
  129. elif action.startswith('channels'):
  130. xbmcplugin.setContent(int(sys.argv[1]), 'episodes')
  131. xbmcplugin.setPluginFanart(int(sys.argv[1]), addonFanart)
  132. xbmcplugin.endOfDirectory(int(sys.argv[1]))
  133. return
  134. class getUrl(object):
  135. def __init__(self, url, close=True, proxy=None, post=None, mobile=False, referer=None, cookie=None, output='', timeout='10'):
  136. if not proxy is None:
  137. proxy_handler = urllib2.ProxyHandler({'http':'%s' % (proxy)})
  138. opener = urllib2.build_opener(proxy_handler, urllib2.HTTPHandler)
  139. opener = urllib2.install_opener(opener)
  140. if output == 'cookie' or not close == True:
  141. import cookielib
  142. cookie_handler = urllib2.HTTPCookieProcessor(cookielib.LWPCookieJar())
  143. opener = urllib2.build_opener(cookie_handler, urllib2.HTTPBasicAuthHandler(), urllib2.HTTPHandler())
  144. opener = urllib2.install_opener(opener)
  145. if not post is None:
  146. request = urllib2.Request(url, post)
  147. else:
  148. request = urllib2.Request(url,None)
  149. if mobile == True:
  150. request.add_header('User-Agent', 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7')
  151. else:
  152. request.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0')
  153. if not referer is None:
  154. request.add_header('Referer', referer)
  155. if not cookie is None:
  156. request.add_header('cookie', cookie)
  157. response = urllib2.urlopen(request, timeout=int(timeout))
  158. if output == 'cookie':
  159. result = str(response.headers.get('Set-Cookie'))
  160. elif output == 'geturl':
  161. result = response.geturl()
  162. else:
  163. result = response.read()
  164. if close == True:
  165. response.close()
  166. self.result = result
  167. class uniqueList(object):
  168. def __init__(self, list):
  169. uniqueSet = set()
  170. uniqueList = []
  171. for n in list:
  172. if n not in uniqueSet:
  173. uniqueSet.add(n)
  174. uniqueList.append(n)
  175. self.list = uniqueList
  176. class Thread(threading.Thread):
  177. def __init__(self, target, *args):
  178. self._target = target
  179. self._args = args
  180. threading.Thread.__init__(self)
  181. def run(self):
  182. self._target(*self._args)
  183. class player(xbmc.Player):
  184. def __init__ (self):
  185. self.folderPath = xbmc.getInfoLabel('Container.FolderPath')
  186. self.loadingStarting = time.time()
  187. xbmc.Player.__init__(self)
  188. def run(self, name, url, imdb='0'):
  189. self.video_info(name, imdb)
  190. if self.folderPath.startswith(sys.argv[0]):
  191. item = xbmcgui.ListItem(path=url)
  192. xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, item)
  193. else:
  194. try:
  195. file = self.name + '.strm'
  196. file = file.translate(None, '\/:*?"<>|')
  197. meta = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "VideoLibrary.GetMovies", "params": {"filter":{"or": [{"field": "year", "operator": "is", "value": "%s"}, {"field": "year", "operator": "is", "value": "%s"}, {"field": "year", "operator": "is", "value": "%s"}]}, "properties" : ["title", "genre", "year", "rating", "director", "trailer", "tagline", "plot", "plotoutline", "originaltitle", "lastplayed", "playcount", "writer", "studio", "mpaa", "country", "imdbnumber", "runtime", "votes", "fanart", "thumbnail", "file", "sorttitle", "resume", "dateadded"]}, "id": 1}' % (self.year, str(int(self.year)+1), str(int(self.year)-1)))
  198. meta = unicode(meta, 'utf-8', errors='ignore')
  199. meta = json.loads(meta)
  200. meta = meta['result']['movies']
  201. self.meta = [i for i in meta if i['file'].endswith(file)][0]
  202. meta = {'title': self.meta['title'], 'originaltitle': self.meta['originaltitle'], 'year': self.meta['year'], 'genre': str(self.meta['genre']).replace("[u'", '').replace("']", '').replace("', u'", ' / '), 'director': str(self.meta['director']).replace("[u'", '').replace("']", '').replace("', u'", ' / '), 'country': str(self.meta['country']).replace("[u'", '').replace("']", '').replace("', u'", ' / '), 'rating': self.meta['rating'], 'votes': self.meta['votes'], 'mpaa': self.meta['mpaa'], 'duration': self.meta['runtime'], 'trailer': self.meta['trailer'], 'writer': str(self.meta['writer']).replace("[u'", '').replace("']", '').replace("', u'", ' / '), 'studio': str(self.meta['studio']).replace("[u'", '').replace("']", '').replace("', u'", ' / '), 'tagline': self.meta['tagline'], 'plotoutline': self.meta['plotoutline'], 'plot': self.meta['plot']}
  203. poster = self.meta['thumbnail']
  204. except:
  205. meta = {'label': self.name, 'title': self.name}
  206. poster = ''
  207. item = xbmcgui.ListItem(path=url, iconImage="DefaultVideo.png", thumbnailImage=poster)
  208. item.setInfo( type="Video", infoLabels= meta )
  209. xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, item)
  210. for i in range(0, 250):
  211. try: self.totalTime = self.getTotalTime()
  212. except: self.totalTime = 0
  213. if not self.totalTime == 0: continue
  214. xbmc.sleep(1000)
  215. if self.totalTime == 0: return
  216. while True:
  217. try: self.currentTime = self.getTime()
  218. except: break
  219. xbmc.sleep(1000)
  220. def video_info(self, name, imdb):
  221. self.name = name
  222. self.content = 'movie'
  223. self.title = self.name.rsplit(' (', 1)[0].strip()
  224. self.year = '%04d' % int(self.name.rsplit(' (', 1)[-1].split(')')[0])
  225. if imdb == '0': imdb = metaget.get_meta('movie', self.title ,year=str(self.year))['imdb_id']
  226. self.imdb = re.sub('[^0-9]', '', imdb)
  227. self.subtitle = subtitles().get(self.name, self.imdb, '', '')
  228. def container_refresh(self):
  229. try:
  230. params = {}
  231. query = self.folderPath[self.folderPath.find('?') + 1:].split('&')
  232. for i in query: params[i.split('=')[0]] = i.split('=')[1]
  233. if not params["action"].endswith('_search'): index().container_refresh()
  234. except:
  235. pass
  236. def offset_add(self):
  237. try:
  238. file = xbmcvfs.File(offData)
  239. read = file.read()
  240. file.close()
  241. write = [i.strip('\n').strip('\r') for i in read.splitlines(True) if i.strip('\r\n')]
  242. write.append('"%s"|"%s"|"%s"' % (self.name, self.imdb, self.currentTime))
  243. write = '\r\n'.join(write)
  244. file = xbmcvfs.File(offData, 'w')
  245. file.write(str(write))
  246. file.close()
  247. except:
  248. return
  249. def offset_delete(self):
  250. try:
  251. file = xbmcvfs.File(offData)
  252. read = file.read()
  253. file.close()
  254. write = [i.strip('\n').strip('\r') for i in read.splitlines(True) if i.strip('\r\n')]
  255. write = [i for i in write if not '"%s"|"%s"|"' % (self.name, self.imdb) in i]
  256. write = '\r\n'.join(write)
  257. file = xbmcvfs.File(offData, 'w')
  258. file.write(str(write))
  259. file.close()
  260. except:
  261. return
  262. def offset_read(self):
  263. try:
  264. self.offset = '0'
  265. file = xbmcvfs.File(offData)
  266. read = file.read()
  267. file.close()
  268. read = [i for i in read.splitlines(True) if '"%s"|"%s"|"' % (self.name, self.imdb) in i][0]
  269. self.offset = re.compile('".+?"[|]".+?"[|]"(.+?)"').findall(read)[0]
  270. except:
  271. return
  272. def change_watched(self):
  273. try:
  274. xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "VideoLibrary.SetMovieDetails", "params": {"movieid" : %s, "playcount" : 1 }, "id": 1 }' % str(self.meta['movieid']))
  275. except:
  276. metaget.change_watched(self.content, '', self.imdb, season='', episode='', year='', watched=7)
  277. def resume_playback(self):
  278. offset = float(self.offset)
  279. if not offset > 0: return
  280. minutes, seconds = divmod(offset, 60)
  281. hours, minutes = divmod(minutes, 60)
  282. offset_time = '%02d:%02d:%02d' % (hours, minutes, seconds)
  283. yes = index().yesnoDialog('%s %s' % (language(30353).encode("utf-8"), offset_time), '', self.name, language(30354).encode("utf-8"), language(30355).encode("utf-8"))
  284. if yes: self.seekTime(offset)
  285. def onPlayBackStarted(self):
  286. try: self.setSubtitles(self.subtitle)
  287. except: pass
  288. if getSetting("playback_info") == 'true':
  289. elapsedTime = '%s %.2f seconds' % (language(30319).encode("utf-8"), (time.time() - self.loadingStarting))
  290. index().infoDialog(elapsedTime, header=self.name)
  291. if getSetting("resume_playback") == 'true':
  292. self.offset_read()
  293. self.resume_playback()
  294. def onPlayBackEnded(self):
  295. self.change_watched()
  296. self.offset_delete()
  297. self.container_refresh()
  298. def onPlayBackStopped(self):
  299. if self.currentTime / self.totalTime >= .9:
  300. self.change_watched()
  301. self.offset_delete()
  302. self.offset_add()
  303. self.container_refresh()
  304. class subtitles:
  305. def get(self, name, imdb, season, episode):
  306. if not getSetting("subtitles") == 'true': return
  307. quality = ['bluray', 'hdrip', 'brrip', 'bdrip', 'dvdrip', 'webrip', 'hdtv']
  308. langDict = {'Afrikaans': 'afr', 'Albanian': 'alb', 'Arabic': 'ara', 'Armenian': 'arm', 'Basque': 'baq', 'Bengali': 'ben', 'Bosnian': 'bos', 'Breton': 'bre', 'Bulgarian': 'bul', 'Burmese': 'bur', 'Catalan': 'cat', 'Chinese': 'chi', 'Croatian': 'hrv', 'Czech': 'cze', 'Danish': 'dan', 'Dutch': 'dut', 'English': 'eng', 'Esperanto': 'epo', 'Estonian': 'est', 'Finnish': 'fin', 'French': 'fre', 'Galician': 'glg', 'Georgian': 'geo', 'German': 'ger', 'Greek': 'ell', 'Hebrew': 'heb', 'Hindi': 'hin', 'Hungarian': 'hun', 'Icelandic': 'ice', 'Indonesian': 'ind', 'Italian': 'ita', 'Japanese': 'jpn', 'Kazakh': 'kaz', 'Khmer': 'khm', 'Korean': 'kor', 'Latvian': 'lav', 'Lithuanian': 'lit', 'Luxembourgish': 'ltz', 'Macedonian': 'mac', 'Malay': 'may', 'Malayalam': 'mal', 'Manipuri': 'mni', 'Mongolian': 'mon', 'Montenegrin': 'mne', 'Norwegian': 'nor', 'Occitan': 'oci', 'Persian': 'per', 'Polish': 'pol', 'Portuguese': 'por,pob', 'Portuguese(Brazil)': 'pob,por', 'Romanian': 'rum', 'Russian': 'rus', 'Serbian': 'scc', 'Sinhalese': 'sin', 'Slovak': 'slo', 'Slovenian': 'slv', 'Spanish': 'spa', 'Swahili': 'swa', 'Swedish': 'swe', 'Syriac': 'syr', 'Tagalog': 'tgl', 'Tamil': 'tam', 'Telugu': 'tel', 'Thai': 'tha', 'Turkish': 'tur', 'Ukrainian': 'ukr', 'Urdu': 'urd'}
  309. langs = []
  310. try: langs.append(langDict[getSetting("sublang1")])
  311. except: pass
  312. try: langs.append(langDict[getSetting("sublang2")])
  313. except: pass
  314. langs = ','.join(langs)
  315. try:
  316. import xmlrpclib
  317. server = xmlrpclib.Server('http://api.opensubtitles.org/xml-rpc', verbose=0)
  318. token = server.LogIn('', '', 'en', 'XBMC_Subtitles_v1')['token']
  319. result = server.SearchSubtitles(token, [{'sublanguageid': langs, 'imdbid': imdb}])['data']
  320. result = [i for i in result if i['SubSumCD'] == '1']
  321. except:
  322. return
  323. subtitles = []
  324. for lang in langs.split(','):
  325. filter = [i for i in result if lang == i['SubLanguageID']]
  326. if filter == []: continue
  327. for q in quality: subtitles += [i for i in filter if q in i['MovieReleaseName'].lower()]
  328. subtitles += [i for i in filter if not any(x in i['MovieReleaseName'].lower() for x in quality)]
  329. try: lang = xbmc.convertLanguage(lang, xbmc.ISO_639_1)
  330. except: pass
  331. break
  332. try:
  333. import zlib, base64
  334. content = [subtitles[0]["IDSubtitleFile"],]
  335. content = server.DownloadSubtitles(token, content)
  336. content = base64.b64decode(content['data'][0]['data'])
  337. content = zlib.decompressobj(16+zlib.MAX_WBITS).decompress(content)
  338. subtitle = xbmc.translatePath('special://temp/')
  339. subtitle = os.path.join(subtitle, 'TemporarySubs.%s.srt' % lang)
  340. file = open(subtitle, 'wb')
  341. file.write(content)
  342. file.close()
  343. return subtitle
  344. except:
  345. index().infoDialog(language(30317).encode("utf-8"), name)
  346. return
  347. class index:
  348. def infoDialog(self, str, header=addonName):
  349. try: xbmcgui.Dialog().notification(header, str, addonIcon, 3000, sound=False)
  350. except: xbmc.executebuiltin("Notification(%s,%s, 3000, %s)" % (header, str, addonIcon))
  351. def okDialog(self, str1, str2, header=addonName):
  352. xbmcgui.Dialog().ok(header, str1, str2)
  353. def selectDialog(self, list, header=addonName):
  354. select = xbmcgui.Dialog().select(header, list)
  355. return select
  356. def yesnoDialog(self, str1, str2, header=addonName, str3='', str4=''):
  357. answer = xbmcgui.Dialog().yesno(header, str1, str2, '', str4, str3)
  358. return answer
  359. def getProperty(self, str):
  360. property = xbmcgui.Window(10000).getProperty(str)
  361. return property
  362. def setProperty(self, str1, str2):
  363. xbmcgui.Window(10000).setProperty(str1, str2)
  364. def clearProperty(self, str):
  365. xbmcgui.Window(10000).clearProperty(str)
  366. def addon_status(self, id):
  367. check = xbmcaddon.Addon(id=id).getAddonInfo("name")
  368. if not check == addonName: return True
  369. def container_refresh(self):
  370. xbmc.executebuiltin("Container.Refresh")
  371. def container_data(self):
  372. if not xbmcvfs.exists(dataPath):
  373. xbmcvfs.mkdir(dataPath)
  374. if not xbmcvfs.exists(favData):
  375. file = xbmcvfs.File(favData, 'w')
  376. file.write('')
  377. file.close()
  378. if not xbmcvfs.exists(viewData):
  379. file = xbmcvfs.File(viewData, 'w')
  380. file.write('')
  381. file.close()
  382. if not xbmcvfs.exists(offData):
  383. file = xbmcvfs.File(offData, 'w')
  384. file.write('')
  385. file.close()
  386. def settings_reset(self):
  387. try:
  388. if getSetting("settings_version") == '2.0.0': return
  389. settings = os.path.join(addonPath,'resources/settings.xml')
  390. file = xbmcvfs.File(settings)
  391. read = file.read()
  392. file.close()
  393. for i in range (1,4): setSetting('hosthd' + str(i), common.parseDOM(read, "setting", ret="default", attrs = {"id": 'hosthd' + str(i)})[0])
  394. for i in range (1,11): setSetting('host' + str(i), common.parseDOM(read, "setting", ret="default", attrs = {"id": 'host' + str(i)})[0])
  395. setSetting('autoplay_library', common.parseDOM(read, "setting", ret="default", attrs = {"id": 'autoplay_library'})[0])
  396. setSetting('autoplay', common.parseDOM(read, "setting", ret="default", attrs = {"id": 'autoplay'})[0])
  397. setSetting('settings_version', '2.0.0')
  398. except:
  399. return
  400. def container_view(self, content, viewDict):
  401. try:
  402. skin = xbmc.getSkinDir()
  403. file = xbmcvfs.File(viewData)
  404. read = file.read().replace('\n','')
  405. file.close()
  406. view = re.compile('"%s"[|]"%s"[|]"(.+?)"' % (skin, content)).findall(read)[0]
  407. xbmc.executebuiltin('Container.SetViewMode(%s)' % str(view))
  408. except:
  409. try:
  410. id = str(viewDict[skin])
  411. xbmc.executebuiltin('Container.SetViewMode(%s)' % id)
  412. except:
  413. pass
  414. def rootList(self, rootList):
  415. total = len(rootList)
  416. for i in rootList:
  417. try:
  418. name = language(i['name']).encode("utf-8")
  419. image = '%s/%s' % (addonArt, i['image'])
  420. action = i['action']
  421. u = '%s?action=%s' % (sys.argv[0], action)
  422. cm = []
  423. item = xbmcgui.ListItem(name, iconImage="DefaultFolder.png", thumbnailImage=image)
  424. item.setInfo( type="Video", infoLabels={ "Label": name, "Title": name, "Plot": addonDesc } )
  425. item.setProperty("Fanart_Image", addonFanart)
  426. item.addContextMenuItems(cm, replaceItems=False)
  427. xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=item,totalItems=total,isFolder=True)
  428. except:
  429. pass
  430. def pageList(self, pageList):
  431. if pageList == None: return
  432. total = len(pageList)
  433. for i in pageList:
  434. try:
  435. name, url, image = i['name'], i['url'], i['image']
  436. sysname, sysurl, sysimage = urllib.quote_plus(name), urllib.quote_plus(url), urllib.quote_plus(image)
  437. u = '%s?action=movies&url=%s' % (sys.argv[0], sysurl)
  438. cm = []
  439. item = xbmcgui.ListItem(name, iconImage="DefaultFolder.png", thumbnailImage=image)
  440. item.setInfo( type="Video", infoLabels={ "Label": name, "Title": name, "Plot": addonDesc } )
  441. item.setProperty("Fanart_Image", addonFanart)
  442. item.addContextMenuItems(cm, replaceItems=False)
  443. xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=item,totalItems=total,isFolder=True)
  444. except:
  445. pass
  446. def userList(self, userList):
  447. if userList == None: return
  448. total = len(userList)
  449. for i in userList:
  450. try:
  451. name, url, image = i['name'], i['url'], i['image']
  452. sysname, sysurl, sysimage = urllib.quote_plus(name), urllib.quote_plus(url), urllib.quote_plus(image)
  453. u = '%s?action=movies_userlists&url=%s' % (sys.argv[0], sysurl)
  454. cm = []
  455. cm.append((language(30422).encode("utf-8"), 'RunPlugin(%s?action=library_batch&url=%s)' % (sys.argv[0], sysurl)))
  456. cm.append((language(30409).encode("utf-8"), 'RunPlugin(%s?action=settings_open)' % (sys.argv[0])))
  457. item = xbmcgui.ListItem(name, iconImage="DefaultFolder.png", thumbnailImage=image)
  458. item.setInfo( type="Video", infoLabels={ "Label": name, "Title": name, "Plot": addonDesc } )
  459. item.setProperty("Fanart_Image", addonFanart)
  460. item.addContextMenuItems(cm, replaceItems=True)
  461. xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=item,totalItems=total,isFolder=True)
  462. except:
  463. pass
  464. def nextList(self, nextList):
  465. try: next = nextList[0]['next']
  466. except: return
  467. if next == '': return
  468. name, url, image = language(30361).encode("utf-8"), next, addonNext
  469. sysurl = urllib.quote_plus(url)
  470. u = '%s?action=movies&url=%s' % (sys.argv[0], sysurl)
  471. item = xbmcgui.ListItem(name, iconImage="DefaultFolder.png", thumbnailImage=image)
  472. item.setInfo( type="Video", infoLabels={ "Label": name, "Title": name, "Plot": addonDesc } )
  473. item.setProperty("Fanart_Image", addonFanart)
  474. item.addContextMenuItems([], replaceItems=False)
  475. xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=item,isFolder=True)
  476. def downloadList(self):
  477. u = getSetting("downloads")
  478. if u == '': return
  479. name, image = language(30363).encode("utf-8"), addonDownloads
  480. item = xbmcgui.ListItem(name, iconImage="DefaultFolder.png", thumbnailImage=image)
  481. item.setInfo( type="Video", infoLabels={ "Label": name, "Title": name, "Plot": addonDesc } )
  482. item.setProperty("Fanart_Image", addonFanart)
  483. item.addContextMenuItems([], replaceItems=False)
  484. xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=item,isFolder=True)
  485. def channelList(self, channelList):
  486. if channelList == None: return
  487. total = len(channelList)
  488. for i in channelList:
  489. try:
  490. channel, title, year, imdb, genre, plot = i['name'], i['title'], i['year'], i['imdb'], i['genre'], i['plot']
  491. image = '%s/%s.png' % (addonLogos, channel)
  492. name = '%s (%s)' % (title, year)
  493. label = "[B]%s[/B] : %s" % (channel.upper(), name)
  494. if plot == '': plot = addonDesc
  495. if genre == '': genre = ' '
  496. sysname, sysurl, sysimage, systitle, sysyear, sysimdb = urllib.quote_plus(name), urllib.quote_plus(name), urllib.quote_plus(image), urllib.quote_plus(title), urllib.quote_plus(year), urllib.quote_plus(imdb)
  497. u = '%s?action=play&name=%s&title=%s&imdb=%s&year=%s&url=%s&t=%s' % (sys.argv[0], sysname, systitle, sysimdb, sysyear, sysurl, datetime.datetime.now().strftime("%Y%m%d%H%M%S%f"))
  498. meta = {'Label': title, 'Title': title, 'Studio': channel, 'Duration': '1440', 'Plot': plot}
  499. cm = []
  500. if getSetting("autoplay") == 'true': cm.append((language(30432).encode("utf-8"), 'RunPlugin(%s?action=sources&name=%s&title=%s&imdb=%s&year=%s&url=%s)' % (sys.argv[0], sysname, systitle, sysimdb, sysyear, sysurl)))
  501. else: cm.append((language(30433).encode("utf-8"), 'RunPlugin(%s?action=autoplay&name=%s&title=%s&imdb=%s&year=%s&url=%s)' % (sys.argv[0], sysname, systitle, sysimdb, sysyear, sysurl)))
  502. cm.append((language(30406).encode("utf-8"), 'RunPlugin(%s?action=download&name=%s&title=%s&imdb=%s&year=%s&url=%s)' % (sys.argv[0], sysname, systitle, sysimdb, sysyear, sysurl)))
  503. cm.append((language(30416).encode("utf-8"), 'RunPlugin(%s?action=trailer&name=%s&url=%s)' % (sys.argv[0], sysname, sysurl)))
  504. cm.append((language(30409).encode("utf-8"), 'RunPlugin(%s?action=settings_open)' % (sys.argv[0])))
  505. cm.append((language(30411).encode("utf-8"), 'RunPlugin(%s?action=addon_home)' % (sys.argv[0])))
  506. item = xbmcgui.ListItem(label, iconImage=image, thumbnailImage=image)
  507. item.setInfo( type="Video", infoLabels = meta )
  508. item.setProperty("IsPlayable", "true")
  509. item.setProperty("Video", "true")
  510. item.setProperty("Fanart_Image", addonFanart)
  511. item.addContextMenuItems(cm, replaceItems=True)
  512. xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=item,totalItems=total,isFolder=False)
  513. except:
  514. pass
  515. def movieList(self, movieList):
  516. if movieList == None: return
  517. file = xbmcvfs.File(favData)
  518. favRead = file.read()
  519. file.close()
  520. total = len(movieList)
  521. for i in movieList:
  522. try:
  523. name, url, image, title, year, imdb, genre, plot = i['name'], i['url'], i['image'], i['title'], i['year'], i['imdb'], i['genre'], i['plot']
  524. if plot == '': plot = addonDesc
  525. if genre == '': genre = ' '
  526. sysname, sysurl, sysimage, systitle, sysyear, sysimdb = urllib.quote_plus(name), urllib.quote_plus(url), urllib.quote_plus(image), urllib.quote_plus(title), urllib.quote_plus(year), urllib.quote_plus(imdb)
  527. u = '%s?action=play&name=%s&title=%s&imdb=%s&year=%s&url=%s&t=%s' % (sys.argv[0], sysname, systitle, sysimdb, sysyear, sysurl, datetime.datetime.now().strftime("%Y%m%d%H%M%S%f"))
  528. if getSetting("meta") == 'true':
  529. meta = metaget.get_meta('movie', title ,year=year)
  530. playcountMenu = language(30407).encode("utf-8")
  531. if meta['overlay'] == 6: playcountMenu = language(30408).encode("utf-8")
  532. metaimdb = urllib.quote_plus(re.sub('[^0-9]', '', meta['imdb_id']))
  533. trailer, poster = urllib.quote_plus(meta['trailer_url']), meta['cover_url']
  534. if trailer == '': trailer = sysurl
  535. if poster == '': poster = image
  536. else:
  537. meta = {'label': title, 'title': title, 'year': year, 'imdb_id' : imdb, 'genre' : genre, 'plot': plot}
  538. trailer, poster = sysurl, image
  539. if getSetting("meta") == 'true' and getSetting("fanart") == 'true':
  540. fanart = meta['backdrop_url']
  541. if fanart == '': fanart = addonFanart
  542. else:
  543. fanart = addonFanart
  544. cm = []
  545. if getSetting("autoplay") == 'true': cm.append((language(30432).encode("utf-8"), 'RunPlugin(%s?action=sources&name=%s&title=%s&imdb=%s&year=%s&url=%s)' % (sys.argv[0], sysname, systitle, sysimdb, sysyear, sysurl)))
  546. else: cm.append((language(30433).encode("utf-8"), 'RunPlugin(%s?action=autoplay&name=%s&title=%s&imdb=%s&year=%s&url=%s)' % (sys.argv[0], sysname, systitle, sysimdb, sysyear, sysurl)))
  547. cm.append((language(30405).encode("utf-8"), 'RunPlugin(%s?action=item_queue)' % (sys.argv[0])))
  548. cm.append((language(30406).encode("utf-8"), 'RunPlugin(%s?action=download&name=%s&title=%s&imdb=%s&year=%s&url=%s)' % (sys.argv[0], sysname, systitle, sysimdb, sysyear, sysurl)))
  549. if action == 'movies_favourites':
  550. if not getSetting("fav_sort") == '2': cm.append((language(30412).encode("utf-8"), 'Action(Info)'))
  551. if not getSetting("fav_sort") == '2': cm.append((language(30416).encode("utf-8"), 'RunPlugin(%s?action=trailer&name=%s&url=%s)' % (sys.argv[0], sysname, trailer)))
  552. if getSetting("meta") == 'true': cm.append((language(30415).encode("utf-8"), 'RunPlugin(%s?action=metadata_movies&imdb=%s)' % (sys.argv[0], metaimdb)))
  553. if getSetting("meta") == 'true': cm.append((playcountMenu, 'RunPlugin(%s?action=playcount_movies&imdb=%s)' % (sys.argv[0], metaimdb)))
  554. cm.append((language(30422).encode("utf-8"), 'RunPlugin(%s?action=library&name=%s&title=%s&imdb=%s&year=%s&url=%s)' % (sys.argv[0], sysname, systitle, sysimdb, sysyear, sysurl)))
  555. cm.append((language(30428).encode("utf-8"), 'RunPlugin(%s?action=view_movies)' % (sys.argv[0])))
  556. if getSetting("fav_sort") == '2': cm.append((language(30419).encode("utf-8"), 'RunPlugin(%s?action=favourite_moveUp&name=%s&url=%s)' % (sys.argv[0], systitle, sysurl)))
  557. if getSetting("fav_sort") == '2': cm.append((language(30420).encode("utf-8"), 'RunPlugin(%s?action=favourite_moveDown&name=%s&url=%s)' % (sys.argv[0], systitle, sysurl)))
  558. cm.append((language(30421).encode("utf-8"), 'RunPlugin(%s?action=favourite_delete&name=%s&url=%s)' % (sys.argv[0], systitle, sysurl)))
  559. elif action == 'movies_search':
  560. cm.append((language(30412).encode("utf-8"), 'Action(Info)'))
  561. cm.append((language(30416).encode("utf-8"), 'RunPlugin(%s?action=trailer&name=%s&url=%s)' % (sys.argv[0], sysname, trailer)))
  562. cm.append((language(30422).encode("utf-8"), 'RunPlugin(%s?action=library&name=%s&title=%s&imdb=%s&year=%s&url=%s)' % (sys.argv[0], sysname, systitle, sysimdb, sysyear, sysurl)))
  563. cm.append((language(30417).encode("utf-8"), 'RunPlugin(%s?action=favourite_from_search&name=%s&imdb=%s&url=%s&image=%s&year=%s)' % (sys.argv[0], systitle, sysimdb, sysurl, sysimage, sysyear)))
  564. cm.append((language(30428).encode("utf-8"), 'RunPlugin(%s?action=view_movies)' % (sys.argv[0])))
  565. cm.append((language(30409).encode("utf-8"), 'RunPlugin(%s?action=settings_open)' % (sys.argv[0])))
  566. cm.append((language(30411).encode("utf-8"), 'RunPlugin(%s?action=addon_home)' % (sys.argv[0])))
  567. elif action == 'movies_userlists':
  568. cm.append((language(30412).encode("utf-8"), 'Action(Info)'))
  569. cm.append((language(30416).encode("utf-8"), 'RunPlugin(%s?action=trailer&name=%s&url=%s)' % (sys.argv[0], sysname, trailer)))
  570. if getSetting("meta") == 'true': cm.append((language(30415).encode("utf-8"), 'RunPlugin(%s?action=metadata_movies2&imdb=%s)' % (sys.argv[0], metaimdb)))
  571. if getSetting("meta") == 'true': cm.append((playcountMenu, 'RunPlugin(%s?action=playcount_movies&imdb=%s)' % (sys.argv[0], metaimdb)))
  572. cm.append((language(30422).encode("utf-8"), 'RunPlugin(%s?action=library&name=%s&title=%s&imdb=%s&year=%s&url=%s)' % (sys.argv[0], sysname, systitle, sysimdb, sysyear, sysurl)))
  573. if not '"%s"' % url in favRead: cm.append((language(30417).encode("utf-8"), 'RunPlugin(%s?action=favourite_add&name=%s&imdb=%s&url=%s&image=%s&year=%s)' % (sys.argv[0], systitle, sysimdb, sysurl, sysimage, sysyear)))
  574. else: cm.append((language(30418).encode("utf-8"), 'RunPlugin(%s?action=favourite_delete&name=%s&url=%s)' % (sys.argv[0], systitle, sysurl)))
  575. cm.append((language(30428).encode("utf-8"), 'RunPlugin(%s?action=view_movies)' % (sys.argv[0])))
  576. else:
  577. cm.append((language(30412).encode("utf-8"), 'Action(Info)'))
  578. cm.append((language(30416).encode("utf-8"), 'RunPlugin(%s?action=trailer&name=%s&url=%s)' % (sys.argv[0], sysname, trailer)))
  579. if getSetting("meta") == 'true': cm.append((language(30415).encode("utf-8"), 'RunPlugin(%s?action=metadata_movies2&imdb=%s)' % (sys.argv[0], metaimdb)))
  580. cm.append((language(30422).encode("utf-8"), 'RunPlugin(%s?action=library&name=%s&title=%s&imdb=%s&year=%s&url=%s)' % (sys.argv[0], sysname, systitle, sysimdb, sysyear, sysurl)))
  581. if not '"%s"' % url in favRead: cm.append((language(30417).encode("utf-8"), 'RunPlugin(%s?action=favourite_add&name=%s&imdb=%s&url=%s&image=%s&year=%s)' % (sys.argv[0], systitle, sysimdb, sysurl, sysimage, sysyear)))
  582. else: cm.append((language(30418).encode("utf-8"), 'RunPlugin(%s?action=favourite_delete&name=%s&url=%s)' % (sys.argv[0], systitle, sysurl)))
  583. cm.append((language(30428).encode("utf-8"), 'RunPlugin(%s?action=view_movies)' % (sys.argv[0])))
  584. cm.append((language(30411).encode("utf-8"), 'RunPlugin(%s?action=addon_home)' % (sys.argv[0])))
  585. item = xbmcgui.ListItem(name, iconImage="DefaultVideo.png", thumbnailImage=poster)
  586. item.setInfo( type="Video", infoLabels = meta )
  587. item.setProperty("IsPlayable", "true")
  588. item.setProperty("Video", "true")
  589. item.setProperty("art(poster)", poster)
  590. item.setProperty("Fanart_Image", fanart)
  591. item.addContextMenuItems(cm, replaceItems=True)
  592. xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=item,totalItems=total,isFolder=False)
  593. except:
  594. pass
  595. class contextMenu:
  596. def item_play(self):
  597. playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO)
  598. playlist.clear()
  599. xbmc.executebuiltin('Action(Queue)')
  600. playlist.unshuffle()
  601. xbmc.Player().play(playlist)
  602. def item_random_play(self):
  603. playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO)
  604. playlist.clear()
  605. xbmc.executebuiltin('Action(Queue)')
  606. playlist.shuffle()
  607. xbmc.Player().play(playlist)
  608. def item_queue(self):
  609. xbmc.executebuiltin('Action(Queue)')
  610. def playlist_open(self):
  611. xbmc.executebuiltin('ActivateWindow(VideoPlaylist)')
  612. def settings_open(self):
  613. xbmc.executebuiltin('Addon.OpenSettings(%s)' % (addonId))
  614. def addon_home(self):
  615. xbmc.executebuiltin('Container.Update(plugin://%s/,replace)' % (addonId))
  616. def view(self, content):
  617. try:
  618. skin = xbmc.getSkinDir()
  619. skinPath = xbmc.translatePath('special://skin/')
  620. xml = os.path.join(skinPath,'addon.xml')
  621. file = xbmcvfs.File(xml)
  622. read = file.read().replace('\n','')
  623. file.close()
  624. try: src = re.compile('defaultresolution="(.+?)"').findall(read)[0]
  625. except: src = re.compile('<res.+?folder="(.+?)"').findall(read)[0]
  626. src = os.path.join(skinPath, src)
  627. src = os.path.join(src, 'MyVideoNav.xml')
  628. file = xbmcvfs.File(src)
  629. read = file.read().replace('\n','')
  630. file.close()
  631. views = re.compile('<views>(.+?)</views>').findall(read)[0]
  632. views = [int(x) for x in views.split(',')]
  633. for view in views:
  634. label = xbmc.getInfoLabel('Control.GetLabel(%s)' % (view))
  635. if not (label == '' or label is None): break
  636. file = xbmcvfs.File(viewData)
  637. read = file.read()
  638. file.close()
  639. write = [i.strip('\n').strip('\r') for i in read.splitlines(True) if i.strip('\r\n')]
  640. write = [i for i in write if not '"%s"|"%s"|"' % (skin, content) in i]
  641. write.append('"%s"|"%s"|"%s"' % (skin, content, str(view)))
  642. write = '\r\n'.join(write)
  643. file = xbmcvfs.File(viewData, 'w')
  644. file.write(str(write))
  645. file.close()
  646. viewName = xbmc.getInfoLabel('Container.Viewmode')
  647. index().infoDialog('%s%s%s' % (language(30301).encode("utf-8"), viewName, language(30302).encode("utf-8")))
  648. except:
  649. return
  650. def favourite_add(self, data, name, url, image, imdb, year):
  651. try:
  652. index().container_refresh()
  653. file = xbmcvfs.File(data)
  654. read = file.read()
  655. file.close()
  656. write = [i.strip('\n').strip('\r') for i in read.splitlines(True) if i.strip('\r\n')]
  657. write.append('"%s"|"%s"|"%s"|"%s"|"%s"' % (name, year, imdb, url, image))
  658. write = '\r\n'.join(write)
  659. file = xbmcvfs.File(data, 'w')
  660. file.write(str(write))
  661. file.close()
  662. index().infoDialog(language(30303).encode("utf-8"), name)
  663. except:
  664. return
  665. def favourite_from_search(self, data, name, url, image, imdb, year):
  666. try:
  667. file = xbmcvfs.File(data)
  668. read = file.read()
  669. file.close()
  670. if url in read:
  671. index().infoDialog(language(30307).encode("utf-8"), name)
  672. return
  673. write = [i.strip('\n').strip('\r') for i in read.splitlines(True) if i.strip('\r\n')]
  674. write.append('"%s"|"%s"|"%s"|"%s"|"%s"' % (name, year, imdb, url, image))
  675. write = '\r\n'.join(write)
  676. file = xbmcvfs.File(data, 'w')
  677. file.write(str(write))
  678. file.close()
  679. index().infoDialog(language(30303).encode("utf-8"), name)
  680. except:
  681. return
  682. def favourite_delete(self, data, name, url):
  683. try:
  684. index().container_refresh()
  685. file = xbmcvfs.File(data)
  686. read = file.read()
  687. file.close()
  688. write = [i.strip('\n').strip('\r') for i in read.splitlines(True) if i.strip('\r\n')]
  689. write = [i for i in write if not '"%s"' % url in i]
  690. write = '\r\n'.join(write)
  691. file = xbmcvfs.File(data, 'w')
  692. file.write(str(write))
  693. file.close()
  694. index().infoDialog(language(30304).encode("utf-8"), name)
  695. except:
  696. return
  697. def favourite_moveUp(self, data, name, url):
  698. try:
  699. index().container_refresh()
  700. file = xbmcvfs.File(data)
  701. read = file.read()
  702. file.close()
  703. write = [i.strip('\n').strip('\r') for i in read.splitlines(True) if i.strip('\r\n')]
  704. i = write.index([i for i in write if '"%s"' % url in i][0])
  705. if i == 0 : return
  706. write[i], write[i-1] = write[i-1], write[i]
  707. write = '\r\n'.join(write)
  708. file = xbmcvfs.File(data, 'w')
  709. file.write(str(write))
  710. file.close()
  711. index().infoDialog(language(30305).encode("utf-8"), name)
  712. except:
  713. return
  714. def favourite_moveDown(self, data, name, url):
  715. try:
  716. index().container_refresh()
  717. file = xbmcvfs.File(data)
  718. read = file.read()
  719. file.close()
  720. write = [i.strip('\n').strip('\r') for i in read.splitlines(True) if i.strip('\r\n')]
  721. i = write.index([i for i in write if '"%s"' % url in i][0])
  722. if i+1 == len(write): return
  723. write[i], write[i+1] = write[i+1], write[i]
  724. write = '\r\n'.join(write)
  725. file = xbmcvfs.File(data, 'w')
  726. file.write(str(write))
  727. file.close()
  728. index().infoDialog(language(30306).encode("utf-8"), name)
  729. except:
  730. return
  731. def metadata(self, content, imdb, season, episode):
  732. try:
  733. if content == 'movie' or content == 'tvshow':
  734. metaget.update_meta(content, '', imdb, year='')
  735. index().container_refresh()
  736. elif content == 'season':
  737. metaget.update_episode_meta('', imdb, season, episode)
  738. index().container_refresh()
  739. elif content == 'episode':
  740. metaget.update_season('', imdb, season)
  741. index().container_refresh()
  742. except:
  743. return
  744. def playcount(self, content, imdb, season, episode):
  745. try:
  746. metaget.change_watched(content, '', imdb, season=season, episode=episode, year='', watched='')
  747. index().container_refresh()
  748. except:
  749. return
  750. def library_batch(self, url, update=True, silent=False):
  751. movieList = movies().get(url, idx=False)
  752. if movieList == None: return
  753. for i in movieList:
  754. try: self.library(i['name'], i['title'], i['imdb'], i['year'], i['url'], silent=True)
  755. except: pass
  756. if silent == False:
  757. index().infoDialog(language(30311).encode("utf-8"))
  758. if update == True:
  759. xbmc.executebuiltin('UpdateLibrary(video)')
  760. def library(self, name, title, imdb, year, url, silent=False):
  761. try:
  762. library = xbmc.translatePath(getSetting("movie_library"))
  763. sysname, systitle, sysimdb, sysyear = urllib.quote_plus(name), urllib.quote_plus(title), urllib.quote_plus(imdb), urllib.quote_plus(year)
  764. content = '%s?action=play&name=%s&title=%s&imdb=%s&year=%s' % (sys.argv[0], sysname, systitle, sysimdb, sysyear)
  765. enc_name = name.translate(None, '\/:*?"<>|')
  766. folder = os.path.join(library, enc_name)
  767. stream = os.path.join(folder, enc_name + '.strm')
  768. xbmcvfs.mkdir(dataPath)
  769. xbmcvfs.mkdir(library)
  770. xbmcvfs.mkdir(folder)
  771. file = xbmcvfs.File(stream, 'w')
  772. file.write(str(content))
  773. file.close()
  774. if silent == False:
  775. index().infoDialog(language(30311).encode("utf-8"), name)
  776. except:
  777. return
  778. def download(self, name, title, imdb, year, url):
  779. try:
  780. property = (addonName+name)+'download'
  781. download = xbmc.translatePath(getSetting("downloads"))
  782. enc_name = name.translate(None, '\/:*?"<>|')
  783. xbmcvfs.mkdir(dataPath)
  784. xbmcvfs.mkdir(download)
  785. file = [i for i in xbmcvfs.listdir(download)[1] if i.startswith(enc_name + '.')]
  786. if not file == []: file = os.path.join(download, file[0])
  787. else: file = None
  788. if download == '':
  789. yes = index().yesnoDialog(language(30341).encode("utf-8"), language(30342).encode("utf-8"))
  790. if yes: contextMenu().settings_open()
  791. return
  792. if file is None:
  793. pass
  794. elif not file.endswith('.tmp'):
  795. yes = index().yesnoDialog(language(30343).encode("utf-8"), language(30344).encode("utf-8"), name)
  796. if yes:
  797. xbmcvfs.delete(file)
  798. else:
  799. return
  800. elif file.endswith('.tmp'):
  801. if index().getProperty(property) == 'open':
  802. yes = index().yesnoDialog(language(30345).encode("utf-8"), language(30346).encode("utf-8"), name)
  803. if yes: index().setProperty(property, 'cancel')
  804. return
  805. else:
  806. xbmcvfs.delete(file)
  807. url = resolver().run(name, title, imdb, year, 'download://')
  808. if url is None: return
  809. url = url.rsplit('|', 1)[0]
  810. ext = url.rsplit('/', 1)[-1].rsplit('?', 1)[0].rsplit('|', 1)[0].strip().lower()
  811. ext = os.path.splitext(ext)[1][1:]
  812. if ext == '': ext = 'mp4'
  813. stream = os.path.join(download, enc_name + '.' + ext)
  814. temp = stream + '.tmp'
  815. count = 0
  816. CHUNK = 16 * 1024
  817. request = urllib2.Request(url)
  818. request.add_header('User-Agent', 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7')
  819. request.add_header('Cookie', 'video=true')
  820. response = urllib2.urlopen(request, timeout=10)
  821. size = response.info()["Content-Length"]
  822. file = xbmcvfs.File(temp, 'w')
  823. index().setProperty(property, 'open')
  824. index().infoDialog(language(30308).encode("utf-8"), name)
  825. while True:
  826. chunk = response.read(CHUNK)
  827. if not chunk: break
  828. if index().getProperty(property) == 'cancel': raise Exception()
  829. if xbmc.abortRequested == True: raise Exception()
  830. part = xbmcvfs.File(temp)
  831. quota = int(100 * float(part.size())/float(size))
  832. part.close()
  833. if not count == quota and count in [0,10,20,30,40,50,60,70,80,90]:
  834. index().infoDialog(language(30309).encode("utf-8") + st

Large files files are truncated, but you can click here to view the full file