The branch, frodo has been updated
       via  eb8a64d48c9c5c0b753da3bf183ffedad0ae82ec (commit)
       via  3fafa7d0becdd8e2d2acd5f49cc164411d5565b7 (commit)
       via  286badd08ab3b9813e75ba689763b4d18492397e (commit)
      from  995fb0853f541dc07682ce6281d5ea303e15e761 (commit)

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

commit eb8a64d48c9c5c0b753da3bf183ffedad0ae82ec
Author: Martijn Kaijser <[email protected]>
Date:   Wed May 14 09:17:41 2014 +0200

    [plugin.video.hgtv] 2.0.2

diff --git a/plugin.video.hgtv/addon.xml b/plugin.video.hgtv/addon.xml
index b85b417..85b6680 100644
--- a/plugin.video.hgtv/addon.xml
+++ b/plugin.video.hgtv/addon.xml
@@ -1,24 +1,25 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <addon id="plugin.video.hgtv"
        name="HGTV"
-       version="1.0.7"
-       provider-name="divingmule">
+       version="2.0.2"
+       provider-name="t1m">
   <requires>
     <import addon="xbmc.python" version="2.1.0"/>
-    <import addon="script.module.beautifulsoup4" version="4.3.1"/>
-    <import addon="script.common.plugin.cache" version="2.5.2"/>
   </requires>
-  <extension point="xbmc.python.pluginsource" library="default.py">
-    <provides>video</provides>
+  <extension point="xbmc.python.pluginsource"
+            library="default.py">
+        <provides>video</provides>
   </extension>
   <extension point="xbmc.addon.metadata">
-    <summary>Home and Garden TV</summary>
-    <description>Full episodes from hgtv.com</description>
-    <disclaimer>These videos seem to be restricted to the U.S. 
only.</disclaimer>
+    <summary lang="en">HGTV Video Addon</summary>
+    <description lang="en">Play videos from the HGTV Network</description>
+    <disclaimer lang="en">Feel free to use this script. For information visit 
the wiki.</disclaimer>
     <platform>all</platform>
     <language>en</language>
     <license>GNU GENERAL PUBLIC LICENSE. Version 2, June 1991</license>
-    <source>https://code.google.com/p/hgtv-xbmc/</source>
     <forum>http://forum.xbmc.org/showthread.php?tid=97018</forum>
+    <website>www.hgtv.com</website>
+    <email></email>
+    <source>https://github.com/learningit/plugin.video.hgtv/</source>
   </extension>
-</addon>
\ No newline at end of file
+</addon>
diff --git a/plugin.video.hgtv/changelog.txt b/plugin.video.hgtv/changelog.txt
index a0473b6..3de11b3 100644
--- a/plugin.video.hgtv/changelog.txt
+++ b/plugin.video.hgtv/changelog.txt
@@ -1,26 +1,3 @@
-Version 1.0.7
-fix scrip error on some systems
 
-Version 1.0.6
-added support for video clips where available
-fix resume/watched status
-bump python api version for gotham
+Version 2.0.2 Initial release
 
