The branch, frodo has been updated
       via  9a39eae58f70585221249afad2fa9b3b2ae1efb5 (commit)
       via  7cb31e461cf6ce77cb4ca7d461f03ebb476ad8b3 (commit)
      from  9d290fa51c8e790e527f6f06fb53be6c6aa8e22e (commit)

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


http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=7cb31e461cf6ce77cb4ca7d461f03ebb476ad8b3

commit 7cb31e461cf6ce77cb4ca7d461f03ebb476ad8b3
Author: beenje <bee...@xbmc.org>
Date:   Thu Oct 3 22:23:24 2013 +0200

    [plugin.video.drnu] updated to version 4.0.2

diff --git a/plugin.video.drnu/addon.py b/plugin.video.drnu/addon.py
index 58e1d22..375da0e 100644
--- a/plugin.video.drnu/addon.py
+++ b/plugin.video.drnu/addon.py
@@ -28,18 +28,29 @@ import xbmc
 import xbmcgui
 import xbmcaddon
 import xbmcplugin
-import xbmcvfs
 
-import nuapi
+import tvapi
 import buggalo
 
+LETTERS = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '\xC3\x86', 
'\xC3\x98', '\xC3\x85']
 
-class NuAddon(object):
+
+class DrDkTvAddon(object):
     def __init__(self):
-        self.api = nuapi.DrNuApi(CACHE_PATH, 60)
+        self.api = tvapi.TvApi()
+        self.favorites = list()
+        self.recentlyWatched = list()
 
+    def _save(self):
+        # save favorites
+        self.favorites.sort()
+        pickle.dump(self.favorites, open(FAVORITES_PATH, 'wb'))
+
+        self.recentlyWatched = self.recentlyWatched[0:25]  # Limit to 25 items
+        pickle.dump(self.recentlyWatched, open(RECENT_PATH, 'wb'))
+
+    def _load(self):
         # load favorites
-        self.favorites = list()
         if os.path.exists(FAVORITES_PATH):
             try:
                 self.favorites = pickle.load(open(FAVORITES_PATH, 'rb'))
@@ -47,129 +58,116 @@ class NuAddon(object):
                 pass
 
         # load recently watched
-        self.recentlyWatched = list()
         if os.path.exists(RECENT_PATH):
             try:
                 self.recentlyWatched = pickle.load(open(RECENT_PATH, 'rb'))
             except Exception:
                 pass
 
-    def _save(self):
-        # save favorites
-        self.favorites.sort()
-        pickle.dump(self.favorites, open(FAVORITES_PATH, 'wb'))
-
-        self.recentlyWatched = self.recentlyWatched[0:25]  # Limit to ten items
-        pickle.dump(self.recentlyWatched, open(RECENT_PATH, 'wb'))
-
     def showMainMenu(self):
-        fanartImage = os.path.join(ADDON.getAddonInfo('path'), 'fanart.jpg')
-
         items = list()
         # A-Z Program Series
-        item = xbmcgui.ListItem(ADDON.getLocalizedString(30000),
-                                
iconImage=os.path.join(ADDON.getAddonInfo('path'), 'resources', 'icons', 
'all.png'))
-        item.setProperty('Fanart_Image', fanartImage)
-        items.append((PATH + '?show=azProgramSeries', item, True))
-        # Program Series label
-        item = xbmcgui.ListItem(ADDON.getLocalizedString(30012),
-                                
iconImage=os.path.join(ADDON.getAddonInfo('path'), 'resources', 'icons', 
'tag.png'))
-        item.setProperty('Fanart_Image', fanartImage)
-        items.append((PATH + '?show=programSeriesLabels', item, True))
+        item = xbmcgui.ListItem(ADDON.getLocalizedString(30000), 
iconImage=os.path.join(ADDON.getAddonInfo('path'), 'resources', 'icons', 
'all.png'))
+        item.setProperty('Fanart_Image', FANART_IMAGE)
+        items.append((PATH + '?show=listAZ', item, True))
+
         # Premiere
-        item = xbmcgui.ListItem(ADDON.getLocalizedString(30025),
-                                
iconImage=os.path.join(ADDON.getAddonInfo('path'), 'resources', 'icons', 
'new.png'))
-        item.setProperty('Fanart_Image', fanartImage)
-        items.append((PATH + '?show=premiere', item, True))
-        # Latest
-        item = xbmcgui.ListItem(ADDON.getLocalizedString(30001),
-                                
iconImage=os.path.join(ADDON.getAddonInfo('path'), 'resources', 'icons', 
'new.png'))
-        item.setProperty('Fanart_Image', fanartImage)
-        items.append((PATH + '?show=newest', item, True))
+        item = xbmcgui.ListItem(ADDON.getLocalizedString(30025), 
iconImage=os.path.join(ADDON.getAddonInfo('path'), 'resources', 'icons', 
'new.png'))
+        item.setProperty('Fanart_Image', FANART_IMAGE)
+        items.append((PATH + '?listVideos=%s' % tvapi.SLUG_PREMIERES, item, 
True))
+
         # Most viewed
-        item = xbmcgui.ListItem(ADDON.getLocalizedString(30011),
-                                
iconImage=os.path.join(ADDON.getAddonInfo('path'), 'resources', 'icons', 
'eye.png'))
-        item.setProperty('Fanart_Image', fanartImage)
+        item = xbmcgui.ListItem(ADDON.getLocalizedString(30011), 
iconImage=os.path.join(ADDON.getAddonInfo('path'), 'resources', 'icons', 
'eye.png'))
+        item.setProperty('Fanart_Image', FANART_IMAGE)
         items.append((PATH + '?show=mostViewed', item, True))
+
         # Spotlight
