The branch, eden has been updated
via 21beb68439afc6c50a11958bf2b5b3e72719d99f (commit)
via 5e131c2cd5bf5ed6a343db7d541e944db28b6698 (commit)
from e57e17ca370ba940c8a3b8f5cd381e69aeb714f3 (commit)
- Log -----------------------------------------------------------------
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=21beb68439afc6c50a11958bf2b5b3e72719d99f
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=5e131c2cd5bf5ed6a343db7d541e944db28b6698
commit 5e131c2cd5bf5ed6a343db7d541e944db28b6698
Author: beenje <[email protected]>
Date: Mon Dec 17 22:34:25 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