-Version 1.0.5
-minor fixes, code improvements
-
-Version 1.0.4
-we now scrape http://www.hgtv.com/full-episodes/package/index.html for the 
show list and hard-code other shows in the 'More' directory
-
-Version 1.0.3
-added some new shows
-
-Version 1.0.2
-fix for extra seasons
-
-Version 1.0.1
-fix for website changes
-added extra seasons where available
-
-Version 1.0.0
-initial for eden-pre
\ No newline at end of file
diff --git a/plugin.video.hgtv/default.py b/plugin.video.hgtv/default.py
index 90f5735..337b130 100644
--- a/plugin.video.hgtv/default.py
+++ b/plugin.video.hgtv/default.py
@@ -1,253 +1,161 @@
-import urllib
-import urllib2
-import re
-import xbmcplugin
-import xbmcgui
-import xbmcaddon
-import StorageServer
-from bs4 import BeautifulSoup
-from urlparse import urlparse, parse_qs
-from traceback import format_exc
-
-
-addon = xbmcaddon.Addon()
-addon_id = addon.getAddonInfo('id')
-addon_version = addon.getAddonInfo('version')
-cache = StorageServer.StorageServer("hgtv", 6)
-base_url = 'http://www.hgtv.com'
-
-
-def addon_log(string):
-    xbmc.log("[%s-%s]: %s" %(addon_id, addon_version, string), 
level=xbmc.LOGNOTICE)
-
-
-def make_request(url):
-    addon_log('Request URL: %s' %url)
-    headers = {'User-agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) 
Gecko/20100101 Firefox/17.0',
-               'Referer' : base_url}
-    try:
-        req = urllib2.Request(url, None, headers)
-        response = urllib2.urlopen(req)
-        data = response.read()
-        response.close()
-        return data
-    except urllib2.URLError, e:
-        addon_log('We failed to open "%s".' %url)
-        if hasattr(e, 'reason'):
-            addon_log('We failed to reach a server.')
-            addon_log('Reason: %s' %e.reason)
-        if hasattr(e, 'code'):
-            addon_log('We failed with error code - %s.' %e.code)
-
-
-def get_soup(url):
-    if url.startswith('/'):
-        url = base_url + url
-    try:
-        soup = BeautifulSoup(make_request(url), "html.parser")
-        return soup
-    except:
-        addon_log('failed to parse the soup')
-
-
-def cache_shows():
-    soup = get_soup('/full-episodes/package/index.html')
-    shows = soup.findAll('ol', attrs={'id' : "fe-list"})[1]('li')
-    show_dict = {}
-    for i in shows:
-        name = i('img')[0]['alt'].lstrip()
-        if show_dict.has_key(name):
-            continue
-        show_dict[name] = {
-            'url': i('a', class_='button')[0]['href'],
-            'thumbnail': i('img')[0]['src'].strip(),
-            'description': i.p.string}
-    return show_dict
-
-
-def display_shows():
-    shows = cache.cacheFunction(cache_shows)
-    for i in shows.keys():
-        add_dir(i, shows[i]['url'], shows[i]['description'], 
shows[i]['thumbnail'], 1)
-
-
-def display_show(url, iconimage, videos=False):
-    soup = get_soup(url)
-    if not soup:
-        if '/show/' in url:
-            soup = get_soup(url.replace('/show/index', '/videos/index'))
-            if not soup:
-                return
-        else: return
-    cats = index(soup, iconimage)
-    current = None
-    if videos:
-        current = get_playlist(soup, 'videos')
-    else:
-        current = get_playlist(soup, True)
-
-    if current is None and not videos:
-        try:
-            show_href = soup.find('ul', class_='button-nav')('a', text='FULL 
EPISODES')[0]['href']
-            if show_href:
-                return display_show(show_href, iconimage)
-            else: raise
-        except:
-            addon_log('did not find current playlist')
-    elif current is None:
+# -*- coding: utf-8 -*-
+# HGTV XBMC Addon
+
+import sys
+import httplib
+
+import urllib, urllib2, cookielib, datetime, time, re, os, string
+import xbmcplugin, xbmcgui, xbmcaddon, xbmcvfs, xbmc
+import cgi, gzip
+from StringIO import StringIO
+
+
+USER_AGENT = 'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 
(KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25'
+GENRE_TV  = "TV"
+UTF8          = 'utf-8'
+MAX_PER_PAGE  = 25
+HGTVBASE = 'http://www.hgtv.com%s'
+XMLBASE  = 'http://www.hgtv.com/hgtv/channel/xml/0,,%s,00.xml'
+
+addon         = xbmcaddon.Addon('plugin.video.hgtv')
+__addonname__ = addon.getAddonInfo('name')
+__language__  = addon.getLocalizedString
+
+
+home          = addon.getAddonInfo('path').decode(UTF8)
+icon          = xbmc.translatePath(os.path.join(home, 'icon.png'))
+addonfanart   = xbmc.translatePath(os.path.join(home, 'fanart.jpg'))
+
+
+def log(txt):
+    message = '%s: %s' % (__addonname__, txt.encode('ascii', 'ignore'))
+    xbmc.log(msg=message, level=xbmc.LOGDEBUG)
+
+def cleanfilename(name):    
+    valid_chars = "-_.() %s%s" % (string.ascii_letters, string.digits)
+    return ''.join(c for c in name if c in valid_chars)
+
+def demunge(munge):
         try:
-            show_href = soup.find('ul', class_='button-nav')('a', 
text='Videos')[0]['href']
-            if show_href:
-                return display_show(show_href, iconimage, True)
-            else: raise
+            munge = urllib.unquote_plus(munge).decode(UTF8)
         except:
-            addon_log('did not find current playlist')
-
-    if len(cats['directories']) > 1:
-        if current:
-            add_dir(current, 'cache_current', '', iconimage, 3)
-        for i in cats['directories']:
-            add_dir(i[0], i[1], '', i[2], 4)
-        xbmcplugin.setContent(int(sys.argv[1]), 'tvshows')
-        xbmc.executebuiltin('Container.SetViewMode(503)')
-    else:
-        if current:
-            if videos:
-                add_episodes(eval(cache.get('videos_base')))
-            else:
-                add_episodes(eval(cache.get('current_base')))
-    if not videos:
-        if cats['has_videos']:
-            add_dir('Videos', cats['has_videos'][0], '', 
cats['has_videos'][1], 5)
-
-
-def index(soup, iconimage):
-    items = []
-    try:
-        videos_soup = soup('div', class_= 'crsl-wrap')
-        if videos_soup:
-            for i in videos_soup:
-                name = i.find_previous('h4').contents[1].strip().replace('Full 
Episodes', '')
-                href = i.a['href']
-                items.append((name, href, iconimage))
-    except:
-        addon_log(format_exc())
-
-    try:
-        videos_href = soup.find('ul', class_='button-nav')('a', 
text='VIDEOS')[0]['href']
-        videos = (videos_href, iconimage)
-    except:
-        videos = None
-
-    return {'directories': items, 'has_videos': videos}
-
-
-def get_playlist(soup, base=False):
-    show_id = re.compile("var snap = new 
SNI.HGTV.Player.FullSize\(\'.+?','(.+?)', '.+?'\);").findall(str(soup))
-    if len(show_id) < 1:
-        addon_log('Houston we have a problem!')
-    else:
-        url = '%s/hgtv/channel/xml/0,,%s,00.xml' %(base_url, show_id[0])
-        videos_soup = get_soup(url)
-        parsed = [(i.clipname.string, i.videourl.string, i.abstract.string, 
i.thumbnailurl.string, i.length.string)
-                   for i in videos_soup('video')]
-        if base == 'videos':
-            cache.set('videos_base', repr(parsed))
-            return videos_soup.title.string
-        elif base:
-            cache.set('current_base', repr(parsed))
-            dir_title = videos_soup.title.string
-            if dir_title != 'Full Episodes':
-                dir_title = dir_title.replace('Full Episodes', '')
-            return dir_title
+            pass
+        return munge
+
+def getRequest(url):
+              log("getRequest URL:"+str(url))
+              headers = {'User-Agent':USER_AGENT, 'Accept':"text/html", 
'Accept-Encoding':'gzip,deflate,sdch', 'Accept-Language':'en-US,en;q=0.8'} 
+              req = urllib2.Request(url.encode(UTF8), None, headers)
+
+              try:
+                 response = urllib2.urlopen(req)
+                 if response.info().getheader('Content-Encoding') == 'gzip':
+                    log("Content Encoding == gzip")
+                    buf = StringIO( response.read())
+                    f = gzip.GzipFile(fileobj=buf)
+                    link1 = f.read()
+                 else:
+                    link1=response.read()
+              except:
+                 link1 = ""
+
+              link1 = str(link1).replace('\n','')
+              return(link1)
+
+
+def getSources(fanart):
+              urlbase   = HGTVBASE % ('/hgtv-full-episodes/videos/index.html')
+              pg = getRequest(urlbase)
+              caturl = 
re.compile("SNI\.HGTV\.Player.+?,'(.+?)'").findall(pg)[0]
+              catname = __language__(30000)
+              caturl  = XMLBASE % (caturl)
+              
addDir(catname,caturl,'GC',icon,addonfanart,catname,GENRE_TV,'',False)
+              cats = re.compile('<li class="switch.+?</em>(.+?)<.+?<a 
href="(.+?)".+?</li>').findall(pg)
+              for catname, caturl in cats:
+                  caturl = re.compile('_.+?_.+?_(.+?)-').findall(caturl)[0]
+                  caturl = XMLBASE % (caturl)
+                  catname = catname.strip()
+                  
addDir(catname,caturl,'GC',icon,addonfanart,catname,GENRE_TV,'',False)
+
+def getCats(cat_url):
+              pg = getRequest(cat_url)
+              shows = 
re.compile('<video>.+?<clipName>.+?CDATA\[(.+?)\].+?<videoUrl>.+?CDATA\[(.+?)\].+?<thumbnailUrl>.+?CDATA\[(.+?)\].+?<abstract>.+?CDATA\[(.+?)\].+?</video>').findall(pg)
+              for showname, showurl, showimg, showdesc in shows:
+                 showurl = 
showurl.replace('http://wms.scrippsnetworks.com','').replace('.wmv','')
+                 showurl = 
'rtmp://flash.scrippsnetworks.com:1935/ondemand?ovpfv=1.1 
swfUrl=http://common.scrippsnetworks.com/common/snap/snap-3.0.3.swf 
playpath=%s' % (showurl)
+                 
addLink(showurl.encode(UTF8),showname,showimg,addonfanart,showdesc,GENRE_TV,'')
+
+
+
+def play_playlist(name, list):
+        playlist = xbmc.PlayList(1)
+        playlist.clear()
+        item = 0
+        for i in list:
+            item += 1
+            info = xbmcgui.ListItem('%s) %s' %(str(item),name))
+            playlist.add(i, info)
+        xbmc.executebuiltin('playlist.playoffset(video,0)')
+
+
+def 
addDir(name,url,mode,iconimage,fanart,description,genre,date,showcontext=True,playlist=None,autoplay=False):
+        u=sys.argv[0]+"?url="+urllib.quote_plus(url)+"&mode="+mode
+        dir_playable = False
+        cm = []
+
+        if mode != 'SR':
+            u += "&name="+urllib.quote_plus(name)
+            if (fanart is None) or fanart == '': fanart = addonfanart
+            u += "&fanart="+urllib.quote_plus(fanart)
+            dir_image = "DefaultFolder.png"
+            dir_folder = True
         else:
-            return parsed
-
-
-def add_episodes(items):
-    if not isinstance(items, list):
-        item_list = [items]
-        items = item_list
-    for i in items:
-        path = 
i[1].replace('http://wms.scrippsnetworks.com','').replace('.wmv','')
-        add_dir(i[0], path, i[2], i[3], 2, get_duration(i[4]), False)
-    xbmcplugin.setContent(int(sys.argv[1]), 'episodes')
-    xbmc.executebuiltin('Container.SetViewMode(503)')
-
-
-def get_duration(duration):
-    if duration is None:
-        return 1
-    d_split = duration.split(':')
-    if len(d_split) == 4:
-        del d_split[-1]
-    minutes = int(d_split[-2])
-    if int(d_split[-1]) >= 30:
-        minutes += 1
-    if len(d_split) >= 3:
-        minutes += (int(d_split[-3]) * 60)
-    if minutes < 1:
-        minutes = 1
-    return minutes
-
-
-def set_resolved_url(path):
-    video_url = ('rtmp://flash.scrippsnetworks.com:1935/ondemand?ovpfv=1.1 '
-                 
'swfUrl=http://common.scrippsnetworks.com/common/snap/snap-3.0.3.swf 
playpath=%s' %path)
-    return video_url
-
-
-def get_params():
-    p = parse_qs(sys.argv[2][1:])
-    for i in p.keys():
-        p[i] = p[i][0]
-    return p
-
-
-def add_dir(name, url, description, iconimage, mode, duration=None, 
isfolder=True):
-    params = {'name': name, 'url': url, 'mode': mode, 'iconimage': iconimage}
-    url = '%s?%s' %(sys.argv[0], urllib.urlencode(params))
-    listitem=xbmcgui.ListItem(name, iconImage="DefaultFolder.png", 
thumbnailImage=iconimage)
-    info_labels = {"Title": name, "Plot":description, "Genre": 'Home and 
Garden'}
-    if not isfolder:
-        info_labels['Duration'] = duration
-        listitem.setProperty('isPlayable', 'true')
-    listitem.setInfo(type="Video", infoLabels=info_labels)
-    xbmcplugin.addDirectoryItem(int(sys.argv[1]), url, listitem, isfolder)
-
-
-params = get_params()
+            dir_image = "DefaultVideo.png"
+            dir_folder = False
+            dir_playable = True
 
-try:
-    mode = int(params['mode'])
-except:
-    mode = None
+        ok=True
+        liz=xbmcgui.ListItem(name, iconImage=dir_image, 
thumbnailImage=iconimage)
+        liz.setInfo( type="Video", infoLabels={ "Title": name, "Plot": 
description, "Genre": genre, "Year": date } )
+        liz.setProperty( "Fanart_Image", fanart )
+
+        if dir_playable == True:
+         liz.setProperty('IsPlayable', 'true')
+        if not playlist is None:
+            playlist_name = name.split(') ')[1]
+            cm.append(('Play '+playlist_name+' 
PlayList','XBMC.RunPlugin(%s?mode=PP&name=%s&playlist=%s)' %(sys.argv[0], 
playlist_name, urllib.quote_plus(str(playlist).replace(',','|')))))
+        liz.addContextMenuItems(cm)
+        return 
xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=dir_folder)
 
-addon_log(params)
+def 
addLink(url,name,iconimage,fanart,description,genre,date,showcontext=True,playlist=None,
 autoplay=False):
+        return 
addDir(name,url,'SR',iconimage,fanart,description,genre,date,showcontext,playlist,autoplay)
 
-if mode == None:
-    display_shows()
-    xbmcplugin.setContent(int(sys.argv[1]), 'tvshows')
-    xbmcplugin.endOfDirectory(int(sys.argv[1]))
 
-elif mode == 1:
-    display_show(params['url'], params['iconimage'])
-    xbmcplugin.setContent(int(sys.argv[1]), 'tvshows')
-    xbmcplugin.endOfDirectory(int(sys.argv[1]))
 
-elif mode == 2:
-    item = xbmcgui.ListItem(path=set_resolved_url(params['url']))
-    xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, item)
+# MAIN EVENT PROCESSING STARTS HERE
+
+xbmcplugin.setContent(int(sys.argv[1]), 'movies')
+
+parms = {}
+try:
+    parms = dict( arg.split( "=" ) for arg in ((sys.argv[2][1:]).split( "&" )) 
)
+    for key in parms:
+       parms[key] = demunge(parms[key])
+except:
+    parms = {}
+
+p = parms.get
+
+try:
+    mode = p('mode')
+except:
+    mode = None
 
-elif mode == 3:
-    add_episodes(eval(cache.get('current_base')))
-    xbmcplugin.endOfDirectory(int(sys.argv[1]))
+if mode==  None:  getSources(p('fanart'))
+elif mode=='SR':  xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, 
xbmcgui.ListItem(path=p('url')))
+elif mode=='PP':  play_playlist(p('name'), p('playlist'))
+elif mode=='GC':  getCats(p('url'))
+#elif mode=='GS':  getShow(p('url'), p('name'))
 
-elif mode == 4:
-    soup = get_soup(params['url'])
-    add_episodes(get_playlist(soup))
-    xbmcplugin.endOfDirectory(int(sys.argv[1]))
+xbmcplugin.endOfDirectory(int(sys.argv[1]))
 
-elif mode == 5:
-    display_show(params['url'], params['iconimage'], True)
-    xbmcplugin.endOfDirectory(int(sys.argv[1]))

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

commit 3fafa7d0becdd8e2d2acd5f49cc164411d5565b7
Author: Martijn Kaijser <[email protected]>
Date:   Wed May 14 09:16:43 2014 +0200

    [plugin.video.foodnetwork] 2.0.2

diff --git a/plugin.video.foodnetwork/addon.xml 
b/plugin.video.foodnetwork/addon.xml
index 3039d6a..999b32a 100644
--- a/plugin.video.foodnetwork/addon.xml
+++ b/plugin.video.foodnetwork/addon.xml
@@ -1,24 +1,25 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <addon id="plugin.video.foodnetwork"
        name="Food Network"
-       version="1.1.0"
-       provider-name="divingmule">
+       version="2.0.2"
+       provider-name="t1m">
   <requires>
     <import addon="xbmc.python" version="2.1.0"/>
-    <import addon="script.module.beautifulsoup" version="3.2.1"/>
-    <import addon="script.common.plugin.cache" version="2.5.2"/>
   </requires>
-  <extension point="xbmc.python.pluginsource" library="default.py">
-    <provides>video</provides>
+  <extension point="xbmc.python.pluginsource"
+            library="default.py">
+        <provides>video</provides>
   </extension>
   <extension point="xbmc.addon.metadata">
-    <summary>Food Network</summary>
-    <description>Videos from foodnetwork.com.</description>
-    <disclaimer>These videos seem to be restricted to the U.S. 
only.</disclaimer>
+    <summary lang="en">Food Network Video Addon</summary>
+    <description lang="en">Play videos from the Food Network</description>
+    <disclaimer lang="en">Feel free to use this script. For information visit 
the wiki.</disclaimer>
     <platform>all</platform>
     <language>en</language>
     <license>GNU GENERAL PUBLIC LICENSE. Version 2, June 1991</license>
-    <source>https://code.google.com/p/food-xbmc/</source>
-    <forum>http://forum.xbmc.org/showthread.php?tid=97018</forum>
+    <forum></forum>
+    <website>www.foodnetwork.com</website>
+    <email></email>
+    <source>https://github.com/learningit/plugin.video.foodnetwork/</source>
   </extension>
 </addon>
diff --git a/plugin.video.foodnetwork/changelog.txt 
b/plugin.video.foodnetwork/changelog.txt
index 5313714..3de11b3 100644
--- a/plugin.video.foodnetwork/changelog.txt
+++ b/plugin.video.foodnetwork/changelog.txt
@@ -1,11 +1,3 @@
-Version 1.1.0
-updated for frodo/gotham
 
-Version 1.0.2
-major update, same content
+Version 2.0.2 Initial release
 
-Version 1.0.1
-fix for show clips
-
-Version 1.0.0
-initial
\ No newline at end of file
diff --git a/plugin.video.foodnetwork/default.py 
b/plugin.video.foodnetwork/default.py
index 2dbbdc6..ccf5c03 100644
--- a/plugin.video.foodnetwork/default.py
+++ b/plugin.video.foodnetwork/default.py
@@ -1,316 +1,167 @@
-import urllib
-import urllib2
-import re
-import os
-from urlparse import urlparse, parse_qs
-
-import StorageServer
-from BeautifulSoup import BeautifulSoup, BeautifulStoneSoup
-
-import xbmcplugin
-import xbmcgui
-import xbmcaddon
-
-base_url = 'http://www.foodnetwork.com'
-addon = xbmcaddon.Addon()
-addon_version = addon.getAddonInfo('version')
-addon_id = addon.getAddonInfo('id')
-cache = StorageServer.StorageServer("foodnetwork", 6)
-home = xbmc.translatePath(addon.getAddonInfo('path'))
-icon = addon.getAddonInfo('icon')
-language = addon.getLocalizedString
-debug = addon.getSetting('debug')
-
-
-def addon_log(string):
-    try:
-        log_message = string.encode('utf-8', 'ignore')
-    except:
-        log_message = 'addonException: addon_log'
-    xbmc.log("[%s-%s]: %s" %(addon_id, addon_version, 
log_message),level=xbmc.LOGDEBUG)
-    
-    
-def make_request(url):
-    addon_log('Request URL: ' + url)
-    try:
-        headers = {'User-agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64; 
rv:24.0) Gecko/20100101 Firefox/24.0',
-                   'Referer' : base_url}
-        req = urllib2.Request(url,None,headers)
-        response = urllib2.urlopen(req)
-        data = response.read()
-        addon_log('ResponseInfo: %s' %response.info())
-        response.close()
-        return data
-    except urllib2.URLError, e:
-        addon_log('We failed to open "%s".' %url)
-        if hasattr(e, 'reason'):
-            addon_log('We failed to reach a server.')
-            addon_log('Reason: %s' %e.reason)
-        if hasattr(e, 'code'):
-            addon_log('We failed with error code - %s.' %e.code)
-
-
-def cache_shows():
-    cat = {
-        'videos': {'url': 
base_url+'/food-network-top-food-videos/videos/index.html'},
-        'episodes': {'url': 
base_url+'/food-network-full-episodes/videos/index.html'}
-        }
-    for i in cat.keys():
-        soup = BeautifulSoup(make_request(cat[i]['url']), 
convertEntities=BeautifulSoup.HTML_ENTITIES)
-        play_lists = []
-        playlists = soup.find('ul', attrs={'class': 'playlists'})('li')
-        for p in playlists:
-            play_lists.append((p.a.string, p['data-channel'], p.a['href']))
-        cat[i]['playlists'] = play_lists
-        if not cat.has_key('most_popular'):
-            most_popular = soup.find('h4', text='Videos').findNext('ul', 
attrs={'class': 'media'})('a')
-            video_list = []
-            for m in most_popular:
-                video_list.append((m.string, m['href']))
-            cat['most_popular'] = video_list
-    return cat
-
-
-def get_categories():
-    add_dir(language(30000), 'episodes', 1, icon)
-    add_dir(language(30001), 'videos', 1, icon)
-    add_dir(language(30002), 'most_popular', 1, icon)
-    add_dir(language(30003), 'all_shows', 5, icon)
-
-
-def get_cat(url):
-    if url == 'most_popular':
-        items = cache.cacheFunction(cache_shows)[url]
-        for i in items:
-            add_dir(i[0], i[1], 3, icon, {}, False)
-    else:
-        items = cache.cacheFunction(cache_shows)[url]['playlists']
-        for i in items:
-            title = i[0]
-            if title.endswith('Full Episodes'):
-                title = title.replace('Full Episodes','').replace(' - ','')
-            add_dir(title, i[2], 2, icon)
-
-
-def get_all_shows():
-    show_file = os.path.join(home, 'resources', 'show_list')
-    show_list = eval(open(show_file, 'r').read())
-    for i in show_list:
-        if i.has_key('video_href'):
-            if i.has_key('thumb'): thumb = i['thumb']
-            else: thumb = icon
-            add_dir(i['name'], i['video_href'], 6, thumb)
-
-
-def get_video_xml(url, show=False):
-    video_id = None
-    try:
-        if int(eval(url)):
-            video_id = eval(url)
-    except: pass
-    if not video_id:
-        if url.startswith('/'):
-            url = base_url+url
-        data = make_request(url)
-        if show:
-            playlists = None
-            soup = BeautifulSoup(data, 
convertEntities=BeautifulStoneSoup.HTML_ENTITIES)
-            try:
-                playlists = soup.find('ul', attrs={'class': "playlists"})('li')
-            except: pass
-            if playlists:
-                for i in playlists:
-                    add_dir(i.a.string, i.a['href'], 2, icon)
-                xbmcplugin.endOfDirectory(int(sys.argv[1]))
-                return
+# -*- coding: utf-8 -*-
+# Food Network XBMC Addon
+
+import sys
+import httplib
+
+import urllib, urllib2, cookielib, datetime, time, re, os, string
+import xbmcplugin, xbmcgui, xbmcaddon, xbmcvfs, xbmc
+import cgi, gzip
+from StringIO import StringIO
+
+
+USER_AGENT = 'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 
(KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25'
+GENRE_TV  = "TV"
+UTF8          = 'utf-8'
+MAX_PER_PAGE  = 25
+FNTVBASE = 'http://www.foodnetwork.com%s'
+XMLBASE  = 'http://www.foodnetwork.com/%s.xml'
+
+addon         = xbmcaddon.Addon('plugin.video.foodnetwork')
+__addonname__ = addon.getAddonInfo('name')
+__language__  = addon.getLocalizedString
+
+
+home          = addon.getAddonInfo('path').decode(UTF8)
+icon          = xbmc.translatePath(os.path.join(home, 'icon.png'))
+addonfanart   = xbmc.translatePath(os.path.join(home, 'fanart.jpg'))
+
+
+def log(txt):
+    message = '%s: %s' % (__addonname__, txt.encode('ascii', 'ignore'))
+    xbmc.log(msg=message, level=xbmc.LOGDEBUG)
+
+def cleanfilename(name):    
+    valid_chars = "-_.() %s%s" % (string.ascii_letters, string.digits)
+    return ''.join(c for c in name if c in valid_chars)
+
+def demunge(munge):
         try:
-            video_id = re.findall('var snap = new 
SNI.Food.Player.VideoAsset\(.+?, (.+?)\);', data)[0]
+            munge = urllib.unquote_plus(munge).decode(UTF8)
         except:
-            try:
-                video_id = re.findall('var snap = new 
SNI.Food.Player.FullSize\(.+?, (.+?)\);', data)[0]
-            except:
-                try:
-                    video_id = re.findall('var snap = new 
SNI.Food.Player.FullSizeNoPlaylist\(.+?, (.+?)\);', data)[0]
-                except:
-                    addon_log('Unable to find video_id')
-    if video_id:
-        xml_url = 'http://www.foodnetwork.com/food/channel/xml/0,,%s,00.xml' 
%video_id
-        soup = BeautifulStoneSoup(make_request(xml_url), 
convertEntities=BeautifulStoneSoup.XML_ENTITIES)
-        if show:
-            for i in soup('video'):
-                add_dir(i.clipname.string, i.videourl.string, 4, 
i.thumbnailurl.string,
-                        {'Plot': i.abstract.string, 'Duration': 
get_length_in_minutes(i.length.string)}, False)
-            xbmcplugin.endOfDirectory(int(sys.argv[1]))
-        else:
-            resolve_url(soup.video.videourl.string)
-
-
-def get_playlist(url, name):
-    if not name == language(30005):
-        playlist_url = url.rsplit(',', 1)[0].rsplit('/', 1)[1]
-    else: playlist_url = url
-    json_url = '%s/food/feeds/channel-video/%s_RA,00.json' %(base_url, 
playlist_url)
-    items = eval(make_request(json_url).split('var snapTravelingLib = ')[1])[0]
-    for i in items['videos']:
-        add_dir(i['label'], i['videoURL'], 4, i['thumbnailURL'],
-                {'Plot': i['description'], 'Duration': 
get_length_in_minutes(i['length'])}, False)
-    if items['last'] < items['total']:
-        page_items = playlist_url.rsplit('_', 2)
-        page_url = '%s_%s_%s' %(page_items[0], (int(page_items[1])+1), 
page_items[2])
-        add_dir(language(30005), page_url, 2, icon)
-
-
-def resolve_url(url):
-    playpath = 
url.replace('http://wms.scrippsnetworks.com','').replace('.wmv','')
-    final_url = (
-        'rtmp://flash.scrippsnetworks.com:1935/ondemand?ovpfv=1.1 '
-        'swfUrl=http://common.scrippsnetworks.com/common/snap/snap-3.2.17.swf '
-        'playpath=' + playpath
-        )
-    item = xbmcgui.ListItem(path=final_url)
-    xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, item)
-
-
-def cache_all_shows():
-    url = 'http://www.foodnetwork.com/shows/index.html'
-    soup = BeautifulSoup(make_request(url), 
convertEntities=BeautifulSoup.HTML_ENTITIES)
-    items = soup.find('div', attrs={'class': "list-wrap"})('li')
-    show_list = []
-    for i in items:
-        show = {}
-        show['name'] = i.a.string
-        show['page_href'] = i.a['href']
-        show_list.append(show)
-
-    dialog = xbmcgui.Dialog()
-    ok = dialog.yesno(
-        language(30011),
-        language(30009),
-        language(30010)
-        )
-    if ok:
-        xbmc.executebuiltin("ActivateWindow(busydialog)")
-        for i in show_list:
-            data = make_request(base_url+i['page_href'])
-            if data:
-                s_soup = BeautifulSoup(data, 
convertEntities=BeautifulSoup.HTML_ENTITIES)
-                item = s_soup.find('span', attrs={'class': "lgbtn-text"}, 
text='videos')
-                if not item:
-                    item = s_soup.find('span', attrs={'class': "lgbtn-text"}, 
text='VIDEOS')
-                if item:
-                    i['video_href'] = item.findPrevious('a')['href']
-                else:
-                    try:
-                        item = re.findall('var snap = new 
SNI.Food.Player.VideoAsset\(.+?, (.+?)\);', data)[0]
-                    except:
-                        try:
-                            item = re.findall('var snap = new 
SNI.Food.Player.FullSize\(.+?, (.+?)\);', data)[0]
-                        except:
-                            try:
-                                item = re.findall('var snap = new 
SNI.Food.Player.FullSizeNoPlaylist\(.+?, (.+?)\);', data)[0]
-                            except:
-                                addon_log('Unable to find video_id')
-                                item = None
-                    if item:
-                        i['video_href'] = item
-                try:
-                    ok = i['video_href']
-                    addon_log('Videos: True: %s' %i['name'])
-                except:
-                    addon_log('Videos: False: %s' %i['name'])
-                    addon_log('Removing %s From Show List'  %i['name'])
-                    for index in range(len(show_list)):
-                        if show_list[index]['name'] == i['name']:
-                                del show_list[index]
-                                break
-                    continue
-                thumb = None
-                try: thumb = re.findall('background: url\((.+?)\)', data)[0]
-                except:
-                    try: thumb = s_soup.find('div', attrs={'id': 
"main-bd"}).img['src']
-                    except: pass
-                if thumb:
-                    i['thumb'] = thumb
+            pass
+        return munge
+
+def getRequest(url):
+              log("getRequest URL:"+str(url))
+              headers = {'User-Agent':USER_AGENT, 'Accept':"text/html", 
'Accept-Encoding':'gzip,deflate,sdch', 'Accept-Language':'en-US,en;q=0.8'} 
+              req = urllib2.Request(url.encode(UTF8), None, headers)
+
+              try:
+                 response = urllib2.urlopen(req)
+                 if response.info().getheader('Content-Encoding') == 'gzip':
+                    log("Content Encoding == gzip")
+                    buf = StringIO( response.read())
+                    f = gzip.GzipFile(fileobj=buf)
+                    link1 = f.read()
+                 else:
+                    link1=response.read()
+              except:
+                 link1 = ""
+
+              link1 = str(link1).replace('\n','')
+              return(link1)
+
+
+def getSources(fanart):
+              urlbase   = FNTVBASE % 
('/videos/players/food-network-full-episodes.html')
+              pg = getRequest(urlbase)
+              caturl = re.compile("SNI\.Food\.Player\.FullSize.+?, 
'(.+?)'").findall(pg)[0]
+              caturl  = XMLBASE % (caturl)
+              pg2 = getRequest(caturl)
+              catname = re.compile('<title>.+?CDATA\[(.+?)\]').findall(pg2)[0]
+              
addDir(catname,caturl,'GC',icon,addonfanart,catname,GENRE_TV,'',False)
+              cats = re.compile('<section 
class="video-promo">.+?<h5>(.+?)<.+?<a href="(.+?)"').findall(pg)
+              for catname, caturl in cats:
+                  catno = re.compile('/.+?\..+?\.(.+?)\.').findall(caturl)[0]
+                  caturl = caturl.replace('.%s.' %(catno),'.XXXXXXXX.')
+                  catname = catname.strip()
+                  
addDir(catname,caturl,'GC',icon,addonfanart,catname,GENRE_TV,'',False)
+
+def getCats(cat_url):
+            if '.xml' in cat_url:
+              pg = getRequest(cat_url)
+              shows = 
re.compile('<videoId>(.+?)<.+?<thumbnailUrl>.+?CDATA\[(.+?)\].+?<abstract>.+?CDATA\[(.+?)\]').findall(pg)
             else:
-                addon_log('No Data')
-            xbmc.sleep(500)
-        show_file = os.path.join(home, 'resources', 'show_list')
-        w = open(show_file, 'w')
-        w.write(repr(show_list))
-        w.close()
-        addon_log('%s Shows with videos in Show List' %len(show_list))
-        xbmc.executebuiltin("Dialog.Close(busydialog)")
-
-
-def get_length_in_minutes(length):
-    if not isinstance(length, str):
-        if ':' in str(length):
-            length = str(length)
-        elif isinstance(length, int):
-            return length
-    if ':' in length:
-        l_split = length.split(':')
-        minutes = int(l_split[-2])
-        if int(l_split[-1]) >= 30:
-            minutes += 1
-        if len(l_split) == 3:
-            minutes += (int(l_split[0]) * 60)
-        if minutes < 1:
-            minutes = 1
-        return minutes
-
-
-def get_params():
-    p = parse_qs(sys.argv[2][1:])
-    for i in p.keys():
-        p[i] = p[i][0]
-    return p
-
-
-def add_dir(name, url, mode, iconimage, infolabels={}, isfolder=True):
-    params = {'name': name, 'url': url, 'mode': mode}
-    infolabels['Title'] = name
-    url = '%s?%s' %(sys.argv[0], urllib.urlencode(params))
-    listitem = xbmcgui.ListItem(name, iconImage="DefaultFolder.png", 
thumbnailImage=iconimage)
-    if not isfolder:
-        listitem.setProperty('IsPlayable', 'true')
-    listitem.setInfo(type="Video", infoLabels=infolabels)
-    xbmcplugin.addDirectoryItem(int(sys.argv[1]), url, listitem, isfolder)
-
-
-params = get_params()
+              urlbase   = FNTVBASE % 
('/videos/players/food-network-full-episodes.html')
+              pg = getRequest(urlbase)
+              cat_url = cat_url.replace('XXXXXXXX','(.+?)')
+              catsearch = '<a href="%s".+?<div 
class=.+?>(.+?)<.+?<h6>(.+?)</h6>' % (cat_url)
+              shows = re.compile(catsearch).findall(pg)
+            for showpath,  showimg, showname in shows:
+                 showurl = 
'rtmp://flash.scrippsnetworks.com:1935/ondemand/library?ovpfv=2.1.6 
swfUrl=http://www.foodnetwork.com/etc/designs/food/clientlib/snap/snap-4.1.2.swf
 playpath=Food_Network/%s app=ondemand/library?ovpfv=2.1.6  
pageUrl=http://www.foodnetwork.com/videos/players/food-network-full-episodes.html'
 % showpath
+                 
addLink(showurl.encode(UTF8),showname,showimg,addonfanart,showname,GENRE_TV,'')
+
+
+
+def play_playlist(name, list):
+        playlist = xbmc.PlayList(1)
+        playlist.clear()
+        item = 0
+        for i in list:
+            item += 1
+            info = xbmcgui.ListItem('%s) %s' %(str(item),name))
+            playlist.add(i, info)
+        xbmc.executebuiltin('playlist.playoffset(video,0)')
+
+
+def 
addDir(name,url,mode,iconimage,fanart,description,genre,date,showcontext=True,playlist=None,autoplay=False):
+        u=sys.argv[0]+"?url="+urllib.quote_plus(url)+"&mode="+mode
+        dir_playable = False
+        cm = []
+
+        if mode != 'SR':
+            u += "&name="+urllib.quote_plus(name)
+            if (fanart is None) or fanart == '': fanart = addonfanart
+            u += "&fanart="+urllib.quote_plus(fanart)
+            dir_image = "DefaultFolder.png"
+            dir_folder = True
+        else:
+            dir_image = "DefaultVideo.png"
+            dir_folder = False
+            dir_playable = True
 
-try:
-    mode = int(params['mode'])
-except:
-    mode = None
+        ok=True
+        liz=xbmcgui.ListItem(name, iconImage=dir_image, 
thumbnailImage=iconimage)
+        liz.setInfo( type="Video", infoLabels={ "Title": name, "Plot": 
description, "Genre": genre, "Year": date } )
+        liz.setProperty( "Fanart_Image", fanart )
+
+        if dir_playable == True:
+         liz.setProperty('IsPlayable', 'true')
+        if not playlist is None:
+            playlist_name = name.split(') ')[1]
+            cm.append(('Play '+playlist_name+' 
PlayList','XBMC.RunPlugin(%s?mode=PP&name=%s&playlist=%s)' %(sys.argv[0], 
playlist_name, urllib.quote_plus(str(playlist).replace(',','|')))))
+        liz.addContextMenuItems(cm)
+        return 
xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=dir_folder)
+
+def 
addLink(url,name,iconimage,fanart,description,genre,date,showcontext=True,playlist=None,
 autoplay=False):
+        return 
addDir(name,url,'SR',iconimage,fanart,description,genre,date,showcontext,playlist,autoplay)
 
-addon_log(repr(params))
 
-if mode == None:
-    get_categories()
-    xbmcplugin.endOfDirectory(int(sys.argv[1]))
 
-elif mode == 1:
-    get_cat(params['url'])
-    xbmcplugin.endOfDirectory(int(sys.argv[1]))
+# MAIN EVENT PROCESSING STARTS HERE
 
-elif mode == 2:
-    get_playlist(params['url'], params['name'])
-    xbmcplugin.endOfDirectory(int(sys.argv[1]))
+xbmcplugin.setContent(int(sys.argv[1]), 'movies')
 
-elif mode == 3:
-    get_video_xml(params['url'])
+parms = {}
+try:
+    parms = dict( arg.split( "=" ) for arg in ((sys.argv[2][1:]).split( "&" )) 
)
+    for key in parms:
+       parms[key] = demunge(parms[key])
+except:
+    parms = {}
+
+p = parms.get
 
-elif mode == 4:
-    resolve_url(params['url'])
+try:
+    mode = p('mode')
+except:
+    mode = None
 
-elif mode == 5:
-    get_all_shows()
-    xbmcplugin.endOfDirectory(int(sys.argv[1]))
+if mode==  None:  getSources(p('fanart'))
+elif mode=='SR':  xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, 
xbmcgui.ListItem(path=p('url')))
+elif mode=='PP':  play_playlist(p('name'), p('playlist'))
+elif mode=='GC':  getCats(p('url'))
 
-elif mode == 6:
-    get_video_xml(params['url'], True)
+xbmcplugin.endOfDirectory(int(sys.argv[1]))
 
-elif mode == 7:
-    cache_all_shows()
diff --git a/plugin.video.foodnetwork/resources/language/English/strings.xml 
b/plugin.video.foodnetwork/resources/language/English/strings.xml
index 592f090..79c1e3b 100644
--- a/plugin.video.foodnetwork/resources/language/English/strings.xml
+++ b/plugin.video.foodnetwork/resources/language/English/strings.xml
@@ -1,16 +1,3 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <strings>
-  <string id="30000">Episodes</string>
-  <string id="30001">Videos</string>
-  <string id="30002">Most Popular Videos</string>
-  <string id="30003">All Shows - Videos</string>
-  <string id="30004"></string>
-  <string id="30005">Next Page</string>
-  <string id="30006"></string>
-  <string id="30007"></string>
-  <string id="30008"></string>
-  <string id="30009">This may take some time.</string>
-  <string id="30010">Scanning ~133 pages for videos.</string>
-  <string id="30011">Re-Cache All Shows?</string>
-  <string id="30012">Enable add-on debugging.</string>
 </strings>
diff --git a/plugin.video.foodnetwork/resources/settings.xml 
b/plugin.video.foodnetwork/resources/settings.xml
index 04100eb..fb5aafd 100644
--- a/plugin.video.foodnetwork/resources/settings.xml
+++ b/plugin.video.foodnetwork/resources/settings.xml
@@ -1,8 +1,3 @@
-<settings>
-  <category label="General">
-    <setting id="debug" type="bool" label="30012" default="false"/>
-  </category>
-  <category label="All Shows">
-    <setting type="action" option="close" label="30011" 
action="RunPlugin(plugin://plugin.video.foodnetwork/?mode=7)" />
-  </category>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<settings>
 </settings>
\ No newline at end of file

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

commit 286badd08ab3b9813e75ba689763b4d18492397e
Author: Martijn Kaijser <[email protected]>
Date:   Wed May 14 09:15:34 2014 +0200

    [plugin.video.fox.news] 4.0.1

diff --git a/plugin.video.fox.news/addon.xml b/plugin.video.fox.news/addon.xml
index 2d299a7..f7aaf38 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"?>
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <addon id="plugin.video.fox.news"
        name="Fox News"
-       version="3.1.1"
-       provider-name="divingmule">
+       version="4.0.1"
+       provider-name="divingmule, t1m">
     <requires>
         <import addon="xbmc.python" version="2.1.0"/>
         <import addon="script.module.beautifulsoup4" version="4.3.1"/>
@@ -18,7 +18,8 @@
         <platform>all</platform>
         <language>en</language>
         <forum>http://forum.xbmc.org/showthread.php?tid=57175</forum>
-        <source>https://code.google.com/p/foxnews-xbmc</source>
+        <email></email>
+        <source>https://github.com/learningit/plugin.video.fox.news</source>
         <license>GNU GENERAL PUBLIC LICENSE. Version 2, June 1991</license>
         <website>http://video.foxnews.com</website>
     </extension>
diff --git a/plugin.video.fox.news/changelog.txt 
b/plugin.video.fox.news/changelog.txt
index d36fcc1..eca3839 100644
--- a/plugin.video.fox.news/changelog.txt
+++ b/plugin.video.fox.news/changelog.txt
@@ -1,3 +1,12 @@
+Version 4.0.1
+Updated for Gotham. Fixed website changes
+
+Version 3.1.6
+Added sub-categories directory listing
+
+Version 3.1.5
+Fix website changes
+
 Version 3.1.1
 fix website changes
 
diff --git a/plugin.video.fox.news/default.py b/plugin.video.fox.news/default.py
index eb9cafe..0fea9dd 100644
--- a/plugin.video.fox.news/default.py
+++ b/plugin.video.fox.news/default.py
@@ -1,4 +1,4 @@
-import urllib
+import urllib
 import urllib2
 import re
 import json
@@ -15,6 +15,8 @@ import xbmcaddon
 import xbmcvfs
 
 addon = xbmcaddon.Addon()
+__addonname__ = addon.getAddonInfo('name')
+__language__  = addon.getLocalizedString
 addon_version = addon.getAddonInfo('version')
 addon_id = addon.getAddonInfo('id')
 icon = addon.getAddonInfo('icon')
@@ -60,37 +62,53 @@ def get_soup(url):
 
 
 def get_categories(url=None):
-    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 + '/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')
+        add_dir('%s - %s' % (__language__(30000),__language__(30002)), 
'http://video.foxnews.com/#show-clips', icon, 'get_sub_cat')
+        add_dir('%s - %s' % (__language__(30000),__language__(30003)),  
'http://video.foxnews.com/#news-clips', icon, 'get_sub_cat')
+        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):
-    soup = get_soup(url)
-    items_soup = soup('div', attrs={'id' : 'shows'})[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)
-
+    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
@@ -142,10 +160,28 @@ def resolve_url(url):
     item = xbmcgui.ListItem(path=resolved_url)
     xbmcplugin.setResolvedUrl(int(sys.argv[1]), succeeded, item)
 
-
 def get_playlist(url):
+    urlbase = url.replace('http://','')
+    urlbase = 'http://%s' % (urlbase.split('/',1)[0])
     data = make_request(url)
-    pattern = 'pageVars.playlistId = "(.+?)";'
+    try:
+      match   = re.compile('<div class="box box-4 sidebar">(.+?)</div>', 
re.DOTALL).findall(data)
+      subsubs = re.compile('"(.+?)">(.+?)<', re.DOTALL ).findall(match[0])
+      sscount = 0
+      for suburl, subname in subsubs:
+         if not 'on-air' in suburl:
+            sscount = 1
+      if sscount != 0:
+        for suburl, subname in subsubs:
+           add_dir(subname.replace('&amp;','&').encode('utf-8'), 
urlbase+suburl, icon, 'get_videolist')
+      else:
+        get_videolist(url)    
+    except:
+      get_videolist(url)
+
+def get_videolist(url):
+    data = make_request(url)
+    pattern = 'playlistId: "(.+?)"'
     match = re.findall(pattern, data)
     if not match:
         addon_log('Did not find playlist id')
@@ -154,12 +190,13 @@ def get_playlist(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:
         item_url = None
         state = i['media-status']['@attributes']['state']
-        title = i['title'].encode('utf-8')
+        title = i['title'].replace('&amp;','&').encode('utf-8')
         if state != 'active':
             addon_log('item state: %s: %s' %(title, state))
             continue
@@ -208,7 +245,7 @@ def get_playlist(url):
             'Date': date_time.strftime('%d.%m.%Y'),
             'Premiered': date_time.strftime('%d-%m-%Y'),
             'Duration': get_duration(i['itunes-duration']),
-            'Plot': i['description'].encode('utf-8')
+            'Plot': i['description'].replace('&amp;','&').encode('utf-8')
             }
         add_dir(title, item_url, thumb, 'resolve_url', info)
 
@@ -272,6 +309,10 @@ elif mode == 'get_sub_cat':
 
 elif mode == 'get_playlist':
     get_playlist(params['url'])
+    xbmcplugin.endOfDirectory(int(sys.argv[1]))
+
+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)

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

Summary of changes:
 plugin.video.foodnetwork/README.txt                |    7 +
 plugin.video.foodnetwork/addon.xml                 |   25 +-
 plugin.video.foodnetwork/changelog.txt             |   10 +-
 plugin.video.foodnetwork/default.py                |  457 +++++++-------------
 .../resources/language/English/strings.xml         |   15 +-
 plugin.video.foodnetwork/resources/settings.xml    |    9 +-
 plugin.video.foodnetwork/resources/show_list       |    1 -
 plugin.video.fox.news/addon.xml                    |    9 +-
 plugin.video.fox.news/changelog.txt                |    9 +
 plugin.video.fox.news/default.py                   |  107 ++++--
 .../{changelog.txt => readme.txt}                  |    9 +
 .../resources/language/English/strings.xml         |    7 +
 .../resources/settings.xml                         |    0
 plugin.video.hgtv/README.txt                       |    8 +
 plugin.video.hgtv/addon.xml                        |   25 +-
 plugin.video.hgtv/changelog.txt                    |   25 +-
 plugin.video.hgtv/default.py                       |  392 +++++++-----------
 .../resources/language/English/strings.xml         |    4 +
 .../resources/settings.xml                         |    0
 19 files changed, 458 insertions(+), 661 deletions(-)
 create mode 100644 plugin.video.foodnetwork/README.txt
 delete mode 100644 plugin.video.foodnetwork/resources/show_list
 copy plugin.video.fox.news/{changelog.txt => readme.txt} (71%)
 create mode 100644 plugin.video.fox.news/resources/language/English/strings.xml
 copy {plugin.video.i24News => plugin.video.fox.news}/resources/settings.xml 
(100%)
 create mode 100644 plugin.video.hgtv/README.txt
 create mode 100644 plugin.video.hgtv/resources/language/English/strings.xml
 copy {plugin.video.i24News => plugin.video.hgtv}/resources/settings.xml (100%)


hooks/post-receive
-- 
Plugins

------------------------------------------------------------------------------
"Accelerate Dev Cycles with Automated Cross-Browser Testing - For FREE
Instantly run your Selenium tests across 300+ browser/OS combos.
Get unparalleled scalability from the best Selenium testing platform available
Simple to use. Nothing to install. Get started now for free."
http://p.sf.net/sfu/SauceLabs
_______________________________________________
Xbmc-addons mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/xbmc-addons

Reply via email to