-        item = xbmcgui.ListItem(ADDON.getLocalizedString(30002),
-                                
iconImage=os.path.join(ADDON.getAddonInfo('path'), 'resources', 'icons', 
'star.png'))
-        item.setProperty('Fanart_Image', fanartImage)
-        items.append((PATH + '?show=spotlight', item, True))
+        item = xbmcgui.ListItem(ADDON.getLocalizedString(30002), 
iconImage=os.path.join(ADDON.getAddonInfo('path'), 'resources', 'icons', 
'star.png'))
+        item.setProperty('Fanart_Image', FANART_IMAGE)
+        items.append((PATH + '?listVideos=%s' % tvapi.SLUG_SPOTS, item, True))
+
         # Highlights
-        item = xbmcgui.ListItem(ADDON.getLocalizedString(30021),
-                                
iconImage=os.path.join(ADDON.getAddonInfo('path'), 'resources', 'icons', 
'star.png'))
-        item.setProperty('Fanart_Image', fanartImage)
-        items.append((PATH + '?show=highlights', item, True))
-        # Last chance
-        item = xbmcgui.ListItem(ADDON.getLocalizedString(30014),
-                                
iconImage=os.path.join(ADDON.getAddonInfo('path'), 'resources', 'icons', 
'clock.png'))
-        item.setProperty('Fanart_Image', fanartImage)
-        items.append((PATH + '?show=lastChance', item, True))
+        item = xbmcgui.ListItem(ADDON.getLocalizedString(30021), 
iconImage=os.path.join(ADDON.getAddonInfo('path'), 'resources', 'icons', 
'star.png'))
+        item.setProperty('Fanart_Image', FANART_IMAGE)
+        items.append((PATH + '?listVideos=%s' % tvapi.SLUG_HIGHLIGHTS, item, 
True))
+
         # Search videos
-        item = xbmcgui.ListItem(ADDON.getLocalizedString(30003),
-                                
iconImage=os.path.join(ADDON.getAddonInfo('path'), 'resources', 'icons', 
'search.png'))
-        item.setProperty('Fanart_Image', fanartImage)
+        item = xbmcgui.ListItem(ADDON.getLocalizedString(30003), 
iconImage=os.path.join(ADDON.getAddonInfo('path'), 'resources', 'icons', 
'search.png'))
+        item.setProperty('Fanart_Image', FANART_IMAGE)
         items.append((PATH + '?show=search', item, True))
+
         # Recently watched Program Series
-        item = xbmcgui.ListItem(ADDON.getLocalizedString(30007),
-                                
iconImage=os.path.join(ADDON.getAddonInfo('path'), 'resources', 'icons',
-                                                       'eye-star.png'))
-        item.setProperty('Fanart_Image', fanartImage)
+        item = xbmcgui.ListItem(ADDON.getLocalizedString(30007), 
iconImage=os.path.join(ADDON.getAddonInfo('path'), 'resources', 'icons', 
'eye-star.png'))
+        item.setProperty('Fanart_Image', FANART_IMAGE)
         items.append((PATH + '?show=recentlyWatched', item, True))
+
         # Favorite Program Series
-        item = xbmcgui.ListItem(ADDON.getLocalizedString(30008),
-                                
iconImage=os.path.join(ADDON.getAddonInfo('path'), 'resources', 'icons', 
'plusone.png'))
-        item.setProperty('Fanart_Image', fanartImage)
+        item = xbmcgui.ListItem(ADDON.getLocalizedString(30008), 
iconImage=os.path.join(ADDON.getAddonInfo('path'), 'resources', 'icons', 
'plusone.png'))
+        item.setProperty('Fanart_Image', FANART_IMAGE)
         items.append((PATH + '?show=favorites', item, True))
 
         xbmcplugin.addDirectoryItems(HANDLE, items)
         xbmcplugin.endOfDirectory(HANDLE)
 
     def showProgramSeriesVideos(self, slug):
-        self.listVideos(self.api.getProgramSeriesVideos(slug))
-
-    def showNewestVideos(self):
-        self.listVideos(self.api.getNewestVideos())
-
-    def showSpotlightVideos(self):
-        self.listVideos(self.api.getSpotlightVideos())
-
-    def showHighlightVideos(self):
-        self.listVideos(self.api.getHighlightVideos())
+        self.listVideos(self.api.programCardRelations(slug))
 
     def showMostViewedVideos(self):
-        self.listVideos(self.api.getMostViewedVideos())
-
-    def showLastChanceVideos(self):
-        self.listVideos(self.api.getLastChanceVideos())
-
-    def showPremiereVideos(self):
-        self.listVideos(self.api.getPremiereVideos())
+        self.listVideos(self.api.getMostViewedProgramCards())
 
     def showFavorites(self):
-        self.showProgramSeries(self.favorites, False)
+        self._load()
+        if not self.favorites:
+            xbmcgui.Dialog().ok(ADDON.getAddonInfo('name'), 
ADDON.getLocalizedString(30013))
+            xbmcplugin.endOfDirectory(HANDLE, succeeded=False)
+        else:
+            self.listBundles(self.api.bundle(slugs=self.favorites), 
addToFavorites=False)
 
     def showRecentlyWatched(self):
+        self._load()
         videos = list()
+        for programCardUrn in self.recentlyWatched:
+            video = self.api.programCard(programCardUrn)
+            if video is None or not 'Data' in video or len(video['Data']) == 0:
+                self.recentlyWatched.remove(programCardUrn)
+            else:
+                videos.append(video['Data'][0])
 
-        for videoId in self.recentlyWatched:
-            video = self.api.getVideoById(videoId)
-
-            if video is not None:
-                videos.append(video)
-
+        self._save()
         if not videos:
+            xbmcgui.Dialog().ok(ADDON.getAddonInfo('name'), 
ADDON.getLocalizedString(30013), ADDON.getLocalizedString(30020))
             xbmcplugin.endOfDirectory(HANDLE, succeeded=False)
-            xbmcgui.Dialog().ok(ADDON.getAddonInfo('name'), 
ADDON.getLocalizedString(30013),
-                                ADDON.getLocalizedString(30020))
         else:
             self.listVideos(videos)
 
