The branch, frodo has been updated
via 729333e2f83c28a719b2f3b6176afeba83948d79 (commit)
from 25942a6f87ea4ae34700375b81c3baf9930961c4 (commit)
- Log -----------------------------------------------------------------
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=729333e2f83c28a719b2f3b6176afeba83948d79
commit 729333e2f83c28a719b2f3b6176afeba83948d79
Author: beenje <[email protected]>
Date: Sun Nov 17 21:14:32 2013 +0100
[plugin.video.cnet.podcasts] updated to version 1.1.0
diff --git a/plugin.video.cnet.podcasts/addon.xml
b/plugin.video.cnet.podcasts/addon.xml
index 7f8e541..ed58768 100644
--- a/plugin.video.cnet.podcasts/addon.xml
+++ b/plugin.video.cnet.podcasts/addon.xml
@@ -1,20 +1,28 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<addon id="plugin.video.cnet.podcasts"
- name="cnet Podcasts"
- version="1.0.8"
- provider-name="divingmule">
- <requires>
- <import addon="xbmc.python" version="2.0"/>
- <import addon="script.module.beautifulsoup" version="3.0.8"/>
- </requires>
- <extension point="xbmc.python.pluginsource"
- library="default.py">
- <provides>video</provides>
- </extension>
- <extension point="xbmc.addon.metadata">
- <summary>cnet videos</summary>
- <description>Podcast from cnet.</description>
- <language>en</language>
- <platform>all</platform>
- </extension>
-</addon>
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<addon id="plugin.video.cnet.podcasts"
+ name="CNET Podcasts"
+ version="1.1.0"
+ provider-name="divingmule">
+ <requires>
+ <import addon="xbmc.python" version="2.1.0"/>
+ <import addon="script.module.beautifulsoup4" version="4.3.1"/>
+ <import addon="script.module.xmltodict" version="0.7.0"/>
+ <import addon="script.common.plugin.cache" version="2.5.2"/>
+ </requires>
+ <extension point="xbmc.python.pluginsource" library="default.py">
+ <provides>video</provides>
+ </extension>
+ <extension point="xbmc.addon.metadata">
+ <summary>CNET Podcast Central</summary>
+ <description>
+ www.cnet.com/who-we-are/[CR]
+ CNET shows you the exciting possibilities of how technology can
enhance and enrich your life.
+ We provide you with information, tools, and advice that help you
decide what to buy and how to get the most out of your tech.
+ </description>
+ <platform>all</platform>
+ <language>en</language>
+ <license>GNU GENERAL PUBLIC LICENSE. Version 2, June 1991</license>
+ <source>https://code.google.com/p/cnet-podcasts/</source>
+ <forum></forum>
+ </extension>
+</addon>
diff --git a/plugin.video.cnet.podcasts/changelog.txt
b/plugin.video.cnet.podcasts/changelog.txt
index 966ad19..7a7aa60 100644
--- a/plugin.video.cnet.podcasts/changelog.txt
+++ b/plugin.video.cnet.podcasts/changelog.txt
@@ -1,42 +1,45 @@
-version 1.0.8
-fix for changes in Frodo
-
-version 1.0.7
-updated podcasts list
-
-version 1.0.6
-fix bug in scraper
-
-version 1.0.5
-updated show list, thanks pkscuot
-
-version 1.0.2
-fix for feed changes
-new playback setting
-
-version - 1.0.1
-added the crave podcast
-
-version - 1.0.0
-new for eden
-
-version - 0.0.4
-added addon settings for video quality instead of categories
-
-version - 0.0.3
-updated icon.png
-
-version - 0.0.2
-added video descriptions
-added categories for SD and HD
-
-version - 0.0.1
-initial
-
-
-
-
-
-
-
-
+version 1.1.0
+update for frodo/gotham
+
+version 1.0.8
+fix for changes in Frodo
+
+version 1.0.7
+updated podcasts list
+
+version 1.0.6
+fix bug in scraper
+
+version 1.0.5
+updated show list, thanks pkscuot
+
+version 1.0.2
+fix for feed changes
+new playback setting
+
+version - 1.0.1
+added the crave podcast
+
+version - 1.0.0
+new for eden
+
+version - 0.0.4
+added addon settings for video quality instead of categories
+
+version - 0.0.3
+updated icon.png
+
+version - 0.0.2
+added video descriptions
+added categories for SD and HD
+
+version - 0.0.1
+initial
+
+
+
+
+
+
+
+
diff --git a/plugin.video.cnet.podcasts/default.py
b/plugin.video.cnet.podcasts/default.py
index 7540ddc..a8c2c1c 100644
--- a/plugin.video.cnet.podcasts/default.py
+++ b/plugin.video.cnet.podcasts/default.py
@@ -1,180 +1,185 @@
-import urllib
-import urllib2
-import re
-import os
-import xbmcplugin
-import xbmcgui
-import xbmcaddon
-from BeautifulSoup import BeautifulStoneSoup
-
-__settings__ = xbmcaddon.Addon(id='plugin.video.cnet.podcasts')
-__language__ = __settings__.getLocalizedString
-home = __settings__.getAddonInfo('path')
-icon = xbmc.translatePath( os.path.join( home, 'icon.png' ) )
-
-
-def CATEGORIES():
- addDir(__language__(30000), 'allcnetvideopodcasts', 'allhdpodcast',
'http://audiopodcasts.cnet.com/', 1, 'allCNETvideo_600x600.jpg')
- addDir(__language__(30029), 'AlwaysOnsd', 'AlwaysOnhd', '', 1,
'http://i.d.com.com/i/tron/cnettv/podcast/AlwaysOn_600x600.jpg')
- addDir(__language__(30004), 'applebyte', 'applebytehd', '', 1,
'podcastsHD_applebyte_600x600.jpg')
- addDir(__language__(30003), 'cartechvideo', 'cartechvideohd', '', 1,
'podcastsHD_cartech_600x600.jpg')
- addDir(__language__(30001), 'cnetoncarssd', 'cnetoncarshd', '', 1,
'http://i.i.com.com/cnwk.1d/i/tim/2012/08/27/onCars_600x600.jpg')
- addDir(__language__(30005), 'conversations', 'conversationshd', '', 1,
'podcastsHD_conversations_600x600.jpg')
- addDir(__language__(30030), 'CNETUpdateSD', 'CNETUpdateHD', '', 1,
'http://i.i.com.com/cnwk.1d/i/tim/2012/04/25/CNET_update_iTunes_600x600_300x300.jpg')
- addDir(__language__(30002), 'news', 'cnetnewshd', '', 1,
'podcastsHD_news_600x600.jpg')
- addDir(__language__(30007), 'top5', 'top5hd', '', 1,
'podcastsHD_top5_600x600.jpg')
- addDir(__language__(30006), 'crackingopensd', 'crackingopenhd', '', 1,
'http://i.i.com.com/cnwk.1d/i/tim/2012/07/26/crackingOpen_600x600.jpg')
- addDir(__language__(30009), 'firstlook', 'firstlookhd', '', 1,
'http://i.i.com.com/cnwk.1d/i/tim/2012/07/24/firstLook_600x600_600x600.jpg')
- addDir(__language__(30008), 'howto', 'howtohd', '', 1,
'http://i.i.com.com/cnwk.1d/i/tim/2012/07/24/howTo_600x600_600x600.jpg')
- addDir(__language__(30010), 'InsideScoopsd', 'InsideScoophd', '', 1,
'http://i.i.com.com/cnwk.1d/i/tim/2012/09/19/insideScoop_600x600.jpg')
- addDir(__language__(30013), 'prizefight', 'prizefighthd', '', 1,
'podcastsHD_prizefight_600x600.jpg')
- addDir(__language__(30025), 'rumorhasitsd', 'rumorhasithq', '', 1,
'rumorHasIt_300x300.jpg')
- addDir(__language__(30014), 'tapthatapp', 'tapthatapphd', '', 1,
'tapThatAppHD_600x600.jpg')
- addDir(__language__(30016), 'the404video', 'the404hqvideo', 'The404',
1, 'the404_600x600.jpg')
-
-
-def GetInHMS(seconds):
- hours = seconds / 3600
- seconds -= 3600*hours
- minutes = seconds / 60
- seconds -= 60*minutes
- if hours == 0:
- return "%02d:%02d" % (minutes, seconds)
- return "%02d:%02d:%02d" % (hours, minutes, seconds)
-
-
-def INDEX(url,hd_url,audio_url,iconimage):
- playback = __settings__.getSetting('playback')
- if playback == '0':
- link = audio_url
- elif playback == '1':
- link = hd_url
- else:
- link = url
- if link == '':
- link = url
- link = 'http://feeds.feedburner.com/cnet/'+link+'?format=xml'
- replace_list = ['rumorhasit', 'crackingopen', 'alwayson',
'cnetupdate', 'cnetoncars']
- for i in replace_list:
- if i.lower() in link.lower():
- link = link.replace('cnet/','')
- print 'Feed Url: '+link
- req = urllib2.Request(link)
- req.add_header('User-Agent', 'Mozilla/5.0 (Windows; U; Windows NT 5.1;
en-GB; rv:1.9.0.3) Gecko/2008092417 Firefox/3.0.3')
- response = urllib2.urlopen(req)
- link=response.read()
- response.close()
- soup = BeautifulStoneSoup(link,
convertEntities=BeautifulStoneSoup.XML_ENTITIES)
- for i in soup('item'):
- name = i('title')[0].string
- try:
- media_url = i('media:content')[0]['url']
- if media_url == None: raise
- except:
- print ' --- No media:content url for "%s" --- ' %name
- continue
- try:
- desc = i('itunes:summary')[0].string
- if desc == None: raise
- except:
- desc = ''
- try:
- date = i('pubdate')[0].string
- if date == None: raise
- except:
- date = ''
- try:
- seconds = i('itunes:duration')[0].string
- duration = str(GetInHMS(int(seconds)))
- except:
- duration = ''
- description = desc+' \n\n'+date
- u=sys.argv[0]+"?mode=2&url="+urllib.quote_plus(media_url)
- liz=xbmcgui.ListItem(name, iconImage=iconimage,
thumbnailImage=iconimage)
- liz.setInfo( type="Video", infoLabels={ "Title":
name,"Plot":description, "Duration":duration } )
- liz.setProperty( "Fanart_Image", iconimage )
- liz.setProperty('IsPlayable', 'true')
-
ok=xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz)
-
-
-def get_params():
- param=[]
- paramstring=sys.argv[2]
- if len(paramstring)>=2:
- params=sys.argv[2]
- cleanedparams=params.replace('?','')
- if (params[len(params)-1]=='/'):
- params=params[0:len(params)-2]
- pairsofparams=cleanedparams.split('&')
- param={}
- for i in range(len(pairsofparams)):
- splitparams={}
- splitparams=pairsofparams[i].split('=')
- if (len(splitparams))==2:
- param[splitparams[0]]=splitparams[1]
- return param
-
-
-def addDir(name,url,hd_url,audio_url,mode,iconimage):
- if not iconimage.startswith('http'):
- iconimage = 'http://www.cnet.com/i/pod/images/'+iconimage
- if __settings__.getSetting('playback') == '0':
- if not audio_url == '':
- name = name + __language__(30028)
-
u=sys.argv[0]+"?url="+urllib.quote_plus(url)+"&hd_url="+urllib.quote_plus(hd_url)+"&audio_url="+\
-
urllib.quote_plus(audio_url)+"&mode="+str(mode)+"&name="+urllib.quote_plus(name)+"&iconimage="+str(iconimage)
- ok=True
- liz=xbmcgui.ListItem(name, iconImage="DefaultFolder.png",
thumbnailImage=iconimage)
- liz.setInfo( type="Video", infoLabels={ "Title": name } )
- liz.setProperty( "Fanart_Image", iconimage )
-
ok=xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=True)
- return ok
-
-
-params=get_params()
-url=None
-name=None
-mode=None
-hd_url=None
-audio_url=None
-
-try:
- url=urllib.unquote_plus(params["url"])
-except:
- pass
-try:
- hd_url=urllib.unquote_plus(params["hd_url"])
-except:
- pass
-try:
- audio_url=urllib.unquote_plus(params["audio_url"])
-except:
- pass
-try:
- name=urllib.unquote_plus(params["name"])
-except:
- pass
-try:
- iconimage=str(params["iconimage"])
-except:
- pass
-try:
- mode=int(params["mode"])
-except:
- pass
-
-print "Mode: "+str(mode)
-print "URL: "+str(url)
-print "Name: "+str(name)
-
-if mode==None:
- CATEGORIES()
-
-elif mode==1:
- INDEX(url,hd_url,audio_url,iconimage)
-
-elif mode==2:
- item = xbmcgui.ListItem(path=url)
- xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, item)
-
-xbmcplugin.endOfDirectory(int(sys.argv[1]))
+import urllib
+import urllib2
+import time
+from datetime import datetime
+from urlparse import urlparse, parse_qs
+
+import xmltodict
+import StorageServer
+from bs4 import BeautifulSoup
+
+import xbmcplugin
+import xbmcgui
+import xbmcaddon
+
+cache = StorageServer.StorageServer("cnetpodcasts", 6)
+addon = xbmcaddon.Addon()
+addon_version = addon.getAddonInfo('version')
+addon_id = addon.getAddonInfo('id')
+icon = addon.getAddonInfo('icon')
+language = addon.getLocalizedString
+
+
+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, post_data=None):
+ addon_log('Request URL: %s' %url)
+ headers = {
+ 'User-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0)
Gecko/20100101 Firefox/24.0',
+ 'Referer': 'http://www.cnet.com'
+ }
+ try:
+ req = urllib2.Request(url, post_data, headers)
+ response = urllib2.urlopen(req)
+ response_url = urllib.unquote_plus(response.geturl())
+ 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 cache_categories():
+ url = 'http://www.cnet.com/podcasts/'
+ soup = BeautifulSoup(make_request(url), 'html.parser')
+ items = soup.find_all('div', class_='podcast')
+ cats = [{'thumb': i.img['src'],
+ 'name': i.h3('a')[-1].string,
+ 'desc': i.find('div', class_='desc').get_text(),
+ 'links': [{x.string: x['href']} for x in i.find('div',
class_='rss')('a') if
+ x.string]} for
+ i in items]
+ return cats
+
+
+def display_categories():
+ cats = cache.cacheFunction(cache_categories)
+ for i in cats:
+ if i['name'] == 'All Audio Podcasts': continue
+ add_dir(i['name'], i['links'], 'category', i['thumb'], {'Plot':
i['desc']})
+
+
+def display_category(links_list):
+ links_list = eval(links_list)
+ settings = {'0': 'Audio', '1': 'HD', '2': 'Video'}
+ preferred_type = settings[addon.getSetting('playback_type')]
+ feed_url = None
+ for i in links_list:
+ if i.has_key(preferred_type):
+ feed_url = i[preferred_type]
+ if not feed_url:
+ dialog = xbmcgui.Dialog()
+ ret = dialog.select(language(30013)+':%s' %preferred_type,
+ [i.keys()[0] for i in links_list])
+ if ret > -1:
+ feed_url = [i.values()[0] for i in links_list][ret]
+ else:
+ return
+ pod_dict = xmltodict.parse(make_request(feed_url+'?format=xml'))
+ iconimage = pod_dict['rss']['channel']['itunes:image']['@href']
+ items = pod_dict['rss']['channel']['item']
+ for i in items:
+ date_patterns = ['%a, %d %b %Y %H:%M:%S PST', '%a, %d %b %Y %H:%M:%S
PDT']
+ for pattern in date_patterns:
+ try:
+ date_time = datetime(*(time.strptime(i['pubDate'],
pattern)[0:6]))
+ item_date = date_time.strftime('%d.%m.%Y')
+ premiered = date_time.strftime('%d-%m-%Y')
+ break
+ except ValueError:
+ item_date = ''
+ premiered = ''
+ meta = {'Plot': i['itunes:summary'],
+ 'Duration': int(i['itunes:duration']) / 60,
+ 'Date': item_date,
+ 'Premiered': premiered}
+ add_dir(i['title'], i['media:content']['@url'], 'resolve', iconimage,
meta, False)
+
+
+def resolve_url(video_id):
+ params = {
+ 'iod':
'images,videoMedia,relatedLink,breadcrumb,relatedAssets,broadcast,lowcache',
+ 'partTag': 'cntv',
+ 'players': 'Download,RTMP',
+ 'showBroadcast': 'true',
+ 'videoIds': video_id,
+ 'videoMediaType': 'preferred'
+ }
+ data = make_request('http://api.cnet.com/restApi/v1.0/videoSearch?' +
urllib.urlencode(params))
+ pod_dict = xmltodict.parse(data)
+ item = pod_dict['CNETResponse']['Videos']['Video']
+ thumb = [i['ImageURL'] for i in item['Images']['Image'] if i['@width'] ==
'360'][0]
+ media_items = item['VideoMedias']['VideoMedia']
+ stream_urls = [i['DeliveryUrl'] for i in media_items if i['Height'] ==
'720']
+ if stream_urls:
+ return stream_urls[0]
+
+
+def add_dir(name, url, mode, iconimage, meta={}, isfolder=True):
+ params = {'name': name, 'url': url, 'mode': mode}
+ url = '%s?%s' %(sys.argv[0], urllib.urlencode(params))
+ listitem = xbmcgui.ListItem(name, iconImage="DefaultFolder.png",
thumbnailImage=iconimage)
+ meta["Title"] = name
+ if not isfolder:
+ listitem.setProperty('IsPlayable', 'true')
+ listitem.setProperty('Fanart_Image', iconimage)
+ listitem.setInfo(type="Video", infoLabels=meta)
+ xbmcplugin.addDirectoryItem(int(sys.argv[1]), url, listitem, isfolder)
+
+
+def get_params():
+ p = parse_qs(sys.argv[2][1:])
+ for i in p.keys():
+ p[i] = p[i][0]
+ return p
+
+
+def set_view_mode():
+ view_modes = {
+ '0': '502',
+ '1': '51',
+ '2': '3',
+ '3': '504',
+ '4': '503',
+ '5': '515'
+ }
+ view_mode = addon.getSetting('view_mode')
+ if view_mode == '6':
+ return
+ xbmc.executebuiltin('Container.SetViewMode(%s)' %view_modes[view_mode])
+
+
+params = get_params()
+
+try:
+ mode = params['mode']
+except:
+ mode = None
+
+addon_log(repr(params))
+
+if not mode:
+ display_categories()
+ xbmcplugin.setContent(int(sys.argv[1]), 'tvshows')
+ xbmcplugin.endOfDirectory(int(sys.argv[1]))
+
+elif mode == 'category':
+ display_category(params['url'])
+ xbmcplugin.setContent(int(sys.argv[1]), 'episodes')
+ set_view_mode()
+ xbmcplugin.endOfDirectory(int(sys.argv[1]))
+
+elif mode == 'resolve':
+ item = xbmcgui.ListItem(path=params['url'])
+ xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, item)
\ No newline at end of file
diff --git a/plugin.video.cnet.podcasts/resources/language/English/strings.xml
b/plugin.video.cnet.podcasts/resources/language/English/strings.xml
index b549e78..f5033a3 100644
--- a/plugin.video.cnet.podcasts/resources/language/English/strings.xml
+++ b/plugin.video.cnet.podcasts/resources/language/English/strings.xml
@@ -1,34 +1,17 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<strings>
- <string id="30000">Most Recent</string>
- <string id="30001">CNET On Cars</string>
- <string id="30002">CNET News</string>
- <string id="30003">Car Tech</string>
- <string id="30004">The Apple Byte</string>
- <string id="30005">CNET Conversations</string>
- <string id="30006">Cracking Open</string>
- <string id="30007">CNET's Top 5</string>
- <string id="30008">How To</string>
- <string id="30009">First Look</string>
- <string id="30010">Inside Scoop</string>
- <string id="30011">How To</string>
- <string id="30012">Car Tech Live</string>
- <string id="30013">Prizefight</string>
- <string id="30014">Tap That App</string>
- <string id="30015">Reporters' Roundtable</string>
- <string id="30016">The 404 Video</string>
- <string id='30017'>preGAME</string>
- <string id='30018'>Buzz Out Loud</string>
- <string id='30019'>Crave</string>
- <string id='30020'>Android Atlas Weekly</string>
- <string id='30021'>Audio</string>
- <string id='30022'>HD</string>
- <string id='30023'>SD</string>
- <string id='30024'>Playback Type (if available)</string>
- <string id='30025'>Rumor Has It</string>
- <string id='30026'>Dialed In Video</string>
- <string id='30027'>Device and Conquer</string>
- <string id='30028'> (audio)</string>
- <string id='30029'>Always On</string>
- <string id='30030'>CNET Update</string>
+ <string id='30000'></string>
+ <string id='30001'>Audio</string>
+ <string id='30002'>HD</string>
+ <string id='30003'>SD</string>
+ <string id="30004">Preferred playback type</string>
+ <string id="30005">Default view mode for episodes</string>
+ <string id="30006">List</string>
+ <string id="30007">Big list</string>
+ <string id="30008">Thumbnail</string>
+ <string id="30009">Media info</string>
+ <string id="30010">Media info 2</string>
+ <string id="30011">Media info 3</string>
+ <string id="30012">None</string>
+ <string id="30013">Preferred type is not available</string>
</strings>
diff --git a/plugin.video.cnet.podcasts/resources/settings.xml
b/plugin.video.cnet.podcasts/resources/settings.xml
index 88d0ba6..8a1736f 100644
--- a/plugin.video.cnet.podcasts/resources/settings.xml
+++ b/plugin.video.cnet.podcasts/resources/settings.xml
@@ -1,3 +1,4 @@
-<settings>
- <setting id="playback" type="enum" lvalues="30021|30022|30023"
label="30024" default="1"/>
+<settings>
+ <setting id="playback_type" type="enum" lvalues="30001|30002|30003"
label="30004" default="1"/>
+ <setting id="view_mode" type="enum" label="30005"
lvalues="30006|30007|30008|30009|30010|30011|30012" default="4"/>
</settings>
\ No newline at end of file
-----------------------------------------------------------------------
Summary of changes:
plugin.video.cnet.podcasts/addon.xml | 48 ++-
plugin.video.cnet.podcasts/changelog.txt | 87 +++---
plugin.video.cnet.podcasts/default.py | 365 ++++++++++----------
.../resources/language/English/strings.xml | 47 +--
plugin.video.cnet.podcasts/resources/settings.xml | 5 +-
5 files changed, 276 insertions(+), 276 deletions(-)
hooks/post-receive
--
Plugins
------------------------------------------------------------------------------
DreamFactory - Open Source REST & JSON Services for HTML5 & Native Apps
OAuth, Users, Roles, SQL, NoSQL, BLOB Storage and External API Access
Free app hosting. Or install the open source package on any LAMP server.
Sign up and see examples for AngularJS, jQuery, Sencha Touch and Native!
http://pubads.g.doubleclick.net/gampad/clk?id=63469471&iu=/4140/ostg.clktrk
_______________________________________________
Xbmc-addons mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/xbmc-addons