The branch, frodo has been updated
       via  cbf5d5406d33fe35c2273b3db039a2decf50224b (commit)
       via  22c8e27dec22c9f4e391ceb362b3a2018e11531e (commit)
      from  09031e1cd603f39f0736bd52ee3395a95165af42 (commit)

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


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

commit 22c8e27dec22c9f4e391ceb362b3a2018e11531e
Author: beenje <[email protected]>
Date:   Mon Dec 17 22:34:28 2012 +0100

    [plugin.video.nrk] updated to version 4.3.0

diff --git a/plugin.video.nrk/addon.xml b/plugin.video.nrk/addon.xml
index 2dea2cd..81ca851 100644
--- a/plugin.video.nrk/addon.xml
+++ b/plugin.video.nrk/addon.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <addon id="plugin.video.nrk"
        name="NRK Nett-TV"
-       version="4.2.2"
+       version="4.3.0"
        provider-name="takoi">
   <requires>
     <import addon="xbmc.python" version="2.0"/>
diff --git a/plugin.video.nrk/changelog.txt b/plugin.video.nrk/changelog.txt
index 4157093..cd5d279 100644
--- a/plugin.video.nrk/changelog.txt
+++ b/plugin.video.nrk/changelog.txt
@@ -1,3 +1,8 @@
+[B]4.3.0[/B]
+- Søkefunksjon
+- NRKs radiokanaler er nå tilgjengelig som direktestrømmer
+- Fikset: videoer noen ganger ikke kunne spilles av pga. feil med 
mellomlagringen
+
 [B]4.2.2[/B]
 - Sideendringer
 
