The branch, frodo has been updated
       via  404f3b6fe0d968a30abb1510c65921a210c07a24 (commit)
       via  fcf9b863b0e1d62e65bd71819f906e18cce4d3b0 (commit)
       via  5a95fb945e1256e02f0ed47be09ff47ceb6231a0 (commit)
       via  09d7dcb441029078d46950b2def641d2e8abeffa (commit)
       via  1b40a3b0a7e06deb2c7dd5c2d9f18d41a7425549 (commit)
       via  291a36938a79d467db91cc762d5174c8afc0c0c2 (commit)
       via  b0933dadec59bf0719efedf4acb95fcb1640da40 (commit)
       via  38bca7733ea3e3d4e0f922cbd730a674825cc7b0 (commit)
       via  a69fc50bc5a8ee883513cee49c03cc1e053f3f21 (commit)
       via  8997d6d1394457493b18042b1acc83ade5cd60e4 (commit)
       via  8aa1b1a8542be10c9bbae0bf1af07eb24b3c2b29 (commit)
       via  a0985d36b1e8ca4035c69eb33120562e103c93c0 (commit)
       via  1e6c7dec7c4cb7dea6fb9a8c67cb818526edd666 (commit)
      from  adcbb17d1f325564a943019b0fa64fbc16ddb49b (commit)

- Log -----------------------------------------------------------------
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=404f3b6fe0d968a30abb1510c65921a210c07a24

commit 404f3b6fe0d968a30abb1510c65921a210c07a24
Author: Martijn Kaijser <[email protected]>
Date:   Sat Jul 26 13:25:50 2014 +0200

    [plugin.video.oodnurdtv] 0.0.6

diff --git a/plugin.video.oodnurdtv/addon.py b/plugin.video.oodnurdtv/addon.py
index 160101d..a4281ec 100644
--- a/plugin.video.oodnurdtv/addon.py
+++ b/plugin.video.oodnurdtv/addon.py
@@ -88,7 +88,7 @@ def time_stations(url):
 @plugin.route('/time_url/<url>')
 def time_url(url):
     url = url
-    plugin.set_resolved_url(my_drundoo.play_url(url))
+    plugin.set_resolved_url(my_drundoo.play_live_url(url))
 
 #####################################
 #End of timeshift section
@@ -124,7 +124,7 @@ def playlist_stations(playlist):
 
 @plugin.route('/playlist_final/<url>')
 def playlist_final(url):
-    plugin.set_resolved_url(my_drundoo.play_url(url))
+    plugin.set_resolved_url(my_drundoo.play_live_url(url))
 
 #####################################
 #End of playlist section
@@ -165,7 +165,7 @@ def oshte_stations(oshte):
 
 @plugin.route('/oshte_final/<url>')
 def oshte_final(url):
-    plugin.set_resolved_url(my_drundoo.play_url(url))
+    plugin.set_resolved_url(my_drundoo.play_live_url(url))
 
 #####################################
 #End of zapis section
diff --git a/plugin.video.oodnurdtv/addon.xml b/plugin.video.oodnurdtv/addon.xml
index d5e5c9d..335e687 100644
--- a/plugin.video.oodnurdtv/addon.xml
+++ b/plugin.video.oodnurdtv/addon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<addon id="plugin.video.oodnurdtv" name="drundootv" version="0.0.5" 
provider-name="pesheto">
+<addon id="plugin.video.oodnurdtv" name="drundootv" version="0.0.6" 
provider-name="pesheto">
   <requires>
     <import addon="xbmc.python" version="2.1.0"/>
     <import addon="script.module.xbmcswift2" version="2.4.0"/>
diff --git a/plugin.video.oodnurdtv/resources/drundoo.py 
b/plugin.video.oodnurdtv/resources/drundoo.py
index 46753e2..41d5fbb 100644
--- a/plugin.video.oodnurdtv/resources/drundoo.py
+++ b/plugin.video.oodnurdtv/resources/drundoo.py
@@ -57,8 +57,8 @@ class drundoo:
                 play_list = []
                 temp = self.open_site(link)
 
-                start1 = temp.find('getJSON("') + 'getJSON("'.__len__()
-                end1 = temp.find('", function (data)')
+                start1 = temp.find('url: "') + 'url: "'.__len__()
+                end1 = temp.find('",\n\t\t\tdataType:')
 
                 link = 'http://www.drundoo.com' + temp[start1:end1]
 

http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=fcf9b863b0e1d62e65bd71819f906e18cce4d3b0

commit fcf9b863b0e1d62e65bd71819f906e18cce4d3b0
Author: Martijn Kaijser <[email protected]>
Date:   Sat Jul 26 13:04:17 2014 +0200

    [plugin.video.filmsforaction] 1.0.3

diff --git a/plugin.video.filmsforaction/addon.xml 
b/plugin.video.filmsforaction/addon.xml
index c72412c..5a80afe 100644
--- a/plugin.video.filmsforaction/addon.xml
+++ b/plugin.video.filmsforaction/addon.xml
@@ -1,9 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<addon id="plugin.video.filmsforaction" name="Films For Action" 
version="1.0.2" provider-name="Jose Antonio Montes (jamontes)">
+<addon id="plugin.video.filmsforaction" name="Films For Action" 
version="1.0.3" provider-name="Jose Antonio Montes (jamontes)">
     <requires>
         <import addon="xbmc.python" version="2.1.0"/>
         <import addon="plugin.video.youtube" version="4.4.8"/>
         <import addon="plugin.video.snagfilms" version="1.0.4"/>
+        <import addon="plugin.video.disclose_tv" version="0.0.4"/>
     </requires>
     <extension point="xbmc.python.pluginsource" library="default.py">
         <provides>video</provides>
diff --git a/plugin.video.filmsforaction/changelog.txt 
b/plugin.video.filmsforaction/changelog.txt
index cd093f5..7264a51 100644
--- a/plugin.video.filmsforaction/changelog.txt
+++ b/plugin.video.filmsforaction/changelog.txt
@@ -1,3 +1,6 @@
+1.0.3
+- Rewriten video list parser to make it more tolerant to website changes.
+- Replaced builtin Disclose TV parser on behalf of Disclose TV add-on 
(credits: sphere)
 1.0.2
 - Added Travis-CI integration support for scraper API testing.
 - Added support for Disclose TV videos.
diff --git a/plugin.video.filmsforaction/resources/lib/ffa_api.py 
b/plugin.video.filmsforaction/resources/lib/ffa_api.py
index 599d55e..dd7c4e8 100644
--- a/plugin.video.filmsforaction/resources/lib/ffa_api.py
+++ b/plugin.video.filmsforaction/resources/lib/ffa_api.py
@@ -50,13 +50,16 @@ def get_categories():
 
 def get_videolist(url, localized=lambda x: x):
     """This function gets the video list from the FFA website and returns them 
in a pretty data format."""
-    video_entry_sep        = '<div class="content-view view-horizontal 
clearfix ">'
-    video_urls_pattern     = '<div class="content-image-wrapper">[^<]*?<a 
href=\'([^"]*?)\'><img class="[^"]*?" data-original="([^"]*?)"'
-    video_title_pattern    = '<div class="content-name">[^<]*?<a 
href="[^"]*?">([^<]*?)</a>'
+    video_entry_sep        = 'view-horizontal'
+    video_url_pattern      = '["\'](/watch/[^/]*?/)'
+    video_thumb_pattern    = '["\'](/img/[^"\']*?)["\']'
+    video_title_pattern    = '<a href=["\']/watch/[^/]*?/["\'][ 
]*?>([^<]+?)</a>'
     video_plot_pattern     = '<div class="content-text">([^<]*?)</div>'
-    video_info_pattern     = '<div class="content-info"><a 
href="[^>]*?>([^<]*?)</a>([^<]*?)<a href="[^>]*?>([^<]*?)</a></div>'
-    video_duration_pattern = ' ([0-9]*?) min '
-    video_rating_pattern   = ' ([0-9.]*?) stars '
+    video_cat_pattern      = '>(Video|Short 
Film|Trailer|Documentary|Presentation)<'
+    video_duration_pattern = '([0-9]+?[ ]+?[Mm]in)'
+    video_rating_pattern   = '([0-9.]+?[ ]+?[Ss]tars)'
+    video_views_pattern    = '([0-9,]+?[ ]+?[Vv]iews)'
+    video_author_pattern   = '([Aa]dded by).*?<a href=["\']/[^/]*?/["\'][ 
]*?>([^<]*?)</a>'
     page_count_pattern     = '<span 
id="C_SR_LabelResultsCount[^"]*?">([0-9]*?)-([0-9]*?) of ([0-9]*?) 
[^<]*?</span>'
     prev_page_pattern      = '<div style="float:left">[^<]*?<a 
href="([^"]*?)"><img id="C_SR_IPrevious"'
     next_page_pattern      = '<div style="float:right">[^<]*?<a 
href="([^"]*?)"><img id="C_SR_INext"'
@@ -78,27 +81,32 @@ def get_videolist(url, localized=lambda x: x):
         video_list.append(video_entry)
         reset_cache = True
 
