The branch, frodo has been updated
via 5b81f682ed4e35ce7c4445f0316336a49f98647e (commit)
via bf34e722f18824a1f13edf2e4d5eb4f066d0250e (commit)
via a549b6704136213765ca7c3b97dd8a7a9cb3c407 (commit)
via 400ff308e14378938d4dc54138c0e97b08bb9748 (commit)
via 8a9d8838159901812f7d116b9e8aa619dd940c7b (commit)
via ce753c08be2b462a4a555ba4bf114a6d7a16e026 (commit)
from 5f5a6fcf3f928582200421e54f6c9dc7afe7a601 (commit)
- Log -----------------------------------------------------------------
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=5b81f682ed4e35ce7c4445f0316336a49f98647e
commit 5b81f682ed4e35ce7c4445f0316336a49f98647e
Author: sphere <[email protected]>
Date: Tue Feb 25 09:35:55 2014 +0100
[plugin.video.watchmojo] updated to version 1.0.1
diff --git a/plugin.video.watchmojo/addon.py b/plugin.video.watchmojo/addon.py
index 91d892a..be2c3fe 100644
--- a/plugin.video.watchmojo/addon.py
+++ b/plugin.video.watchmojo/addon.py
@@ -19,7 +19,7 @@
# Initiate Startup
import xbmcutil
action = xbmcutil.plugin.actions[0]
-if action == "system": xbmcutil.sysCheck()
+if action == u"system": xbmcutil.sysCheck()
else:
# Call Function Based on Action Param
import main as plugin
diff --git a/plugin.video.watchmojo/addon.xml b/plugin.video.watchmojo/addon.xml
index 715170e..d281eb1 100644
--- a/plugin.video.watchmojo/addon.xml
+++ b/plugin.video.watchmojo/addon.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<addon id="plugin.video.watchmojo" name="Watchmojo" provider-name="willforde"
version="1.0.0">
+<addon id="plugin.video.watchmojo" name="Watchmojo" provider-name="willforde"
version="1.0.1">
<requires>
<import addon="xbmc.python" version="2.1.0"/>
- <import addon="script.module.xbmcutil" version="2.0.0"/>
+ <import addon="script.module.xbmcutil" version="2.0.2"/>
</requires>
<extension library="addon.py" point="xbmc.python.pluginsource">
<provides>video</provides>
diff --git a/plugin.video.watchmojo/changelog.txt
b/plugin.video.watchmojo/changelog.txt
index 8a53bba..0d8a189 100644
--- a/plugin.video.watchmojo/changelog.txt
+++ b/plugin.video.watchmojo/changelog.txt
@@ -1,2 +1,5 @@
-[B]Version 1.0[/B]
+[B]Version 1.0.1[/B]
+- Added full unicode support
+
+[B]Version 1.0.0[/B]
- Initial Version
\ No newline at end of file
diff --git a/plugin.video.watchmojo/resources/lib/main.py
b/plugin.video.watchmojo/resources/lib/main.py
index 7a2bd2a..2b8fa71 100644
--- a/plugin.video.watchmojo/resources/lib/main.py
+++ b/plugin.video.watchmojo/resources/lib/main.py
@@ -20,21 +20,20 @@
from xbmcutil import listitem, urlhandler, plugin
import parsers
-BASEURL = "http://www.watchmojo.com"
+BASEURL = u"http://www.watchmojo.com"
class Initialize(listitem.VirtualFS):
@plugin.error_handler
def scraper(self):
# Fetch Video Content
- url = "%s/video/theme/" % BASEURL
- sourceObj = urlhandler.urlopen(url, 2678400) # TTL = 1 Month
- videoItems = parsers.CategorysParser().parse(sourceObj.read())
- sourceObj.close()
+ url = u"%s/video/theme/" % BASEURL
+ sourceCode = urlhandler.urlread(url, 2678400) # TTL = 1 Month
+ videoItems = parsers.CategorysParser().parse(sourceCode)
# Add Extra Items
icon = (plugin.getIcon(),0)
self.add_youtube_channel("watchmojo")
- self.add_item("-Latest Videos", thumbnail=icon,
url={"action":"Videos", "url":"/video/cat/home/1"})
- self.add_item("-Video Themes", thumbnail=icon,
url={"action":"Themes", "url":"/video/theme/"})
+ self.add_item(u"-Latest Videos", thumbnail=icon,
url={"action":"Videos", "url":"/video/cat/home/1"})
+ self.add_item(u"-Video Themes", thumbnail=icon,
url={"action":"Themes", "url":"/video/theme/"})
# Set Content Properties
self.set_sort_methods(self.sort_method_video_title)
@@ -48,9 +47,8 @@ class Themes(listitem.VirtualFS):
def scraper(self):
# Fetch Video Content
url = BASEURL + plugin["url"]
- sourceObj = urlhandler.urlopen(url, 604800) # TTL = 1 Week
- videoItems = parsers.ThemesParser().parse(sourceObj.read())
- sourceObj.close()
+ sourceCode = urlhandler.urlread(url, 604800) # TTL = 1 Week
+ videoItems = parsers.ThemesParser().parse(sourceCode)
# Set Content Properties
self.set_sort_methods(self.sort_method_video_title)
@@ -63,7 +61,7 @@ class SubCat(listitem.VirtualFS):
@plugin.error_handler
def scraper(self):
# Fetch Video Content
- url = "%s/video/theme/" % BASEURL
+ url = u"%s/video/theme/" % BASEURL
sourceCode = urlhandler.urlread(url, 2678400) # TTL = 1 Month
# Set Content Properties
@@ -81,14 +79,14 @@ class SubCat(listitem.VirtualFS):
import re
# Add Current Category
- self.add_item(label="-%s" % plugin["title"],
url={"action":"Videos", "url":plugin["url"]})
+ self.add_item(label=u"-%s" % plugin["title"],
url={"action":"Videos", "url":plugin["url"]})
- for catID in plugin["idlist"].split(","):
+ for catID in plugin["idlist"].split(u","):
# Create listitem of Data
item = localListitem()
# Fetch Title and Set url & action
- url = "/video/id/%s/1" % catID
+ url = u"/video/id/%s/1" % catID
item.setLabel(re.findall('<a href="%s">(.+?)</a>' %
url, sourceCode)[0])
item.setParamDict(action="Videos", url=url)
@@ -102,10 +100,9 @@ class Videos(listitem.VirtualFS):
@plugin.error_handler
def scraper(self):
# Fetch Video Content
- url = BASEURL + plugin["url"].replace(" ","%20")
- sourceObj = urlhandler.urlopen(url, 28800) # TTL = 8 Hours
- videoItems = parsers.VideosParser().parse(sourceObj.read())
- sourceObj.close()
+ url = BASEURL + plugin["url"].replace(u" ",u"%20")
+ sourceCode = urlhandler.urlread(url, 28800) # TTL = 8 Hours
+ videoItems = parsers.VideosParser().parse(sourceCode)
# Set Content Properties
self.set_sort_methods(self.sort_method_date,
self.sort_method_video_title)
@@ -123,6 +120,7 @@ class PlayVideo(listitem.PlayMedia):
import re
# Search sourceCode
- values = plugin.get_params(re.findall("<param
name=\"flashvars\" value='(.+?)'>", sourceCode)[0])
+ test = re.findall("<param name=\"flashvars\" value='(.+?)'>",
sourceCode)[0]
+ values = plugin.get_params(test)
if values["type"] == "rtmp": return {"url":"%s/mp4:%s" %
(values["streamer"], values["file"])}
else: return {"url":values["file"]}
diff --git a/plugin.video.watchmojo/resources/lib/parsers.py
b/plugin.video.watchmojo/resources/lib/parsers.py
index 6f39441..318813a 100644
--- a/plugin.video.watchmojo/resources/lib/parsers.py
+++ b/plugin.video.watchmojo/resources/lib/parsers.py
@@ -53,23 +53,23 @@ class CategorysParser(HTMLParser.HTMLParser):
# Find Each Category Bock
if section == 0:
- if tag == "li" and "class" in attrs and attrs["class"]
== "off":
+ if tag == u"li" and u"class" in attrs and
attrs[u"class"] == u"off":
self.section = 1
- elif tag == "div" and "id" in attrs and attrs["id"] ==
"bar_main":
+ elif tag == u"div" and u"id" in attrs and attrs[u"id"]
== u"bar_main":
raise plugin.ParserError
# Find Each Part within Section Block
elif section >= 1:
- if section == 1 and tag == "a" and "href" in attrs:
- url = attrs["href"]
+ if section == 1 and tag == u"a" and u"href" in attrs:
+ url = attrs[u"href"]
self.item.urlParams["url"] = url
self.section = 101 # Title
url = url[:-2]
- image = url[url.rfind("/")+1:].replace(" ","-")
+ ".png"
+ image = url[url.rfind(u"/")+1:].replace(u"
",u"-") + u".png"
self.item.setThumbnailImage(image, 1)
- elif section == 2 and tag == "a" and "href" in attrs:
- url = attrs["href"]
- self.idList.append(url[url.find("/",
8)+1:][:-2])
+ elif section == 2 and tag == u"a" and u"href" in attrs:
+ url = attrs[u"href"]
+ self.idList.append(url[url.find(u"/",
8)+1:][:-2])
def handle_data(self, data):
# Fetch Category Title when within Section 2
@@ -79,9 +79,9 @@ class CategorysParser(HTMLParser.HTMLParser):
def handle_endtag(self, tag):
# Search for each end tag
- if self.section >= 1 and tag == "ul":
+ if self.section >= 1 and tag == u"ul":
self.section = 0
- self.item.urlParams["idlist"] = ",".join(self.idList)
+ self.item.urlParams["idlist"] = u",".join(self.idList)
self.results.append(self.item.getListitemTuple())
self.reset_lists()
@@ -116,20 +116,20 @@ class ThemesParser(HTMLParser.HTMLParser):
section = self.section
# Find Each Category Bock
- if section == 0 and tag == "div":
- if "class" in attrs and attrs["class"] == "theme_box":
+ if section == 0 and tag == u"div":
+ if u"class" in attrs and attrs[u"class"] ==
u"theme_box":
self.section = 1
- elif "id" in attrs and attrs["id"] == "grid_small":
+ elif u"id" in attrs and attrs[u"id"] == u"grid_small":
raise plugin.ParserError
# Find Each Part within Section Block
elif section >= 1:
- if tag == "img" and "src" in attrs:
- self.item.setThumbnailImage(attrs["src"])
- elif tag == "a" and "class" in attrs and attrs["class"]
== "theme":
- self.item.urlParams["url"] = attrs["href"]
+ if tag == u"img" and u"src" in attrs:
+ self.item.setThumbnailImage(attrs[u"src"])
+ elif tag == u"a" and u"class" in attrs and
attrs[u"class"] == u"theme":
+ self.item.urlParams["url"] = attrs[u"href"]
self.section = 101 # Title
- elif tag == "span":
+ elif tag == u"span":
self.section = 102 # Title with Video Count
def handle_data(self, data):
@@ -138,7 +138,7 @@ class ThemesParser(HTMLParser.HTMLParser):
self.title = data
self.section = 1
elif self.section == 102: # Title with Video Count
- self.item.setLabel("%s (%s)" % (self.title,
data[:data.find(" ")]))
+ self.item.setLabel(u"%s (%s)" % (self.title,
data[:data.find(u" ")]))
self.results.append(self.item.getListitemTuple())
self.reset_lists()
self.section = 0
@@ -156,7 +156,7 @@ class VideosParser(HTMLParser.HTMLParser):
# Proceed with parsing
self.reset_lists()
self.results = []
- try: self.feed(html.replace('_blank"',''))
+ try: self.feed(html.replace(u'_blank"',u''))
except plugin.ParserError: pass
# Return Results
@@ -176,27 +176,27 @@ class VideosParser(HTMLParser.HTMLParser):
# Find Each Category Bock
if section == 0:
- if tag == "a" and "href" in attrs and "class" in attrs
and attrs["class"] == "grid_image":
- self.item.urlParams["url"] = attrs["href"]
+ if tag == u"a" and u"href" in attrs and u"class" in
attrs and attrs[u"class"] == u"grid_image":
+ self.item.urlParams["url"] = attrs[u"href"]
self.section = 1
- elif tag == "div" and "id" in attrs and attrs["id"] ==
"next":
+ elif tag == u"div" and u"id" in attrs and attrs[u"id"]
== u"next":
self.section = -1
# Find Each Part within Section Block
elif section >= 1:
- if tag == "img" and "src" in attrs:
- self.item.setThumbnailImage(attrs["src"])
- elif tag == "span" and "class" in attrs and
attrs["class"] == "adate":
+ if tag == u"img" and u"src" in attrs:
+ self.item.setThumbnailImage(attrs[u"src"])
+ elif tag == u"span" and u"class" in attrs and
attrs[u"class"] == u"adate":
self.section = 101 # Date
- elif tag == "a" and "class" in attrs and attrs["class"]
== "title":
+ elif tag == u"a" and u"class" in attrs and
attrs[u"class"] == u"title":
self.section = 102 # Title
- elif tag == "br":
+ elif tag == u"br":
self.section = 103 # Plot
# Find Next Page
elif section == -1:
- if tag == "a" and "href" in attrs and
attrs["href"].startswith("/video/"):
-
self.results.append(self.item.add_next_page(url={"url":attrs["href"]}))
+ if tag == u"a" and u"href" in attrs and
attrs[u"href"].startswith(u"/video/"):
+
self.results.append(self.item.add_next_page(url={"url":attrs[u"href"]}))
raise plugin.ParserError
else:
raise plugin.ParserError
@@ -211,14 +211,14 @@ class VideosParser(HTMLParser.HTMLParser):
self.item.setLabel(data)
self.section == 1
elif section == 103: # Plot
- if data.startswith("hosted by"): self.section = 1
+ if data.startswith(u"hosted by"): self.section = 1
else:
self.item.infoLabels["plot"] = data.strip()
self.section = 1
def handle_endtag(self, tag):
# Search for each end tag
- if self.section >= 1 and tag == "div":
+ if self.section >= 1 and tag == u"div":
self.section = 0
self.results.append(self.item.getListitemTuple(True))
self.reset_lists()
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=bf34e722f18824a1f13edf2e4d5eb4f066d0250e
commit bf34e722f18824a1f13edf2e4d5eb4f066d0250e
Author: sphere <[email protected]>
Date: Tue Feb 25 09:35:51 2014 +0100
[plugin.video.quake.live] updated to version 1.0.1
diff --git a/plugin.video.quake.live/addon.py b/plugin.video.quake.live/addon.py
index 91d892a..be2c3fe 100644
--- a/plugin.video.quake.live/addon.py
+++ b/plugin.video.quake.live/addon.py
@@ -19,7 +19,7 @@
# Initiate Startup
import xbmcutil
action = xbmcutil.plugin.actions[0]
-if action == "system": xbmcutil.sysCheck()
+if action == u"system": xbmcutil.sysCheck()
else:
# Call Function Based on Action Param
import main as plugin
diff --git a/plugin.video.quake.live/addon.xml
b/plugin.video.quake.live/addon.xml
index baa66f0..fdbc532 100644
--- a/plugin.video.quake.live/addon.xml
+++ b/plugin.video.quake.live/addon.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<addon id="plugin.video.quake.live" name="Quake Live"
provider-name="willforde" version="1.0.0">
+<addon id="plugin.video.quake.live" name="Quake Live"
provider-name="willforde" version="1.0.1">
<requires>
<import addon="xbmc.python" version="2.1.0"/>
- <import addon="script.module.xbmcutil" version="2.0.0"/>
+ <import addon="script.module.xbmcutil" version="2.0.2"/>
</requires>
<extension library="addon.py" point="xbmc.python.pluginsource">
<provides>video</provides>
diff --git a/plugin.video.quake.live/changelog.txt
b/plugin.video.quake.live/changelog.txt
index 8a53bba..fe440e4 100644
--- a/plugin.video.quake.live/changelog.txt
+++ b/plugin.video.quake.live/changelog.txt
@@ -1,2 +1,6 @@
-[B]Version 1.0[/B]
+[B]Version 1.0.1[/B]
+- Added full unicode support
+- Added youtube channel
+
+[B]Version 1.0.0[/B]
- Initial Version
\ No newline at end of file
diff --git a/plugin.video.quake.live/resources/lib/main.py
b/plugin.video.quake.live/resources/lib/main.py
index 854d8b7..412a89c 100644
--- a/plugin.video.quake.live/resources/lib/main.py
+++ b/plugin.video.quake.live/resources/lib/main.py
@@ -23,13 +23,16 @@ class Initialize(listitem.VirtualFS):
@plugin.error_handler
def scraper(self):
# Fetch Video Content
- url =
"http://www.quake-live.tv/data/playlist_MySQL.php?vf=&t=all&v=&s=DESC"
+ url =
u"http://www.quake-live.tv/data/playlist_MySQL.php?vf=&t=all&v=&s=DESC"
sourceObj = urlhandler.urlopen(url, 28800) # TTL = 8 Hours
# Set Content Properties
self.set_sort_methods(self.sort_method_date,
self.sort_method_video_title)
self.set_content("episodes")
+ # Add Youtube Channel
+ self.add_youtube_channel(u"TheQuakeLiveTV")
+
# Fetch and Return VideoItems
return self.xml_scraper(sourceObj)
@@ -42,26 +45,26 @@ class Initialize(listitem.VirtualFS):
# Import XML Parser and Parse sourceObj
import xml.etree.ElementTree as ElementTree
tree = ElementTree.parse(sourceObj).getroot()
- ns = "http://xspf.org/ns/0/"
+ ns = u"http://xspf.org/ns/0/"
sourceObj.close()
# Loop thought earch Show element
- for node in tree.getiterator("{%s}track" % ns):
+ for node in tree.getiterator(u"{%s}track" % ns):
# Create listitem of Data
item = localListitem()
item.setAudioInfo()
item.setQualityIcon(False)
- item.setStreamDict("aspect", 1.78)
- item.setLabel(node.findtext("{%s}title" %
ns).replace("\n","").encode("utf-8"))
- item.setThumbnailImage(node.findtext("{%s}image" %
ns).encode("utf-8"))
- item.setParamDict(url=node.findtext("{%s}location" %
ns).encode("utf-8"), action="system.direct")
+ item.setStreamDict(u"aspect", 1.78)
+ item.setLabel(node.findtext(u"{%s}title" %
ns).replace(u"\n",u""))
+ item.setThumbnailImage(node.findtext(u"{%s}image" % ns))
+ item.setParamDict(url=node.findtext(u"{%s}location" %
ns), action="system.direct")
# Add Date Info
- date = node.findtext("{%s}creator" % ns).replace("\n","
")
- item.setDateInfo(date[date.rfind(" ")+1:], "%m/%d/%y")
+ date = node.findtext(u"{%s}creator" %
ns).replace(u"\n",u" ")
+ item.setDateInfo(date[date.rfind(u" ")+1:], "%m/%d/%y")
# Store Listitem data
additem(item.getListitemTuple(isPlayable=True))
# Return list of listitems
- return results
\ No newline at end of file
+ return results
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=a549b6704136213765ca7c3b97dd8a7a9cb3c407
commit a549b6704136213765ca7c3b97dd8a7a9cb3c407
Author: sphere <[email protected]>
Date: Tue Feb 25 09:35:49 2014 +0100
[plugin.video.metalvideo] updated to version 1.0.1
diff --git a/plugin.video.metalvideo/addon.py b/plugin.video.metalvideo/addon.py
index 91d892a..be2c3fe 100644
--- a/plugin.video.metalvideo/addon.py
+++ b/plugin.video.metalvideo/addon.py
@@ -19,7 +19,7 @@
# Initiate Startup
import xbmcutil
action = xbmcutil.plugin.actions[0]
-if action == "system": xbmcutil.sysCheck()
+if action == u"system": xbmcutil.sysCheck()
else:
# Call Function Based on Action Param
import main as plugin
diff --git a/plugin.video.metalvideo/addon.xml
b/plugin.video.metalvideo/addon.xml
index 85e6247..ec2013d 100644
--- a/plugin.video.metalvideo/addon.xml
+++ b/plugin.video.metalvideo/addon.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<addon id="plugin.video.metalvideo" name="Metalvideo"
provider-name="willforde" version="1.0.0">
+<addon id="plugin.video.metalvideo" name="Metalvideo"
provider-name="willforde" version="1.0.1">
<requires>
<import addon="xbmc.python" version="2.1.0"/>
- <import addon="script.module.xbmcutil" version="2.0.0"/>
+ <import addon="script.module.xbmcutil" version="2.0.2"/>
</requires>
<extension library="addon.py" point="xbmc.python.pluginsource">
- <provides>video</provides>
+ <provides>audio video</provides>
</extension>
<extension point="xbmc.addon.metadata">
<language>en</language>
diff --git a/plugin.video.metalvideo/changelog.txt
b/plugin.video.metalvideo/changelog.txt
index 8a53bba..9e300b7 100644
--- a/plugin.video.metalvideo/changelog.txt
+++ b/plugin.video.metalvideo/changelog.txt
@@ -1,2 +1,8 @@
-[B]Version 1.0[/B]
+[B]Version 1.0.1[/B]
+- Fixed artist needing to be a list of artists in Gotham
+- Changed Addon to show under Music Addons as well as Video Addons
+- Added Ability to save searches
+- Added full unicode support
+
+[B]Version 1.0.0[/B]
- Initial Version
\ No newline at end of file
diff --git a/plugin.video.metalvideo/resources/lib/main.py
b/plugin.video.metalvideo/resources/lib/main.py
index 8aa30df..acd87a3 100644
--- a/plugin.video.metalvideo/resources/lib/main.py
+++ b/plugin.video.metalvideo/resources/lib/main.py
@@ -23,7 +23,7 @@ import re
class Initialize(listitem.VirtualFS):
@plugin.error_handler
def scraper(self):
- url = "http://metalvideo.com/mobile/category.html"
+ url = u"http://metalvideo.com/mobile/category.html"
sourceCode = urlhandler.urlread(url, 604800,
headers={"Cookie":"COOKIE_DEVICE=mobile"}, userAgent=2) # TTL = 1 Week
# Set Content Properties
@@ -40,17 +40,17 @@ class Initialize(listitem.VirtualFS):
localListitem = listitem.ListItem
# Add Extra Items
- self.add_item(label="-Random Video", url={"action":"PlayVideo",
"url":"http://www.metalvideo.com/randomizer.php"}, isPlayable=True)
- self.add_item(label="-Top 50 Videos",
url={"action":"TopVideos", "url":"http://www.metalvideo.com/topvideos.html"},
isPlayable=False)
- self.add_item(label="-Latest Videos",
url={"action":"NewVideos", "url":"http://www.metalvideo.com/newvideos.html"},
isPlayable=False)
- self.add_item(label="-Search", url={"action":"VideoList"},
isPlayable=False)
+ self.add_item(label=u"-Random Video",
url={"action":"PlayVideo", "url":u"http://www.metalvideo.com/randomizer.php"},
isPlayable=True)
+ self.add_item(label=u"-Top 50 Videos",
url={"action":"TopVideos", "url":u"http://www.metalvideo.com/topvideos.html"},
isPlayable=False)
+ self.add_item(label=u"-Latest Videos",
url={"action":"NewVideos", "url":u"http://www.metalvideo.com/newvideos.html"},
isPlayable=False)
+ self.add_search("VideoList",
"http://www.metalvideo.com/search.php?keywords=%s")
# Loop and display each Video
for url, title, count in re.findall('<li class=""><a
href="http://metalvideo.com/mobile/(\S+?)date.html">(.+?)</a>\s+<span
class="category_count">(\d+)</span></li>', sourceCode):
# Create listitem of Data
item = localListitem()
- item.setLabel("%s (%s)" % (title, count))
- item.setParamDict(action="VideoList",
url="http://metalvideo.com/%s" % url)
+ item.setLabel(u"%s (%s)" % (title, count))
+ item.setParamDict(action="VideoList",
url=u"http://metalvideo.com/%s" % url)
# Store Listitem data
additem(item.getListitemTuple(isPlayable=False))
@@ -67,22 +67,22 @@ class TopVideos(listitem.VirtualFS):
# Set Content Properties
self.set_sort_methods(self.sort_method_program_count)
- self.set_content("musicvideos")
+ self.set_content("episodes")
# Fetch and Return VideoItems
return self.regex_scraper(sourceCode)
def regex_selector(self):
# Fetch SourceCode
- url = "http://metalvideo.com/topvideos.html"
+ url = u"http://metalvideo.com/topvideos.html"
sourceCode = urlhandler.urlread(url, 2678400) # TTL = 1 Month
# Fetch list of Top Video Category
- topLists = [part for part in re.findall('<option
value="(\S+?)"\s*>\s*(.+?)\s*</option>', sourceCode) if not "Select one" in
part[1]]
+ topLists = [part for part in re.findall('<option
value="(\S+?)"\s*>\s*(.+?)\s*</option>', sourceCode) if not u"Select one" in
part[1]]
titleList = [part[1] for part in topLists]
# Display list for Selection
- ret = plugin.dialogSelect(plugin.getstr(30600), titleList)
+ ret = plugin.dialogSelect(plugin.getuni(30600), titleList)
if ret >= 0: return topLists[ret][0]
else: raise plugin.ScraperError(0, "User Has Quit the Top
Display")
@@ -97,13 +97,13 @@ class TopVideos(listitem.VirtualFS):
for count, url, img, artist, track, views in
re.findall('<tr>\s+<td align="center" class="row\d">(\d+).</td>\s+<td
align="center" class="row\d" width="\d+"><a href="(\S+?)"><img src="(\S+?)"
alt=".+?" class="tinythumb" width="\d+" height="\d+" align="left" border="1"
/></a></td>\s+<td class="row\d">(.+?)</td>\s+<td class="row\d"><a
href="\S+?">(.+?)</a></td>\s+<td class="row\d">([\d,]+)</td>\s+</tr>',
sourceCode):
# Create listitem of Data
item = localListitem()
- item.setLabel("%s. %s - %s" % (count, artist, track))
+ item.setLabel(u"%s. %s - %s" % (count, artist, track))
item.setThumbnailImage(img)
- item.setInfoDict(artist=artist,
count=intCmd(views.replace(",","")))
+ item.setInfoDict(artist=[artist],
count=intCmd(views.replace(u",",u"")))
item.setParamDict(action="PlayVideo", url=url)
# Add Context item to link to related videos
-
item.addRelatedContext(url=url[url.rfind("_")+1:url.rfind(".")])
+
item.addRelatedContext(url=url[url.rfind(u"_")+1:url.rfind(u".")])
# Store Listitem data
additem(item.getListitemTuple(isPlayable=True))
@@ -119,7 +119,7 @@ class NewVideos(listitem.VirtualFS):
# Set Content Properties
self.set_sort_methods(self.sort_method_unsorted)
- self.set_content("musicvideos")
+ self.set_content("episodes")
# Fetch and Return VideoItems
return self.regex_scraper(sourceCode)
@@ -132,7 +132,7 @@ class NewVideos(listitem.VirtualFS):
# Add Next Page if Exists
nextUrl = re.findall('<a href="(\S+?)">next \xc2\xbb</a>',
sourceCode)
- if nextUrl:
self.add_next_page(url={"url":"http://www.metalvideo.com/%s" % nextUrl[0]})
+ if nextUrl:
self.add_next_page(url={"url":u"http://www.metalvideo.com/%s" % nextUrl[0]})
# Iterate the list of videos
for url, img, artist, track in re.findall('<tr><td
align="center" class="\w+" width="\d+"><a href="(\S+?)"><img src="(\S+?)"
alt=".+?" class="tinythumb" width="\d+" height="\d+" align="left" border="1"
/></a></td><td class="\w+" width="\w+">(.+?)<td class="\w+"><a
href="\S+?">(.+?)</a></td><td class="\w+">.+?</td></tr>', sourceCode):
@@ -141,13 +141,13 @@ class NewVideos(listitem.VirtualFS):
# Create listitem of Data
item = localListitem()
- item.setLabel("%s - %s" % (artist, track))
+ item.setLabel(u"%s - %s" % (artist, track))
item.setThumbnailImage(img)
- item.setInfoDict(artist=artist)
+ item.setInfoDict(artist=[artist])
item.setParamDict(action="PlayVideo", url=url)
# Add Context item to link to related videos
-
item.addRelatedContext(url=url[url.rfind("_")+1:url.rfind(".")])
+
item.addRelatedContext(url=url[url.rfind(u"_")+1:url.rfind(u".")])
# Store Listitem data
additem(item.getListitemTuple(isPlayable=True))
@@ -159,17 +159,17 @@ class Related(listitem.VirtualFS):
@plugin.error_handler
def scraper(self):
# Fetch SourceCode
- url = "http://metalvideo.com/relatedclips.php?vid=%(url)s" %
plugin
- sourceCode = urlhandler.urlread(url, 28800) # TTL = 8 Hours
+ url = u"http://metalvideo.com/relatedclips.php?vid=%(url)s" %
plugin
+ sourceObj = urlhandler.urlopen(url, 28800) # TTL = 8 Hours
# Set Content Properties
self.set_sort_methods(self.sort_method_unsorted)
- self.set_content("musicvideos")
+ self.set_content("episodes")
# Fetch and Return VideoItems
- return self.xml_scraper(sourceCode)
+ return self.xml_scraper(sourceObj)
- def xml_scraper(self, sourceCode):
+ def xml_scraper(self, sourceObj):
# Create Speed vars
results = []
additem = results.append
@@ -177,21 +177,22 @@ class Related(listitem.VirtualFS):
# Import XML Parser and Parse sourceObj
import xml.etree.ElementTree as ElementTree
- tree = ElementTree.fromstring(sourceCode.replace("&","&"))
+ tree =
ElementTree.fromstring(sourceObj.read().replace("&","&"))
+ sourceObj.close()
- # Loop thought earch Show element
- for node in tree.getiterator("video"):
+ # Loop through each Show element
+ for node in tree.getiterator(u"video"):
# Create listitem of Data
item = localListitem()
- item.setLabel(node.findtext("title").encode("utf-8"))
-
item.setThumbnailImage(node.findtext("thumb").encode("utf-8"))
+ item.setLabel(node.findtext(u"title"))
+ item.setThumbnailImage(node.findtext(u"thumb"))
# Add url Param
- url = node.findtext("url").encode("utf-8")
+ url = node.findtext(u"url")
item.setParamDict(action="PlayVideo", url=url)
# Add Context item to link to related videos
-
item.addRelatedContext(url=url[url.rfind("_")+1:url.rfind(".")],
updatelisting="true")
+
item.addRelatedContext(url=url[url.rfind(u"_")+1:url.rfind(u".")],
updatelisting="true")
# Store Listitem data
additem(item.getListitemTuple(isPlayable=True))
@@ -202,17 +203,18 @@ class Related(listitem.VirtualFS):
class VideoList(listitem.VirtualFS):
@plugin.error_handler
def scraper(self):
- # Fetch SourceCode
- if "url" in plugin:
- # Fetch Sort Method and Crerate New Url
- urlString = {"0":"%sdate.html", "1":"%sartist.html",
"2":"%srating.html", "3":"%sviews.html"}[plugin.getSetting("sort")]
+ # Fetch Sort Method and Crerate New Url
+ if u"search.php" in plugin["url"]: url = plugin["url"]
+ else:
+ urlString = {u"0":u"%sdate.html",
u"1":u"%sartist.html", u"2":u"%srating.html",
u"3":u"%sviews.html"}[plugin.getSetting("sort")]
url = urlString % plugin["url"]
- else: url =
urlhandler.search("http://www.metalvideo.com/search.php?keywords=%s");
self.cacheToDisc= True
+
+ # Fetch SourceCode
sourceCode = urlhandler.urlread(url, 28800) # TTL = 8 Hours
# Set Content Properties
self.set_sort_methods(self.sort_method_unsorted)
- self.set_content("musicvideos")
+ self.set_content("episodes")
# Fetch and Return VideoItems
return self.regex_scraper(sourceCode)
@@ -226,23 +228,22 @@ class VideoList(listitem.VirtualFS):
# Add Next Page if Exists
nextUrl = re.findall('<a href="(\S+?)">next \xc2\xbb</a>',
sourceCode)
- if nextUrl:
self.add_next_page(url={"url":"http://www.metalvideo.com/%s" % nextUrl[0]})
+ if nextUrl:
self.add_next_page(url={"url":u"http://www.metalvideo.com/%s" % nextUrl[0]})
# Iterate the list of videos
searchUrl = re.compile('<a href="(\S+?)">')
searchImg = re.compile('<img src="(\S+?)"')
searchSong = re.compile('<span class="song_name">(.+?)</span>')
searchArtist = re.compile('<span
class="artist_name">(.+?)</span>')
- for htmlSegment in CommonFunctions.parseDOM(sourceCode, "li",
{"class":"video"}):
- # Convert String Encoding
- htmlSegment = htmlSegment.encode("utf8")
+ for htmlSegment in CommonFunctions.parseDOM(sourceCode, u"li",
{u"class":u"video"}):
+ # Fetch artist and url
artist = searchArtist.findall(htmlSegment)[0]
url = searchUrl.findall(htmlSegment)[0]
# Create listitem of Data
item = localListitem()
- item.setLabel("%s - %s" % (artist,
searchSong.findall(htmlSegment)[0]))
- item.setInfoDict(artist=artist)
+ item.setLabel(u"%s - %s" % (artist,
searchSong.findall(htmlSegment)[0]))
+ item.setInfoDict(artist=[artist])
item.setParamDict(action="PlayVideo", url=url)
# Set Thumbnail Image
@@ -250,7 +251,7 @@ class VideoList(listitem.VirtualFS):
if image: item.setThumbnailImage(image[0])
# Add Context item to link to related videos
-
item.addRelatedContext(url=url[url.rfind("_")+1:url.rfind(".")])
+
item.addRelatedContext(url=url[url.rfind(u"_")+1:url.rfind(u".")])
# Store Listitem data
additem(item.getListitemTuple(isPlayable=True))
@@ -262,14 +263,14 @@ class PlayVideo(listitem.PlayMedia):
@plugin.error_handler
def resolve(self):
# Set TTL
- if plugin["url"].endswith("randomizer.php"): TTL=0
+ if plugin["url"].endswith(u"randomizer.php"): TTL=0
else: TTL=604800 # TTL = 1 Week
# Fetch Page Source
- sourceCode = urlhandler.urlread(plugin["url"], TTL) # TTL = 8
Hours
+ sourceCode = urlhandler.urlread(plugin["url"], TTL)
from xbmcutil import videoResolver
# Look for Youtube Video First
videoId = [part for part in
re.findall('src="(http://www.youtube.com/embed/\S+?)"|file:\s+\'(\S+?)\'',
sourceCode)[0] if part][0]
- if "www.metalvideo.com" in videoId: return {"url":videoId}
- else: return videoResolver.youtube_com().decode(videoId)
+ if u"metalvideo.com" in videoId: return {"url":videoId}
+ elif u"youtube.com" in videoId: return
videoResolver.youtube_com().decode(videoId)
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=400ff308e14378938d4dc54138c0e97b08bb9748
commit 400ff308e14378938d4dc54138c0e97b08bb9748
Author: sphere <[email protected]>
Date: Tue Feb 25 09:35:47 2014 +0100
[plugin.video.johnlocker] updated to version 1.0.1
diff --git a/plugin.video.johnlocker/addon.py b/plugin.video.johnlocker/addon.py
index 91d892a..be2c3fe 100644
--- a/plugin.video.johnlocker/addon.py
+++ b/plugin.video.johnlocker/addon.py
@@ -19,7 +19,7 @@
# Initiate Startup
import xbmcutil
action = xbmcutil.plugin.actions[0]
-if action == "system": xbmcutil.sysCheck()
+if action == u"system": xbmcutil.sysCheck()
else:
# Call Function Based on Action Param
import main as plugin
diff --git a/plugin.video.johnlocker/addon.xml
b/plugin.video.johnlocker/addon.xml
index 48253a8..2bf1a94 100644
--- a/plugin.video.johnlocker/addon.xml
+++ b/plugin.video.johnlocker/addon.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<addon id="plugin.video.johnlocker" name="JohnLocker"
provider-name="willforde" version="1.0.0">
+<addon id="plugin.video.johnlocker" name="JohnLocker"
provider-name="willforde" version="1.0.1">
<requires>
<import addon="xbmc.python" version="2.1.0"/>
- <import addon="script.module.xbmcutil" version="2.0.0"/>
+ <import addon="script.module.xbmcutil" version="2.0.2"/>
</requires>
<extension library="addon.py" point="xbmc.python.pluginsource">
<provides>video</provides>
@@ -11,6 +11,7 @@
<language>en</language>
<platform>all</platform>
<summary lang="en">JohnLocker, Anonymous online
education.</summary>
+ <description lang="en">JohnLocker, Anonymous online education
and documentaries.</description>
<license>GNU GENERAL PUBLIC LICENSE. Version 3, June
2007</license>
<email>[email protected]</email>
<forum>http://forum.xbmc.org/showthread.php?tid=178796</forum>
diff --git a/plugin.video.johnlocker/changelog.txt
b/plugin.video.johnlocker/changelog.txt
index 8a53bba..0d8a189 100644
--- a/plugin.video.johnlocker/changelog.txt
+++ b/plugin.video.johnlocker/changelog.txt
@@ -1,2 +1,5 @@
-[B]Version 1.0[/B]
+[B]Version 1.0.1[/B]
+- Added full unicode support
+
+[B]Version 1.0.0[/B]
- Initial Version
\ No newline at end of file
diff --git a/plugin.video.johnlocker/resources/lib/main.py
b/plugin.video.johnlocker/resources/lib/main.py
index ca4cace..948ea7c 100644
--- a/plugin.video.johnlocker/resources/lib/main.py
+++ b/plugin.video.johnlocker/resources/lib/main.py
@@ -23,7 +23,7 @@ class Initialize(listitem.VirtualFS):
@plugin.error_handler
def scraper(self):
# Fetch List of Revision3 Shows
- url =
"http://johnlocker.com/home/main?mlvd=oc&mmvd=oc&mhrvd=oc&mfvd=oc"
+ url =
u"http://johnlocker.com/home/main?mlvd=oc&mmvd=oc&mhrvd=oc&mfvd=oc"
sourceCode = urlhandler.urlread(url, 2678400) # TTL = 1 Month
# Set Content Properties
@@ -40,21 +40,18 @@ class Initialize(listitem.VirtualFS):
localListitem = listitem.ListItem
# Add Extra Items
- #self.add_item("-Channels", thumbnail=("channels.jpg",1),
url={"action":"Channels", "url":"http://johnlocker.com/home/channel"})
- self.add_item("-Most Recent", thumbnail=("latest.png",1),
url={"action":"Videos",
"url":"http://johnlocker.com/home/main?mlvd=oc&mmvd=oc&mhrvd=oc&mfvd=oc",
"section":"latestvideos"})
- self.add_item("-Most viewed", thumbnail=("viewed.jpg",1),
url={"action":"Videos",
"url":"http://johnlocker.com/home/main?mlvd=oc&mmvd=oc&mhrvd=oc&mfvd=oc",
"section":"mostviewed"})
- self.add_item("-Highest rated", thumbnail=("rated.jpg",1),
url={"action":"Videos",
"url":"http://johnlocker.com/home/main?mlvd=oc&mmvd=oc&mhrvd=oc&mfvd=oc",
"section":"highestrated"})
- self.add_item("-Featured", thumbnail=("featured.png",1),
url={"action":"Videos",
"url":"http://johnlocker.com/home/main?mlvd=oc&mmvd=oc&mhrvd=oc&mfvd=oc",
"section":"featured"})
+ #self.add_item(u"-Channels", thumbnail=(u"channels.jpg",1),
url={"action":"Channels", "url":"http://johnlocker.com/home/channel"})
+ self.add_item(u"-Most Recent", thumbnail=(u"latest.png",1),
url={"action":"Videos",
"url":"http://johnlocker.com/home/main?mlvd=oc&mmvd=oc&mhrvd=oc&mfvd=oc",
"section":"latestvideos"})
+ self.add_item(u"-Most viewed", thumbnail=(u"viewed.jpg",1),
url={"action":"Videos",
"url":"http://johnlocker.com/home/main?mlvd=oc&mmvd=oc&mhrvd=oc&mfvd=oc",
"section":"mostviewed"})
+ self.add_item(u"-Highest rated", thumbnail=(u"rated.jpg",1),
url={"action":"Videos",
"url":"http://johnlocker.com/home/main?mlvd=oc&mmvd=oc&mhrvd=oc&mfvd=oc",
"section":"highestrated"})
+ self.add_item(u"-Featured", thumbnail=(u"featured.png",1),
url={"action":"Videos",
"url":"http://johnlocker.com/home/main?mlvd=oc&mmvd=oc&mhrvd=oc&mfvd=oc",
"section":"featured"})
# Loop and display each Video
import CommonFunctions, re
searchUrlTitle = re.compile('<a
href="(http://johnlocker.com/home/category/videos/\d+)"
style="font-weight:bold;">\s+(.+?)\s+</a>')
searchImg = re.compile('<img class="listedvideolistthumbnailmc"
src="(http://johnlocker.com/categories/\S+.jpg)"')
- sectionCat = CommonFunctions.parseDOM(sourceCode, "div",
{"id":"categories"})
- for htmlSegment in CommonFunctions.parseDOM(sectionCat, "div",
{"class":"listedvideolistvideomc"}):
- # Convert String Encoding
- htmlSegment = htmlSegment.encode("utf8")
-
+ sectionCat = CommonFunctions.parseDOM(sourceCode, u"div",
{u"id":u"categories"})
+ for htmlSegment in CommonFunctions.parseDOM(sectionCat, u"div",
{u"class":u"listedvideolistvideomc"}):
# Fetch Url and Title
url, title = searchUrlTitle.findall(htmlSegment)[0]
@@ -62,7 +59,7 @@ class Initialize(listitem.VirtualFS):
item = localListitem()
item.setLabel(title)
item.setThumbnailImage(searchImg.findall(htmlSegment)[0])
- item.setParamDict(action="Videos", url="%s?cvld=oc" %
url)
+ item.setParamDict(action="Videos", url=u"%s?cvld=oc" %
url)
# Store Listitem data
additem(item.getListitemTuple(isPlayable=False))
@@ -94,11 +91,8 @@ class Channels(listitem.VirtualFS):
import CommonFunctions, re
searchUrlTitle = re.compile('<div class="channelitemtitle"><a
href="(http://johnlocker.com/home/channel/\d+)">(.+?)</a>')
searchImg = re.compile('<img class="channelitemimage"
src="(http://johnlocker.com/\S+\.jpg)"')
- for htmlSegment in CommonFunctions.parseDOM(sourceCode, "div",
{"class":"channelitem"}):
- # Convert String Encoding
- htmlSegment = htmlSegment.encode("utf8")
-
- img = re.findall('<img class="channelitemimage"
src="(http://johnlocker.com/\S+\.jpg)"', htmlSegment)
+ for htmlSegment in CommonFunctions.parseDOM(sourceCode, u"div",
{u"class":u"channelitem"}):
+ img = searchImg.findall(htmlSegment)
if img: img = img[0]
else: continue
@@ -124,7 +118,7 @@ class Videos(listitem.VirtualFS):
sourceCode = urlhandler.urlread(plugin["url"], 28800) # TTL = 8
Hours
# Set Content Properties
- if "section" in plugin and plugin["section"] == "mostviewed":
self.set_sort_methods(self.sort_method_program_count, self.sort_method_date,
self.sort_method_video_runtime, self.sort_method_title)
+ if "section" in plugin and plugin["section"] == u"mostviewed":
self.set_sort_methods(self.sort_method_program_count, self.sort_method_date,
self.sort_method_video_runtime, self.sort_method_title)
else: self.set_sort_methods(self.sort_method_date,
self.sort_method_video_runtime, self.sort_method_program_count,
self.sort_method_title)
self.set_content("episodes")
@@ -140,9 +134,9 @@ class Videos(listitem.VirtualFS):
# Restrict to Selected Section and Add Next Page
import CommonFunctions, re
- if "section" in plugin: sourceCode =
CommonFunctions.parseDOM(sourceCode, "div", {"id":plugin["section"]})[0]
+ if "section" in plugin: sourceCode =
CommonFunctions.parseDOM(sourceCode, u"div", {u"id":plugin["section"]})[0]
nextUrl = re.findall('<a class="pagination"
href="(\S+?)">Next</a>', sourceCode)
- if nextUrl:
self.add_next_page(url={"url":"http://johnlocker.com%s&mlvd=oc&mmvd=oc&mhrvd=oc&mfvd=oc&cvld=oc"
% nextUrl[0], "section":plugin.get("section","")})
+ if nextUrl:
self.add_next_page(url={"url":u"http://johnlocker.com%s&mlvd=oc&mmvd=oc&mhrvd=oc&mfvd=oc&cvld=oc"
% nextUrl[0], "section":plugin.get("section","")})
# Loop and display each Video
searchUrl = re.compile('<a
href="(http://johnlocker.com/home/video/\S+?)"')
@@ -152,10 +146,7 @@ class Videos(listitem.VirtualFS):
searchTime = re.compile('<div
class="listedvideolistfootdivoc">\s+Added date: \d+-\d+-\d+\s+-
Duration:(.+?)\s+</div>')
searchImg = re.compile('<img class="listedvideolistthumbnailoc"
src="(http://\S+?)"')
searchViews = re.compile('<div
class="clear"></div>\s+</div>\s+Views : (\d+)\s+</div>')
- for htmlSegment in CommonFunctions.parseDOM(sourceCode, "div",
{"class":"listedvideolistvideooc"}):
- # Convert String Encoding
- htmlSegment = htmlSegment.encode("utf8")
-
+ for htmlSegment in CommonFunctions.parseDOM(sourceCode, u"div",
{u"class":u"listedvideolistvideooc"}):
# Create listitem of Data
item = localListitem()
item.setLabel(searchTitle.findall(htmlSegment)[0])
@@ -177,7 +168,7 @@ class Videos(listitem.VirtualFS):
except: pass
# Add Context item to link to related videos
- item.addRelatedContext(url="%s?rvds=oc" % url)
+ item.addRelatedContext(url=u"%s?rvds=oc" % url)
# Store Listitem data
additem(item.getListitemTuple(isPlayable=True))
@@ -213,10 +204,7 @@ class Related(listitem.VirtualFS):
searchTime = re.compile('<div
class="watchpagelistdurationdivmc">\s*(\d+:\d+:\d+)\s+</div>')
searchImg = re.compile('<img class="videothumbscv"
src="(http://\S+?)"')
searchViews =
re.compile('<div\s+class="watchpagelistviewsdiv">\s+Views: (\d+)\s+</div>')
- for htmlSegment in CommonFunctions.parseDOM(sourceCode, "div",
{"class":"relatedvideoslistrow"}):
- # Convert String Encoding
- htmlSegment = htmlSegment.encode("utf8")
-
+ for htmlSegment in CommonFunctions.parseDOM(sourceCode, u"div",
{u"class":u"relatedvideoslistrow"}):
# Create listitem of Data
item = localListitem()
item.setLabel(searchTitle.findall(htmlSegment)[0])
@@ -236,7 +224,7 @@ class Related(listitem.VirtualFS):
except: pass
# Add Context item to link to related videos
- item.addRelatedContext(url="%s?rvds=oc" % url,
updatelisting="true")
+ item.addRelatedContext(url=u"%s?rvds=oc" % url,
updatelisting="true")
# Store Listitem data
additem(item.getListitemTuple(isPlayable=True))
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=8a9d8838159901812f7d116b9e8aa619dd940c7b
commit 8a9d8838159901812f7d116b9e8aa619dd940c7b
Author: sphere <[email protected]>
Date: Tue Feb 25 09:35:44 2014 +0100
[plugin.video.engineeringtv] updated to version 1.0.1
diff --git a/plugin.video.engineeringtv/addon.py
b/plugin.video.engineeringtv/addon.py
index 91d892a..be2c3fe 100644
--- a/plugin.video.engineeringtv/addon.py
+++ b/plugin.video.engineeringtv/addon.py
@@ -19,7 +19,7 @@
# Initiate Startup
import xbmcutil
action = xbmcutil.plugin.actions[0]
-if action == "system": xbmcutil.sysCheck()
+if action == u"system": xbmcutil.sysCheck()
else:
# Call Function Based on Action Param
import main as plugin
diff --git a/plugin.video.engineeringtv/addon.xml
b/plugin.video.engineeringtv/addon.xml
index b5bad32..baefd59 100644
--- a/plugin.video.engineeringtv/addon.xml
+++ b/plugin.video.engineeringtv/addon.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<addon id="plugin.video.engineeringtv" name="Engineering TV"
provider-name="willforde" version="1.0.0">
+<addon id="plugin.video.engineeringtv" name="Engineering TV"
provider-name="willforde" version="1.0.1">
<requires>
<import addon="xbmc.python" version="2.1.0"/>
- <import addon="script.module.xbmcutil" version="2.0.0"/>
+ <import addon="script.module.xbmcutil" version="2.0.2"/>
</requires>
<extension library="addon.py" point="xbmc.python.pluginsource">
<provides>video</provides>
diff --git a/plugin.video.engineeringtv/changelog.txt
b/plugin.video.engineeringtv/changelog.txt
index 8a53bba..d8846fe 100644
--- a/plugin.video.engineeringtv/changelog.txt
+++ b/plugin.video.engineeringtv/changelog.txt
@@ -1,2 +1,10 @@
-[B]Version 1.0[/B]
+[B]Version 1.0.1[/B]
+- Fixed Video Url Scraper After Site Changed, Now Has Better Video Quality
+- Added a Fallback Video Scraper if main Scraper Failes
+- Added Search with Save Searches Support
+- Added Support for Related Videos
+- Added Full Unicode Support
+- Changed print with xbmc.log
+
+[B]Version 1.0.0[/B]
- Initial Version
\ No newline at end of file
diff --git a/plugin.video.engineeringtv/resources/lib/main.py
b/plugin.video.engineeringtv/resources/lib/main.py
index f99255e..26c49ed 100644
--- a/plugin.video.engineeringtv/resources/lib/main.py
+++ b/plugin.video.engineeringtv/resources/lib/main.py
@@ -23,15 +23,18 @@ class Initialize(listitem.VirtualFS):
@plugin.error_handler
def scraper(self):
# Fetch SourceCode of Site
- url = "http://www.engineeringtv.com/pages/about.us"
+ url = u"http://www.engineeringtv.com/pages/about.us"
sourceCode = urlhandler.urlread(url, 2678400) # TTL = 1 Week
+ # Add Search Page
+ self.add_search("Videos", u"/search/?search=%s")
+
# Set Content Properties
self.set_sort_methods(self.sort_method_unsorted)
self.set_content("files")
# Fetch and Return VideoItems
- self.add_youtube_channel("engineeringtv")
+ self.add_youtube_channel(u"engineeringtv")
return self.regex_scraper(sourceCode)
def regex_scraper(self, sourceCode):
@@ -46,7 +49,7 @@ class Initialize(listitem.VirtualFS):
# Create listitem of Data
item = localListitem()
item.setLabel(title)
- item.setThumbnailImage("%s.jpg" % url, 1)
+ item.setThumbnailImage(u"%s.jpg" % url, 1)
item.setParamDict(action="Videos", subaction="subcat",
url=url)
# Store Listitem data
@@ -59,19 +62,19 @@ class Videos(listitem.VirtualFS):
@plugin.error_handler
def scraper(self):
# Decide on to Show sub Categories or directly show videos
- if plugin.get("subaction") == "subcat": return
self.subCategories(plugin["url"])
+ if plugin.get("subaction",u"") == u"subcat": return
self.subCategories(plugin["url"])
else: return self.videoList(plugin["url"])
def subCategories(self, catID):
# Fetch SourceCode
- url = "http://www.engineeringtv.com/pages/%s" % catID
+ url = u"http://www.engineeringtv.com/pages/%s" % catID
sourceCode = urlhandler.urlread(url, 2678400) # TTL = 1 Week
# Fetch List of Sub Categories
import CommonFunctions, re
searchID = re.compile('href="/feed/magnify.rss/(\S+?)"')
- sources = CommonFunctions.parseDOM(sourceCode, "div",
{"class":"mvp_page_title_expressive clearfix"})
- if len(sources) == 1: return
self.videoList("/watch/playlist/%s" % searchID.findall(sources[0])[0])
+ sources = CommonFunctions.parseDOM(sourceCode, u"div",
{u"class":u"mvp_page_title_expressive clearfix"})
+ if len(sources) == 1: return
self.videoList(u"/watch/playlist/%s" % searchID.findall(sources[0])[0])
else:
# Set Content Properties
self.set_sort_methods(self.sort_method_unsorted)
@@ -84,13 +87,10 @@ class Videos(listitem.VirtualFS):
# Loop and display each source
for htmlSegment in sources:
- # Convert String Encoding
- htmlSegment = htmlSegment.encode("utf8")
-
# Create listitem of Data
item = localListitem()
-
item.setLabel(htmlSegment[htmlSegment.rfind("</div>")+6:].strip().title())
- item.setParamDict(action="Videos",
url="/watch/playlist/%s" % searchID.findall(htmlSegment)[0])
+
item.setLabel(htmlSegment[htmlSegment.rfind(u"</div>")+6:].strip().title())
+ item.setParamDict(action="Videos",
url=u"/watch/playlist/%s" % searchID.findall(htmlSegment)[0])
# Store Listitem data
additem(item.getListitemTuple(isPlayable=False))
@@ -100,7 +100,8 @@ class Videos(listitem.VirtualFS):
def videoList(self, playlistID):
# Fetch SourceCode
- url = "http://www.engineeringtv.com%s" % playlistID
+ if playlistID.startswith(u"?search="): url =
u"http://www.engineeringtv.com/search/%s" % playlistID
+ else: url = u"http://www.engineeringtv.com%s" % playlistID
sourceCode = urlhandler.urlread(url, 28800) # TTL = 8 Hours
# Set Content Properties
@@ -118,10 +119,11 @@ class Videos(listitem.VirtualFS):
searchUrl = re.compile('<a href="(\S+?)"')
searchImg = re.compile("background-image: url\('(\S+?)'\)")
nextUrl = re.findall('<a class="mvp-pagenum-next
mvp-pagenum-pagelink" href="(\S+?)">', sourceCode)
- if nextUrl: self.add_next_page(url={"url":nextUrl[0]},
infoType="video")
- for htmlSegment in CommonFunctions.parseDOM(sourceCode, "div",
{"class":"mvp_grid_panel_4"}):
- # Convert String Encoding
- htmlSegment = htmlSegment.encode("utf8")
+ if nextUrl: self.add_next_page(url={"url":nextUrl[0]})
+ for htmlSegment in CommonFunctions.parseDOM(sourceCode, u"div",
{u"class":u"mvp_grid_panel_\d"}):
+ # Fetch url
+ url = searchUrl.findall(htmlSegment)[0]
+ url = url[url.rfind("/video/"):]
# Create listitem of Data
item = localListitem()
@@ -129,7 +131,57 @@ class Videos(listitem.VirtualFS):
item.setQualityIcon(False)
item.setLabel(searchTitle.findall(htmlSegment)[0])
item.setThumbnailImage(searchImg.findall(htmlSegment)[0])
- item.setParamDict(action="PlayVideo",
url=searchUrl.findall(htmlSegment)[0])
+ item.setParamDict(action="PlayVideo", url=url)
+
+ # Add Context item to link to related videos
+ item.addRelatedContext(url=url)
+
+ # Store Listitem data
+ additem(item.getListitemTuple(isPlayable=True))
+
+ # Return list of listitems
+ return results
+
+class Related(listitem.VirtualFS):
+ @plugin.error_handler
+ def scraper(self):
+ # Fetch SourceCode of Site
+ url = u"http://www.engineeringtv.com%(url)s" % plugin
+ sourceCode = urlhandler.urlread(url, 28800) # TTL = 8 Hours
+
+ # Set Content Properties
+ self.set_sort_methods(self.sort_method_unsorted)
+ self.set_content("episodes")
+
+ # Fetch and Return VideoItems
+ return self.regex_scraper(sourceCode)
+
+ def regex_scraper(self, sourceCode):
+ # Create Speed vars
+ results = []
+ additem = results.append
+ localListitem = listitem.ListItem
+
+ # Loop and display each Video
+ import CommonFunctions, re
+ searchTitle = re.compile('title="(.+?)"')
+ searchUrl = re.compile('<a href="(\S+?)"')
+ searchImg = re.compile("background-image: url\('(http\S+?)'\)")
+ for htmlSegment in CommonFunctions.parseDOM(sourceCode, u"div",
{u"class":u"magnify-widget-playlist-item"}):
+ # Fetch url
+ url = searchUrl.findall(htmlSegment)[0]
+ url = url[url.rfind("/video/"):]
+
+ # Create listitem of Data
+ item = localListitem()
+ item.setAudioInfo()
+ item.setQualityIcon(False)
+ item.setLabel(searchTitle.findall(htmlSegment)[0])
+
item.setThumbnailImage(searchImg.findall(htmlSegment)[0])
+ item.setParamDict(action="PlayVideo", url=url)
+
+ # Add Context item to link to related videos
+ item.addRelatedContext(url=url, updatelisting="true")
# Store Listitem data
additem(item.getListitemTuple(isPlayable=True))
@@ -140,10 +192,29 @@ class Videos(listitem.VirtualFS):
class PlayVideo(listitem.PlayMedia):
@plugin.error_handler
def resolve(self):
- # Fetch SourceCode of Site
+ # Call Needed Imports
import re
- url = "http://www.engineeringtv.com%(url)s" % plugin
- sourceCode = urlhandler.urlread(url, 86400) # TTL = 24 Hours
- url = re.findall('link=(\S+?)" autoplay controls poster',
sourceCode)[0]
- if url.endswith("\\"): return {"type":"video/mp4",
"url":url[:-1]}
- else: return {"type":"video/mp4", "url":url}
+
+ try:
+ # Fetch SourceCode of Site
+ url = u"http://www.engineeringtv.com%(url)s/player" %
plugin
+ sourceCode = urlhandler.urlread(url, 1800) # TTL = 30
Mins
+
+ # Fetch Query String with video id
+ queryString = re.findall("queryString\s*=\s*'(\S+?)'",
sourceCode)[0]
+ url =
u"http://www.engineeringtv.com/embed/player/container/300/300/?%s" % queryString
+ sourceCode = urlhandler.urlread(url, 1800) # TTL = 30
Mins
+
+ # Fetch Video Url
+ videoUrl =
re.findall('"pipeline_xid"\s*:\s*"(http://videos\.\S+?)"', sourceCode)[0]
+ return {"type":u"video/mp4", "url":videoUrl}
+
+ except:
+ # Fetch SourceCode of Site
+ url = u"http://www.engineeringtv.com%(url)s" % plugin
+ sourceCode = urlhandler.urlread(url, 86400) # TTL = 24
Hours
+
+ # Fetch Video Url
+ try: url =
re.findall('src=\\\\"(http://videos\.cache\.magnify\.net/\S+?)\\\\" autoplay
controls poster', sourceCode)[0]
+ except: return None
+ else: return {"type":u"video/mp4", "url":url}
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=ce753c08be2b462a4a555ba4bf114a6d7a16e026
commit ce753c08be2b462a4a555ba4bf114a6d7a16e026
Author: sphere <[email protected]>
Date: Tue Feb 25 09:35:41 2014 +0100
[plugin.video.enemy.territory] updated to version 1.0.1
diff --git a/plugin.video.enemy.territory/addon.py
b/plugin.video.enemy.territory/addon.py
index 91d892a..be2c3fe 100644
--- a/plugin.video.enemy.territory/addon.py
+++ b/plugin.video.enemy.territory/addon.py
@@ -19,7 +19,7 @@
# Initiate Startup
import xbmcutil
action = xbmcutil.plugin.actions[0]
-if action == "system": xbmcutil.sysCheck()
+if action == u"system": xbmcutil.sysCheck()
else:
# Call Function Based on Action Param
import main as plugin
diff --git a/plugin.video.enemy.territory/addon.xml
b/plugin.video.enemy.territory/addon.xml
index f5bf190..a49a376 100644
--- a/plugin.video.enemy.territory/addon.xml
+++ b/plugin.video.enemy.territory/addon.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<addon id="plugin.video.enemy.territory" name="Enemy Territory"
provider-name="willforde" version="1.0.0">
+<addon id="plugin.video.enemy.territory" name="Enemy Territory"
provider-name="willforde" version="1.0.1">
<requires>
<import addon="xbmc.python" version="2.1.0"/>
- <import addon="script.module.xbmcutil" version="2.0.0"/>
+ <import addon="script.module.xbmcutil" version="2.0.2"/>
</requires>
<extension library="addon.py" point="xbmc.python.pluginsource">
<provides>video</provides>
@@ -11,6 +11,7 @@
<language>en</language>
<platform>all</platform>
<summary lang="en">Enemy Territory, Archived Enemy Territory
Matchs.</summary>
+ <description lang="en">Enemy Territory, Archived Enemy
Territory Matchs.</description>
<license>GNU GENERAL PUBLIC LICENSE. Version 3, June
2007</license>
<email>[email protected]</email>
<forum>http://forum.xbmc.org/showthread.php?tid=178789</forum>
diff --git a/plugin.video.enemy.territory/changelog.txt
b/plugin.video.enemy.territory/changelog.txt
index 8a53bba..4b377dd 100644
--- a/plugin.video.enemy.territory/changelog.txt
+++ b/plugin.video.enemy.territory/changelog.txt
@@ -1,2 +1,5 @@
-[B]Version 1.0[/B]
+[B]Version 1.0.1[/B]
+- Added Full Unicode Support
+
+[B]Version 1.0.0[/B]
- Initial Version
\ No newline at end of file
diff --git a/plugin.video.enemy.territory/resources/lib/main.py
b/plugin.video.enemy.territory/resources/lib/main.py
index 50e6e2c..3f01097 100644
--- a/plugin.video.enemy.territory/resources/lib/main.py
+++ b/plugin.video.enemy.territory/resources/lib/main.py
@@ -23,7 +23,7 @@ class Initialize(listitem.VirtualFS):
@plugin.error_handler
def scraper(self):
# Fetch Video Content
- url =
"http://enemyterritory.sectornetwork.com/data/playlist_MySQL.php?t=all&v=all&s=DESC&289"
+ url =
u"http://enemyterritory.sectornetwork.com/data/playlist_MySQL.php?t=all&v=all&s=DESC&289"
sourceObj = urlhandler.urlopen(url, 28800) # TTL = 8 Hours
# Set Content Properties
@@ -42,22 +42,22 @@ class Initialize(listitem.VirtualFS):
# Import XML Parser and Parse sourceObj
import xml.etree.ElementTree as ElementTree
tree = ElementTree.parse(sourceObj).getroot()
- ns = "http://xspf.org/ns/0/"
+ ns = u"http://xspf.org/ns/0/"
sourceObj.close()
# Loop thought earch Show element
- for node in tree.getiterator("{%s}track" % ns):
+ for node in tree.getiterator(u"{%s}track" % ns):
# Create listitem of Data
item = localListitem()
item.setAudioInfo()
item.setQualityIcon(False)
- item.setLabel(node.findtext("{%s}title" %
ns).encode("utf-8"))
- item.setThumbnailImage(node.findtext("{%s}image" %
ns).encode("utf-8"))
- item.setParamDict(url=node.findtext("{%s}location" %
ns).encode("utf-8"), action="system.direct")
+ item.setLabel(node.findtext(u"{%s}title" % ns))
+ item.setThumbnailImage(node.findtext(u"{%s}image" % ns))
+ item.setParamDict(url=node.findtext(u"{%s}location" %
ns), action="system.direct")
# Add Date Info
- date = node.findtext("{%s}creator" % ns).replace("\n","
")
- item.setDateInfo(date[date.rfind(" ")+1:], "%m/%d/%Y")
+ date = node.findtext(u"{%s}creator" %
ns).replace(u"\n",u" ")
+ item.setDateInfo(date[date.rfind(u" ")+1:], "%m/%d/%Y")
# Store Listitem data
additem(item.getListitemTuple(isPlayable=True))
-----------------------------------------------------------------------
Summary of changes:
plugin.video.enemy.territory/addon.py | 2 +-
plugin.video.enemy.territory/addon.xml | 5 +-
plugin.video.enemy.territory/changelog.txt | 5 +-
plugin.video.enemy.territory/resources/lib/main.py | 16 ++--
plugin.video.engineeringtv/addon.py | 2 +-
plugin.video.engineeringtv/addon.xml | 4 +-
plugin.video.engineeringtv/changelog.txt | 10 ++-
plugin.video.engineeringtv/resources/lib/main.py | 119 ++++++++++++++++----
plugin.video.johnlocker/addon.py | 2 +-
plugin.video.johnlocker/addon.xml | 5 +-
plugin.video.johnlocker/changelog.txt | 5 +-
plugin.video.johnlocker/resources/lib/main.py | 48 +++-----
plugin.video.metalvideo/addon.py | 2 +-
plugin.video.metalvideo/addon.xml | 6 +-
plugin.video.metalvideo/changelog.txt | 8 +-
plugin.video.metalvideo/resources/lib/main.py | 97 ++++++++--------
plugin.video.quake.live/addon.py | 2 +-
plugin.video.quake.live/addon.xml | 4 +-
plugin.video.quake.live/changelog.txt | 6 +-
plugin.video.quake.live/resources/lib/main.py | 23 ++--
plugin.video.watchmojo/addon.py | 2 +-
plugin.video.watchmojo/addon.xml | 4 +-
plugin.video.watchmojo/changelog.txt | 5 +-
plugin.video.watchmojo/resources/lib/main.py | 36 +++---
plugin.video.watchmojo/resources/lib/parsers.py | 64 +++++-----
25 files changed, 286 insertions(+), 196 deletions(-)
hooks/post-receive
--
Plugins
------------------------------------------------------------------------------
Flow-based real-time traffic analytics software. Cisco certified tool.
Monitor traffic, SLAs, QoS, Medianet, WAAS etc. with NetFlow Analyzer
Customize your own dashboards, set traffic alerts and generate reports.
Network behavioral analysis & security monitoring. All-in-one tool.
http://pubads.g.doubleclick.net/gampad/clk?id=126839071&iu=/4140/ostg.clktrk
_______________________________________________
Xbmc-addons mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/xbmc-addons