The branch, frodo has been updated
via 0c8af3a9b9e2794fb603b5f0e7fc193443929d0b (commit)
via c47e4d69ed6a32edcb93211f49b43331076179df (commit)
via 6deb77e33d5022056146e2c9426385276473c41b (commit)
from 35c649eaf9c6ded3bf5a45815fbb5645ce091914 (commit)
- Log -----------------------------------------------------------------
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=0c8af3a9b9e2794fb603b5f0e7fc193443929d0b
commit 0c8af3a9b9e2794fb603b5f0e7fc193443929d0b
Author: beenje <[email protected]>
Date: Thu Dec 6 20:10:24 2012 +0100
[plugin.video.nasa] updated to version 1.0.3
diff --git a/plugin.video.nasa/addon.py b/plugin.video.nasa/addon.py
index ea011f1..5b80a96 100644
--- a/plugin.video.nasa/addon.py
+++ b/plugin.video.nasa/addon.py
@@ -1,190 +1,207 @@
-from xbmcswift import Plugin, xbmc, xbmcplugin, xbmcgui, clean_dict
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2012 Tristan Fischer ([email protected])
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+from xbmcswift2 import Plugin
+
import resources.lib.videos_scraper as videos_scraper
import resources.lib.streams_scraper as streams_scraper
import resources.lib.vodcasts_scraper as vodcast_scraper
-__addon_name__ = 'Nasa'
-__id__ = 'plugin.video.nasa'
-
-
-class Plugin_mod(Plugin):
-
- def add_items(self, iterable, view_mode=None,
- sort_method_ids=[], is_update=False,):
- items = []
- urls = []
- for i, li_info in enumerate(iterable):
- items.append(self._make_listitem(**li_info))
- if self._mode in ['crawl', 'interactive', 'test']:
- print '[%d] %s%s%s (%s)' % (i + 1, '', li_info.get('label'),
- '', li_info.get('url'))
- urls.append(li_info.get('url'))
- if self._mode is 'xbmc':
- if view_mode:
- xbmc.executebuiltin('Container.SetViewMode(%s)' % view_mode)
- xbmcplugin.addDirectoryItems(self.handle, items, len(items))
- for id in sort_method_ids:
- xbmcplugin.addSortMethod(self.handle, id)
- xbmcplugin.endOfDirectory(self.handle, updateListing=is_update)
- return urls
+STRINGS = {
+ 'page': 30001,
+ 'streams': 30100,
+ 'videos': 30101,
+ 'vodcasts': 30103,
+ 'search': 30200,
+ 'title': 30201
+}
-plugin = Plugin_mod(__addon_name__, __id__, __file__)
+plugin = Plugin()
[email protected]('/', default=True)
[email protected]('/')
def show_root_menu():
- log('show_root_menu start')
- items = []
- items.append({'label': plugin.get_string(30100),
- 'url': plugin.url_for('show_streams')})
- items.append({'label': plugin.get_string(30101),
- 'url': plugin.url_for('show_video_topics')})
- items.append({'label': plugin.get_string(30103),
- 'url': plugin.url_for('show_vodcasts')})
- log('show_root_menu end')
- return plugin.add_items(items)
+ items = [
+ {'label': _('streams'),
+ 'path': plugin.url_for('show_streams')},
+ {'label': _('videos'),
+ 'path': plugin.url_for('show_video_topics')},
+ {'label': _('vodcasts'),
+ 'path': plugin.url_for('show_vodcasts')}
+ ]
+ return plugin.finish(items)
@plugin.route('/streams/')
def show_streams():
- log('show_streams start')
- streams = streams_scraper.get_streams()
- items = [{'label': stream['title'],
- 'url': plugin.url_for('play_stream', id=stream['id']),
- 'thumbnail': stream['thumbnail'],
- 'info': {'originaltitle': stream['title'],
- 'plot': stream['description']},
- 'is_folder': False,
- 'is_playable': True,
- } for stream in streams]
- log('show_streams finished')
- return plugin.add_items(items)
+ items = [{
+ 'label': stream['title'],
+ 'path': plugin.url_for(
+ endpoint='play_stream',
+ id=stream['id']
+ ),
+ 'icon': stream['thumbnail'],
+ 'info': {
+ 'originaltitle': stream['title'],
+ 'plot': stream['description']
+ },
+ 'is_playable': True,
+ } for stream in streams_scraper.get_streams()]
+ return plugin.finish(items)
@plugin.route('/videos/')
def show_video_topics():
- log('show_video_topics started')
- Scraper = videos_scraper.Scraper()
- topics = Scraper.get_video_topics()
- items = [{'label': topic['name'],
- 'url': plugin.url_for('show_videos_by_topic',
- topic_id=topic['id'],
- page='1'),
- } for topic in topics]
- items.append({'label': plugin.get_string(30200),
- 'url': plugin.url_for('search')})
- log('show_video_topics finished')
- return plugin.add_items(items)
+ scraper = videos_scraper.Scraper()
+ items = [{
+ 'label': topic['name'],
+ 'path': plugin.url_for(
+ endpoint='show_videos_by_topic',
+ topic_id=topic['id'],
+ page='1'
+ ),
+ } for topic in scraper.get_video_topics()]
+ items.append({
+ 'label': _('search'),
+ 'path': plugin.url_for(
+ endpoint='search'
+ )
+ })
+ return plugin.finish(items)
@plugin.route('/vodcasts/')
def show_vodcasts():
- log('show_vodcasts start')
- vodcasts = vodcast_scraper.get_vodcasts()
- items = [{'label': vodcast['title'],
- 'url': plugin.url_for('show_vodcast_videos',
- rss_file=vodcast['rss_file']),
- } for vodcast in vodcasts]
- log('show_vodcasts finished')
- return plugin.add_items(items)
+ items = [{
+ 'label': vodcast['title'],
+ 'path': plugin.url_for(
+ endpoint='show_vodcast_videos',
+ rss_file=vodcast['rss_file']
+ ),
+ } for vodcast in vodcast_scraper.get_vodcasts()]
+ return plugin.finish(items)
[email protected]('/vodcast/<rss_file>/')
[email protected]('/vodcasts/<rss_file>/')
def show_vodcast_videos(rss_file):
- log('show_vodcast_videos start')
videos = vodcast_scraper.show_vodcast_videos(rss_file)
- items = [{'label': video['title'],
- 'info': {'plot': video['description']},
- 'url': video['url'],
- 'thumbnail': video['thumbnail'],
- 'is_folder': False,
- 'is_playable': True,
- } for video in videos]
- log('show_vodcast_videos finished')
- return plugin.add_items(items)
+ items = [{
+ 'label': video['title'],
+ 'info': {
+ 'plot': video['description']
+ },
+ 'path': video['url'],
+ 'thumbnail': video['thumbnail'],
+ 'is_playable': True,
+ } for video in videos]
+ return plugin.finish(items)
@plugin.route('/videos/<topic_id>/<page>/')
def show_videos_by_topic(topic_id, page):
- log('show_videos_by_topic started with topic_id=%s' % topic_id)
- Scraper = videos_scraper.Scraper()
+ scraper = videos_scraper.Scraper()
limit = 30
page = int(page)
start = (page - 1) * limit
- videos, count = Scraper.get_videos_by_topic_id(topic_id, start, limit)
+ videos, count = scraper.get_videos_by_topic_id(topic_id, start, limit)
items = __format_videos(videos)
if count > page * limit:
next_page = str(page + 1)
- items.insert(0, {'label': '>> %s %s >>' % (plugin.get_string(30001),
- next_page),
- 'url': plugin.url_for('show_videos_by_topic',
- topic_id=topic_id,
- page=next_page)})
+ items.insert(0, {
+ 'label': '>> %s %s >>' % (_('page'), next_page),
+ 'path': plugin.url_for(
+ endpoint='show_videos_by_topic',
+ topic_id=topic_id,
+ page=next_page,
+ update='true')
+ })
if page > 1:
previous_page = str(page - 1)
- items.insert(0, {'label': '<< %s %s <<' % (plugin.get_string(30001),
- previous_page),
- 'url': plugin.url_for('show_videos_by_topic',
- topic_id=topic_id,
- page=previous_page)})
- is_update = (page != 1)
- log('show_videos_by_topic finished')
- return plugin.add_items(items, sort_method_ids=(37, 3, 4, 8),
- is_update=is_update)
-
-
[email protected]('/video/<id>/')
+ items.insert(0, {
+ 'label': '<< %s %s <<' % (_('page'), previous_page),
+ 'path': plugin.url_for(
+ endpoint='show_videos_by_topic',
+ topic_id=topic_id,
+ page=previous_page,
+ update='true')
+ })
+ finish_kwargs = {
+ 'sort_methods': ('PLAYLIST_ORDER', 'DATE', 'SIZE', 'DURATION'),
+ 'update_listing': 'update' in plugin.request.args
+ }
+ return plugin.finish(items, **finish_kwargs)
+
+
[email protected]('/video/<id>')
def play_video(id):
- log('play_video started with id=%s' % id)
- Scraper = videos_scraper.Scraper()
- video = Scraper.get_video(id)
- log('play_video finished with video=%s' % video)
+ video = videos_scraper.Scraper().get_video(id)
return plugin.set_resolved_url(video['url'])
[email protected]('/stream/<id>/')
[email protected]('/stream/<id>')
def play_stream(id):
- log('play_stream started with id=%s' % id)
stream_url = streams_scraper.get_stream(id)
- log('play_stream finished with video=%s' % stream_url)
return plugin.set_resolved_url(stream_url)
@plugin.route('/search/')
def search():
- log('search start')
- query = None
- keyboard = xbmc.Keyboard('', plugin.get_string(30201))
- keyboard.doModal()
- if keyboard.isConfirmed() and keyboard.getText():
- query = keyboard.getText()
- if len(query) > 3:
- log('search gots a string: "%s"' % query)
- Scraper = videos_scraper.Scraper()
- videos, count = Scraper.search_videos(query)
- items = __format_videos(videos)
- log('search end')
- return plugin.add_items(items)
+ query = plugin.keyboard(heading=_('title'))
+ if query and len(query) > 3:
+ log('search gots a string: "%s"' % query)
+ videos, count = videos_scraper.Scraper().search_videos(query)
+ items = __format_videos(videos)
+ return plugin.finish(items)
def __format_videos(videos):
- return [{'label': video['title'],
- 'thumbnail': video['thumbnail'],
- 'info': {'originaltitle': video['title'],
- 'duration': video['duration'],
- 'plot': video['description'],
- 'date': video['date'],
- 'size': video['filesize'],
- 'credits': video['author'],
- 'genre': '|'.join(video['genres'])},
- 'url': plugin.url_for('play_video', id=video['id']),
- 'is_folder': False,
- 'is_playable': True,
- } for video in videos]
+ items = [{
+ 'label': video['title'],
+ 'thumbnail': video['thumbnail'],
+ 'info': {
+ 'originaltitle': video['title'],
+ 'duration': video['duration'],
+ 'plot': video['description'],
+ 'date': video['date'],
+ 'size': video['filesize'],
+ 'credits': video['author'],
+ 'genre': ' | '.join(video['genres'])
+ },
+ 'is_playable': True,
+ 'path': plugin.url_for(
+ endpoint='play_video',
+ id=video['id']
+ ),
+ } for video in videos]
+ return items
+
+
+def _(string_id):
+ if string_id in STRINGS:
+ return plugin.get_string(STRINGS[string_id])
+ else:
+ plugin.log.warning('String is missing: %s' % string_id)
+ return string_id
def log(text):
- xbmc.log('%s addon: %s' % (__addon_name__, text))
+ plugin.log.info(text)
if __name__ == '__main__':
plugin.run()
diff --git a/plugin.video.nasa/addon.xml b/plugin.video.nasa/addon.xml
index 9056abc..e66a47e 100644
--- a/plugin.video.nasa/addon.xml
+++ b/plugin.video.nasa/addon.xml
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<addon id="plugin.video.nasa" name="Nasa Videos, TV and Vodcasts"
version="1.0.2" provider-name="Tristan Fischer ([email protected])">
+<addon id="plugin.video.nasa" name="Nasa Videos, TV and Vodcasts"
version="1.0.3" provider-name="Tristan Fischer ([email protected])">
<requires>
<import addon="xbmc.python" version="2.0"/>
- <import addon="script.module.xbmcswift" version="0.2.0"/>
+ <import addon="script.module.xbmcswift2" version="1.3.0"/>
<import addon="script.module.simplejson" version="2.0.10"/>
<import addon="script.module.beautifulsoup" version="3.0.8"/>
</requires>
@@ -12,7 +12,39 @@
<extension point="xbmc.addon.metadata">
<language>en</language>
<platform>all</platform>
+ <!-- translation commit: 13cd927c1cd3833e3cb148ad490c03ac18043a37 -->
+ <summary lang="be">Video plugin to access content from nasa.gov</summary>
+ <summary lang="bg">Ðидео добавка за доÑÑÑп до
ÑÑдÑÑжаниеÑо на nasa.gov</summary>
+ <summary lang="ca">Afegitó de video per accedir al contingut de
nasa.gov</summary>
+ <summary lang="de">Video Plug-In für Inhalte von nasa.gov</summary>
+ <summary lang="el">Plugin βίνÏεο για ÏÏÏÏβαÏη Ïε
ÏεÏιεÏÏμενο αÏÏ Ïο nasa.gov</summary>
<summary lang="en">Video plugin to access content from nasa.gov</summary>
+ <summary lang="es">Complemento de video para acceder a contenido de
nasa.gov</summary>
+ <summary lang="hu">Videó plugin a nasa.gov tartalmának
eléréséhez</summary>
+ <summary lang="it">Plugin video per accedere ai contenuti di
nasa.gov</summary>
+ <summary lang="ko">nasa.govì 컨í
ì¸ ë¥¼ ì´ì©í기 ìí ë¹ëì¤
íë¬ê·¸ì¸</summary>
+ <summary lang="lt">Vaizdo iskiepis/papildinys prieigai prie turinio iš
nasa.gov</summary>
+ <summary lang="pl">Wtyczka wideo umożliwiajÄ
ca uzyskanie dostÄpu do
zawartoÅci strony nasa.gov</summary>
+ <summary lang="pt">Extensão de vÃdeo para aceder aos conteúdos de
nasa.gov</summary>
+ <summary lang="pt_BR">Plugin de VÃdeo para acessar conteúdo da
nasa.gov</summary>
+ <summary lang="ru">Ðидео-плагин Ð´Ð»Ñ Ð´Ð¾ÑÑÑпа к
ÑодеÑÐ¶Ð¸Ð¼Ð¾Ð¼Ñ nasa.gov</summary>
+ <summary lang="sv">Videotillägg för åtkomst till material från
nasa.gov</summary>
+ <summary lang="zh">è®¿é®æ¥èªnasa.govå
容çè§é¢æä»¶</summary>
+ <description lang="be">This video plugin provides access to more than 1800
videos, 8 vodcasts and 4 nasa-tv livestreams[CR]All content is dynamic and
should be always up to date.</description>
+ <description lang="ca">Aquest afegitó de video permet accedir a més de
1800 videos, 8 vodcasts i 4 fluxes de tv de la nasa[CR]Tot el contingut és
dinà mic i sempre hauria d'estar actualitzat.</description>
+ <description lang="de">Dieses Video Plug-In bietet Zugang zu über 1800
Videos, 8 Vodcasts und 4 nasa-TV Livestreams[CR]Der gesamte Inhalt ist
dynamisch und sollte immer aktuell sein.</description>
+ <description lang="el">ÎÏ
ÏÏ Ïο plugin βίνÏεο ÏαÏÎÏει
ÏÏÏÏβαÏη Ïε ÏεÏιÏÏÏÏεÏα αÏÏ 1800 βίνÏεο, 8
vodcast και 4 Live ÏοÎÏ.[CR]Îλο Ïο ÏεÏιεÏÏμενο
είναι δÏ
Î½Î±Î¼Î¹ÎºÏ ÎºÎ±Î¹ είναι διαÏκÏÏ
ενημεÏÏμÎνο.</description>
<description lang="en">This video plugin provides access to more than 1800
videos, 8 vodcasts and 4 nasa-tv livestreams[CR]All content is dynamic and
should be always up to date.</description>
+ <description lang="es">Este complemento de video permite acceder a más de
1800 vÃdeos, 8 vodcasts y 4 canales en directo de la NASA[CR]Todo el contenido
es dinámico y deberÃa estar siempre actualizado.</description>
+ <description lang="hu">Ez a plugin hozzáférést enged több mint 1800
videóhoz, 8 vodcast-hoz és 4 nasa-tv műsorfolzamhoz.[CR]A teljes tartalom
dinamikus és naprakész.</description>
+ <description lang="it">Questo plugin video permette l'accesso a più di
1800 video, 8 vodcasts e 4 flussi dal vivo di nasa tv[CR]. Tutto il contenuto
è dinamico e dovrebbe essere aggiornato sempre.</description>
+ <description lang="ko">1800ê° ì´ìì ëìì, 8ê°ì VOD ìºì¤í¸,
4ê°ì nasa-tv ìë°©ì¡ì ì´ì©í ì ììµëë¤.[CR]All content is
dynamic and should be always up to date.</description>
+ <description lang="lt">Å is vaizdo iskiepis/papildinys suteikia prieigÄ
prie daugiau nei 1800 video, 8 vaizdo failų ir 4 NASA TV (Live
srautas(-ai))[CR]Visas turinys yra dinamiškas ir visada yra
atnaujinamas.</description>
+ <description lang="pl">Wtyczka wideo zapewnia dostÄp do ponad 1800
filmów, 8 vodcastsów oraz 4 kanaÅów Nasa-TV[CR]CaÅa zawartoÅÄ jest
dynamiczna i powinna byÄ zawsze aktualna.</description>
+ <description lang="pt">Esta extensão de vÃdeo permite-lhe aceder a mais
de 1800 vÃdeos, 8 vodcasts e 4 transmissões em directo da nasa-tv[CR]Todo
este conteúdo é dinâmico e estará sempre actualizado.</description>
+ <description lang="pt_BR">Este plugin de vÃdeo provê acesso para mais de
1800 vÃdeos, 8 vodcasts e 4 transmissões ao vivo da TV Nasa[CR]Todos os
conteúdos são dinâmicos e e deve estar sempre atualizado.</description>
+ <description lang="ru">Ðидео-плагин пÑедоÑÑавлÑеÑ
доÑÑÑп к более Ñем 1800 видео, 8 подкаÑÑам и 4
ÐÐСÐ-ТРонлайн-поÑокам[CR]ÐÑе ÑодеÑжимое
акÑÑалÑно и динамиÑеÑки
обновлÑеÑÑÑ.</description>
+ <description lang="sv">Detta tillägg ger access till mer än 1800 videor,
8 vodcasts och 4 direktsända nasa-tv-kanaler[CR]Allt innehåll är dynamiskt
och borde alltid vara uppdaterat.</description>
+ <description lang="zh">æ¤è§é¢æä»¶æä¾è®¿é®1800å¤ä¸ªè§é¢,
8个æå®¢ä»¥å4个ç¾å½å½å®¶èªç©ºåèªå¤©ç®¡çå±çµè§ç´ææµ[CR]å
¨é¨å
容é½å¨æçå¹¶ä¿æææ°ã</description>
</extension>
-</addon>
\ No newline at end of file
+</addon>
diff --git a/plugin.video.nasa/changelog.txt b/plugin.video.nasa/changelog.txt
index 53f7dfb..6c5fbf6 100644
--- a/plugin.video.nasa/changelog.txt
+++ b/plugin.video.nasa/changelog.txt
@@ -1,5 +1,10 @@
-1.0.2
+1.0.3 (06.12.2012)
+ - migrate to xbmcswift2
+ - updated translations
+ - code refactoring
+
+1.0.2 (04.08.2012)
fix all live streams
-1.0.1
+1.0.1 (20.02.2012)
initial release
diff --git a/plugin.video.nasa/resources/language/English/strings.xml
b/plugin.video.nasa/resources/language/English/strings.xml
index 2e4f99a..a0ea364 100644
--- a/plugin.video.nasa/resources/language/English/strings.xml
+++ b/plugin.video.nasa/resources/language/English/strings.xml
@@ -1,4 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
+<!-- Translated using Transifex web application. For support, or if you would
like to to help out, please visit your language team! -->
+<!-- English language-Team URL:
http://www.transifex.com/projects/p/xbmc-addons/language/en/ -->
+<!-- Report language file syntax bugs at: [email protected] -->
+
<strings>
<!-- Default strings -->
<string id="30001">Page</string>
diff --git a/plugin.video.nasa/resources/lib/streams_scraper.py
b/plugin.video.nasa/resources/lib/streams_scraper.py
index 03a49bd..099e0fd 100644
--- a/plugin.video.nasa/resources/lib/streams_scraper.py
+++ b/plugin.video.nasa/resources/lib/streams_scraper.py
@@ -1,3 +1,22 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2012 Tristan Fischer ([email protected])
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
import simplejson as json
from urllib import urlencode
from urllib2 import urlopen
@@ -16,10 +35,12 @@ def get_streams(only_live=True):
if only_live and channel['status'] != 'live':
continue
else:
- channels.append({'title': channel['title'],
- 'id': channel['id'],
- 'description': channel['description'],
- 'thumbnail': channel['imageUrl']['small']})
+ channels.append({
+ 'title': channel['title'],
+ 'id': channel['id'],
+ 'description': channel['description'],
+ 'thumbnail': channel['imageUrl']['small']
+ })
log('get_streams finished with %d channels' % len(channels))
return channels
@@ -29,7 +50,11 @@ def get_stream(id):
def __ustream_request(path):
- url = API_URL + '%s?%s' % ('/'.join(path), urlencode({'key': API_KEY}))
+ params = {
+ 'key': API_KEY,
+ 'limit': 50
+ }
+ url = API_URL + '%s?%s' % ('/'.join(path), urlencode(params))
log('__ustream_request opening url=%s' % url)
response = urlopen(url).read()
log('__ustream_request finished with %d bytes result' % len(response))
@@ -46,8 +71,11 @@ def __generate_rtmp(id):
if tc_url.count('/') > 1:
log('__generate_rtmp guessing rtmp without verification')
app = tc_url.split('/', 1)[1]
- url = ('rtmp://%s playpath=%s
swfUrl=http://www.ustream.tv/flash/viewer.swf pageUrl=%s app=%s live=1'
- % (tc_url, playpath, page_url, app))
+ swf_url = 'http://www.ustream.tv/flash/viewer.swf'
+ url = (
+ 'rtmp://%s playpath=%s swfUrl=%s pageUrl=%s '
+ 'app=%s live=1' % (tc_url, playpath, swf_url, page_url, app)
+ )
else:
log('__generate_rtmp guessing rtmp with verification')
swf_url = urlopen('http://www.ustream.tv/flash/viewer.swf').geturl()
diff --git a/plugin.video.nasa/resources/lib/videos_scraper.py
b/plugin.video.nasa/resources/lib/videos_scraper.py
index 9168594..96704df 100644
--- a/plugin.video.nasa/resources/lib/videos_scraper.py
+++ b/plugin.video.nasa/resources/lib/videos_scraper.py
@@ -1,18 +1,41 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2012 Tristan Fischer ([email protected])
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
import simplejson
import datetime
from urllib import urlencode
from urllib2 import urlopen, Request
import re
-USER_AGENT = ('Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.7 '
- '(KHTML, like Gecko) Chrome/16.0.912.77 Safari/535.7')
+USER_AGENT = (
+ 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.7 '
+ '(KHTML, like Gecko) Chrome/16.0.912.77 Safari/535.7'
+)
REFERER = 'http://www.nasa.gov/multimedia/videogallery/index.html'
API_URL = 'http://cdn-api.vmixcore.com/apis/media.php'
-VIDEO_LANDING_URL = ('http://www.nasa.gov/multimedia/'
- 'videogallery/vmixVideoLanding2.js')
+VIDEO_LANDING_URL = (
+ 'http://www.nasa.gov/multimedia/'
+ 'videogallery/vmixVideoLanding2.js'
+)
class Scraper(object):
@@ -32,8 +55,10 @@ class Scraper(object):
genre_ids = re.search(r_genre_ids, html).group(1).split(',')
video_topics = []
for genre_id, genre_name in zip(genre_ids, genre_names):
- video_topics.append({'id': genre_id,
- 'name': genre_name.strip("'")})
+ video_topics.append({
+ 'id': genre_id,
+ 'name': genre_name.strip("'")
+ })
log('get_video_topics got %d topics' % len(video_topics))
return video_topics
@@ -48,17 +73,19 @@ class Scraper(object):
start = 0
if limit < 0 or limit > 250:
limit = 15
- params = {'action': 'getMediaList',
- 'class_id': 1,
- 'alltime': 1,
- 'order_method': order_method,
- 'order': order,
- 'get_count': 1,
- 'export': 'JSONP',
- 'start': start,
- 'limit': limit,
- 'metadata': 1,
- 'atoken': self.atoken}
+ params = {
+ 'action': 'getMediaList',
+ 'class_id': 1,
+ 'alltime': 1,
+ 'order_method': order_method,
+ 'order': order,
+ 'get_count': 1,
+ 'export': 'JSONP',
+ 'start': start,
+ 'limit': limit,
+ 'metadata': 1,
+ 'atoken': self.atoken
+ }
if int(topic_id) < 1000: # just a guess...
params['external_genre_ids'] = topic_id
else:
@@ -75,16 +102,18 @@ class Scraper(object):
limit = 15
if fields is None:
fields = ['title', ]
- params = {'action': 'searchMedia',
- 'class_id': 1,
- 'get_count': 1,
- 'export': 'JSONP',
- 'start': start,
- 'limit': limit,
- 'metadata': 1,
- 'atoken': self.atoken,
- 'fields': ','.join(fields),
- 'query': query}
+ params = {
+ 'action': 'searchMedia',
+ 'class_id': 1,
+ 'get_count': 1,
+ 'export': 'JSONP',
+ 'start': start,
+ 'limit': limit,
+ 'metadata': 1,
+ 'atoken': self.atoken,
+ 'fields': ','.join(fields),
+ 'query': query
+ }
videos = self.__get_videos(params)
log('search_videos finished with %d videos' % len(videos))
return videos
@@ -94,24 +123,27 @@ class Scraper(object):
html = self.__get_url(url, get_dict=params)
json = self.__get_json(html)
items = json.get('media') or json.get('medias', {}).get('media', [])
- videos = [{'title': item['title'],
- 'duration': self.__format_duration(item['duration']),
- 'thumbnail': item['thumbnail'][0]['url'],
- 'description': item['description'],
- 'date': self.__format_date(item['date_published_start']),
- 'filesize': int(item['formats']['format'][-1]['filesize']),
- 'author': item['author'],
- 'genres': [g['name'] for g in item.get('genres', [])],
- 'id': item['id'],
- } for item in items]
+ videos = [{
+ 'title': item['title'],
+ 'duration': self.__format_duration(item['duration']),
+ 'thumbnail': item['thumbnail'][0]['url'],
+ 'description': item['description'],
+ 'date': self.__format_date(item['date_published_start']),
+ 'filesize': int(item['formats']['format'][-1]['filesize']),
+ 'author': item['author'],
+ 'genres': [g['name'] for g in item.get('genres', [])],
+ 'id': item['id'],
+ } for item in items]
total_count = json['total_count']
return videos, total_count
def get_video(self, id):
log('get_video started with id=%s' % id)
- params = {'action': 'getMedia',
- 'media_id': id,
- 'atoken': self.atoken}
+ params = {
+ 'action': 'getMedia',
+ 'media_id': id,
+ 'atoken': self.atoken
+ }
url = API_URL
html = self.__get_url(url, get_dict=params)
media = self.__get_json(html)
@@ -120,15 +152,19 @@ class Scraper(object):
timestamp = self.__get_timestamp()
p = 'token=%s&expires=%s&signature=%s' % (token, timestamp, signature)
download_url = 'http://media.vmixcore.com/vmixcore/download?%s' % p
- video = {'title': media['title'],
- 'thumbnail': media['thumbnail'][0]['url'],
- 'url': download_url}
+ video = {
+ 'title': media['title'],
+ 'thumbnail': media['thumbnail'][0]['url'],
+ 'url': download_url
+ }
log('get_video finished')
return video
def __get_nasa_signature(self, token):
- sig_url = ('http://hscripts.vmixcore.com/clients/nasa/'
- 'generate_signature.php?token=%s' % token)
+ sig_url = (
+ 'http://hscripts.vmixcore.com/clients/nasa/'
+ 'generate_signature.php?token=%s' % token
+ )
t = self.__get_url(sig_url)
r_sig = re.compile('"signature":"(.+?)"')
signature = re.search(r_sig, t).group(1)
diff --git a/plugin.video.nasa/resources/lib/vodcasts_scraper.py
b/plugin.video.nasa/resources/lib/vodcasts_scraper.py
index ada3878..e03aed4 100644
--- a/plugin.video.nasa/resources/lib/vodcasts_scraper.py
+++ b/plugin.video.nasa/resources/lib/vodcasts_scraper.py
@@ -1,5 +1,24 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2012 Tristan Fischer ([email protected])
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
from urllib2 import urlopen
-from BeautifulSoup import BeautifulStoneSoup, BeautifulSoup
+from BeautifulSoup import BeautifulSoup, BeautifulStoneSoup
import re
MAIN_URL = 'http://www.nasa.gov/rss/'
@@ -20,8 +39,10 @@ def get_vodcasts():
title = cells[0].b.string
link = cells[1].a['href']
if '/rss/' in link:
- vodcasts.append({'title': title[1:],
- 'rss_file': link[5:]})
+ vodcasts.append({
+ 'title': title[1:],
+ 'rss_file': link[5:]
+ })
break
log('get_vodcasts finished with %d vodcasts' % len(vodcasts))
return vodcasts
@@ -40,10 +61,12 @@ def show_vodcast_videos(rss_file):
thumbnail = item.find(r_media)['url']
else:
thumbnail = 'DefaultVideo.png'
- videos.append({'title': item.title.string,
- 'thumbnail': thumbnail,
- 'url': item.enclosure['url'],
- 'description': item.description.string})
+ videos.append({
+ 'title': item.title.string,
+ 'thumbnail': thumbnail,
+ 'url': item.enclosure['url'],
+ 'description': item.description.string
+ })
log('show_vodcast_videos finished with %d videos' % len(videos))
return videos
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=c47e4d69ed6a32edcb93211f49b43331076179df
commit c47e4d69ed6a32edcb93211f49b43331076179df
Author: beenje <[email protected]>
Date: Thu Dec 6 19:07:41 2012 +0100
[plugin.video.sagetv] updated to version 1.4.4
diff --git a/plugin.video.sagetv/addon.xml b/plugin.video.sagetv/addon.xml
index aaaa557..78ccd4c 100644
--- a/plugin.video.sagetv/addon.xml
+++ b/plugin.video.sagetv/addon.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="plugin.video.sagetv"
name="SageTV"
- version="1.4.2"
+ version="1.4.4"
provider-name="kricker,lehighbri,aaronb">
<requires>
<import addon="xbmc.python" version="2.0"/>
diff --git a/plugin.video.sagetv/changelog.txt
b/plugin.video.sagetv/changelog.txt
index 1dfc4ca..d84c24b 100644
--- a/plugin.video.sagetv/changelog.txt
+++ b/plugin.video.sagetv/changelog.txt
@@ -1,3 +1,9 @@
+[B]Version 1.4.4 (Dec 4, 2012)[/B]
+- Added additional check upon launch to ensure that the xbmc.js is not corrupt
(aka someone manually copied from an HTML page versus downloading it correctly)
+
+[B]Version 1.4.3 (Dec 4, 2012)[/B]
+- Enhanced dependency version checking logic when the addon is first launched
+
[B]Version 1.4.2 (Nov 30, 2012)[/B]
- Included additional show level metadata including # of episodes (both total,
watched, and unwatched), genre, and most recent aired date
diff --git a/plugin.video.sagetv/default.py b/plugin.video.sagetv/default.py
index bbef558..c61754d 100644
--- a/plugin.video.sagetv/default.py
+++ b/plugin.video.sagetv/default.py
@@ -65,18 +65,10 @@ confluence_views = [500,501,502,503,504,508]
def TOPLEVELCATEGORIES():
- #url = strUrl + '/sagex/api?command=GetInstalledPluginss&encoder=json'
- url = strUrl + '/sagex/api?c=xbmc:GetXBMCJSVersionNumber&encoder=json'
- xbmcjsVersion = executeSagexAPIJSONCall(url, "Result")
- if(xbmcjsVersion != VERSION_XBMCJS_REQUIRED):
- print "***xbmc.js version found=" + xbmcjsVersion + "; user must make
sure they have the latest xbmc.js installed on their SageTV server
(VERSION_XBMCJS_REQUIRED=" + VERSION_XBMCJS_REQUIRED + ")"
-
xbmcgui.Dialog().ok(__language__(21004),__language__(21045),__language__(21046),__language__(21047))
- xbmc.executebuiltin('ActivateWindow(Home)')
- return
-
url = strUrl +
'/sagex/api?c=xbmc:GetPluginVersion&1=sagex-api-services&encoder=json'
sagexVersion = executeSagexAPIJSONCall(url, "Result")
+ #First check that the sagex-services plugin exists in SageTV and can be
called
if(sagexVersion == None or sagexVersion.find("Exception") != -1):
#If no plugins were returned, first check that the user has the
appropriate xbmc.js which has the required GetPluginVersion method
print "************errorMsg=" + str(sagexVersion)
@@ -85,6 +77,11 @@ def TOPLEVELCATEGORIES():
xbmcgui.Dialog().ok(__language__(21004),__language__(21005) + " "
+ MIN_VERSION_SAGEX_REQUIRED, __language__(21006),__language__(21007))
xbmc.executebuiltin('ActivateWindow(Home)')
return
+ elif(sagexVersion.find("javax.script.ScriptException:
sun.org.mozilla.javascript.internal.EvaluatorException") != -1):
+ print "xbmc.js file found but does not appear to be a valid .js
file and is likely corrupt"
+
xbmcgui.Dialog().ok(__language__(21004),__language__(21048),__language__(21046),__language__(21047))
+ xbmc.executebuiltin('ActivateWindow(Home)')
+ return
else:
print "SageTV not detected, or required plugins not installed"
xbmcgui.Dialog().ok(__language__(21000),__language__(21001),__language__(21002),__language__(21003))
@@ -93,7 +90,7 @@ def TOPLEVELCATEGORIES():
print "Successfully able to connect to the SageTV server @ " +
__settings__.getSetting("sage_ip") + ':' + __settings__.getSetting("sage_port")
- print "TOPLEVELCATEGORIES STARTED; xbmc.js file version=" + xbmcjsVersion
+ ";sagex-api-services version=" + sagexVersion
+ #Second check that the version of the sagex-services plugin matches the
minimum version required by this addon
if(sagexVersion == ""):
xbmcgui.Dialog().ok(__language__(21004),__language__(21005) + " " +
MIN_VERSION_SAGEX_REQUIRED, __language__(21006),__language__(21007))
xbmc.executebuiltin('ActivateWindow(Home)')
@@ -103,6 +100,17 @@ def TOPLEVELCATEGORIES():
xbmc.executebuiltin('ActivateWindow(Home)')
return
+ #Third check that the version of xbmc.js file matches the minimum version
required by this addon
+ url = strUrl + '/sagex/api?c=xbmc:GetXBMCJSVersionNumber&encoder=json'
+ xbmcjsVersion = executeSagexAPIJSONCall(url, "Result")
+ if(xbmcjsVersion != VERSION_XBMCJS_REQUIRED):
+ print "***xbmc.js version found=" + xbmcjsVersion + "; user must make
sure they have the latest xbmc.js installed on their SageTV server
(VERSION_XBMCJS_REQUIRED=" + VERSION_XBMCJS_REQUIRED + ")"
+
xbmcgui.Dialog().ok(__language__(21004),__language__(21045),__language__(21046),__language__(21047))
+ xbmc.executebuiltin('ActivateWindow(Home)')
+ return
+
+ print "TOPLEVELCATEGORIES STARTED; xbmc.js file version=" + xbmcjsVersion
+ ";sagex-api-services version=" + sagexVersion
+
addTopLevelDir('1. Watch Recordings', strUrl +
'/sagex/api?c=xbmc:GetTVMediaFilesGroupedByTitle&size=500&encoder=json',1,IMAGE_POSTER,'Browse
previously recorded and currently recording shows')
addTopLevelDir('2. View Upcoming Recordings', strUrl +
'/sagex/api?command=GetScheduledRecordings&encoder=json',2,IMAGE_POSTER,'View
and manage your upcoming recording schedule')
addTopLevelDir('3. Browse Channel Listings', strUrl +
'/sagex/api?command=EvaluateExpression&1=FilterByBoolMethod(GetAllChannels(),
"IsChannelViewable", true)&size=1000&encoder=json',3,IMAGE_POSTER,'Browse
channels and manage recordings')
@@ -793,12 +801,14 @@ if mode==None or url==None or len(url)<1:
print ""
TOPLEVELCATEGORIES()
+#Watch Recordings
elif mode==1:
print ""+url
VIEWLISTOFRECORDEDSHOWS(url,name)
xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_TITLE)
xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_DATE)
+#View List of Episodes for a show
elif mode==11:
print ""+url
VIEWLISTOFEPISODESFORSHOW(url,name)
@@ -806,6 +816,7 @@ elif mode==11:
xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_TITLE)
xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_DATE)
+#View upcoming recordings
elif mode==2:
print ""+url
VIEWUPCOMINGRECORDINGS(url,name)
@@ -813,18 +824,21 @@ elif mode==2:
xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_TITLE)
xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_EPISODE)
+#View channel listing
elif mode==3:
print ""+url
VIEWCHANNELLISTING(url,name)
xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_TITLE)
+#View airings on channel
elif mode==31:
print ""+url
VIEWAIRINGSONCHANNEL(url,name)
- xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_TITLE)
xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_DATE)
+ xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_TITLE)
xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_EPISODE)
+#Search for recordings
elif mode==4:
print ""+url
SEARCHFORRECORDINGS(url,name)
@@ -832,6 +846,7 @@ elif mode==4:
xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_DATE)
xbmcplugin.addSortMethod(int(sys.argv[1]), xbmcplugin.SORT_METHOD_EPISODE)
+#Search for airings
elif mode==5:
print ""+url
SEARCHFORAIRINGS(url,name)
diff --git a/plugin.video.sagetv/resources/language/English/strings.xml
b/plugin.video.sagetv/resources/language/English/strings.xml
index c80d880..939b84d 100644
--- a/plugin.video.sagetv/resources/language/English/strings.xml
+++ b/plugin.video.sagetv/resources/language/English/strings.xml
@@ -19,7 +19,7 @@
<string id="21001">Unable to connect to your SageTV server.</string>
<string id="21002">1) Please confirm it is running.</string>
<string id="21003">2) Confirm the settings of this addon are
correct.</string>
- <string id="21004">Dependency Missing</string>
+ <string id="21004">Dependency Missing or Corrupt</string>
<string id="21005">This addon requires sagex-api-services version</string>
<string id="21006">You do not have the sagex-api-services plugin
installed</string>
<string id="21007">Please install sagex-api-services to enable this
plugin.</string>
@@ -63,4 +63,5 @@
<string id="21045">Your xbmc.js file is not up-to-date</string>
<string id="21046">Please confirm that you copied the latest xbmc.js
file</string>
<string id="21047">to your SageTV\sagex\services folder</string>
+ <string id="21048">Your xbmc.js file is corrupt</string>
</strings>
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=6deb77e33d5022056146e2c9426385276473c41b
commit 6deb77e33d5022056146e2c9426385276473c41b
Author: beenje <[email protected]>
Date: Thu Dec 6 18:26:52 2012 +0100
[plugin.video.tmz] updated to version 2.0.8
diff --git a/plugin.video.tmz/addon.xml b/plugin.video.tmz/addon.xml
index dea2d18..f6c29c2 100644
--- a/plugin.video.tmz/addon.xml
+++ b/plugin.video.tmz/addon.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="plugin.video.tmz"
name="TMZ"
- version="2.0.7"
+ version="2.0.8"
provider-name="stacked">
<requires>
<import addon="xbmc.python" version="2.0"/>
diff --git a/plugin.video.tmz/changelog.txt b/plugin.video.tmz/changelog.txt
index 57e0970..4349910 100644
--- a/plugin.video.tmz/changelog.txt
+++ b/plugin.video.tmz/changelog.txt
@@ -1,14 +1,22 @@
+[B]Version 2.0.8[/B]
+
+- Fixed index error caused by gzip encoding (Thanks to jbel & divingmule)
+- Fixed error when loading 'Raw & Uncut'
+
[B]Version 2.0.7[/B]
+
- Updated addon to support recent website changes.
- Fixed settings issue in Frodo
[B]Version 2.0.6[/B]
+
- Added Search menu
- Added default view for Confluence skin
- Added fanart
- Fixed "yesno() takes no keyword arguments" error
[B]Version 2.0.5[/B]
+
- Added retry function for HTTP and Index errors
[B]Version 2.0.4[/B]
diff --git a/plugin.video.tmz/default.py b/plugin.video.tmz/default.py
index 15406b6..ad99017 100644
--- a/plugin.video.tmz/default.py
+++ b/plugin.video.tmz/default.py
@@ -1,12 +1,12 @@
-import xbmc, xbmcaddon, xbmcgui, xbmcplugin, urllib2, urllib, re, string, sys,
os, traceback, time, datetime, buggalo
+import xbmc, xbmcaddon, xbmcgui, xbmcplugin, urllib2, urllib, re, string, sys,
os, traceback, time, datetime, buggalo, gzip, StringIO
import simplejson as json
plugin = 'TMZ'
__author__ = 'stacked <[email protected]>'
__url__ = 'http://code.google.com/p/plugin/'
-__date__ = '11-10-2012'
-__version__ = '2.0.7'
+__date__ = '12-05-2012'
+__version__ = '2.0.8'
settings = xbmcaddon.Addon( id = 'plugin.video.tmz' )
dbg = False
dbglevel = 3
@@ -18,7 +18,7 @@ import CommonFunctions
common = CommonFunctions
common.plugin = plugin + ' ' + __version__
-def retry(ExceptionToCheck, tries=4, delay=5, backoff=2, logger=None):
+def retry(ExceptionToCheck, tries=11, delay=3, backoff=1, logger=None):
def deco_retry(f):
def f_retry(*args, **kwargs):
mtries, mdelay = tries, delay
@@ -76,7 +76,7 @@ def build_main_directory():
@retry(IndexError)
def build_video_directory( name ):
- data = open_url( 'http://www.tmz.com/videos/' )['content']
+ data = open_url( 'http://www.tmz.com/videos/' )
content = re.compile('{ name: \'' + name.upper() + '\',( )?\n
allInitialJson: \[(.+?)\],\n', re.DOTALL).findall( data )
match = re.compile('\n{\n (.+?)\n}', re.DOTALL).findall( content[0][1]
)
for videos in match:
@@ -112,7 +112,7 @@ def build_search_directory():
ok = dialog.ok( plugin , settings.getLocalizedString(
30009 ) + '\n' + settings.getLocalizedString( 30010 ) )
return
elif data['error'] != None:
- text = open_url( url )['content']
+ text = open_url( url )
else:
text = data['content']
jdata = json.loads(text)
@@ -137,10 +137,10 @@ def build_search_directory():
def get_search_url(name, url, thumb):
if settings.getSetting("quality") == '0' or len(url.split('/')[4]) > 10:
meta = 'http://cdnapi.kaltura.com/p/' + thumb.split('/')[4] +
'/sp/' + thumb.split('/')[6] + '/playManifest/entryId/' + thumb.split('/')[9]
- data = open_url( meta )['content']
+ data = open_url( meta )
url = re.compile('<media url=\"(.+?)\"').findall(data)[0]
else:
- data = open_url( url )['content']
+ data = open_url( url )
url = common.parseDOM(data, "meta", attrs = { "name":
"VideoURL" }, ret = "content")[0]
play_video( name, url, thumb, 'TMZ' )
@@ -148,11 +148,11 @@ def get_search_url(name, url, thumb):
def play_video( name, url, thumb, studio ):
if studio != 'TMZ':
try:
- data = open_url( url )['content']
+ data = open_url( url )
url = re.compile('<media
url=\"(.+?)\"').findall(data)[0]
except:
url = 'http://www.tmz.com/videos/' + url.split('/')[9]
- data = open_url( url )['content']
+ data = open_url( url )
url = common.parseDOM(data, "meta", attrs = { "name":
"VideoURL" }, ret = "content")[0]
listitem = xbmcgui.ListItem( label = name, iconImage =
"DefaultVideo.png", thumbnailImage = thumb, path = url )
listitem.setInfo( type="Video", infoLabels={ "Title": name ,
"Director": "TMZ", "Studio": studio, "Plot": name } )
@@ -177,16 +177,19 @@ def ListItem(label, image, url, mode, isFolder,
infoLabels = False, fanart = Fal
def open_url(url):
retries = 0
- while retries < 4:
+ while retries < 11:
+ data = {'content': None, 'error': None}
try:
- time.sleep(5*retries)
+ if retries != 0:
+ time.sleep(3)
data = get_page(url)
if data['content'] != None and data['error'] == None:
- return data
- else:
- retries += 1
- except:
- retries += 1
+ return data['content']
+ if data['error'] == 'HTTP Error 404: Not Found':
+ break
+ except Exception, e:
+ data['error'] = str(e)
+ retries += 1
dialog = xbmcgui.Dialog()
ret = dialog.yesno(plugin, settings.getLocalizedString( 30050 ),
data['error'], '', settings.getLocalizedString( 30052 ),
settings.getLocalizedString( 30053 ))
if ret == False:
@@ -203,7 +206,11 @@ def get_page(url):
req = urllib2.Request(url)
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1;
WOW64; rv:15.0) Gecko/20100101 Firefox/15.0.1')
content = urllib2.urlopen(req)
- html = content.read()
+ if url.find('http://www.tmz.com/videos') != -1:
+ gzip_filehandle =
gzip.GzipFile(fileobj=StringIO.StringIO(content.read()))
+ html = gzip_filehandle.read()
+ else:
+ html = content.read()
content.close()
try:
data['content'] = html.decode("utf-8")
@@ -219,7 +226,18 @@ def setViewMode(id):
if xbmc.getSkinDir() == "skin.confluence" and
settings.getSetting('view') == 'true':
xbmc.executebuiltin("Container.SetViewMode(" + id + ")")
-params = common.getParameters(sys.argv[2])
+def getParameters(parameterString):
+ commands = {}
+ splitCommands = parameterString[parameterString.find('?') + 1:].split('&')
+ for command in splitCommands:
+ if (len(command) > 0):
+ splitCommand = command.split('=')
+ key = splitCommand[0]
+ value = splitCommand[1]
+ commands[key] = value
+ return commands
+
+params = getParameters(sys.argv[2])
mode = None
name = None
url = None
-----------------------------------------------------------------------
Summary of changes:
plugin.video.nasa/addon.py | 285 +++++++++++---------
plugin.video.nasa/addon.xml | 38 +++-
plugin.video.nasa/changelog.txt | 9 +-
plugin.video.nasa/release.py | 42 +++
.../resources/language/Afrikaans/strings.xml | 10 +
.../resources/language/Albanian/strings.xml | 9 +
.../resources/language/Arabic/strings.xml | 10 +
.../resources/language/Basque/strings.xml | 8 +
.../resources/language/Belarusian/strings.xml | 18 ++
.../resources/language/Bulgarian/strings.xml | 10 +
.../resources/language/Catalan/strings.xml | 18 ++
.../language/Chinese (Simple)/strings.xml | 18 ++
.../language/Chinese (Traditional)/strings.xml | 10 +
.../resources/language/Croatian/strings.xml | 10 +
.../resources/language/Czech/strings.xml | 10 +
.../resources/language/Danish/strings.xml | 10 +
.../resources/language/Dutch/strings.xml | 11 +
.../resources/language/English/strings.xml | 4 +
.../resources/language/Esperanto/strings.xml | 8 +
.../resources/language/Estonian/strings.xml | 10 +
.../resources/language/Finnish/strings.xml | 10 +
.../resources/language/French/strings.xml | 11 +
.../resources/language/Galician/strings.xml | 10 +
.../resources/language/German/strings.xml | 18 ++
.../resources/language/Greek/strings.xml | 18 ++
.../resources/language/Hebrew/strings.xml | 10 +
.../language/Hindi (Devanagiri)/strings.xml | 8 +
.../resources/language/Hungarian/strings.xml | 18 ++
.../resources/language/Icelandic/strings.xml | 11 +
.../resources/language/Indonesian/strings.xml | 8 +
.../resources/language/Italian/strings.xml | 18 ++
.../resources/language/Japanese/strings.xml | 10 +
.../resources/language/Korean/strings.xml | 18 ++
.../resources/language/Lithuanian/strings.xml | 18 ++
.../resources/language/Norwegian/strings.xml | 10 +
.../resources/language/Polish/strings.xml | 18 ++
.../language/Portuguese (Brazil)/strings.xml | 18 ++
.../resources/language/Portuguese/strings.xml | 18 ++
.../resources/language/Romanian/strings.xml | 10 +
.../resources/language/Russian/strings.xml | 18 ++
.../language/Serbian (Cyrillic)/strings.xml | 10 +
.../resources/language/Serbian/strings.xml | 10 +
.../resources/language/Slovak/strings.xml | 10 +
.../resources/language/Slovenian/strings.xml | 10 +
.../language/Spanish (Mexico)/strings.xml | 11 +
.../resources/language/Spanish/strings.xml | 18 ++
.../resources/language/Swedish/strings.xml | 18 ++
.../resources/language/Thai/strings.xml | 11 +
.../resources/language/Turkish/strings.xml | 10 +
.../resources/language/Ukrainian/strings.xml | 10 +
.../resources/language/Vietnamese/strings.xml | 9 +
plugin.video.nasa/resources/lib/streams_scraper.py | 42 +++-
plugin.video.nasa/resources/lib/videos_scraper.py | 126 ++++++---
.../resources/lib/vodcasts_scraper.py | 37 ++-
plugin.video.sagetv/addon.xml | 2 +-
plugin.video.sagetv/changelog.txt | 6 +
plugin.video.sagetv/default.py | 37 ++-
.../resources/language/English/strings.xml | 3 +-
plugin.video.tmz/addon.xml | 2 +-
plugin.video.tmz/changelog.txt | 8 +
plugin.video.tmz/default.py | 56 +++--
61 files changed, 1041 insertions(+), 231 deletions(-)
create mode 100644 plugin.video.nasa/release.py
create mode 100644 plugin.video.nasa/resources/language/Afrikaans/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Albanian/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Arabic/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Basque/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Belarusian/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Bulgarian/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Catalan/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Chinese
(Simple)/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Chinese
(Traditional)/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Croatian/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Czech/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Danish/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Dutch/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Esperanto/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Estonian/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Finnish/strings.xml
create mode 100644 plugin.video.nasa/resources/language/French/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Galician/strings.xml
create mode 100644 plugin.video.nasa/resources/language/German/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Greek/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Hebrew/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Hindi
(Devanagiri)/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Hungarian/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Icelandic/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Indonesian/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Italian/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Japanese/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Korean/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Lithuanian/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Norwegian/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Polish/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Portuguese
(Brazil)/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Portuguese/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Romanian/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Russian/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Serbian
(Cyrillic)/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Serbian/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Slovak/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Slovenian/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Spanish
(Mexico)/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Spanish/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Swedish/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Thai/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Turkish/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Ukrainian/strings.xml
create mode 100644 plugin.video.nasa/resources/language/Vietnamese/strings.xml
hooks/post-receive
--
Plugins
------------------------------------------------------------------------------
LogMeIn Rescue: Anywhere, Anytime Remote support for IT. Free Trial
Remotely access PCs and mobile devices and provide instant support
Improve your efficiency, and focus on delivering more value-add services
Discover what IT Professionals Know. Rescue delivers
http://p.sf.net/sfu/logmein_12329d2d
_______________________________________________
Xbmc-addons mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/xbmc-addons