-    for video_section in buffer_url.split(video_entry_sep):
-        url, thumb = l.find_first(video_section, video_urls_pattern) or ('', 
'')
-        title = l.find_first(video_section, video_title_pattern)
-        plot  = l.find_first(video_section, video_plot_pattern)
-        category, info, author = l.find_first(video_section, 
video_info_pattern) or ('', '', '')
-        l.log('Video info. url: "%s" thumb: "%s" title: "%s" category: "%s"' % 
(url, thumb, title, category))
-        if category in ('Video', 'Short Film', 'Trailer', 'Documentary', 
'Presentation'): # This is to avoid blog posts yielded from Search.
-            duration = l.find_first(info, video_duration_pattern)
-            rating = l.find_first(info, video_rating_pattern)
-            video_entry = { 
+    for video_index, video_section in 
enumerate(buffer_url.split(video_entry_sep)):
+        if video_index:
+            category = l.find_first(video_section, video_cat_pattern)
+            if category:
+                url           = l.find_first(video_section, video_url_pattern)
+                thumb         = l.find_first(video_section, 
video_thumb_pattern)
+                title         = l.find_first(video_section, 
video_title_pattern)
+                plot          = l.find_first(video_section, video_plot_pattern)
+                duration      = l.find_first(video_section, 
video_duration_pattern)
+                rating        = l.find_first(video_section, 
video_rating_pattern)
+                views         = l.find_first(video_section, 
video_views_pattern)
+                label, author = l.find_first(video_section, 
video_author_pattern) or ('', '')
+                l.log('Video info. url: "%s" thumb: "%s" title: "%s" category: 
"%s"' % (url, thumb, title, category))
+                l.log('Video tags. duration: "%s" rating: "%s" views: "%s" 
author: "%s %s"' % (duration, rating, views, label, author))
+                video_entry = { 
                     'url': root_url + url,
-                    'title': title.strip(),
+                    'title': title.strip() or '.',
                     'thumbnail': root_url + thumb,
-                    'plot': "%s\n%s%s%s" % (plot.strip(), category, 
info.replace('&middot;', '-'), author),
-                    'duration': int(duration) if duration else 0,
-                    'rating': rating,
+                    'plot': "%s\n%s - %s - %s - %s\n%s %s" % (plot.strip(), 
category, duration, views, rating, label, author),
+                    'duration': int(duration.split()[0]) if duration else 0,
+                    'rating': rating.split()[0] if rating else '',
                     'genre': category,
                     'credits': author,
                     'IsPlayable': True
                     }
-            video_list.append(video_entry)
+                video_list.append(video_entry)
 
     if next_page_num:
         next_page_url = l.find_first(buffer_url, next_page_pattern)
@@ -127,7 +135,7 @@ def get_playable_url(url):
             ('snagfilms1', ' 
src="http://embed.snagfilms.com/embed/player\?filmId=([^"]*?)"', 'snagfilms'),
             ('kickstarter1', ' src="(https://www.kickstarter.com/[^"]*?)"', 
'kickstarter'),
             ('tagtele1', ' src="(http://www.tagtele.com/embed/[^"]*?)"', 
'tagtele'),
-            ('disclosetv1', ' src="(http://www.disclose.tv/embed/[^"]*?)"', 
'disclosetv'),
+            ('disclosetv1', ' src="http://www.disclose.tv/embed/([^"]*?)"', 
'disclosetv'),
             )
     
     buffer_url = l.carga_web(url)
@@ -200,14 +208,7 @@ def get_playable_tagtele_url(tagtele_url):
     return l.find_first(buffer_link, pattern_tagtele_video)
 
 
-def get_playable_disclosetv_url(disclose_url):
-    """This function returns the playable URL for the Disclose TV  embedded 
video from the video link retrieved."""
-    pattern_disclose_location = 'location.href="(.+?)"'
-    pattern_disclose_video = '{ url: "(.+?)"'
+def get_playable_disclosetv_url(video_id):
+    """This function returns the URL path to call the Disclose TV add-on with 
the video_id retrieved."""
+    return 'plugin://plugin.video.disclose_tv/video/' + video_id
 
-    buffer_link = l.carga_web(disclose_url)
-    location_link = l.find_first(buffer_link, pattern_disclose_location)
-    if location_link:
-        location_url = 'http://www.disclose.tv%s1280&height=720&flash=11&url=' 
% location_link
-        buffer_link = l.carga_web(location_url)
-        return l.find_first(buffer_link, pattern_disclose_video)
diff --git a/plugin.video.filmsforaction/resources/tests/test_api.py 
b/plugin.video.filmsforaction/resources/tests/test_api.py
index cc63447..32e277e 100644
--- a/plugin.video.filmsforaction/resources/tests/test_api.py
+++ b/plugin.video.filmsforaction/resources/tests/test_api.py
@@ -21,7 +21,9 @@ class ITTests(unittest.TestCase):
         url='http://www.filmsforaction.org/films/'
         video_items = api.get_videolist(url)
         self.assertTrue(len(video_items['video_list']) > 50)
-        self.assertTrue(len(video_items['video_list'][0]['url']) > 0)
+        self.assertTrue(len(video_items['video_list'][0]['url']) > 30)
+        self.assertTrue(len(video_items['video_list'][0]['thumbnail']) > 30)
+        self.assertTrue(len(video_items['video_list'][0]['title']) > 1)
 
     def test_list_category(self):
         url='http://www.filmsforaction.org/watch_activism_videos/?p=2'
@@ -48,10 +50,6 @@ class ITTests(unittest.TestCase):
         
url='http://www.filmsforaction.org/watch/shop-til-you-drop-the-crisis-of-consumerism-2010/'
         self.assertTrue(len(api.get_playable_url(url)) > 10)
 
-    def test_disclosetv_scraper(self):
-        url='http://www.filmsforaction.org/watch/blackfish-2013/'
-        self.assertTrue(len(api.get_playable_url(url)) > 10)
-
 
 if __name__ == '__main__':
         unittest.main()

http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=5a95fb945e1256e02f0ed47be09ff47ceb6231a0

commit 5a95fb945e1256e02f0ed47be09ff47ceb6231a0
Author: Martijn Kaijser <[email protected]>
Date:   Sat Jul 26 13:02:50 2014 +0200

    [plugin.video.snagfilms] 1.0.6

diff --git a/plugin.video.snagfilms/README.txt 
b/plugin.video.snagfilms/README.txt
index 0aa3ba4..05c2ee1 100644
--- a/plugin.video.snagfilms/README.txt
+++ b/plugin.video.snagfilms/README.txt
@@ -4,6 +4,8 @@ plugin.video.snagfilms
 
 XBMC Addon for Snagfilms website
 
+Version 1.0.6  added popular, most recent sort types
+Version 1.0.5 added search
 Version 1.0.4 added gzip processing for all url requests
 version 1.0.3 minor bug cleanup
 version 1.0.2 initial release
diff --git a/plugin.video.snagfilms/addon.xml b/plugin.video.snagfilms/addon.xml
index 76ec3f6..3a9cdc6 100644
--- a/plugin.video.snagfilms/addon.xml
+++ b/plugin.video.snagfilms/addon.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <addon id="plugin.video.snagfilms"
        name="Snagfilms"
-       version="1.0.4"
+       version="1.0.6"
        provider-name="t1m">
   <requires>
     <import addon="xbmc.python" version="2.1.0"/>
@@ -17,9 +17,9 @@
     <platform>all</platform>
     <language>en</language>
     <license>GNU GENERAL PUBLIC LICENSE. Version 2, June 1991</license>
-    <forum>http://forum.xbmc.org/showthread.php?tid=198859</forum>
+    <forum></forum>
     <website>http://www.snagfilms.com</website>
     <email></email>
-    <source>https://github.com/learningit/plugin.video.snagfilms</source>
+    <source></source>
   </extension>
 </addon>
diff --git a/plugin.video.snagfilms/changelog.txt 
b/plugin.video.snagfilms/changelog.txt
index 0e5efcb..ed11501 100644
--- a/plugin.video.snagfilms/changelog.txt
+++ b/plugin.video.snagfilms/changelog.txt
@@ -1,3 +1,5 @@
+Version 1.0.6  added popular, most recent sort types
+Version 1.0.5 added search
 Version 1.0.4 added gzip processing for all url requests
 Version 1.0.3 minor bugs
 
diff --git a/plugin.video.snagfilms/default.py 
b/plugin.video.snagfilms/default.py
index c09afa7..72a8003 100644
--- a/plugin.video.snagfilms/default.py
+++ b/plugin.video.snagfilms/default.py
@@ -62,7 +62,7 @@ def getRequest(url, user_data=None, headers = 
{'User-Agent':USER_AGENT, 'Accept'
 def getSources(fanart):
       addDir(__language__(30002), __language__(30002), 'GM', icon, 
addonfanart, __language__(30002), '', '')
       addDir(__language__(30003), __language__(30003), 'GS', icon, 
addonfanart, __language__(30003), '', '')
-
+      addDir('[COLOR red]'+__language__(30015)+'[/COLOR]','ABC','GH', icon, 
addonfanart, '[COLOR red]'+__language__(30015)+'[/COLOR]','','') 
 
 
 def getShows(fanart):
@@ -84,10 +84,60 @@ def getMovies(fanart):
       url = re.compile('href="(.+?)"').findall(blob)[0]
       img = re.compile('url\((.+?)\)').findall(blob)[0]
       name = re.compile('genre-centered">(.+?)<').findall(blob)[0]
-      addDir(name, url, 'GC', img, addonfanart, name, '', '')
+      url = url+'#'+img
+      addDir(name, url, 'GT', img, addonfanart, name, '', '')
+
+def getMovieType(url, name):
+       (url,img) = url.split('#',1)
+       addDir((name+' - '+(__language__(30016))).encode(UTF8), url, 'GC', img 
, addonfanart, (name+' - '+(__language__(30016))).encode(UTF8), '', '')
+       addDir((name+' - '+(__language__(30017))).encode(UTF8), url, 'GR', img 
, addonfanart, (name+' - '+(__language__(30017))).encode(UTF8), '', '')
+
+def getMovieRecent(url):
+       getCats(url,sort_type='justadded')
+
+
+def getSearch(sid):
+    keyb = xbmc.Keyboard('', __language__(30000))
+    keyb.doModal()
+    if (keyb.isConfirmed()):
+         search = urllib.quote_plus(keyb.getText())
+         x_url = '/search/?q=%s' % (search)
+
+         url2 = 'http://www.snagfilms.com/'
+         user_data = urllib.urlencode({'url': x_url})
+         headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:11.0) 
Gecko/20100101 Firefox/11.0', 'Accept' : '*/*', 'Referer' : 
'http://www.snagfilms.com%s' % (x_url),'X-Requested-With' : 'XMLHttpRequest', 
'Origin': 'http://www.snagfilms.com'}
+
+         cj = cookielib.CookieJar()
+         opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
+         urllib2.install_opener(opener)
+
+         html = getRequest(url2, user_data, headers)
 
+         url2 = 'http://www.snagfilms.com/apis/user/incrementPageView'
+         user_data = urllib.urlencode({'url': x_url})
+         headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:11.0) 
Gecko/20100101 Firefox/11.0', 'Accept' : '*/*', 'Referer' : 
'http://www.snagfilms.com%s' % (x_url),'X-Requested-With' : 'XMLHttpRequest', 
'Origin': 'http://www.snagfilms.com'}
+         html = getRequest(url2, user_data, headers)
 
-def getCats(c_url):
+
+         s_url = 
'http://www.snagfilms.com/apis/search.json?searchTerm=%s&type=film&limit=50' % 
(search)
+         html = getRequest(s_url, None, headers)
+         shows = 
re.compile('{"id":"(.+?)".+?"title":"(.+?)".+?"imageUrl":"(.+?)"').findall(html)
+         for sid, sname, simg in shows:
+             surl = sys.argv[0]+"?url="+urllib.quote_plus(sid)+"&mode=GV"
+             simg = urllib.unquote_plus(simg)
+             simg = simg.split('url=',1)[1]
+             
addLink(surl.encode(UTF8),sname,simg,addonfanart,sname,'','',False)
+
+         s_url = 
'http://www.snagfilms.com/apis/search.json?searchTerm=%s&type=show&limit=50' % 
(search)
+         html = getRequest(s_url, None, headers)
+         shows = 
re.compile('{"id":"(.+?)".+?"title":"(.+?)".+?"permaLink":"(.+?)".+?"imageUrl":"(.+?)"').findall(html)
+         for sid, sname, surl, simg in shows:
+             simg = urllib.unquote_plus(simg)
+             simg = simg.split('url=',1)[1]
+             addDir(sname, surl.encode(UTF8), 'GC', simg, addonfanart, 
sname,'','')
+
+
+def getCats(c_url, sort_type='popular'):
     cat_url = 'http://www.snagfilms.com%s' % (c_url)
     cj = cookielib.CookieJar()
     opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
@@ -113,7 +163,7 @@ def getCats(c_url):
         category = 'sci-fi'
       else:
         category  = types[2].replace('_','%20')
-      url3 = 
'http://www.snagfilms.com/apis/movies?limit=200&offset=0&sort_type=popular&film_type=%s&category=%s'
 % (file_type, category)
+      url3 = 
'http://www.snagfilms.com/apis/movies?limit=200&offset=0&sort_type=%s&film_type=%s&category=%s'
 % (sort_type,file_type, category)
     else:
       url3 = 'http://www.snagfilms.com/apis/show/%s' % (showid)
 
@@ -121,12 +171,19 @@ def getCats(c_url):
 ,'X-Requested-With' : 'XMLHttpRequest', 'Origin': 'http://www.snagfilms.com'}
 
     html = getRequest(url3, None , headers)