-    def showProgramSeries(self, limitToSlugs=None, addToFavorites=True, 
label=None, letter=None):
-        programs = self.api.getProgramSeries(limitToSlugs, label)
+    def showProgramSeries(self, letter=None):
+        self.listBundles(self.api.bundlesWithPublicAsset(letter))
+
+    def showAZ(self):
+        items = list()
+
+        # All Program Series
+        iconImage = os.path.join(ADDON.getAddonInfo('path'), 'resources', 
'icons', 'all.png')
+
+        for letter in LETTERS:
+            item = xbmcgui.ListItem(letter, iconImage=iconImage)
+            item.setProperty('Fanart_Image', FANART_IMAGE)
+
+            url = PATH + '?listProgramSeriesByLetter=' + letter
+            items.append((url, item, True))
+
+        xbmcplugin.addDirectoryItems(HANDLE, items)
+        xbmcplugin.endOfDirectory(HANDLE)
+
+    def searchVideos(self):
+        keyboard = xbmc.Keyboard('', ADDON.getLocalizedString(30003))
+        keyboard.doModal()
+        if keyboard.isConfirmed():
+            keyword = keyboard.getText()
+            self.listVideos(self.api.searchProgramCard(keyword))
 
-        if not programs:
+    def listBundles(self, bundles, addToFavorites=True):
+        if not bundles:
             xbmcplugin.endOfDirectory(HANDLE, succeeded=False)
             if not addToFavorites:
                 xbmcgui.Dialog().ok(ADDON.getAddonInfo('name'), 
ADDON.getLocalizedString(30013),
@@ -178,241 +176,148 @@ class NuAddon(object):
                 xbmcgui.Dialog().ok(ADDON.getAddonInfo('name'), 
ADDON.getLocalizedString(30013))
         else:
             items = list()
-            for program in programs:
-                if letter is not None and program['title'][0].upper() != 
letter.decode('utf-8', 'ignore'):
+            for bundle in bundles['Data']:
+                if 'ProgramCard' in bundle and 
bundle['ProgramCard']['PrimaryAssetKind'] != 'VideoResource':
                     continue
-                infoLabels = {}
 
-                if program['newestVideoPublishTime'] is not None:
-                    publishTime = 
self.parseDate(program['newestVideoPublishTime'])
+                infoLabels = {}
+                if bundle['CreatedTime'] is not None:
+                    publishTime = self.parseDate(bundle['CreatedTime'])
                     if publishTime:
-                        infoLabels['plotoutline'] = 
ADDON.getLocalizedString(30004) % publishTime.strftime(
-                            '%d. %b %Y kl. %H:%M')
+                        infoLabels['plotoutline'] = 
ADDON.getLocalizedString(30004) % publishTime.strftime('%d. %b %Y kl. %H:%M')
                         infoLabels['date'] = publishTime.strftime('%d.%m.%Y')
                         infoLabels['year'] = int(publishTime.strftime('%Y'))
                         infoLabels['aired'] = publishTime.strftime('%Y-%m-%d')
-                    if len(program['labels']) > 0:
-                        infoLabels['genre'] = program['labels'][0]
-
-                infoLabels['title'] = program['title']
-                infoLabels['plot'] = program['description']
-                infoLabels['count'] = int(program['videoCount'])
+                infoLabels['title'] = bundle['Title']
 
                 menuItems = list()
-
-                if self.favorites.count(program['slug']) > 0:
-                    runScript = 
"XBMC.RunPlugin(plugin://plugin.video.drnu/?delfavorite=%s)" % program['slug']
+                if self.favorites.count(bundle['Slug']) > 0:
+                    runScript = 
"XBMC.RunPlugin(plugin://plugin.video.drnu/?delfavorite=%s)" % bundle['Slug']
                     menuItems.append((ADDON.getLocalizedString(30201), 
runScript))
                 else:
-                    runScript = 
"XBMC.RunPlugin(plugin://plugin.video.drnu/?addfavorite=%s)" % program['slug']
+                    runScript = 
"XBMC.RunPlugin(plugin://plugin.video.drnu/?addfavorite=%s)" % bundle['Slug']
                     menuItems.append((ADDON.getLocalizedString(30200), 
runScript))
 
-                customThumbFile = self.getCustomThumbPath(program['slug'])
-                if os.path.exists(customThumbFile):
-                    menuItems.append((ADDON.getLocalizedString(30024),
-                                      
"XBMC.RunPlugin(plugin://plugin.video.drnu/?delthumb=%s)" % program['slug']))
-                    iconImage = customThumbFile
+                if 'ProgramCard' in bundle:
+                    programCard = bundle['ProgramCard']
                 else:
-                    menuItems.append((ADDON.getLocalizedString(30023),
-                                      
"XBMC.RunPlugin(plugin://plugin.video.drnu/?setthumb=%s)" % program['slug']))
-                    iconImage = 
self.api.getProgramSeriesImageUrl(program['slug'], 256)
-                fanartImage = 
self.api.getProgramSeriesImageUrl(program['slug'], 1280, 720)
+                    programCard = bundle
+
+                imageAsset = self.api.getAsset('Image', programCard)
+                if imageAsset:
+                    iconImage = imageAsset['Uri']
+                else:
+                    iconImage = ''
                 item = xbmcgui.ListItem(infoLabels['title'], 
iconImage=iconImage)
                 item.setInfo('video', infoLabels)
-                item.setProperty('Fanart_Image', fanartImage)
-
+                item.setProperty('Fanart_Image', iconImage)
                 item.addContextMenuItems(menuItems, False)
 
-                url = PATH + '?listVideos=' + program['slug']
+                url = PATH + '?listVideos=' + bundle['Slug']
                 items.append((url, item, True))
 
             xbmcplugin.addDirectoryItems(HANDLE, items)
-            xbmcplugin.setContent(HANDLE, 'tvshows')
             xbmcplugin.endOfDirectory(HANDLE)
 
-    def showProgramSeriesAZ(self):
-        programs = self.api.getProgramSeries()
-
-        if not programs:
-            xbmcplugin.endOfDirectory(HANDLE, succeeded=False)
-            xbmcgui.Dialog().ok(ADDON.getAddonInfo('name'), 
ADDON.getLocalizedString(30013),
-                                ADDON.getLocalizedString(30018), 
ADDON.getLocalizedString(30019))
-        else:
-            items = list()
-
-            # All Program Series
-            iconImage = os.path.join(ADDON.getAddonInfo('path'), 'resources', 
'icons', 'all.png')
-            fanartImage = os.path.join(ADDON.getAddonInfo('path'), 
'fanart.jpg')
-
-            item = xbmcgui.ListItem(ADDON.getLocalizedString(30022), 
iconImage=iconImage)
-            item.setProperty('Fanart_Image', fanartImage)
-            items.append((PATH + '?show=allProgramSeries', item, True))
-
-            letter = programs[0]['title'][0].upper()
-            count = 0
-            for idx, program in enumerate(programs):
-                count += 1
-                if letter != program['title'][0].upper() or idx == 
len(programs):
-                    letter = program['title'][0].upper()
-                    infoLabels = {'title': letter, 'count': count}
-
-                    item = xbmcgui.ListItem(letter, iconImage=iconImage)
-                    item.setInfo('video', infoLabels)
-                    item.setProperty('Fanart_Image', fanartImage)
-
-                    url = PATH + '?programSeriesLetter=' + letter
-                    items.append((url, item, True))
-                    count = 0
-
-            xbmcplugin.addDirectoryItems(HANDLE, items)
-            xbmcplugin.endOfDirectory(HANDLE)
-
-    def showProgramSeriesLabels(self):
-        iconImage = os.path.join(ADDON.getAddonInfo('path'), 'resources', 
'icons', 'tag.png')
-        fanartImage = os.path.join(ADDON.getAddonInfo('path'), 'fanart.jpg')
-
-        labels = self.api.getProgramSeriesLabels()
-        items = list()
-        for label in labels:
-            item = xbmcgui.ListItem(label.capitalize(), iconImage=iconImage)
-            item.setProperty('Fanart_Image', fanartImage)
-
-            url = PATH + '?programSeriesLabel=' + label
-            items.append((url, item, True))
-
-        xbmcplugin.addDirectoryItems(HANDLE, items)
-        xbmcplugin.endOfDirectory(HANDLE)
-
-    def searchVideos(self):
-        keyboard = xbmc.Keyboard('', ADDON.getLocalizedString(30003))
-        keyboard.doModal()
-        if keyboard.isConfirmed():
-            keyword = keyboard.getText()
-            self.listVideos(self.api.search(keyword))
-
-    def listVideos(self, videos):
+    def listVideos(self, programCards):
         items = list()
+        if 'Data' in programCards:
+            programCards = programCards['Data']
 
-        for video in videos:
-            infoLabels = self.createInfoLabels(video)
-
-            iconImage = self.api.getVideoImageUrl(str(video['id']), 256)
-            fanartImage = self.api.getVideoImageUrl(str(video['id']), 1280, 
720)
-            item = xbmcgui.ListItem(infoLabels['title'], iconImage=iconImage)
-            item.setInfo('video', infoLabels)
-            item.setProperty('Fanart_Image', fanartImage)
-            url = PATH + '?videoId=' + str(video['id'])
-            if 'chapters' in video and video['chapters'] and 
ADDON.getSetting('enable.chapters') == 'true':
-                url += "&chapters=true"
-                items.append((url, item, True))
-            else:
-                item.setProperty('IsPlayable', 'true')
-                items.append((url, item))
-
-        xbmcplugin.addDirectoryItems(HANDLE, items)
-        xbmcplugin.setContent(HANDLE, 'episodes')
-        xbmcplugin.addSortMethod(HANDLE, xbmcplugin.SORT_METHOD_DATE)
-        xbmcplugin.addSortMethod(HANDLE, xbmcplugin.SORT_METHOD_TITLE)
-        xbmcplugin.endOfDirectory(HANDLE)
+        for programCard in programCards:
+            if 'ProgramCard' in programCard:
+                programCard = programCard['ProgramCard']
+            if not 'PrimaryAssetUri' in programCard:
+                continue
 
-    def listVideoChapters(self, videoId):
-        video = self.api.getVideoById(videoId)
-        if not video:
-            xbmcplugin.endOfDirectory(HANDLE, succeeded=False)
-            return
+            infoLabels = self.createInfoLabels(programCard)
 
-        items = list()
-        startTimes = list()
-
-        for chapter in video['chapters']:
-            startTimes.append(self.parseTime(chapter['startTime']))
-        startTimes.append(self.parseTime(video['duration']))
-
-        # 'Play from the start' item
-        iconImage = self.api.getVideoImageUrl(str(video['id']), 256)
-        fanartImage = self.api.getVideoImageUrl(str(video['id']), 1280, 720)
-        item = xbmcgui.ListItem(ADDON.getLocalizedString(30017), 
iconImage=iconImage)
-        item.setProperty('IsPlayable', 'true')
-        item.setProperty('Fanart_Image', fanartImage)
-        url = PATH + '?videoId=' + str(video['id'])
-        items.append((url, item))
-
-        for idx, chapter in enumerate(video['chapters']):
-            infoLabels = self.createInfoLabels(video)
-
-            if chapter['title'] is not None:
-                infoLabels['title'] = chapter['title']
+            imageAsset = self.api.getAsset('Image', programCard)
+            if imageAsset:
+                iconImage = imageAsset['Uri']
             else:
-                infoLabels['title'] = ADDON.getLocalizedString(30006)
-            infoLabels['plot'] = video['description']
-
-            startTime = startTimes[idx]
-            if startTime:
-                duration = startTimes[idx + 1] - startTime
-                infoLabels['duration'] = str(duration.seconds * 60)
-
-            iconImage = self.api.getChapterImageUrl(str(chapter['id']), 256)
-            fanartImage = self.api.getChapterImageUrl(str(chapter['id']), 
1280, 720)
-            item = xbmcgui.ListItem(chapter['title'], iconImage=iconImage)
+                iconImage = ''
+            item = xbmcgui.ListItem(infoLabels['title'], iconImage=iconImage)
             item.setInfo('video', infoLabels)
+            item.setProperty('Fanart_Image', iconImage)
+            url = PATH + '?videoasset=' + programCard['PrimaryAssetUri'] + 
'&urn=' + programCard['Urn']
             item.setProperty('IsPlayable', 'true')
-            item.setProperty('Fanart_Image', fanartImage)
-            url = PATH + '?videoId=' + str(video['id'])
-            if startTime:
-                url += "&startTime=" + self.formatStartTime(startTime)
             items.append((url, item))
 
         xbmcplugin.addDirectoryItems(HANDLE, items)
-        xbmcplugin.setContent(HANDLE, 'episodes')
+        xbmcplugin.addSortMethod(HANDLE, xbmcplugin.SORT_METHOD_DATE)
+        xbmcplugin.addSortMethod(HANDLE, xbmcplugin.SORT_METHOD_TITLE)
         xbmcplugin.endOfDirectory(HANDLE)
 
-    def playVideo(self, videoId, startTime=None):
-        self._updateRecentlyWatched(videoId)
-        video = self.api.getVideoById(videoId)
-        if not video:
-            raise nuapi.DrNuException('Video with ID %s not found!' % videoId)
+    def playVideo(self, assetUri, programCardUrn):
+        self.updateRecentlyWatched(programCardUrn)
+        asset = self.api._http_request(assetUri)
+        if not asset:
+            raise tvapi.TvNuException('Video with ID %s not found!' % assetUri)
 
         if ADDON.getSetting('show.stream.selector') == 'true':
-            json = self.api._call_api(video['videoResourceUrl'])
             options = []
-            links = sorted(json['links'], key=lambda link: link['bitrateKbps'] 
if 'bitrateKbps' in link else 0, reverse=True)
-            for link in links:
-                options.append('%s (%s kbps)' % (link['linkType'], 
link['bitrateKbps'] if 'bitrateKbps' in link else '?'))
+            for link in asset['Links']:
+                options.append('%s (%s kbps)' % (link['Target'], 
link['Bitrate'] if 'Bitrate' in link else '?'))
+            options.append('vodfiles.dr.dk')
 
             d = xbmcgui.Dialog()
-            idx = d.select(video['title'], options)
+            idx = d.select('Stream', options)
             if idx == -1:
                 xbmcplugin.setResolvedUrl(HANDLE, False, xbmcgui.ListItem())
                 return
-            rtmpUrl = links[idx]['uri']
+            elif idx == len(options) - 1:
+                videoUrl = self.api.getLink(asset, 'Android')
+                videoUrl = 
videoUrl.replace('rtsp://om.gss.dr.dk/mediacache/_definst_/mp4:content/', 
'http://vodfiles.dr.dk/')
+            else:
+                videoUrl = asset['Links'][idx]['Uri']
 
         else:
-            rtmpUrl = self.api._http_request(video['videoManifestUrl'])
+            if ADDON.getSetting('prefer.stream.target') == 'vodfiles.dr.dk':
+                videoUrl = self.api.getLink(asset, 'Android')
+                videoUrl = 
videoUrl.replace('rtsp://om.gss.dr.dk/mediacache/_definst_/mp4:content/', 
'http://vodfiles.dr.dk/')
+            elif ADDON.getSetting('prefer.stream.target') == 'Android':
+                videoUrl = self.api.getLink(asset, 'Android')
+            elif ADDON.getSetting('prefer.stream.target') == 'Streaming':
+                videoUrl = self.api.getLink(asset, 'Streaming')
+            else:
+                videoUrl = self.api.getLink(asset, 'Ios')
 
-        m = re.search('(rtmp://vod.dr.dk/cms)/([^\?]+)(\?.*)', rtmpUrl)
-        if rtmpUrl[0:7] == '<script' or m is None:
-            d = xbmcgui.Dialog()
-            d.ok(ADDON.getLocalizedString(30100), 
ADDON.getLocalizedString(30101), ADDON.getLocalizedString(30102))
-        else:
-            rtmpUrl = m.group(1) + m.group(3)
-            rtmpUrl += ' playpath=' + m.group(2) + m.group(3)
-            rtmpUrl += ' app=cms' + m.group(3)
+        if videoUrl is None:
+            videoUrl = self.api.getLink(asset)
+            if videoUrl is None:
+                raise Exception('No stream found')
+
+        if videoUrl[0:7] == 'rtmp://':
+            m = re.search('(rtmp://vod.dr.dk/cms)/([^\?]+)(\?.*)', videoUrl)
+            if m:
+                videoUrl = m.group(1) + m.group(3)
+                videoUrl += ' playpath=' + m.group(2) + m.group(3)
+                videoUrl += ' app=cms' + m.group(3)
+
+        try:
+            print videoUrl
+        except:
+            pass
+
+        item = xbmcgui.ListItem(path=videoUrl)
+        xbmcplugin.setResolvedUrl(HANDLE, videoUrl is not None, item)
 
-            if startTime:
-                rtmpUrl += ' start=' + startTime
-            thumbnailImage = self.api.getVideoImageUrl(str(video['id']), 256)
-            item = xbmcgui.ListItem(path=rtmpUrl, 
thumbnailImage=thumbnailImage)
-            xbmcplugin.setResolvedUrl(HANDLE, True, item)
+        if ADDON.getSetting('enable.subtitles') == 'true' and 'SubtitlesList' 
in asset and asset['SubtitlesList']:
+            path = None
+            if len(asset['SubtitlesList']) > 0:
+                path = asset['SubtitlesList'][0]['Uri']
+
+            if path:
+                player = xbmc.Player()
+                for retry in range(0, 20):
+                    if player.isPlaying():
+                        break
+                    xbmc.sleep(250)
+                xbmc.Player().setSubtitles(path)
 
     def parseDate(self, dateString):
-        if 'Date(' in dateString:
-            try:
-                m = re.search('/Date\(([0-9]+).*?\)/', dateString)
-                microseconds = long(m.group(1))
-                return datetime.datetime.fromtimestamp(microseconds / 1000)
-            except ValueError:
-                return None
-        elif dateString is not None:
+        if dateString is not None:
             try:
                 m = re.search('(\d+)-(\d+)-(\d+)T(\d+):(\d+):(\d+)', 
dateString)
                 year = int(m.group(1))
@@ -427,67 +332,32 @@ class NuAddon(object):
         else:
             return None
 
-    def parseTime(self, timeString):
-        try:
-            m = re.search('([0-9]+):([0-9]+):([0-9]+)(.([0-9]+))?', timeString)
-            hours = int(m.group(1))
-            minutes = int(m.group(2))
-            seconds = int(m.group(3))
-            return datetime.datetime(2011, 12, 28, hours, minutes, seconds)
-        except ValueError:
-            return None
-
-    def parseDuration(self, duration):
-        try:
-            minutes = int(duration[0:2]) * 60
-            minutes += int(duration[3:5])
-            minutes += int(duration[6:8]) / 60
-            return str(minutes)
-        except:
-            return 0
-
-    def formatStartTime(self, time):
-        startTime = time.hour * 3600
-        startTime += time.minute * 60
-        startTime += time.second
-        return str(startTime * 1000)
-
-    def createInfoLabels(self, video):
+    def createInfoLabels(self, programCard):
         infoLabels = dict()
 
-        if video['title'] is not None:
-            infoLabels['title'] = video['title']
+        if programCard['Title'] is not None:
+            infoLabels['title'] = programCard['Title']
         else:
             infoLabels['title'] = ADDON.getLocalizedString(30006)
 
-        if 'spotSubTitle' in video and video['spotSubTitle'] is not None:
-            infoLabels['plot'] = video['spotSubTitle']
-        elif 'description' in video and video['description'] is not None:
-            infoLabels['plot'] = video['description']
-
-        if 'duration' in video and video['duration'] is not None:
-            infoLabels['duration'] = self.parseDuration(video['duration'])
-        if 'broadcastChannel' in video and video['broadcastChannel'] is not 
None:
-            infoLabels['studio'] = video['broadcastChannel']
-        if 'broadcastTime' in video and video['broadcastTime'] is not None:
-            broadcastTime = self.parseDate(video['broadcastTime'])
+        if 'Description' in programCard and programCard['Description'] is not 
None:
+            infoLabels['plot'] = programCard['Description']
+        if 'PrimaryBroadcastStartTime' in programCard and 
programCard['PrimaryBroadcastStartTime'] is not None and 
programCard['PrimaryBroadcastStartTime'][0:4] != '0001':
+            broadcastTime = 
self.parseDate(programCard['PrimaryBroadcastStartTime'])
             if broadcastTime:
-                infoLabels['plotoutline'] = ADDON.getLocalizedString(30015) % 
broadcastTime.strftime(
-                    '%d. %b %Y kl. %H:%M')
+                infoLabels['plotoutline'] = ADDON.getLocalizedString(30015) % 
broadcastTime.strftime('%d. %b %Y kl. %H:%M')
                 infoLabels['date'] = broadcastTime.strftime('%d.%m.%Y')
                 infoLabels['aired'] = broadcastTime.strftime('%Y-%m-%d')
                 infoLabels['year'] = int(broadcastTime.strftime('%Y'))
-        if 'expireTime' in video and video['expireTime'] is not None:
-            expireTime = self.parseDate(video['expireTime'])
+        if 'EndPublish' in programCard and programCard['EndPublish'] is not 
None and programCard['EndPublish'][0:4] != '9999':
+            expireTime = self.parseDate(programCard['EndPublish'])
             if expireTime:
-                infoLabels['plot'] += '[CR][CR]' + 
ADDON.getLocalizedString(30016) % expireTime.strftime(
-                    '%d. %b %Y kl. %H:%M')
-        if 'isHq' in video and video['isHq']:
-            infoLabels['overlay'] = xbmcgui.ICON_OVERLAY_HD
+                infoLabels['plot'] += '[CR][CR]' + 
ADDON.getLocalizedString(30016) % expireTime.strftime('%d. %b %Y kl. %H:%M')
 
         return infoLabels
 
     def addFavorite(self, slug):
+        self._load()
         if not self.favorites.count(slug):
             self.favorites.append(slug)
         self._save()
@@ -495,30 +365,17 @@ class NuAddon(object):
         xbmcgui.Dialog().ok(ADDON.getLocalizedString(30008), 
ADDON.getLocalizedString(30009))
 
     def delFavorite(self, slug):
+        self._load()
         if self.favorites.count(slug):
             self.favorites.remove(slug)
         self._save()
         xbmcgui.Dialog().ok(ADDON.getLocalizedString(30008), 
ADDON.getLocalizedString(30010))
 
-    def setCustomThumb(self, slug):
-        imageFile = xbmcgui.Dialog().browse(2, 'custom thumb', 'myprograms', 
'.jpg|.png', True)
-        if imageFile is not None and xbmcvfs.exists(imageFile):
-            thumbFile = self.getCustomThumbPath(slug)
-            xbmcvfs.copy(imageFile, thumbFile)
-
-    def delCustomThumb(self, slug):
-        thumbFile = self.getCustomThumbPath(slug)
-        if os.path.exists(thumbFile):
-            os.unlink(thumbFile)
-
-    def getCustomThumbPath(self, slug):
-        return os.path.join(CACHE_PATH, '%s-thumb.jpg' % slug)
-
-    def _updateRecentlyWatched(self, videoId):
-        xbmc.log("Adding recently watched video ID: " + videoId)
-        if self.recentlyWatched.count(videoId):
-            self.recentlyWatched.remove(videoId)
-        self.recentlyWatched.insert(0, videoId)
+    def updateRecentlyWatched(self, assetUri):
+        self._load()
+        if self.recentlyWatched.count(assetUri):
+            self.recentlyWatched.remove(assetUri)
+        self.recentlyWatched.insert(0, assetUri)
         self._save()
 
     def displayError(self, message='n/a'):
@@ -546,76 +403,49 @@ if __name__ == '__main__':
 
     FAVORITES_PATH = os.path.join(CACHE_PATH, 'favorites.pickle')
     RECENT_PATH = os.path.join(CACHE_PATH, 'recent.pickle')
+    FANART_IMAGE = os.path.join(ADDON.getAddonInfo('path'), 'fanart.jpg')
 
     buggalo.SUBMIT_URL = 'http://tommy.winther.nu/exception/submit.php'
-#    buggalo.GMAIL_RECIPIENT = 'twinthe...@gmail.com'
     buggalo.addExtraData('cache_path', CACHE_PATH)
-    nuAddon = NuAddon()
+    drDkTvAddon = DrDkTvAddon()
     try:
         if 'show' in PARAMS:
             if PARAMS['show'][0] == 'allProgramSeries':
-                nuAddon.showProgramSeries()
-            elif PARAMS['show'][0] == 'azProgramSeries':
-                nuAddon.showProgramSeriesAZ()
-            elif PARAMS['show'][0] == 'programSeriesLabels':
-                nuAddon.showProgramSeriesLabels()
-            elif PARAMS['show'][0] == 'newest':
-                nuAddon.showNewestVideos()
-            elif PARAMS['show'][0] == 'spotlight':
-                nuAddon.showSpotlightVideos()
-            elif PARAMS['show'][0] == 'highlights':
-                nuAddon.showHighlightVideos()
+                drDkTvAddon.showProgramSeries()
+            elif PARAMS['show'][0] == 'listAZ':
+                drDkTvAddon.showAZ()
             elif PARAMS['show'][0] == 'mostViewed':
-                nuAddon.showMostViewedVideos()
-            elif PARAMS['show'][0] == 'premiere':
-                nuAddon.showPremiereVideos()
-            elif PARAMS['show'][0] == 'lastChance':
-                nuAddon.showLastChanceVideos()
+                drDkTvAddon.showMostViewedVideos()
             elif PARAMS['show'][0] == 'search':
-                nuAddon.searchVideos()
+                drDkTvAddon.searchVideos()
             elif PARAMS['show'][0] == 'favorites':
-                nuAddon.showFavorites()
+                drDkTvAddon.showFavorites()
             elif PARAMS['show'][0] == 'recentlyWatched':
-                nuAddon.showRecentlyWatched()
-
-        elif 'programSeriesLabel' in PARAMS:
-            nuAddon.showProgramSeries(label=PARAMS['programSeriesLabel'][0])
+                drDkTvAddon.showRecentlyWatched()
 
-        elif 'programSeriesLetter' in PARAMS:
-            nuAddon.showProgramSeries(letter=PARAMS['programSeriesLetter'][0])
+        elif 'listProgramSeriesByLetter' in PARAMS:
+            
drDkTvAddon.showProgramSeries(letter=PARAMS['listProgramSeriesByLetter'][0])
 
         elif 'listVideos' in PARAMS:
-            nuAddon.showProgramSeriesVideos(PARAMS['listVideos'][0])
+            drDkTvAddon.showProgramSeriesVideos(PARAMS['listVideos'][0])
 
-        elif 'videoId' in PARAMS and 'chapters' in PARAMS:
-            nuAddon.listVideoChapters(PARAMS['videoId'][0])
-
-        elif 'videoId' in PARAMS and 'startTime' in PARAMS:
-            nuAddon.playVideo(PARAMS['videoId'][0], PARAMS['startTime'][0])
-
-        elif 'videoId' in PARAMS:
-            nuAddon.playVideo(PARAMS['videoId'][0])
+        elif 'videoasset' in PARAMS:
+            drDkTvAddon.playVideo(PARAMS['videoasset'][0], PARAMS['urn'][0])
 
         elif 'addfavorite' in PARAMS:
-            nuAddon.addFavorite(PARAMS['addfavorite'][0])
+            drDkTvAddon.addFavorite(PARAMS['addfavorite'][0])
 
         elif 'delfavorite' in PARAMS:
-            nuAddon.delFavorite(PARAMS['delfavorite'][0])
-
-        elif 'setthumb' in PARAMS:
-            nuAddon.setCustomThumb(PARAMS['setthumb'][0])
-
-        elif 'delthumb' in PARAMS:
-            nuAddon.delCustomThumb(PARAMS['delthumb'][0])
+            drDkTvAddon.delFavorite(PARAMS['delfavorite'][0])
 
         else:
-            nuAddon.showMainMenu()
+            drDkTvAddon.showMainMenu()
 
-    except nuapi.DrNuException, ex:
-        nuAddon.displayError(str(ex))
+    except tvapi.TvNuException, ex:
+        drDkTvAddon.displayError(str(ex))
 
     except IOError, ex:
-        nuAddon.displayIOError(str(ex))
+        drDkTvAddon.displayIOError(str(ex))
 
     except Exception:
         buggalo.onExceptionRaised()
diff --git a/plugin.video.drnu/addon.xml b/plugin.video.drnu/addon.xml
index 456c710..eadf432 100644
--- a/plugin.video.drnu/addon.xml
+++ b/plugin.video.drnu/addon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<addon id="plugin.video.drnu" version="3.0.1" name="DR NU Player" 
provider-name="twinther">
+<addon id="plugin.video.drnu" version="4.0.2" name="DR NU Player" 
provider-name="twinther">
     <requires>
         <import addon="xbmc.python" version="2.1.0"/>
         <import addon="script.module.simplejson" version="2.0.10"/>
diff --git a/plugin.video.drnu/changelog.txt b/plugin.video.drnu/changelog.txt
index c075ee6..177f0b6 100644
--- a/plugin.video.drnu/changelog.txt
+++ b/plugin.video.drnu/changelog.txt
@@ -1,3 +1,22 @@
+[B]Version 4.0.2 - 2013-10-02[/B]
+- Fixed problem with favourites only remembering the last favourite added
+- Improve error handling when stream is not available
+
+[B]Version 4.0.1 - 2013-09-24[/B]
+- List up to 500 videos for each program series (instead of just 20)
+- Re-added Premieres, Highlights and Spots categories
+- Fixed problem with empty favourites
+- Added support for displaying subtitles
+
+[B]Version 4.0.0 - 2013-09-23[/B]
+- Added setting to set preferred stream type. Defaults to iOS streams.
+
+[B]Version 3.9.1 - 2013-09-20[/B]
+- Additional features implemented
+
+[B]Version 3.9.0 - 2013-09-19[/B]
+- Initial rewrite to use new DR Medieuniversets REST API
+
 [B]Version 3.0.1 - 2013-08-03[/B]
 - Improved handling of invalid URL's
 - Fixed problem with display of chapters in some cases
diff --git a/plugin.video.drnu/resources/language/Danish/strings.xml 
b/plugin.video.drnu/resources/language/Danish/strings.xml
index b38c07a..e90f71c 100644
--- a/plugin.video.drnu/resources/language/Danish/strings.xml
+++ b/plugin.video.drnu/resources/language/Danish/strings.xml
@@ -35,8 +35,9 @@
     <string id="30201">Fjern fra foretrukne programmer</string>
 
     <string id="30500">Generelt</string>
-    <string id="30501">Aktiver kapitel navigation</string>
+    <string id="30501">Foretræk streams af typen</string>
     <string id="30502">Vis kvalitetsvælger før videoen afspilles</string>
+    <string id="30503">Vis undertekster (hvis tilgængelige)</string>
 
     <string id="30900">Der er sket en fejl i kommunikationen med DR 
NU.</string>
     <string id="30901">Prøv igen senere. Fejlen er:</string>
diff --git a/plugin.video.drnu/resources/language/English/strings.xml 
b/plugin.video.drnu/resources/language/English/strings.xml
index d51ec9d..3da982f 100644
--- a/plugin.video.drnu/resources/language/English/strings.xml
+++ b/plugin.video.drnu/resources/language/English/strings.xml
@@ -35,8 +35,9 @@
     <string id="30201">Remove from favorite program series</string>
 
     <string id="30500">General</string>
-    <string id="30501">Enable chapter navigation</string>
+    <string id="30501">Prefer streams of type</string>
     <string id="30502">Show quality chooser before starting video 
playback</string>
+    <string id="30503">Enable subtitles (if available)</string>
 
     <string id="30900">There was an error while communication with DR 
NU.</string>
     <string id="30901">Please try again later. Error message is:</string>
diff --git a/plugin.video.drnu/resources/settings.xml 
b/plugin.video.drnu/resources/settings.xml
index b4ac100..a05c0d8 100644
--- a/plugin.video.drnu/resources/settings.xml
+++ b/plugin.video.drnu/resources/settings.xml
@@ -1,8 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <settings>
        <category label="30500">
-               <setting id="enable.chapters" label="30501" type="bool" 
default="false" />
+        <setting id="prefer.stream.target" label="30501" type="labelenum" 
default="iOS" values="iOS|Android|Streaming|vodfiles.dr.dk" />
         <setting id="show.stream.selector" label="30502" type="bool" 
default="false" />
+        <setting id="enable.subtitles" label="30503" type="bool" 
default="true" />
        </category>
 </settings>
 

-----------------------------------------------------------------------

Summary of changes:
 plugin.video.drnu/addon.py                         |  608 +++++++-------------
 plugin.video.drnu/addon.xml                        |    2 +-
 plugin.video.drnu/changelog.txt                    |   19 +
 plugin.video.drnu/nuapi.py                         |  193 -------
 plugin.video.drnu/resources/icons/icons.xcf        |  Bin 42329 -> 0 bytes
 .../resources/language/Danish/strings.xml          |    3 +-
 .../resources/language/English/strings.xml         |    3 +-
 plugin.video.drnu/resources/settings.xml           |    3 +-
 plugin.video.drnu/tvapi.py                         |  130 +++++
 .../LICENSE.txt                                    |    0
 plugin.video.tele5/addon.xml                       |   22 +
 plugin.video.tele5/changelog.txt                   |    5 +
 plugin.video.tele5/default.py                      |  131 +++++
 plugin.video.tele5/icon.png                        |  Bin 0 -> 9718 bytes
 14 files changed, 533 insertions(+), 586 deletions(-)
 delete mode 100644 plugin.video.drnu/nuapi.py
 delete mode 100644 plugin.video.drnu/resources/icons/icons.xcf
 create mode 100644 plugin.video.drnu/tvapi.py
 copy {plugin.audio.shoutcast => plugin.video.tele5}/LICENSE.txt (100%)
 mode change 100644 => 100755
 create mode 100644 plugin.video.tele5/addon.xml
 create mode 100755 plugin.video.tele5/changelog.txt
 create mode 100644 plugin.video.tele5/default.py
 create mode 100755 plugin.video.tele5/icon.png


hooks/post-receive
-- 
Plugins

------------------------------------------------------------------------------
October Webinars: Code for Performance
Free Intel webinars can help you accelerate application performance.
Explore tips for MPI, OpenMP, advanced profiling, and more. Get the most from 
the latest Intel processors and coprocessors. See abstracts and register >
http://pubads.g.doubleclick.net/gampad/clk?id=60134791&iu=/4140/ostg.clktrk
_______________________________________________
Xbmc-addons mailing list
Xbmc-addons@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/xbmc-addons

Reply via email to