The branch, eden has been updated
       via  351e41b13d5b1f464c5a3c333b807bc9afc40e24 (commit)
       via  57f4a6c90f6ea2c57618d19cac55839c4f08d8eb (commit)
       via  90ff356a4ac4f2311730a9df72f0c637ebf06427 (commit)
      from  0f1ecf741edc7b397a36a20ac67e8e33245f8dca (commit)

- Log -----------------------------------------------------------------
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=351e41b13d5b1f464c5a3c333b807bc9afc40e24

commit 351e41b13d5b1f464c5a3c333b807bc9afc40e24
Author: beenje <[email protected]>
Date:   Thu Dec 6 20:10:21 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=57f4a6c90f6ea2c57618d19cac55839c4f08d8eb

commit 57f4a6c90f6ea2c57618d19cac55839c4f08d8eb
Author: beenje <[email protected]>
Date:   Thu Dec 6 19:07:38 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=90ff356a4ac4f2311730a9df72f0c637ebf06427

commit 90ff356a4ac4f2311730a9df72f0c637ebf06427
Author: beenje <[email protected]>
Date:   Thu Dec 6 18:26:45 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

Reply via email to