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('&','&').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('&','&').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('&','&').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('&','&').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