-
     shows = 
re.compile('{"id":"(.+?)".+?"title":"(.+?)".+?"logline":"(.+?)".+?"primaryCategory".+?"title":"(.+?)".+?{"height".+?"src":"(.+?)"').findall(html)
     for sid, sname, sdesc, sgenre, simg in shows:
-      if not ('huluim.com' in simg):
+      if ('url=' in simg):
+        simg = urllib.unquote_plus(simg)
+        simg = simg.split('url=',1)[1]
+      if not ('ytimg' in simg):
        surl = sys.argv[0]+"?url="+urllib.quote_plus(sid)+"&mode=GV"
        
addLink(surl.encode(UTF8),sname,simg.encode(UTF8),addonfanart,sdesc,sgenre,'',False)
+      else:
+       ytid = simg.split('/')[4]
+       surl = 
'plugin://plugin.video.youtube/?path=/root/video&action=play_video&videoid=%s' 
% (ytid)
+       
addLink(surl.encode(UTF8),sname,simg.encode(UTF8),addonfanart,sdesc,sgenre,'',False)
+
 
 
 def getVideo(sid):
@@ -222,6 +279,9 @@ elif mode=='GV':  getVideo(p('url'))
 elif mode=='GM':  getMovies(p('url'))
 elif mode=='GS':  getShows(p('url'))
 elif mode=='GC':  getCats(p('url'))
+elif mode=='GH':  getSearch(p('url'))
+elif mode=='GT':  getMovieType(p('url'),p('name'))
+elif mode=='GR':  getMovieRecent(p('url'))
 
 
 xbmcplugin.endOfDirectory(int(sys.argv[1]))
diff --git a/plugin.video.snagfilms/resources/language/English/strings.xml 
b/plugin.video.snagfilms/resources/language/English/strings.xml
index e403fd0..bb3f8f6 100644
--- a/plugin.video.snagfilms/resources/language/English/strings.xml
+++ b/plugin.video.snagfilms/resources/language/English/strings.xml
@@ -12,4 +12,8 @@
     <string id="30009">7000 Kbps</string>
     <string id="30010">9500 Kbps</string>
     <string id="30011">15000 Kbps</string>
+    <string id="30015">Snagfilms Search</string>
+    <string id="30016">Popular</string>
+    <string id="30017">Most Recent</string>
+
 </strings>

http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=09d7dcb441029078d46950b2def641d2e8abeffa


http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=1b40a3b0a7e06deb2c7dd5c2d9f18d41a7425549


http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=291a36938a79d467db91cc762d5174c8afc0c0c2

commit 291a36938a79d467db91cc762d5174c8afc0c0c2
Author: Martijn Kaijser <[email protected]>
Date:   Sat Jul 26 12:26:37 2014 +0200

    [plugin.video.watchmojo] 1.0.2

diff --git a/plugin.video.watchmojo/addon.py b/plugin.video.watchmojo/addon.py
index be2c3fe..1e55e7e 100644
--- a/plugin.video.watchmojo/addon.py
+++ b/plugin.video.watchmojo/addon.py
@@ -16,11 +16,16 @@
        along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
 
+def execute():
+       action = xbmcutil.plugin.actions[0]
+       if action == u"system": xbmcutil.sysCheck()
+       else:
+               # Call Function Based on Action Param
+               import main as plugin
+               getattr(plugin, action)()
+
 # Initiate Startup
 import xbmcutil
-action = xbmcutil.plugin.actions[0]
-if action == u"system": xbmcutil.sysCheck()
-else:
-       # Call Function Based on Action Param
-       import main as plugin
-       getattr(plugin, action)()
\ No newline at end of file
+if __name__ == "__main__":
+       try: execute()
+       finally: xbmcutil.cleanup()
\ No newline at end of file
diff --git a/plugin.video.watchmojo/addon.xml b/plugin.video.watchmojo/addon.xml
index d281eb1..be40b5a 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.1">
+<addon id="plugin.video.watchmojo" name="Watchmojo" 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"/>
+               <import addon="script.module.xbmcutil" version="2.1.0"/>
        </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 0d8a189..b30ab10 100644
--- a/plugin.video.watchmojo/changelog.txt
+++ b/plugin.video.watchmojo/changelog.txt
@@ -1,3 +1,9 @@
+[B]Version 1.0.2[/B] 2014-06-30
+- Update Strings to strings.po
+- Added UnitTests
+- Added opton to hide sub categorys via context menu
+- And a lot more small improvements
+
 [B]Version 1.0.1[/B]
 - Added full unicode support
 
diff --git a/plugin.video.watchmojo/resources/lib/main.py 
b/plugin.video.watchmojo/resources/lib/main.py
index 2b8fa71..14fcc8a 100644
--- a/plugin.video.watchmojo/resources/lib/main.py
+++ b/plugin.video.watchmojo/resources/lib/main.py
@@ -26,14 +26,15 @@ class Initialize(listitem.VirtualFS):
        def scraper(self):
                # Fetch Video Content
                url = u"%s/video/theme/" % BASEURL
-               sourceCode = urlhandler.urlread(url, 2678400) # TTL = 1 Month
-               videoItems = parsers.CategorysParser().parse(sourceCode)
+               sourceObj = urlhandler.urlopen(url, 604800) # TTL = 1 Week
+               videoItems = parsers.CategorysParser().parse(sourceObj)
+               sourceObj.close()
                
                # Add Extra Items
                icon = (plugin.getIcon(),0)
-               self.add_youtube_channel("watchmojo")
-               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/"})
+               self.add_youtube_channel("watchmojo", hasHD=False)
+               self.add_item(u"-%s" % plugin.getuni(32941), thumbnail=icon, 
url={"action":"Videos", "url":"/video/cat/home/1"})
+               self.add_item(u"-%s" % plugin.getuni(30101), thumbnail=icon, 
url={"action":"Themes", "url":"/video/theme/"})
                
                # Set Content Properties
                self.set_sort_methods(self.sort_method_video_title)
@@ -47,8 +48,9 @@ class Themes(listitem.VirtualFS):
        def scraper(self):
                # Fetch Video Content
                url = BASEURL + plugin["url"]
-               sourceCode = urlhandler.urlread(url, 604800) # TTL = 1 Week
-               videoItems = parsers.ThemesParser().parse(sourceCode)
+               sourceObj = urlhandler.urlopen(url, 604800) # TTL = 1 Week
+               videoItems = parsers.ThemesParser().parse(sourceObj)
+               sourceObj.close()
                
                # Set Content Properties
                self.set_sort_methods(self.sort_method_video_title)
@@ -62,7 +64,7 @@ class SubCat(listitem.VirtualFS):
        def scraper(self):
                # Fetch Video Content
                url = u"%s/video/theme/" % BASEURL
-               sourceCode = urlhandler.urlread(url, 2678400) # TTL = 1 Month
+               sourceCode = urlhandler.urlread(url, 604800) # TTL = 1 Week
                
                # Set Content Properties
                self.set_sort_methods(self.sort_method_video_title)
@@ -76,22 +78,26 @@ class SubCat(listitem.VirtualFS):
                results = []
                additem = results.append
                localListitem = listitem.ListItem
+               mainTitle = plugin["title"]
                import re
                
                # Add Current Category
-               self.add_item(label=u"-%s" % plugin["title"], 
url={"action":"Videos", "url":plugin["url"]})
+               self.add_item(label=u"-%s" % mainTitle, url={"action":"Videos", 
"url":plugin["url"]})
+               mainTitle = mainTitle.lower()
                
                for catID in plugin["idlist"].split(u","):
-                       # Create listitem of Data
-                       item = localListitem()
-                       
                        # Fetch Title and Set url & action
                        url = u"/video/id/%s/1" % catID
-                       item.setLabel(re.findall('<a href="%s">(.+?)</a>' % 
url, sourceCode)[0])
+                       title = re.findall('<a href="%s">(.+?)</a>' % url, 
sourceCode)[0]
+                       if title.lower() == mainTitle: continue
+                       
+                       # Create listitem of Data
+                       item = localListitem()
+                       item.setLabel(title)
                        item.setParamDict(action="Videos", url=url)
                        
                        # Store Listitem data
-                       additem(item.getListitemTuple(isPlayable=False))
+                       additem(item.getListitemTuple(False))
                        
                # Return list of listitems
                return results
@@ -101,8 +107,9 @@ class Videos(listitem.VirtualFS):
        def scraper(self):
                # Fetch Video Content
                url = BASEURL + plugin["url"].replace(u" ",u"%20")
-               sourceCode = urlhandler.urlread(url, 28800) # TTL = 8 Hours
-               videoItems = parsers.VideosParser().parse(sourceCode)
+               sourceObj = urlhandler.urlopen(url, 14400) # TTL = 4 Hours
+               videoItems = parsers.VideosParser().parse(sourceObj)
+               sourceObj.close()
                
                # Set Content Properties
                self.set_sort_methods(self.sort_method_date, 
self.sort_method_video_title)
@@ -116,11 +123,11 @@ class PlayVideo(listitem.PlayMedia):
        def resolve(self):
                # Create url for oembed api
                url = BASEURL + plugin["url"]
