The branch, frodo has been updated
via 3c5b4d44e8f10e2de248f8baaa07b30c0c5af231 (commit)
via b44880d52fb8c918c8ff91643c135e3f81a5b809 (commit)
from eb8a64d48c9c5c0b753da3bf183ffedad0ae82ec (commit)
- Log -----------------------------------------------------------------
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=3c5b4d44e8f10e2de248f8baaa07b30c0c5af231
commit 3c5b4d44e8f10e2de248f8baaa07b30c0c5af231
Author: sphere <[email protected]>
Date: Thu May 15 11:07:51 2014 +0200
[plugin.video.enemy.territory] marked as broken
diff --git a/plugin.video.enemy.territory/addon.xml
b/plugin.video.enemy.territory/addon.xml
index a49a376..3f00b3b 100644
--- a/plugin.video.enemy.territory/addon.xml
+++ b/plugin.video.enemy.territory/addon.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<addon id="plugin.video.enemy.territory" name="Enemy Territory"
provider-name="willforde" version="1.0.1">
+<addon id="plugin.video.enemy.territory" name="Enemy Territory"
provider-name="willforde" version="1.0.2">
<requires>
<import addon="xbmc.python" version="2.1.0"/>
<import addon="script.module.xbmcutil" version="2.0.2"/>
@@ -17,5 +17,6 @@
<forum>http://forum.xbmc.org/showthread.php?tid=178789</forum>
<source>https://github.com/willforde/plugin.video.enemy.territory</source>
<website>http://enemyterritory.sectornetwork.com</website>
+ <broken>Site no longer available</broken>
</extension>
</addon>
\ No newline at end of file
diff --git a/plugin.video.enemy.territory/changelog.txt
b/plugin.video.enemy.territory/changelog.txt
index 4b377dd..afa46be 100644
--- a/plugin.video.enemy.territory/changelog.txt
+++ b/plugin.video.enemy.territory/changelog.txt
@@ -1,3 +1,6 @@
+[B]Version 1.0.2[/B]
+- Marked Addon ad broken sinse site is no longer available, and is unlikely to
come back
+
[B]Version 1.0.1[/B]
- Added Full Unicode Support
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=b44880d52fb8c918c8ff91643c135e3f81a5b809
commit b44880d52fb8c918c8ff91643c135e3f81a5b809
Author: sphere <[email protected]>
Date: Thu May 15 11:05:55 2014 +0200
[plugin.video.cinemassacre] updated to version 1.0.7
diff --git a/plugin.video.cinemassacre/addon.xml
b/plugin.video.cinemassacre/addon.xml
index 6951370..9705ea2 100644
--- a/plugin.video.cinemassacre/addon.xml
+++ b/plugin.video.cinemassacre/addon.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<addon id="plugin.video.cinemassacre" name="cinemassacre" version="1.0.6"
provider-name="dethfeet, Kr0nZ">
+<addon id="plugin.video.cinemassacre" name="cinemassacre" version="1.0.7"
provider-name="dethfeet, Kr0nZ">
<requires>
<import addon="xbmc.python" version="2.1.0"/>
<import addon="xbmc.gui" version="4.0.0"/>
- <import addon="plugin.video.youtube" version="4.4.1"/>
- <import addon="plugin.video.bliptv" version="1.8.1"/>
- <import addon="script.module.parsedom" version="2.5.1" />
+ <import addon="script.module.parsedom" version="2.5.2" />
+ <import addon="plugin.video.youtube" version="4.4.6" />
+ <import addon="script.module.urlresolver" version="2.2.0" />
</requires>
<extension point="xbmc.python.pluginsource" library="default.py">
<provides>video</provides>
diff --git a/plugin.video.cinemassacre/changelog.txt
b/plugin.video.cinemassacre/changelog.txt
index 6014aeb..a0757df 100644
--- a/plugin.video.cinemassacre/changelog.txt
+++ b/plugin.video.cinemassacre/changelog.txt
@@ -1,3 +1,4 @@
+1.0.7 - Major refactor for Gotham release
1.0.6 - Fix screenwave video playback again
1.0.5 - Fix screenwave videos to support new player page
1.0.4 - Fix screenwave videos
diff --git a/plugin.video.cinemassacre/default.py
b/plugin.video.cinemassacre/default.py
index 3d09304..375135f 100644
--- a/plugin.video.cinemassacre/default.py
+++ b/plugin.video.cinemassacre/default.py
@@ -1,215 +1,163 @@
-import xbmcplugin, xbmcgui, xbmcaddon
-import urllib, urllib2, re
-import showEpisode, sys, os#, random
-try: import StorageServer
-except: import storageserverdummy as StorageServer
+import xbmcplugin, xbmcgui, xbmcaddon, xbmc
+import urllib, urllib2, re, os
import CommonFunctions as common
import thisCommonFunctions as common2
+import Queue
+import threading
+import copy
+import urlresolver
+import pickle
+from cache import cache
-cache = StorageServer.StorageServer("cinemassacre", 24)
-#cache.dbg = True
-#common.dbg = True
-addon = xbmcaddon.Addon(id='plugin.video.cinemassacre')
-
+addon = xbmcaddon.Addon()
thisPlugin = int(sys.argv[1])
+BASEURL = 'http://cinemassacre.com/'
+USERAGENT = 'Mozilla/5.0 (Windows NT 6.1; rv:14.0) Gecko/20100101
Firefox/14.0.1'
+DEFAULT_PARAMS = {
+ 'action':'main',
+ 'nav':[],
+ 'url':''
+}
+addonDataFolder =
xbmc.translatePath("special://profile/addon_data/{0}".format(addon.getAddonInfo('id')))
+if not os.path.isdir(addonDataFolder):
+ os.mkdir(addonDataFolder)
+dbLocation = os.path.join(addonDataFolder,"cache.db")
-baseLink = "http://cinemassacre.com/"
+cacheDb = cache(dbLocation)
-defaultsXML = os.path.join(addon.getAddonInfo('path'),
'resources',"defaults.xml")
-dontShowTheseUrls = []
-defaultFolderIcons = {"default":os.path.join(addon.getAddonInfo('path'),
"icon.png"),"list":[]}
+logo = {
+'default':'logo.png',
+'/category/avgn/':'avgn.png',
+'/category/boardjames/':'boardJ.png',
+'/category/ykwb/':'ykwbs.png'
+}
-def retFileAsString(fileName):
- file = common.openFile(fileName, "r")
- tmpContents = file.read()
- file.close()
- return tmpContents
-
-def getDefaultIcons():
- xmlContents = retFileAsString(defaultsXML)
- iconList = common2.parseDOM(xmlContents, "icons")
- iconUrlList = common2.parseDOM(iconList, "icon", ret="url")
- iconImgList = common2.parseDOM(iconList, "icon", ret="image")
-
- retList = []
- for i in range(0,len(iconUrlList)):
- retList.append({"url": iconUrlList[i], "image":
os.path.join(addon.getAddonInfo('path'), 'resources', 'images',
iconImgList[i])})
- return retList
+class cine(object):
-def getNotShownUrls():
- xmlContents = retFileAsString(defaultsXML)
- exclList = common2.parseDOM(xmlContents, "excludeUrls")
- urlList = common2.parseDOM(exclList, "url")
+ def downloadPage(self,url,data=None):
+ xbmc.log("downloading page: %s" % url, xbmc.LOGDEBUG)
+ retries = 0
+ page = None
+ while retries < 10:
+ retries = retries + 1
+ try:
+ if data == None:
+ req = urllib2.Request(url)
+ else:
+ req = urllib2.Request(url,data)
+ req.add_header('Content-Type', 'application/x-www-form-urlencoded')
+ req.add_header('User-Agent', USERAGENT)
+ response = urllib2.urlopen(req, timeout=30)
+ page = response.read()
+ response.close()
+ return page
+ except:
+ xbmc.log("Error downloading page. Attempt %s / 10" % str(retries))
+
+ def extractNav(self,dom):
+ navItem = re.compile('^<a href="([^\"\']*?)">([^<]*?)</a>').findall(dom)[0]
+ navTmp = common2.parseDOM(dom, "ul", attrs={"class": "sub-menu"})
+ children = []
+ if len(navTmp) > 0:
+ navTmp = common2.parseDOM(navTmp[0], "li")
+ for a in navTmp:
+ children.append(self.extractNav(a))
+ ret = {'title':navItem[1], 'url':navItem[0], 'children':children}
+ return ret
+
+ def getNav(self):
+ mainPage = self.downloadPage(BASEURL)
+ navList = common2.parseDOM(mainPage, "div", attrs={"id": "navArea"})
+ navList = common2.parseDOM(navList[0], "ul", attrs={"id":
"menu-main-menu"})
+ navList = common2.parseDOM(navList[0], "li")
+ extracted = []
+ for a in navList:
+ extracted.append(self.extractNav(a))
+ return extracted
- retList = []
- for url in urlList:
- retList.append(url)
- return retList
+ def addToDir(self, title, params, folder=True):
+ #folder=True
+ title = self.remove_html_special_chars(title)
+ image = os.path.join(addon.getAddonInfo('path'), 'resources', 'images',
logo['default'])
-def excludeUrl(url):
- for notUrl in dontShowTheseUrls:
- if notUrl in url:
- return True
- return False
-
-def checkDefaultIcon(url):
- possibleIcon = ""
- for defaultIcon in defaultFolderIcons["list"]:
- if (defaultIcon["url"] in url) and (len(defaultIcon["image"]) >
len(possibleIcon)):
- possibleIcon = defaultIcon["image"]
- if len(possibleIcon) == 0:
- possibleIcon = defaultFolderIcons["default"]
- return possibleIcon
+ if 'image' in params.keys():
+ image = params['image']
-def addEpisodeListToDirectory(epList):
- print "Adding Video List: %s" % epList
- for episode in epList:
- if not excludeUrl(episode['url']):
- addDirectoryItem(remove_html_special_chars(episode['title']),
{"action" : "episode", "link": episode['url']}, episode['thumb'], False)
- xbmcplugin.endOfDirectory(thisPlugin)
+ li = xbmcgui.ListItem(title, iconImage=image, thumbnailImage=image)
+ url = sys.argv[0] + '?' + urllib.urlencode(params)
+ xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=url, listitem=li,
isFolder=folder)
+
+ def showNav(self, offset=[]):
-def extractEpisodeImg(episode):
- linkImage = common2.parseDOM(episode, "div", attrs={"class":
"video-tnail"})
- linkImage = common2.parseDOM(linkImage, "img", ret="src")
- linkImageTmp = re.compile('src=([^&]*)', re.DOTALL).findall(linkImage[0])
- if len(linkImageTmp)>0:
- if linkImageTmp[0][:1] != "/":
- linkImageTmp[0] = "/" + linkImageTmp[0]
- linkImage = baseLink+linkImageTmp[0]
- else:
- if (len(linkImage[0]) > 0) and (baseLink in linkImage[0]):
- linkImage = linkImage[0]
- else:
- linkImage = ""
- return linkImage
-
-def pageInCache(episodeList,link):
- storedList = cache.get(link)
- try:
- storedList = eval(storedList)
- except:
- storedList = []
- if (len(storedList) >= len(episodeList)):
- for i in range(0,len(episodeList)):
- if episodeList[i] != storedList[i]:
- return []
- print "Using Stored Cache Page"
- return storedList
- return []
+ if len(offset) == 0:
+ self.addToDir('Recent Videos', {'action':'recent','url':'#'})
+
+ navbar = self.getNav()
+ parent = {'url':'#'}
-def mainPage():
- global thisPlugin
- addDirectoryItem(addon.getLocalizedString(30000), {"action" : "recent",
"link": ""}, defaultFolderIcons["default"])
- subMenu(baseLink)
-
-def subMenu(link,row='[]'):
- global thisPlugin
- link = urllib.unquote(link)
- page = load_page(link)
- mainMenu = extractMenu(page,urllib.unquote(row))
+ for a in offset:
+ parent = navbar[a]
+ navbar = navbar[a]['children']
+
+ tmpOffset2 = 0
- if not len(mainMenu):
- return showPage(link) # If link has no sub categories then display
video list
+ if parent['url'] != '#':
+ self.addToDir('All Videos', {'action':'display','url':parent['url']})
- if len(link) != len(baseLink) and (link != '#'):
- addDirectoryItem(addon.getLocalizedString(30001), {"action" : "show",
"link": link}, defaultFolderIcons["default"]) # All Videos Link
+ for a in navbar:
+ tmpOffset = []
+ for b in offset:
+ tmpOffset.append(b)
+ tmpOffset.append(tmpOffset2)
+ actionType = 'main'
+ if len(a['children']) == 0:
+ actionType = 'display'
+ params = {'action':actionType,'nav':repr(tmpOffset),'url':a['url']}
+ for q in logo.keys():
+ if q in a['url']:
+ params['image'] = os.path.join(addon.getAddonInfo('path'),
'resources', 'images', logo[q])
+ break
+ self.addToDir(a['title'], params)
+ tmpOffset2 = tmpOffset2 + 1
+
+ xbmcplugin.endOfDirectory(int(sys.argv[1]))
- for menuItem in mainMenu:
- menu_name = remove_html_special_chars(menuItem['name']);
- menu_link = menuItem['link'];
- if excludeUrl(menu_link):
- continue
- menu_icon = checkDefaultIcon(menu_link)
- addDirectoryItem(menu_name, {"action" : "submenu", "link": menu_link,
"row": menuItem['row']}, menu_icon)
-
- xbmcplugin.endOfDirectory(thisPlugin)
-
-def recentPage():
- global thisPlugin
- pageUrl = baseLink + "wp-admin/admin-ajax.php"
- pageData = "action=infinite_scroll&loop_file=loop"
- page = load_page(pageUrl,pageData)
- linkList = extractEpisodes(page)
- newLinkList = []
- pDialog = xbmcgui.DialogProgress(10101)
- ret = pDialog.create('Cinemassacre', 'Loading Recent Videos', '',
'Retrieved 0 Videos')
- curItm = 0
- for chk in linkList:
- curItm = curItm + 1
- link = urllib.unquote(chk['url'])
- page = load_page(link)
- if showEpisode.showEpisode(page,False) == True:
- newLinkList.append(chk)
- pDialog.update((curItm * 100) / len(linkList),'Loading Recent Videos',
'', 'Retrieved '+str(len(newLinkList))+' Videos')
- addEpisodeListToDirectory(newLinkList)
+ def getParams(self):
+ param = DEFAULT_PARAMS
+ paramstring = sys.argv[2]
+ xbmc.log("Parameter String: %s" % paramstring, xbmc.LOGDEBUG)
+ if len(paramstring) >= 2:
+ paramstring = paramstring.replace('?', '')
+ parampairs = paramstring.split('&')
+ for i in range(len(parampairs)):
+ splitpair = parampairs[i].split('=')
+ if len(splitpair) == 2:
+ param[splitpair[0]] = urllib.unquote(splitpair[1].replace('+',' '))
+ if splitpair[0] == 'nav':
+ param['nav'] = eval(param['nav'])
+ for d in range(len(param['nav'])):
+ param['nav'][d] = int(param['nav'][d])
-def extractMenu(page,row='[]'):
- navList = common2.parseDOM(page, "div", attrs={"id": "navArea"})
- navList = common2.parseDOM(navList[0], "ul", attrs={"id":
"menu-main-menu"})
- navList = common2.parseDOM(navList[0], "li")
- row2 = eval(row)
- tempCont = navList
- for i in row2:
- tempCont = common2.parseDOM(tempCont[i], "li")
-
- retList = []
- for i in range(0,len(tempCont)):
- tmpRow = eval(row)
- tmpRow.append(i)
- testNav = re.compile('^<a
href="([^\"\']*?)">([^<]*?)</a>').findall(tempCont[i])
- try:
- retList.append({"name": testNav[0][1],"link": testNav[0][0],
"row":repr(tmpRow)})
- except: print "extractMenu: list index out of range"
- return retList
-
-def showPage(link):
- global thisPlugin
- link = urllib.unquote(link)
- page = load_page(link)
- # Some pages has the newest video in a "Featured Video" section
- show = common2.parseDOM(page, "div", attrs={"id": "featuredImg"})
- try:
- fTitle = common2.parseDOM(show, "span", attrs={"id":
"archiveCaption"})[0]
- fTitle = common2.parseDOM(fTitle, "a")[0]
- fLink = common2.parseDOM(show, "a", ret="href")[0]
- fImg = common2.parseDOM(show, "img", ret="src")[0]
- except: print "No featured video found"
-
- show = common2.parseDOM(page, "div", attrs={"id": "postlist"})
- episodeList = extractEpisodes(show)
- episodeList.insert(0, {"title":fTitle, "url":fLink, "thumb":fImg})
- #cache.delete(link)
+ return param
+
+ def videoList(self, url, nextPage=1, pageCat=None, pageTotal=None):
- ##Check first page against cache
- cachedPage = pageInCache(episodeList,link) # Returns empty list if cache
differs
- if (len(cachedPage)>0):
- episodeList = cachedPage
- show = None
+ postUrl = BASEURL + 'wp-admin/admin-ajax.php'
+ postData = 'action=infinite_scroll&page_no={0}&cat={1}&loop_file=loop'
+ if pageCat == None:
+ vidPage = self.downloadPage(url)
+ pageTotal = re.compile('var total = (\d+?);').findall(vidPage)[0]
+ pageCat = re.compile('var cat = (\d+?);').findall(vidPage)[0]
+ vidList = []
- if (show != None):
- curPage = int(re.compile('var count = (\d+?);').findall(page)[0])
- pageTotal = int(re.compile('var total = (\d+?);').findall(page)[0])
- pageCat = re.compile('var cat = (\d+?);').findall(page)[0]
- nextPageUrl = baseLink + "wp-admin/admin-ajax.php"
-
- while (curPage <= pageTotal):
- pageData = "action=infinite_scroll&page_no="+ str(curPage) +
'&cat=' + pageCat + '&loop_file=loop'
- page = load_page(nextPageUrl,pageData)
- linkList = extractEpisodes(page)
- episodeList = episodeList + linkList
- curPage += 1
-
- cache.set(link, repr(episodeList)) #update cache
- addEpisodeListToDirectory(episodeList)
-
-def extractEpisodes(show):
- episodes = common2.parseDOM(show, "div", attrs={"class": "archiveitem"})
+
vidList.append(self.downloadPage(postUrl,postData.format(nextPage,pageCat)))
+
linkList = []
- for episode in episodes:
+ for a in vidList:
+ episodes = common2.parseDOM(a, "div", attrs={"class": "archiveitem"})
+ for episode in episodes:
episode = episode.encode('ascii', 'ignore')
episode_link = common2.parseDOM(episode, "a", ret="href")[0]
- if excludeUrl(episode_link):
- continue
episode_title = common2.parseDOM(episode, "a")[0]
episode_title =
re.compile('<div>([^<]*?)</div>').findall(episode_title)[0]
try:
@@ -217,76 +165,265 @@ def extractEpisodes(show):
except:
episode_img = ""
linkList.append({"title":episode_title, "url":episode_link,
"thumb":episode_img})
- return linkList
+
+ links = self.vidLinks(linkList)
+
+ for link in links:
+ if 'vidUrl' in link.keys():
+ self.addToDir(link['title'],
{'action':'playVideo','url':link['vidUrl'],
'name':link['title'],'image':link['thumb']}, False)
+ else:
+ xbmc.log("Skipping - NO Vid Url: %s" % str(repr(link)), xbmc.LOGDEBUG)
+
+ if int(nextPage) < int(pageTotal):
+ self.addToDir("Next Page",
{'action':'display','url':url,'nextPage':str(nextPage+1)}, True)
+
+ xbmcplugin.endOfDirectory(int(sys.argv[1]))
+
+ def vidLinks(self, links):
+ maxThreads = 10
+ inQ = Queue.Queue()
+ outQ = Queue.Queue()
+
+ for link in links:
+
+ inQ.put(link['url'])
+
+ threadList = []
+ cacheLock = threading.Lock()
+ for i in range(maxThreads):
+ t = threading.Thread(target=self.checkVidLink, args =
(inQ,outQ,cacheLock))
+ t.start()
+ threadList.append(t)
+
+ for t in threadList:
+ t.join()
+
+ modifiedLinks = []
+ while not outQ.empty():
+ checkedLink = outQ.get(False)
+
+ for i in range(len(links)):
+ if links[i]['url'] == checkedLink['url']:
+ if len(checkedLink['vidUrl']) == 1:
+ links[i]['vidUrl'] = checkedLink['vidUrl'][0]
+ else:
+ new = copy.deepcopy(links[i])
+ possibles = [
+
{'inUrl':'screenwavemedia.com/play/','prefix':'[ScreenWaveMedia]','count':0},
+ {'inUrl':'youtube.com','prefix':'[YouTube]','count':0},
+ {'inUrl':'blip.tv','prefix':'[Blip.tv]','count':0},
+ {'inUrl':'gametrailers.com','prefix':'[GameTrailers]','count':0}
+ ]
+ newLinks = []
+ for a in checkedLink['vidUrl']:
+ tmp = copy.deepcopy(new)
+ tmp['vidUrl'] = a
+ for b in possibles:
+ if b['inUrl'] in a:
+ cancelFor = False
+ for c in newLinks:
+ if a == c['vidUrl']:
+ cancelFor = True
+ break
+ if cancelFor:
+ break
+ prefix = b['prefix']
+ if b['count'] > 0:
+ prefix = prefix + ' [' + str(b['count']) + ']'
+ tmp['title'] = prefix + tmp['title']
+ newLinks.append(tmp)
+ b['count'] = b['count'] + 1
+ break
+ modifiedLinks.append({'index': i, 'links': newLinks})
-def playEpisode(link):
- link = urllib.unquote(link)
- page = load_page(link)
- showEpisode.showEpisode(page)
+ retLinks = []
+ for a in range(len(links)):
+ addedMod = False
+ for b in modifiedLinks:
+ if b['index'] == a:
+ for c in b['links']:
+ retLinks.append(c)
+ addedMod = True
+ break
+ if not addedMod:
+ retLinks.append(links[a])
-def load_page(url, data=None):
- print "Getting page: " + url
- if len(url)<5:
- url = baseLink
- if data!=None:
- req = urllib2.Request(url,data)
- req.add_header('Content-Type', 'application/x-www-form-urlencoded')
+ return retLinks
+
+ def checkVidLink(self,inQ,outQ, cacheLock):
+
+ while not inQ.empty():
+ link = inQ.get(False)
+ cacheLock.acquire()
+ cacheTest = cacheDb.get(link)
+ cacheLock.release()
+ if cacheTest:
+ vidLink = pickle.loads(cacheTest)
+ else:
+ vidPage = self.downloadPage(link)
+ vidLink = self.getVidLink(vidPage)
+ cacheLock.acquire()
+ cacheDb.save(link, pickle.dumps(vidLink))
+ cacheLock.release()
+
+ if len(vidLink) > 0:
+ outQ.put({'url':link,'vidUrl':vidLink})
+
+ def getVidLink(self,vidPage):
+ link = []
+ player = common2.parseDOM(vidPage, "div", attrs={"class": "videoarea"})
+ if player:
+ playerLink = common2.parseDOM(player, "iframe", ret='src')
+ if len(playerLink) > 0:
+ if type(playerLink) == type(''):
+ link.append(playerLink)
+ elif type(playerLink) == type([]):
+ for a in playerLink:
+ link.append(a)
+ else:
+ xbmc.log("##ERROR## Found div videoarea, but no valid link")
+ else:
+ xbmc.log("##ERROR## Found div videoarea, but no iframe")
else:
- req = urllib2.Request(url)
- req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; rv:14.0)
Gecko/20100101 Firefox/14.0.1')
- response = urllib2.urlopen(req)
- link = response.read()
- response.close()
+ player = common2.parseDOM(vidPage, "div", attrs={"class":
"entry-content"})
+ if player:
+ if type(player) == type([]):
+ player = player[0]
+ playerLink =
re.compile('\=[\'\"]([^\'\"]*?gametrailers.com/video/[^\'\"]*)').findall(player)
+ for a in playerLink:
+ link.append(a)
+ playerLink =
re.compile('\=[\'\"]([^\'\"]*?blip.tv/play/[^\'\"]*)').findall(player)
+ for a in playerLink:
+ link.append(a)
+ playerLink =
re.compile('\=[\'\"]([^\'\"]*?youtube.com/watch[^\'\"]*)').findall(player)
+ for a in playerLink:
+ link.append(a)
return link
-
-def addDirectoryItem(name, parameters={}, pic="", folder=True):
- li = xbmcgui.ListItem(name, iconImage="DefaultFolder.png",
thumbnailImage=pic)
- if not folder:
- li.setProperty('IsPlayable', 'true')
- url = sys.argv[0] + '?' + urllib.urlencode(parameters)# + "&randTok=" +
str(random.randint(1000, 10000))
- return xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=url,
listitem=li, isFolder=folder)
-
-def remove_html_special_chars(inputStr):
+
+ def remove_html_special_chars(self, inputStr):
inputStr = common.replaceHTMLCodes(inputStr)
inputStr=inputStr.strip()
return common.makeAscii(inputStr)
-def get_params():
- param = []
- paramstring = sys.argv[2]
- if len(paramstring) >= 2:
- params = sys.argv[2]
- cleanedparams = params.replace('?', '')
- if (params[len(params) - 1] == '/'):
- params = params[0:len(params) - 2]
- pairsofparams = cleanedparams.split('&')
- param = {}
- for i in range(len(pairsofparams)):
- splitparams = {}
- splitparams = pairsofparams[i].split('=')
- if (len(splitparams)) == 2:
- param[splitparams[0]] = splitparams[1]
+ def playVideo(self, params):
+
+ link = params['url']
+ image = params['image']
+ name = self.remove_html_special_chars(params['name'])
- return param
+ providers = (
+ {"function":self.showEpisodeBlip, "inurl":"blip.tv/play/"},
+ {"function":self.showEpisodeYoutube, "inurl":"youtube.com"},
+ {"function":self.showEpisodeGametrailers,
"inurl":"gametrailers.com/video"},
+ {"function":self.showEpisodeScreenwave,
"inurl":"screenwavemedia.com/"},
+ )
+ for a in providers:
+ if a['inurl'] in link:
+ stream_url = a['function'](link)
+ item = xbmcgui.ListItem(label=name, iconImage=image,
thumbnailImage=image, path=stream_url)
+ xbmc.Player().play(stream_url, item)
+
+ def showEpisodeGametrailers(self, videoUrl):
+ _regex_extractVideoGametrailerId = re.compile("<meta property=\"og:video\"
content=\"(http://media.mtvnservices.com/fb/mgid:arc:video:gametrailers.com:(.*?)\.swf)\"
/>");
+ _regex_extractVideoGametrailerStreamURL = re.compile("<rendition
bitrate=\"(.*?)\".*?<src>(.*?)</src>.*?</rendition>",re.DOTALL)
+
+ videoPage = self.downloadPage(videoUrl)
+ swfUrl = _regex_extractVideoGametrailerId.search(videoPage).group(1)
+
+ #GET the 301 redirect URL
+ req = urllib2.Request(swfUrl)
+ response = urllib2.urlopen(req)
+ swfUrl = response.geturl()
+ videoId = _regex_extractVideoGametrailerId.search(videoPage).group(2)
-dontShowTheseUrls = getNotShownUrls()
-defaultFolderIcons["list"] = getDefaultIcons()
+ feedUrl =
"http://udat.mtvnservices.com/service1/dispatch.htm?feed=mediagen_arc_feed&account=gametrailers.com&mgid=mgid%3Aarc%3Acontent%3Agametrailers.com%3A"+videoId+"&site=gametrailers.com&segment=0&mgidOfMrssFeed=mgid%3Aarc%3Acontent%3Agametrailers.com%3A"+videoId
-if not sys.argv[2]:
- mainPage()
-else:
- params = get_params()
- if params['action'] == "show":
- print "Video List"
- showPage(params['link'])
- elif params['action'] == "submenu":
- print "Menu"
- subMenu(params['link'],params['row'])
- elif params['action'] == "recent":
- print "Recent list"
- recentPage()
- elif params['action'] == "episode":
- print "Episode"
- playEpisode(params['link'])
+ videoFeed = self.downloadPage(feedUrl)
+ videoStreamUrls =
_regex_extractVideoGametrailerStreamURL.finditer(videoFeed)
+
+ curStream = None
+ curBitrate = 0
+ for stream in videoStreamUrls:
+ streamUrl = stream.group(2)
+ streamBitrate = int(stream.group(1))
+ if streamBitrate>curBitrate:
+ curStream = streamUrl.replace(" ","%20")
+ curBitrate = streamBitrate
+
+ swfUrl = swfUrl.replace("&geo=DE","&geo=US")
+ swfUrl = swfUrl.replace("geo%3dDE%26","geo%3dUS%26")
+
+ stream_url = curStream + " swfUrl="+swfUrl+" swfVfy=1"
+ if curStream is not None:
+ return stream_url
+
+ def showEpisodeYoutube(self, videoItem):
+
+ videoItem = videoItem.replace('https://','http://')
+ if videoItem.startswith('//'):
+ videoItem = 'http:' + videoItem
+
+ media = urlresolver.HostedMediaFile(url=videoItem)
+ return media.resolve()
+
+ def showEpisodeBlip(self, videoLink):
+ playerPage = self.downloadPage(videoLink)
+ video = re.compile('data-episode-id=[\'\"]([^\'\"]*?)[\'\"]',
re.DOTALL).findall(playerPage)
+ rssUrl = ''
+ if video:
+ rssUrl = 'http://blip.tv/rss/flash/' + video[0]
+ else:
+ video = re.compile('config.embedParams = {[^}]*?}',
re.DOTALL).findall(playerPage)
+ if len(video) > 0:
+ video = re.compile('[\'\"]file[\'\"]:[\'\"]([^\'\"]*?)[\'\"]',
re.DOTALL).findall(video[0])[0]
+ else:
+ req = urllib2.Request(videoLink)
+ response = urllib2.urlopen(req)
+ fullURL = response.geturl()
+ video = re.compile('file=(.*?)$', re.DOTALL).findall(fullURL)[0]
+ if '&' in video:
+ video = video.split('&')[0]
+
+ rssUrl = urllib.unquote(video)
+
+ playerPage = self.downloadPage(rssUrl)
+ urlsGroup = common2.parseDOM(playerPage, "media:group")
+ #media:content
+ urlContent = common2.parseDOM(urlsGroup, "media:content", ret='isDefault')
+ defI = 0
+ for i in range(len(urlContent)):
+ if urlContent[i] == 'true':
+ defI = i
+ urlContent = common2.parseDOM(urlsGroup, "media:content", ret='url')
+
+ return urlContent[defI]
+
+ def showEpisodeScreenwave(self, videoItem):
+ tmpContent = self.downloadPage(videoItem)
+
+ filesVal = re.compile('file(?:[\'|\"]*):(?:[\s|\'|\"]*)([^\'|\"]*)',
re.DOTALL).findall(tmpContent)
+
+ for i in range(0,len(filesVal)):
+ if ("high" in filesVal[i]) and ("mp4" in filesVal[i]):
+ return filesVal[i]
+
+ def main(self):
+ params = self.getParams()
+ if params['action'] == 'main':
+ self.showNav(params['nav'])
+ elif params['action'] == 'display':
+ nextPage = 1
+ if 'nextPage' in params.keys():
+ nextPage = int(params['nextPage'])
+ self.videoList(params['url'], nextPage)
+ elif params['action'] == 'recent':
+ self.videoList(None, 1, 0, 1)
+ elif params['action'] == 'playVideo':
+ self.playVideo(params)
+ xbmcplugin.endOfDirectory(int(sys.argv[1]))
+
else:
- mainPage()
+ self.showNav()
+
+main = cine()
+main.main()
-----------------------------------------------------------------------
Summary of changes:
plugin.video.cinemassacre/addon.xml | 8 +-
plugin.video.cinemassacre/cache.py | 65 ++
plugin.video.cinemassacre/changelog.txt | 1 +
plugin.video.cinemassacre/default.py | 639 ++++++++++++--------
.../{icon.png => resources/images/logo.png} | Bin 56865 -> 56865 bytes
plugin.video.cinemassacre/showEpisode.py | 226 -------
plugin.video.enemy.territory/addon.xml | 3 +-
plugin.video.enemy.territory/changelog.txt | 3 +
8 files changed, 463 insertions(+), 482 deletions(-)
create mode 100644 plugin.video.cinemassacre/cache.py
copy plugin.video.cinemassacre/{icon.png => resources/images/logo.png} (100%)
delete mode 100644 plugin.video.cinemassacre/showEpisode.py
hooks/post-receive
--
Plugins
------------------------------------------------------------------------------
"Accelerate Dev Cycles with Automated Cross-Browser Testing - For FREE
Instantly run your Selenium tests across 300+ browser/OS combos.
Get unparalleled scalability from the best Selenium testing platform available
Simple to use. Nothing to install. Get started now for free."
http://p.sf.net/sfu/SauceLabs
_______________________________________________
Xbmc-addons mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/xbmc-addons