PageRenderTime 92ms CodeModel.GetById 23ms RepoModel.GetById 1ms 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
  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") + str(count) + '%', name)
  835. file.write(chunk)
  836. count = quota
  837. response.close()
  838. file.close()
  839. index().clearProperty(property)
  840. xbmcvfs.rename(temp, stream)
  841. index().infoDialog(language(30310).encode("utf-8"), name)
  842. except:
  843. file.close()
  844. index().clearProperty(property)
  845. xbmcvfs.delete(temp)
  846. sys.exit()
  847. return
  848. def sources(self, name, title, imdb, year, url):
  849. meta = {'title': xbmc.getInfoLabel('ListItem.title'), 'originaltitle': xbmc.getInfoLabel('ListItem.originaltitle'), 'year': xbmc.getInfoLabel('ListItem.year'), 'genre': xbmc.getInfoLabel('ListItem.genre'), 'director': xbmc.getInfoLabel('ListItem.director'), 'country': xbmc.getInfoLabel('ListItem.country'), 'rating': xbmc.getInfoLabel('ListItem.rating'), 'votes': xbmc.getInfoLabel('ListItem.votes'), 'mpaa': xbmc.getInfoLabel('ListItem.mpaa'), 'duration': xbmc.getInfoLabel('ListItem.duration'), 'trailer': xbmc.getInfoLabel('ListItem.trailer'), 'writer': xbmc.getInfoLabel('ListItem.writer'), 'studio': xbmc.getInfoLabel('ListItem.studio'), 'tagline': xbmc.getInfoLabel('ListItem.tagline'), 'plotoutline': xbmc.getInfoLabel('ListItem.plotoutline'), 'plot': xbmc.getInfoLabel('ListItem.plot')}
  850. label, poster, fanart = xbmc.getInfoLabel('ListItem.label'), xbmc.getInfoLabel('ListItem.icon'), xbmc.getInfoLabel('ListItem.Property(Fanart_Image)')
  851. sysname, systitle, sysimdb, sysyear = urllib.quote_plus(name), urllib.quote_plus(title), urllib.quote_plus(imdb), urllib.quote_plus(year)
  852. u = '%s?action=play&name=%s&title=%s&imdb=%s&year=%s&url=sources://' % (sys.argv[0], sysname, systitle, sysimdb, sysyear)
  853. playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO)
  854. playlist.clear()
  855. item = xbmcgui.ListItem(label, iconImage="DefaultVideo.png", thumbnailImage=poster)
  856. item.setInfo( type="Video", infoLabels= meta )
  857. item.setProperty("IsPlayable", "true")
  858. item.setProperty("Video", "true")
  859. item.setProperty("Fanart_Image", fanart)
  860. xbmc.Player().play(u, item)
  861. def autoplay(self, name, title, imdb, year, url):
  862. meta = {'title': xbmc.getInfoLabel('ListItem.title'), 'originaltitle': xbmc.getInfoLabel('ListItem.originaltitle'), 'year': xbmc.getInfoLabel('ListItem.year'), 'genre': xbmc.getInfoLabel('ListItem.genre'), 'director': xbmc.getInfoLabel('ListItem.director'), 'country': xbmc.getInfoLabel('ListItem.country'), 'rating': xbmc.getInfoLabel('ListItem.rating'), 'votes': xbmc.getInfoLabel('ListItem.votes'), 'mpaa': xbmc.getInfoLabel('ListItem.mpaa'), 'duration': xbmc.getInfoLabel('ListItem.duration'), 'trailer': xbmc.getInfoLabel('ListItem.trailer'), 'writer': xbmc.getInfoLabel('ListItem.writer'), 'studio': xbmc.getInfoLabel('ListItem.studio'), 'tagline': xbmc.getInfoLabel('ListItem.tagline'), 'plotoutline': xbmc.getInfoLabel('ListItem.plotoutline'), 'plot': xbmc.getInfoLabel('ListItem.plot')}
  863. label, poster, fanart = xbmc.getInfoLabel('ListItem.label'), xbmc.getInfoLabel('ListItem.icon'), xbmc.getInfoLabel('ListItem.Property(Fanart_Image)')
  864. sysname, systitle, sysimdb, sysyear = urllib.quote_plus(name), urllib.quote_plus(title), urllib.quote_plus(imdb), urllib.quote_plus(year)
  865. u = '%s?action=play&name=%s&title=%s&imdb=%s&year=%s&url=play://' % (sys.argv[0], sysname, systitle, sysimdb, sysyear)
  866. playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO)
  867. playlist.clear()
  868. item = xbmcgui.ListItem(label, iconImage="DefaultVideo.png", thumbnailImage=poster)
  869. item.setInfo( type="Video", infoLabels= meta )
  870. item.setProperty("IsPlayable", "true")
  871. item.setProperty("Video", "true")
  872. item.setProperty("Fanart_Image", fanart)
  873. xbmc.Player().play(u, item)
  874. def trailer(self, name, url):
  875. url = trailer().run(name, url)
  876. if url is None: return
  877. item = xbmcgui.ListItem(path=url)
  878. item.setProperty("IsPlayable", "true")
  879. xbmc.Player().play(url, item)
  880. class favourites:
  881. def __init__(self):
  882. self.list = []
  883. def movies(self):
  884. file = xbmcvfs.File(favData)
  885. read = file.read()
  886. file.close()
  887. match = re.compile('"(.+?)"[|]"(.+?)"[|]"(.+?)"[|]"(.+?)"[|]"(.+?)"').findall(read)
  888. for title, year, imdb, url, image in match:
  889. name = '%s (%s)' % (title, year)
  890. self.list.append({'name': name, 'url': url, 'image': image, 'title': title, 'year': year, 'imdb': imdb, 'genre': '', 'plot': ''})
  891. if getSetting("fav_sort") == '0':
  892. self.list = sorted(self.list, key=itemgetter('title'))
  893. elif getSetting("fav_sort") == '1':
  894. self.list = sorted(self.list, key=itemgetter('title'))[::-1]
  895. self.list = sorted(self.list, key=itemgetter('year'))[::-1]
  896. index().movieList(self.list)
  897. class root:
  898. def get(self):
  899. rootList = []
  900. rootList.append({'name': 30501, 'image': 'BOXoffice.png', 'action': 'movies_boxoffice'})
  901. rootList.append({'name': 30502, 'image': 'Views.png', 'action': 'movies_views'})
  902. rootList.append({'name': 30503, 'image': 'Popular.png', 'action': 'movies_popular'})
  903. rootList.append({'name': 30504, 'image': 'Oscars.png', 'action': 'movies_oscars'})
  904. rootList.append({'name': 30505, 'image': 'Recommended.png', 'action': 'movies_trending'})
  905. rootList.append({'name': 30506, 'image': 'Channels.png', 'action': 'channels_movies'})
  906. rootList.append({'name': 30507, 'image': 'Genres.png', 'action': 'genres_movies'})
  907. rootList.append({'name': 30508, 'image': 'Years.png', 'action': 'years_movies'})
  908. if not (getSetting("imdb_mail") == '' or getSetting("imdb_password") == ''):
  909. rootList.append({'name': 30509, 'image': 'IMDb.png', 'action': 'userlists_imdb'})
  910. if not (getSetting("trakt_user") == '' or getSetting("trakt_password") == ''):
  911. rootList.append({'name': 30510, 'image': 'Trakt.png', 'action': 'userlists_trakt'})
  912. rootList.append({'name': 30511, 'image': 'Favourites.png', 'action': 'movies_favourites'})
  913. rootList.append({'name': 30512, 'image': 'Search.png', 'action': 'root_search'})
  914. index().rootList(rootList)
  915. index().downloadList()
  916. def search(self):
  917. rootList = []
  918. rootList.append({'name': 30521, 'image': 'Movies.png', 'action': 'movies_search'})
  919. rootList.append({'name': 30522, 'image': 'Actors.png', 'action': 'actors_search'})
  920. index().rootList(rootList)
  921. class movies:
  922. def get(self, url, idx=True):
  923. if url.startswith(imdb().base_link) or url.startswith(imdb().akas_link):
  924. #self.list = imdb().movies_list(url)
  925. self.list = cache(imdb().movies_list, url)
  926. elif url.startswith(imdb().mobile_link):
  927. #self.list = imdb().movies_list2(url)
  928. self.list = cache(imdb().movies_list2, url)
  929. elif url.startswith(trakt().base_link):
  930. self.list = trakt().movies_list(url)
  931. elif url == 'watchlist':
  932. self.list = imdb_user().movies_list(imdb_user().watchlist_link)
  933. elif url == 'watchadded':
  934. self.list = imdb_user().movies_list(imdb_user().watchlist_link)
  935. self.list = self.list[::-1]
  936. elif url == 'watchtitle':
  937. self.list = imdb_user().movies_list(imdb_user().watchlist_link)
  938. self.list = sorted(self.list, key=itemgetter('title'))
  939. else:
  940. self.list = imdb_user().movies_list(imdb_user().list_link % url)
  941. self.list = sorted(self.list, key=itemgetter('title'))
  942. if idx == False: return self.list
  943. index().movieList(self.list)
  944. index().nextList(self.list)
  945. class channels:
  946. def __init__(self):
  947. self.list = []
  948. self.sky_now_link = 'http://epgservices.sky.com/5.1.1/api/2.0/channel/json/%s/now/nn/0'
  949. self.sky_programme_link = 'http://tv.sky.com/programme/channel/%s/%s/%s.json'
  950. def get(self):
  951. threads = []
  952. threads.append(Thread(self.sky_list, '01', 'Sky Premiere', '1409'))
  953. threads.append(Thread(self.sky_list, '02', 'Sky Premiere +1', '1823'))
  954. threads.append(Thread(self.sky_list, '03', 'Sky Showcase', '1814'))
  955. threads.append(Thread(self.sky_list, '04', 'Sky Greats', '1815'))
  956. threads.append(Thread(self.sky_list, '05', 'Sky Disney', '1838'))
  957. threads.append(Thread(self.sky_list, '06', 'Sky Family', '1808'))
  958. threads.append(Thread(self.sky_list, '07', 'Sky Action', '1001'))
  959. threads.append(Thread(self.sky_list, '08', 'Sky Comedy', '1002'))
  960. threads.append(Thread(self.sky_list, '09', 'Sky Crime', '1818'))
  961. threads.append(Thread(self.sky_list, '10', 'Sky Sci Fi', '1807'))
  962. threads.append(Thread(self.sky_list, '11', 'Sky Select', '1811'))
  963. [i.start() for i in threads]
  964. [i.join() for i in threads]
  965. self.list = sorted(self.list, key=itemgetter('num'))
  966. index().channelList(self.list)
  967. def sky_list(self, num, channel, id):
  968. try:
  969. url = self.sky_now_link % id
  970. result = getUrl(url).result
  971. result = json.loads(result)
  972. match = result['listings'][id][0]['url']
  973. dt = self.uk_datetime()
  974. dt1 = '%04d' % dt.year + '-' + '%02d' % dt.month + '-' + '%02d' % dt.day
  975. dt2 = int(dt.hour)
  976. if (dt2 < 6): dt2 = 0
  977. elif (dt2 >= 6 and dt2 < 12): dt2 = 1
  978. elif (dt2 >= 12 and dt2 < 18): dt2 = 2
  979. elif (dt2 >= 18): dt2 = 3
  980. url = self.sky_programme_link % (id, str(dt1), str(dt2))
  981. result = getUrl(url).result
  982. result = json.loads(result)
  983. result = result['listings'][id]
  984. result = [i for i in result if i['url'] == match][0]
  985. y = result['d']
  986. y = re.findall('.+?[(](\d{4})[)]', y)[0].strip()
  987. t = result['t']
  988. t = t.replace('(%s)' % y, '').strip()
  989. imdb_api = self.imdb_api(t, y)
  990. if imdb_api == None: imdb_api = self.imdb_api(t, str(int(y)+1))
  991. if imdb_api == None: imdb_api = self.imdb_api(t, str(int(y)-1))
  992. if imdb_api == None: raise Exception()
  993. title, year, imdb, plot = imdb_api
  994. title = common.replaceHTMLCodes(title)
  995. title = title.encode('utf-8')
  996. year = year.encode('utf-8')
  997. imdb = re.sub('[^0-9]', '', str(imdb))
  998. imdb = imdb.encode('utf-8')
  999. plot = common.replaceHTMLCodes(plot)
  1000. plot = plot.encode('utf-8')
  1001. self.list.append({'name': channel, 'title': title, 'year': year, 'imdb': imdb, 'genre': '', 'plot': plot, 'num': num})
  1002. except:
  1003. return
  1004. def imdb_api(self, t, y=''):
  1005. try:
  1006. search = 'http://www.imdbapi.com/?t=%s' % urllib.quote_plus(t)
  1007. if not y == '': search += '&y=%s' % y
  1008. search = getUrl(search).result
  1009. search = json.loads(search)
  1010. title, year, imdb, plot = search['Title'], search['Year'], search['imdbID'], search['Plot']
  1011. return (title, year, imdb, plot)
  1012. except:
  1013. return
  1014. def uk_datetime(self):
  1015. dt = datetime.datetime.utcnow() + datetime.timedelta(hours = 0)
  1016. d = datetime.datetime(dt.year, 4, 1)
  1017. dston = d - datetime.timedelta(days=d.weekday() + 1)
  1018. d = datetime.datetime(dt.year, 11, 1)
  1019. dstoff = d - datetime.timedelta(days=d.weekday() + 1)
  1020. if dston <= dt < dstoff:
  1021. return dt + datetime.timedelta(hours = 1)
  1022. else:
  1023. return dt
  1024. class trailer:
  1025. def __init__(self):
  1026. self.youtube_base = 'http://www.youtube.com'
  1027. self.youtube_query = 'http://gdata.youtube.com/feeds/api/videos?q='
  1028. self.youtube_watch = 'http://www.youtube.com/watch?v=%s'
  1029. self.youtube_info = 'http://gdata.youtube.com/feeds/api/videos/%s?v=2'
  1030. def run(self, name, url):
  1031. try:
  1032. if url.startswith(self.youtube_base):
  1033. url = self.youtube(url)
  1034. if url is None: raise Exception()
  1035. return url
  1036. elif not url.startswith('http://'):
  1037. url = self.youtube_watch % url
  1038. url = self.youtube(url)
  1039. if url is None: raise Exception()
  1040. return url
  1041. else:
  1042. raise Exception()
  1043. except:
  1044. url = self.youtube_query + name + ' trailer'
  1045. url = self.youtube_search(url)
  1046. if url is None: return
  1047. return url
  1048. def youtube_search(self, url):
  1049. try:
  1050. if index().addon_status('plugin.video.youtube') is None:
  1051. index().okDialog(language(30321).encode("utf-8"), language(30322).encode("utf-8"))
  1052. return
  1053. query = url.split("?q=")[-1].split("/")[-1].split("?")[0]
  1054. url = url.replace(query, urllib.quote_plus(query))
  1055. result = getUrl(url).result
  1056. result = common.parseDOM(result, "entry")
  1057. result = common.parseDOM(result, "id")
  1058. for url in result[:5]:
  1059. url = url.split("/")[-1]
  1060. url = self.youtube_watch % url
  1061. url = self.youtube(url)
  1062. if not url is None: return url
  1063. except:
  1064. return
  1065. def youtube(self, url):
  1066. try:
  1067. if index().addon_status('plugin.video.youtube') is None:
  1068. index().okDialog(language(30321).encode("utf-8"), language(30322).encode("utf-8"))
  1069. return
  1070. id = url.split("?v=")[-1].split("/")[-1].split("?")[0].split("&")[0]
  1071. state, reason = None, None
  1072. result = getUrl(self.youtube_info % id).result
  1073. try:
  1074. state = common.parseDOM(result, "yt:state", ret="name")[0]
  1075. reason = common.parseDOM(result, "yt:state", ret="reasonCode")[0]
  1076. except:
  1077. pass
  1078. if state == 'deleted' or state == 'rejected' or state == 'failed' or reason == 'requesterRegion' : return
  1079. try:
  1080. result = getUrl(self.youtube_watch % id).result
  1081. alert = common.parseDOM(result, "div", attrs = { "id": "watch7-notification-area" })[0]
  1082. return
  1083. except:
  1084. pass
  1085. url = 'plugin://plugin.video.youtube/?action=play_video&videoid=%s' % id
  1086. return url
  1087. except:
  1088. return
  1089. class resolver:
  1090. def __init__(self):
  1091. self.sources_dict()
  1092. self.sources = []
  1093. def run(self, name, title, imdb, year, url):
  1094. try:
  1095. self.sources = self.sources_get(name, title, imdb, year, self.hostDict)
  1096. self.sources = self.sources_filter()
  1097. if self.sources == []: raise Exception()
  1098. autoplay = getSetting("autoplay")
  1099. if not xbmc.getInfoLabel('Container.FolderPath').startswith(sys.argv[0]):
  1100. autoplay = getSetting("autoplay_library")
  1101. if url == 'play://':
  1102. url = self.sources_direct()
  1103. elif url == 'sources://' or url == 'download://' or not autoplay == 'true':
  1104. url = self.sources_dialog()
  1105. else:
  1106. url = self.sources_direct()
  1107. if url is None: raise Exception()
  1108. if url == 'download://': return url
  1109. if url == 'close://': return
  1110. if getSetting("playback_info") == 'true':
  1111. index().infoDialog(self.selectedSource, header=name)
  1112. player().run(name, url, imdb)
  1113. return url
  1114. except:
  1115. index().infoDialog(language(30318).encode("utf-8"))
  1116. return
  1117. def sources_get(self, name, title, imdb, year, hostDict):
  1118. threads = []
  1119. global icefilms_sources
  1120. icefilms_sources = []
  1121. if getSetting("icefilms") == 'true':
  1122. threads.append(Thread(icefilms().get, name, title, imdb, year, hostDict))
  1123. global movie25_sources
  1124. movie25_sources = []
  1125. threads.append(Thread(movie25().get, name, title, imdb, year, hostDict))
  1126. global vkbox_sources
  1127. vkbox_sources = []
  1128. if getSetting("vkbox") == 'true':
  1129. threads.append(Thread(vkbox().get, name, title, imdb, year, hostDict))
  1130. global istreamhd_sources
  1131. istreamhd_sources = []
  1132. if getSetting("istreamhd") == 'true':
  1133. threads.append(Thread(istreamhd().get, name, title, imdb, year, hostDict))
  1134. global simplymovies_sources
  1135. simplymovies_sources = []
  1136. if getSetting("simplymovies") == 'true':
  1137. threads.append(Thread(simplymovies().get, name, title, imdb, year, hostDict))
  1138. global muchmovies_sources
  1139. muchmovies_sources = []
  1140. if getSetting("muchmovies") == 'true':
  1141. threads.append(Thread(muchmovies().get, name, title, imdb, year, hostDict))
  1142. global yify_sources
  1143. yify_sources = []
  1144. if getSetting("yify") == 'true':
  1145. threads.append(Thread(yify().get, name, title, imdb, year, hostDict))
  1146. global viooz_sources
  1147. viooz_sources = []
  1148. if getSetting("viooz") == 'true':
  1149. threads.append(Thread(viooz().get, name, title, imdb, year, hostDict))
  1150. global moviestorm_sources
  1151. moviestorm_sources = []
  1152. if getSetting("moviestorm") == 'true':
  1153. threads.append(Thread(moviestorm().get, name, title, imdb, year, hostDict))
  1154. global noobroom_sources
  1155. noobroom_sources = []
  1156. if getSetting("noobroom") == 'true':
  1157. threads.append(Thread(noobroom().get, name, title, imdb, year, hostDict))
  1158. global merdb_sources
  1159. merdb_sources = []
  1160. if getSetting("merdb") == 'true':
  1161. threads.append(Thread(merdb().get, name, title, imdb, year, hostDict))
  1162. [i.start() for i in threads]
  1163. [i.join() for i in threads]
  1164. self.sources = icefilms_sources + movie25_sources + vkbox_sources + istreamhd_sources + simplymovies_sources + muchmovies_sources + yify_sources + viooz_sources + moviestorm_sources + noobroom_sources + merdb_sources
  1165. return self.sources
  1166. def sources_resolve(self, url, provider):
  1167. try:
  1168. if provider == 'Icefilms': url = icefilms().resolve(url)
  1169. elif provider == 'Movie25': url = movie25().resolve(url)
  1170. elif provider == 'VKBox': url = vkbox().resolve(url)
  1171. elif provider == 'iStreamHD': url = istreamhd().resolve(url)
  1172. elif provider == 'Simplymovies': url = simplymovies().resolve(url)
  1173. elif provider == 'Muchmovies': url = muchmovies().resolve(url)
  1174. elif provider == 'YIFY': url = yify().resolve(url)
  1175. elif provider == 'Viooz': url = viooz().resolve(url)
  1176. elif provider == 'Moviestorm': url = moviestorm().resolve(url)
  1177. elif provider == 'Noobroom': url = noobroom().resolve(url)
  1178. elif provider == 'MerDB': url = merdb().resolve(url)
  1179. return url
  1180. except:
  1181. return
  1182. def sources_filter(self):
  1183. #hd_rank = ['VK', 'Muchmovies', 'YIFY', 'Viooz', 'Noobroom', 'Movreel', 'Billionuploads', '180upload', 'Hugefiles']
  1184. #sd_rank = ['VK', 'Viooz', 'iShared', 'Noobroom', 'Firedrive', 'Putlocker', 'Sockshare', 'Played', 'Promptfile', 'Mightyupload', 'Gorillavid', 'Divxstage', 'Movreel', 'Flashx', 'Sharesix']
  1185. hd_rank = [getSetting("hosthd1"), getSetting("hosthd2"), getSetting("hosthd3"), getSetting("hosthd4"), getSetting("hosthd5"), getSetting("hosthd6"), getSetting("hosthd7"), getSetting("hosthd8"), getSetting("hosthd9")]
  1186. sd_rank = [getSetting("host1"), getSetting("host2"), getSetting("host3"), getSetting("host4"), getSetting("host5"), getSetting("host6"), getSetting("host7"), getSetting("host8"), getSetting("host9"), getSetting("host10"), getSetting("host11"), getSetting("host12"), getSetting("host13"), getSetting("host14"), getSetting("host15")]
  1187. for i in range(len(self.sources)): self.sources[i]['source'] = self.sources[i]['source'].lower()
  1188. self.sources = sorted(self.sources, key=itemgetter('source'))
  1189. filter = []
  1190. for host in hd_rank: filter += [i for i in self.sources if i['quality'] == 'HD' and i['source'].lower() == host.lower()]
  1191. for host in sd_rank: filter += [i for i in self.sources if not i['quality'] == 'HD' and i['source'].lower() == host.lower()]
  1192. filter += [i for i in self.sources if not i['quality'] == 'HD' and not any(x == i['source'].lower() for x in [r.lower() for r in sd_rank])]
  1193. self.sources = filter
  1194. filter = []
  1195. filter += [i for i in self.sources if i['quality'] == 'HD']
  1196. filter += [i for i in self.sources if i['quality'] == 'SD']
  1197. filter += [i for i in self.sources if i['quality'] == 'SCR']
  1198. filter += [i for i in self.sources if i['quality'] == 'CAM']
  1199. self.sources = filter
  1200. if not getSetting("quality") == 'true':
  1201. self.sources = [i for i in self.sources if not i['quality'] == 'HD']
  1202. count = 1
  1203. for i in range(len(self.sources)):
  1204. self.sources[i]['source'] = '#'+ str(count) + ' | ' + self.sources[i]['provider'].upper() + ' | ' + self.sources[i]['source'].upper() + ' | ' + self.sources[i]['quality']
  1205. count = count + 1
  1206. return self.sources
  1207. def sources_dialog(self):
  1208. try:
  1209. sourceList, urlList, providerList = [], [], []
  1210. for i in self.sources:
  1211. sourceList.append(i['source'])
  1212. urlList.append(i['url'])
  1213. providerList.append(i['provider'])
  1214. select = index().selectDialog(sourceList)
  1215. if select == -1: return 'close://'
  1216. url = self.sources_resolve(urlList[select], providerList[select])
  1217. self.selectedSource = self.sources[select]['source']
  1218. return url
  1219. except:
  1220. return
  1221. def sources_direct(self):
  1222. for i in self.sources:
  1223. try:
  1224. if i['provider'] == 'Icefilms' and i['quality'] == 'HD': raise Exception()
  1225. url = self.sources_resolve(i['url'], i['provider'])
  1226. if i['provider'] == 'Muchmovies': url = muchmovies().check(url)
  1227. xbmc.sleep(1000)
  1228. if url is None: raise Exception()
  1229. self.selectedSource = i['source']
  1230. return url
  1231. except:
  1232. pass
  1233. def sources_dict(self):
  1234. self.hostDict = [
  1235. '2gb-hosting',
  1236. 'allmyvideos',
  1237. #'180upload',
  1238. 'bayfiles',
  1239. 'bestreams',
  1240. #'billionuploads',
  1241. 'castamp',
  1242. #'clicktoview',
  1243. 'daclips',
  1244. 'divxstage',
  1245. 'donevideo',
  1246. 'ecostream',
  1247. 'filenuke',
  1248. 'firedrive',
  1249. 'flashx',
  1250. 'gorillavid',
  1251. 'hostingbulk',
  1252. #'hugefiles',
  1253. 'jumbofiles',
  1254. 'lemuploads',
  1255. 'limevideo',
  1256. #'megarelease',
  1257. 'mightyupload',
  1258. 'movdivx',
  1259. 'movpod',
  1260. 'movreel',
  1261. 'movshare',
  1262. 'movzap',
  1263. 'muchshare',
  1264. 'nosvideo',
  1265. 'novamov',
  1266. 'nowvideo',
  1267. 'played',
  1268. 'playwire',
  1269. 'primeshare',
  1270. 'promptfile',
  1271. 'purevid',
  1272. 'putlocker',
  1273. 'sharerepo',
  1274. 'sharesix',
  1275. 'sockshare',
  1276. 'stagevu',
  1277. 'streamcloud',
  1278. 'thefile',
  1279. 'uploadc',
  1280. 'vidbull',
  1281. 'videobb',
  1282. 'videoweed',
  1283. 'videozed',
  1284. #'vidhog',
  1285. #'vidplay',
  1286. 'vidx',
  1287. #'vidxden',
  1288. #'watchfreeinhd',
  1289. 'xvidstage',
  1290. 'yourupload',
  1291. 'youwatch',
  1292. 'zalaa'
  1293. ]
  1294. class imdb:
  1295. def __init__(self):
  1296. self.list = []
  1297. self.base_link = 'http://www.imdb.com'
  1298. self.akas_link = 'http://akas.imdb.com'
  1299. self.mobile_link = 'http://m.imdb.com'
  1300. self.genre_link = 'http://akas.imdb.com/genre/'
  1301. self.title_link = 'http://www.imdb.com/title/tt%s/'
  1302. self.image_link = 'http://i.media-imdb.com/images/SFaa265aa19162c9e4f3781fbae59f856d/nopicture/medium/film.png'
  1303. self.genres_link = 'http://akas.imdb.com/search/title?title_type=feature,tv_movie&sort=boxoffice_gross_us&count=25&start=1&genres=%s'
  1304. self.years_link = 'http://akas.imdb.com/search/title?title_type=feature,tv_movie&sort=boxoffice_gross_us&count=25&start=1&&year=%s,%s'
  1305. self.popular_link = 'http://akas.imdb.com/search/title?title_type=feature,tv_movie&sort=moviemeter,asc&count=25&start=1'
  1306. self.boxoffice_link = 'http://akas.imdb.com/search/title?title_type=feature,tv_movie&sort=boxoffice_gross_us,desc&count=25&start=1'
  1307. self.views_link = 'http://akas.imdb.com/search/title?title_type=feature,tv_movie&sort=num_votes,desc&count=25&start=1'
  1308. self.oscars_link = 'http://akas.imdb.com/search/title?title_type=feature,tv_movie&groups=oscar_best_picture_winners&sort=year,desc&count=25&start=1'
  1309. self.search_link = 'http://akas.imdb.com/search/title?title_type=feature,tv_movie&sort=moviemeter,asc&count=25&start=1&title=%s'
  1310. self.actors_search_link = 'http://www.imdb.com/search/name?count=100&name=%s'
  1311. self.actors_link = 'http://m.imdb.com/name/nm%s/filmotype/%s'
  1312. def popular(self):
  1313. #self.list = self.movies_list(self.popular_link)
  1314. self.list = cache(self.movies_list, self.popular_link)
  1315. index().movieList(self.list)
  1316. index().nextList(self.list)
  1317. def boxoffice(self):
  1318. #self.list = self.movies_list(self.boxoffice_link)
  1319. self.list = cache(self.movies_list, self.boxoffice_link)
  1320. index().movieList(self.list)
  1321. index().nextList(self.list)
  1322. def views(self):
  1323. #self.list = self.movies_list(self.views_link)
  1324. self.list = cache(self.movies_list, self.views_link)
  1325. index().movieList(self.list)
  1326. index().nextList(self.list)
  1327. def oscars(self):
  1328. #self.list = self.movies_list(self.oscars_link)
  1329. self.list = cache(self.movies_list, self.oscars_link)
  1330. index().movieList(self.list)
  1331. index().nextList(self.list)
  1332. def genres(self):
  1333. #self.list = self.genres_list()
  1334. self.list = cache3(self.genres_list)
  1335. index().pageList(self.list)
  1336. def years(self):
  1337. self.list = self.years_list()
  1338. index().pageList(self.list)
  1339. def search(self, query=None):
  1340. if query is None:
  1341. self.query = common.getUserInput(language(30362).encode("utf-8"), '')
  1342. else:
  1343. self.query = query
  1344. if not (self.query is None or self.query == ''):
  1345. self.query = self.search_link % urllib.quote_plus(self.query)
  1346. self.list = self.movies_list(self.query)
  1347. if getSetting("filter_search") == 'true': self.list = self.filter()
  1348. index().movieList(self.list)
  1349. def actors_search(self, query=None):
  1350. if query is None:
  1351. self.query = common.getUserInput(language(30362).encode("utf-8"), '')
  1352. else:
  1353. self.query = query
  1354. if not (self.query is None or self.query == ''):
  1355. self.query = self.actors_search_link % urllib.quote_plus(self.query)
  1356. self.list = self.actors_list(self.query)
  1357. index().pageList(self.list)
  1358. def movies_list(self, url):
  1359. try:
  1360. result = getUrl(url.replace(self.base_link, self.akas_link)).result
  1361. result = result.decode('iso-8859-1').encode('utf-8')
  1362. movies = common.parseDOM(result, "tr", attrs = { "class": ".+?" })
  1363. except:
  1364. return
  1365. try:
  1366. next = common.parseDOM(result, "span", attrs = { "class": "pagination" })[0]
  1367. name = common.parseDOM(next, "a")[-1]
  1368. if 'laquo' in name: raise Exception()
  1369. next = common.parseDOM(next, "a", ret="href")[-1]
  1370. next = '%s%s' % (self.akas_link, next)
  1371. next = common.replaceHTMLCodes(next)
  1372. next = next.encode('utf-8')
  1373. except:
  1374. next = ''
  1375. for movie in movies:
  1376. try:
  1377. title = common.parseDOM(movie, "a")[1]
  1378. title = common.replaceHTMLCodes(title)
  1379. title = title.encode('utf-8')
  1380. year = common.parseDOM(movie, "span", attrs = { "class": "year_type" })[0]
  1381. year = re.sub('[^0-9]', '', year)[:4]
  1382. year = year.encode('utf-8')
  1383. name = '%s (%s)' % (title, year)
  1384. name = common.replaceHTMLCodes(name)
  1385. name = name.encode('utf-8')
  1386. url = common.parseDOM(movie, "a", ret="href")[0]
  1387. url = '%s%s' % (self.base_link, url)
  1388. url = common.replaceHTMLCodes(url)
  1389. url = url.encode('utf-8')
  1390. try:
  1391. image = common.parseDOM(movie, "img", ret="src")[0]
  1392. if not ('._SX' in image or '._SY' in image): raise Exception()
  1393. image = image.rsplit('._SX', 1)[0].rsplit('._SY', 1)[0] + '._SX500.' + image.rsplit('.', 1)[-1]
  1394. except:
  1395. image = self.image_link
  1396. image = common.replaceHTMLCodes(image)
  1397. image = image.encode('utf-8')
  1398. imdb = re.sub('[^0-9]', '', url.rsplit('tt', 1)[-1])
  1399. imdb = imdb.encode('utf-8')
  1400. try:
  1401. genre = common.parseDOM(movie, "span", attrs = { "class": "genre" })
  1402. genre = common.parseDOM(genre, "a")
  1403. genre = " / ".join(genre)
  1404. genre = common.replaceHTMLCodes(genre)
  1405. genre = genre.encode('utf-8')
  1406. except:
  1407. genre = ''
  1408. try:
  1409. plot = common.parseDOM(movie, "span", attrs = { "class": "outline" })[0]
  1410. plot = common.replaceHTMLCodes(plot)
  1411. plot = plot.encode('utf-8')
  1412. except:
  1413. plot = ''
  1414. self.list.append({'name': name, 'url': url, 'image': image, 'title': title, 'year': year, 'imdb': imdb, 'genre': genre, 'plot': plot, 'next': next})
  1415. except:
  1416. pass
  1417. return self.list
  1418. def movies_list2(self, url):
  1419. try:
  1420. result = getUrl(url, mobile=True).result
  1421. result = result.decode('iso-8859-1').encode('utf-8')
  1422. movies = common.parseDOM(result, "div", attrs = { "class": "col-xs.+?" })
  1423. except:
  1424. return
  1425. for movie in movies:
  1426. try:
  1427. title = common.parseDOM(movie, "span", attrs = { "class": "h3" })[0]
  1428. title = common.replaceHTMLCodes(title)
  1429. title = title.encode('utf-8')
  1430. year = common.parseDOM(movie, "div", attrs = { "class": "unbold" })[0]
  1431. year = re.sub("\n|[(]|[)]|\s", "", year)
  1432. year = year.encode('utf-8')
  1433. if not year.isdigit(): raise Exception()
  1434. name = '%s (%s)' % (title, year)
  1435. name = common.replaceHTMLCodes(name)
  1436. name = name.encode('utf-8')
  1437. url = common.parseDOM(movie, "a", ret="href")[0]
  1438. url = re.findall('tt(\d*)', url, re.I)[0]
  1439. url = self.title_link % url
  1440. url = common.replaceHTMLCodes(url)
  1441. url = url.encode('utf-8')
  1442. image = common.parseDOM(movie, "img", ret="src")[0]
  1443. if not ('_SX' in image or '_SY' in image): raise Exception()
  1444. image = image.rsplit('_SX', 1)[0].rsplit('_SY', 1)[0] + '_SX500.' + image.rsplit('.', 1)[-1]
  1445. image = common.replaceHTMLCodes(image)
  1446. image = image.encode('utf-8')
  1447. imdb = re.sub('[^0-9]', '', url.rsplit('tt', 1)[-1])
  1448. imdb = imdb.encode('utf-8')
  1449. self.list.append({'name': name, 'url': url, 'image': image, 'title': title, 'year': year, 'imdb': imdb, 'genre': '', 'plot': ''})
  1450. except:
  1451. pass
  1452. return self.list
  1453. def actors_list(self, url):
  1454. try:
  1455. result = getUrl(url).result
  1456. result = result.decode('iso-8859-1').encode('utf-8')
  1457. actors = common.parseDOM(result, "tr", attrs = { "class": ".+? detailed" })
  1458. except:
  1459. return
  1460. for actor in actors:
  1461. try:
  1462. name = common.parseDOM(actor, "a", ret="title")[0]
  1463. name = common.replaceHTMLCodes(name)
  1464. name = name.encode('utf-8')
  1465. url = common.parseDOM(actor, "a", ret="href")[0]
  1466. url = re.findall('nm(\d*)', url, re.I)[0]
  1467. type = common.parseDOM(actor, "span", attrs = { "class": "description" })[0]
  1468. if 'Actress' in type: type = 'actress'
  1469. elif 'Actor' in type: type = 'actor'
  1470. else: raise Exception()
  1471. url = self.actors_link % (url, type)
  1472. url = common.replaceHTMLCodes(url)
  1473. url = url.encode('utf-8')
  1474. image = common.parseDOM(actor, "img", ret="src")[0]
  1475. if not ('._SX' in image or '._SY' in image): raise Exception()
  1476. image = image.rsplit('._SX', 1)[0].rsplit('._SY', 1)[0] + '._SX500.' + image.rsplit('.', 1)[-1]
  1477. image = common.replaceHTMLCodes(image)
  1478. image = image.encode('utf-8')
  1479. self.list.append({'name': name, 'url': url, 'image': image})
  1480. except:
  1481. pass
  1482. return self.list
  1483. def genres_list(self):
  1484. try:
  1485. result = getUrl(self.genre_link).result
  1486. result = common.parseDOM(result, "table", attrs = { "class": "genre-table" })[0]
  1487. genres = common.parseDOM(result, "h3")
  1488. except:
  1489. return
  1490. for genre in genres:
  1491. try:
  1492. name = common.parseDOM(genre, "a")[0]
  1493. name = name.split('<', 1)[0].rsplit('>', 1)[0].strip()
  1494. name = common.replaceHTMLCodes(name)
  1495. name = name.encode('utf-8')
  1496. url = common.parseDOM(genre, "a", ret="href")[0]
  1497. url = re.compile('/genre/(.+?)/').findall(url)[0]
  1498. url = self.genres_link % url
  1499. url = common.replaceHTMLCodes(url)
  1500. url = url.encode('utf-8')
  1501. image = addonGenres.encode('utf-8')
  1502. self.list.append({'name': name, 'url': url, 'image': image})
  1503. except:
  1504. pass
  1505. return self.list
  1506. def years_list(self):
  1507. year = (datetime.datetime.utcnow() - datetime.timedelta(hours = 5)).strftime("%Y")
  1508. for i in range(int(year)-1, int(year)-51, -1):
  1509. name = str(i).encode('utf-8')
  1510. url = self.years_link % (str(i), str(i))
  1511. url = url.encode('utf-8')
  1512. image = addonYears.encode('utf-8')
  1513. self.list.append({'name': name, 'url': url, 'image': image})
  1514. return self.list
  1515. def filter(self):
  1516. filter = []
  1517. for i in self.list:
  1518. sources = resolver().sources_get(i['name'], i['title'], i['imdb'], i['year'], resolver().hostDict)
  1519. if not sources == []: filter.append(i['url'])
  1520. self.list = [i for i in self.list if any(x == i['url'] for x in filter)]
  1521. return self.list
  1522. class imdb_user:
  1523. def __init__(self):
  1524. self.list = []
  1525. self.base_link = 'http://www.imdb.com'
  1526. self.akas_link = 'http://akas.imdb.com'
  1527. self.login_link = 'https://secure.imdb.com/oauth/m_login?origpath=/&ref_=m_nv_usr_lgin'
  1528. self.user_link = 'http://akas.imdb.com/user/%s/lists?tab=all&sort=modified:desc&filter=titles'
  1529. self.image_link = 'http://i.media-imdb.com/images/SFaa265aa19162c9e4f3781fbae59f856d/nopicture/medium/film.png'
  1530. self.watchlist_link ='http://m.imdb.com/list/userlist_json?list_class=watchlist&limit=10000'
  1531. self.list_link ='http://m.imdb.com/list/userlist_json?list_class=%s&limit=10000'
  1532. self.mail, self.password = getSetting("imdb_mail"), getSetting("imdb_password")
  1533. def userlists(self):
  1534. self.list.append({'name': language(30531).encode("utf-8"), 'url': 'watchlist', 'image': addonLists.encode('utf-8')})
  1535. self.list.append({'name': language(30532).encode("utf-8"), 'url': 'watchadded', 'image': addonLists.encode('utf-8')})
  1536. self.list.append({'name': language(30533).encode("utf-8"), 'url': 'watchtitle', 'image': addonLists.encode('utf-8')})
  1537. self.userlists_list()
  1538. index().userList(self.list)
  1539. def userlists_list(self):
  1540. try:
  1541. #cookie = self.cookie(self.mail, self.password)
  1542. cookie = cache2(self.cookie, self.mail, self.password)
  1543. result = getUrl(self.akas_link, cookie=cookie).result
  1544. result = result.decode('iso-8859-1').encode('utf-8')
  1545. id = re.compile('/user/(ur.+?)/').findall(result)[0]
  1546. result = getUrl(self.user_link % id, cookie=cookie).result
  1547. result = result.decode('iso-8859-1').encode('utf-8')
  1548. userlists = common.parseDOM(result, "table", attrs = { "class": "lists" })[0]
  1549. userlists = common.parseDOM(userlists, "tr", attrs = { "id": ".+?" })
  1550. except:
  1551. return
  1552. for userlist in userlists:
  1553. try:
  1554. name = common.parseDOM(userlist, "a", ret="title")[0]
  1555. name = common.replaceHTMLCodes(name)
  1556. name = name.encode('utf-8')
  1557. url = common.parseDOM(userlist, "a", ret="href")[0]
  1558. url = url.split('/list/', 1)[-1].replace('/', '')
  1559. url = common.replaceHTMLCodes(url)
  1560. url = url.encode('utf-8')
  1561. image = addonLists.encode('utf-8')
  1562. self.list.append({'name': name, 'url': url, 'image': image})
  1563. except:
  1564. pass
  1565. return self.list
  1566. def movies_list(self, url):
  1567. try:
  1568. #cookie = self.cookie(self.mail, self.password)
  1569. cookie = cache2(self.cookie, self.mail, self.password)
  1570. result = getUrl(url, cookie=cookie).result
  1571. result = json.loads(result)
  1572. movies = result['list']
  1573. except:
  1574. return
  1575. for movie in movies:
  1576. try:
  1577. title = movie['title']
  1578. title = common.replaceHTMLCodes(title)
  1579. title = title.encode('utf-8')
  1580. year = movie['extra']
  1581. year = re.sub("\n|[(]|[)]|\s", "", year)
  1582. year = year.encode('utf-8')
  1583. if not year.isdigit(): raise Exception()
  1584. name = '%s (%s)' % (title, year)
  1585. name = common.replaceHTMLCodes(name)
  1586. name = name.encode('utf-8')
  1587. url = movie['url']
  1588. url = '%s%s' % (self.base_link, url)
  1589. url = common.replaceHTMLCodes(url)
  1590. url = url.encode('utf-8')
  1591. try:
  1592. image = movie['img']['url']
  1593. if not ('_SX' in image or '_SY' in image): raise Exception()
  1594. image = image.rsplit('_SX', 1)[0].rsplit('_SY', 1)[0].rsplit('_CR', 1)[0] + '_SX500.' + image.rsplit('.', 1)[-1]
  1595. except:
  1596. image = self.image_link
  1597. image = common.replaceHTMLCodes(image)
  1598. image = image.encode('utf-8')
  1599. imdb = re.sub('[^0-9]', '', url.rsplit('tt', 1)[-1])
  1600. imdb = imdb.encode('utf-8')
  1601. self.list.append({'name': name, 'url': url, 'image': image, 'title': title, 'year': year, 'imdb': imdb, 'genre': '', 'plot': '', 'next': ''})
  1602. except:
  1603. pass
  1604. return self.list
  1605. def cookie(self, mail, password):
  1606. try:
  1607. post = 'login=%s&password=%s' % (urllib.quote_plus(mail), urllib.quote_plus(password))
  1608. cookie = getUrl(self.login_link, post=post, output='cookie').result
  1609. return cookie
  1610. except:
  1611. return
  1612. class trakt:
  1613. def __init__(self):
  1614. self.list = []
  1615. self.base_link = 'http://api.trakt.tv'
  1616. self.title_link = 'http://www.imdb.com/title/tt%s/'
  1617. self.key_link = base64.urlsafe_b64decode('YmU2NDI5MWFhZmJiYmU2MmZkYzRmM2FhMGVkYjQwNzM=')
  1618. self.trending_link = 'http://api.trakt.tv/movies/trending.json/%s'
  1619. self.user, self.password = getSetting("trakt_user"), getSetting("trakt_password")
  1620. self.post = urllib.urlencode({'username': self.user, 'password': self.password})
  1621. self.watchlist_link = 'http://api.trakt.tv/user/watchlist/movies.json/%s/%s' % (self.key_link, self.user)
  1622. self.collection_link = 'http://api.trakt.tv/user/library/movies/collection.json/%s/%s' % (self.key_link, self.user)
  1623. self.watched_link = 'http://api.trakt.tv/user/library/movies/watched.json/%s/%s' % (self.key_link, self.user)
  1624. self.rated_link = 'http://api.trakt.tv/user/ratings/movies.json/%s/%s/rating/extended' % (self.key_link, self.user)
  1625. self.lists_link = 'http://api.trakt.tv/user/lists.json/%s/%s' % (self.key_link, self.user)
  1626. self.list_link = 'http://api.trakt.tv/user/list.json/%s/%s' % (self.key_link, self.user)
  1627. def trending(self):
  1628. #self.list = self.movies_list(self.trending_link % self.key_link)
  1629. self.list = cache2(self.movies_list, self.trending_link % self.key_link)
  1630. index().movieList(self.list[:100])
  1631. def userlists(self):
  1632. self.list.append({'name': language(30541).encode("utf-8"), 'url': self.watchlist_link, 'image': addonLists.encode('utf-8')})
  1633. self.list.append({'name': language(30542).encode("utf-8"), 'url': self.collection_link, 'image': addonLists.encode('utf-8')})
  1634. self.list.append({'name': language(30543).encode("utf-8"), 'url': self.watched_link, 'image': addonLists.encode('utf-8')})
  1635. self.list.append({'name': language(30544).encode("utf-8"), 'url': self.rated_link, 'image': addonLists.encode('utf-8')})
  1636. self.userlists_list()
  1637. index().userList(self.list)
  1638. def userlists_list(self):
  1639. try:
  1640. result = getUrl(self.lists_link, post=self.post).result
  1641. userlists = json.loads(result)
  1642. except:
  1643. return
  1644. for userlist in userlists:
  1645. try:
  1646. name = userlist['name']
  1647. name = common.replaceHTMLCodes(name)
  1648. name = name.encode('utf-8')
  1649. url = userlist['slug']
  1650. url = '%s/%s' % (self.list_link, url)
  1651. url = common.replaceHTMLCodes(url)
  1652. url = url.encode('utf-8')
  1653. image = addonLists.encode('utf-8')
  1654. self.list.append({'name': name, 'url': url, 'image': image})
  1655. except:
  1656. pass
  1657. return self.list
  1658. def movies_list(self, url):
  1659. try:
  1660. result = getUrl(url, post=self.post).result
  1661. result = json.loads(result)
  1662. try: movies = [i['movie'] for i in result['items']]
  1663. except: movies = result
  1664. except:
  1665. return
  1666. for movie in movies:
  1667. try:
  1668. title = movie['title']
  1669. title = common.replaceHTMLCodes(title)
  1670. title = title.encode('utf-8')
  1671. year = movie['year']
  1672. year = re.sub('[^0-9]', '', str(year))
  1673. year = year.encode('utf-8')
  1674. name = '%s (%s)' % (title, year)
  1675. name = common.replaceHTMLCodes(name)
  1676. name = name.encode('utf-8')
  1677. imdb = movie['imdb_id']
  1678. imdb = re.sub('[^0-9]', '', str(imdb))
  1679. imdb = imdb.encode('utf-8')
  1680. url = self.title_link % imdb
  1681. url = common.replaceHTMLCodes(url)
  1682. url = url.encode('utf-8')
  1683. try: image = movie['images']['poster']
  1684. except: image = movie['poster']
  1685. image = common.replaceHTMLCodes(image)
  1686. image = image.encode('utf-8')
  1687. try:
  1688. genre = movie['genres']
  1689. genre = " / ".join(genre)
  1690. genre = common.replaceHTMLCodes(genre)
  1691. genre = genre.encode('utf-8')
  1692. except:
  1693. genre = ''
  1694. try:
  1695. plot = movie['overview']
  1696. plot = common.replaceHTMLCodes(plot)
  1697. plot = plot.encode('utf-8')
  1698. except:
  1699. plot = ''
  1700. self.list.append({'name': name, 'url': url, 'image': image, 'title': title, 'year': year, 'imdb': imdb, 'genre': genre, 'plot': plot})
  1701. except:
  1702. pass
  1703. return self.list
  1704. class icefilms:
  1705. def __init__(self):
  1706. self.base_link = 'http://www.icefilms.info'
  1707. self.search_link = 'http://www.icefilms.info/movies/a-z/%s'
  1708. self.video_link = 'http://www.icefilms.info/membersonly/components/com_iceplayer/video.php?vid=%s'
  1709. self.post_link = 'http://www.icefilms.info/membersonly/components/com_iceplayer/video.phpAjaxResp.php'
  1710. def get(self, name, title, imdb, year, hostDict):
  1711. try:
  1712. global icefilms_sources
  1713. icefilms_sources = []
  1714. query = title.upper()
  1715. if query.startswith('THE '): query = query.replace('THE ', '')
  1716. elif query.startswith('A '): query = query.replace('A ', '')
  1717. if not query[0].isalpha(): query = '1'
  1718. query = self.search_link % query[0]
  1719. result = getUrl(query).result
  1720. result = result.decode('iso-8859-1').encode('utf-8')
  1721. id = re.compile('id=%s>.+?href=/ip.php[?]v=(.+?)&' % imdb).findall(result)[0]
  1722. url = self.video_link % id
  1723. url = common.replaceHTMLCodes(url)
  1724. url = url.encode('utf-8')
  1725. result = getUrl(url).result
  1726. result = result.decode('iso-8859-1').encode('utf-8')
  1727. sec = re.compile('lastChild[.]value="(.+?)"').findall(result)[0]
  1728. links = common.parseDOM(result, "div", attrs = { "class": "ripdiv" })
  1729. import random
  1730. try:
  1731. hd_links = ''
  1732. hd_links = [i for i in links if '>HD 720p<' in i][0]
  1733. hd_links = re.compile("onclick='go[(](.+?)[)]'>Source(.+?)</a>").findall(hd_links)
  1734. except:
  1735. pass
  1736. for url, host in hd_links:
  1737. try:
  1738. hosts = ['movreel', 'billionuploads', '180upload', 'hugefiles']
  1739. host = re.sub('<span\s.+?>|</span>|#\d*:','', host)
  1740. host = host.strip().lower()
  1741. if not host in hosts: raise Exception()
  1742. url = 'id=%s&t=%s&sec=%s&s=%s&m=%s&cap=&iqs=&url=' % (url, id, sec, random.randrange(5, 50), random.randrange(100, 300) * -1)
  1743. icefilms_sources.append({'source': host, 'quality': 'HD', 'provider': 'Icefilms', 'url': url})
  1744. except:
  1745. pass
  1746. try:
  1747. sd_links = ''
  1748. sd_links = [i for i in links if '>DVDRip / Standard Def<' in i]
  1749. if len(sd_links) == 0: sd_links = [i for i in links if '>DVD Screener<' in i]
  1750. if len(sd_links) == 0: sd_links = [i for i in links if '>R5/R6 DVDRip<' in i]
  1751. sd_links = sd_links[0]
  1752. sd_links = re.compile("onclick='go[(](.+?)[)]'>Source(.+?)</a>").findall(sd_links)
  1753. except:
  1754. pass
  1755. for url, host in sd_links:
  1756. try:
  1757. hosts = ['movreel']
  1758. host = re.sub('<span\s.+?>|</span>|#\d*:','', host)
  1759. host = host.strip().lower()
  1760. if not host in hosts: raise Exception()
  1761. url = 'id=%s&t=%s&sec=%s&s=%s&m=%s&cap=&iqs=&url=' % (url, id, sec, random.randrange(5, 50), random.randrange(100, 300) * -1)
  1762. icefilms_sources.append({'source': host, 'quality': 'SD', 'provider': 'Icefilms', 'url': url})
  1763. except:
  1764. pass
  1765. except:
  1766. return
  1767. def resolve(self, url):
  1768. try:
  1769. result = getUrl(self.post_link, post=url).result
  1770. url = result.split("?url=", 1)[-1]
  1771. url = urllib.unquote_plus(url)
  1772. import commonresolvers
  1773. url = commonresolvers.resolvers().get(url)
  1774. return url
  1775. except:
  1776. return
  1777. class movie25:
  1778. def __init__(self):
  1779. self.base_link = 'http://www.movie25.so'
  1780. self.search_link = 'http://www.movie25.so/search.php?key=%s'
  1781. def get(self, name, title, imdb, year, hostDict):
  1782. try:
  1783. global movie25_sources
  1784. movie25_sources = []
  1785. query = self.search_link % urllib.quote_plus(title)
  1786. result = getUrl(query).result
  1787. result = result.decode('iso-8859-1').encode('utf-8')
  1788. result = common.parseDOM(result, "div", attrs = { "class": "movie_table" })[0]
  1789. result = common.parseDOM(result, "li")
  1790. match = [i for i in result if any(x in i for x in [' (%s)' % str(year), ' (%s)' % str(int(year)+1), ' (%s)' % str(int(year)-1)])]
  1791. match2 = [self.base_link + common.parseDOM(i, "a", ret="href")[0] for i in match]
  1792. if match2 == []: return
  1793. for i in match2[:10]:
  1794. try:
  1795. result = getUrl(i).result
  1796. result = result.decode('iso-8859-1').encode('utf-8')
  1797. if str('tt' + imdb) in result:
  1798. match3 = result
  1799. break
  1800. except:
  1801. pass
  1802. result = common.parseDOM(match3, "div", attrs = { "class": "links_quality" })[0]
  1803. quality = common.parseDOM(result, "h1")[0]
  1804. quality = quality.replace('\n','').rsplit(' ', 1)[-1]
  1805. if quality == 'CAM' or quality == 'TS': quality = 'CAM'
  1806. elif quality == 'SCREENER': quality = 'SCR'
  1807. else: quality = 'SD'
  1808. links = common.parseDOM(result, "ul")
  1809. for i in links:
  1810. try:
  1811. name = common.parseDOM(i, "a")[0]
  1812. name = common.replaceHTMLCodes(name)
  1813. if name.isdigit(): raise Exception()
  1814. host = common.parseDOM(i, "li", attrs = { "class": "link_name" })[0]
  1815. host = common.replaceHTMLCodes(host)
  1816. host = host.encode('utf-8')
  1817. host = [x for x in hostDict if host.lower() == x.lower()][0]
  1818. url = common.parseDOM(i, "a", ret="href")[0]
  1819. url = '%s%s' % (self.base_link, url)
  1820. url = common.replaceHTMLCodes(url)
  1821. url = url.encode('utf-8')
  1822. movie25_sources.append({'source': host, 'quality': quality, 'provider': 'Movie25', 'url': url})
  1823. except:
  1824. pass
  1825. except:
  1826. return
  1827. def resolve(self, url):
  1828. try:
  1829. result = getUrl(url).result
  1830. result = result.decode('iso-8859-1').encode('utf-8')
  1831. url = common.parseDOM(result, "input", ret="onclick")
  1832. url = [i for i in url if 'location.href' in i and 'http://' in i][0]
  1833. url = url.split("'", 1)[-1].rsplit("'", 1)[0]
  1834. import urlresolver
  1835. host = urlresolver.HostedMediaFile(url)
  1836. if host: resolver = urlresolver.resolve(url)
  1837. if not resolver.startswith('http://'): return
  1838. if not resolver == url: return resolver
  1839. except:
  1840. return
  1841. class vkbox:
  1842. def __init__(self):
  1843. self.base_link = 'http://mobapps.cc'
  1844. self.data_link = 'http://mobapps.cc/data/data_en.zip'
  1845. self.movie_link = 'http://mobapps.cc/api/serials/get_movie_data/?id=%s'
  1846. self.movies_link = 'movies_lite.json'
  1847. def get(self, name, title, imdb, year, hostDict):
  1848. try:
  1849. global vkbox_sources
  1850. vkbox_sources = []
  1851. #result = self.getdata()
  1852. result = cache2(self.getdata)
  1853. result = json.loads(result)
  1854. match = [i['id'] for i in result if any(x == self.cleantitle(i['title']) for x in [self.cleantitle(title), self.cleantitle(title)]) and any(x == i['year'] for x in [str(year), str(int(year)+1), str(int(year)-1)])][0]
  1855. url = self.movie_link % match
  1856. url = common.replaceHTMLCodes(url)
  1857. url = url.encode('utf-8')
  1858. request = urllib2.Request(url,None)
  1859. request.add_header('User-Agent', 'android-async-http/1.4.1 (http://loopj.com/android-async-http)')
  1860. response = urllib2.urlopen(request, timeout=10)
  1861. result = response.read()
  1862. response.close()
  1863. param = re.findall('"lang":"en","apple":(\d+?),"google":(\d+?),"microsoft":"(.+?)"', result, re.I)
  1864. num = int(match) + 537
  1865. url = 'https://vk.com/video_ext.php?oid=%s&id=%s&hash=%s' % (str(int(param[0][0]) + num), str(int(param[0][1]) + num), param[0][2])
  1866. result = getUrl(url).result
  1867. try:
  1868. url = re.compile('url720=(.+?)&').findall(result)[0].replace('https://', 'http://')
  1869. vkbox_sources.append({'source': 'VK', 'quality': 'HD', 'provider': 'VKBox', 'url': url})
  1870. except:
  1871. pass
  1872. try:
  1873. url = re.compile('url540=(.+?)&').findall(result)[0].replace('https://', 'http://')
  1874. vkbox_sources.append({'source': 'VK', 'quality': 'SD', 'provider': 'VKBox', 'url': url})
  1875. except:
  1876. pass
  1877. try:
  1878. url = re.compile('url480=(.+?)&').findall(result)[0].replace('https://', 'http://')
  1879. vkbox_sources.append({'source': 'VK', 'quality': 'SD', 'provider': 'VKBox', 'url': url})
  1880. except:
  1881. pass
  1882. except:
  1883. return
  1884. def getdata(self):
  1885. try:
  1886. import zipfile, StringIO
  1887. data = urllib2.urlopen(self.data_link, timeout=10).read()
  1888. zip = zipfile.ZipFile(StringIO.StringIO(data))
  1889. read = zip.open(self.movies_link)
  1890. result = read.read()
  1891. return result
  1892. except:
  1893. return
  1894. def cleantitle(self, title):
  1895. title = re.sub('\n|([[].+?[]])|([(].+?[)])|\s(vs|v[.])\s|(:|;|-|"|,|\'|\.|\?)|\s', '', title).lower()
  1896. return title
  1897. def resolve(self, url):
  1898. return url
  1899. class istreamhd:
  1900. def __init__(self):
  1901. self.base_link = 'http://istreamhd.org'
  1902. self.get_link = 'http://istreamhd.org/get'
  1903. self.search_link = 'http://istreamhd.org/get/mini_search.php?&count=10&q=%s'
  1904. self.watch_link = 'http://istreamhd.org/lib/get_embed.php?%s'
  1905. self.key_link = base64.urlsafe_b64decode('bWFpbD1lMjMxMDI2NiU0MGRyZHJiLmNvbSZwYXNzd29yZD1lMjMxMDI2Ng==')
  1906. self.login_link = 'http://istreamhd.org/get/login.php?p=login'
  1907. def get(self, name, title, imdb, year, hostDict):
  1908. try:
  1909. global istreamhd_sources
  1910. istreamhd_sources = []
  1911. query = self.search_link % (urllib.quote_plus(title))
  1912. cookie = getUrl(self.login_link, post=self.key_link, output='cookie').result
  1913. result = getUrl(query, cookie=cookie).result
  1914. url = common.parseDOM(result, "div", attrs = { "class": "ui-block.+?" })
  1915. url = [i for i in url if str('tt' + imdb) in i][0]
  1916. url = common.parseDOM(url, "a", ret="href")[0]
  1917. url = '%s%s' % (self.base_link, url)
  1918. url = common.replaceHTMLCodes(url)
  1919. url = url.encode('utf-8')
  1920. result = getUrl(url, cookie=cookie).result
  1921. url = re.compile('/lib/get_embed.php.+?"(.+?)"').findall(result)[0]
  1922. url = self.watch_link % url
  1923. url = common.replaceHTMLCodes(url)
  1924. url = url.encode('utf-8')
  1925. result = getUrl(url, cookie=cookie).result
  1926. url = common.parseDOM(result, "iframe", ret="src", attrs = { "id": "videoFrame" })[0]
  1927. url = common.replaceHTMLCodes(url)
  1928. url = url.replace('http://', 'https://')
  1929. url = url.encode('utf-8')
  1930. result = getUrl(url).result
  1931. try:
  1932. url = re.compile('url720=(.+?)&').findall(result)[0].replace('https://', 'http://')
  1933. istreamhd_sources.append({'source': 'VK', 'quality': 'HD', 'provider': 'iStreamHD', 'url': url})
  1934. except:
  1935. pass
  1936. try:
  1937. url = re.compile('url540=(.+?)&').findall(result)[0].replace('https://', 'http://')
  1938. istreamhd_sources.append({'source': 'VK', 'quality': 'SD', 'provider': 'iStreamHD', 'url': url})
  1939. except:
  1940. pass
  1941. try:
  1942. url = re.compile('url480=(.+?)&').findall(result)[0].replace('https://', 'http://')
  1943. istreamhd_sources.append({'source': 'VK', 'quality': 'SD', 'provider': 'iStreamHD', 'url': url})
  1944. except:
  1945. pass
  1946. except:
  1947. return
  1948. def resolve(self, url):
  1949. return url
  1950. class simplymovies:
  1951. def __init__(self):
  1952. self.base_link = 'http://simplymovies.net'
  1953. self.search_link = 'http://simplymovies.net/index.php?searchTerm='
  1954. def get(self, name, title, imdb, year, hostDict):
  1955. try:
  1956. global simplymovies_sources
  1957. simplymovies_sources = []
  1958. query = self.search_link + urllib.quote_plus(title.replace(' ', '-'))
  1959. result = getUrl(query).result
  1960. url = common.parseDOM(result, "div", attrs = { "class": "movieInfoHolder" })
  1961. try: match = [i for i in url if any(x in self.cleantitle(i) for x in [str('>' + self.cleantitle(title) + '<')]) and any(x in i for x in [', %s<' % str(year), ', %s<' % str(int(year)+1), ', %s<' % str(int(year)-1)])][0]
  1962. except: pass
  1963. try: match = [i for i in url if str('tt' + imdb) in i][0]
  1964. except: pass
  1965. url = common.parseDOM(match, "a", ret="href")[0]
  1966. url = '%s/%s' % (self.base_link, url)
  1967. url = common.replaceHTMLCodes(url)
  1968. url = url.encode('utf-8')
  1969. result = getUrl(url).result
  1970. url = common.parseDOM(result, "iframe", ret="src", attrs = { "class": "videoPlayerIframe" })[0]
  1971. url = common.replaceHTMLCodes(url)
  1972. url = url.replace('http://', 'https://')
  1973. url = url.encode('utf-8')
  1974. result = getUrl(url).result
  1975. try:
  1976. url = re.compile('url720=(.+?)&').findall(result)[0].replace('https://', 'http://')
  1977. simplymovies_sources.append({'source': 'VK', 'quality': 'HD', 'provider': 'Simplymovies', 'url': url})
  1978. except:
  1979. pass
  1980. try:
  1981. url = re.compile('url540=(.+?)&').findall(result)[0].replace('https://', 'http://')
  1982. simplymovies_sources.append({'source': 'VK', 'quality': 'SD', 'provider': 'Simplymovies', 'url': url})
  1983. except:
  1984. pass
  1985. try:
  1986. url = re.compile('url480=(.+?)&').findall(result)[0].replace('https://', 'http://')
  1987. simplymovies_sources.append({'source': 'VK', 'quality': 'SD', 'provider': 'Simplymovies', 'url': url})
  1988. except:
  1989. pass
  1990. except:
  1991. return
  1992. def cleantitle(self, title):
  1993. title = re.sub('\n|([[].+?[]])|([(].+?[)])|\s(vs|v[.])\s|(:|;|-|"|,|\'|\.|\?)|\s', '', title).lower()
  1994. return title
  1995. def resolve(self, url):
  1996. return url
  1997. class muchmovies:
  1998. def __init__(self):
  1999. self.base_link = 'http://www.muchmovies.org'
  2000. self.search_link = 'http://www.muchmovies.org/search'
  2001. def get(self, name, title, imdb, year, hostDict):
  2002. try:
  2003. global muchmovies_sources
  2004. muchmovies_sources = []
  2005. query = self.search_link + '/' + urllib.quote_plus(title.replace(' ', '-'))
  2006. result = getUrl(query, mobile=True).result
  2007. url = common.parseDOM(result, "li", attrs = { "data-icon": "false" })
  2008. url = [i for i in url if any(x in self.cleantitle(i) for x in [str('>' + self.cleantitle(title) + '<')]) and any(x in i for x in [' (%s)' % str(year), ' (%s)' % str(int(year)+1), ' (%s)' % str(int(year)-1)])][0]
  2009. url = common.parseDOM(url, "a", ret="href")[0]
  2010. url = '%s%s' % (self.base_link, url)
  2011. url = common.replaceHTMLCodes(url)
  2012. url = url.encode('utf-8')
  2013. muchmovies_sources.append({'source': 'Muchmovies', 'quality': 'HD', 'provider': 'Muchmovies', 'url': url})
  2014. except:
  2015. return
  2016. def cleantitle(self, title):
  2017. title = re.sub('\n|([[].+?[]])|([(].+?[)])|\s(vs|v[.])\s|(:|;|-|"|,|\'|\.|\?)|\s', '', title).lower()
  2018. return title
  2019. def resolve(self, url):
  2020. try:
  2021. result = getUrl(url, mobile=True).result
  2022. url = common.parseDOM(result, "a", ret="href", attrs = { "data-rel": "popup" })[0]
  2023. return url
  2024. except:
  2025. return
  2026. def check(self, url):
  2027. try:
  2028. start = time.clock()
  2029. request = urllib2.Request(url)
  2030. request.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0')
  2031. response = urllib2.urlopen(request, timeout=10)
  2032. for i in range(0, 26):
  2033. chunk = response.read(16 * 1024)
  2034. end = time.clock() - start
  2035. if end > 3: break
  2036. response.close()
  2037. if end > 3: return
  2038. return url
  2039. except:
  2040. return
  2041. class yify:
  2042. def __init__(self):
  2043. self.base_link = 'http://yify.tv'
  2044. self.ajax_link = 'http://yify.tv/wp-admin/admin-ajax.php'
  2045. self.post_link = 'action=ajaxy_sf&sf_value=%s'
  2046. def get(self, name, title, imdb, year, hostDict):
  2047. try:
  2048. global yify_sources
  2049. yify_sources = []
  2050. query = self.post_link % (urllib.quote_plus(title))
  2051. result = getUrl(self.ajax_link, post=query).result
  2052. result = result.replace('&#8211;','-')
  2053. url = json.loads(result)
  2054. url = url['post']['all']
  2055. url = [i['post_link'] for i in url if any(x == self.cleantitle(i['post_title']) for x in [self.cleantitle(title), self.cleantitle(title)])][0]
  2056. url = common.replaceHTMLCodes(url)
  2057. url = url.encode('utf-8')
  2058. result = getUrl(url).result
  2059. if not str('tt' + imdb) in result: raise Exception()
  2060. yify_sources.append({'source': 'YIFY', 'quality': 'HD', 'provider': 'YIFY', 'url': url})
  2061. except:
  2062. return
  2063. def cleantitle(self, title):
  2064. title = re.sub('\n|([[].+?[]])|([(].+?[)])|\s(vs|v[.])\s|(:|;|-|"|,|\'|\.|\?)|\s', '', title).lower()
  2065. return title
  2066. def resolve(self, url):
  2067. try:
  2068. result = getUrl(url).result
  2069. url = re.compile('showPkPlayer[(]"(.+?)"[)]').findall(result)[0]
  2070. url = 'http://yify.tv/reproductor2/pk/pk/plugins/player_p.php?url=' + url
  2071. result = getUrl(url).result
  2072. url = re.compile('"url":"(.+?)"').findall(result)
  2073. url = [common.replaceHTMLCodes(i) for i in url]
  2074. url = [i for i in url if 'videoplayback?' in i]
  2075. try: url = [i for i in url if not any(x in i for x in ['&itag=43&', '&itag=35&', '&itag=34&', '&itag=5&'])][-1]
  2076. except: url = url[-1]
  2077. url = getUrl(url, output='geturl').result
  2078. if 'requiressl=yes' in url: url = url.replace('http://', 'https://')
  2079. else: url = url.replace('https://', 'http://')
  2080. return url
  2081. except:
  2082. return
  2083. class viooz:
  2084. def __init__(self):
  2085. self.base_link = 'http://viooz.cc'
  2086. self.search_link = 'http://viooz.cc/?s=%s'
  2087. def get(self, name, title, imdb, year, hostDict):
  2088. try:
  2089. global viooz_sources
  2090. viooz_sources = []
  2091. query = self.search_link % (urllib.quote_plus(title))
  2092. result = getUrl(query).result
  2093. url = common.parseDOM(result, "div", attrs = { "class": "list_film_header" })
  2094. url = [i for i in url if any(x in self.cleantitle(i) for x in [str('>' + self.cleantitle(title) + '<')]) and any(x in i for x in [' (%s)' % str(year), ' (%s)' % str(int(year)+1), ' (%s)' % str(int(year)-1)])][0]
  2095. url = common.parseDOM(url, "a", ret="href")[0]
  2096. url = common.replaceHTMLCodes(url)
  2097. url = url.encode('utf-8')
  2098. result = getUrl(url).result
  2099. if not str('tt' + imdb) in result: raise Exception()
  2100. if 'class="movieHD"' in result: quality = 'HD'
  2101. elif 'class="lq_img"' in result: quality = 'CAM'
  2102. else: quality = 'SD'
  2103. viooz_sources.append({'source': 'Viooz', 'quality': quality, 'provider': 'Viooz', 'url': url})
  2104. except:
  2105. return
  2106. def cleantitle(self, title):
  2107. title = re.sub('\n|([[].+?[]])|([(].+?[)])|\s(vs|v[.])\s|(:|;|-|"|,|\'|\.|\?)|\s', '', title).lower()
  2108. return title
  2109. def resolve(self, url):
  2110. try:
  2111. import decrypter
  2112. result = getUrl(url).result
  2113. result = common.parseDOM(result, "div", attrs = { "class": "mbTabsetContainer" })[0]
  2114. url = re.compile('proxy[.]link=embed[*](.+?)&').findall(result)[0]
  2115. url = common.replaceHTMLCodes(url)
  2116. url = decrypter.decrypter(198,128).decrypt(url,base64.urlsafe_b64decode('WTNvNEhqSEdyVFFGbXZmbnF2UG4='),'ECB').split('\0')[0]
  2117. if '/yify.tv/' in url: return yify().resolve(url)
  2118. result = getUrl(url).result
  2119. url = re.compile('"url":"(.+?)"').findall(result)
  2120. url = [common.replaceHTMLCodes(i) for i in url]
  2121. url = [i for i in url if 'videoplayback?' in i]
  2122. try: url = [i for i in url if not any(x in i for x in ['&itag=43&', '&itag=35&', '&itag=34&', '&itag=5&'])][-1]
  2123. except: url = url[-1]
  2124. url = getUrl(url, output='geturl').result
  2125. if 'requiressl=yes' in url: url = url.replace('http://', 'https://')
  2126. else: url = url.replace('https://', 'http://')
  2127. return url
  2128. except:
  2129. return
  2130. class moviestorm:
  2131. def __init__(self):
  2132. self.base_link = 'http://moviestorm.eu'
  2133. self.search_link = 'http://moviestorm.eu/search?q=%s'
  2134. def get(self, name, title, imdb, year, hostDict):
  2135. try:
  2136. global moviestorm_sources
  2137. moviestorm_sources = []
  2138. query = self.search_link % (urllib.quote_plus(title))
  2139. result = getUrl(query).result
  2140. url = common.parseDOM(result, "div", attrs = { "class": "movie_box" })
  2141. url = [i for i in url if str('tt' + imdb) in i][0]
  2142. url = common.parseDOM(url, "a", ret="href")[0]
  2143. url = common.replaceHTMLCodes(url)
  2144. url = url.encode('utf-8')
  2145. result = getUrl(url).result
  2146. result = common.parseDOM(result, "div", attrs = { "class": "links" })[0]
  2147. links = common.parseDOM(result, "tr")
  2148. links = [i for i in links if 'http://ishared.eu/' in i]
  2149. sd_links = [re.compile('"(http://ishared.eu/.+?)"').findall(i)[0] for i in links if not any(x in common.parseDOM(i, "td", attrs = { "class": "quality_td" })[0] for x in ['CAM', 'TS'])]
  2150. ts_links = [re.compile('"(http://ishared.eu/.+?)"').findall(i)[0] for i in links if any(x in common.parseDOM(i, "td", attrs = { "class": "quality_td" })[0] for x in ['CAM', 'TS'])]
  2151. if (len(sd_links) == 1):
  2152. moviestorm_sources.append({'source': 'iShared', 'quality': 'SD', 'provider': 'Moviestorm', 'url': sd_links[0]})
  2153. if (len(ts_links) == 1):
  2154. moviestorm_sources.append({'source': 'iShared', 'quality': 'CAM', 'provider': 'Moviestorm', 'url': ts_links[0]})
  2155. except:
  2156. return
  2157. def resolve(self, url):
  2158. try:
  2159. result = getUrl(url).result
  2160. url = re.compile('path:"(.+?)"').findall(result)[0]
  2161. return url
  2162. except:
  2163. return
  2164. class noobroom:
  2165. def __init__(self):
  2166. self.base_link = 'http://noobroom5.com'
  2167. self.search_link = 'http://noobroom5.com/search.php?q=%s'
  2168. self.login_link = 'http://noobroom5.com/login.php'
  2169. self.login2_link = 'http://noobroom5.com/login2.php'
  2170. self.mail, self.password = getSetting("noobroom_mail"), getSetting("noobroom_password")
  2171. def get(self, name, title, imdb, year, hostDict):
  2172. try:
  2173. global noobroom_sources
  2174. noobroom_sources = []
  2175. query = self.search_link % (urllib.quote_plus(title))
  2176. if (self.mail == '' or self.password == ''): raise Exception()
  2177. post = urllib.urlencode({'email': self.mail, 'password': self.password})
  2178. result = getUrl(self.login_link, close=False).result
  2179. result = urllib2.Request(self.login2_link, post)
  2180. result = urllib2.urlopen(result, timeout=10)
  2181. result = getUrl(query).result
  2182. url = re.compile('(<i>Movies</i>.+)').findall(result)[0]
  2183. url = url.split("'tippable'")
  2184. url = [i for i in url if any(x in self.cleantitle(i) for x in [str('>' + self.cleantitle(title) + '<')]) and any(x in i for x in [' (%s)' % str(year), ' (%s)' % str(int(year)+1), ' (%s)' % str(int(year)-1)])][0]
  2185. url = re.compile("href='(.+?)'").findall(url)[0]
  2186. url = '%s%s' % (self.base_link, url)
  2187. url = common.replaceHTMLCodes(url)
  2188. url = url.encode('utf-8')
  2189. result = getUrl(url).result
  2190. if not str('tt' + imdb) in result: raise Exception()
  2191. url = re.compile('"file": "(.+?)"').findall(result)[0]
  2192. url = '%s%s' % (self.base_link, url)
  2193. url = common.replaceHTMLCodes(url)
  2194. url = url.encode('utf-8')
  2195. try:
  2196. quality = 'SD'
  2197. q = re.compile('"width": "(.+?)"').findall(result)[0]
  2198. if int(q) > 720: quality = 'HD'
  2199. except:
  2200. pass
  2201. noobroom_sources.append({'source': 'Noobroom', 'quality': quality, 'provider': 'Noobroom', 'url': url})
  2202. except:
  2203. return
  2204. def cleantitle(self, title):
  2205. title = re.sub('\n|([[].+?[]])|([(].+?[)])|\s(vs|v[.])\s|(:|;|-|"|,|\'|\.|\?)|\s', '', title).lower()
  2206. return title
  2207. def resolve(self, url):
  2208. try:
  2209. url = getUrl(url, output='geturl').result
  2210. return url
  2211. except:
  2212. return
  2213. class merdb:
  2214. def __init__(self):
  2215. self.base_link = 'http://www.merdb.cn'
  2216. self.search_link = 'http://www.merdb.cn/?search=%s'
  2217. def get(self, name, title, imdb, year, hostDict):
  2218. try:
  2219. global merdb_sources
  2220. merdb_sources = []
  2221. query = self.search_link % (urllib.quote_plus(re.sub('\'', '', title)))
  2222. result = getUrl(query).result
  2223. result = result.decode('iso-8859-1').encode('utf-8')
  2224. result = common.parseDOM(result, "div", attrs = { "class": "list_box_title" })
  2225. match = [i for i in result if any(x == self.cleantitle(re.compile('title="Watch (.+?)"').findall(i)[0]) for x in [self.cleantitle(title), self.cleantitle(title)])]
  2226. match2 = [i for i in match if any(x in re.compile('title="Watch (.+?)"').findall(i)[0] for x in ['(%s)' % str(year), '(%s)' % str(int(year)+1), '(%s)' % str(int(year)-1)])][0]
  2227. url = common.parseDOM(match2, "a", ret="href")[0]
  2228. url = '%s/%s' % (self.base_link, url)
  2229. url = common.replaceHTMLCodes(url)
  2230. url = url.encode('utf-8')
  2231. result = getUrl(url).result
  2232. result = result.decode('iso-8859-1').encode('utf-8')
  2233. result = result.replace('\n','')
  2234. links = re.compile('(<span class=quality_.+?<a href="/external.php.+?".+?</script>)').findall(result)
  2235. for host in hostDict:
  2236. try:
  2237. links_match = [i for i in links if "document.writeln('%s." % host.lower() in i]
  2238. for i in links_match:
  2239. url = common.parseDOM(i, "a", ret="href")[0]
  2240. url = '%s%s' % (self.base_link, url)
  2241. url = common.replaceHTMLCodes(url)
  2242. url = url.encode('utf-8')
  2243. quality = common.parseDOM(i, "span", ret="class")[0]
  2244. quality = common.replaceHTMLCodes(quality)
  2245. if quality == 'quality_cam' or quality == 'quality_ts': quality = 'CAM'
  2246. else: quality = 'SD'
  2247. merdb_sources.append({'source': host, 'quality': quality, 'provider': 'MerDB', 'url': url})
  2248. except:
  2249. pass
  2250. except:
  2251. return
  2252. def cleantitle(self, title):
  2253. title = re.sub('\n|([[].+?[]])|([(].+?[)])|\s(vs|v[.])\s|(:|;|-|"|,|\'|\.|\?)|\s', '', title).lower()
  2254. return title
  2255. def resolve(self, url):
  2256. try:
  2257. result = getUrl(url).result
  2258. result = result.decode('iso-8859-1').encode('utf-8')
  2259. url = common.parseDOM(result, "frame", ret="src", attrs = { "id": "play_bottom" })[0]
  2260. url = common.replaceHTMLCodes(url)
  2261. url = url.encode('utf-8')
  2262. import urlresolver
  2263. host = urlresolver.HostedMediaFile(url)
  2264. if host: resolver = urlresolver.resolve(url)
  2265. if not resolver.startswith('http://'): return
  2266. if not resolver == url: return resolver
  2267. except:
  2268. return
  2269. main()