-               sourceCode = urlhandler.urlread(url)
+               sourceCode = urlhandler.urlread(url, 14400, stripEntity=False)# 
TTL = 4 Hours
                import re
                
                # Search sourceCode
                test = re.findall("<param name=\"flashvars\" value='(.+?)'>", 
sourceCode)[0]
-               values = plugin.get_params(test)
+               values = plugin.parse_qs(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 318813a..1c9ac3f 100644
--- a/plugin.video.watchmojo/resources/lib/parsers.py
+++ b/plugin.video.watchmojo/resources/lib/parsers.py
@@ -24,16 +24,22 @@ class CategorysParser(HTMLParser.HTMLParser):
        """
        Parses channel categorys, i.e http://www.watchmojo.com/
        """
-       def parse(self, html):
+       def parse(self, urlobject, encoding="utf8"):
+               return self.fromstring(urlobject.read(), encoding)
+       
+       def fromstring(self, html, encoding="utf8"):
                """ Parses SourceCode and Scrape Categorys """
                
                # Class Vars
                self.section = 0
                
                # Proceed with parsing
+               self.extracat = plugin.getSettingBool("extracat")
                self.reset_lists()
                self.results = []
-               try: self.feed(html)
+               try:
+                       if encoding: self.feed(html.decode(encoding))
+                       else: self.feed(html)
                except plugin.ParserError: pass
                
                # Return Results
@@ -42,7 +48,9 @@ class CategorysParser(HTMLParser.HTMLParser):
        def reset_lists(self):
                # Reset List for Next Run
                self.item = listitem.ListItem()
-               self.item.urlParams["action"] = "SubCat"
+               print self.extracat
+               if self.extracat: self.item.urlParams["action"] = "SubCat"
+               else: self.item.urlParams["action"] = "Videos"
                self.idList = []
        
        def handle_starttag(self, tag, attrs):
@@ -74,7 +82,9 @@ class CategorysParser(HTMLParser.HTMLParser):
        def handle_data(self, data):
                # Fetch Category Title when within Section 2
                if self.section == 101: # Title
-                       self.item.setLabel(data)
+                       title = data.strip()
+                       self.item.setLabel(title)
+                       self.item.urlParams["title"] = title
                        self.section = 2
        
        def handle_endtag(self, tag):
@@ -89,16 +99,21 @@ class ThemesParser(HTMLParser.HTMLParser):
        """
        Parses channel categorys, i.e http://www.watchmojo.com/video/theme/
        """
-       def parse(self, html):
+       def parse(self, urlobject, encoding="utf8"):
+               return self.fromstring(urlobject.read(), encoding)
+       
+       def fromstring(self, html, encoding="utf8"):
                """ Parses SourceCode and Scrape Categorys """
-
+               
                # Class Vars
                self.section = 0
                
                # Proceed with parsing
                self.reset_lists()
                self.results = []
-               try: self.feed(html)
+               try:
+                       if encoding: self.feed(html.decode(encoding))
+                       else: self.feed(html)
                except plugin.ParserError: pass
                
                # Return Results
@@ -147,16 +162,21 @@ class VideosParser(HTMLParser.HTMLParser):
        """
        Parses channel categorys, i.e http://www.watchmojo.com/video/id/11529/
        """
-       def parse(self, html):
+       def parse(self, urlobject, encoding="utf8"):
+               return self.fromstring(urlobject.read(), encoding)
+       
+       def fromstring(self, html, encoding="utf8"):
                """ Parses SourceCode and Scrape Categorys """
-
+               
                # Class Vars
                self.section = 0
                
                # Proceed with parsing
                self.reset_lists()
                self.results = []
-               try: self.feed(html.replace(u'_blank"',u''))
+               try:
+                       if encoding: 
self.feed(html.decode(encoding).replace(u'_blank"',u''))
+                       else: self.feed(html.replace(u'_blank"',u''))
                except plugin.ParserError: pass
                
                # Return Results
diff --git a/plugin.video.watchmojo/resources/settings.xml 
b/plugin.video.watchmojo/resources/settings.xml
index 6af4bb7..124c12a 100644
--- a/plugin.video.watchmojo/resources/settings.xml
+++ b/plugin.video.watchmojo/resources/settings.xml
@@ -1,13 +1,15 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <settings>
        <category>
+               <setting id="extracat" type="bool" label="30001" 
default="false"/>
                <!-- ViewModes -->
-               <setting id="files" type="enum" label="30004" 
lvalues="30006|30007|30008|30009" default="0" />
-               <setting id="filescustom" type="number" label="30010" 
visible="eq(-1,3)" />
-               <setting id="episodes" type="enum" label="30005" 
lvalues="30006|30007|30008|30009" default="0" />
-               <setting id="episodescustom" type="number" label="30010" 
visible="eq(-1,3)" />
+               <setting type="sep" />
+               <setting id="files" type="enum" 
label="$ADDON[script.module.xbmcutil 32921]" lvalues="571|537|21371|636" 
default="0" />
+               <setting id="filescustom" type="number" 
label="$ADDON[script.module.xbmcutil 32923]" visible="eq(-1,3)" />
+               <setting id="episodes" type="enum" 
label="$ADDON[script.module.xbmcutil 32922]" lvalues="571|537|21371|636" 
default="0" />
+               <setting id="episodescustom" type="number" 
label="$ADDON[script.module.xbmcutil 32923]" visible="eq(-1,3)" />
                <!-- Downloads -->
                <setting type="sep" />
-               <setting id="downloadpath" type="folder" label="30003" 
source="video" option="writeable" default="" />
+               <setting id="downloadpath" type="folder" 
label="$ADDON[script.module.xbmcutil 32924]" source="video" option="writeable" 
default="" />
        </category>
 </settings>
\ No newline at end of file

http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=b0933dadec59bf0719efedf4acb95fcb1640da40

commit b0933dadec59bf0719efedf4acb95fcb1640da40
Author: Martijn Kaijser <[email protected]>
Date:   Sat Jul 26 12:25:44 2014 +0200

    [plugin.video.quake.live] 1.0.2

diff --git a/plugin.video.quake.live/addon.py b/plugin.video.quake.live/addon.py
index be2c3fe..1e55e7e 100644
--- a/plugin.video.quake.live/addon.py
+++ b/plugin.video.quake.live/addon.py
@@ -16,11 +16,16 @@
        along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
 
+def execute():
+       action = xbmcutil.plugin.actions[0]
+       if action == u"system": xbmcutil.sysCheck()
+       else:
+               # Call Function Based on Action Param
+               import main as plugin
+               getattr(plugin, action)()
+
 # Initiate Startup
 import xbmcutil
-action = xbmcutil.plugin.actions[0]
-if action == u"system": xbmcutil.sysCheck()
-else:
-       # Call Function Based on Action Param
-       import main as plugin
-       getattr(plugin, action)()
\ No newline at end of file
+if __name__ == "__main__":
+       try: execute()
+       finally: xbmcutil.cleanup()
\ No newline at end of file
diff --git a/plugin.video.quake.live/addon.xml 
b/plugin.video.quake.live/addon.xml
index fdbc532..0405451 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.1">
+<addon id="plugin.video.quake.live" name="Quake Live" 
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"/>
+               <import addon="script.module.xbmcutil" version="2.1.0"/>
        </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 fe440e4..0c052b6 100644
--- a/plugin.video.quake.live/changelog.txt
+++ b/plugin.video.quake.live/changelog.txt
@@ -1,3 +1,9 @@
+[B]Version 1.0.2[/B] 2014-06-30
+- Updated Fanart Image, Thanks Soulmarin
+- Update Strings to strings.po
+- Added UnitTests
+- And a lot more small improvements
+
 [B]Version 1.0.1[/B]
 - Added full unicode support
 - Added youtube channel
diff --git a/plugin.video.quake.live/fanart.jpg 
b/plugin.video.quake.live/fanart.jpg
index b1e196e..197de4e 100644
Binary files a/plugin.video.quake.live/fanart.jpg and 
b/plugin.video.quake.live/fanart.jpg differ
diff --git a/plugin.video.quake.live/resources/lib/main.py 
b/plugin.video.quake.live/resources/lib/main.py
index 412a89c..1c91491 100644
--- a/plugin.video.quake.live/resources/lib/main.py
+++ b/plugin.video.quake.live/resources/lib/main.py
@@ -24,14 +24,14 @@ class Initialize(listitem.VirtualFS):
        def scraper(self):
                # Fetch Video Content
                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
+               sourceObj = urlhandler.urlopen(url, 14400) # TTL = 4 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")
+               self.add_youtube_channel(u"TheQuakeLiveTV", hasHD=False)
                
                # Fetch and Return VideoItems
                return self.xml_scraper(sourceObj)
@@ -64,7 +64,7 @@ class Initialize(listitem.VirtualFS):
                        item.setDateInfo(date[date.rfind(u" ")+1:], "%m/%d/%y")
                        
                        # Store Listitem data
-                       additem(item.getListitemTuple(isPlayable=True))
+                       additem(item.getListitemTuple(True))
                
                # Return list of listitems
                return results
diff --git a/plugin.video.quake.live/resources/settings.xml 
b/plugin.video.quake.live/resources/settings.xml
index 31a0b06..ec53fe7 100644
--- a/plugin.video.quake.live/resources/settings.xml
+++ b/plugin.video.quake.live/resources/settings.xml
@@ -2,12 +2,10 @@
 <settings>
        <category>
                <!-- ViewModes -->
-               <!-- setting id="files" type="enum" label="30004" 
lvalues="30006|30007|30008|30009" default="0" /-->
-               <!-- setting id="filescustom" type="number" label="30010" 
visible="eq(-1,3)" /-->
-               <setting id="episodes" type="enum" label="30005" 
lvalues="30006|30007|30008|30009" default="0" />
-               <setting id="episodescustom" type="number" label="30010" 
visible="eq(-1,3)" />
+               <setting id="episodes" type="enum" 
label="$ADDON[script.module.xbmcutil 32922]" lvalues="571|537|21371|636" 
default="0" />
+               <setting id="episodescustom" type="number" 
label="$ADDON[script.module.xbmcutil 32923]" visible="eq(-1,3)" />
                <!-- Downloads -->
                <setting type="sep" />
-               <setting id="downloadpath" type="folder" label="30003" 
source="video" option="writeable" default="" />
+               <setting id="downloadpath" type="folder" 
label="$ADDON[script.module.xbmcutil 32924]" source="video" option="writeable" 
default="" />
        </category>
 </settings>
\ No newline at end of file

http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=38bca7733ea3e3d4e0f922cbd730a674825cc7b0

commit 38bca7733ea3e3d4e0f922cbd730a674825cc7b0
Author: Martijn Kaijser <[email protected]>
Date:   Sat Jul 26 12:24:37 2014 +0200

    [plugin.video.metalvideo] 1.0.4

diff --git a/plugin.video.metalvideo/addon.py b/plugin.video.metalvideo/addon.py
index 045bcd3..1e55e7e 100644
--- a/plugin.video.metalvideo/addon.py
+++ b/plugin.video.metalvideo/addon.py
@@ -16,7 +16,7 @@
        along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
 
-def selector():
+def execute():
        action = xbmcutil.plugin.actions[0]
        if action == u"system": xbmcutil.sysCheck()
        else:
@@ -26,4 +26,6 @@ def selector():
 
 # Initiate Startup
 import xbmcutil
-if __name__ == "__main__": selector()
\ No newline at end of file
+if __name__ == "__main__":
+       try: execute()
+       finally: xbmcutil.cleanup()
\ No newline at end of file
diff --git a/plugin.video.metalvideo/addon.xml 
b/plugin.video.metalvideo/addon.xml
index c0beae3..c321534 100644
--- a/plugin.video.metalvideo/addon.xml
+++ b/plugin.video.metalvideo/addon.xml
@@ -1,8 +1,10 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<addon id="plugin.video.metalvideo" name="Metalvideo" 
provider-name="willforde" version="1.0.3">
+<addon id="plugin.video.metalvideo" name="Metalvideo" 
provider-name="willforde" version="1.0.4">
        <requires>
                <import addon="xbmc.python" version="2.1.0"/>
-               <import addon="script.module.xbmcutil" version="2.0.4"/>
+               <import addon="script.module.xbmcutil" version="2.1.0"/>
+               <import addon="plugin.video.youtube" version="4.4.8"/>
+               <import addon="script.module.parsedom" version="2.5.2"/>
        </requires>
        <extension library="addon.py" point="xbmc.python.pluginsource">
                <provides>audio video</provides>
diff --git a/plugin.video.metalvideo/changelog.txt 
b/plugin.video.metalvideo/changelog.txt
index ea30101..0b985c4 100644
--- a/plugin.video.metalvideo/changelog.txt
+++ b/plugin.video.metalvideo/changelog.txt
@@ -1,4 +1,7 @@
-TODO: Create Unit Tests, Once I figure out how
+[B]Version 1.0.4[/B] 2014-06-30
+- Update Strings to strings.po
+- Added UnitTests
+- And a lot more small improvements
 
 [B]Version 1.0.3[/B]
 - Changed the Video Context menu to not replace items
diff --git a/plugin.video.metalvideo/resources/lib/main.py 
b/plugin.video.metalvideo/resources/lib/main.py
index 91dd664..c652ac3 100644
--- a/plugin.video.metalvideo/resources/lib/main.py
+++ b/plugin.video.metalvideo/resources/lib/main.py
@@ -40,9 +40,9 @@ class Initialize(listitem.VirtualFS):
                localListitem = listitem.ListItem
                
                # Add Extra Items
-               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_item(label=u"-%s" % plugin.getuni(30103), 
url={"action":"PlayVideo", "url":u"http://www.metalvideo.com/randomizer.php"}, 
isPlayable=True)
+               self.add_item(label=u"-%s" % plugin.getuni(30102), 
url={"action":"TopVideos", "url":u"http://www.metalvideo.com/topvideos.html"}, 
isPlayable=False)
+               self.add_item(label=u"-%s" % plugin.getuni(32941), 
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
@@ -53,7 +53,7 @@ class Initialize(listitem.VirtualFS):
                        item.setParamDict(action="VideoList", 
url=u"http://metalvideo.com/%s"; % url)
                        
                        # Store Listitem data
-                       additem(item.getListitemTuple(isPlayable=False))
+                       additem(item.getListitemTuple(False))
                        
                # Return list of listitems
                return results
@@ -62,7 +62,7 @@ class TopVideos(listitem.VirtualFS):
        @plugin.error_handler
        def scraper(self):
                # Fetch SourceCode
-               sourceCode = urlhandler.urlread(self.regex_selector(), 28800) # 
TTL = 8 Hours
+               sourceCode = urlhandler.urlread(self.regex_selector(), 14400) # 
TTL = 4 Hours
                self.cacheToDisc= True
                
                # Set Content Properties
@@ -75,14 +75,14 @@ class TopVideos(listitem.VirtualFS):
        def regex_selector(self):
                # Fetch SourceCode
                url = u"http://metalvideo.com/topvideos.html";
-               sourceCode = urlhandler.urlread(url, 2678400) # TTL = 1 Month
+               sourceCode = urlhandler.urlread(url, 604800) # TTL = 1 Week
                
                # Fetch list of Top Video Category
                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.getuni(30600), titleList)
+               ret = plugin.dialogSelect(plugin.getuni(30101), titleList)
                if ret >= 0: return topLists[ret][0]
                else: raise plugin.ScraperError(0, "User Has Quit the Top 
Display")
        
@@ -106,7 +106,7 @@ class TopVideos(listitem.VirtualFS):
                        
item.addRelatedContext(url=url[url.rfind(u"_")+1:url.rfind(u".")])
                        
                        # Store Listitem data
-                       additem(item.getListitemTuple(isPlayable=True))
+                       additem(item.getListitemTuple(True))
                
                # Return list of listitems
                return results
@@ -115,7 +115,7 @@ class NewVideos(listitem.VirtualFS):
        @plugin.error_handler
        def scraper(self):
                # Fetch SourceCode
-               sourceCode = urlhandler.urlread(plugin["url"], 28800) # TTL = 8 
Hours
+               sourceCode = urlhandler.urlread(plugin["url"], 14400) # TTL = 4 
Hours
                
                # Set Content Properties
                self.set_sort_methods(self.sort_method_unsorted)
@@ -150,7 +150,7 @@ class NewVideos(listitem.VirtualFS):
                        
item.addRelatedContext(url=url[url.rfind(u"_")+1:url.rfind(u".")])
                        
                        # Store Listitem data
-                       additem(item.getListitemTuple(isPlayable=True))
+                       additem(item.getListitemTuple(True))
                
                # Return list of listitems
                return results
@@ -160,7 +160,7 @@ class Related(listitem.VirtualFS):
        def scraper(self):
                # Fetch SourceCode
                url = u"http://metalvideo.com/relatedclips.php?vid=%(url)s" % 
plugin
-               sourceObj = urlhandler.urlopen(url, 28800) # TTL = 8 Hours
+               sourceObj = urlhandler.urlopen(url, 14400) # TTL = 4 Hours
                
                # Set Content Properties
                self.set_sort_methods(self.sort_method_unsorted)
@@ -195,7 +195,7 @@ class Related(listitem.VirtualFS):
                        
item.addRelatedContext(url=url[url.rfind(u"_")+1:url.rfind(u".")], 
updatelisting="true")
                        
                        # Store Listitem data
-                       additem(item.getListitemTuple(isPlayable=True))
+                       additem(item.getListitemTuple(True))
                
                # Return list of listitems
                return results
@@ -210,7 +210,7 @@ class VideoList(listitem.VirtualFS):
                        url = urlString % plugin["url"]
                
                # Fetch SourceCode
-               sourceCode = urlhandler.urlread(url, 28800) # TTL = 8 Hours
+               sourceCode = urlhandler.urlread(url, 14400) # TTL = 4 Hours
                
                # Set Content Properties
                self.set_sort_methods(self.sort_method_unsorted)
@@ -254,7 +254,7 @@ class VideoList(listitem.VirtualFS):
                        
item.addRelatedContext(url=url[url.rfind(u"_")+1:url.rfind(u".")])
                        
                        # Store Listitem data
-                       additem(item.getListitemTuple(isPlayable=True))
+                       additem(item.getListitemTuple(True))
                        
                # Return list of listitems
                return results
@@ -281,16 +281,17 @@ class PlayVideo(listitem.PlayMedia):
                # Play Selected Video
                else:
                        # Return video url untouched
-                       return self.find_video(604800) # TTL = 1 Week
+                       return self.find_video(57600) # TTL = 16 Hours
        
        def find_video(self, TTL):
                # Fetch Page Source
-               sourceCode = urlhandler.urlread(plugin["url"], TTL)
+               sourceCode = urlhandler.urlread(plugin["url"], TTL, 
stripEntity=False)
                from xbmcutil import videoResolver
                
                # Look for Youtube Video First
                try: videoId = [part for part in 
re.findall('src="(http://www.youtube.com/embed/\S+?)"|file:\s+\'(\S+?)\'', 
sourceCode)[0] if part][0]
                except: return None
                else:
+                       print 
                        if u"metalvideo.com" in videoId: return {"url":videoId}
-                       elif u"youtube.com" in videoId: return 
videoResolver.youtube_com().decode(videoId)
+                       elif u"youtube.com" in videoId: return 
self.sources(videoId, sourcetype="youtube_com")
diff --git a/plugin.video.metalvideo/resources/settings.xml 
b/plugin.video.metalvideo/resources/settings.xml
index 38fdd8d..f3a78f9 100644
--- a/plugin.video.metalvideo/resources/settings.xml
+++ b/plugin.video.metalvideo/resources/settings.xml
@@ -2,15 +2,15 @@
 <settings>
        <category>
                <!-- Misc -->
-               <setting id="sort" type="enum" label="30100" 
lvalues="30101|30102|30103|30104" default="0" />
+               <setting id="sort" type="enum" label="30001" 
lvalues="552|557|563|30002" default="0" />
                <!-- ViewModes -->
                <setting type="sep" />
-               <setting id="files" type="enum" label="30004" 
lvalues="30006|30007|30008|30009" default="0" />
-               <setting id="filescustom" type="number" label="30010" 
visible="eq(-1,3)" />
-               <setting id="episodes" type="enum" label="30005" 
lvalues="30006|30007|30008|30009" default="0" />
-               <setting id="episodescustom" type="number" label="30010" 
visible="eq(-1,3)" />
+               <setting id="files" type="enum" 
label="$ADDON[script.module.xbmcutil 32921]" lvalues="571|537|21371|636" 
default="0" />
+               <setting id="filescustom" type="number" 
label="$ADDON[script.module.xbmcutil 32923]" visible="eq(-1,3)" />
+               <setting id="episodes" type="enum" 
label="$ADDON[script.module.xbmcutil 32922]" lvalues="571|537|21371|636" 
default="0" />
+               <setting id="episodescustom" type="number" 
label="$ADDON[script.module.xbmcutil 32923]" visible="eq(-1,3)" />
                <!-- Downloads -->
                <setting type="sep" />
-               <setting id="downloadpath" type="folder" label="30003" 
source="video" option="writeable" default="" />
+               <setting id="downloadpath" type="folder" 
label="$ADDON[script.module.xbmcutil 32924]" source="video" option="writeable" 
default="" />
        </category>
 </settings>
\ No newline at end of file

http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=a69fc50bc5a8ee883513cee49c03cc1e053f3f21


http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=8997d6d1394457493b18042b1acc83ade5cd60e4

commit 8997d6d1394457493b18042b1acc83ade5cd60e4
Author: Martijn Kaijser <[email protected]>
Date:   Sat Jul 26 12:22:21 2014 +0200

    [plugin.video.engineeringtv] 1.0.2

diff --git a/plugin.video.engineeringtv/addon.py 
b/plugin.video.engineeringtv/addon.py
index be2c3fe..1e55e7e 100644
--- a/plugin.video.engineeringtv/addon.py
+++ b/plugin.video.engineeringtv/addon.py
@@ -16,11 +16,16 @@
        along with this program.  If not, see <http://www.gnu.org/licenses/>.
 """
 
+def execute():
+       action = xbmcutil.plugin.actions[0]
+       if action == u"system": xbmcutil.sysCheck()
+       else:
+               # Call Function Based on Action Param
+               import main as plugin
+               getattr(plugin, action)()
+
 # Initiate Startup
 import xbmcutil
-action = xbmcutil.plugin.actions[0]
-if action == u"system": xbmcutil.sysCheck()
-else:
-       # Call Function Based on Action Param
-       import main as plugin
-       getattr(plugin, action)()
\ No newline at end of file
+if __name__ == "__main__":
+       try: execute()
+       finally: xbmcutil.cleanup()
\ No newline at end of file
diff --git a/plugin.video.engineeringtv/addon.xml 
b/plugin.video.engineeringtv/addon.xml
index baefd59..0cf5d42 100644
--- a/plugin.video.engineeringtv/addon.xml
+++ b/plugin.video.engineeringtv/addon.xml
@@ -1,8 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<addon id="plugin.video.engineeringtv" name="Engineering TV" 
provider-name="willforde" version="1.0.1">
+<addon id="plugin.video.engineeringtv" name="Engineering TV" 
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"/>
+               <import addon="script.module.xbmcutil" version="2.1.0"/>
+               <import addon="script.module.parsedom" version="2.5.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 d8846fe..4eaf933 100644
--- a/plugin.video.engineeringtv/changelog.txt
+++ b/plugin.video.engineeringtv/changelog.txt
@@ -1,3 +1,10 @@
+[B]Version 1.0.2[/B] 2014-06-30
+- Update Strings to strings.po
+- Added UnitTests
+- Added Most Recent video catagory
+- Minor speed improvements by reducing the number of redirects
+- And a lot more small improvements
+
 [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
diff --git a/plugin.video.engineeringtv/resources/lib/main.py 
b/plugin.video.engineeringtv/resources/lib/main.py
index 26c49ed..498913e 100644
--- a/plugin.video.engineeringtv/resources/lib/main.py
+++ b/plugin.video.engineeringtv/resources/lib/main.py
@@ -24,17 +24,18 @@ class Initialize(listitem.VirtualFS):
        def scraper(self):
                # Fetch SourceCode of Site
                url = u"http://www.engineeringtv.com/pages/about.us";
-               sourceCode = urlhandler.urlread(url, 2678400) # TTL = 1 Week
+               sourceCode = urlhandler.urlread(url, 604800) # TTL = 1 Week
                
                # Add Search Page
                self.add_search("Videos", u"/search/?search=%s")
+               self.add_item(u"-%s" % plugin.getuni(32941), 
thumbnail=(plugin.getIcon(), 0), url={"action":"Recent", 
"url":"http://www.engineeringtv.com/feed/recent.rss"})
                
                # Set Content Properties
                self.set_sort_methods(self.sort_method_unsorted)
                self.set_content("files")
                
                # Fetch and Return VideoItems
-               self.add_youtube_channel(u"engineeringtv")
+               self.add_youtube_channel(u"engineeringtv", hasHD=False)
                return self.regex_scraper(sourceCode) 
        
        def regex_scraper(self, sourceCode):
@@ -53,7 +54,59 @@ class Initialize(listitem.VirtualFS):
                        item.setParamDict(action="Videos", subaction="subcat", 
url=url)
                        
                        # Store Listitem data
-                       additem(item.getListitemTuple(isPlayable=False))
+                       additem(item.getListitemTuple(False))
+               
+               # Return list of listitems
+               return results
+
+class Recent(listitem.VirtualFS):
+       @plugin.error_handler
+       def scraper(self):
+               # Fetch Video Content
+               sourceObj = urlhandler.urlopen(plugin["url"], 14400) # TTL = 4 
Hours
+               
+               # Set Content Properties
+               self.set_sort_methods(self.sort_method_date, 
self.sort_method_video_title)
+               self.set_content("episodes")
+               
+               # Fetch and Return VideoItems
+               return self.xml_scraper(sourceObj)
+       
+       def xml_scraper(self, sourceObj):
+               # Create Speed vars
+               results = []
+               additem = results.append
+               localListitem = listitem.ListItem
+               
+               # Import XML Parser and Parse sourceObj
+               import xml.etree.ElementTree as ElementTree
+               tree = ElementTree.parse(sourceObj)
+               sourceObj.close()
+               
+               # Loop thought earch Show element
+               for node in tree.getiterator("item"):
+                       # Create listitem of Data
+                       item = localListitem()
+                       item.setAudioInfo()
+                       item.setQualityIcon(False)
+                       item.setLabel(node.findtext("title"))
+                       
item.setThumbnailImage(node.find("enclosure").get("url"))
+                       item.setInfoDict(plot=node.findtext("description"), 
credits=node.findtext("author"))
+                       
+                       # Fetch url
+                       url = node.findtext("link")
+                       url = url[url.rfind("/video/"):]
+                       item.setParamDict(url=url, action="PlayVideo")
+                       
+                       # Add Date Info
+                       date = node.findtext("pubDate")
+                       item.setDateInfo(date[:date.rfind("-")-1], "%a, %d %b 
%Y %H:%M:%S")
+                       
+                       # Add Context item to link to related videos
+                       item.addRelatedContext(url=url)
+                       
+                       # Store Listitem data
+                       additem(item.getListitemTuple(True))
                
                # Return list of listitems
                return results
@@ -68,7 +121,7 @@ class Videos(listitem.VirtualFS):
        def subCategories(self, catID):
                # Fetch SourceCode
                url = u"http://www.engineeringtv.com/pages/%s"; % catID
-               sourceCode = urlhandler.urlread(url, 2678400) # TTL = 1 Week
+               sourceCode = urlhandler.urlread(url, 604800) # TTL = 1 Week
                
                # Fetch List of Sub Categories
                import CommonFunctions, re
@@ -93,7 +146,7 @@ class Videos(listitem.VirtualFS):
                                item.setParamDict(action="Videos", 
url=u"/watch/playlist/%s" % searchID.findall(htmlSegment)[0])
                                
                                # Store Listitem data
-                               additem(item.getListitemTuple(isPlayable=False))
+                               additem(item.getListitemTuple(False))
                        
                        # Return list of listitems
                        return results
@@ -102,7 +155,22 @@ class Videos(listitem.VirtualFS):
                # Fetch SourceCode
                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
+               
+               # Fetch redirected Url from database and load webpage
+               from xbmcutil import storageDB
+               urlDB = storageDB.Metadata()
+               sourceObj = urlhandler.urlopen(urlDB.get(url, url), 14400, 
stripEntity=True) # TTL = 4 Hours
+               
+               # If Redirect is not found in Database then add it
+               if url in urlDB: urlDB.close()
+               else:
+                       # Save DB
+                       urlDB[url] = sourceObj.geturl()
+                       urlDB.sync()
+                       urlDB.close()
+               
+               # Read in data from cache and decode into unicode
+               sourceCode = sourceObj.read().decode("utf-8")
                
                # Set Content Properties
                self.set_sort_methods(self.sort_method_unsorted)
@@ -137,7 +205,7 @@ class Videos(listitem.VirtualFS):
                        item.addRelatedContext(url=url)
                        
                        # Store Listitem data
-                       additem(item.getListitemTuple(isPlayable=True))
+                       additem(item.getListitemTuple(True))
                        
                # Return list of listitems
                return results
@@ -147,7 +215,7 @@ class Related(listitem.VirtualFS):
        def scraper(self):
                # Fetch SourceCode of Site
                url = u"http://www.engineeringtv.com%(url)s" % plugin
-               sourceCode = urlhandler.urlread(url, 28800) # TTL = 8 Hours
+               sourceCode = urlhandler.urlread(url, 14400) # TTL = 4 Hours
                
                # Set Content Properties
                self.set_sort_methods(self.sort_method_unsorted)
@@ -184,7 +252,7 @@ class Related(listitem.VirtualFS):
                        item.addRelatedContext(url=url, updatelisting="true")
                        
                        # Store Listitem data
-                       additem(item.getListitemTuple(isPlayable=True))
+                       additem(item.getListitemTuple(True))
                        
                # Return list of listitems
                return results
@@ -198,12 +266,12 @@ class PlayVideo(listitem.PlayMedia):
                try:
                        # Fetch SourceCode of Site
                        url = u"http://www.engineeringtv.com%(url)s/player" % 
plugin
-                       sourceCode = urlhandler.urlread(url, 1800) # TTL = 30 
Mins
+                       sourceCode = urlhandler.urlread(url, 1800, 
stripEntity=False) # 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
+                       sourceCode = urlhandler.urlread(url, 1800, 
stripEntity=False) # TTL = 30 Mins
                        
                        # Fetch Video Url
                        videoUrl = 
re.findall('"pipeline_xid"\s*:\s*"(http://videos\.\S+?)"', sourceCode)[0]
@@ -212,7 +280,7 @@ class PlayVideo(listitem.PlayMedia):
                except:
                        # Fetch SourceCode of Site
                        url = u"http://www.engineeringtv.com%(url)s" % plugin
-                       sourceCode = urlhandler.urlread(url, 86400) # TTL = 24 
Hours
+                       sourceCode = urlhandler.urlread(url, 1800, 
stripEntity=False) # TTL = 30 Mins
                        
                        # Fetch Video Url
                        try: url = 
re.findall('src=\\\\"(http://videos\.cache\.magnify\.net/\S+?)\\\\" autoplay 
controls poster', sourceCode)[0]
diff --git a/plugin.video.engineeringtv/resources/settings.xml 
b/plugin.video.engineeringtv/resources/settings.xml
index 6af4bb7..c0c880c 100644
--- a/plugin.video.engineeringtv/resources/settings.xml
+++ b/plugin.video.engineeringtv/resources/settings.xml
@@ -2,12 +2,12 @@
 <settings>
        <category>
                <!-- ViewModes -->
-               <setting id="files" type="enum" label="30004" 
lvalues="30006|30007|30008|30009" default="0" />
-               <setting id="filescustom" type="number" label="30010" 
visible="eq(-1,3)" />
-               <setting id="episodes" type="enum" label="30005" 
lvalues="30006|30007|30008|30009" default="0" />
-               <setting id="episodescustom" type="number" label="30010" 
visible="eq(-1,3)" />
+               <setting id="files" type="enum" 
label="$ADDON[script.module.xbmcutil 32921]" lvalues="571|537|21371|636" 
default="0" />
+               <setting id="filescustom" type="number" 
label="$ADDON[script.module.xbmcutil 32923]" visible="eq(-1,3)" />
+               <setting id="episodes" type="enum" 
label="$ADDON[script.module.xbmcutil 32922]" lvalues="571|537|21371|636" 
default="0" />
+               <setting id="episodescustom" type="number" 
label="$ADDON[script.module.xbmcutil 32923]" visible="eq(-1,3)" />
                <!-- Downloads -->
                <setting type="sep" />
-               <setting id="downloadpath" type="folder" label="30003" 
source="video" option="writeable" default="" />
+               <setting id="downloadpath" type="folder" 
label="$ADDON[script.module.xbmcutil 32924]" source="video" option="writeable" 
default="" />
        </category>
 </settings>
\ No newline at end of file

http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=8aa1b1a8542be10c9bbae0bf1af07eb24b3c2b29


http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=a0985d36b1e8ca4035c69eb33120562e103c93c0

commit a0985d36b1e8ca4035c69eb33120562e103c93c0
Author: Martijn Kaijser <[email protected]>
Date:   Sat Jul 26 12:19:49 2014 +0200

    [plugin.video.fox.news] 4.0.3

diff --git a/plugin.video.fox.news/addon.xml b/plugin.video.fox.news/addon.xml
index f7aaf38..057d1ad 100644
--- a/plugin.video.fox.news/addon.xml
+++ b/plugin.video.fox.news/addon.xml
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <addon id="plugin.video.fox.news"
        name="Fox News"
-       version="4.0.1"
-       provider-name="divingmule, t1m">
+       version="4.0.3"
+       provider-name="t1m,divingmule">
     <requires>
         <import addon="xbmc.python" version="2.1.0"/>
         <import addon="script.module.beautifulsoup4" version="4.3.1"/>
diff --git a/plugin.video.fox.news/default.py b/plugin.video.fox.news/default.py
index 0fea9dd..9ea27a5 100644
--- a/plugin.video.fox.news/default.py
+++ b/plugin.video.fox.news/default.py
@@ -67,48 +67,14 @@ def get_categories(url=None):
         add_dir('%s - %s' % (__language__(30001),__language__(30002)), 
'http://video.foxbusiness.com/#show-clips', icon, 'get_sub_cat')
         add_dir('%s - %s' % (__language__(30001),__language__(30003)), 
'http://video.foxbusiness.com/#news-clips', icon, 'get_sub_cat')
 
-#    if url is None:
-#        # live streams are still WIP
-#        # add_dir('Watch Live', news_domain + '/playlist/live-landing-page/', 
icon, 'get_playlist')
-#        add_dir('FoxBusiness.com', business_domain, icon, 'get_categories')
-#        url = news_domain
-#        cat_url = url
-#        cat_url = url + '/playlist/featured-editors-picks/'
-#    else:
-#        cat_url = url + '/playlist/latest-video-latest-video/'
-#    soup = get_soup(cat_url)
-#    for i in soup.find('nav')('a'):
-#        add_dir(i.string.encode('utf-8'), url + i['href'], icon, 
'get_sub_cat')
-
 
 def get_sub_categories(url):
     urlbase, utype = url.split('#')
-#    print "url = "+str(url)
     data = make_request(url)
-#    print "data = "+str(data)
     sub_cats = re.compile('<div class="column footer-%s">(.+?)</div>' % 
(utype),re.DOTALL).findall(data)
     sub_cats = re.compile('href="(.+?)">(.+?)<',re.DOTALL).findall(sub_cats[0])
     for url,name in sub_cats:
       add_dir(name.replace('&amp;','&').encode('utf-8'), urlbase+url, icon, 
'get_playlist')
-#start of added code
-#      soup = get_soup(urlbase+url)
-#      items_soup = soup('div', attrs={'id' : 'shows'})[0]('a')
-#      items_soup = soup.find('div')('box box-4 sidebar')[0]('a')
-#      current = False
-#      items = []
-#      for i in items_soup:
-#          item_url = 'http:' + i['href']
-#          if item_url == url:
-#              current = (i.string.encode('utf-8'), item_url, icon, 
'get_playlist')
-#              continue
-#          items.append((i.string.encode('utf-8'), item_url, icon, 
'get_playlist'))
-#      if not current:
-#          current_name = soup.body.h1.contents[0].strip().encode('utf-8')
-#          current = (current_name, url, icon, 'get_playlist')
-#      items.insert(0, current)
-#      for i in items:
-#          add_dir(*i)
-#end of added code
 
 def get_video(video_id):
     url = news_domain + '/v/feed/video/%s.js?template=fox' %video_id
@@ -190,7 +156,6 @@ def get_videolist(url):
     if business_domain in url:
         domain = business_domain
     json_url = domain + '/v/feed/playlist/%s.js?template=fox' %match[0]
-#    print "json_url = "+str(json_url)
     json_data = json.loads(make_request(json_url), 'utf-8')
     items = json_data['channel']['item']
     for i in items:
@@ -314,8 +279,8 @@ elif mode == 'get_playlist':
 elif mode == 'get_videolist':
     get_videolist(params['url'])
     xbmcplugin.setContent(int(sys.argv[1]), 'episodes')
-    xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_NONE)
     xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_DATE)
+    xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_GENRE)
     xbmcplugin.endOfDirectory(int(sys.argv[1]))
 
 elif mode == 'resolve_url':

http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=1e6c7dec7c4cb7dea6fb9a8c67cb818526edd666

commit 1e6c7dec7c4cb7dea6fb9a8c67cb818526edd666
Author: Martijn Kaijser <[email protected]>
Date:   Sat Jul 26 12:18:35 2014 +0200

    [plugin.video.npr] 1.0.4

diff --git a/plugin.video.npr/README.txt b/plugin.video.npr/README.txt
index bb1ee9d..87e5373 100644
--- a/plugin.video.npr/README.txt
+++ b/plugin.video.npr/README.txt
@@ -10,3 +10,6 @@ version 1.0.2 clean-up of genre
 
 Version 1.0.3 - website changes
 
+Version 1.0.4 - website changes
+
+
diff --git a/plugin.video.npr/addon.xml b/plugin.video.npr/addon.xml
index 4957167..19b41de 100644
--- a/plugin.video.npr/addon.xml
+++ b/plugin.video.npr/addon.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <addon id="plugin.video.npr"
        name="NPR Music Videos"
-       version="1.0.3"
+       version="1.0.4"
        provider-name="t1m">
   <requires>
     <import addon="xbmc.python" version="2.1.0"/>
diff --git a/plugin.video.npr/changelog.txt b/plugin.video.npr/changelog.txt
index d8cd55f..97841c5 100644
--- a/plugin.video.npr/changelog.txt
+++ b/plugin.video.npr/changelog.txt
@@ -1,3 +1,5 @@
+Version 1.0.4 - website changes
+
 Version 1.0.3 - website changes
 
 Version 1.0.2 - cleanup of genre
diff --git a/plugin.video.npr/default.py b/plugin.video.npr/default.py
index 67a1221..26b9148 100644
--- a/plugin.video.npr/default.py
+++ b/plugin.video.npr/default.py
@@ -44,6 +44,8 @@ def demunge(munge):
 def deuni(a):
     a = a.replace('&amp;#039;',"'")
     a = a.replace('&amp','&')
+    a = a.replace('&;','&')
+    a = a.replace('&quot;',"'")
     a = a.replace('&#039;',"'")
     return a
 
@@ -72,48 +74,35 @@ def getSources(fanart):
               urlbase   = NPRBASE % ('/sections/music-videos/')
               pg = getRequest(urlbase)
               catname = __language__(30000)
+              urlbase = NPRBASE % ('/series/15667984/favorite-sessions')
               
addDir(catname,urlbase.encode(UTF8),'GC',icon,addonfanart,catname,GENRE,'',False)
               blob = re.compile('<div 
class="subtopics">(.+?)</ul>').findall(pg)[0]
               cats = re.compile('<a href="(.+?)">(.+?)<').findall(blob)
               for caturl, catname in cats:
                   caturl = NPRBASE % (caturl)
-#                  caturl = 
'http://www.npr.org/templates/archives/archive.php?thingId=%s' % (caturl)
                   
addDir(catname,caturl.encode(UTF8),'GC',icon,addonfanart,catname,GENRE,'',False)
 
 def getCats(cat_url):
-           pg = getRequest(cat_url)
-           if cat_url == NPRBASE % ('/sections/music-videos/'):
-              blob = re.compile('data-metrics-action="Click Music 
Genres"(.+?)</ul>').findall(pg)[0]
-              cats = re.compile('href="(.+?)">(.+?)<').findall(blob)
-              for caturl, catname in cats:
-                  caturl = NPRBASE % (caturl)
-                  catname = deuni(catname)
-                  
addDir(catname,caturl.encode(UTF8),'GC',icon,addonfanart,catname,GENRE,'',False)
-           else:
-             if not ('thingId' in cat_url):
-               sid = re.compile('"storyId":"(.+?)"').findall(pg)[0]
-               cat_url = 
'http://www.npr.org/templates/archives/archive.php?thingId=%s' % (sid)
-               pg = getRequest(cat_url)
-             blobs = re.compile('<div class="bucket clearfix">(.+?)END 
CLASS="BUCKET CLEARFIX"').findall(pg)
+             pg = getRequest(cat_url)
+             blobs = re.compile('<article class(.+?)</article>').findall(pg)
+             curlink  = 0
+             nextlink = 1
              for blob in blobs:
-               print "blob = "+str(blob)
-               shows = re.compile('<a href="(.+?)".+?src="(.+?)".+?<p 
class="watch">.+?<h4>.+?">(.+?)<.+?<p>(.+?)</p>').findall(blob)
-               for showurl, showimg, showname, showdesc in shows:
-                 try:
-                    (showdate, showdesc) = showdesc.split('</span>',1)
-                    showdate = re.compile('.+?>(.+?)&').findall(showdate)[0]
-                    showdesc = '%s\n%s' % (showdate, showdesc.strip())
-                 except:
-                    pass
+               nextlink = nextlink+1
+               if ('article-video' in blob) or ('type-video' in blob):
+                 (showurl, showimg, showname) = re.compile('<a 
href="(.+?)".+?src="(.+?)".+?title="(.+?)"').findall(blob)[0]
                  showurl = "%s?url=%s&name=%s&mode=GS" %(sys.argv[0], 
urllib.quote_plus(showurl), urllib.quote_plus(showname))
-                 
addLink(showurl.encode(UTF8),deuni(showname),showimg,addonfanart,deuni(showdesc),GENRE,'')
-             try:
-                 nextlink = re.compile('<a class="next" 
href="(.+?)"').findall(pg)[0]
-                 caturl  = NPRBASE % (nextlink)
-                 catname = '[COLOR red]%s[/COLOR]' % (__language__(30001))
-                 
addDir(catname,caturl.encode(UTF8),'GC','',addonfanart,catname,GENRE,'',False)
-             except:
-                 pass
+                 
addLink(showurl.encode(UTF8),deuni(showname),showimg,addonfanart,deuni(showname),GENRE,'')
+
+             nextstr = '/archive?start='
+             nexturl = cat_url
+             if (nextstr in cat_url):
+                (nexturl,curlink) = nexturl.split(nextstr,1)
+                curlink = int(curlink)
+             nextlink = str(nextlink+curlink+1)
+             nexturl = nexturl+nextstr+nextlink
+             catname = '[COLOR red]%s[/COLOR]' % (__language__(30001))
+             
addDir(catname,nexturl.encode(UTF8),'GC','',addonfanart,catname,GENRE,'',False)
 
 
 def getShow(show_url, show_name):
diff --git a/plugin.video.npr/resources/language/English/strings.xml 
b/plugin.video.npr/resources/language/English/strings.xml
index f2a9d66..8b43bc7 100644
--- a/plugin.video.npr/resources/language/English/strings.xml
+++ b/plugin.video.npr/resources/language/English/strings.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <strings>
-    <string id="30000">Genres</string>
+    <string id="30000">Favorite Sessions</string>
     <string id="30001">Goto Next Page</string>
     <string id="30002">NPR Music</string>
     <string id="30003">No Playable Video Found</string>

-----------------------------------------------------------------------

Summary of changes:
 .../LICENSE.txt                                    |    0
 plugin.video.awntv/addon.py                        |   31 ++
 plugin.video.awntv/addon.xml                       |   21 ++
 plugin.video.awntv/changelog.txt                   |    2 +
 plugin.video.awntv/icon.png                        |  Bin 0 -> 8410 bytes
 .../resources/language/English/strings.po          |   34 ++
 plugin.video.awntv/resources/lib/main.py           |  115 ++++++
 plugin.video.awntv/resources/lib/parsers.py        |  368 ++++++++++++++++++++
 plugin.video.awntv/resources/settings.xml          |   15 +
 .../LICENSE.txt                                    |    0
 plugin.video.enemy.territory/addon.py              |   31 ++
 plugin.video.enemy.territory/addon.xml             |   21 ++
 plugin.video.enemy.territory/changelog.txt         |   14 +
 plugin.video.enemy.territory/icon.png              |  Bin 0 -> 40503 bytes
 plugin.video.enemy.territory/resources/lib/main.py |   66 ++++
 .../resources/settings.xml                         |   11 +
 plugin.video.engineeringtv/addon.py                |   17 +-
 plugin.video.engineeringtv/addon.xml               |    5 +-
 plugin.video.engineeringtv/changelog.txt           |    7 +
 .../resources/language/English/strings.xml         |   14 -
 plugin.video.engineeringtv/resources/lib/main.py   |   92 +++++-
 plugin.video.engineeringtv/resources/settings.xml  |   10 +-
 plugin.video.filmsforaction/addon.xml              |    3 +-
 plugin.video.filmsforaction/changelog.txt          |    3 +
 .../resources/lib/ffa_api.py                       |   65 ++--
 .../resources/tests/test_api.py                    |    8 +-
 plugin.video.fox.news/addon.xml                    |    4 +-
 plugin.video.fox.news/default.py                   |   37 +--
 .../LICENSE.txt                                    |    0
 plugin.video.johnlocker/addon.py                   |   31 ++
 plugin.video.johnlocker/addon.xml                  |   24 ++
 plugin.video.johnlocker/changelog.txt              |   15 +
 plugin.video.johnlocker/icon.png                   |  Bin 0 -> 15333 bytes
 .../resources/language/English/strings.po          |   43 +++
 plugin.video.johnlocker/resources/lib/main.py      |  247 +++++++++++++
 .../resources/media/channels.jpg                   |  Bin 0 -> 10406 bytes
 .../resources/media/featured.png                   |  Bin 0 -> 74504 bytes
 plugin.video.johnlocker/resources/media/latest.png |  Bin 0 -> 27591 bytes
 plugin.video.johnlocker/resources/media/rated.jpg  |  Bin 0 -> 6776 bytes
 plugin.video.johnlocker/resources/media/viewed.jpg |  Bin 0 -> 1892 bytes
 plugin.video.johnlocker/resources/settings.xml     |   16 +
 plugin.video.metalvideo/addon.py                   |    6 +-
 plugin.video.metalvideo/addon.xml                  |    6 +-
 plugin.video.metalvideo/changelog.txt              |    5 +-
 .../resources/language/English/strings.po          |   39 ++
 .../resources/language/English/strings.xml         |   24 --
 plugin.video.metalvideo/resources/lib/main.py      |   35 +-
 plugin.video.metalvideo/resources/settings.xml     |   12 +-
 plugin.video.npr/README.txt                        |    3 +
 plugin.video.npr/addon.xml                         |    2 +-
 plugin.video.npr/changelog.txt                     |    2 +
 plugin.video.npr/default.py                        |   53 ++--
 .../resources/language/English/strings.xml         |    2 +-
 plugin.video.oodnurdtv/addon.py                    |    6 +-
 plugin.video.oodnurdtv/addon.xml                   |    2 +-
 plugin.video.oodnurdtv/resources/drundoo.py        |    4 +-
 plugin.video.quake.live/addon.py                   |   17 +-
 plugin.video.quake.live/addon.xml                  |    4 +-
 plugin.video.quake.live/changelog.txt              |    6 +
 plugin.video.quake.live/fanart-licensing.txt       |    4 +
 plugin.video.quake.live/fanart.jpg                 |  Bin 57070 -> 1316203 
bytes
 .../resources/language/English/strings.xml         |   14 -
 plugin.video.quake.live/resources/lib/main.py      |    6 +-
 plugin.video.quake.live/resources/settings.xml     |    8 +-
 .../LICENSE.txt                                    |    0
 plugin.video.science.friday/addon.py               |   31 ++
 plugin.video.science.friday/addon.xml              |   22 ++
 plugin.video.science.friday/changelog.txt          |    2 +
 plugin.video.science.friday/icon.png               |  Bin 0 -> 4991 bytes
 .../resources/language/English/strings.po          |   46 +++
 plugin.video.science.friday/resources/lib/main.py  |  133 +++++++
 .../resources/lib/parsers.py                       |  216 ++++++++++++
 plugin.video.science.friday/resources/settings.xml |   15 +
 plugin.video.snagfilms/README.txt                  |    2 +
 plugin.video.snagfilms/addon.xml                   |    6 +-
 plugin.video.snagfilms/changelog.txt               |    2 +
 plugin.video.snagfilms/default.py                  |   72 ++++-
 .../resources/language/English/strings.xml         |    4 +
 plugin.video.watchmojo/addon.py                    |   17 +-
 plugin.video.watchmojo/addon.xml                   |    4 +-
 plugin.video.watchmojo/changelog.txt               |    6 +
 .../resources/language/English/strings.po          |   34 ++
 .../resources/language/English/strings.xml         |   14 -
 plugin.video.watchmojo/resources/lib/main.py       |   43 ++-
 plugin.video.watchmojo/resources/lib/parsers.py    |   40 ++-
 plugin.video.watchmojo/resources/settings.xml      |   12 +-
 86 files changed, 2050 insertions(+), 301 deletions(-)
 copy {plugin.audio.deejayIt.reloaded => plugin.video.awntv}/LICENSE.txt (100%)
 create mode 100644 plugin.video.awntv/addon.py
 create mode 100644 plugin.video.awntv/addon.xml
 create mode 100644 plugin.video.awntv/changelog.txt
 create mode 100644 plugin.video.awntv/icon.png
 create mode 100644 plugin.video.awntv/resources/language/English/strings.po
 create mode 100644 plugin.video.awntv/resources/lib/main.py
 create mode 100644 plugin.video.awntv/resources/lib/parsers.py
 create mode 100644 plugin.video.awntv/resources/settings.xml
 copy {plugin.audio.deejayIt.reloaded => 
plugin.video.enemy.territory}/LICENSE.txt (100%)
 create mode 100644 plugin.video.enemy.territory/addon.py
 create mode 100644 plugin.video.enemy.territory/addon.xml
 create mode 100644 plugin.video.enemy.territory/changelog.txt
 create mode 100644 plugin.video.enemy.territory/icon.png
 create mode 100644 plugin.video.enemy.territory/resources/lib/main.py
 create mode 100644 plugin.video.enemy.territory/resources/settings.xml
 delete mode 100644 
plugin.video.engineeringtv/resources/language/English/strings.xml
 copy {plugin.audio.deejayIt.reloaded => plugin.video.johnlocker}/LICENSE.txt 
(100%)
 create mode 100644 plugin.video.johnlocker/addon.py
 create mode 100644 plugin.video.johnlocker/addon.xml
 create mode 100644 plugin.video.johnlocker/changelog.txt
 create mode 100644 plugin.video.johnlocker/icon.png
 create mode 100644 
plugin.video.johnlocker/resources/language/English/strings.po
 create mode 100644 plugin.video.johnlocker/resources/lib/main.py
 create mode 100644 plugin.video.johnlocker/resources/media/channels.jpg
 create mode 100644 plugin.video.johnlocker/resources/media/featured.png
 create mode 100644 plugin.video.johnlocker/resources/media/latest.png
 create mode 100644 plugin.video.johnlocker/resources/media/rated.jpg
 create mode 100644 plugin.video.johnlocker/resources/media/viewed.jpg
 create mode 100644 plugin.video.johnlocker/resources/settings.xml
 create mode 100644 
plugin.video.metalvideo/resources/language/English/strings.po
 delete mode 100644 
plugin.video.metalvideo/resources/language/English/strings.xml
 create mode 100644 plugin.video.quake.live/fanart-licensing.txt
 delete mode 100644 
plugin.video.quake.live/resources/language/English/strings.xml
 copy {plugin.audio.deejayIt.reloaded => 
plugin.video.science.friday}/LICENSE.txt (100%)
 create mode 100644 plugin.video.science.friday/addon.py
 create mode 100644 plugin.video.science.friday/addon.xml
 create mode 100644 plugin.video.science.friday/changelog.txt
 create mode 100644 plugin.video.science.friday/icon.png
 create mode 100644 
plugin.video.science.friday/resources/language/English/strings.po
 create mode 100644 plugin.video.science.friday/resources/lib/main.py
 create mode 100644 plugin.video.science.friday/resources/lib/parsers.py
 create mode 100644 plugin.video.science.friday/resources/settings.xml
 create mode 100644 plugin.video.watchmojo/resources/language/English/strings.po
 delete mode 100644 
plugin.video.watchmojo/resources/language/English/strings.xml


hooks/post-receive
-- 
Plugins

------------------------------------------------------------------------------
Want fast and easy access to all the code in your enterprise? Index and
search up to 200,000 lines of code with a free copy of Black Duck
Code Sight - the same software that powers the world's largest code
search on Ohloh, the Black Duck Open Hub! Try it now.
http://p.sf.net/sfu/bds
_______________________________________________
Xbmc-addons mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/xbmc-addons

Reply via email to