Push all old addons
Push of all my old addons that are possibly well broken...
0
plugin.audio.kissfm/LICENSE.txt
Normal file
19
plugin.audio.kissfm/addon.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import sys
|
||||||
|
import xbmcgui
|
||||||
|
import xbmcplugin
|
||||||
|
|
||||||
|
addon_handle = int(sys.argv[1])
|
||||||
|
|
||||||
|
xbmcplugin.setContent(addon_handle, 'audio')
|
||||||
|
|
||||||
|
url = 'http://tx.whatson.com/icecast.php?i=kisstorylow.mp3'
|
||||||
|
li = xbmcgui.ListItem('Kisstory', iconImage='http://whitenoisehq.co.uk/kisstory.png', thumbnailImage='http://whitenoisehq.co.uk/kisstory.png')
|
||||||
|
li.setProperty('fanart_image', 'http://whitenoisehq.co.uk/kissbg.jpg')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
|
||||||
|
url = 'http://tx.whatson.com/icecast.php?i=kissnationallow.mp3'
|
||||||
|
li = xbmcgui.ListItem('Kiss FM UK - National', iconImage='http://whitenoisehq.co.uk/kisslogo.png', thumbnailImage='http://whitenoisehq.co.uk/kisslogo.png')
|
||||||
|
li.setProperty('fanart_image', 'http://whitenoisehq.co.uk/kissbg.jpg')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
|
||||||
|
xbmcplugin.endOfDirectory(addon_handle)
|
||||||
21
plugin.audio.kissfm/addon.xml
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<addon id="plugin.audio.kissfm" name="Kiss FM UK" version="0.2" provider-name="DoubleT">
|
||||||
|
<requires>
|
||||||
|
<import addon="xbmc.python" version="2.1.0"/>
|
||||||
|
</requires>
|
||||||
|
<extension point="xbmc.python.pluginsource" library="addon.py">
|
||||||
|
<provides>audio</provides>
|
||||||
|
</extension>
|
||||||
|
<extension point="xbmc.addon.metadata">
|
||||||
|
<summary lang="en">Kiss FM UK - Live Stream</summary>
|
||||||
|
<description lang="en">KissFMUK.com</description>
|
||||||
|
<disclaimer lang="en"></disclaimer>
|
||||||
|
<language>English</language>
|
||||||
|
<platform>all</platform>
|
||||||
|
<license></license>
|
||||||
|
<forum></forum>
|
||||||
|
<website>http://www.kissfmuk.com</website>
|
||||||
|
<email>oli@whitenoisehq.co.uk</email>
|
||||||
|
<source></source>
|
||||||
|
</extension>
|
||||||
|
</addon>
|
||||||
0
plugin.audio.kissfm/changelog.txt
Normal file
BIN
plugin.audio.kissfm/fanart.jpg
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
plugin.audio.kissfm/icon.PNG
Normal file
|
After Width: | Height: | Size: 6.4 KiB |
BIN
plugin.audio.kissfm/resources/icon.PNG
Normal file
|
After Width: | Height: | Size: 6.4 KiB |
141
plugin.audio.kissfm/resources/lib/academicearth/api.py
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
'''
|
||||||
|
|
||||||
|
academicearth.api
|
||||||
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
This module contains the API classes and method to parse information from
|
||||||
|
the Academic Earth website.
|
||||||
|
|
||||||
|
'''
|
||||||
|
from scraper import (get_subjects, get_courses, get_subject_metadata,
|
||||||
|
get_course_metadata, get_lecture_metadata)
|
||||||
|
|
||||||
|
|
||||||
|
class AcademicEarth(object):
|
||||||
|
'''The main API object. Useful as a starting point to get available
|
||||||
|
subjects.
|
||||||
|
'''
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def get_subjects(self):
|
||||||
|
'''Returns a list of subjects available on the website.'''
|
||||||
|
return [Subject(**info) for info in get_subjects()]
|
||||||
|
|
||||||
|
|
||||||
|
class Subject(object):
|
||||||
|
'''Object representing an Academic Earth subject.'''
|
||||||
|
|
||||||
|
def __init__(self, url, name=None):
|
||||||
|
self.url = url
|
||||||
|
self._name = name
|
||||||
|
self._courses = None
|
||||||
|
self._lectures = None
|
||||||
|
self._loaded = False
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_url(cls, url):
|
||||||
|
return cls(url=url)
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return u"<Subject '%s'>" % self.name
|
||||||
|
|
||||||
|
def _load_metadata(self):
|
||||||
|
resp = get_subject_metadata(self.url)
|
||||||
|
if not self._name:
|
||||||
|
self._name = resp['name']
|
||||||
|
self._courses = [Course(**info) for info in resp['courses']]
|
||||||
|
self._lectures = [Lecture(**info) for info in resp['lectures']]
|
||||||
|
self._description = resp['description']
|
||||||
|
self._loaded = True
|
||||||
|
|
||||||
|
@property
|
||||||
|
def name(self):
|
||||||
|
'''Subject name'''
|
||||||
|
if not self._name:
|
||||||
|
self._load_metadata()
|
||||||
|
return self._name
|
||||||
|
|
||||||
|
@property
|
||||||
|
def courses(self):
|
||||||
|
'''List of courses available for this subject'''
|
||||||
|
if not self._loaded:
|
||||||
|
self._load_metadata()
|
||||||
|
return self._courses
|
||||||
|
|
||||||
|
@property
|
||||||
|
def lectures(self):
|
||||||
|
'''List of lectures available for this subject'''
|
||||||
|
if not self._loaded:
|
||||||
|
self._load_metadata()
|
||||||
|
return self._lectures
|
||||||
|
|
||||||
|
|
||||||
|
class Course(object):
|
||||||
|
|
||||||
|
def __init__(self, url, name=None, **kwargs):
|
||||||
|
self.url = url
|
||||||
|
self._name = name
|
||||||
|
self._loaded = False
|
||||||
|
self._lectures = None
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_url(cls, url):
|
||||||
|
return cls(url=url)
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return u"<Course '%s'>" % self.name
|
||||||
|
|
||||||
|
def _load_metadata(self):
|
||||||
|
resp = get_course_metadata(self.url)
|
||||||
|
if not self._name:
|
||||||
|
self._name = resp['name']
|
||||||
|
self._lectures = [Lecture(**info) for info in resp['lectures']]
|
||||||
|
self._loaded = True
|
||||||
|
|
||||||
|
@property
|
||||||
|
def name(self):
|
||||||
|
if not self._name:
|
||||||
|
self._load_metadata()
|
||||||
|
return self._name
|
||||||
|
|
||||||
|
@property
|
||||||
|
def lectures(self):
|
||||||
|
if not self._loaded:
|
||||||
|
self._load_metadata()
|
||||||
|
return self._lectures
|
||||||
|
|
||||||
|
|
||||||
|
class Lecture(object):
|
||||||
|
|
||||||
|
def __init__(self, url, name=None, **kwargs):
|
||||||
|
self.url = url
|
||||||
|
self._name = name
|
||||||
|
self._loaded = False
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_url(cls, url):
|
||||||
|
return cls(url=url)
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return u"<Lecture '%s'>" % self.name
|
||||||
|
|
||||||
|
def _load_metadata(self):
|
||||||
|
resp = get_lecture_metadata(self.url)
|
||||||
|
if not self._name:
|
||||||
|
self._name = resp['name']
|
||||||
|
self._youtube_id = resp['youtube_id']
|
||||||
|
self._loaded = True
|
||||||
|
|
||||||
|
@property
|
||||||
|
def name(self):
|
||||||
|
if not self._name:
|
||||||
|
self._load_metadata()
|
||||||
|
return self._name
|
||||||
|
|
||||||
|
@property
|
||||||
|
def youtube_id(self):
|
||||||
|
if not self._loaded:
|
||||||
|
self._load_metadata()
|
||||||
|
return self._youtube_id
|
||||||
151
plugin.audio.kissfm/resources/lib/academicearth/scraper.py
Normal file
@@ -0,0 +1,151 @@
|
|||||||
|
'''
|
||||||
|
academicearth.scraper
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
This module contains some functions which do the website scraping for the
|
||||||
|
API module. You shouldn't have to use this module directly.
|
||||||
|
'''
|
||||||
|
import re
|
||||||
|
from urllib2 import urlopen
|
||||||
|
from urlparse import urljoin
|
||||||
|
from BeautifulSoup import BeautifulSoup as BS
|
||||||
|
|
||||||
|
|
||||||
|
BASE_URL = 'http://www.academicearth.org'
|
||||||
|
def _url(path):
|
||||||
|
'''Returns a full url for the given path'''
|
||||||
|
return urljoin(BASE_URL, path)
|
||||||
|
|
||||||
|
|
||||||
|
def get(url):
|
||||||
|
'''Performs a GET request for the given url and returns the response'''
|
||||||
|
conn = urlopen(url)
|
||||||
|
resp = conn.read()
|
||||||
|
conn.close()
|
||||||
|
return resp
|
||||||
|
|
||||||
|
|
||||||
|
def _html(url):
|
||||||
|
'''Downloads the resource at the given url and parses via BeautifulSoup'''
|
||||||
|
return BS(get(url), convertEntities=BS.HTML_ENTITIES)
|
||||||
|
|
||||||
|
|
||||||
|
def make_showall_url(url):
|
||||||
|
'''Takes an api url and appends info to the path to force the page to
|
||||||
|
return all entries instead of paginating.
|
||||||
|
'''
|
||||||
|
if not url.endswith('/'):
|
||||||
|
url += '/'
|
||||||
|
return url + 'page:1/show:500'
|
||||||
|
|
||||||
|
|
||||||
|
def get_subjects():
|
||||||
|
'''Returns a list of subjects for the website. Each subject is a dict with
|
||||||
|
keys of 'name' and 'url'.
|
||||||
|
'''
|
||||||
|
url = _url('subjects')
|
||||||
|
html = _html(url)
|
||||||
|
subjs = html.findAll('a',
|
||||||
|
{'href': lambda attr_value: attr_value.startswith('/subjects/')
|
||||||
|
and len(attr_value) > len('/subjects/')})
|
||||||
|
|
||||||
|
# subjs will contain some duplicates so we will key on url
|
||||||
|
items = []
|
||||||
|
urls = set()
|
||||||
|
for subj in subjs:
|
||||||
|
url = _url(subj['href'])
|
||||||
|
if url not in urls:
|
||||||
|
urls.add(url)
|
||||||
|
items.append({
|
||||||
|
'name': subj.string,
|
||||||
|
'url': url,
|
||||||
|
})
|
||||||
|
|
||||||
|
# filter out any items that didn't parse correctly
|
||||||
|
return [item for item in items if item['name'] and item['url']]
|
||||||
|
|
||||||
|
|
||||||
|
def get_subject_metadata(subject_url):
|
||||||
|
'''Returns metadata for a subject parsed from the given url'''
|
||||||
|
html = _html(make_showall_url(subject_url))
|
||||||
|
name = get_subject_name(html)
|
||||||
|
courses = get_courses(html)
|
||||||
|
lectures = get_lectures(html)
|
||||||
|
desc = get_subject_description(html)
|
||||||
|
|
||||||
|
return {
|
||||||
|
'name': name,
|
||||||
|
'courses': courses,
|
||||||
|
'lectures': lectures,
|
||||||
|
'description': desc,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def get_subject_name(html):
|
||||||
|
return html.find('article').h1.text
|
||||||
|
|
||||||
|
|
||||||
|
def get_course_name(html):
|
||||||
|
return html.find('section', {'class': 'pagenav'}).span.text
|
||||||
|
|
||||||
|
|
||||||
|
def get_lecture_name(html):
|
||||||
|
return html.find('section', {'class': 'pagenav'}).span.text
|
||||||
|
|
||||||
|
|
||||||
|
def get_subject_description(html):
|
||||||
|
desc_nodes = html.find('article').findAll('span')
|
||||||
|
return '\n'.join(node.text.strip() for node in desc_nodes)
|
||||||
|
|
||||||
|
|
||||||
|
def _get_courses_or_lectures(class_type, html):
|
||||||
|
'''class_type can be 'course' or 'lecture'.'''
|
||||||
|
nodes = html.findAll('div', {'class': class_type})
|
||||||
|
|
||||||
|
items = [{
|
||||||
|
'name': node.h3.text,
|
||||||
|
'url': _url(node.a['href']),
|
||||||
|
'icon': node.img['src'],
|
||||||
|
#'university': '',
|
||||||
|
#'speaker': '',
|
||||||
|
} for node in nodes]
|
||||||
|
|
||||||
|
return items
|
||||||
|
|
||||||
|
|
||||||
|
def get_lectures(html):
|
||||||
|
return _get_courses_or_lectures('lecture', html)
|
||||||
|
|
||||||
|
|
||||||
|
def get_courses(html):
|
||||||
|
return _get_courses_or_lectures('course', html)
|
||||||
|
|
||||||
|
|
||||||
|
def get_course_metadata(course_url):
|
||||||
|
html = _html(make_showall_url(course_url))
|
||||||
|
lectures = get_lectures(html)
|
||||||
|
name = get_course_name(html)
|
||||||
|
return {
|
||||||
|
'lectures': lectures,
|
||||||
|
'name': name,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def get_lecture_metadata(lecture_url):
|
||||||
|
html = _html(lecture_url)
|
||||||
|
name = get_lecture_name(html)
|
||||||
|
youtube_id = parse_youtube_id(html)
|
||||||
|
return {
|
||||||
|
'name': name,
|
||||||
|
'youtube_id': youtube_id
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def parse_youtube_id(html):
|
||||||
|
embed = html.find('embed')
|
||||||
|
yt_ptn = re.compile(r'http://www.youtube.com/v/(.+?)\?')
|
||||||
|
match = yt_ptn.search(embed['src'])
|
||||||
|
if match:
|
||||||
|
return match.group(1)
|
||||||
|
return None
|
||||||
0
plugin.audio.kissfm/resources/settings.xml
Normal file
0
plugin.audio.rinsefm/LICENSE.txt
Normal file
BIN
plugin.audio.rinsefm/Thumbs.db
Normal file
14
plugin.audio.rinsefm/addon.py
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import sys
|
||||||
|
import xbmcgui
|
||||||
|
import xbmcplugin
|
||||||
|
|
||||||
|
addon_handle = int(sys.argv[1])
|
||||||
|
|
||||||
|
xbmcplugin.setContent(addon_handle, 'movies')
|
||||||
|
|
||||||
|
url = 'http://podcast.dgen.net:8000/rinseradio.m3u'
|
||||||
|
li = xbmcgui.ListItem('Rinse.FM', iconImage='http://in-reach.co.uk/wp-content/uploads/2014/02/rinse-fm-logo-620x400.png', thumbnailImage='http://in-reach.co.uk/wp-content/uploads/2014/02/rinse-fm-logo-620x400.png')
|
||||||
|
li.setProperty('fanart_image', 'http://in-reach.co.uk/wp-content/uploads/2014/02/rinse-fm-logo-620x400.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
|
||||||
|
xbmcplugin.endOfDirectory(addon_handle)
|
||||||
21
plugin.audio.rinsefm/addon.xml
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<addon id="plugin.audio.rinsefm" name="Rinse.FM" version="0.2" provider-name="DoubleT">
|
||||||
|
<requires>
|
||||||
|
<import addon="xbmc.python" version="2.1.0"/>
|
||||||
|
</requires>
|
||||||
|
<extension point="xbmc.python.pluginsource" library="addon.py">
|
||||||
|
<provides>audio</provides>
|
||||||
|
</extension>
|
||||||
|
<extension point="xbmc.addon.metadata">
|
||||||
|
<summary lang="en">Rinse.FM - Live Stream</summary>
|
||||||
|
<description lang="en">RinseFM live from Brick Lane, London</description>
|
||||||
|
<disclaimer lang="en"></disclaimer>
|
||||||
|
<language>English</language>
|
||||||
|
<platform>all</platform>
|
||||||
|
<license></license>
|
||||||
|
<forum></forum>
|
||||||
|
<website>http://rinse.fm</website>
|
||||||
|
<email>oli@whitenoisehq.co.uk</email>
|
||||||
|
<source></source>
|
||||||
|
</extension>
|
||||||
|
</addon>
|
||||||
0
plugin.audio.rinsefm/changelog.txt
Normal file
BIN
plugin.audio.rinsefm/fanart.jpg
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
plugin.audio.rinsefm/logo.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
BIN
plugin.audio.rinsefm/resources/icon.PNG
Normal file
|
After Width: | Height: | Size: 59 KiB |
141
plugin.audio.rinsefm/resources/lib/academicearth/api.py
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
'''
|
||||||
|
|
||||||
|
academicearth.api
|
||||||
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
This module contains the API classes and method to parse information from
|
||||||
|
the Academic Earth website.
|
||||||
|
|
||||||
|
'''
|
||||||
|
from scraper import (get_subjects, get_courses, get_subject_metadata,
|
||||||
|
get_course_metadata, get_lecture_metadata)
|
||||||
|
|
||||||
|
|
||||||
|
class AcademicEarth(object):
|
||||||
|
'''The main API object. Useful as a starting point to get available
|
||||||
|
subjects.
|
||||||
|
'''
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def get_subjects(self):
|
||||||
|
'''Returns a list of subjects available on the website.'''
|
||||||
|
return [Subject(**info) for info in get_subjects()]
|
||||||
|
|
||||||
|
|
||||||
|
class Subject(object):
|
||||||
|
'''Object representing an Academic Earth subject.'''
|
||||||
|
|
||||||
|
def __init__(self, url, name=None):
|
||||||
|
self.url = url
|
||||||
|
self._name = name
|
||||||
|
self._courses = None
|
||||||
|
self._lectures = None
|
||||||
|
self._loaded = False
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_url(cls, url):
|
||||||
|
return cls(url=url)
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return u"<Subject '%s'>" % self.name
|
||||||
|
|
||||||
|
def _load_metadata(self):
|
||||||
|
resp = get_subject_metadata(self.url)
|
||||||
|
if not self._name:
|
||||||
|
self._name = resp['name']
|
||||||
|
self._courses = [Course(**info) for info in resp['courses']]
|
||||||
|
self._lectures = [Lecture(**info) for info in resp['lectures']]
|
||||||
|
self._description = resp['description']
|
||||||
|
self._loaded = True
|
||||||
|
|
||||||
|
@property
|
||||||
|
def name(self):
|
||||||
|
'''Subject name'''
|
||||||
|
if not self._name:
|
||||||
|
self._load_metadata()
|
||||||
|
return self._name
|
||||||
|
|
||||||
|
@property
|
||||||
|
def courses(self):
|
||||||
|
'''List of courses available for this subject'''
|
||||||
|
if not self._loaded:
|
||||||
|
self._load_metadata()
|
||||||
|
return self._courses
|
||||||
|
|
||||||
|
@property
|
||||||
|
def lectures(self):
|
||||||
|
'''List of lectures available for this subject'''
|
||||||
|
if not self._loaded:
|
||||||
|
self._load_metadata()
|
||||||
|
return self._lectures
|
||||||
|
|
||||||
|
|
||||||
|
class Course(object):
|
||||||
|
|
||||||
|
def __init__(self, url, name=None, **kwargs):
|
||||||
|
self.url = url
|
||||||
|
self._name = name
|
||||||
|
self._loaded = False
|
||||||
|
self._lectures = None
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_url(cls, url):
|
||||||
|
return cls(url=url)
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return u"<Course '%s'>" % self.name
|
||||||
|
|
||||||
|
def _load_metadata(self):
|
||||||
|
resp = get_course_metadata(self.url)
|
||||||
|
if not self._name:
|
||||||
|
self._name = resp['name']
|
||||||
|
self._lectures = [Lecture(**info) for info in resp['lectures']]
|
||||||
|
self._loaded = True
|
||||||
|
|
||||||
|
@property
|
||||||
|
def name(self):
|
||||||
|
if not self._name:
|
||||||
|
self._load_metadata()
|
||||||
|
return self._name
|
||||||
|
|
||||||
|
@property
|
||||||
|
def lectures(self):
|
||||||
|
if not self._loaded:
|
||||||
|
self._load_metadata()
|
||||||
|
return self._lectures
|
||||||
|
|
||||||
|
|
||||||
|
class Lecture(object):
|
||||||
|
|
||||||
|
def __init__(self, url, name=None, **kwargs):
|
||||||
|
self.url = url
|
||||||
|
self._name = name
|
||||||
|
self._loaded = False
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_url(cls, url):
|
||||||
|
return cls(url=url)
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return u"<Lecture '%s'>" % self.name
|
||||||
|
|
||||||
|
def _load_metadata(self):
|
||||||
|
resp = get_lecture_metadata(self.url)
|
||||||
|
if not self._name:
|
||||||
|
self._name = resp['name']
|
||||||
|
self._youtube_id = resp['youtube_id']
|
||||||
|
self._loaded = True
|
||||||
|
|
||||||
|
@property
|
||||||
|
def name(self):
|
||||||
|
if not self._name:
|
||||||
|
self._load_metadata()
|
||||||
|
return self._name
|
||||||
|
|
||||||
|
@property
|
||||||
|
def youtube_id(self):
|
||||||
|
if not self._loaded:
|
||||||
|
self._load_metadata()
|
||||||
|
return self._youtube_id
|
||||||
151
plugin.audio.rinsefm/resources/lib/academicearth/scraper.py
Normal file
@@ -0,0 +1,151 @@
|
|||||||
|
'''
|
||||||
|
academicearth.scraper
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
This module contains some functions which do the website scraping for the
|
||||||
|
API module. You shouldn't have to use this module directly.
|
||||||
|
'''
|
||||||
|
import re
|
||||||
|
from urllib2 import urlopen
|
||||||
|
from urlparse import urljoin
|
||||||
|
from BeautifulSoup import BeautifulSoup as BS
|
||||||
|
|
||||||
|
|
||||||
|
BASE_URL = 'http://www.academicearth.org'
|
||||||
|
def _url(path):
|
||||||
|
'''Returns a full url for the given path'''
|
||||||
|
return urljoin(BASE_URL, path)
|
||||||
|
|
||||||
|
|
||||||
|
def get(url):
|
||||||
|
'''Performs a GET request for the given url and returns the response'''
|
||||||
|
conn = urlopen(url)
|
||||||
|
resp = conn.read()
|
||||||
|
conn.close()
|
||||||
|
return resp
|
||||||
|
|
||||||
|
|
||||||
|
def _html(url):
|
||||||
|
'''Downloads the resource at the given url and parses via BeautifulSoup'''
|
||||||
|
return BS(get(url), convertEntities=BS.HTML_ENTITIES)
|
||||||
|
|
||||||
|
|
||||||
|
def make_showall_url(url):
|
||||||
|
'''Takes an api url and appends info to the path to force the page to
|
||||||
|
return all entries instead of paginating.
|
||||||
|
'''
|
||||||
|
if not url.endswith('/'):
|
||||||
|
url += '/'
|
||||||
|
return url + 'page:1/show:500'
|
||||||
|
|
||||||
|
|
||||||
|
def get_subjects():
|
||||||
|
'''Returns a list of subjects for the website. Each subject is a dict with
|
||||||
|
keys of 'name' and 'url'.
|
||||||
|
'''
|
||||||
|
url = _url('subjects')
|
||||||
|
html = _html(url)
|
||||||
|
subjs = html.findAll('a',
|
||||||
|
{'href': lambda attr_value: attr_value.startswith('/subjects/')
|
||||||
|
and len(attr_value) > len('/subjects/')})
|
||||||
|
|
||||||
|
# subjs will contain some duplicates so we will key on url
|
||||||
|
items = []
|
||||||
|
urls = set()
|
||||||
|
for subj in subjs:
|
||||||
|
url = _url(subj['href'])
|
||||||
|
if url not in urls:
|
||||||
|
urls.add(url)
|
||||||
|
items.append({
|
||||||
|
'name': subj.string,
|
||||||
|
'url': url,
|
||||||
|
})
|
||||||
|
|
||||||
|
# filter out any items that didn't parse correctly
|
||||||
|
return [item for item in items if item['name'] and item['url']]
|
||||||
|
|
||||||
|
|
||||||
|
def get_subject_metadata(subject_url):
|
||||||
|
'''Returns metadata for a subject parsed from the given url'''
|
||||||
|
html = _html(make_showall_url(subject_url))
|
||||||
|
name = get_subject_name(html)
|
||||||
|
courses = get_courses(html)
|
||||||
|
lectures = get_lectures(html)
|
||||||
|
desc = get_subject_description(html)
|
||||||
|
|
||||||
|
return {
|
||||||
|
'name': name,
|
||||||
|
'courses': courses,
|
||||||
|
'lectures': lectures,
|
||||||
|
'description': desc,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def get_subject_name(html):
|
||||||
|
return html.find('article').h1.text
|
||||||
|
|
||||||
|
|
||||||
|
def get_course_name(html):
|
||||||
|
return html.find('section', {'class': 'pagenav'}).span.text
|
||||||
|
|
||||||
|
|
||||||
|
def get_lecture_name(html):
|
||||||
|
return html.find('section', {'class': 'pagenav'}).span.text
|
||||||
|
|
||||||
|
|
||||||
|
def get_subject_description(html):
|
||||||
|
desc_nodes = html.find('article').findAll('span')
|
||||||
|
return '\n'.join(node.text.strip() for node in desc_nodes)
|
||||||
|
|
||||||
|
|
||||||
|
def _get_courses_or_lectures(class_type, html):
|
||||||
|
'''class_type can be 'course' or 'lecture'.'''
|
||||||
|
nodes = html.findAll('div', {'class': class_type})
|
||||||
|
|
||||||
|
items = [{
|
||||||
|
'name': node.h3.text,
|
||||||
|
'url': _url(node.a['href']),
|
||||||
|
'icon': node.img['src'],
|
||||||
|
#'university': '',
|
||||||
|
#'speaker': '',
|
||||||
|
} for node in nodes]
|
||||||
|
|
||||||
|
return items
|
||||||
|
|
||||||
|
|
||||||
|
def get_lectures(html):
|
||||||
|
return _get_courses_or_lectures('lecture', html)
|
||||||
|
|
||||||
|
|
||||||
|
def get_courses(html):
|
||||||
|
return _get_courses_or_lectures('course', html)
|
||||||
|
|
||||||
|
|
||||||
|
def get_course_metadata(course_url):
|
||||||
|
html = _html(make_showall_url(course_url))
|
||||||
|
lectures = get_lectures(html)
|
||||||
|
name = get_course_name(html)
|
||||||
|
return {
|
||||||
|
'lectures': lectures,
|
||||||
|
'name': name,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def get_lecture_metadata(lecture_url):
|
||||||
|
html = _html(lecture_url)
|
||||||
|
name = get_lecture_name(html)
|
||||||
|
youtube_id = parse_youtube_id(html)
|
||||||
|
return {
|
||||||
|
'name': name,
|
||||||
|
'youtube_id': youtube_id
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def parse_youtube_id(html):
|
||||||
|
embed = html.find('embed')
|
||||||
|
yt_ptn = re.compile(r'http://www.youtube.com/v/(.+?)\?')
|
||||||
|
match = yt_ptn.search(embed['src'])
|
||||||
|
if match:
|
||||||
|
return match.group(1)
|
||||||
|
return None
|
||||||
0
plugin.audio.rinsefm/resources/settings.xml
Normal file
0
plugin.video.londonlive/LICENSE.txt
Normal file
14
plugin.video.londonlive/addon.py
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
import sys
|
||||||
|
import xbmcgui
|
||||||
|
import xbmcplugin
|
||||||
|
|
||||||
|
addon_handle = int(sys.argv[1])
|
||||||
|
|
||||||
|
xbmcplugin.setContent(addon_handle, 'movies')
|
||||||
|
|
||||||
|
url = 'http://bcoveliveios-i.akamaihd.net/hls/live/217434/3083279840001/master.m3u8'
|
||||||
|
li = xbmcgui.ListItem('London Live', iconImage='http://whitenoisehq.co.uk/londonlivelogo.png', thumbnailImage='http://whitenoisehq.co.uk/londonlivelogo.png')
|
||||||
|
li.setProperty('fanart_image', 'fanart.jpg')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
|
||||||
|
xbmcplugin.endOfDirectory(addon_handle)
|
||||||
21
plugin.video.londonlive/addon.xml
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<addon id="plugin.video.londonlive" name="London Live" version="0.4" provider-name="DoubleT">
|
||||||
|
<requires>
|
||||||
|
<import addon="xbmc.python" version="2.1.0"/>
|
||||||
|
</requires>
|
||||||
|
<extension point="xbmc.python.pluginsource" library="addon.py">
|
||||||
|
<provides>video</provides>
|
||||||
|
</extension>
|
||||||
|
<extension point="xbmc.addon.metadata">
|
||||||
|
<summary lang="en">London Live - Live Stream</summary>
|
||||||
|
<description lang="en">LondonLive.co.uk</description>
|
||||||
|
<disclaimer lang="en"></disclaimer>
|
||||||
|
<language>English</language>
|
||||||
|
<platform>all</platform>
|
||||||
|
<license></license>
|
||||||
|
<forum>http://forum.xbmc.org/showthread.php?tid=190935</forum>
|
||||||
|
<website>http://www.londonlive.co.uk</website>
|
||||||
|
<email>oli@whitenoisehq.co.uk</email>
|
||||||
|
<source></source>
|
||||||
|
</extension>
|
||||||
|
</addon>
|
||||||
0
plugin.video.londonlive/changelog.txt
Normal file
BIN
plugin.video.londonlive/fanart.jpg
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
plugin.video.londonlive/icon.PNG
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
plugin.video.londonlive/resources/icon.PNG
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
141
plugin.video.londonlive/resources/lib/academicearth/api.py
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
'''
|
||||||
|
|
||||||
|
academicearth.api
|
||||||
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
This module contains the API classes and method to parse information from
|
||||||
|
the Academic Earth website.
|
||||||
|
|
||||||
|
'''
|
||||||
|
from scraper import (get_subjects, get_courses, get_subject_metadata,
|
||||||
|
get_course_metadata, get_lecture_metadata)
|
||||||
|
|
||||||
|
|
||||||
|
class AcademicEarth(object):
|
||||||
|
'''The main API object. Useful as a starting point to get available
|
||||||
|
subjects.
|
||||||
|
'''
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def get_subjects(self):
|
||||||
|
'''Returns a list of subjects available on the website.'''
|
||||||
|
return [Subject(**info) for info in get_subjects()]
|
||||||
|
|
||||||
|
|
||||||
|
class Subject(object):
|
||||||
|
'''Object representing an Academic Earth subject.'''
|
||||||
|
|
||||||
|
def __init__(self, url, name=None):
|
||||||
|
self.url = url
|
||||||
|
self._name = name
|
||||||
|
self._courses = None
|
||||||
|
self._lectures = None
|
||||||
|
self._loaded = False
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_url(cls, url):
|
||||||
|
return cls(url=url)
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return u"<Subject '%s'>" % self.name
|
||||||
|
|
||||||
|
def _load_metadata(self):
|
||||||
|
resp = get_subject_metadata(self.url)
|
||||||
|
if not self._name:
|
||||||
|
self._name = resp['name']
|
||||||
|
self._courses = [Course(**info) for info in resp['courses']]
|
||||||
|
self._lectures = [Lecture(**info) for info in resp['lectures']]
|
||||||
|
self._description = resp['description']
|
||||||
|
self._loaded = True
|
||||||
|
|
||||||
|
@property
|
||||||
|
def name(self):
|
||||||
|
'''Subject name'''
|
||||||
|
if not self._name:
|
||||||
|
self._load_metadata()
|
||||||
|
return self._name
|
||||||
|
|
||||||
|
@property
|
||||||
|
def courses(self):
|
||||||
|
'''List of courses available for this subject'''
|
||||||
|
if not self._loaded:
|
||||||
|
self._load_metadata()
|
||||||
|
return self._courses
|
||||||
|
|
||||||
|
@property
|
||||||
|
def lectures(self):
|
||||||
|
'''List of lectures available for this subject'''
|
||||||
|
if not self._loaded:
|
||||||
|
self._load_metadata()
|
||||||
|
return self._lectures
|
||||||
|
|
||||||
|
|
||||||
|
class Course(object):
|
||||||
|
|
||||||
|
def __init__(self, url, name=None, **kwargs):
|
||||||
|
self.url = url
|
||||||
|
self._name = name
|
||||||
|
self._loaded = False
|
||||||
|
self._lectures = None
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_url(cls, url):
|
||||||
|
return cls(url=url)
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return u"<Course '%s'>" % self.name
|
||||||
|
|
||||||
|
def _load_metadata(self):
|
||||||
|
resp = get_course_metadata(self.url)
|
||||||
|
if not self._name:
|
||||||
|
self._name = resp['name']
|
||||||
|
self._lectures = [Lecture(**info) for info in resp['lectures']]
|
||||||
|
self._loaded = True
|
||||||
|
|
||||||
|
@property
|
||||||
|
def name(self):
|
||||||
|
if not self._name:
|
||||||
|
self._load_metadata()
|
||||||
|
return self._name
|
||||||
|
|
||||||
|
@property
|
||||||
|
def lectures(self):
|
||||||
|
if not self._loaded:
|
||||||
|
self._load_metadata()
|
||||||
|
return self._lectures
|
||||||
|
|
||||||
|
|
||||||
|
class Lecture(object):
|
||||||
|
|
||||||
|
def __init__(self, url, name=None, **kwargs):
|
||||||
|
self.url = url
|
||||||
|
self._name = name
|
||||||
|
self._loaded = False
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_url(cls, url):
|
||||||
|
return cls(url=url)
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return u"<Lecture '%s'>" % self.name
|
||||||
|
|
||||||
|
def _load_metadata(self):
|
||||||
|
resp = get_lecture_metadata(self.url)
|
||||||
|
if not self._name:
|
||||||
|
self._name = resp['name']
|
||||||
|
self._youtube_id = resp['youtube_id']
|
||||||
|
self._loaded = True
|
||||||
|
|
||||||
|
@property
|
||||||
|
def name(self):
|
||||||
|
if not self._name:
|
||||||
|
self._load_metadata()
|
||||||
|
return self._name
|
||||||
|
|
||||||
|
@property
|
||||||
|
def youtube_id(self):
|
||||||
|
if not self._loaded:
|
||||||
|
self._load_metadata()
|
||||||
|
return self._youtube_id
|
||||||
151
plugin.video.londonlive/resources/lib/academicearth/scraper.py
Normal file
@@ -0,0 +1,151 @@
|
|||||||
|
'''
|
||||||
|
academicearth.scraper
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
This module contains some functions which do the website scraping for the
|
||||||
|
API module. You shouldn't have to use this module directly.
|
||||||
|
'''
|
||||||
|
import re
|
||||||
|
from urllib2 import urlopen
|
||||||
|
from urlparse import urljoin
|
||||||
|
from BeautifulSoup import BeautifulSoup as BS
|
||||||
|
|
||||||
|
|
||||||
|
BASE_URL = 'http://www.academicearth.org'
|
||||||
|
def _url(path):
|
||||||
|
'''Returns a full url for the given path'''
|
||||||
|
return urljoin(BASE_URL, path)
|
||||||
|
|
||||||
|
|
||||||
|
def get(url):
|
||||||
|
'''Performs a GET request for the given url and returns the response'''
|
||||||
|
conn = urlopen(url)
|
||||||
|
resp = conn.read()
|
||||||
|
conn.close()
|
||||||
|
return resp
|
||||||
|
|
||||||
|
|
||||||
|
def _html(url):
|
||||||
|
'''Downloads the resource at the given url and parses via BeautifulSoup'''
|
||||||
|
return BS(get(url), convertEntities=BS.HTML_ENTITIES)
|
||||||
|
|
||||||
|
|
||||||
|
def make_showall_url(url):
|
||||||
|
'''Takes an api url and appends info to the path to force the page to
|
||||||
|
return all entries instead of paginating.
|
||||||
|
'''
|
||||||
|
if not url.endswith('/'):
|
||||||
|
url += '/'
|
||||||
|
return url + 'page:1/show:500'
|
||||||
|
|
||||||
|
|
||||||
|
def get_subjects():
|
||||||
|
'''Returns a list of subjects for the website. Each subject is a dict with
|
||||||
|
keys of 'name' and 'url'.
|
||||||
|
'''
|
||||||
|
url = _url('subjects')
|
||||||
|
html = _html(url)
|
||||||
|
subjs = html.findAll('a',
|
||||||
|
{'href': lambda attr_value: attr_value.startswith('/subjects/')
|
||||||
|
and len(attr_value) > len('/subjects/')})
|
||||||
|
|
||||||
|
# subjs will contain some duplicates so we will key on url
|
||||||
|
items = []
|
||||||
|
urls = set()
|
||||||
|
for subj in subjs:
|
||||||
|
url = _url(subj['href'])
|
||||||
|
if url not in urls:
|
||||||
|
urls.add(url)
|
||||||
|
items.append({
|
||||||
|
'name': subj.string,
|
||||||
|
'url': url,
|
||||||
|
})
|
||||||
|
|
||||||
|
# filter out any items that didn't parse correctly
|
||||||
|
return [item for item in items if item['name'] and item['url']]
|
||||||
|
|
||||||
|
|
||||||
|
def get_subject_metadata(subject_url):
|
||||||
|
'''Returns metadata for a subject parsed from the given url'''
|
||||||
|
html = _html(make_showall_url(subject_url))
|
||||||
|
name = get_subject_name(html)
|
||||||
|
courses = get_courses(html)
|
||||||
|
lectures = get_lectures(html)
|
||||||
|
desc = get_subject_description(html)
|
||||||
|
|
||||||
|
return {
|
||||||
|
'name': name,
|
||||||
|
'courses': courses,
|
||||||
|
'lectures': lectures,
|
||||||
|
'description': desc,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def get_subject_name(html):
|
||||||
|
return html.find('article').h1.text
|
||||||
|
|
||||||
|
|
||||||
|
def get_course_name(html):
|
||||||
|
return html.find('section', {'class': 'pagenav'}).span.text
|
||||||
|
|
||||||
|
|
||||||
|
def get_lecture_name(html):
|
||||||
|
return html.find('section', {'class': 'pagenav'}).span.text
|
||||||
|
|
||||||
|
|
||||||
|
def get_subject_description(html):
|
||||||
|
desc_nodes = html.find('article').findAll('span')
|
||||||
|
return '\n'.join(node.text.strip() for node in desc_nodes)
|
||||||
|
|
||||||
|
|
||||||
|
def _get_courses_or_lectures(class_type, html):
|
||||||
|
'''class_type can be 'course' or 'lecture'.'''
|
||||||
|
nodes = html.findAll('div', {'class': class_type})
|
||||||
|
|
||||||
|
items = [{
|
||||||
|
'name': node.h3.text,
|
||||||
|
'url': _url(node.a['href']),
|
||||||
|
'icon': node.img['src'],
|
||||||
|
#'university': '',
|
||||||
|
#'speaker': '',
|
||||||
|
} for node in nodes]
|
||||||
|
|
||||||
|
return items
|
||||||
|
|
||||||
|
|
||||||
|
def get_lectures(html):
|
||||||
|
return _get_courses_or_lectures('lecture', html)
|
||||||
|
|
||||||
|
|
||||||
|
def get_courses(html):
|
||||||
|
return _get_courses_or_lectures('course', html)
|
||||||
|
|
||||||
|
|
||||||
|
def get_course_metadata(course_url):
|
||||||
|
html = _html(make_showall_url(course_url))
|
||||||
|
lectures = get_lectures(html)
|
||||||
|
name = get_course_name(html)
|
||||||
|
return {
|
||||||
|
'lectures': lectures,
|
||||||
|
'name': name,
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def get_lecture_metadata(lecture_url):
|
||||||
|
html = _html(lecture_url)
|
||||||
|
name = get_lecture_name(html)
|
||||||
|
youtube_id = parse_youtube_id(html)
|
||||||
|
return {
|
||||||
|
'name': name,
|
||||||
|
'youtube_id': youtube_id
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def parse_youtube_id(html):
|
||||||
|
embed = html.find('embed')
|
||||||
|
yt_ptn = re.compile(r'http://www.youtube.com/v/(.+?)\?')
|
||||||
|
match = yt_ptn.search(embed['src'])
|
||||||
|
if match:
|
||||||
|
return match.group(1)
|
||||||
|
return None
|
||||||
0
plugin.video.londonlive/resources/settings.xml
Normal file
12
plugin.video.wnhq/LICENSE.txt
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
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/>.
|
||||||
2
plugin.video.wnhq/README
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
Simply download the git, zip it as plugin.liveleak.zip and install like a normal zip.
|
||||||
|
|
||||||
19
plugin.video.wnhq/addon.xml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<addon id="plugin.video.wnhq"
|
||||||
|
name="WhiteNoiseHQ"
|
||||||
|
version="0.3"
|
||||||
|
provider-name="WNHQ">
|
||||||
|
<requires>
|
||||||
|
<import addon="xbmc.python" version="2.1.0"/>
|
||||||
|
</requires>
|
||||||
|
<extension point="xbmc.python.pluginsource"
|
||||||
|
library="default.py">
|
||||||
|
<provides>video</provides>
|
||||||
|
</extension>
|
||||||
|
<extension point="xbmc.addon.metadata">
|
||||||
|
<summary lang="en">White Noise HQ live on your TV!</summary>
|
||||||
|
<language>en</language>
|
||||||
|
<description lang="en">Keep up to date with the latest from everyone at White Noise HQ!</description>
|
||||||
|
<platform>all</platform>
|
||||||
|
</extension>
|
||||||
|
</addon>
|
||||||
175
plugin.video.wnhq/default.py
Normal file
@@ -0,0 +1,175 @@
|
|||||||
|
import sys
|
||||||
|
import urllib
|
||||||
|
import urlparse
|
||||||
|
import xbmcgui
|
||||||
|
import xbmcplugin
|
||||||
|
|
||||||
|
base_url = sys.argv[0]
|
||||||
|
addon_handle = int(sys.argv[1])
|
||||||
|
args = urlparse.parse_qs(sys.argv[2][1:])
|
||||||
|
|
||||||
|
xbmcplugin.setContent(addon_handle, 'movies')
|
||||||
|
|
||||||
|
def build_url(query):
|
||||||
|
return base_url + '?' + urllib.urlencode(query)
|
||||||
|
|
||||||
|
mode = args.get('mode', None)
|
||||||
|
|
||||||
|
if mode is None:
|
||||||
|
url = build_url({'mode': 'folder', 'foldername': 'Folder One'})
|
||||||
|
li = xbmcgui.ListItem('Live Radio (Audio)', iconImage='http://cdn.instructables.com/F21/3AKT/FX5571DH/F213AKTFX5571DH.MEDIUM.gif')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url,
|
||||||
|
listitem=li, isFolder=True)
|
||||||
|
|
||||||
|
url = build_url({'mode': 'folder6', 'foldername': 'Folder One'})
|
||||||
|
li = xbmcgui.ListItem('YouTube Live Streams (Audio & Video)', iconImage='http://cdn.instructables.com/F21/3AKT/FX5571DH/F213AKTFX5571DH.MEDIUM.gif')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url,
|
||||||
|
listitem=li, isFolder=True)
|
||||||
|
|
||||||
|
url = build_url({'mode': 'folder1', 'foldername': 'Folder Two'})
|
||||||
|
li = xbmcgui.ListItem('DJ Klass-A Radio Recordings', iconImage='http://static.house-mixes.com/s3/webmixes-images/accounts-410112/artwork/efa00ee9-1270-4820-92b3-0f502a85ced3.jpg/400/45/true')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url,
|
||||||
|
listitem=li, isFolder=True)
|
||||||
|
|
||||||
|
url = build_url({'mode': 'folder2', 'foldername': 'Folder Two'})
|
||||||
|
li = xbmcgui.ListItem('WhiteNoiseHQ Vs Ballistic Beats', iconImage='http://www.whitenoisehq.co.uk/v3/WN&BBFront.jpg')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url,
|
||||||
|
listitem=li, isFolder=True)
|
||||||
|
|
||||||
|
url = build_url({'mode': 'folder3', 'foldername': 'Folder Two'})
|
||||||
|
li = xbmcgui.ListItem('WhiteNoiseHQ - The Freeform Special', iconImage='http://farm5.static.flickr.com/4089/5040817729_d7d6efcb8e_b.jpg')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url,
|
||||||
|
listitem=li, isFolder=True)
|
||||||
|
|
||||||
|
url = build_url({'mode': 'folder4', 'foldername': 'Folder Two'})
|
||||||
|
li = xbmcgui.ListItem('Lady Brock - House Series', iconImage='http://static.house-mixes.com/s3/webmixes-images/accounts-88106/artwork/73c5708c-8276-4545-afd7-b367d8bc760d.jpg/360/45/true')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url,
|
||||||
|
listitem=li, isFolder=True)
|
||||||
|
|
||||||
|
url = build_url({'mode': 'folder5', 'foldername': 'Folder Two'})
|
||||||
|
li = xbmcgui.ListItem('White Noise HQ Recordings', iconImage='http://static.house-mixes.com/s3/webmixes-images/accounts-88106/artwork/73c5708c-8276-4545-afd7-b367d8bc760d.jpg/360/45/true')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url,
|
||||||
|
listitem=li, isFolder=True)
|
||||||
|
|
||||||
|
xbmcplugin.endOfDirectory(addon_handle)
|
||||||
|
|
||||||
|
elif mode[0] == 'folder':
|
||||||
|
foldername = args['foldername'][0]
|
||||||
|
url = 'http://whitenoisehq.co.uk/v3/RevoltLive.m3u'
|
||||||
|
li = xbmcgui.ListItem('Revolt Party - Live Stream', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
url = 'http://whitenoisehq.co.uk/v3/RevoltBot.m3u'
|
||||||
|
li = xbmcgui.ListItem('Revolt Party - AutoDJ', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
url = 'http://whitenoisehq.co.uk/v3/PLUR.pls'
|
||||||
|
li = xbmcgui.ListItem('Peace Love Unity Radio', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
xbmcplugin.endOfDirectory(addon_handle)
|
||||||
|
|
||||||
|
elif mode[0] == 'folder1':
|
||||||
|
foldername = args['foldername'][0]
|
||||||
|
url = 'http://lnd1.house-mixes.com/m/klass-a/3c081bc2-4404-45f7-8d2a-88f92441d77b.mp3'
|
||||||
|
li = xbmcgui.ListItem('DJ Klass-A - PLURadio 1st November 2014 (Hard House)', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
url = 'http://lnd1.house-mixes.com/m/klass-a/0db80df5-8568-4e87-9d44-20d4ec6ec77b.mp3'
|
||||||
|
li = xbmcgui.ListItem('DJ Klass-A - PLURadio 25th October 2014 (UK Hardcore)', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
url = 'http://lnd1.house-mixes.com/m/klass-a/be09b7e3-989c-4a0d-a7a8-d494096091d7.mp3'
|
||||||
|
li = xbmcgui.ListItem('DJ Klass-A with MC Tom Thumb - PLURadio 18th October 2014 (UK Hardcore)', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
url = 'http://lnd1.house-mixes.com/m/klass-a/f892c47f-e6d9-4e5a-800e-60c88854568a.mp3'
|
||||||
|
li = xbmcgui.ListItem('DJ Klass-A - Revolt Party 19th October 2014 (UK Hardcore)', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
url = 'http://lnd1.house-mixes.com/m/klass-a/11f7b6a5-1c3a-4904-b7ae-77a6a2d91a89.mp3'
|
||||||
|
li = xbmcgui.ListItem('DJ Klass-A - Revolt Party 12th October 2014 *(Gabba)', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
xbmcplugin.endOfDirectory(addon_handle)
|
||||||
|
|
||||||
|
elif mode[0] == 'folder2':
|
||||||
|
foldername = args['foldername'][0]
|
||||||
|
url = 'http://www.whitenoisehq.co.uk/v3/?dl_id=29'
|
||||||
|
li = xbmcgui.ListItem('Lady Brock b2b Double T @ White Noise HQ Vs Ballistic Beatz', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
url = 'http://www.whitenoisehq.co.uk/v3/?dl_id=27'
|
||||||
|
li = xbmcgui.ListItem('Klass A b2b Program @ White Noise HQ Vs Ballistic Beatz', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
url = 'http://www.whitenoisehq.co.uk/v3/?dl_id=28'
|
||||||
|
li = xbmcgui.ListItem('Kurt @ White Noise HQ Vs Ballistic Beatz', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
url = 'http://www.whitenoisehq.co.uk/v3/?dl_id=24'
|
||||||
|
li = xbmcgui.ListItem('Darwin @ White Noise HQ Vs Ballistic Beatz', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
url = 'http://www.whitenoisehq.co.uk/v3/?dl_id=26'
|
||||||
|
li = xbmcgui.ListItem('JB-C b2b Clodhopper @ White Noise HQ Vs Ballistic Beatz', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
url = 'http://www.whitenoisehq.co.uk/v3/?dl_id=30'
|
||||||
|
li = xbmcgui.ListItem('Lil Miss Detonate b2b Bernzey @ White Noise HQ Vs Ballistic Beatz', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
url = 'http://www.whitenoisehq.co.uk/v3/?dl_id=25'
|
||||||
|
li = xbmcgui.ListItem('Hoodzie b2b Vapour @ White Noise HQ Vs Ballistic Beatz', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
url = 'http://www.whitenoisehq.co.uk/v3/?dl_id=32'
|
||||||
|
li = xbmcgui.ListItem('Mizel @ White Noise HQ Vs Ballistic Beatz', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
url = 'http://www.whitenoisehq.co.uk/v3/?dl_id=31'
|
||||||
|
li = xbmcgui.ListItem('Hoodzie b2b Distortion @ White Noise HQ Vs Ballistic Beatz', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
xbmcplugin.endOfDirectory(addon_handle)
|
||||||
|
|
||||||
|
elif mode[0] == 'folder3':
|
||||||
|
foldername = args['foldername'][0]
|
||||||
|
url = 'http://www.whitenoisehq.co.uk/v3/?dl_id=36'
|
||||||
|
li = xbmcgui.ListItem('Kevin Energy @ White Noise HQ - The Freeform Special', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
url = 'http://www.whitenoisehq.co.uk/v3/?dl_id=39'
|
||||||
|
li = xbmcgui.ListItem('Nick235 @ White Noise HQ - The Freeform Special', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
url = 'http://www.whitenoisehq.co.uk/v3/?dl_id=38'
|
||||||
|
li = xbmcgui.ListItem('Lady Brock @ White Noise HQ - The Freeform Special', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
url = 'http://www.whitenoisehq.co.uk/v3/?dl_id=33'
|
||||||
|
li = xbmcgui.ListItem('Solution @ White Noise HQ - The Freeform Special', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
url = 'http://www.whitenoisehq.co.uk/v3/?dl_id=35'
|
||||||
|
li = xbmcgui.ListItem('Greg Peaks & Pinnacle @ White Noise HQ - The Freeform Special', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
url = 'http://www.whitenoisehq.co.uk/v3/?dl_id=37'
|
||||||
|
li = xbmcgui.ListItem('Klass-A & Program @ White Noise HQ - The Freeform Special', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
url = 'http://www.whitenoisehq.co.uk/v3/?dl_id=34'
|
||||||
|
li = xbmcgui.ListItem('Double T @ White Noise HQ - The Freeform Special', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
xbmcplugin.endOfDirectory(addon_handle)
|
||||||
|
|
||||||
|
elif mode[0] == 'folder4':
|
||||||
|
foldername = args['foldername'][0]
|
||||||
|
url = 'http://lnd1.house-mixes.com/m/lady%20brock/dab511e3-c2ae-4418-b658-cb71ec528032.mp3'
|
||||||
|
li = xbmcgui.ListItem('Lady Brock - House Series - 001 Tech & Progressive', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
url = 'http://lnd1.house-mixes.com/m/lady%20brock/54bac03a-a1dc-4e9f-8d37-95581a1c9792.mp3'
|
||||||
|
li = xbmcgui.ListItem('Lady Brock - House Series - 002 Electro', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
xbmcplugin.endOfDirectory(addon_handle)
|
||||||
|
|
||||||
|
elif mode[0] == 'folder5':
|
||||||
|
foldername = args['foldername'][0]
|
||||||
|
url = 'http://www.whitenoisehq.co.uk/v3/wnhq001.m3u'
|
||||||
|
li = xbmcgui.ListItem('[WNHQ001] Lady Brock Vs Sc@r - Muppet (UK Hardcore)', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
url = 'http://www.whitenoisehq.co.uk/v3/wnhq002.m3u'
|
||||||
|
li = xbmcgui.ListItem('[WNHQ002] Double T - Lil Fluffy Cloudz (Drum n Bass)', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
url = 'http://www.whitenoisehq.co.uk/v3/wnhq003.m3u'
|
||||||
|
li = xbmcgui.ListItem('[WNHQ003] Force & Styles - Field Of Dreams (Firestrike Drumstep Remix) (Drumstep)', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
xbmcplugin.endOfDirectory(addon_handle)
|
||||||
|
|
||||||
|
elif mode[0] == 'folder6':
|
||||||
|
foldername = args['foldername'][0]
|
||||||
|
url = 'http://www.whitenoisehq.co.uk/v3/YouTube2.m3u'
|
||||||
|
li = xbmcgui.ListItem('[WNHQ Live] DJ Klass-A : Miss-Judged : Double T (UK Hardcore)', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
url = 'http://www.whitenoisehq.co.uk/v3/YouTube.m3u'
|
||||||
|
li = xbmcgui.ListItem('[WNHQ Live] DJ Klass-A - Hard House Power Hour (Hard House)', iconImage='DefaultVideo.png')
|
||||||
|
xbmcplugin.addDirectoryItem(handle=addon_handle, url=url, listitem=li)
|
||||||
|
xbmcplugin.endOfDirectory(addon_handle)
|
||||||
22
plugin.video.wnhq/dummy.xml
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<scraper name="dummy" content="movies" thumb="imdb.gif" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
|
<NfoUrl dest="3">
|
||||||
|
<RegExp input="$$1" output="\1" dest="3">
|
||||||
|
<expression></expression>
|
||||||
|
</RegExp>
|
||||||
|
</NfoUrl>
|
||||||
|
<CreateSearchUrl dest="3">
|
||||||
|
<RegExp input="$$1" output="<url>http://www.nada.com</url>" dest="3">
|
||||||
|
<expression></expression>
|
||||||
|
</RegExp>
|
||||||
|
</CreateSearchUrl>
|
||||||
|
<GetSearchResults dest="8">
|
||||||
|
<RegExp input="$$1" output="<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?><results><entity><title>Dummy</title><url>http://www.nada.com</url></entity>" dest="8">
|
||||||
|
<expression></expression>
|
||||||
|
</RegExp>
|
||||||
|
</GetSearchResults>
|
||||||
|
<GetDetails dest="3">
|
||||||
|
<RegExp input="$$1" output="<details><title>The Dummy Movie</title><year>2008</year><director>Dummy Dumb</director><tagline>Some dumb dummies</tagline><credits>Dummy Dumb</credits><actor><name>Dummy Dumb</name><role>The dumb dummy</role></actor><outline></outline><plot>Some dummies doing dumb things</plot></details>" dest="3">
|
||||||
|
<expression></expression>
|
||||||
|
</RegExp>
|
||||||
|
</GetDetails>
|
||||||
|
</scraper>
|
||||||
BIN
plugin.video.wnhq/fanart.jpg
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
BIN
plugin.video.wnhq/icon.png
Normal file
|
After Width: | Height: | Size: 1.9 MiB |
4
plugin.video.wnhq/resources/settings.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
|
||||||
|
<settings>
|
||||||
|
<setting id="my_setting" type="bool" default="true" label="My Setting"/>
|
||||||
|
</settings>
|
||||||
@@ -1,5 +1,47 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<addons>
|
<addons>
|
||||||
|
<addon id="plugin.audio.kissfm" name="Kiss FM UK" version="0.2" provider-name="DoubleT">
|
||||||
|
<requires>
|
||||||
|
<import addon="xbmc.python" version="2.1.0"/>
|
||||||
|
</requires>
|
||||||
|
<extension point="xbmc.python.pluginsource" library="addon.py">
|
||||||
|
<provides>audio</provides>
|
||||||
|
</extension>
|
||||||
|
<extension point="xbmc.addon.metadata">
|
||||||
|
<summary lang="en">Kiss FM UK - Live Stream</summary>
|
||||||
|
<description lang="en">KissFMUK.com</description>
|
||||||
|
<disclaimer lang="en"></disclaimer>
|
||||||
|
<language>English</language>
|
||||||
|
<platform>all</platform>
|
||||||
|
<license></license>
|
||||||
|
<forum></forum>
|
||||||
|
<website>http://www.kissfmuk.com</website>
|
||||||
|
<email>oli@whitenoisehq.co.uk</email>
|
||||||
|
<source></source>
|
||||||
|
</extension>
|
||||||
|
</addon>
|
||||||
|
|
||||||
|
<addon id="plugin.audio.rinsefm" name="Rinse.FM" version="0.2" provider-name="DoubleT">
|
||||||
|
<requires>
|
||||||
|
<import addon="xbmc.python" version="2.1.0"/>
|
||||||
|
</requires>
|
||||||
|
<extension point="xbmc.python.pluginsource" library="addon.py">
|
||||||
|
<provides>audio</provides>
|
||||||
|
</extension>
|
||||||
|
<extension point="xbmc.addon.metadata">
|
||||||
|
<summary lang="en">Rinse.FM - Live Stream</summary>
|
||||||
|
<description lang="en">RinseFM live from Brick Lane, London</description>
|
||||||
|
<disclaimer lang="en"></disclaimer>
|
||||||
|
<language>English</language>
|
||||||
|
<platform>all</platform>
|
||||||
|
<license></license>
|
||||||
|
<forum></forum>
|
||||||
|
<website>http://rinse.fm</website>
|
||||||
|
<email>oli@whitenoisehq.co.uk</email>
|
||||||
|
<source></source>
|
||||||
|
</extension>
|
||||||
|
</addon>
|
||||||
|
|
||||||
<addon id="plugin.video.blogscraper" name="VidGrab" version="0.0.1" provider-name="Oli Passey">
|
<addon id="plugin.video.blogscraper" name="VidGrab" version="0.0.1" provider-name="Oli Passey">
|
||||||
<requires>
|
<requires>
|
||||||
<import addon="xbmc.python" version="2.19.0" />
|
<import addon="xbmc.python" version="2.19.0" />
|
||||||
@@ -21,6 +63,46 @@
|
|||||||
</extension>
|
</extension>
|
||||||
</addon>
|
</addon>
|
||||||
|
|
||||||
|
<addon id="plugin.video.londonlive" name="London Live" version="0.4" provider-name="DoubleT">
|
||||||
|
<requires>
|
||||||
|
<import addon="xbmc.python" version="2.1.0"/>
|
||||||
|
</requires>
|
||||||
|
<extension point="xbmc.python.pluginsource" library="addon.py">
|
||||||
|
<provides>video</provides>
|
||||||
|
</extension>
|
||||||
|
<extension point="xbmc.addon.metadata">
|
||||||
|
<summary lang="en">London Live - Live Stream</summary>
|
||||||
|
<description lang="en">LondonLive.co.uk</description>
|
||||||
|
<disclaimer lang="en"></disclaimer>
|
||||||
|
<language>English</language>
|
||||||
|
<platform>all</platform>
|
||||||
|
<license></license>
|
||||||
|
<forum>http://forum.xbmc.org/showthread.php?tid=190935</forum>
|
||||||
|
<website>http://www.londonlive.co.uk</website>
|
||||||
|
<email>oli@whitenoisehq.co.uk</email>
|
||||||
|
<source></source>
|
||||||
|
</extension>
|
||||||
|
</addon>
|
||||||
|
|
||||||
|
<addon id="plugin.video.wnhq"
|
||||||
|
name="WhiteNoiseHQ"
|
||||||
|
version="0.3"
|
||||||
|
provider-name="WNHQ">
|
||||||
|
<requires>
|
||||||
|
<import addon="xbmc.python" version="2.1.0"/>
|
||||||
|
</requires>
|
||||||
|
<extension point="xbmc.python.pluginsource"
|
||||||
|
library="default.py">
|
||||||
|
<provides>video</provides>
|
||||||
|
</extension>
|
||||||
|
<extension point="xbmc.addon.metadata">
|
||||||
|
<summary lang="en">White Noise HQ live on your TV!</summary>
|
||||||
|
<language>en</language>
|
||||||
|
<description lang="en">Keep up to date with the latest from everyone at White Noise HQ!</description>
|
||||||
|
<platform>all</platform>
|
||||||
|
</extension>
|
||||||
|
</addon>
|
||||||
|
|
||||||
<addon id="repository.olipassey" name="olipassey's kodi repo" version="0.0.1" provider-name="Oli Passey">
|
<addon id="repository.olipassey" name="olipassey's kodi repo" version="0.0.1" provider-name="Oli Passey">
|
||||||
<extension point="xbmc.addon.repository" name="olipassey's kodi repo">
|
<extension point="xbmc.addon.repository" name="olipassey's kodi repo">
|
||||||
<dir>
|
<dir>
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
e3d70faa82043b4470f2617931f13613
|
a7bc395704ae09a3cf72205b65f2acfc
|
||||||
21
zips/plugin.audio.kissfm/addon.xml
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<addon id="plugin.audio.kissfm" name="Kiss FM UK" version="0.2" provider-name="DoubleT">
|
||||||
|
<requires>
|
||||||
|
<import addon="xbmc.python" version="2.1.0"/>
|
||||||
|
</requires>
|
||||||
|
<extension point="xbmc.python.pluginsource" library="addon.py">
|
||||||
|
<provides>audio</provides>
|
||||||
|
</extension>
|
||||||
|
<extension point="xbmc.addon.metadata">
|
||||||
|
<summary lang="en">Kiss FM UK - Live Stream</summary>
|
||||||
|
<description lang="en">KissFMUK.com</description>
|
||||||
|
<disclaimer lang="en"></disclaimer>
|
||||||
|
<language>English</language>
|
||||||
|
<platform>all</platform>
|
||||||
|
<license></license>
|
||||||
|
<forum></forum>
|
||||||
|
<website>http://www.kissfmuk.com</website>
|
||||||
|
<email>oli@whitenoisehq.co.uk</email>
|
||||||
|
<source></source>
|
||||||
|
</extension>
|
||||||
|
</addon>
|
||||||
BIN
zips/plugin.audio.kissfm/fanart.jpg
Normal file
|
After Width: | Height: | Size: 46 KiB |
BIN
zips/plugin.audio.kissfm/plugin.audio.kissfm-0.2.zip
Normal file
21
zips/plugin.audio.rinsefm/addon.xml
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<addon id="plugin.audio.rinsefm" name="Rinse.FM" version="0.2" provider-name="DoubleT">
|
||||||
|
<requires>
|
||||||
|
<import addon="xbmc.python" version="2.1.0"/>
|
||||||
|
</requires>
|
||||||
|
<extension point="xbmc.python.pluginsource" library="addon.py">
|
||||||
|
<provides>audio</provides>
|
||||||
|
</extension>
|
||||||
|
<extension point="xbmc.addon.metadata">
|
||||||
|
<summary lang="en">Rinse.FM - Live Stream</summary>
|
||||||
|
<description lang="en">RinseFM live from Brick Lane, London</description>
|
||||||
|
<disclaimer lang="en"></disclaimer>
|
||||||
|
<language>English</language>
|
||||||
|
<platform>all</platform>
|
||||||
|
<license></license>
|
||||||
|
<forum></forum>
|
||||||
|
<website>http://rinse.fm</website>
|
||||||
|
<email>oli@whitenoisehq.co.uk</email>
|
||||||
|
<source></source>
|
||||||
|
</extension>
|
||||||
|
</addon>
|
||||||
BIN
zips/plugin.audio.rinsefm/fanart.jpg
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
zips/plugin.audio.rinsefm/plugin.audio.rinsefm-0.2.zip
Normal file
21
zips/plugin.video.londonlive/addon.xml
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<addon id="plugin.video.londonlive" name="London Live" version="0.4" provider-name="DoubleT">
|
||||||
|
<requires>
|
||||||
|
<import addon="xbmc.python" version="2.1.0"/>
|
||||||
|
</requires>
|
||||||
|
<extension point="xbmc.python.pluginsource" library="addon.py">
|
||||||
|
<provides>video</provides>
|
||||||
|
</extension>
|
||||||
|
<extension point="xbmc.addon.metadata">
|
||||||
|
<summary lang="en">London Live - Live Stream</summary>
|
||||||
|
<description lang="en">LondonLive.co.uk</description>
|
||||||
|
<disclaimer lang="en"></disclaimer>
|
||||||
|
<language>English</language>
|
||||||
|
<platform>all</platform>
|
||||||
|
<license></license>
|
||||||
|
<forum>http://forum.xbmc.org/showthread.php?tid=190935</forum>
|
||||||
|
<website>http://www.londonlive.co.uk</website>
|
||||||
|
<email>oli@whitenoisehq.co.uk</email>
|
||||||
|
<source></source>
|
||||||
|
</extension>
|
||||||
|
</addon>
|
||||||
BIN
zips/plugin.video.londonlive/fanart.jpg
Normal file
|
After Width: | Height: | Size: 44 KiB |
BIN
zips/plugin.video.londonlive/plugin.video.londonlive-0.4.zip
Normal file
19
zips/plugin.video.wnhq/addon.xml
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<addon id="plugin.video.wnhq"
|
||||||
|
name="WhiteNoiseHQ"
|
||||||
|
version="0.3"
|
||||||
|
provider-name="WNHQ">
|
||||||
|
<requires>
|
||||||
|
<import addon="xbmc.python" version="2.1.0"/>
|
||||||
|
</requires>
|
||||||
|
<extension point="xbmc.python.pluginsource"
|
||||||
|
library="default.py">
|
||||||
|
<provides>video</provides>
|
||||||
|
</extension>
|
||||||
|
<extension point="xbmc.addon.metadata">
|
||||||
|
<summary lang="en">White Noise HQ live on your TV!</summary>
|
||||||
|
<language>en</language>
|
||||||
|
<description lang="en">Keep up to date with the latest from everyone at White Noise HQ!</description>
|
||||||
|
<platform>all</platform>
|
||||||
|
</extension>
|
||||||
|
</addon>
|
||||||
BIN
zips/plugin.video.wnhq/fanart.jpg
Normal file
|
After Width: | Height: | Size: 1.1 MiB |
BIN
zips/plugin.video.wnhq/icon.png
Normal file
|
After Width: | Height: | Size: 1.9 MiB |