The branch, frodo has been updated
via bb2ca769eb58a7666e16f469c0338946a54ede45 (commit)
from a8b97a95ccd12ccc6d0bdac0a76587dad1e9dc8a (commit)
- Log -----------------------------------------------------------------
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=bb2ca769eb58a7666e16f469c0338946a54ede45
commit bb2ca769eb58a7666e16f469c0338946a54ede45
Author: beenje <[email protected]>
Date: Sat Nov 2 21:39:46 2013 +0100
[plugin.video.roosterteeth] updated to version 0.0.4
diff --git a/plugin.video.roosterteeth/addon.xml
b/plugin.video.roosterteeth/addon.xml
index 35bc498..a9ef203 100644
--- a/plugin.video.roosterteeth/addon.xml
+++ b/plugin.video.roosterteeth/addon.xml
@@ -1,23 +1,27 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="plugin.video.roosterteeth"
name="Rooster Teeth"
- version="0.0.3"
+ version="0.0.4"
provider-name="divingmule">
<requires>
- <import addon="xbmc.python" version="2.0"/>
- <import addon="script.module.beautifulsoup" version="3.2.0"/>
- <import addon="script.common.plugin.cache" version="1.0.0"/>
- <import addon="script.module.simplejson" version="2.0.10"/>
- <import addon="plugin.video.youtube" version="3.1.0"/>
+ <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"/>
+ <import addon="plugin.video.youtube" version="4.4.6"/>
</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>Videos from RoosterTeeth.com</summary>
- <description>Videos for gamers, including the popular "Red vs Blue"
series.</description>
+ <summary>Videos from RoosterTeeth.com and AchievementHunter.com</summary>
+ <description>
+ Comedy and gaming shows from Rooster Teeth and Achievement Hunter,
including the popular "Red vs Blue" series.
+ </description>
<platform>all</platform>
<language>en</language>
+ <license>GNU GENERAL PUBLIC LICENSE. Version 2, June 1991</license>
+ <source>https://github.com/divingmule/plugin.video.roosterteeth</source>
+ <forum>http://forum.xbmc.org/showthread.php?tid=134588</forum>
</extension>
</addon>
diff --git a/plugin.video.roosterteeth/default.py
b/plugin.video.roosterteeth/default.py
index 3740543..396eb5a 100644
--- a/plugin.video.roosterteeth/default.py
+++ b/plugin.video.roosterteeth/default.py
@@ -1,274 +1,392 @@
import urllib
import urllib2
import re
-import os
+import json
+from urlparse import urlparse, parse_qs
+from traceback import format_exc
+
+import xmltodict
+import StorageServer
+from bs4 import BeautifulSoup
+
import xbmcplugin
import xbmcgui
import xbmcaddon
-from BeautifulSoup import BeautifulSoup, BeautifulStoneSoup
-try:
- import json
-except:
- import simplejson as json
-try:
- import StorageServer
-except:
- import storageserverdummy as StorageServer
cache = StorageServer.StorageServer("roosterteeth", 24)
-addon = xbmcaddon.Addon(id='plugin.video.roosterteeth')
+addon = xbmcaddon.Addon()
+addon_version = addon.getAddonInfo('version')
+addon_id = addon.getAddonInfo('id')
home = addon.getAddonInfo('path')
-icon = xbmc.translatePath(os.path.join(home, 'icon.png'))
-fanart = xbmc.translatePath(os.path.join(home, 'fanart.jpg'))
+icon = addon.getAddonInfo('icon')
+fanart = addon.getAddonInfo('fanart')
base = 'http://roosterteeth.com'
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, location=False):
- try:
- headers = {'User-agent' : 'Mozilla/5.0 (Windows NT 6.1; WOW64;
rv:12.0) Gecko/20100101 Firefox/12.0',
- 'Referer' : 'http://roosterteeth.com'}
- req = urllib2.Request(url,None,headers)
- response = urllib2.urlopen(req)
- response_url = urllib.unquote_plus(response.geturl())
- data = response.read()
- response.close()
- if location:
- return response_url
- else:
- return data
- except urllib2.URLError, e:
- print 'We failed to open "%s".' % url
- if hasattr(e, 'reason'):
- print 'We failed to reach a server.'
- print 'Reason: ', e.reason
- if hasattr(e, 'code'):
- print 'We failed with error code - %s.' % e.code
- xbmc.executebuiltin("XBMC.Notification(%s,%s %s,5000,%s)"
- %(language(30000), language(30001),
str(e.code), icon))
+ addon_log('Request URL: %s' %url)
+ try:
+ headers = {
+ 'User-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0)
Gecko/20100101 Firefox/24.0',
+ 'Referer': 'http://roosterteeth.com'
+ }
+ req = urllib2.Request(url, None, headers)
+ response = urllib2.urlopen(req)
+ response_url = urllib.unquote_plus(response.geturl())
+ data = response.read()
+ response.close()
+ if location:
+ return (response_url, data)
+ else:
+ 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(data):
+ if data:
+ if data.startswith('http'):
+ data = make_request(data)
+ return BeautifulSoup(data)
def cache_shows():
- rt_url = 'http://roosterteeth.com/archive/series.php'
- ah_url = 'http://ah.roosterteeth.com/archive/series.php'
- soup = BeautifulSoup(make_request(rt_url),
convertEntities=BeautifulSoup.HTML_ENTITIES)
- ah_soup = BeautifulSoup(make_request(ah_url),
convertEntities=BeautifulSoup.HTML_ENTITIES)
- shows = []
- items = soup('table', attrs={'class' : "border
boxBorder"})[0].table('tr')
- items += ah_soup('table', attrs={'class' : "border
boxBorder"})[0].table('tr')
- items += soup('table', attrs={'class' : "border
boxBorder"})[1].table('tr')
- items += ah_soup('table', attrs={'class' : "border
boxBorder"})[1].table('tr')
- for i in items:
+
+ def filter_items(item_list):
+ parsed = []
+ for i in item_list:
try:
show = (i.b.string, i.a['href'], i.img['src'])
- if not show in shows:
- shows.append(show)
- except: continue
- return(str(shows))
+ if not show in parsed:
+ parsed.append(show)
+ except:
+ addon_log('addonException: %s' %format_exc())
+ continue
+ return parsed
+ rt_url = 'http://roosterteeth.com/archive/series.php'
+ ah_url = 'http://ah.roosterteeth.com/archive/series.php'
+ soup = get_soup(rt_url)
+ ah_soup = get_soup(ah_url)
+ items = soup('table', class_="border boxBorder")[0].table('tr')
+ items += ah_soup('table', class_="border boxBorder")[0].table('tr')
+ retired_items = soup('table', class_="border boxBorder")[1].table('tr')
+ retired_items += ah_soup('table', class_="border boxBorder")[1].table('tr')
+ return repr({'active': filter_items(items), 'retired':
filter_items(retired_items)})
-def get_shows():
- shows = eval(cache.cacheFunction(cache_shows))
- for i in shows:
- if 'v=trending' in i[1]:
- i[1] = i[1].replace('v=trending','v=more')
- addDir(i[0], base+i[1], 1, i[2])
+def get_shows(shows):
+ for i in shows:
+ if 'v=trending' in i[1]:
+ i[1] = i[1].replace('v=trending','v=more')
+ add_dir(i[0], base+i[1], 1, i[2])
-def get_seasons(url,iconimage):
- try:
- soup = BeautifulSoup(make_request(url),
convertEntities=BeautifulSoup.HTML_ENTITIES)
- items = soup('td', attrs={'class' : "seasonsBox"})[0]('a')
- for i in items:
- print i['href']
- addDir(i.string, base+i['href'], 2, iconimage, True)
- except IndexError:
- index(url, False)
+def get_seasons(soup, iconimage):
+ try:
+ items = soup('td', class_="seasonsBox")[0]('a')
+ if len(items) < 1:
+ raise
+ except IndexError:
+ addon_log('Seasons Exception: %s' %format_exc())
+ return False
+ for i in items:
+ add_dir(i.string, base+i['href'], 2, iconimage, '', True)
+ return True
-def index(url, season=True):
- soup = BeautifulSoup(make_request(url),
convertEntities=BeautifulSoup.HTML_ENTITIES)
- if season:
- items = soup('div', attrs={'id' :
"profileAjaxContent"})[0]('table')[1]('a')
- else:
- items = soup('div', attrs={'id' :
"profileAjaxContent"})[0]('table')[0]('a')
- for i in items:
- href = i['href']
- item_id = href.split('id=')[1].split('&')[0]
- try:
- thumb = i.img['src']
- except:
- thumb = icon
- name = i('span')[0].string
- if name is None:
- name = i('span')[0].contents[0]
- try:
- if (not i('span')[1].string is None) and (not
i('span')[1].string in name):
- name += ': '+ i('span')[1].string
- except:
- pass
- duration = i.td.string
- if duration is None:
- diration = ''
- addLink(name, item_id, thumb, duration, 3)
+
+def index(soup, season=True):
+ if season:
+ items = soup('div', attrs={'id' :
"profileAjaxContent"})[0]('table')[1]('a')
+ else:
+ items = soup('div', attrs={'id' :
"profileAjaxContent"})[0]('table')[0]('a')
+ for i in items:
+ href = i['href']
+ item_id = href.split('id=')[1].split('&')[0]
try:
- next_page = soup('a', attrs={'id' : "streamLoadMore"})[0]['href']
- addDir(language(30002), base+next_page, 2,
xbmc.translatePath(os.path.join(home, 'resources', 'next.png')), season)
+ thumb = i.img['src']
except:
- print "Didn't find next page!"
+ thumb = icon
+ name = i('span')[0].string
+ if name is None:
+ name = i('span')[0].contents[0]
+ try:
+ if (not i('span')[1].string is None) and (not i('span')[1].string
in name):
+ name += ': ' + i('span')[1].string
+ except:
+ pass
+ duration = i.td.string
+ if duration is None:
+ diration = ''
+ add_dir(name.encode('utf-8', 'ignore'), item_id, 3, thumb, duration,
False, False)
+ try:
+ next_page = soup('a', attrs={'id' : "streamLoadMore"})[0]['href']
+ add_dir(language(30002), base + next_page, 2, icon, '', season)
+ except:
+ addon_log("Didn't find next page!")
def resolve_url(item_id):
- url =
'http://roosterteeth.com/archive/new/_loadEpisode.php?id=%s&v=morev' %item_id
- data = json.loads(make_request(url))
- soup = BeautifulSoup(data['embed']['html'],
convertEntities=BeautifulSoup.HTML_ENTITIES)
- try:
- filetype = soup.div['data-filetype']
- if filetype == 'youtube':
- youtube_id = soup.iframe['src'].split('/')[-1].split('?')[0]
- print ' youtube id: '+youtube_id
- path =
'plugin://plugin.video.youtube/?action=play_video&videoid='+youtube_id
- elif filetype == 'blip':
- blip_url = soup.iframe['src']
- print 'blip_url: '+blip_url
- path = get_blip_location(blip_url)
- except:
- sorry = "Sorry, you must be a Sponsor to see this video."
- if sorry in str(soup):
- xbmc.executebuiltin("XBMC.Notification(%s,%s,5000,%s)"
- %(language(30000), language(30003),
icon))
- print sorry
- return
- else:
- print '-- Unknown Error: here is the soup --'
- print soup
- return
- item = xbmcgui.ListItem(path=path)
- xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, item)
+ url = 'http://roosterteeth.com/archive/new/_loadEpisode.php?id=%s&v=morev'
%item_id
+ data = json.loads(make_request(url))
+ soup = get_soup(data['embed']['html'])
+ try:
+ filetype = soup.div['data-filetype']
+ if filetype == 'youtube':
+ youtube_id = soup.iframe['src'].split('/')[-1].split('?')[0]
+ addon_log('youtube id:' + youtube_id)
+ path =
'plugin://plugin.video.youtube/?action=play_video&videoid='+youtube_id
+ elif filetype == 'blip':
+ blip_url = soup.iframe['src']
+ addon_log('blip_url: ' + blip_url)
+ path = get_blip_location(blip_url)
+ addon_log('path: %s' %path)
+ except:
+ sorry = "Sorry, you must be a Sponsor to see this video."
+ if sorry in str(soup):
+ xbmc.executebuiltin("XBMC.Notification(%s,%s,5000,%s)"
+ %(language(30000), language(30003), icon))
+ addon_log(sorry)
+ return
+ else:
+ addon_log('addonException: %s' %format_exc())
+ return
+ return path
def get_blip_location(blip_url):
- blip_url = make_request(blip_url, True)
- pattern = re.compile('http://blip.tv/rss/flash/(.+?)&')
- blip_xml = 'http://blip.tv/rss/flash/'+pattern.findall(blip_url)[0]
- url = None
- soup = BeautifulStoneSoup(make_request(blip_xml),
convertEntities=BeautifulStoneSoup.XML_ENTITIES)
- if addon.getSetting('quality') == '0':
+ blip_data = make_request(blip_url, True)
+ pattern = re.compile('http://blip.tv/rss/flash/(.+?)&')
+ try:
+ feed_id = pattern.findall(blip_data[0])[0]
+ except IndexError:
+ patterns = [re.compile('config.id = "(.+?)";'),
+ re.compile('data-episode-id="(.+?)"')]
+ for i in patterns:
try:
- url = soup('media:content', attrs={'blip:role' : 'Blip HD
720'})[0]['url']
- except:
- try:
- url = soup('media:content', attrs={'blip:role' :
'Source'})[0]['url']
- except:
- pass
-
- elif addon.getSetting('quality') == '1':
- try:
- url = soup('media:content', attrs={'blip:role' : 'Blip
SD'})[0]['url']
- except:
- try:
- url = soup('media:content', attrs={'blip:role' : 'Blip
LD'})[0]['url']
- except:
- try:
- url = soup('media:content', attrs={'blip:role' :
'web'})[0]['url']
- except:
- try:
- url = soup('media:content', attrs={'blip:role' :
'Portable (iPod)'})[0]['url']
- except:
- pass
-
- if (url is None) or (addon.getSetting('quality') == '2'):
+ feed_id = i.findall(blip_data[1])[0]
+ except IndexError:
+ feed_id = None
+ pass
+ if feed_id:
+ break
+ if not feed_id:
+ addon_log('Did not find the feed ID')
+ return
+ blip_xml = 'http://blip.tv/rss/flash/' + feed_id
+ media_content = []
+ try:
+ blip_dict = xmltodict.parse(make_request(blip_xml))
+ items =
blip_dict['rss']['channel']['item']['media:group'][u'media:content']
+ if isinstance(items, dict):
try:
- url = soup('media:content', attrs={'isdefault' :
'true'})[0]['url']
+ return items['@url']
except:
+ raise
+ media_content = [i for i in items if i.has_key('@blip:role')]
+ except:
+ addon_log('addonException: %s' %format_exc())
+ return
+ if len(media_content) < 1:
+ addon_log('Did not find media content')
+ return
+ url = None
+ default = None
+ preferred_quality = addon.getSetting('quality')
+ if preferred_quality == '0':
+ try:
+ items = [{'type': i['@blip:role'], 'url': i['@url']} for i in
media_content if
+ '720' in i['@blip:role'] or 'Source' in i['@blip:role']]
+ if len(items) == 1:
+ return items[0]['url']
+ else:
try:
- url = soup.enclosure['url']
+ return [i['url'] for i in items if '720' in i['type']][0]
except:
- print ' -- URL was not found --'
- return
+ return [i['url'] for i in items if 'Source' in
i['type']][0]
+ except IndexError:
+ addon_log('Preffered setting not found')
+ elif preferred_quality == '1':
+ try:
+ url = [i['@url'] for i in media_content if
+ 'Blip SD' in i['@blip:role'] or 'web' in i['@blip:role']][0]
+ return url
+ except IndexError:
+ addon_log('Preffered setting not found')
+ elif preferred_quality == '2':
+ try:
+ url = [i['@url'] for i in media_content if
+ 'Blip LD' in i['@blip:role'] or 'Portable' in
i['@blip:role']][0]
+ return url
+ except IndexError:
+ addon_log('Preffered setting not found')
+ elif preferred_quality == '3':
+ try:
+ dialog = xbmcgui.Dialog()
+ ret = dialog.select(language(30006), [i['@blip:role'] for i in
media_content])
+ if ret > -1:
+ return media_content[ret]['@url']
+ except:
+ addon_log('addonException: select stream: %s' %format_exc())
+ return
+ try:
+ url = [i['@url'] for i in media_content if
+ i.has_key('@isDefault') and i['@isDefault'] == 'true'][0]
return url
+ except IndexError:
+ addon_log('addonException: did not find a default type')
+ return media_content[0]['@url']
+
+
+def get_podcasts():
+ podcast_path = 'http://s3.roosterteeth.com/podcasts/'
+ add_dir('RT Podcast', podcast_path + 'index.xml', 5, podcast_path +
'rtpodcast.jpg')
+ add_dir('The Patch', podcast_path + 'gaming-index.xml', 5, podcast_path +
'gamingpodcast.jpg')
+ add_dir('Spoilercast', podcast_path + 'spoiler-index.xml', 5, podcast_path
+ 'spoilercast_black.jpg')
+
+
+def get_podcasts_episodes(url, iconimage):
+ data = make_request(url)
+ pod_dict = xmltodict.parse(data)
+ items = pod_dict['rss']['channel']['item']
+ for i in items:
+ add_dir('%s : %s' %(i['title'], i['description']),
+ i['link'], 6, iconimage, i['itunes:duration'], False, False)
+
+
+def resolve_podcast_url(episode_url):
+ soup = get_soup(episode_url)
+ is_video = soup('embed')
+ blip_id = None
+ if is_video:
+ if 'swf#' in soup.embed['src']:
+ blip_id = soup.embed['src'].split('swf#')[1]
+ if blip_id:
+ resolved = get_blip_location('http://blip.tv/play/' + blip_id)
+ if resolved:
+ return resolved
+
+ downloads = []
+ items = soup.find('div', class_="titleLine",
text="DOWNLOAD").findNext('div')('a')
+ for i in items:
+ downloads.append((i.b.contents[0], i['href']))
+ if len(downloads) > 0:
+ dialog = xbmcgui.Dialog()
+ ret = dialog.select(language(30004), [i[0] for i in downloads])
+ if ret > -1:
+ return downloads[ret][1]
+
+
+def set_resolved_url(resolved_url):
+ success = False
+ if resolved_url:
+ success = True
+ else:
+ resolved_url = ''
+ item = xbmcgui.ListItem(path=resolved_url)
+ xbmcplugin.setResolvedUrl(int(sys.argv[1]), success, item)
+
+
+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 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 addLink(name,url,iconimage,duration,mode):
-
u=sys.argv[0]+"?url="+urllib.quote_plus(url)+"&mode="+str(mode)+"&name="+urllib.quote_plus(name)
- ok=True
- liz=xbmcgui.ListItem(name, iconImage="DefaultVideo.png",
thumbnailImage=iconimage)
- liz.setInfo( type="Video", infoLabels={ "Title": name, "Duration":
duration })
- liz.setProperty('IsPlayable', 'true')
- liz.setProperty( "Fanart_Image", fanart )
-
ok=xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz)
- return ok
-
-
-def addDir(name,url,mode,iconimage,season=False):
-
u=(sys.argv[0]+"?url="+urllib.quote_plus(url)+"&mode="+str(mode)+"&name="+urllib.quote_plus(name)
- +"&season="+str(season)+"&iconimage="+urllib.quote_plus(iconimage))
- ok=True
- liz=xbmcgui.ListItem(name, iconImage="DefaultFolder.png",
thumbnailImage=iconimage)
- liz.setInfo( type="Video", infoLabels={ "Title": name } )
- liz.setProperty( "Fanart_Image", fanart )
-
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
+ 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, duration=None, season=False,
isfolder=True):
+ params = {'name': name, 'url': url, 'mode': mode, 'iconimage': iconimage,
'season': season}
+ url = '%s?%s' %(sys.argv[0], urllib.urlencode(params))
+ listitem = xbmcgui.ListItem(name, iconImage="DefaultFolder.png",
thumbnailImage=iconimage)
+ listitem.setProperty( "Fanart_Image", fanart )
+ infolabels = {"Title": name}
+ if not isfolder:
+ listitem.setProperty('IsPlayable', 'true')
+ if duration:
+ infolabels['Duration'] = get_duration(duration)
+ listitem.setInfo(type="Video", infoLabels=infolabels)
+ xbmcplugin.addDirectoryItem(int(sys.argv[1]), url, listitem, isfolder)
+
+
+params = get_params()
try:
- url=urllib.unquote_plus(params["url"])
-except:
- pass
-try:
- name=urllib.unquote_plus(params["name"])
-except:
- pass
-try:
- iconimage=urllib.unquote_plus(params["iconimage"])
-except:
- pass
-try:
- season=eval(params["season"])
-except:
- pass
-try:
- mode=int(params["mode"])
+ mode = int(params['mode'])
except:
- pass
+ mode = None
+
+addon_log(repr(params))
+
+if mode == None:
+ add_dir(language(30008), 'get_latest', 8, icon)
+ add_dir(language(30005), 'get_podcasts', 4, icon)
+ shows = eval(cache.cacheFunction(cache_shows))
+ get_shows(shows['active'])
+ add_dir(language(30007), 'get_retired_shows', 7, icon)
+ xbmcplugin.endOfDirectory(int(sys.argv[1]))
+
+elif mode == 1:
+ soup = get_soup(params['url'])
+ seasons = get_seasons(soup, params['iconimage'])
+ if not seasons:
+ index(soup, False)
+ xbmcplugin.endOfDirectory(int(sys.argv[1]))
+
+elif mode == 2:
+ soup = get_soup(params['url'])
+ index(soup, params['season'])
+ xbmcplugin.endOfDirectory(int(sys.argv[1]))
-print "Mode: "+str(mode)
-print "URL: "+str(url)
-print "Name: "+str(name)
+elif mode == 3:
+ set_resolved_url(resolve_url(params['url']))
-if mode==None:
- get_shows()
+elif mode == 4:
+ get_podcasts()
+ xbmcplugin.endOfDirectory(int(sys.argv[1]))
-elif mode==1:
- get_seasons(url,iconimage)
+elif mode == 5:
+ get_podcasts_episodes(params['url'], params['iconimage'])
+ xbmcplugin.endOfDirectory(int(sys.argv[1]))
-elif mode==2:
- index(url, season)
+elif mode == 6:
+ set_resolved_url(resolve_podcast_url(params['url']))
-elif mode==3:
- resolve_url(url)
+elif mode == 7:
+ shows = eval(cache.cacheFunction(cache_shows))
+ get_shows(shows['retired'])
+ xbmcplugin.endOfDirectory(int(sys.argv[1]))
-xbmcplugin.endOfDirectory(int(sys.argv[1]))
\ No newline at end of file
+elif mode == 8:
+ soup = get_soup('http://roosterteeth.com/archive/?sid=rvb&v=newest')
+ index(soup, False)
+ xbmcplugin.endOfDirectory(int(sys.argv[1]))
diff --git a/plugin.video.roosterteeth/icon.png
b/plugin.video.roosterteeth/icon.png
index 688f1a5..5dbfb34 100644
Binary files a/plugin.video.roosterteeth/icon.png and
b/plugin.video.roosterteeth/icon.png differ
diff --git a/plugin.video.roosterteeth/resources/language/English/strings.xml
b/plugin.video.roosterteeth/resources/language/English/strings.xml
index dc3ca12..a1f4bae 100644
--- a/plugin.video.roosterteeth/resources/language/English/strings.xml
+++ b/plugin.video.roosterteeth/resources/language/English/strings.xml
@@ -1,16 +1,17 @@
-<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<strings>
<string id="30000">RoosterTeeth</string>
- <string id="30001">HTTP Error: </string>
+ <string id="30001"></string>
<string id="30002">Next Page</string>
<string id="30003">Sorry Sponsor only videos are not supported.</string>
- <string id="30004"></string>
- <string id="30005"></string>
- <string id="30006"></string>
- <string id="30007"></string>
- <string id="30008"></string>
- <string id="30009">Video Quality</string>
+ <string id="30004">Only audio is avaliable</string>
+ <string id="30005">Podcasts</string>
+ <string id="30006">Choose a stream</string>
+ <string id="30007">Retired Shows</string>
+ <string id="30008">Latest Episodes</string>
+ <string id="30009">Preferred Video Quality</string>
<string id="30010">High</string>
- <string id="30011">Low</string>
- <string id="30012">Default</string>
+ <string id="30011">Medium</string>
+ <string id="30012">Low</string>
+ <string id="30013">Ask</string>
</strings>
\ No newline at end of file
diff --git a/plugin.video.roosterteeth/resources/settings.xml
b/plugin.video.roosterteeth/resources/settings.xml
index e3b9d3b..1c9ba77 100644
--- a/plugin.video.roosterteeth/resources/settings.xml
+++ b/plugin.video.roosterteeth/resources/settings.xml
@@ -1,5 +1,5 @@
<settings>
<category label="General">
- <setting id="quality" type="enum" label="30009"
lvalues="30010|30011|30012" default="2"/>
+ <setting id="quality" type="enum" label="30009"
lvalues="30010|30011|30012|30013" default="1"/>
</category>
</settings>
\ No newline at end of file
-----------------------------------------------------------------------
Summary of changes:
plugin.video.roosterteeth/addon.xml | 28 +-
plugin.video.roosterteeth/changelog.txt | 6 +
plugin.video.roosterteeth/default.py | 564 ++++++++++++--------
plugin.video.roosterteeth/icon.png | Bin 49840 -> 61930 bytes
.../resources/language/English/strings.xml | 21 +-
plugin.video.roosterteeth/resources/next.png | Bin 18680 -> 0 bytes
plugin.video.roosterteeth/resources/settings.xml | 2 +-
.../resources/storageserverdummy.py | 26 -
.../resources/xbmcvfsdummy.py | 18 -
9 files changed, 375 insertions(+), 290 deletions(-)
create mode 100644 plugin.video.roosterteeth/changelog.txt
delete mode 100644 plugin.video.roosterteeth/resources/__init__.py
delete mode 100644 plugin.video.roosterteeth/resources/next.png
delete mode 100644 plugin.video.roosterteeth/resources/storageserverdummy.py
delete mode 100644 plugin.video.roosterteeth/resources/xbmcvfsdummy.py
hooks/post-receive
--
Plugins
------------------------------------------------------------------------------
Android is increasing in popularity, but the open development platform that
developers love is also attractive to malware creators. Download this white
paper to learn more about secure code signing practices that can help keep
Android apps secure.
http://pubads.g.doubleclick.net/gampad/clk?id=65839951&iu=/4140/ostg.clktrk
_______________________________________________
Xbmc-addons mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/xbmc-addons