The branch, eden has been updated
via 7d6db398d9d63acf2e106da794682eecc960810d (commit)
via 262ef1190d2b60ee9c3b5e86bba0c265304262ef (commit)
via c69f11883c93aa374f956eb24b75205c088b4439 (commit)
from 5f0347fe3f375f23c5defa492fdd14dd560ba042 (commit)
- Log -----------------------------------------------------------------
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=7d6db398d9d63acf2e106da794682eecc960810d
commit 7d6db398d9d63acf2e106da794682eecc960810d
Author: spiff <[email protected]>
Date: Sun Mar 18 15:02:16 2012 +0100
[plugin.video.pakee] updated to version 1.0.9
diff --git a/plugin.video.pakee/addon.xml b/plugin.video.pakee/addon.xml
index d880d15..52b722d 100644
--- a/plugin.video.pakee/addon.xml
+++ b/plugin.video.pakee/addon.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="plugin.video.pakee"
name="Pakee"
- version="1.0.6"
+ version="1.0.9"
provider-name="pakee">
<requires>
<import addon="xbmc.python" version="2.0"/>
diff --git a/plugin.video.pakee/changelog.txt b/plugin.video.pakee/changelog.txt
index 5b8b3b2..6d08cd1 100644
--- a/plugin.video.pakee/changelog.txt
+++ b/plugin.video.pakee/changelog.txt
@@ -1,3 +1,20 @@
+[B]Version 1.0.9[/B]
+- Added support for http:// live streams from desistreams.xml (fixes Apna, Qtv)
+
+
+[B]Version 1.0.8[/B]
+
+- Added urdu channels from roshantv.com to both the desistreams repository and
pakee plugin:
+ARY Digital, Express Entertainment, Geo Entertainment, Hum Tv,Kashmir TV,
nVibeTv, Sohni Dharti, PTV Sports, 8x music
+- Fixed streams from http://bglive-a.bitgravity.com
+
+
+
+[B]Version 1.0.7[/B]
+- Added other desi streams under "Live TV Channels" category from
desistreams.googlecode.com (courtesy of angelworld...Thanks!)
+- Fixed Geo News stream (now streamed from their Youtube channel)
+
+
[B]Version 1.0.6[/B]
- Added cricket streams under "Live TV Channels" category
- Added support for rtsp streams
@@ -10,7 +27,7 @@
[B]Version 1.0.4[/B]
-- Added live channel streams (courtesy of yacir Thanks!)
+- Added live channel streams (courtesy of yacir...Thanks!)
- Set default sorting to be by title for drama episodes
[B]Version 1.0.3[/B]
diff --git a/plugin.video.pakee/default.py b/plugin.video.pakee/default.py
index c83c3ec..d7ac10c 100644
--- a/plugin.video.pakee/default.py
+++ b/plugin.video.pakee/default.py
@@ -9,10 +9,10 @@ __plugin__ = 'Pakee'
__author__ = '[email protected]'
__url__ = 'http://code.google.com/p/pakee/'
__date__ = '01-04-2011'
-__version__ = '1.0.6'
+__version__ = '1.0.9'
__settings__ = xbmcaddon.Addon(id='plugin.video.pakee')
__rooturl__ = 'http://pakee.hopto.org/pakee/pakee.php?id=xbmc&z=9'
-#__rooturl__ = 'http://pakee.hopto.org/pakee/pakee-test.xml?x=5'
+#__rooturl__ = 'http://pakee.hopto.org/pakee/pakee-test.xml?a=5'
__language__ = __settings__.getLocalizedString
#plugin modes
@@ -191,6 +191,7 @@ def build_show_directory(origurl):
itemCount=0
+ #for testing mast.tv streams (doesn't work as the stream uses .wsx)
if origurl == __rooturl__ and 'pakee-test.xml' in __rooturl__:
html =
open_url("http://www.mast.tv/embed.php?stream=humtv&location=france")
match=re.compile('<param name="URL"
value="(.+?)">').findall(html)
@@ -211,6 +212,15 @@ def build_show_directory(origurl):
#image = re.compile('class="thumbnail"><img src="(.+?)"
/></a>').findall(shows)
#plot = common.parseDOM(shows, "p", attrs = { "class":
"description" })
+ #On live streams page, add the Geo News youtube live feed
+ if 'desistreams.googlecode.com' in origurl:
+ isFolder = False
+ geoguid = 'sOg5KS7M13s'
+ listitem = xbmcgui.ListItem( label = 'Geo News', iconImage =
'http://images.wikia.com/logopedia/images/e/e9/Geo_News.png', thumbnailImage =
'http://images.wikia.com/logopedia/images/e/e9/Geo_News.png' )
+ u = sys.argv[0] + "?mode=" + str(PLUGIN_MODE_PLAY_YT_VIDEO) +
"&name=" + urllib.quote_plus( "Geo News" ) + "&url=" + urllib.quote_plus(
geoguid ) + "&index=" + str(itemCount)
+ xbmcplugin.addDirectoryItem( handle = int( sys.argv[1] ), url =
u, listitem = listitem, isFolder = isFolder )
+
+
for item in items:
@@ -308,7 +318,7 @@ def build_show_directory(origurl):
url = origurl
- if 'rtmp://' in url or 'mms://' in url or 'rtsp://' in
url:
+ if 'rtmp://' in url or 'mms://' in url or 'rtsp://' in
url or 'desistreams.xml' in origurl:
isFolder = False
mode = PLUGIN_MODE_PLAY_STREAM
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=262ef1190d2b60ee9c3b5e86bba0c265304262ef
commit 262ef1190d2b60ee9c3b5e86bba0c265304262ef
Author: spiff <[email protected]>
Date: Sun Mar 18 14:53:40 2012 +0100
[plugin.video.mediathek] updated to version 0.4.1
diff --git a/plugin.video.mediathek/addon.xml b/plugin.video.mediathek/addon.xml
index 67ff652..b6c084d 100644
--- a/plugin.video.mediathek/addon.xml
+++ b/plugin.video.mediathek/addon.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<addon
id="plugin.video.mediathek"
- version="0.4.1"
+ version="0.4.2"
name="Mediathek"
provider-name="Raptor 2101 [[email protected]]">
<requires>
diff --git a/plugin.video.mediathek/changelog.txt
b/plugin.video.mediathek/changelog.txt
index 5a34b97..484756a 100644
--- a/plugin.video.mediathek/changelog.txt
+++ b/plugin.video.mediathek/changelog.txt
@@ -1,3 +1,5 @@
+0.4.2 - FIX: WDR add search function, add stream duration, add "pageSize"
optioni (Soern)
+ FIX: bayrisches FS podcasts eingefügt, Auswahl nach Sendungen, Suche
(Soern)
0.4.1 - FIX: Soern completed the NDR implementation
0.4.0 - FIX: Commit FIX from soern
0.3.9 - ADD: KIKA (Without Kikaninchen)
diff --git a/plugin.video.mediathek/mediathek/bayerisches.py
b/plugin.video.mediathek/mediathek/bayerisches.py
index 425ad04..78f4ad1 100644
--- a/plugin.video.mediathek/mediathek/bayerisches.py
+++ b/plugin.video.mediathek/mediathek/bayerisches.py
@@ -29,7 +29,7 @@ class BayerischesFSMediathek(Mediathek):
def name(self):
return "BayernFS";
def isSearchable(self):
- return False;
+ return True;
def __init__(self, simpleXbmcGui):
self.gui = simpleXbmcGui;
@@ -38,19 +38,20 @@ class BayerischesFSMediathek(Mediathek):
else:
self.baseType = "rtsp_mov_http"
+ self.channel = "bfs"
+ #self.channel = "bfsalpha"
+
self.root_url="http://mediathek-video.br.de/js/config.js";
self.regexp_findArchive=re.compile("http://.*/archive/archive\.xml\.zip\.adler32");
- self.menuTree = (
- TreeNode("0","Alle","http://LoadAll",True),
- );
-
-
- def buildPageMenu(self, link, initCount):
- self.gui.log("buildPageMenu: "+link);
-
+ self.menuTree = [
+ TreeNode("0","Alle","LoadAll",True),
+ TreeNode("1","Alle Mitschnitte","LoadAusstrahlung",True),
+ TreeNode("2","Alle Podcasts","LoadPodcasts",True),
+ ];
+
+ #Zip Archiv einlesen
a=self.loadAndUnzip();
- print a
try:
self.xml_cont = minidom.parseString(a);
except:
@@ -58,14 +59,73 @@ class BayerischesFSMediathek(Mediathek):
TreeNode("0","Plugin Broken, Sry ;)","http://LoadAll",False,initCount),
);
return;
- displayItems=[];
+
+ #Alle Sendungen einlesen
+ self.broadcasts = {}
+ for itemNode in
self.xml_cont.getElementsByTagName("sendungen")[0].getElementsByTagName("sendung"):
+ broadcast = self.extractBroadcastInformation(itemNode);
+ self.broadcasts[broadcast['id']] = broadcast;
+
+ #Sendungen raussuchen, für die es Mitschnitte gibt
+ self.sendungen = {}
for itemNode in self.xml_cont.getElementsByTagName("ausstrahlung"):
- displayItem = self.extractVideoInformation(itemNode);
- if(displayItem is not None):
- displayItems.append(displayItem);
+ sender = itemNode.getAttribute("sender");
+ sendung = self.readText(itemNode,"sendung")
+ if not self.broadcasts[sendung]['sender']:
+ self.broadcasts[sendung]['sender'] = sender
+ if self.broadcasts[sendung]['sender'] != self.channel:
+ self.broadcasts[sendung]['display'] = False
+ else:
+ videos = itemNode.getElementsByTagName("videos")[0];
+ if videos.hasChildNodes():
+ self.broadcasts[sendung]['display'] = True
+
+ #Sendungen anzeigen
+ displayItems=[];
+ for broadcast in self.broadcasts.itervalues():
+ if broadcast['display']:
+ displayItems.append(broadcast);
+
+ x=3
+ for displayItem in sorted(displayItems, key = lambda
item:item['name'].lower(), reverse=False):
+
self.menuTree.append(TreeNode(str(x),displayItem['name'],displayItem['id'],True));
+ x = x+1
+
+ def buildPageMenu(self, link, initCount, searchText = ""):
+ self.gui.log("buildPageMenu: "+link);
+ displayItems=[];
+ if not link == "LoadPodcasts":
+ #Mitschnitte
+ for itemNode in self.xml_cont.getElementsByTagName("ausstrahlung"):
+ sendung = self.readText(itemNode,"sendung")
+ if self.broadcasts[sendung]['sender'] == self.channel:
+ if link == "LoadAusstrahlung" or link == "LoadAll" or link ==
"LoadSearch" or link == sendung:
+ picture = self.broadcasts[sendung]["node"].getAttribute("bild")
+ displayItem = self.extractVideoInformation(itemNode, picture,
searchText);
+ if(displayItem is not None):
+ displayItems.append(displayItem);
+ if not link == "LoadAusstrahlung":
+ #Podcasts
+ for itemNode in self.broadcasts.itervalues():
+ if itemNode['sender'] == self.channel:
+ if link == "LoadAll" or link == "LoadPodcasts" or link ==
"LoadSearch" or link == itemNode['id'] :
+ if
itemNode["node"].getElementsByTagName("podcasts")[0].hasChildNodes():
+ podcasts = itemNode["node"]
+ for podcastFeed in
podcasts.getElementsByTagName("podcasts")[0].getElementsByTagName("feed"):
+ picture = self.readText(podcastFeed,"image")
+ for podcastNode in podcastFeed.getElementsByTagName("podcast"):
+ displayItem =
self.extractPodcastInformation(podcastNode,picture, searchText);
+ if(displayItem is not None):
+ displayItems.append(displayItem);
+
itemCount = len(displayItems) +initCount
for displayItem in sorted(displayItems, key = lambda item:item.date,
reverse=True):
self.gui.buildVideoLink(displayItem,self,itemCount);
+
+ def searchVideo(self, searchText):
+ searchText = searchText.lower()
+ self.buildPageMenu("LoadSearch", 0, searchText)
+
def readText(self,node,textNode):
try:
node = node.getElementsByTagName(textNode)[0].firstChild;
@@ -112,41 +172,45 @@ class BayerischesFSMediathek(Mediathek):
def parseDate(self,dateString):
return time.strptime(dateString,"%Y-%m-%dT%H:%M:%S");
+
+ def extractBroadcastInformation(self,itemNode):
+ broadcast = {}
+ broadcast["id"] = itemNode.getAttribute("id")
+ broadcast["name"] = itemNode.getAttribute("name")
+ broadcast["bild"] = itemNode.getAttribute("bild")
+ broadcast["sender"] = None
+ if itemNode.getElementsByTagName("podcasts")[0].hasChildNodes() and
self.channel == "bfs":
+ broadcast["display"] = True
+ else:
+ broadcast["display"] = False
+ broadcast["node"] = itemNode
+ return broadcast
- def extractVideoInformation(self, itemNode):
+ def extractVideoInformation(self, itemNode, picture = "", searchText = ""):
title = self.readText(itemNode,"titel");
dateString = self.readText(itemNode,"beginnPlan");
pubDate = self.parseDate(dateString);
- try:
- subtitle = self.readText(itemNode,"nebentitel");
- except:
- subtitle = "";
+ subtitle = self.readText(itemNode,"nebentitel");
+
+ description = self.readText(itemNode,"beschreibung");
- try:
- description = self.readText(itemNode,"beschreibung");
- except:
- description = "";
- try:
- picture = self.readText(itemNode,"bild");
- except:
- picture="";
-
+ if not searchText == "":
+ if not searchText in title.lower() and not searchText in
description.lower():
+ return None;
+
links = {};
- links[0] = SimpleLink("broken", 0);
- links[1] = SimpleLink("broken", 0);
- links[2] = SimpleLink("broken", 0);
try:
videos = itemNode.getElementsByTagName("videos")[0];
if not videos.hasChildNodes():
- print "no videos";
+ #print "no videos";
return None;
for videotag in videos.getElementsByTagName("video"):
- print videotag.attributes;
+ #print videotag.attributes;
if (not videotag.hasAttribute("host")):
return None;
link = "rtmp://" + videotag.attributes["host"].value + "/" +
videotag.attributes["application"].value + "/";
@@ -164,6 +228,34 @@ class BayerischesFSMediathek(Mediathek):
return None;
- return DisplayObject(title,subtitle,picture,description,links,True,
pubDate)
+ startBei = (self.readText(itemNode,"startBei"));
+ endeBei = (self.readText(itemNode,"endeBei"));
+
+ duration = 0
+ if startBei.strip() and endeBei.strip():
+ duration = str((int(endeBei)+int(startBei))/1000)
+
+ return DisplayObject(title,subtitle,picture,description,links,True,
pubDate, duration)
+
+ def extractPodcastInformation(self, itemNode, picture = "", searchText = ""):
+ title = self.readText(itemNode,"title");
+
+ dateString = self.readText(itemNode,"pubdate");
+ pubDate = self.parseDate(dateString);
+
+ description = self.readText(itemNode,"description");
+
+ duration = self.readText(itemNode,"duration");
+
+ link =
itemNode.getElementsByTagName("enclosure")[0].getAttribute("streamurl");
+
+ links = {};
+ links[0] = SimpleLink(link, 0);
+
+ if not searchText == "":
+ if not searchText in title.lower() and not searchText in
description.lower():
+ return None;
+
+ return DisplayObject(title,"",picture,description,links,True, pubDate,
duration)
diff --git a/plugin.video.mediathek/mediathek/wdr.py
b/plugin.video.mediathek/mediathek/wdr.py
index 69e0538..6d99c53 100644
--- a/plugin.video.mediathek/mediathek/wdr.py
+++ b/plugin.video.mediathek/mediathek/wdr.py
@@ -22,6 +22,7 @@ regex_dateString = re.compile("\\d{4}-\\d{2}-\\d{2}");
class WDRMediathek(Mediathek):
def __init__(self, simpleXbmcGui):
self.gui = simpleXbmcGui;
+ self.pageSize = 20; #max 49;
self.rootLink = "http://www.wdr.de"
self.menuTree = (
TreeNode("0","Neuste
Videos",self.rootLink+"/mediathek/rdf/regional/index.xml",True),
@@ -109,10 +110,11 @@ class WDRMediathek(Mediathek):
)
- self._regex_extractTitle = re.compile("<title>.*?</title>");
+ self._regex_extractTitle = re.compile("<h1>.*?<span class=\"inv\">");
self._regex_extractDescription = re.compile("<meta name=\"description\"
content=\"(.|\\s)*?\" />");
self._regex_extractPicture = re.compile("<link rel=\"image_src\"
href=\".*?\" />");
self._regex_extractDate = re.compile("<meta name=\"DC.Date\"
content=\".*?\" />");
+ self._regex_extractDuration = re.compile("\\((.*)\\)<span class=\"inv\">");
self._regex_extractVideoPage = re.compile("<a
href=\"/mediathek/html/.*?\\.xml\" title=\".*?\".*?>");
self._regex_extractLink = re.compile("/mediathek/html/.*?\\.xml");
@@ -124,6 +126,7 @@ class WDRMediathek(Mediathek):
self.replace_html = re.compile("<.*?>");
self.replace_tag = re.compile("(<meta name=\".*?\" content=\"|<link
rel=\"image_src\" href=\"|\" />)");
+ self.searchLink =
"http://www.wdr.de/mediathek/html/regional/suche/index.xml?wsSucheAusgabe=liste&wsSucheSuchart=volltext&wsSucheMedium=av&suche_submit=Suche+starten&wsSucheBegriff="
@@ -131,14 +134,16 @@ class WDRMediathek(Mediathek):
def name(self):
return "WDR";
def isSearchable(self):
- return False;
+ return True;
def searchVideo(self, searchText):
- pass;
+ link = self.searchLink+searchText;
+ self.buildPageMenu(link, 0, False)
def buildPageMenu(self, link, initCount, subLink = False):
+ link = link+"&rankingcount="+str(self.pageSize);
self.gui.log("MenuLink: %s"%link);
mainPage = self.loadPage(link);
@@ -181,6 +186,7 @@ class WDRMediathek(Mediathek):
description =
unicode(self._regex_extractDescription.search(mainPage).group(),'ISO-8859-1');
picture =
unicode(self._regex_extractPicture.search(mainPage).group(),'ISO-8859-1');
date = self._regex_extractDate.search(mainPage).group();
+ duration = self._regex_extractDuration.search(mainPage).group(1);
title = self.replace_html.sub("", title);
description = self.replace_tag.sub("",description);
@@ -201,7 +207,7 @@ class WDRMediathek(Mediathek):
linkString = self._regex_extractAudioLink.search(mainPage).group();
links[0] = self.extractLink(linkString);
- return DisplayObject(title,"",picture,description,links,True, date)
+ return DisplayObject(title,"",picture,description,links,True, date,
duration)
def extractLink(self, linkString):
if(linkString.find("mediartmp://")>-1):
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=c69f11883c93aa374f956eb24b75205c088b4439
commit c69f11883c93aa374f956eb24b75205c088b4439
Author: spiff <[email protected]>
Date: Sun Mar 18 14:52:52 2012 +0100
[plugin.audio.sverigesradio] updated to version 0.1.1
diff --git a/plugin.audio.sverigesradio/addon.xml
b/plugin.audio.sverigesradio/addon.xml
index 642a135..0e21139 100644
--- a/plugin.audio.sverigesradio/addon.xml
+++ b/plugin.audio.sverigesradio/addon.xml
@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="plugin.audio.sverigesradio"
name="Sveriges Radio"
- version="0.1.0"
+ version="0.0.5"
provider-name="Popeye, Daniel">
<requires>
- <import addon="xbmc.python" version="2.0"/>
+ <import addon="xbmc.python" version="1.0"/>
</requires>
<extension point="xbmc.python.pluginsource" library="default.py">
<provides>audio</provides>
diff --git a/plugin.audio.sverigesradio/default.py
b/plugin.audio.sverigesradio/default.py
index f946166..00e2330 100644
--- a/plugin.audio.sverigesradio/default.py
+++ b/plugin.audio.sverigesradio/default.py
@@ -14,6 +14,12 @@ BASE_URL = "http://sr.se"
__settings__ = xbmcaddon.Addon(id='plugin.audio.sverigesradio')
+QUALITIES = ["low", "normal", "high"]
+PROTOCOLS = ["http", "rtsp"]
+
+SET_QUALITY = QUALITIES[int(__settings__.getSetting("quality"))]
+SET_PROTOCOL = PROTOCOLS[int(__settings__.getSetting("protocol"))]
+
def list_channels():
doc, state = load_xml(CHANNEL_URL)
if doc and not state:
@@ -34,11 +40,11 @@ def list_channels():
quality = url.getAttribute("quality")
playlist = url.getAttribute("playlist")
stream = url.childNodes[0].data
- if type == "m4a" and quality == "high":
+ if type == "m4a" and quality == SET_QUALITY:
if logo:
- add_posts(title, stream, description, logo, album =
originaltitle, artist = 'Sveriges Radio')
+ add_posts(title, stream, description, logo, isLive =
'true', album = originaltitle, artist = 'Sveriges Radio')
else:
- add_posts(title, stream, description, album =
originaltitle, artist = 'Sveriges Radio')
+ add_posts(title, stream, description, isLive = 'true',
album = originaltitle, artist = 'Sveriges Radio')
else:
if state == "site":
xbmc.executebuiltin('Notification("Sveriges Radio","Site down")')
@@ -76,7 +82,7 @@ def list_program(unitid):
type = url.getAttribute("type")
protocol = url.getAttribute("protocol")
quality = url.getAttribute("quality")
- if type == "m4a" and protocol == "http" and quality == "high":
+ if type == "m4a" and protocol == SET_PROTOCOL and quality ==
SET_QUALITY:
base = url.childNodes[0].data
if base == "":
base =
"http://sverigesradio.se/topsy/ljudfil/utan/statistik/[broadcastid].m4a"
@@ -102,8 +108,9 @@ def list_program(unitid):
thumb = ''
for broadcast in
ondemand.getElementsByTagName("broadcastfilename"):
broadcastid =
broadcast.getAttribute("broadcastid").encode('utf_8')
- # broadcastname =
broadcast.childNodes[0].data.encode('utf_8')
+ broadcastname =
broadcast.childNodes[0].data.encode('utf_8')
url = base.replace("[broadcastid]", broadcastid)
+ url = url.replace("[broadcastfilename]", broadcastname)
add_posts(title, url, description, thumb, artist='Sveriges
Radio', album=originaltitle)
else:
if state == "site":
@@ -113,7 +120,7 @@ def list_program(unitid):
xbmcplugin.endOfDirectory(HANDLE)
-def add_posts(title, url, description='', thumb='', isPlayable='true',
isLive='true', isFolder=False, artist='',\
+def add_posts(title, url, description='', thumb='', isPlayable='true',
isLive='false', isFolder=False, artist='',\
album=''):
title = title.replace("\n", " ")
listitem=xbmcgui.ListItem(title, iconImage=thumb)
-----------------------------------------------------------------------
Summary of changes:
plugin.audio.sverigesradio/addon.xml | 4 +-
plugin.audio.sverigesradio/default.py | 19 ++-
.../resources/language/English/strings.xml | 12 ++
.../resources/language/Swedish/strings.xml | 12 ++
plugin.audio.sverigesradio/resources/settings.xml | 7 +
plugin.video.mediathek/addon.xml | 2 +-
plugin.video.mediathek/changelog.txt | 2 +
plugin.video.mediathek/mediathek/bayerisches.py | 160 +++++++++++++++----
plugin.video.mediathek/mediathek/wdr.py | 14 ++-
plugin.video.pakee/addon.xml | 2 +-
plugin.video.pakee/changelog.txt | 19 +++-
plugin.video.pakee/default.py | 16 ++-
12 files changed, 217 insertions(+), 52 deletions(-)
create mode 100644
plugin.audio.sverigesradio/resources/language/English/strings.xml
create mode 100644
plugin.audio.sverigesradio/resources/language/Swedish/strings.xml
create mode 100644 plugin.audio.sverigesradio/resources/settings.xml
hooks/post-receive
--
Plugins
------------------------------------------------------------------------------
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here
http://p.sf.net/sfu/sfd2d-msazure
_______________________________________________
Xbmc-addons mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/xbmc-addons