diff --git a/plugin.video.nrk/data.py b/plugin.video.nrk/data.py
index 68d615b..05ad060 100644
--- a/plugin.video.nrk/data.py
+++ b/plugin.video.nrk/data.py
@@ -14,6 +14,7 @@
 '''
 
 import re
+import json
 import requests
 import HTMLParser
 import StorageServer
@@ -23,29 +24,26 @@ from subs import get_subtitles
 
 html_decode = HTMLParser.HTMLParser().unescape
 parseDOM = CommonFunctions.parseDOM
-requests = 
requests.session(headers={'User-Agent':'xbmc.org','X-Requested-With':'XMLHttpRequest'})
+session = requests.session(headers={'User-Agent':'xbmc.org'})
+xhrsession = 
requests.session(headers={'User-Agent':'xbmc.org','X-Requested-With':'XMLHttpRequest'})
 cache = StorageServer.StorageServer('nrk.no', 336)
 
-def _get_cached(url):
-  f = lambda x: requests.get(x).json
-  return cache.cacheFunction(f, url)
 
-
-def parse_by_letter(arg):
+def get_by_letter(arg):
   """ returns: </serie/newton> or </program/koif45000708> """
   url = "http://tv.nrk.no/programmer/%s?filter=rettigheter&ajax=true"; % arg
-  html = requests.get(url).text
+  html = xhrsession.get(url).text
   return _parse_list(html)
 
-def parse_by_category(arg):
+def get_by_category(arg):
   url = "http://tv.nrk.no/kategori/%s"; % arg
-  html = requests.get(url).text
+  html = xhrsession.get(url).text
   html = parseDOM(html, 'div', {'class':'alpha-list clear'})
   return _parse_list(html)
 
-def parse_categories():
+def get_categories():
   url = "http://tv.nrk.no/kategori/";
-  html = requests.get(url).text
+  html = xhrsession.get(url).text
   html = parseDOM(html, 'ul', {'id':'categoryList'})
   return _parse_list(html)
 
@@ -59,9 +57,9 @@ def _parse_list(html):
   return titles, urls, thumbs, fanart
 
 
-def parse_recommended():
+def get_recommended():
   url = "http://tv.nrk.no/";
-  html = requests.get(url).text
+  html = xhrsession.get(url).text
   html = parseDOM(html, 'ul', {'id':'introSlider'})[0]
   
   h1s = parseDOM(html, 'h2')
@@ -75,9 +73,9 @@ def parse_recommended():
   return titles, urls, thumbs, fanart
 
 
-def parse_most_recent():
+def get_most_recent():
   url = "http://tv.nrk.no/listobjects/recentlysent.json/page/0";
-  elems = requests.get(url).json['ListObjectViewModels']
+  elems = xhrsession.get(url).json['ListObjectViewModels']
   titles = [ e['Title'] for e in elems ]
   titles = map(html_decode, titles)
   urls = [ e['Url'] for e in elems ]
@@ -86,10 +84,24 @@ def parse_most_recent():
   return titles, urls, thumbs, fanart
 
 
-def parse_seasons(arg):
+def get_search_results(query, page=1):
+  url = "http://tv.nrk.no/sok?q=%s&side=%s&filter=rettigheter"; % (query, page)
+  html = session.get(url).text # use normal request. xhr page wont list all 
the results
+  anc = parseDOM(html, 'a', {'class':'searchresult listobject-link'})
+  titles = [ parseDOM(a, 'strong')[0] for a in anc ]
+  titles = map(html_decode, titles)
+  
+  urls = parseDOM(html, 'a', {'class':'searchresult listobject-link'}, 
ret='href')
+  urls = [ r.split('http://tv.nrk.no')[1] for r in urls ]
+  thumbs = [ _thumb_url(url) for url in urls ]
+  fanart = [ _fanart_url(url) for url in urls ]
+  return titles, urls, thumbs, fanart
+
+
+def get_seasons(arg):
   """ returns: </program/Episodes/aktuelt-tv/11998> """
   url = "http://tv.nrk.no/serie/%s"; % arg
-  html = requests.get(url).text
+  html = xhrsession.get(url).text
   html = parseDOM(html, 'div', {'id':'seasons'})
   html = parseDOM(html, 'noscript')
   titles = parseDOM(html, 'a', {'class':'seasonLink'})
@@ -100,10 +112,10 @@ def parse_seasons(arg):
   return titles, ids, thumbs, fanart
 
 
-def parse_episodes(series_id, season_id):
+def get_episodes(series_id, season_id):
   """ returns: </serie/aktuelt-tv/nnfa50051612/16-05-2012..> """
   url = "http://tv.nrk.no/program/Episodes/%s/%s"; % (series_id, season_id)
-  html = requests.get(url).text
+  html = xhrsession.get(url).text
   trs = parseDOM(html, 'tr', {'class':'has-programtooltip episode-row js-click 
*'})
   titles = [ parseDOM(tr, 'a', {'class':'p-link'})[0] for tr in trs ]
   titles = map(html_decode, titles)
@@ -115,15 +127,32 @@ def parse_episodes(series_id, season_id):
   return titles, ids, thumbs, fanart, descr
 
 
-def parse_media_url(video_id, bitrate):
+def get_media_url(video_id, bitrate):
   bitrate = 4 if bitrate > 4 else bitrate
   url = "http://nrk.no/serum/api/video/%s"; % video_id
-  url = _get_cached(url)['mediaURL']
+  url = _get_cached_json(url, 'mediaURL')
   url = url.replace('/z/', '/i/', 1)
   url = url.rsplit('/', 1)[0]
   url = url + '/index_%s_av.m3u8' % bitrate
   return url
 
+
+def _get_cached_json(url, node):
+  return _get_cached(url, lambda x: json.loads(x)[node])
+
+def _get_cached(url, transform):
+  data = cache.get(url)
+  if data:
+    try:
+      ret = transform(data)
+      return ret
+    except: # assume data is broken
+      pass
+  data = xhrsession.get(url).text
+  cache.delete(url)
+  cache.set(url, data)
+  return transform(data)
+
 def _thumb_url(id):
   return "http://nrk.eu01.aws.af.cm/t/%s"; % id.strip('/')
 
@@ -132,6 +161,5 @@ def _fanart_url(id):
 
 def _get_descr(url):
   url = "http://nrk.no/serum/api/video/%s"; % url.split('/')[3]
-  descr = _get_cached(url)['description']
+  descr = _get_cached_json(url, 'description')
   return descr
-
diff --git a/plugin.video.nrk/default.py b/plugin.video.nrk/default.py
index 7f691d0..f862770 100644
--- a/plugin.video.nrk/default.py
+++ b/plugin.video.nrk/default.py
@@ -19,6 +19,7 @@ import sys
 import time
 import xbmc, xbmcaddon, xbmcplugin
 from itertools import repeat
+from urllib import quote
 from xbmcplugin import addDirectoryItem
 from xbmcplugin import endOfDirectory
 from xbmcgui import ListItem
@@ -38,24 +39,39 @@ def view_top():
   addDirectoryItem(plugin.handle, plugin.make_url("/mostrecent"), 
ListItem("Siste"), True)
   addDirectoryItem(plugin.handle, plugin.make_url("/categories"), 
ListItem("Kategorier"), True)
   addDirectoryItem(plugin.handle, plugin.make_url("/letters"), 
ListItem("A-Å"), True)
+  addDirectoryItem(plugin.handle, plugin.make_url("/search"), 
ListItem("Søk"), True)
   endOfDirectory(plugin.handle)
 
 @plugin.route('/live')
 def live():
   b = ['380','659','1394','2410','3660'][BITRATE-1]
-  img_path = os.path.join(ADDON_PATH, "resources/images")
-  add("NRK 1", 
"http://nrk1us-f.akamaihd.net/i/nrk1us_0@79328/index_%s_av-p.m3u8?sd=10&rebase=on";
 % b,os.path.join(img_path, "nrk1.png"))
-  add("NRK 2", 
"http://nrk2us-f.akamaihd.net/i/nrk2us_0@79327/index_%s_av-p.m3u8?sd=10&rebase=on";
 % b, os.path.join(img_path, "nrk2.png"))
-  add("NRK 3", 
"http://nrk3us-f.akamaihd.net/i/nrk3us_0@79326/index_%s_av-p.m3u8?sd=10&rebase=on";
 % b, os.path.join(img_path, "nrk3.png"))
+  add("NRK 1", 
"http://nrk1us-f.akamaihd.net/i/nrk1us_0@79328/index_%s_av-p.m3u8?sd=10&rebase=on";
 % b, "application/vnd.apple.mpegurl", "nrk1.png")
+  add("NRK 2", 
"http://nrk2us-f.akamaihd.net/i/nrk2us_0@79327/index_%s_av-p.m3u8?sd=10&rebase=on";
 % b, "application/vnd.apple.mpegurl", "nrk2.png")
+  add("NRK 3", 
"http://nrk3us-f.akamaihd.net/i/nrk3us_0@79326/index_%s_av-p.m3u8?sd=10&rebase=on";
 % b, "application/vnd.apple.mpegurl", "nrk3.png")
+  add("NRK P1", "http://lyd.nrk.no/nrk_radio_p1_ostlandssendingen_mp3_h";, 
"audio/mpeg")
+  add("NRK P2", "http://lyd.nrk.no/nrk_radio_p2_mp3_h";, "audio/mpeg")
+  add("NRK P3", "http://lyd.nrk.no/nrk_radio_p3_mp3_h";, "audio/mpeg")
+  add("Alltid nyheter", "http://lyd.nrk.no/nrk_radio_alltid_nyheter_mp3_h";, 
"audio/mpeg")
+  add("Jazz", "http://lyd.nrk.no/nrk_radio_jazz_mp3_h";, "audio/mpeg")
+  add("Klassisk", "http://lyd.nrk.no/nrk_radio_klassisk_mp3_h";, "audio/mpeg")
+  add("Folkemusikk", "http://lyd.nrk.no/nrk_radio_folkemusikk_mp3_h";, 
"audio/mpeg")
+  add("Gull", "http://lyd.nrk.no/nrk_radio_gull_mp3_h";, "audio/mpeg")
+  add("mP3", "http://lyd.nrk.no/nrk_radio_mp3_mp3_h";, "audio/mpeg")
+  add("P3 Urørt", "http://lyd.nrk.no/nrk_radio_p3_urort_mp3_h";, "audio/mpeg")
+  add("Sport", "http://lyd.nrk.no/nrk_radio_sport_mp3_h";, "audio/mpeg")
+  add("Sápmi", "http://lyd.nrk.no/nrk_radio_sami_mp3_h";, "audio/mpeg")
+  add("Super", "http://lyd.nrk.no/nrk_radio_super_mp3_h";, "audio/mpeg")
   endOfDirectory(plugin.handle)
 
-def add(title, url, thumb=""):
+def add(title, url, mimetype, thumb=""):
+  if thumb:
+    img_path = os.path.join(ADDON_PATH, "resources/images")
+    thumb = os.path.join(img_path, thumb)
   li =  ListItem(title, thumbnailImage=thumb)
-  li.setProperty('mimetype', 'application/vnd.apple.mpegurl')
+  li.setProperty('mimetype', mimetype)
   addDirectoryItem(plugin.handle, url, li, False)
 
-
-def view(titles, urls, thumbs=repeat(''), bgs=repeat(''), descr=repeat('')):
+def view(titles, urls, thumbs=repeat(''), bgs=repeat(''), descr=repeat(''), 
update_listing=False):
   total = len(titles)
   for title, url, descr, thumb, bg in zip(titles, urls, descr, thumbs, bgs):
     descr = descr() if callable(descr) else descr
@@ -68,28 +84,27 @@ def view(titles, urls, thumbs=repeat(''), bgs=repeat(''), 
descr=repeat('')):
     if playable:
       li.setInfo('video', {'plot':descr})
     addDirectoryItem(plugin.handle, plugin.make_url(url), li, not playable, 
total)
-  endOfDirectory(plugin.handle)
-
+  endOfDirectory(plugin.handle, updateListing=update_listing)
 
 @plugin.route('/recommended')
 def recommended():
   import data
-  view(*data.parse_recommended())
+  view(*data.get_recommended())
 
 @plugin.route('/mostrecent')
 def mostrecent():
   import data
-  view(*data.parse_most_recent())
+  view(*data.get_most_recent())
 
 @plugin.route('/categories')
 def categories():
   import data
-  view(*data.parse_categories())
+  view(*data.get_categories())
 
 @plugin.route('/kategori/<arg>')
 def category(arg):
   import data
-  view(*data.parse_by_category(arg))
+  view(*data.get_by_category(arg))
 
 @plugin.route('/letters')
 def letters():
@@ -100,15 +115,34 @@ def letters():
   urls = [ '/letters/%s' % l for l in (common + ['ae', 'oe', 'aa']) ]
   view(titles, urls)
 
[email protected]('/search')
+def search():
+  keyboard = xbmc.Keyboard()
+  keyboard.setHeading('Søk')
+  keyboard.doModal()
+  if keyboard.isConfirmed():
+    query = keyboard.getText()
+    query = quote(query)
+    plugin.redirect(plugin.make_url('/search/%s/1' % query))
+
[email protected]('/search/<query>/<page>')
+def search_results(query, page):
+  import data
+  results = data.get_search_results(query, page)
+  more_node = ["Flere", '/search/%s/%s' % (query, int(page)+1), "", "" ]
+  for i in range(0, len(more_node)):
+    results[i].append(more_node[i])
+  view(*results, update_listing=int(page) > 1)
+
 @plugin.route('/letters/<arg>')
 def letter(arg):
   import data
-  view(*data.parse_by_letter(arg))
+  view(*data.get_by_letter(arg))
 
 @plugin.route('/serie/<arg>')
 def seasons(arg):
   import data
-  titles, urls, thumbs, bgs = data.parse_seasons(arg)
+  titles, urls, thumbs, bgs = data.get_seasons(arg)
   if len(titles) == 1:
     plugin.redirect(plugin.make_url(urls[0]))
     return
@@ -117,14 +151,14 @@ def seasons(arg):
 @plugin.route('/program/Episodes/<series_id>/<season_id>')
 def episodes(series_id, season_id):
   import data
-  view(*data.parse_episodes(series_id, season_id))
+  view(*data.get_episodes(series_id, season_id))
 
 @plugin.route('/serie/<series_id>/<video_id>/.*')
 @plugin.route('/program/<video_id>')
 @plugin.route('/program/<video_id>/.*')
 def play(video_id, series_id=""):
   import data
-  url = data.parse_media_url(video_id, BITRATE)
+  url = data.get_media_url(video_id, BITRATE)
   xbmcplugin.setResolvedUrl(plugin.handle, True, ListItem(path=url))
   player = xbmc.Player()
   subtitle = data.get_subtitles(video_id)
@@ -139,4 +173,3 @@ def play(video_id, series_id=""):
 
 if ( __name__ == "__main__" ):
   plugin.run()
-
diff --git a/plugin.video.nrk/subs.py b/plugin.video.nrk/subs.py
index aa55050..860019b 100644
--- a/plugin.video.nrk/subs.py
+++ b/plugin.video.nrk/subs.py
@@ -19,7 +19,6 @@ import xbmc
 import requests
 requests = requests.session(headers={'User-Agent':'xbmc.org'})
 
-
 def get_subtitles(video_id):
   html = requests.get("http://tv.nrk.no/programsubtitles/%s"; % video_id).text
   if not html:
@@ -47,4 +46,3 @@ def _stringToTime(txt):
 
 def _timeToString(time):
   return '%02d:%02d:%02d,%03d' % 
(time/3600,(time%3600)/60,time%60,(time%1)*1000)
-

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

Summary of changes:
 plugin.video.nrk/.gitignore                        |   27 --
 plugin.video.nrk/addon.xml                         |    2 +-
 plugin.video.nrk/changelog.txt                     |    5 +
 plugin.video.nrk/data.py                           |   74 +++--
 plugin.video.nrk/default.py                        |   71 ++++--
 plugin.video.nrk/subs.py                           |    2 -
 .../LICENSE.txt                                    |    0
 plugin.video.vgtv/README.md                        |    4 +
 plugin.video.vgtv/addon.py                         |  195 ++++++++++++
 plugin.video.vgtv/addon.xml                        |   18 ++
 plugin.video.vgtv/changelog.txt                    |    5 +
 plugin.video.vgtv/fanart.jpg                       |  Bin 0 -> 49579 bytes
 plugin.video.vgtv/icon.png                         |  Bin 0 -> 16057 bytes
 .../resources/__init__.py                          |    0
 plugin.video.vgtv/resources/images/latest.png      |  Bin 0 -> 27454 bytes
 plugin.video.vgtv/resources/images/mostseen.png    |  Bin 0 -> 20049 bytes
 plugin.video.vgtv/resources/images/next.png        |  Bin 0 -> 16129 bytes
 plugin.video.vgtv/resources/images/prev.png        |  Bin 0 -> 16868 bytes
 plugin.video.vgtv/resources/images/search.png      |  Bin 0 -> 37067 bytes
 .../resources/language/English/strings.xml         |   15 +
 .../resources/language/Norwegian/strings.xml       |   15 +
 .../resources/lib}/__init__.py                     |    0
 plugin.video.vgtv/resources/lib/api.py             |  323 ++++++++++++++++++++
 plugin.video.vgtv/resources/lib/utils.py           |   45 +++
 24 files changed, 729 insertions(+), 72 deletions(-)
 delete mode 100644 plugin.video.nrk/.gitignore
 copy {plugin.video.nrk => plugin.video.vgtv}/LICENSE.txt (100%)
 create mode 100644 plugin.video.vgtv/README.md
 create mode 100644 plugin.video.vgtv/addon.py
 create mode 100644 plugin.video.vgtv/addon.xml
 create mode 100644 plugin.video.vgtv/changelog.txt
 create mode 100644 plugin.video.vgtv/fanart.jpg
 create mode 100644 plugin.video.vgtv/icon.png
 copy {plugin.audio.radio_de => plugin.video.vgtv}/resources/__init__.py (100%)
 create mode 100644 plugin.video.vgtv/resources/images/latest.png
 create mode 100644 plugin.video.vgtv/resources/images/mostseen.png
 create mode 100644 plugin.video.vgtv/resources/images/next.png
 create mode 100644 plugin.video.vgtv/resources/images/prev.png
 create mode 100644 plugin.video.vgtv/resources/images/search.png
 create mode 100644 plugin.video.vgtv/resources/language/English/strings.xml
 create mode 100644 plugin.video.vgtv/resources/language/Norwegian/strings.xml
 copy {plugin.audio.radio_de/resources => 
plugin.video.vgtv/resources/lib}/__init__.py (100%)
 create mode 100644 plugin.video.vgtv/resources/lib/api.py
 create mode 100644 plugin.video.vgtv/resources/lib/utils.py


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