The branch, eden has been updated
via 0cf873a73859840d63bae28aeef76afde7ffe539 (commit)
via c378d4453e80a7647b9c862bf9a640754b4c54de (commit)
from bea2237630b203c94c271bd76ad94c1f27292b18 (commit)
- Log -----------------------------------------------------------------
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=0cf873a73859840d63bae28aeef76afde7ffe539
commit 0cf873a73859840d63bae28aeef76afde7ffe539
Author: beenje <[email protected]>
Date: Wed Jan 16 21:50:13 2013 +0100
[plugin.video.twit] updated to version 1.1.1
diff --git a/plugin.video.twit/addon.xml b/plugin.video.twit/addon.xml
index 5a7342a..c1daf47 100644
--- a/plugin.video.twit/addon.xml
+++ b/plugin.video.twit/addon.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="plugin.video.twit"
name="TWiT"
- version="1.1.0"
+ version="1.1.1"
provider-name="divingmule,thanks to Adam B.">
<requires>
<import addon="xbmc.python" version="2.0"/>
diff --git a/plugin.video.twit/changelog.txt b/plugin.video.twit/changelog.txt
index 3c093ba..e959e28 100644
--- a/plugin.video.twit/changelog.txt
+++ b/plugin.video.twit/changelog.txt
@@ -1,3 +1,9 @@
+Version 1.1.1
+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
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=c378d4453e80a7647b9c862bf9a640754b4c54de
-----------------------------------------------------------------------
Summary of changes:
plugin.video.synopsi/LICENSE.txt | 340 +++++
plugin.video.synopsi/README.markdown | 10 +
plugin.video.synopsi/_src/TODO | 40 +
plugin.video.synopsi/_src/release-local.sh | 25 +
plugin.video.synopsi/addon.py | 291 ++++
plugin.video.synopsi/addon.xml | 24 +
plugin.video.synopsi/addonservice.py | 172 +++
plugin.video.synopsi/apiclient.py | 488 ++++++
plugin.video.synopsi/app_apiclient.py | 219 +++
plugin.video.synopsi/cache.py | 471 ++++++
plugin.video.synopsi/changelog.txt | 8 +
plugin.video.synopsi/dialog.py | 529 +++++++
plugin.video.synopsi/fanart.jpg | Bin 0 -> 75292 bytes
plugin.video.synopsi/icon.png | Bin 0 -> 11832 bytes
plugin.video.synopsi/library.py | 142 ++
plugin.video.synopsi/loggable.py | 45 +
plugin.video.synopsi/mythread.py | 19 +
.../resources/language/English/strings.xml | 26 +
.../resources/language/Slovak/strings.xml | 25 +
plugin.video.synopsi/resources/settings.xml | 45 +
.../resources/skins/Default/720p/SelectMovie.xml | 250 ++++
.../resources/skins/Default/720p/SynopsiDialog.xml | 119 ++
.../resources/skins/Default/720p/VideoInfo.xml | 409 ++++++
.../resources/skins/Default/720p/ViewsFileMode.xml | 613 ++++++++
.../skins/Default/720p/ViewsVideoLibrary.xml | 1545 ++++++++++++++++++++
.../skins/Default/720p/customLoginDialog.xml | 155 ++
.../skins/Default/720p/custom_MyVideoNav.xml | 169 +++
.../resources/skins/Default/720p/includes.xml | 3 +
.../skins/Default/media/already-watched-stack.png | Bin 0 -> 5071 bytes
.../resources/skins/Default/media/bgr.png | Bin 0 -> 3076 bytes
.../resources/skins/Default/media/button1.png | Bin 0 -> 1585 bytes
.../resources/skins/Default/media/button2.png | Bin 0 -> 1697 bytes
.../resources/skins/Default/media/debug.png | Bin 0 -> 491 bytes
.../resources/skins/Default/media/default.png | Bin 0 -> 9968 bytes
.../resources/skins/Default/media/icon.png | Bin 0 -> 70062 bytes
.../media/ondisk-AND-already-watched-stack.png | Bin 0 -> 7109 bytes
.../resources/skins/Default/media/ondisk-stack.png | Bin 0 -> 3852 bytes
.../resources/skins/Default/media/pix.png | Bin 0 -> 119 bytes
.../skins/Default/media/show_all_button.png | Bin 0 -> 4378 bytes
.../resources/skins/Default/media/videos.jpg | Bin 0 -> 260099 bytes
plugin.video.synopsi/scrobbler.py | 247 ++++
plugin.video.synopsi/service.py | 86 ++
.../tests}/__init__.py | 0
plugin.video.synopsi/tests/apiclient.unittest.py | 340 +++++
plugin.video.synopsi/tests/cache.unittest.py | 181 +++
plugin.video.synopsi/tests/callable.py | 35 +
plugin.video.synopsi/tests/common.py | 12 +
.../tests/data}/__init__.py | 0
.../tests/data/get_all_movies.json | 729 +++++++++
.../tests/data/get_all_tvshows.json | 19 +
plugin.video.synopsi/tests/data/local_recco.py | 86 ++
plugin.video.synopsi/tests/executescript.test.py | 4 +
plugin.video.synopsi/tests/fakeenv/xbmc.py | 74 +
plugin.video.synopsi/tests/fakeenv/xbmcaddon.py | 27 +
plugin.video.synopsi/tests/fakeenv/xbmcgui.py | 25 +
.../tests/fakeenv/xbmcplugin.py | 0
plugin.video.synopsi/tests/fakeenv/xbmcvfs.py | 3 +
plugin.video.synopsi/tests/onlinecache.unittest.py | 288 ++++
plugin.video.synopsi/tests/service-test.py | 70 +
plugin.video.synopsi/tests/socketserver.py | 28 +
plugin.video.synopsi/tests/test.py | 282 ++++
plugin.video.synopsi/tests/typerror.test.py | 17 +
plugin.video.synopsi/tests/utilities.unittest.py | 49 +
plugin.video.synopsi/tests/xbmcrpc.unittest.py | 47 +
plugin.video.synopsi/top.py | 2 +
plugin.video.synopsi/utilities.py | 689 +++++++++
plugin.video.synopsi/xbmcrpc.py | 236 +++
plugin.video.twit/addon.xml | 2 +-
plugin.video.twit/changelog.txt | 6 +
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 +
73 files changed, 10004 insertions(+), 245 deletions(-)
create mode 100644 plugin.video.synopsi/LICENSE.txt
create mode 100644 plugin.video.synopsi/README.markdown
create mode 100644 plugin.video.synopsi/_src/TODO
create mode 100755 plugin.video.synopsi/_src/release-local.sh
create mode 100644 plugin.video.synopsi/addon.py
create mode 100644 plugin.video.synopsi/addon.xml
create mode 100644 plugin.video.synopsi/addonservice.py
create mode 100644 plugin.video.synopsi/apiclient.py
create mode 100644 plugin.video.synopsi/app_apiclient.py
create mode 100644 plugin.video.synopsi/cache.py
create mode 100644 plugin.video.synopsi/changelog.txt
create mode 100644 plugin.video.synopsi/dialog.py
create mode 100644 plugin.video.synopsi/fanart.jpg
create mode 100644 plugin.video.synopsi/icon.png
create mode 100644 plugin.video.synopsi/library.py
create mode 100644 plugin.video.synopsi/loggable.py
create mode 100644 plugin.video.synopsi/mythread.py
create mode 100644 plugin.video.synopsi/resources/language/English/strings.xml
create mode 100644 plugin.video.synopsi/resources/language/Slovak/strings.xml
create mode 100644 plugin.video.synopsi/resources/settings.xml
create mode 100644
plugin.video.synopsi/resources/skins/Default/720p/SelectMovie.xml
create mode 100644
plugin.video.synopsi/resources/skins/Default/720p/SynopsiDialog.xml
create mode 100644
plugin.video.synopsi/resources/skins/Default/720p/VideoInfo.xml
create mode 100644
plugin.video.synopsi/resources/skins/Default/720p/ViewsFileMode.xml
create mode 100644
plugin.video.synopsi/resources/skins/Default/720p/ViewsVideoLibrary.xml
create mode 100644
plugin.video.synopsi/resources/skins/Default/720p/customLoginDialog.xml
create mode 100644
plugin.video.synopsi/resources/skins/Default/720p/custom_MyVideoNav.xml
create mode 100644
plugin.video.synopsi/resources/skins/Default/720p/includes.xml
create mode 100644
plugin.video.synopsi/resources/skins/Default/media/already-watched-stack.png
create mode 100644 plugin.video.synopsi/resources/skins/Default/media/bgr.png
create mode 100644
plugin.video.synopsi/resources/skins/Default/media/button1.png
create mode 100644
plugin.video.synopsi/resources/skins/Default/media/button2.png
create mode 100644 plugin.video.synopsi/resources/skins/Default/media/debug.png
create mode 100644
plugin.video.synopsi/resources/skins/Default/media/default.png
create mode 100644 plugin.video.synopsi/resources/skins/Default/media/icon.png
create mode 100644
plugin.video.synopsi/resources/skins/Default/media/ondisk-AND-already-watched-stack.png
create mode 100644
plugin.video.synopsi/resources/skins/Default/media/ondisk-stack.png
create mode 100644 plugin.video.synopsi/resources/skins/Default/media/pix.png
create mode 100644
plugin.video.synopsi/resources/skins/Default/media/show_all_button.png
create mode 100644
plugin.video.synopsi/resources/skins/Default/media/videos.jpg
create mode 100644 plugin.video.synopsi/scrobbler.py
create mode 100644 plugin.video.synopsi/service.py
copy {plugin.audio.radio_de/resources =>
plugin.video.synopsi/tests}/__init__.py (100%)
create mode 100644 plugin.video.synopsi/tests/apiclient.unittest.py
create mode 100644 plugin.video.synopsi/tests/cache.unittest.py
create mode 100644 plugin.video.synopsi/tests/callable.py
create mode 100644 plugin.video.synopsi/tests/common.py
copy {plugin.audio.radio_de/resources =>
plugin.video.synopsi/tests/data}/__init__.py (100%)
create mode 100644 plugin.video.synopsi/tests/data/get_all_movies.json
create mode 100644 plugin.video.synopsi/tests/data/get_all_tvshows.json
create mode 100644 plugin.video.synopsi/tests/data/local_recco.py
create mode 100644 plugin.video.synopsi/tests/executescript.test.py
create mode 100644 plugin.video.synopsi/tests/fakeenv/xbmc.py
create mode 100644 plugin.video.synopsi/tests/fakeenv/xbmcaddon.py
create mode 100644 plugin.video.synopsi/tests/fakeenv/xbmcgui.py
copy plugin.audio.radio_de/resources/__init__.py =>
plugin.video.synopsi/tests/fakeenv/xbmcplugin.py (100%)
create mode 100644 plugin.video.synopsi/tests/fakeenv/xbmcvfs.py
create mode 100644 plugin.video.synopsi/tests/onlinecache.unittest.py
create mode 100644 plugin.video.synopsi/tests/service-test.py
create mode 100644 plugin.video.synopsi/tests/socketserver.py
create mode 100644 plugin.video.synopsi/tests/test.py
create mode 100644 plugin.video.synopsi/tests/typerror.test.py
create mode 100644 plugin.video.synopsi/tests/utilities.unittest.py
create mode 100644 plugin.video.synopsi/tests/xbmcrpc.unittest.py
create mode 100644 plugin.video.synopsi/top.py
create mode 100644 plugin.video.synopsi/utilities.py
create mode 100644 plugin.video.synopsi/xbmcrpc.py
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