The branch, frodo has been updated
via a1a5cf328f67c53c7da82020fb5ae4ad2ca84898 (commit)
from 89abca70ec07a6a84e214424e20f42b029d7ad0c (commit)
- Log -----------------------------------------------------------------
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=a1a5cf328f67c53c7da82020fb5ae4ad2ca84898
commit a1a5cf328f67c53c7da82020fb5ae4ad2ca84898
Author: beenje <[email protected]>
Date: Wed Jan 16 21:50:16 2013 +0100
[plugin.video.twit] updated to version 2.0.0
diff --git a/plugin.video.twit/addon.xml b/plugin.video.twit/addon.xml
index 5a7342a..4e34268 100644
--- a/plugin.video.twit/addon.xml
+++ b/plugin.video.twit/addon.xml
@@ -1,17 +1,16 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="plugin.video.twit"
name="TWiT"
- version="1.1.0"
- provider-name="divingmule,thanks to Adam B.">
+ version="2.0.0"
+ provider-name="divingmule">
<requires>
- <import addon="xbmc.python" version="2.0"/>
+ <import addon="xbmc.python" version="2.1.0"/>
<import addon="script.module.beautifulsoup" version="3.0.8"/>
<import addon="script.common.plugin.cache" version="1.0.0"/>
<import addon="script.module.simplejson" version="2.0.10"/>
</requires>
- <extension point="xbmc.python.pluginsource"
- library="default.py">
- <provides>audio video</provides>
+ <extension point="xbmc.python.pluginsource" library="default.py">
+ <provides>audio video</provides>
</extension>
<extension point="xbmc.addon.metadata">
<summary>TWiT</summary>
diff --git a/plugin.video.twit/changelog.txt b/plugin.video.twit/changelog.txt
index 3c093ba..9a9909a 100644
--- a/plugin.video.twit/changelog.txt
+++ b/plugin.video.twit/changelog.txt
@@ -1,3 +1,10 @@
+Version 2.0.0
+major version bump for frodo
+fix latest episodes, we now scrape the web-page as the rss isn't viable anymore
+added set-content-type as tv-shows, episodes; this enables more view modes
+added flowsoft hls strems for twit live
+added add-on setting "TWiT Live", select from the various live streams here
instead of adding a directory
+
Version 1.1.0
fix for website changes
added support for 'content_type' parameter, when launched as a music add-on,
the playback setting is ignored and audio will be selected
diff --git a/plugin.video.twit/default.py b/plugin.video.twit/default.py
index 3cb3c12..1c9f378 100644
--- a/plugin.video.twit/default.py
+++ b/plugin.video.twit/default.py
@@ -5,51 +5,34 @@ import os
import xbmcplugin
import xbmcgui
import xbmcaddon
+import StorageServer
+from datetime import datetime
from BeautifulSoup import BeautifulSoup, BeautifulStoneSoup
try:
import json
except:
import simplejson as json
-try:
- import StorageServer
-except:
- import storageserverdummy as StorageServer
-
-__settings__ = xbmcaddon.Addon(id='plugin.video.twit')
-__language__ = __settings__.getLocalizedString
-home = __settings__.getAddonInfo('path')
-fanart = xbmc.translatePath( os.path.join(home, 'fanart.jpg'))
-icon = xbmc.translatePath( os.path.join(home, 'icon.png'))
-cache = StorageServer.StorageServer("twit", 24)
-
-# thumbs are from http://leoville.tv/podcasts/coverart/
-thumbs = {
- 'All About Android' : 'aaa600.jpg',
- 'Before You Buy' : 'byb600.jpg',
- 'FLOSS Weekly' : 'floss600.jpg',
- 'Frame Rate' : 'fr600.jpg',
- 'Ham Nation' : 'hn600.jpg',
- 'Home Theater Geeks' : 'htg600.jpg',
- 'iFive for the iPhone' : 'ifive600.jpg',
- 'iPad Today' : 'ipad600.jpg',
- 'Know How...' : 'kh600.jpg',
- 'MacBreak Weekly' : 'mbw600.jpg',
- 'NSFW' : 'nsfw600.jpg',
- 'Radio Leo' : 'nsfw600.jpg',
- 'Security Now' : 'sn600.jpg',
- 'Tech News Today' : 'tnt600.jpg',
- 'The Giz Wiz' : 'dgw600.jpg',
- 'The Social Hour' : 'tsh600.jpg',
- 'The Tech Guy' : 'ttg600.jpg',
- 'This Week In Computer Hardware' : 'twich600.png',
- 'This Week in Enterprise Tech' : 'twiet600.jpg',
- 'This Week in Google' : 'twig600.jpg',
- 'This Week in Law' : 'twil600.jpg',
- 'This Week in Tech' : 'twit600.jpg',
- 'Triangulation' : 'tri600.jpg',
- 'TWiT Live Specials' : 'specials600.jpg',
- 'Windows Weekly' : 'ww600.jpg',
- }
+
+addon = xbmcaddon.Addon(id='plugin.video.twit')
+__language__ = addon.getLocalizedString
+addon_version = addon.getAddonInfo('version')
+home = xbmc.translatePath(addon.getAddonInfo('path'))
+fanart = os.path.join(home, 'fanart.jpg')
+icon = os.path.join(home, 'icon.png')
+live_icon = os.path.join(home, 'resources', 'live.png')
+cache = StorageServer.StorageServer("twit", 2)
+debug = addon.getSetting('debug')
+first_run = addon.getSetting('first_run')
+
+
+def addon_log(string):
+ if debug == 'true':
+ xbmc.log("[addon.TWiT-%s]: %s" %(addon_version, string))
+
+
+def cache_shows_file():
+ show_file = os.path.join(home, 'resources', 'shows')
+ cache.set("shows", open(show_file, 'r').read())
def make_request(url):
@@ -62,49 +45,61 @@ def make_request(url):
response.close()
return data
except urllib2.URLError, e:
- print 'We failed to open "%s".' % url
+ addon_log( 'We failed to open "%s".' % url)
if hasattr(e, 'reason'):
- print 'We failed to reach a server.'
- print 'Reason: ', e.reason
+ addon_log('We failed to reach a server.')
+ addon_log('Reason: ', e.reason)
if hasattr(e, 'code'):
- print 'We failed with error code - %s.' % e.code
+ addon_log('We failed with error code - %s.' % e.code)
-def get_thumb(url):
+def shows_cache(shows):
+ url = 'http://twit.tv/shows'
soup = BeautifulSoup(make_request(url),
convertEntities=BeautifulSoup.HTML_ENTITIES)
+ show_items = soup.findAll('div', attrs={'class' :
'item-list'})[2]('li')
+ for i in show_items:
+ name = str(i('a')[-1].string)
+ try:
+ show = shows[name]
+ except:
+ addon_log('Show not in cache: '+name)
+ show_url =
('http://twit.tv/show/'+name.replace("'",'').replace('.','').replace('
','-').lower()
+
.replace('-for-the','').replace('the-giz-wiz','weekly-daily-giz-wiz'))
+ new_show = cache_show(name, show_url)
+ if new_show:
+ addon_log('Cached new show: '+name)
+ return "True"
+
+
+def cache_show(name, url):
+ shows = eval(cache.get('shows'))
+ soup = BeautifulSoup(make_request(url),
convertEntities=BeautifulSoup.HTML_ENTITIES)
+ try:
+ desc = soup.find('div', attrs={'class': "field-content"}).getText()
+ if desc == None: raise
+ except:
+ addon_log('description exception: '+name)
+ desc = ''
try:
thumb = soup.find('div', attrs={'class' : "views-field
views-field-field-cover-art-fid"})('img')['src']
if thumb == None: raise
except:
+ addon_log('thumb exception: '+name)
thumb = icon
- return thumb
+ shows[name] = {'show_url': url, 'thumb': thumb, 'description': desc}
+ cache.set("shows", repr(shows))
+ return True
-def cache_shows():
- url = 'http://twit.tv/shows'
- soup = BeautifulSoup(make_request(url),
convertEntities=BeautifulSoup.HTML_ENTITIES)
- shows = soup.findAll('div', attrs={'class' : 'item-list'})[2]('li')
- show_list = []
- for i in shows:
- name = str(i('a')[-1].string)
- show_url =
('http://twit.tv/show/'+name.replace("'",'').replace('.','').replace('
','-').lower()
-
.replace('-for-the','').replace('the-giz-wiz','weekly-daily-giz-wiz'))
- try:
- thumb =
'http://twit-xbmc.googlecode.com/svn/images/'+thumbs[name]
- except:
- print '--- NO Thumb in Thumbs ---'
- thumb = get_thumb(url)
- show_list.append((name, show_url, thumb))
- return show_list
-
-
-def get_shows():
-
addDir(__language__(30008),'none',7,xbmc.translatePath(os.path.join(home,
'icon.png')))
-
addDir(__language__(30000),'addLiveLinks',3,xbmc.translatePath(os.path.join(home,
'resources', 'live.png')))
- shows = cache.cacheFunction(cache_shows)
- for i in shows:
- if i[0] == 'Radio Leo': continue
- addDir(i[0], i[1], 1, i[2])
+def get_shows(shows):
+ addDir(__language__(30000),'latest_episodes',4,icon)
+ addLink(__language__(30001),'twit_live','','',3,live_icon)
+ cache_shows = eval(cache.cacheFunction(shows_cache, shows))
+ if not cache_shows:
+ addon_log('shows_cache FAILED')
+ for i in shows.keys():
+ if i == 'Radio Leo': continue
+ addDir(i, shows[i]['show_url'], 1, shows[i]['thumb'],
shows[i]['description'])
def index(url,iconimage):
@@ -130,132 +125,121 @@ def index(url,iconimage):
pass
-def indexTwitFeed():
- url ='http://twit.tv/node/feed'
- soup = BeautifulStoneSoup(make_request(url),
convertEntities=BeautifulStoneSoup.XML_ENTITIES)
- for i in soup('item'):
- try:
- title = i.title.string
- url = i.link
- date = i.pubdate.string.rsplit(' ', 1)[0]
- item_str = str(i).replace(' ','').replace('\n','')
- except:
+def cache_latest_episods():
+ shows = eval(cache.get('shows'))
+ url = 'http://twit.tv/'
+ soup = BeautifulSoup(make_request(url),
convertEntities=BeautifulSoup.HTML_ENTITIES)
+ h_tag = soup.find('h2', attrs={'class': 'block-title'}, text='Most
Recent Episodes')
+ items_string = str(h_tag.findNext('div', attrs={'class':
"view-content"})('div'))
+ items_string = items_string.replace('\n','').replace('>
<','><').replace('>, <','><')
+ pattern = (
+ '<span class="field-content">(.+?)</span></div><div
class=".+?"><span class=".+?">'
+ '<div class="coverart"><img src="(.+?)" alt="" title=""
width=".+?" height=".+?" class=".+?" />'
+ '</div><div class="show-info"><a href="(.+?)">(.+?)</a>(.+?)
</div></span></div><div class=".+?">'
+ '<div class="field-content"><p>(.+?)</p>'
+ )
+ items_list = re.findall(pattern, items_string)
+ episode_list = []
+ episodes = ''
+ for show, thumb, href, episode, date, desc in items_list:
+ if episode in episodes:
+ addon_log('episode already in list')
continue
- url_list = []
- try:
- vid_url_high = re.compile('HD Video
URL: </div>(.+?)</div>').findall(item_str)[0]
- except:
- vid_url_high = 'no_url'
- url_list.append(vid_url_high)
- try:
- vid_url = re.compile('Video
URL: </div>(.+?)</div>').findall(item_str)[0]
- except:
- vid_url = 'no_url'
- url_list.append(vid_url)
- try:
- vid_url_low = re.compile('Video URL
\(mobile\): </div>(.+?)</div></div>').findall(item_str)[0]
- except:
- vid_url_low = 'no_url'
- url_list.append(vid_url_low)
+ name = '%s - %s' %(show, episode)
try:
- aud_url = re.compile('MP3 feed
URL: </div>(.+?)</div></div></div>').findall(item_str)[0]
+ thumbnail = shows[show]['thumb']
except:
- aud_url = 'no_url'
- url_list.append(aud_url)
-
- url = setUrl(url_list, False)
- if not url == 'no_url':
- try:
- episode_name = re.compile('<div class="field-item
odd">(.+?)</div></div>').findall(item_str)[0]
- if episode_name.startswith('<img'):
- episode_name = re.compile('<div class="field-item
odd"><p>(.+?)</p><p>').findall(item_str)[0]
- episode_name = episode_name.replace('&',
'&').replace('"', '"').replace(''', "'").encode('ascii', 'ignore')
- except:
- episode_name = ''
- try:
- thumb = re.compile('<img src="(.+?)"
alt=').findall(item_str)[0]
- except:
- thumb = ''
- try:
- desc = re.compile('<div class="field-item
odd"><p>(.+?)</p></div></div>').findall(item_str)[0]
- pattern = re.compile('<.+?>').findall(desc)
- for i in pattern:
- desc = desc.replace(i,'')
- description = desc.replace('&', '&').replace('"',
'"').replace(''', "'")
- except:
- description = ''
- name = title+' - '+episode_name
- addLink(name, url, description, date, 4, thumb)
- else: print '--- There was a problem adding episode %s ---' % title
-
-
-def getVideo(url):
+ addon_log('thumbnail exception: '+show)
+ thumbnail = thumb
+ episode_list.append((name,href,desc,date,thumbnail))
+ episodes += episode+', '
+ return episode_list
+
+
+def get_latest_episodes():
+ episodes = cache.cacheFunction(cache_latest_episods)
+ for i in episodes:
+ addLink(i[0], i[1], i[2], i[3], 2, i[4])
+
+
+def set_media_url(url):
+ playback_settings = {
+ '0': 'hd download',
+ '1': 'sd download',
+ '2': 'download',
+ '3': 'audio download'
+ }
soup = BeautifulSoup(make_request(url),
convertEntities=BeautifulSoup.HTML_ENTITIES)
- url_list = ['no_url', 'no_url', 'no_url', 'no_url']
+ media_urls = {}
for i in soup('span', attrs={'class' : "download"}):
- name = i.a['class']
- url = i.a['href']
- if name == 'audio download':
- url_list[3] = url
- if name == 'sd-low download':
- url_list[2] = url
- if name == 'sd download':
- url_list[1] = url
- if name == 'hd download':
- url_list[0] = url
- setUrl(url_list)
-
-
-def setUrl(url_list, set=True):
+ media_urls[i.a['class']] = i.a['href']
if content_type == 'audio':
- playback = '3'
+ playback_setting = '3'
+ playback_type = 'audio download'
else:
- playback = __settings__.getSetting('playback')
- if playback == '3':
- url = url_list[3]
- if playback == '2':
- url = url_list[2]
- if url == 'no_url':
- url = url_list[1]
- if playback == '1':
- url = url_list[1]
- if url == 'no_url':
- url = url_list[2]
- if playback == '0':
- url = url_list[0]
- if url == 'no_url':
- url = url_list[1]
- if url == 'no_url':
- url = url_list[2]
- if not set:
- return url
+ playback_setting = addon.getSetting('playback')
+ playback_type = playback_settings[playback_setting]
+ playback_url = None
+ if media_urls.has_key(playback_type):
+ playback_url = media_urls[playback_type]
else:
- if url == 'no_url':
- dialog = xbmcgui.Dialog()
- ret = dialog.yesno(__language__(30001), __language__(30002))
- if ret:
- url = url_list[3]
- else: return
- item = xbmcgui.ListItem(path=url)
- xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, item)
-
-
-def addLiveLinks():
-
addLink(__language__(30003),'http://bglive-a.bitgravity.com/twit/live/high?noprefix','','',4,xbmc.translatePath(
os.path.join( home, 'resources', 'live.png' ) ))
-
addLink(__language__(30004),'http://bglive-a.bitgravity.com/twit/live/low?noprefix','','',4,xbmc.translatePath(
os.path.join( home, 'resources', 'live.png' ) ))
-
addLink(__language__(30005),'http://cgw.ustream.tv/Viewer/getStream/1/1524.amf','','',5,xbmc.translatePath(
os.path.join( home, 'resources', 'live.png' ) ))
- addLink(__language__(30006),'URL','','',6,xbmc.translatePath(
os.path.join( home, 'resources/live.png' ) ))
-
addLink(__language__(30007),'http://twit.am/listen','','',4,xbmc.translatePath(
os.path.join( home, 'resources', 'live.png' ) ))
+ p_set = int(playback_setting)
+ if (p_set + 1) <= 3:
+ for i in range(len(playback_settings)):
+ p_set += 1
+ if p_set < 3:
+ try:
+ playback_url =
media_urls[playback_settings[str(p_set)]]
+ break
+ except: continue
+ if not playback_url:
+ dialog = xbmcgui.Dialog()
+ ret = dialog.select(__language__(30002), media_urls.keys())
+ playback_url = media_urls.values()[ret]
+
+ if playback_url:
+ success = True
+ else:
+ success = False
+ playback_url = ''
+ item = xbmcgui.ListItem(path=playback_url)
+ xbmcplugin.setResolvedUrl(int(sys.argv[1]), success, item)
+
+
+def twit_live():
+ live_streams = [
+
'http://twit.live-s.cdn.bitgravity.com/cdn-live-s1/_definst_/twit/live/high/playlist.m3u8',
+
'http://twit.live-s.cdn.bitgravity.com/cdn-live-s1/_definst_/twit/live/low/playlist.m3u8',
+ 'http://bglive-a.bitgravity.com/twit/live/high?noprefix',
+ 'http://bglive-a.bitgravity.com/twit/live/low?noprefix',
+ 'ustream',
+ 'justintv',
+
'http://hls.twit.tv:1935/flosoft/_definst_/mp4:twitStreamHi_1628/playlist.m3u8',
+
'http://hls.twit.tv:1935/flosoft/_definst_/mp4:twitStream_1128/playlist.m3u8',
+
'http://hls.twit.tv:1935/flosoft/_definst_/mp4:twitStream_696/playlist.m3u8',
+
'http://hls.twit.tv:1935/flosoft/_definst_/mp4:twitStream_496/playlist.m3u8',
+ 'http://twit.am/listen'
+ ]
+ if content_type == 'audio':
+ link = 'http://twit.am/listen'
+ else:
+ link = live_streams[int(addon.getSetting('twit_live'))]
+ if link == 'justintv':
+ link = get_jtv()
+ elif link == 'ustream':
+ link = get_ustream()
+ item = xbmcgui.ListItem(path=link)
+ xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, item)
-def getUstream(url):
+def get_ustream():
def getSwf():
url = 'http://www.ustream.tv/flash/viewer.swf'
req = urllib2.Request(url)
response = urllib2.urlopen(req)
swfUrl = response.geturl()
return swfUrl
- data = make_request(url)
+ data =
make_request('http://cgw.ustream.tv/Viewer/getStream/1/1524.amf')
match = re.compile('.*(rtmp://.+?)\x00.*').findall(data)
rtmp = match[0]
sName = re.compile('.*streamName\W\W\W(.+?)[/]*\x00.*').findall(data)
@@ -263,22 +247,17 @@ def getUstream(url):
swf = ' swfUrl='+getSwf()
pageUrl = ' pageUrl=http://live.twit.tv'
url = rtmp + playpath + swf + pageUrl + ' swfVfy=1 live=true'
- playLive(url)
+ return url
-def getJtv():
+def get_jtv():
soup =
BeautifulSoup(make_request('http://usher.justin.tv/find/twit.xml?type=live'))
token = ' jtv='+soup.token.string.replace('\\','\\5c').replace('
','\\20').replace('"','\\22')
rtmp = soup.connect.string+'/'+soup.play.string
Pageurl = ' Pageurl=http://www.justin.tv/twit'
- swf = '
swfUrl=http://www.justin.tv/widgets/live_embed_player.swf?channel=twit'
+ swf = '
swfUrl=http://www.justin.tv/widgets/live_embed_player.swf?channel=twit
live=true'
url = rtmp+token+swf+Pageurl
- playLive(url)
-
-
-def playLive(url):
- item = xbmcgui.ListItem(path=url)
- xbmcplugin.setResolvedUrl(int(sys.argv[1]), True, item)
+ return url
def get_params():
@@ -300,32 +279,42 @@ def get_params():
def addLink(name,url,description,date,mode,iconimage):
- try:
- description += "\n \n Published: " + date
- except:
- pass
u=(sys.argv[0]+"?url="+urllib.quote_plus(url)+"&mode="+str(mode)+"&name="+urllib.quote_plus(name)+
"&iconimage="+urllib.quote_plus(iconimage)+"&content_type="+content_type)
ok=True
+ episode = None
+ try: episode = int(re.findall('#(.+?):', name)[0])
+ except:
+ try: episode = int(name.split(' ')[-1])
+ except: pass
liz=xbmcgui.ListItem(name, iconImage=iconimage,
thumbnailImage=iconimage)
- liz.setInfo( type="Video", infoLabels={ "Title":
name,"Plot":description } )
- liz.setProperty( "Fanart_Image", fanart )
+ liz.setInfo(type="Video", infoLabels={"Title": name,
"Plot":description, "Aired": date, "episode": episode})
+ liz.setProperty("Fanart_Image", fanart)
liz.setProperty('IsPlayable', 'true')
ok=xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz)
return ok
-def addDir(name,url,mode,iconimage):
+def addDir(name,url,mode,iconimage,description=None):
u=(sys.argv[0]+"?url="+urllib.quote_plus(url)+"&mode="+str(mode)+"&name="+urllib.quote_plus(name)+
"&iconimage="+urllib.quote_plus(iconimage)+"&content_type="+content_type)
ok=True
liz=xbmcgui.ListItem(name, iconImage=iconimage,
thumbnailImage=iconimage)
- liz.setInfo( type="Video", infoLabels={ "Title": name } )
+ liz.setInfo(type="Video", infoLabels={"Title": name,
"Plot":description})
liz.setProperty( "Fanart_Image", fanart )
ok=xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]),url=u,listitem=liz,isFolder=True)
return ok
+if debug == 'true':
+ cache.dbg = True
+
+if first_run == 'true':
+ cache_shows_file()
+ addon_log('first_run, caching shows file')
+ xbmc.sleep(1000)
+ addon.setSetting('first_run', 'false')
+
params=get_params()
url=None
name=None
@@ -353,44 +342,40 @@ try:
except:
pass
-print "Mode: "+str(mode)
-print "URL: "+str(url)
-print "Name: "+str(name)
-
-if mode==None or url==None or len(url)<1:
- print ""
- get_shows()
+addon_log("Mode: "+str(mode))
+addon_log("URL: "+str(url))
+addon_log("Name: "+str(name))
+
+if mode==None:
+ try:
+ shows = eval(cache.get('shows'))
+ if isinstance(shows, dict):
+ get_shows(shows)
+ else: raise
+ except:
+ addon_log('"shows" cache missing')
+ cache_shows_file()
+ addon_log('caching shows file, this should only happen if common cache
db is reset')
+ xbmc.sleep(1000)
+ shows = eval(cache.get('shows'))
+ if isinstance(shows, dict):
+ get_shows(shows)
+ else:
+ addon_log('"shows" cache ERROR')
+ xbmcplugin.setContent(int(sys.argv[1]), 'tvshows')
elif mode==1:
- print ""
index(url,iconimage)
+ xbmcplugin.setContent(int(sys.argv[1]), 'episodes')
elif mode==2:
- print ""
- getVideo(url)
+ set_media_url(url)
elif mode==3:
- print ""
- addLiveLinks()
+ twit_live()
elif mode==4:
- print ""
- playLive(url)
-
-elif mode==5:
- print ""
- getUstream(url)
-
-elif mode==6:
- print ""
- getJtv()
-
-elif mode==7:
- print ""
- indexTwitFeed()
-
-elif mode==8:
- print ""
- setUrl(url)
+ get_latest_episodes()
+ xbmcplugin.setContent(int(sys.argv[1]), 'episodes')
xbmcplugin.endOfDirectory(int(sys.argv[1]))
\ No newline at end of file
diff --git a/plugin.video.twit/resources/language/English/strings.xml
b/plugin.video.twit/resources/language/English/strings.xml
index 91dd1e9..0595507 100644
--- a/plugin.video.twit/resources/language/English/strings.xml
+++ b/plugin.video.twit/resources/language/English/strings.xml
@@ -1,18 +1,24 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<strings>
- <string id='30000'>TWiT Live</string>
- <string id="30001">TWiT</string>
- <string id="30002">Seems the video is not up yet. Play the audio?</string>
- <string id="30003">Bitgravity 1 Mbps</string>
- <string id="30004">Bitgravity 400 kbps</string>
- <string id='30005'>Ustream 1.5 Mbps</string>
- <string id="30006">Justin.TV 1 Mbps</string>
- <string id="30007">Audio TWiT.am/listen</string>
- <string id="30008">Latest Episodes</string>
- <string id="30009"></string>
- <string id='30010'>Playback</string>
- <string id='30011'>Video (HD) 1280x720 Bitrate 2500</string>
- <string id="30012">Video (SD) 864x480 Bitrate 500</string>
- <string id="30013">Video (low/mobile) 640x368 Bitrate 256</string>
- <string id="30014">Audio</string>
+ <string id='30000'>Latest Episodes</string>
+ <string id="30001">TWiT Live</string>
+ <string id="30002">Available Streams</string>
+ <string id="30003">Bitgravity (hls 1 mbps)</string>
+ <string id="30004">Bitgravity (hls 400 kbps)</string>
+ <string id='30005'>Bitgravity (http 1 mbps)</string>
+ <string id="30006">Bitgravity (http 400 kbps)</string>
+ <string id="30007">Ustream (rtmp 1.5 mbps)</string>
+ <string id="30008">JustinTV (rtmp 1 mbps)</string>
+ <string id="30009">Flosoft.biz (hls 1.5 mbps)</string>
+ <string id='30010'>Flosoft.biz (hls 1 mbps)</string>
+ <string id='30011'>Flosoft.biz (hls 600 kbps)</string>
+ <string id="30012">Flosoft.biz (hls 400 kbps)</string>
+ <string id="30013">Audio TWiT.am/listen</string>
+ <string id="30014">Playback Type</string>
+ <string id="30015">Video (HD) 1280x720 Bitrate 2500</string>
+ <string id="30016">Video (SD) 864x480 Bitrate 500</string>
+ <string id="30017">Video (low/mobile) 640x368 Bitrate 256</string>
+ <string id="30018">Audio</string>
+ <string id="30019">Add-on Debugging</string>
+ <string id="30020"></string>
</strings>
\ No newline at end of file
diff --git a/plugin.video.twit/resources/settings.xml
b/plugin.video.twit/resources/settings.xml
index 2266cd2..d843226 100644
--- a/plugin.video.twit/resources/settings.xml
+++ b/plugin.video.twit/resources/settings.xml
@@ -1,3 +1,6 @@
<settings>
- <setting id="playback" type="enum" lvalues="30011|30012|30013|30014"
label="30010" default="1"/>
+ <setting id="playback" type="enum" lvalues="30015|30016|30017|30018"
label="30014" default="1" />
+ <setting id="twit_live" label="30001" type="select"
lvalues="30003|30004|30005|30006|30007|30008|30009|30010|30011|30012|30013"
default="4" />
+ <setting id="debug" type="bool" label="30019" default="false" />
+ <setting id="first_run" type="bool" visible="false" default="true" />
</settings>
\ No newline at end of file
-----------------------------------------------------------------------
Summary of changes:
plugin.video.twit/addon.xml | 11 +-
plugin.video.twit/changelog.txt | 7 +
plugin.video.twit/default.py | 441 ++++++++++----------
.../resources/language/English/strings.xml | 36 +-
plugin.video.twit/resources/settings.xml | 5 +-
plugin.video.twit/resources/shows | 1 +
6 files changed, 251 insertions(+), 250 deletions(-)
create mode 100644 plugin.video.twit/resources/shows
hooks/post-receive
--
Plugins
------------------------------------------------------------------------------
Master Java SE, Java EE, Eclipse, Spring, Hibernate, JavaScript, jQuery
and much more. Keep your Java skills current with LearnJavaNow -
200+ hours of step-by-step video tutorials by Java experts.
SALE $49.99 this month only -- learn more at:
http://p.sf.net/sfu/learnmore_122612
_______________________________________________
Xbmc-addons mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/xbmc-addons