PageRenderTime 70ms CodeModel.GetById 22ms RepoModel.GetById 0ms app.codeStats 1ms

/plugin.video.football.today/default.py

https://github.com/pudis1977/lambda-xbmc-addons
Python | 928 lines | 900 code | 10 blank | 18 comment | 43 complexity | 723d73a21277795bdf2f6ef1a89d598c MD5 | raw file
Possible License(s): GPL-3.0
  1. # -*- coding: utf-8 -*-
  2. '''
  3. Football Today 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. action = None
  25. common = CommonFunctions
  26. language = xbmcaddon.Addon().getLocalizedString
  27. setSetting = xbmcaddon.Addon().setSetting
  28. getSetting = xbmcaddon.Addon().getSetting
  29. addonName = xbmcaddon.Addon().getAddonInfo("name")
  30. addonVersion = xbmcaddon.Addon().getAddonInfo("version")
  31. addonId = xbmcaddon.Addon().getAddonInfo("id")
  32. addonPath = xbmcaddon.Addon().getAddonInfo("path")
  33. addonFullId = addonName + addonVersion
  34. addonDesc = language(30450).encode("utf-8")
  35. cache = StorageServer.StorageServer(addonFullId,1).cacheFunction
  36. cache2 = StorageServer.StorageServer(addonFullId,24).cacheFunction
  37. cache3 = StorageServer.StorageServer(addonFullId,720).cacheFunction
  38. addonIcon = os.path.join(addonPath,'icon.png')
  39. addonFanart = os.path.join(addonPath,'fanart.jpg')
  40. addonArt = os.path.join(addonPath,'resources/art')
  41. addonNext = os.path.join(addonPath,'resources/art/Next.png')
  42. dataPath = xbmc.translatePath('special://profile/addon_data/%s' % (addonId))
  43. viewData = os.path.join(dataPath,'views.cfg')
  44. class main:
  45. def __init__(self):
  46. global action
  47. index().container_data()
  48. params = {}
  49. splitparams = sys.argv[2][sys.argv[2].find('?') + 1:].split('&')
  50. for param in splitparams:
  51. if (len(param) > 0):
  52. splitparam = param.split('=')
  53. key = splitparam[0]
  54. try: value = splitparam[1].encode("utf-8")
  55. except: value = splitparam[1]
  56. params[key] = value
  57. try: action = urllib.unquote_plus(params["action"])
  58. except: action = None
  59. try: name = urllib.unquote_plus(params["name"])
  60. except: name = None
  61. try: url = urllib.unquote_plus(params["url"])
  62. except: url = None
  63. try: image = urllib.unquote_plus(params["image"])
  64. except: image = None
  65. try: date = urllib.unquote_plus(params["date"])
  66. except: date = None
  67. try: genre = urllib.unquote_plus(params["genre"])
  68. except: genre = None
  69. try: plot = urllib.unquote_plus(params["plot"])
  70. except: plot = None
  71. try: title = urllib.unquote_plus(params["title"])
  72. except: title = None
  73. try: show = urllib.unquote_plus(params["show"])
  74. except: show = None
  75. try: query = urllib.unquote_plus(params["query"])
  76. except: query = None
  77. if action == None: root().get()
  78. elif action == 'item_play': contextMenu().item_play()
  79. elif action == 'item_random_play': contextMenu().item_random_play()
  80. elif action == 'item_queue': contextMenu().item_queue()
  81. elif action == 'item_play_from_here': contextMenu().item_play_from_here(url)
  82. elif action == 'playlist_open': contextMenu().playlist_open()
  83. elif action == 'settings_open': contextMenu().settings_open()
  84. elif action == 'addon_home': contextMenu().addon_home()
  85. elif action == 'view_videos': contextMenu().view('videos')
  86. elif action == 'videos': videos().get(url)
  87. elif action == 'videos_games': videos().root('games')
  88. elif action == 'videos_premierleague': videos().root('premierleague')
  89. elif action == 'videos_laliga': videos().root('laliga')
  90. elif action == 'videos_bundesliga': videos().root('bundesliga')
  91. elif action == 'videos_seriea': videos().root('seriea')
  92. elif action == 'videos_ligue1': videos().root('ligue1')
  93. elif action == 'videos_eredivisie': videos().root('eredivisie')
  94. elif action == 'videos_primeiraliga': videos().root('primeiraliga')
  95. elif action == 'videos_uefachampionleague': videos().root('uefachampionleague')
  96. elif action == 'videos_uefaeuropaleague': videos().root('uefaeuropaleague')
  97. elif action == 'videos_copalibertadores': videos().root('copalibertadores')
  98. elif action == 'videos_highlights': videos().root2('highlights')
  99. elif action == 'videos_search': videos().search(query)
  100. elif action == 'videos_parts': videoparts().get(name, url, image, date, genre, plot, title, show)
  101. elif action == 'play': resolver().run(url)
  102. if action is None:
  103. pass
  104. elif action.startswith('videos'):
  105. xbmcplugin.setContent(int(sys.argv[1]), 'episodes')
  106. index().container_view('videos', {'skin.confluence' : 504})
  107. xbmcplugin.setPluginFanart(int(sys.argv[1]), addonFanart)
  108. xbmcplugin.endOfDirectory(int(sys.argv[1]))
  109. return
  110. class getUrl(object):
  111. def __init__(self, url, close=True, proxy=None, post=None, mobile=False, referer=None, cookie=None, output='', timeout='10'):
  112. if not proxy is None:
  113. proxy_handler = urllib2.ProxyHandler({'http':'%s' % (proxy)})
  114. opener = urllib2.build_opener(proxy_handler, urllib2.HTTPHandler)
  115. opener = urllib2.install_opener(opener)
  116. if output == 'cookie' or not close == True:
  117. import cookielib
  118. cookie_handler = urllib2.HTTPCookieProcessor(cookielib.LWPCookieJar())
  119. opener = urllib2.build_opener(cookie_handler, urllib2.HTTPBasicAuthHandler(), urllib2.HTTPHandler())
  120. opener = urllib2.install_opener(opener)
  121. if not post is None:
  122. request = urllib2.Request(url, post)
  123. else:
  124. request = urllib2.Request(url,None)
  125. if mobile == True:
  126. 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')
  127. else:
  128. request.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0')
  129. if not referer is None:
  130. request.add_header('Referer', referer)
  131. if not cookie is None:
  132. request.add_header('cookie', cookie)
  133. response = urllib2.urlopen(request, timeout=int(timeout))
  134. if output == 'cookie':
  135. result = str(response.headers.get('Set-Cookie'))
  136. elif output == 'geturl':
  137. result = response.geturl()
  138. else:
  139. result = response.read()
  140. if close == True:
  141. response.close()
  142. self.result = result
  143. class uniqueList(object):
  144. def __init__(self, list):
  145. uniqueSet = set()
  146. uniqueList = []
  147. for n in list:
  148. if n not in uniqueSet:
  149. uniqueSet.add(n)
  150. uniqueList.append(n)
  151. self.list = uniqueList
  152. class Thread(threading.Thread):
  153. def __init__(self, target, *args):
  154. self._target = target
  155. self._args = args
  156. threading.Thread.__init__(self)
  157. def run(self):
  158. self._target(*self._args)
  159. class player(xbmc.Player):
  160. def __init__ (self):
  161. xbmc.Player.__init__(self)
  162. def run(self, url):
  163. item = xbmcgui.ListItem(path=url)
  164. xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, item)
  165. def onPlayBackStarted(self):
  166. return
  167. def onPlayBackEnded(self):
  168. return
  169. def onPlayBackStopped(self):
  170. return
  171. class index:
  172. def infoDialog(self, str, header=addonName):
  173. try: xbmcgui.Dialog().notification(header, str, addonIcon, 3000, sound=False)
  174. except: xbmc.executebuiltin("Notification(%s,%s, 3000, %s)" % (header, str, addonIcon))
  175. def okDialog(self, str1, str2, header=addonName):
  176. xbmcgui.Dialog().ok(header, str1, str2)
  177. def selectDialog(self, list, header=addonName):
  178. select = xbmcgui.Dialog().select(header, list)
  179. return select
  180. def yesnoDialog(self, str1, str2, header=addonName, str3='', str4=''):
  181. answer = xbmcgui.Dialog().yesno(header, str1, str2, '', str4, str3)
  182. return answer
  183. def getProperty(self, str):
  184. property = xbmcgui.Window(10000).getProperty(str)
  185. return property
  186. def setProperty(self, str1, str2):
  187. xbmcgui.Window(10000).setProperty(str1, str2)
  188. def clearProperty(self, str):
  189. xbmcgui.Window(10000).clearProperty(str)
  190. def addon_status(self, id):
  191. check = xbmcaddon.Addon(id=id).getAddonInfo("name")
  192. if not check == addonName: return True
  193. def container_refresh(self):
  194. xbmc.executebuiltin("Container.Refresh")
  195. def container_data(self):
  196. if not xbmcvfs.exists(dataPath):
  197. xbmcvfs.mkdir(dataPath)
  198. if not xbmcvfs.exists(viewData):
  199. file = xbmcvfs.File(viewData, 'w')
  200. file.write('')
  201. file.close()
  202. def container_view(self, content, viewDict):
  203. try:
  204. skin = xbmc.getSkinDir()
  205. file = xbmcvfs.File(viewData)
  206. read = file.read().replace('\n','')
  207. file.close()
  208. view = re.compile('"%s"[|]"%s"[|]"(.+?)"' % (skin, content)).findall(read)[0]
  209. xbmc.executebuiltin('Container.SetViewMode(%s)' % str(view))
  210. except:
  211. try:
  212. id = str(viewDict[skin])
  213. xbmc.executebuiltin('Container.SetViewMode(%s)' % id)
  214. except:
  215. pass
  216. def rootList(self, rootList):
  217. total = len(rootList)
  218. for i in rootList:
  219. try:
  220. name = language(i['name']).encode("utf-8")
  221. image = '%s/%s' % (addonArt, i['image'])
  222. action = i['action']
  223. u = '%s?action=%s' % (sys.argv[0], action)
  224. cm = []
  225. item = xbmcgui.ListItem(name, iconImage="DefaultFolder.png", thumbnailImage=image)
  226. item.setInfo( type="Video", infoLabels={ "Label": name, "Title": name, "Plot": addonDesc } )
  227. item.setProperty("Fanart_Image", addonFanart)
  228. item.addContextMenuItems(cm, replaceItems=False)
  229. xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=item,totalItems=total,isFolder=True)
  230. except:
  231. pass
  232. def nextList(self, nextList):
  233. try: next = nextList[0]['next']
  234. except: return
  235. if next == '': return
  236. name, url, image = language(30361).encode("utf-8"), next, addonNext
  237. sysurl = urllib.quote_plus(url)
  238. u = '%s?action=videos&url=%s' % (sys.argv[0], sysurl)
  239. item = xbmcgui.ListItem(name, iconImage="DefaultFolder.png", thumbnailImage=image)
  240. item.setInfo( type="Video", infoLabels={ "Label": name, "Title": name, "Plot": addonDesc } )
  241. item.setProperty("Fanart_Image", addonFanart)
  242. item.addContextMenuItems([], replaceItems=False)
  243. xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=item,isFolder=True)
  244. def videoList(self, videoList):
  245. if videoList == None: return
  246. total = len(videoList)
  247. for i in videoList:
  248. try:
  249. name, url, image, date, genre, plot, title, show = i['name'], i['url'], i['image'], i['date'], i['genre'], i['plot'], i['title'], i['show']
  250. if show == '': show = addonName
  251. if image == '': image = addonFanart
  252. if plot == '': plot = addonDesc
  253. if genre == '': genre = ' '
  254. if date == '': date = ' '
  255. sysname, sysurl, sysimage, sysdate, sysgenre, sysplot, systitle, sysshow = urllib.quote_plus(name), urllib.quote_plus(url), urllib.quote_plus(image), urllib.quote_plus(date), urllib.quote_plus(genre), urllib.quote_plus(plot), urllib.quote_plus(title), urllib.quote_plus(show)
  256. u = '%s?action=videos_parts&name=%s&url=%s&image=%s&date=%s&genre=%s&plot=%s&title=%s&show=%s' % (sys.argv[0], sysname, sysurl, sysimage, sysdate, sysgenre, sysplot, systitle, sysshow)
  257. meta = {'label': title, 'title': title, 'studio': show, 'premiered': date, 'genre': genre, 'plot': plot}
  258. cm = []
  259. cm.append((language(30401).encode("utf-8"), 'RunPlugin(%s?action=item_play)' % (sys.argv[0])))
  260. cm.append((language(30404).encode("utf-8"), 'RunPlugin(%s?action=item_queue)' % (sys.argv[0])))
  261. cm.append((language(30410).encode("utf-8"), 'RunPlugin(%s?action=view_videos)' % (sys.argv[0])))
  262. cm.append((language(30407).encode("utf-8"), 'RunPlugin(%s?action=settings_open)' % (sys.argv[0])))
  263. cm.append((language(30408).encode("utf-8"), 'RunPlugin(%s?action=playlist_open)' % (sys.argv[0])))
  264. cm.append((language(30409).encode("utf-8"), 'RunPlugin(%s?action=addon_home)' % (sys.argv[0])))
  265. item = xbmcgui.ListItem(name, iconImage="DefaultVideo.png", thumbnailImage=image)
  266. item.setInfo( type="Video", infoLabels = meta )
  267. item.setProperty("IsPlayable", "true")
  268. item.setProperty("Video", "true")
  269. item.setProperty("Fanart_Image", addonFanart)
  270. item.addContextMenuItems(cm, replaceItems=True)
  271. xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=item,totalItems=total,isFolder=True)
  272. except:
  273. pass
  274. def videopartList(self, videopartList):
  275. if videopartList == None: return
  276. total = len(videopartList)
  277. for i in videopartList:
  278. try:
  279. name, url, image, date, genre, plot, title, show = i['name'], i['url'], i['image'], i['date'], i['genre'], i['plot'], i['title'], i['show']
  280. if show == '': show = addonName
  281. if image == '': image = addonFanart
  282. if plot == '': plot = addonDesc
  283. if genre == '': genre = ' '
  284. if date == '': date = ' '
  285. sysurl = urllib.quote_plus(url)
  286. u = '%s?action=play&url=%s' % (sys.argv[0], sysurl)
  287. meta = {'label': title, 'title': title, 'studio': show, 'premiered': date, 'genre': genre, 'plot': plot}
  288. cm = []
  289. cm.append((language(30405).encode("utf-8"), 'RunPlugin(%s?action=item_queue)' % (sys.argv[0])))
  290. cm.append((language(30403).encode("utf-8"), 'RunPlugin(%s?action=item_play_from_here&url=%s)' % (sys.argv[0], sysurl)))
  291. cm.append((language(30410).encode("utf-8"), 'RunPlugin(%s?action=view_videos)' % (sys.argv[0])))
  292. cm.append((language(30407).encode("utf-8"), 'RunPlugin(%s?action=settings_open)' % (sys.argv[0])))
  293. cm.append((language(30408).encode("utf-8"), 'RunPlugin(%s?action=playlist_open)' % (sys.argv[0])))
  294. cm.append((language(30409).encode("utf-8"), 'RunPlugin(%s?action=addon_home)' % (sys.argv[0])))
  295. item = xbmcgui.ListItem(name, iconImage="DefaultVideo.png", thumbnailImage=image)
  296. item.setInfo( type="Video", infoLabels = meta )
  297. item.setProperty("IsPlayable", "true")
  298. item.setProperty("Video", "true")
  299. item.setProperty("Fanart_Image", addonFanart)
  300. item.addContextMenuItems(cm, replaceItems=True)
  301. xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=item,totalItems=total,isFolder=False)
  302. except:
  303. pass
  304. class contextMenu:
  305. def item_play(self):
  306. playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO)
  307. playlist.clear()
  308. xbmc.executebuiltin('Action(Queue)')
  309. playlist.unshuffle()
  310. xbmc.Player().play(playlist)
  311. def item_random_play(self):
  312. playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO)
  313. playlist.clear()
  314. xbmc.executebuiltin('Action(Queue)')
  315. playlist.shuffle()
  316. xbmc.Player().play(playlist)
  317. def item_queue(self):
  318. xbmc.executebuiltin('Action(Queue)')
  319. def item_play_from_here(self, url):
  320. playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO)
  321. playlist.clear()
  322. playlist.unshuffle()
  323. total = xbmc.getInfoLabel('Container.NumItems')
  324. for i in range(0, int(total)):
  325. i = str(i)
  326. label = xbmc.getInfoLabel('ListItemNoWrap(%s).Label' % i)
  327. if label == '': break
  328. params = {}
  329. path = xbmc.getInfoLabel('ListItemNoWrap(%s).FileNameAndPath' % i)
  330. path = urllib.quote_plus(path).replace('+%26+', '+&+')
  331. query = path.split('%3F', 1)[-1].split('%26')
  332. for i in query: params[urllib.unquote_plus(i).split('=')[0]] = urllib.unquote_plus(i).split('=')[1]
  333. u = '%s?action=play&url=%s' % (sys.argv[0], params["url"])
  334. meta = {'title': xbmc.getInfoLabel('ListItemNoWrap(%s).title' % i), 'studio': xbmc.getInfoLabel('ListItemNoWrap(%s).studio' % i), 'writer': xbmc.getInfoLabel('ListItemNoWrap(%s).writer' % i), 'director': xbmc.getInfoLabel('ListItemNoWrap(%s).director' % i), 'rating': xbmc.getInfoLabel('ListItemNoWrap(%s).rating' % i), 'duration': xbmc.getInfoLabel('ListItemNoWrap(%s).duration' % i), 'premiered': xbmc.getInfoLabel('ListItemNoWrap(%s).premiered' % i), 'plot': xbmc.getInfoLabel('ListItemNoWrap(%s).plot' % i)}
  335. poster, fanart = xbmc.getInfoLabel('ListItemNoWrap(%s).icon' % i), xbmc.getInfoLabel('ListItemNoWrap(%s).Property(Fanart_Image)' % i)
  336. item = xbmcgui.ListItem(label, iconImage="DefaultVideo.png", thumbnailImage=poster)
  337. item.setInfo( type="Video", infoLabels= meta )
  338. item.setProperty("IsPlayable", "true")
  339. item.setProperty("Video", "true")
  340. item.setProperty("Fanart_Image", fanart)
  341. playlist.add(u, item)
  342. xbmc.Player().play(playlist)
  343. def playlist_open(self):
  344. xbmc.executebuiltin('ActivateWindow(VideoPlaylist)')
  345. def settings_open(self):
  346. xbmc.executebuiltin('Addon.OpenSettings(%s)' % (addonId))
  347. def addon_home(self):
  348. xbmc.executebuiltin('Container.Update(plugin://%s/,replace)' % (addonId))
  349. def view(self, content):
  350. try:
  351. skin = xbmc.getSkinDir()
  352. skinPath = xbmc.translatePath('special://skin/')
  353. xml = os.path.join(skinPath,'addon.xml')
  354. file = xbmcvfs.File(xml)
  355. read = file.read().replace('\n','')
  356. file.close()
  357. try: src = re.compile('defaultresolution="(.+?)"').findall(read)[0]
  358. except: src = re.compile('<res.+?folder="(.+?)"').findall(read)[0]
  359. src = os.path.join(skinPath, src)
  360. src = os.path.join(src, 'MyVideoNav.xml')
  361. file = xbmcvfs.File(src)
  362. read = file.read().replace('\n','')
  363. file.close()
  364. views = re.compile('<views>(.+?)</views>').findall(read)[0]
  365. views = [int(x) for x in views.split(',')]
  366. for view in views:
  367. label = xbmc.getInfoLabel('Control.GetLabel(%s)' % (view))
  368. if not (label == '' or label is None): break
  369. file = xbmcvfs.File(viewData)
  370. read = file.read()
  371. file.close()
  372. file = open(viewData, 'w')
  373. for line in re.compile('(".+?\n)').findall(read):
  374. if not line.startswith('"%s"|"%s"|"' % (skin, content)): file.write(line)
  375. file.write('"%s"|"%s"|"%s"\n' % (skin, content, str(view)))
  376. file.close()
  377. viewName = xbmc.getInfoLabel('Container.Viewmode')
  378. index().infoDialog('%s%s%s' % (language(30301).encode("utf-8"), viewName, language(30302).encode("utf-8")))
  379. except:
  380. return
  381. class root:
  382. def get(self):
  383. rootList = []
  384. rootList.append({'name': 30501, 'image': 'Games.png', 'action': 'videos_games'})
  385. rootList.append({'name': 30502, 'image': 'Highlights.png', 'action': 'videos_highlights'})
  386. rootList.append({'name': 30503, 'image': 'Search.png', 'action': 'videos_search'})
  387. rootList.append({'name': 30504, 'image': 'Premier League.png', 'action': 'videos_premierleague'})
  388. rootList.append({'name': 30505, 'image': 'La Liga.png', 'action': 'videos_laliga'})
  389. rootList.append({'name': 30506, 'image': 'Bundesliga.png', 'action': 'videos_bundesliga'})
  390. rootList.append({'name': 30507, 'image': 'Serie A.png', 'action': 'videos_seriea'})
  391. rootList.append({'name': 30508, 'image': 'Ligue 1.png', 'action': 'videos_ligue1'})
  392. rootList.append({'name': 30509, 'image': 'Eredivisie.png', 'action': 'videos_eredivisie'})
  393. rootList.append({'name': 30510, 'image': 'Primeira Liga.png', 'action': 'videos_primeiraliga'})
  394. rootList.append({'name': 30511, 'image': 'UEFA Champions League.png', 'action': 'videos_uefachampionleague'})
  395. rootList.append({'name': 30512, 'image': 'UEFA Europa League.png', 'action': 'videos_uefaeuropaleague'})
  396. rootList.append({'name': 30513, 'image': 'Copa Libertadores.png', 'action': 'videos_copalibertadores'})
  397. index().rootList(rootList)
  398. class link:
  399. def __init__(self):
  400. self.lfv_base = 'http://livefootballvideo.com'
  401. self.lfv_search = 'http://www.google.com/cse?cx=partner-pub-9069051203647610:8413886168&sa=Search&ie=UTF-8&nojs=1&ref=livefootballvideo.com/&q=%s'
  402. self.lfv_games = 'http://livefootballvideo.com/fullmatch'
  403. self.lfv_highlights = 'http://livefootballvideo.com/highlights'
  404. self.lfv_premierleague = 'http://livefootballvideo.com/competitions/premier-league'
  405. self.lfv_laliga = 'http://livefootballvideo.com/competitions/la-liga'
  406. self.lfv_bundesliga = 'http://livefootballvideo.com/competitions/bundesliga'
  407. self.lfv_seriea = 'http://livefootballvideo.com/competitions/serie-a'
  408. self.lfv_ligue1 = 'http://livefootballvideo.com/competitions/ligue-1'
  409. self.lfv_eredivisie = 'http://livefootballvideo.com/competitions/eredivisie'
  410. self.lfv_primeiraliga = 'http://livefootballvideo.com/competitions/primeira-liga'
  411. self.lfv_uefachampionleague = 'http://livefootballvideo.com/competitions/uefa-champions-league'
  412. self.lfv_uefaeuropaleague = 'http://livefootballvideo.com/competitions/uefa-europa-league'
  413. self.lfv_copalibertadores = 'http://livefootballvideo.com/competitions/copa-libertadores'
  414. class videos:
  415. def __init__(self):
  416. self.list = []
  417. def root(self, url):
  418. if url == 'games': url = link().lfv_games
  419. elif url == 'premierleague': url = link().lfv_premierleague
  420. elif url == 'laliga': url = link().lfv_laliga
  421. elif url == 'bundesliga': url = link().lfv_bundesliga
  422. elif url == 'seriea': url = link().lfv_seriea
  423. elif url == 'ligue1': url = link().lfv_ligue1
  424. elif url == 'eredivisie': url = link().lfv_eredivisie
  425. elif url == 'primeiraliga': url = link().lfv_primeiraliga
  426. elif url == 'uefachampionleague': url = link().lfv_uefachampionleague
  427. elif url == 'uefaeuropaleague': url = link().lfv_uefaeuropaleague
  428. elif url == 'copalibertadores': url = link().lfv_copalibertadores
  429. self.list = self.lfv_list(url)
  430. #self.list = cache(self.lfv_list, url)
  431. index().videoList(self.list)
  432. index().nextList(self.list)
  433. def root2(self, url):
  434. if url == 'highlights': url = link().lfv_highlights
  435. self.list = self.lfv_list2(url)
  436. #self.list = cache(self.lfv_list2, url)
  437. index().videoList(self.list)
  438. index().nextList(self.list)
  439. def get(self, url):
  440. if '/highlights/' in url:
  441. #self.list = self.lfv_list2(url)
  442. self.list = cache(self.lfv_list2, url)
  443. else:
  444. #self.list = self.lfv_list(url)
  445. self.list = cache(self.lfv_list, url)
  446. index().videoList(self.list)
  447. index().nextList(self.list)
  448. def search(self, query=None):
  449. if query is None:
  450. self.query = common.getUserInput(language(30362).encode("utf-8"), '')
  451. else:
  452. self.query = query
  453. if not (self.query is None or self.query == ''):
  454. self.query = link().lfv_search % urllib.quote_plus(self.query)
  455. self.list = self.lfv_list3(self.query)
  456. index().videoList(self.list)
  457. def lfv_list(self, url):
  458. try:
  459. result = getUrl(url, timeout='30').result
  460. result = re.sub('<li\s.+?>','<li>', result)
  461. videos = common.parseDOM(result, "li")
  462. except:
  463. return
  464. try:
  465. next = common.parseDOM(result, "div", attrs = { "class": "wp-pagenavi" })
  466. if len(next) > 1: next = next[1]
  467. else: next = next[0]
  468. next = common.parseDOM(next, "a", ret="href", attrs = { "class": "nextpostslink" })[0]
  469. next = common.replaceHTMLCodes(next)
  470. next = next.encode('utf-8')
  471. except:
  472. next = ''
  473. for video in videos:
  474. try:
  475. title = common.parseDOM(video, "a", ret="title")[0]
  476. title = common.replaceHTMLCodes(title)
  477. title = title.encode('utf-8')
  478. date = common.parseDOM(video, "p")[-1]
  479. date = re.findall('(\d+)[/](\d+)[/](\d+)', date, re.I)[0]
  480. date = '%s-%s-%s' % ('%04d' % int(date[2]), '%02d' % int(date[0]), '%02d' % int(date[1]))
  481. name = '%s (%s)' % (title, date)
  482. name = common.replaceHTMLCodes(name)
  483. name = name.encode('utf-8')
  484. url = common.parseDOM(video, "a", ret="href")[0]
  485. url = common.replaceHTMLCodes(url)
  486. url = url.encode('utf-8')
  487. image = common.parseDOM(video, "img", ret="src")[0]
  488. image = common.replaceHTMLCodes(image)
  489. image = image.encode('utf-8')
  490. self.list.append({'name': name, 'url': url, 'image': image, 'date': date, 'genre': 'Sports', 'plot': '', 'title': title, 'show': '', 'next': next})
  491. except:
  492. pass
  493. return self.list
  494. def lfv_list2(self, url):
  495. try:
  496. result = getUrl(url, timeout='30').result
  497. result = re.sub('<li\s.+?>','<li>', result)
  498. videos = common.parseDOM(result, "li")
  499. except:
  500. return
  501. try:
  502. next = common.parseDOM(result, "div", attrs = { "class": "wp-pagenavi" })
  503. if len(next) > 1: next = next[1]
  504. else: next = next[0]
  505. next = common.parseDOM(next, "a", ret="href", attrs = { "class": "nextpostslink" })[0]
  506. next = common.replaceHTMLCodes(next)
  507. next = next.encode('utf-8')
  508. except:
  509. next = ''
  510. for video in videos:
  511. try:
  512. home = common.parseDOM(video, "div", attrs = { "class": "team.+?" })[0]
  513. home = home.split("&nbsp;")[0]
  514. away = common.parseDOM(video, "div", attrs = { "class": "team.+?" })[-1]
  515. away = away.split("&nbsp;")[-1]
  516. title = '%s vs %s' % (home, away)
  517. title = common.replaceHTMLCodes(title)
  518. title = title.encode('utf-8')
  519. date = common.parseDOM(video, "span", attrs = { "class": "starttime.+?" })[0]
  520. date = common.replaceHTMLCodes(date)
  521. date = date.encode('utf-8')
  522. name = '%s (%s)' % (title, date)
  523. name = common.replaceHTMLCodes(name)
  524. name = name.encode('utf-8')
  525. url = common.parseDOM(video, "a", ret="href", attrs = { "class": "playvideo" })[0]
  526. url = common.replaceHTMLCodes(url)
  527. url = url.encode('utf-8')
  528. self.list.append({'name': name, 'url': url, 'image': '', 'date': date, 'genre': 'Sports', 'plot': '', 'title': title, 'show': '', 'next': next})
  529. except:
  530. pass
  531. return self.list
  532. def lfv_list3(self, url):
  533. try:
  534. result = getUrl(url, timeout='30').result
  535. videos = common.parseDOM(result, "h2")
  536. except:
  537. return
  538. for video in videos:
  539. try:
  540. name = common.parseDOM(video, "a")[0]
  541. name = common.replaceHTMLCodes(name)
  542. name = re.sub('<b>|</b>|&\sAll\sGoals|\sDownload', '', name).strip()
  543. name = re.sub('\s\d+\s-\s\d+\s', ' vs ', name)
  544. name = name.encode('utf-8')
  545. url = common.parseDOM(video, "a", ret="href")[0]
  546. url = common.replaceHTMLCodes(url)
  547. url = url.encode('utf-8')
  548. if not ('/fullmatch/' in url or '/highlights/' in url): raise Exception()
  549. self.list.append({'name': name, 'url': url, 'image': '', 'date': '', 'genre': 'Sports', 'plot': '', 'title': name, 'show': '', 'next': ''})
  550. except:
  551. pass
  552. return self.list
  553. class videoparts:
  554. def __init__(self):
  555. self.list = []
  556. def get(self, name, url, image, date, genre, plot, title, show):
  557. if '/highlights/' in url:
  558. #self.list = self.lfv_list2(name, url, image, date, genre, plot, title, show)
  559. self.list = cache(self.lfv_list2, name, url, image, date, genre, plot, title, show)
  560. else:
  561. #self.list = self.lfv_list(name, url, image, date, genre, plot, title, show)
  562. self.list = cache(self.lfv_list, name, url, image, date, genre, plot, title, show)
  563. index().videopartList(self.list)
  564. def lfv_list(self, name, url, image, date, genre, plot, title, show):
  565. try:
  566. result = getUrl(url, timeout='30').result
  567. result = result.replace('<object', '<iframe').replace(' data=', ' src=')
  568. result = common.parseDOM(result, "div", attrs = { "id": "fullvideo" })[0]
  569. videos = common.parseDOM(result, "div", attrs = { "class": "et-learn-more.+?" })
  570. except:
  571. return
  572. for video in videos:
  573. try:
  574. lang = common.parseDOM(video, "span")[0]
  575. lang = lang.split("-")[-1].strip()
  576. if 'proxy.link=lfv*' in video:
  577. import decrypter
  578. parts = re.compile('proxy[.]link=lfv[*](.+?)&').findall(video)
  579. parts = uniqueList(parts).list
  580. parts = [decrypter.decrypter(198,128).decrypt(i,base64.urlsafe_b64decode('Y0ZNSENPOUhQeHdXbkR4cWJQVlU='),'ECB').split('\0')[0] for i in parts]
  581. else:
  582. video = video.replace('"//', '"http://')
  583. parts = re.findall('"(http://.+?)"', video, re.I)
  584. parts = [i for i in parts if any(i.startswith(x) for x in resolver().hostList)]
  585. count = 0
  586. for url in parts:
  587. count = count + 1
  588. name = '%s (%s) %s' % (title, str(count), lang)
  589. name = common.replaceHTMLCodes(name)
  590. name = name.encode('utf-8')
  591. url = common.replaceHTMLCodes(url)
  592. if url.startswith('//') : url = 'http:' + url
  593. if not any(url.startswith(i) for i in resolver().hostList): continue
  594. url = url.encode('utf-8')
  595. self.list.append({'name': name, 'url': url, 'image': image, 'date': date, 'genre': genre, 'plot': plot, 'title': title, 'show': show})
  596. except:
  597. pass
  598. return self.list
  599. def lfv_list2(self, name, url, image, date, genre, plot, title, show):
  600. try:
  601. result = getUrl(url, timeout='30').result
  602. result = result.replace('"//', '"http://')
  603. result = re.findall('"(http://.+?)"', result, re.I)
  604. result = uniqueList(result).list
  605. videos = [i for i in result if any(i.startswith(x) for x in resolver().hostList)]
  606. videos = [i for i in videos if not i.endswith('.js')]
  607. except:
  608. return
  609. for video in videos:
  610. try:
  611. url = video
  612. url = common.replaceHTMLCodes(url)
  613. if url.startswith('//') : url = 'http:' + url
  614. url = url.encode('utf-8')
  615. self.list.append({'name': name, 'url': url, 'image': image, 'date': date, 'genre': genre, 'plot': plot, 'title': title, 'show': show})
  616. except:
  617. pass
  618. return self.list
  619. class resolver:
  620. def __init__(self):
  621. self.vk_base = 'http://vk.com'
  622. self.dailymotion_base = 'http://www.dailymotion.com'
  623. self.facebook_base = 'http://www.facebook.com/video'
  624. self.playwire_base = 'http://cdn.playwire.com'
  625. self.youtube_base = 'http://www.youtube.com'
  626. self.rutube_base = 'http://rutube.ru'
  627. self.videa_base = 'http://videa.hu'
  628. self.sapo_base = 'http://videos.sapo.pt'
  629. self.hostList = self.host_list()
  630. def run(self, url):
  631. try:
  632. if url.startswith(self.vk_base): url = self.vk(url)
  633. elif url.startswith(self.dailymotion_base): url = self.dailymotion(url)
  634. elif url.startswith(self.facebook_base): url = self.facebook(url)
  635. elif url.startswith(self.playwire_base): url = self.playwire(url)
  636. elif url.startswith(self.youtube_base): url = self.youtube(url)
  637. elif url.startswith(self.rutube_base): url = self.rutube(url)
  638. elif url.startswith(self.videa_base): url = self.videa(url)
  639. elif url.startswith(self.sapo_base): url = self.sapo(url)
  640. if url is None: raise Exception()
  641. player().run(url)
  642. return url
  643. except:
  644. index().infoDialog(language(30303).encode("utf-8"))
  645. return
  646. def host_list(self):
  647. return [self.vk_base, self.dailymotion_base, self.facebook_base, self.playwire_base, self.youtube_base, self.rutube_base, self.videa_base, self.sapo_base]
  648. def vk(self, url):
  649. try:
  650. if not 'hash' in url: url = self.vk_private(url)
  651. url = url.replace('http://', 'https://')
  652. url = url.encode('utf-8')
  653. result = getUrl(url).result
  654. url = None
  655. try: url = re.compile('url240=(.+?)&').findall(result)[0]
  656. except: pass
  657. try: url = re.compile('url360=(.+?)&').findall(result)[0]
  658. except: pass
  659. try: url = re.compile('url480=(.+?)&').findall(result)[0]
  660. except: pass
  661. try: url = re.compile('url720=(.+?)&').findall(result)[0]
  662. except: pass
  663. return url
  664. except:
  665. return
  666. def vk_private(self, url):
  667. urln = 'http://livefootballvideo.com/player/vkru/plugins/plugins_vk.php'
  668. result = re.compile('\/video(.*)_(.*)').findall(url)[0]
  669. oid, vid = result[0], result[1]
  670. post = {'getacc':'true'}
  671. post = urllib.urlencode(post)
  672. result = getUrl(urln, post=post).result
  673. result = re.compile('u=(.*)&p=(.*)&').findall(result)[0]
  674. username, pwd = result[0], result[1]
  675. ipostfield = "pass=%s&email=%s&act=login&captcha_sid=&captcha_key=&role=al_frame&_origin=http://vk.com&expire=" % (pwd, username)
  676. post = {'icookie':'remixlang=3',
  677. 'ipostfield':ipostfield,
  678. 'ihttpheader':'true',
  679. 'iagent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0',
  680. 'isslverify':'true',
  681. 'iheader':'true',
  682. 'url':'https://login.vk.com/?act=login',
  683. 'ipost':'true'}
  684. post = urllib.urlencode(post)
  685. result = getUrl(urln, post=post).result
  686. result = re.compile('Set-Cookie: h=(.*?)\;.*?\sSet-Cookie:\ss=(.*?);.*?\sSet-Cookie:\sl=(.*?);.*?\sSet-Cookie:\sp=(.*?);.*?\sLocation.*?hash=(.*)').findall(result)
  687. h, s, l, p, hash = result[0][0], result[0][1], result[0][2], result[0][3], result[0][4]
  688. icookiePost = "h=%s; s=%s; p=%s; l=%s; remixlang=3" % (h,s,p,l)
  689. if hash[len(hash)-1] == '\r': hash = hash[:-1]
  690. urlPost = 'http://vk.com/login.php?act=slogin&to=&s=%s&__q_hash=%s' % (s,hash)
  691. post = {'icookie':icookiePost,
  692. 'iheader':'true',
  693. 'url':urlPost,
  694. 'ihttpheader':'true',
  695. 'iagent':' Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0'}
  696. post = urllib.urlencode(post)
  697. result = getUrl(urln, post=post).result
  698. remixId = re.compile('remixsid=(.*?);').findall(result)[0]
  699. icookiePost = "remixlang=3; remixsid=%s" % (remixId)
  700. ipostFieldPost = "vid=%s&act=video_embed_box&al=1&oid=%s" % (vid,oid)
  701. post = {'icookie':icookiePost,
  702. 'ipostfield':ipostFieldPost,
  703. 'ihttpheader':'true',
  704. 'iagent':' Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0',
  705. 'iheader':'true',
  706. 'url':'http://vk.com/al_video.php'
  707. }
  708. post = urllib.urlencode(post)
  709. result = getUrl(urln, post=post).result
  710. url = re.compile('iframe src=&quot;(.*)";').findall(result)[0]
  711. return url
  712. def dailymotion(self, url):
  713. try:
  714. url = url.replace('dailymotion.com/video/', 'dailymotion.com/embed/video/')
  715. result = getUrl(url).result
  716. url = None
  717. try: url = re.compile('"stream_h264_ld_url":"(.+?)"').findall(result)[0]
  718. except: pass
  719. try: url = re.compile('"stream_h264_url":"(.+?)"').findall(result)[0]
  720. except: pass
  721. try: url = re.compile('"stream_h264_hq_url":"(.+?)"').findall(result)[0]
  722. except: pass
  723. try: url = re.compile('"stream_h264_hd_url":"(.+?)"').findall(result)[0]
  724. except: pass
  725. url = urllib.unquote(url).decode('utf-8').replace('\\/', '/')
  726. return url
  727. except:
  728. return
  729. def facebook(self, url):
  730. try:
  731. result = getUrl(url).result
  732. url = re.compile('"params","(.+?)"').findall(result)[0]
  733. url = re.sub(r'\\(.)', r'\1', urllib.unquote_plus(url.decode('unicode_escape')))
  734. url = re.compile('_src":"(.+?)"').findall(url)[0]
  735. return url
  736. except:
  737. return
  738. def playwire(self, url):
  739. try:
  740. url = url.split("config=")[-1]
  741. result = getUrl(url).result
  742. url = re.compile('"src":"(.+?)"').findall(result)[0]
  743. return url
  744. except:
  745. return
  746. def youtube(self, url):
  747. try:
  748. url = url.split("?v=")[-1].split("/")[-1].split("?")[0]
  749. url = 'plugin://plugin.video.youtube/?action=play_video&videoid=%s' % url
  750. if index().addon_status('plugin.video.youtube') is None:
  751. index().okDialog(language(30321).encode("utf-8"), language(30322).encode("utf-8"))
  752. return
  753. return url
  754. except:
  755. return
  756. def rutube(self, url):
  757. try:
  758. url = url.split("/")[-1].split("?")[0]
  759. url = 'http://rutube.ru/api/play/trackinfo/%s/?format=xml' % url
  760. result = getUrl(url).result
  761. url = common.parseDOM(result, "m3u8")[0]
  762. return url
  763. except:
  764. return
  765. def videa(self, url):
  766. try:
  767. url = url.rsplit("v=", 1)[-1].rsplit("-", 1)[-1]
  768. if url.startswith('http://'): raise Exception()
  769. url = 'http://videa.hu/flvplayer_get_video_xml.php?v=%s' % url
  770. result = getUrl(url).result
  771. url = re.compile('video_url="(.+?)"').findall(result)[0]
  772. return url
  773. except:
  774. return
  775. def sapo(self, url):
  776. try:
  777. id = url.split("file=")[-1].split("sapo.pt/")[-1].split("/")[0]
  778. url = '%s/%s/rss2' % (self.sapo_base, id)
  779. result = getUrl(url).result
  780. url = common.parseDOM(result, "media:content", ret="url")[0]
  781. url = '%s%s/mov' % (url.split(id)[0], id)
  782. url = getUrl(url, output='geturl').result
  783. return url
  784. except:
  785. return
  786. main()